From 5ce824f8a2b754ba762e86e8484d85721ac56314 Mon Sep 17 00:00:00 2001 From: Alex Barlow Date: Sat, 6 Jun 2020 18:09:18 +0100 Subject: [PATCH 1/2] First impl of protocopy! --- go.mod | 8 +- go.sum | 38 + protoc-gen-lile-server/statik/statik.go | 9 +- protocopy/Makefile | 3 + protocopy/protocopy.go | 167 ++++ protocopy/protocopy_test.go | 187 +++++ protocopy/test/test.pb.go | 1003 +++++++++++++++++++++++ protocopy/test/test.proto | 94 +++ statik/statik.go | 9 +- 9 files changed, 1506 insertions(+), 12 deletions(-) create mode 100644 protocopy/Makefile create mode 100644 protocopy/protocopy.go create mode 100644 protocopy/protocopy_test.go create mode 100644 protocopy/test/test.pb.go create mode 100644 protocopy/test/test.proto diff --git a/go.mod b/go.mod index ba7ea67..8267317 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ require ( github.com/beorn7/perks v1.0.0 // indirect github.com/fatih/color v1.7.0 github.com/gofrs/uuid v3.1.0+incompatible - github.com/golang/protobuf v1.3.2 + github.com/golang/protobuf v1.4.1 github.com/googleapis/gax-go v2.0.2+incompatible // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 @@ -18,9 +18,8 @@ require ( github.com/onsi/ginkgo v1.10.1 // indirect github.com/onsi/gomega v1.7.0 // indirect github.com/prometheus/client_golang v0.9.2 - github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 // indirect github.com/prometheus/common v0.4.0 // indirect - github.com/rakyll/statik v0.1.7-0.20190731211841-925a23bda946 + github.com/rakyll/statik v0.1.7 github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516 github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v0.0.3 @@ -29,7 +28,8 @@ require ( github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6 github.com/xtgo/set v1.0.0 google.golang.org/api v0.11.0 // indirect - google.golang.org/grpc v1.24.0 + google.golang.org/grpc v1.27.0 + google.golang.org/protobuf v1.24.0 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect ) diff --git a/go.sum b/go.sum index 2c46c25..c3f1b06 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -17,6 +18,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -33,6 +35,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1 github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -60,6 +64,13 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -67,6 +78,8 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= @@ -93,6 +106,7 @@ github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= @@ -118,7 +132,9 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lileio/fromenv v0.0.0-20180720125005-e881ea03b503/go.mod h1:VhsksrdjU8n+Lx6GW2u+6cbwD5wY7Z5/6N/HGlCH/mg= github.com/lileio/fromenv v1.4.0 h1:00zDYKl4USMFCOD4eLvGy8BbCvkQRzUlRVqkIxzog9Q= github.com/lileio/fromenv v1.4.0/go.mod h1:NDKhkr4fE98LZDpXJKP46GHXncBQF77MTr6Urjlv4J0= +github.com/lileio/lile v0.0.0-20181016094446-48bc7aaffacf h1:M6EnuFFbKtlLRqf+KgQobAs/WZiDnALlkvjDEsQH41U= github.com/lileio/lile v0.0.0-20181016094446-48bc7aaffacf/go.mod h1:rNQbm4tF7jCeCdyCMrq9tABCXbrFzYdKmrCTlPcCyYY= +github.com/lileio/lile v0.0.0-20190923215044-149adffdc7ae h1:ef5tPEee8yo+7t2Fy1X6sKZkS0o2Q4Mqm52gVqvEvqc= github.com/lileio/logr v0.0.0-20180612103852-dc57c81cbed7/go.mod h1:/yovbnNwQYF/hEzq8tH5pXj7Rp0OUevoWWnaF4InxCE= github.com/lileio/logr v1.1.0 h1:LXFoQueH0I683/P/k1vmOHXnr0OWTuj3FwMEuRNxgs0= github.com/lileio/logr v1.1.0/go.mod h1:tuh1La46EvEN9PYHlCNvZsk473ULi0GDsEvcEe6nQr0= @@ -158,6 +174,7 @@ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1 github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.3 h1:XudIMByQMXJ6oDHy4SipNyo35LxjA69Z7v1nL0aAZvA= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.3/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= @@ -188,6 +205,8 @@ github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181015124227-bcb74de08d37/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= @@ -200,6 +219,8 @@ github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURm github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/rakyll/statik v0.1.7-0.20190731211841-925a23bda946 h1:orVX1a3FYCOkDzVLCW342uDPd0DA0g2D5yDvCl5izOo= github.com/rakyll/statik v0.1.7-0.20190731211841-925a23bda946/go.mod h1:OEi9wJV/fMUAGx1eNjq75DKDsJVuEv1U0oYdX6GX8Zs= +github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= +github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165 h1:nkcn14uNmFEuGCb2mBZbBb24RdNRL08b/wb+xBOYpuk= github.com/rcrowley/go-metrics v0.0.0-20180503174638-e2704e165165/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= @@ -275,6 +296,7 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -316,6 +338,7 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20181016000437-c51f30376ab7/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -337,6 +360,9 @@ google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= @@ -344,8 +370,20 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/protoc-gen-lile-server/statik/statik.go b/protoc-gen-lile-server/statik/statik.go index 7e76491..a725f40 100644 --- a/protoc-gen-lile-server/statik/statik.go +++ b/protoc-gen-lile-server/statik/statik.go @@ -1,13 +1,14 @@ // Code generated by statik. DO NOT EDIT. -// Package statik contains static assets. package statik import ( "github.com/rakyll/statik/fs" ) + func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00stream_stream.tmplUT\x05\x00\x01\xe0a\xed\\\x8c\x90M\x8b\xdb0\x10\x86\xcf\x9a_1\x15\xb4\xd84(\xf7\x82o\xfd\xa0\x97$4=\x16\x8a\xd7\x1e'\"\x91\xe4\x8cd\x87 \xf4\xdf\x17K a\xd9\xcb\x9e\x06\xde\x8fG/\x1a\xdb\xee\xd4\x1e\x08=\xf1L\x0c\xa0\xcd\xe88`\x05B\x12\xb3c/\x01Q\x0e&\xe4\xab\x9d\x04@\x8c\x11{\xea\xa7\xf1w\x0e{T\xbf\xdc\xee\xceQ\xdb)\x8cS(\x0e\xa6\x045\xc00\xd9\x0e+\xbf\xd4\xd4\x9ex\xd6\x1dmZC\x98\xd2>\xbfZg\xe7.U>0\xb5\x06cT\x05\xb2\xe8)\xa9\xf7\xe5\xff1\xaab>0y1F\x10C9\x82\xe9\xb2ZT\xfc\xd6`\xe1\xaa?\xd4\xcdU\x0dB\xe8!;M\x83\xda\xa9\x1f\xdb\x9f\xb9 ^\x98\xda\x13\x08\x91\xe0\x19\xf9\xd4\xa0\xd5\xe7\xe23\x85\x89\xed\"?B\xeb5~w\xe8\x9d\xa1p\xd4\xf6\x80\x93\xa7a:\xe3U\x87#2]\n\x86\xe9\xf2\x063\x98\xa0v\xacm\x18*\xb9x\x0d~\xfe:\xff\xb3r\xb5$\xeb\x82F\xc4\xb2\xf01}O\xb6\xaf\xbe\xc4\xb8\xfc\xf1\xdf\xdbH)\xc5T\x7fhf^\xfa\xd4\x1c{\xb5\xa1k%\xad\x0bx\xa3\x80\xda\x8cg2d\x03\xf5\xb2\x86\x04\xaf\x01\x00\x00\xff\xffPK\x07\x08\x12 \xef\xe40\x01\x00\x00\x16\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00 \x00stream_stream_test.tmplUT\x05\x00\x01\xe0a\xed\\t\x8e\xc1j\xf30\x10\x84\xcf\xda\xa7\xd8_\x87\x1f\xbb\x14\xe5^\xf0\xa5\xa5\x85\\Rh\xf3\x02\x8e\xbcvDl\xc9\x91\xd6!A\xe8\xdd\x8be\xb7\x85\xd2\x9eg\xbe\xf9f\xac\xf5\xa9\xee\x08\x03\xf9\x0by\x003\x8c\xce3\x16\x80(\x8d\x93 $S`c; \xa4v\x96\xe9\xca\x12\x10c\xc4\x86\x9ai\xdcf \xa0\xec\x0c\x1f\xa7\x83\xd2n\xd8\x04\xf6\xc4\xfa\xe87\x99mo\x9b:\x04\xf2,Qm\xed8\xf1\x82`JP\x02\xb4\x93\xd5\xb8\xa7\xc01\xa2\xda\xd5\x03aJ\x05\xe3\xdd\xaaU\xfb\x12#\x08\xcdW|\xa8p\xf5\xab\xc7Z\x9f:\xef&\xdb\x14% \xce\xbez\xb8G\xf2>\xb7z\xa3b\xccc)\x15\x9a\xaf%\x88\xe5\x81\xda\x99\xbe\xe0\\,\x01\x10=\x9dg\xe0\x7f\x8cjk\xf7\xb7\x91R\x8a \xc4\xb2\xa7\xde\xc96\x85\xa7s b^\xaeV\x8fz\xea]\xa0\x1c\xfe1,Z\xe7\xe7\xd7\xc2S\xf8z\xb5\xc2o\xa4/3'L\x9b\x93\xaaB\xe3\xd4\xf3\xebK\x06\xc4\xc1S}\x02!\x12|W\xfeUhM\xbf\xe4\xbf\xe8~R\x9f\x15\xc7k\xcbS(A$H\xf0\x11\x00\x00\xff\xffPK\x07\x08\x89.1q#\x01\x00\x00\xee\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00 \x00stream_unary.tmplUT\x05\x00\x01\xe0a\xed\\d\x8fO\x8b\xdb0\x10\xc5\xcf\x9aO1\x15\xb4\xd84(\xf7\x82\x0f\xa5\xff\xe8% M\x8f\x85b\xecq\"\xd6\x92\x9c\x91\xe4\x10\x84\xbe\xfb\";a\x97]]F\xbc7\xf3\x9b7S\xdb=\xb5'BO<\x13\x03h39\x0eX\x81\x90\xc4\xec\xd8K@\x94\x83 K\xd5N\x02 \xa6\x84=\xf5q\xfa\xbd4{T\xbf\xdc\xe1\xceQ\xfb\x18\xa6\x18V\x07s\x86\x1a`\x88\xb6\xc3\xca\x971u$\x9euG\xbb\xd6\x10\xe6|\\\xb6\xd6\x8bs\x97*\x1f\x98Z\x83)\xa9\x15R\xf4\x9c\xd5\xfb\xe1\xff)\xa9\xd5|`\x96\xc4\x98@\x0ck\x11L\x97MQ\xf1K\x83+W\xfd\xa1n\xaej\x00!\xb6[\xfc\xee\xd0;C\xe1\xac\xed \xa3\xa7!\x8ex\xd5\xe1\x8cL\x17\x10B\x0f\xe5\x83\x1f\x1a\xb4z\\\x80b0A\x1dX\xdb0T\xb2x\x0d~\xfc<\xff\xb3rS:k\x10\"\xc3:X\xb66\x0dj\xa7~\xec\x7fb\x02\\\x1eS\x88l\x1fY\x8ed\xfb\xaf\xb6\xff6:O\xd5\xa7r\xe1>\x86\xbf\xb7\xa9\\\x97\xf2[\xda\xeb\x18w\x0e1?\x9a^\x14\xc7^\xed\xe8ZI\xeb\x02\xde(\xa06\xd3H\x86l\xa0^\xd6 2dx\x0e\x00\x00\xff\xffPK\x07\x08\x0dG\xdd\xef3\x01\x00\x00\xf7\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00 \x00stream_unary_test.tmplUT\x05\x00\x01\xe0a\xed\\l\x8e\xb1n\xeb0\x0cEg\xf1+\x08\x0d\x0f\xd2C\xa1\xec\x05:\xb4\x9d\xb2dh\xf3\x03\xaa\xcc8Fl\xc9\xa1\xe8\xc0\x81\xa0\x7f/b\x1b\x99\xba^\xde{\x0eG\x1f.\xbe%\xcc\xc47b\x80n\x18\x13\x0b\x1aPZ(K\x17[\x0d\xa0tHQh\x16\x0d\x88\xa5`C\xcd4\xee\x97fF\xddvr\x9e~\\H\xc3.\x0b\x93\x843\xef\x96\xed\xe9\xbe\xf39\x13\x8bF\xb7\x8f\xe3$\xeb\x04k\x05\x0bp\x9ab\xc0#e)\x05\xdd\xc1\x0f\x84\xb5\x1a\xc1\xff\x9b\xd6\x1d-\x16PAf|}\xc3\xcd\xef>|\xb8\xb4\x9c\xa6\xd8\x18\x0b\x88\x0f\x9f\x1f^\x90\x98\x97V\xdf\xb9R\x16X\xad&\xc8lA\xad\x1f\xb8C\xd7\x1bY\x8a\x16\x00\x91\xe9\xfa\x18\xfc+\xc5\xed\xe3\xf1>R\xad\xa5\x82Zy\xee\x9bbc\x98\xae\x16\x14S~\xe2\xb7\xebg\x9f2\xbd\xc7\xe6\x8b\xc2\xcdX\xf8S\xf1\xcc\x92l1S\xb6P\xe17\x00\x00\xff\xffPK\x07\x08\xff\x9c \xd3\xf2\x00\x00\x00p\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00 \x00unary_stream.tmplUT\x05\x00\x01\xe0a\xed\\d\x8f\xc1j\xc30\x0c\x86\xcf\xd5S\xfc\xcba$c\xf8\x01\x06=\x8f^\xbaAv\x1f!QGX\xe3\x18\xd9\xee(F\xef>\xe4t\xf4\xb0\xa3\xfeO\xfe~+\x0c\xe3\xf7\xf0\xc5\x88,\x17\x16\xa2y \xab$\xb4\xb4kXd\x95\xd8\x10P\n&\x9er8T\x18\xe1^\xd7\xf7\xdb;w\xf0!\xa7\x0d\xc0\xbd\xe5t\x9fT\xa9#:e?\xa2\x8d\xe6p=\xcbe\x1e\xf98,\x0c\xd5\xbeVv\x95\xdc\xa2V\xf0d\xe3\xc1\x7f\\\x83\x05\xcf\x88IxXP\x8a\xdb\xb4\xb6\xa9\xea\xfe\xeb>Kq\x1b\xfc\x13\xd7\x03P\x08\x10\x8ex\xd9\xe3\xb1\x14\xfb\xa2\xb9U\x8b\x12l\xc5\xc0V\xe2z\xf6S+\x1c;\x02\xe6S\x85\x0f{\xf8\xf9\\%\xa6IY\xbc\xe5\x04(\xd1\xee\x1e\xac\x12\xdd\x91\x7f\xda\xc6\xaf WN\x98\x97p\xe6\x85}\xe2\xa9\xe9H\xe97\x00\x00\xff\xffPK\x07\x08\x9c\x0cu\xc5\xdf\x00\x00\x00i\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00 \x00unary_stream_test.tmplUT\x05\x00\x01\xe0a\xed\\l\x8e\xcdj\xeb0\x10\x85\xd7\x9a\xa7\x98\xeb\xc5\xc5*A\xd9\x17\xbc)$\x90M\n%/\xa0(cG$\xb6\xdc\xd18$\x08\xbd{\xf1\x0f\xc9\xa2\xdd\xce\x99\xf3}\xa7\xb7\xeeb\x1b\xc2H|#\x06\xf0m\x1fX\xb0\x04U\x08E\xf1]S\x00b\xe1C\x01\xa0\n\x17:\xa1\xbb\x8c\xa7\x94\xf0D\xa7\xa1\xdfM\x85\x88E\xe3\xe5<\x1c\x8d\x0b\xed:\n\x93\xb83\xaf'D\xfdX\xdb\x18\x89\xa5@\xb3\xeb\xfaA\xe6\n\xe6\x0c\x1a\xa0\x1e:\x87\x07\x8a\x92\x12\x9a\xbdm s.\x05\xdf\x16\xbb9hL\xa0\x9c\xdc\xf1\xbd\xc2\xc5o>\xac\xbb4\x1c\x86\xeeTj@d\xfa\x1e\xd3\xff#b\xd7\x1d\x1e\xfd\x08I\x19\x00q\x9cb\xdb\x15\x12\xf3\x04\xb8z\x93\xd2\xe4\xc9\xb9tr_\x8de\x0dj^h\xf6\xfeZ\xca\xf4\xad\x01T\x1dx\x94+\xa6\xf8$\xcc@\xf3E\xeeVjP\xca\xd7SRU\xe8\x83\xd9|n\xa7\x82:2\xd9\x0b(\x95\xe1\xf5\xf2\xaf\xc2\xce_\xe7|\xd1m\xed\xd3g6\xcc\x81K\xad\x7f\xd5\xff\x98\xf6:\x06Y\xeeLQ\x83\xca\x90\xe1'\x00\x00\xff\xffPK\x07\x08\xbeJO\x87\x1b\x01\x00\x00\xd3\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x00unary_unary.tmplUT\x05\x00\x01\xe0a\xed\\D\x8eAj\xc30\x10E\xd7\x9eS|\xb4\x92J\xd0%\xba\xf2&Y\xa4\x170\xf2\xb4\x98\xc6\xb2\x18\x8d\xd2\x04\xa1\xbb\x97\xc8\x86\xac\x86\xff\xe6\xc1\xffi\n\xbf\xd3\x0f#\xb3\xdcY\x88\x965m\xa2\xb04\x18\x16\xd9$\x1b\xa2\xc1\x84-*?\xd4\xd0P+f\x9eK\x1a\xbb\x97\xe1\xc7\x98\x8a\xee \xfeR\xf4\x9dZ#G\xf4]b\x80\xcd\xa8\x15\xfe\xcar_\x02\x9f\xa7\x95\xd1\xda\xb5W\xba\xfe9\x90\x0d\xfa\xc0Q\xe6?\xf7{\x82\xe0\xe3\xe5\x8c\xf1\xeb\x99^\x96\x83\xed\xe0R\xf4 '\xf4\xb1\x0e\x95\x06a-\x12\x11\x97\xdbA\xb3?\xf3\x9f5qS\xc2>\x92\x0b\xd4(\x9e\x90\x98+}\xb7\xfa\xddbd;\xedl\x07\xcd\xebA}\xb6\xf7Vj\xff\xed\xe6\xe583\xc5\x0e\n<\x03\x00\x00\xff\xffPK\x07\x08o\x9c@\x0b\xce\x00\x00\x00,\x01\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x12 \xef\xe40\x01\x00\x00\x16\x02\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00stream_stream.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x89.1q#\x01\x00\x00\xee\x01\x00\x00\x17\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\x01\x00\x00stream_stream_test.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x0dG\xdd\xef3\x01\x00\x00\xf7\x01\x00\x00\x11\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea\x02\x00\x00stream_unary.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\xff\x9c \xd3\xf2\x00\x00\x00p\x01\x00\x00\x16\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81e\x04\x00\x00stream_unary_test.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x9c\x0cu\xc5\xdf\x00\x00\x00i\x01\x00\x00\x11\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\x05\x00\x00unary_stream.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\xbeJO\x87\x1b\x01\x00\x00\xd3\x01\x00\x00\x16\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb\x06\x00\x00unary_stream_test.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\xb0d\x95&\xb3\x00\x00\x00\x02\x01\x00\x00\x10\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\x08\x00\x00unary_unary.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcNo\x9c@\x0b\xce\x00\x00\x00,\x01\x00\x00\x15\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81- \x00\x00unary_unary_test.tmplUT\x05\x00\x01\xe0a\xed\\PK\x05\x06\x00\x00\x00\x00\x08\x00\x08\x00T\x02\x00\x00G\n\x00\x00\x00\x00" - fs.Register(data) -} + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\x00 \x00stream_stream.tmplUT\x05\x00\x01\\\xca\xdb^\x8c\x90M\x8b\xdb0\x10\x86\xcf\x9a_1\x15\xb4\xd84(\xf7\x82o\xfd\xa0\x97$4=\x16\x8a\xd7\x1e'\"\x91\xe4\x8cd\x87 \xf4\xdf\x17K a\xd9\xcb\x9e\x06\xde\x8fG/\x1a\xdb\xee\xd4\x1e\x08=\xf1L\x0c\xa0\xcd\xe88`\x05B\x12\xb3c/\x01Q\x0e&\xe4\xab\x9d\x04@\x8c\x11{\xea\xa7\xf1w\x0e{T\xbf\xdc\xee\xceQ\xdb)\x8cS(\x0e\xa6\x045\xc00\xd9\x0e+\xbf\xd4\xd4\x9ex\xd6\x1dmZC\x98\xd2>\xbfZg\xe7.U>0\xb5\x06cT\x05\xb2\xe8)\xa9\xf7\xe5\xff1\xaab>0y1F\x10C9\x82\xe9\xb2ZT\xfc\xd6`\xe1\xaa?\xd4\xcdU\x0dB\xe8!;M\x83\xda\xa9\x1f\xdb\x9f\xb9 ^\x98\xda\x13\x08\x91\xe0\x19\xf9\xd4\xa0\xd5\xe7\xe23\x85\x89\xed\"?B\xeb5~w\xe8\x9d\xa1p\xd4\xf6\x80\x93\xa7a:\xe3U\x87#2]\n\x86\xe9\xf2\x063\x98\xa0v\xacm\x18*\xb9x\x0d~\xfe:\xff\xb3r\xb5$\xeb\x82F\xc4\xb2\xf01}O\xb6\xaf\xbe\xc4\xb8\xfc\xf1\xdf\xdbH)\xc5T\x7fhf^\xfa\xd4\x1c{\xb5\xa1k%\xad\x0bx\xa3\x80\xda\x8cg2d\x03\xf5\xb2\x86\x04\xaf\x01\x00\x00\xff\xffPK\x07\x08\x12 \xef\xe40\x01\x00\x00\x16\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x17\x00 \x00stream_stream_test.tmplUT\x05\x00\x01\\\xca\xdb^t\x8e\xc1j\xf30\x10\x84\xcf\xda\xa7\xd8_\x87\x1f\xbb\x14\xe5^\xf0\xa5\xa5\x85\\Rh\xf3\x02\x8e\xbcvDl\xc9\x91\xd6!A\xe8\xdd\x8be\xb7\x85\xd2\x9eg\xbe\xf9f\xac\xf5\xa9\xee\x08\x03\xf9\x0by\x003\x8c\xce3\x16\x80(\x8d\x93 $S`c; \xa4v\x96\xe9\xca\x12\x10c\xc4\x86\x9ai\xdcf \xa0\xec\x0c\x1f\xa7\x83\xd2n\xd8\x04\xf6\xc4\xfa\xe87\x99mo\x9b:\x04\xf2,Qm\xed8\xf1\x82`JP\x02\xb4\x93\xd5\xb8\xa7\xc01\xa2\xda\xd5\x03aJ\x05\xe3\xdd\xaaU\xfb\x12#\x08\xcdW|\xa8p\xf5\xab\xc7Z\x9f:\xef&\xdb\x14% \xce\xbez\xb8G\xf2>\xb7z\xa3b\xccc)\x15\x9a\xaf%\x88\xe5\x81\xda\x99\xbe\xe0\\,\x01\x10=\x9dg\xe0\x7f\x8cjk\xf7\xb7\x91R\x8a \xc4\xb2\xa7\xde\xc96\x85\xa7s b^\xaeV\x8fz\xea]\xa0\x1c\xfe1,Z\xe7\xe7\xd7\xc2S\xf8z\xb5\xc2o\xa4/3'L\x9b\x93\xaaB\xe3\xd4\xf3\xebK\x06\xc4\xc1S}\x02!\x12|W\xfeUhM\xbf\xe4\xbf\xe8~R\x9f\x15\xc7k\xcbS(A$H\xf0\x11\x00\x00\xff\xffPK\x07\x08\x89.1q#\x01\x00\x00\xee\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00 \x00stream_unary.tmplUT\x05\x00\x01\\\xca\xdb^d\x8fO\x8b\xdb0\x10\xc5\xcf\x9aO1\x15\xb4\xd84(\xf7\x82\x0f\xa5\xff\xe8% M\x8f\x85b\xecq\"\xd6\x92\x9c\x91\xe4\x10\x84\xbe\xfb\";a\x97]]F\xbc7\xf3\x9b7S\xdb=\xb5'BO<\x13\x03h39\x0eX\x81\x90\xc4\xec\xd8K@\x94\x83 K\xd5N\x02 \xa6\x84=\xf5q\xfa\xbd4{T\xbf\xdc\xe1\xceQ\xfb\x18\xa6\x18V\x07s\x86\x1a`\x88\xb6\xc3\xca\x971u$\x9euG\xbb\xd6\x10\xe6|\\\xb6\xd6\x8bs\x97*\x1f\x98Z\x83)\xa9\x15R\xf4\x9c\xd5\xfb\xe1\xff)\xa9\xd5|`\x96\xc4\x98@\x0ck\x11L\x97MQ\xf1K\x83+W\xfd\xa1n\xaej\x00!\xb6[\xfc\xee\xd0;C\xe1\xac\xed \xa3\xa7!\x8ex\xd5\xe1\x8cL\x17\x10B\x0f\xe5\x83\x1f\x1a\xb4z\\\x80b0A\x1dX\xdb0T\xb2x\x0d~\xfc<\xff\xb3rS:k\x10\"\xc3:X\xb66\x0dj\xa7~\xec\x7fb\x02\\\x1eS\x88l\x1fY\x8ed\xfb\xaf\xb6\xff6:O\xd5\xa7r\xe1>\x86\xbf\xb7\xa9\\\x97\xf2[\xda\xeb\x18w\x0e1?\x9a^\x14\xc7^\xed\xe8ZI\xeb\x02\xde(\xa06\xd3H\x86l\xa0^\xd6 2dx\x0e\x00\x00\xff\xffPK\x07\x08\x0dG\xdd\xef3\x01\x00\x00\xf7\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00 \x00stream_unary_test.tmplUT\x05\x00\x01\\\xca\xdb^l\x8e\xb1n\xeb0\x0cEg\xf1+\x08\x0d\x0f\xd2C\xa1\xec\x05:\xb4\x9d\xb2dh\xf3\x03\xaa\xcc8Fl\xc9\xa1\xe8\xc0\x81\xa0\x7f/b\x1b\x99\xba^\xde{\x0eG\x1f.\xbe%\xcc\xc47b\x80n\x18\x13\x0b\x1aPZ(K\x17[\x0d\xa0tHQh\x16\x0d\x88\xa5`C\xcd4\xee\x97fF\xddvr\x9e~\\H\xc3.\x0b\x93\x843\xef\x96\xed\xe9\xbe\xf39\x13\x8bF\xb7\x8f\xe3$\xeb\x04k\x05\x0bp\x9ab\xc0#e)\x05\xdd\xc1\x0f\x84\xb5\x1a\xc1\xff\x9b\xd6\x1d-\x16PAf|}\xc3\xcd\xef>|\xb8\xb4\x9c\xa6\xd8\x18\x0b\x88\x0f\x9f\x1f^\x90\x98\x97V\xdf\xb9R\x16X\xad&\xc8lA\xad\x1f\xb8C\xd7\x1bY\x8a\x16\x00\x91\xe9\xfa\x18\xfc+\xc5\xed\xe3\xf1>R\xad\xa5\x82Zy\xee\x9bbc\x98\xae\x16\x14S~\xe2\xb7\xebg\x9f2\xbd\xc7\xe6\x8b\xc2\xcdX\xf8S\xf1\xcc\x92l1S\xb6P\xe17\x00\x00\xff\xffPK\x07\x08\xff\x9c \xd3\xf2\x00\x00\x00p\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x00 \x00unary_stream.tmplUT\x05\x00\x01\\\xca\xdb^d\x8f\xc1j\xc30\x0c\x86\xcf\xd5S\xfc\xcba$c\xf8\x01\x06=\x8f^\xbaAv\x1f!QGX\xe3\x18\xd9\xee(F\xef>\xe4t\xf4\xb0\xa3\xfeO\xfe~+\x0c\xe3\xf7\xf0\xc5\x88,\x17\x16\xa2y \xab$\xb4\xb4kXd\x95\xd8\x10P\n&\x9er8T\x18\xe1^\xd7\xf7\xdb;w\xf0!\xa7\x0d\xc0\xbd\xe5t\x9fT\xa9#:e?\xa2\x8d\xe6p=\xcbe\x1e\xf98,\x0c\xd5\xbeVv\x95\xdc\xa2V\xf0d\xe3\xc1\x7f\\\x83\x05\xcf\x88IxXP\x8a\xdb\xb4\xb6\xa9\xea\xfe\xeb>Kq\x1b\xfc\x13\xd7\x03P\x08\x10\x8ex\xd9\xe3\xb1\x14\xfb\xa2\xb9U\x8b\x12l\xc5\xc0V\xe2z\xf6S+\x1c;\x02\xe6S\x85\x0f{\xf8\xf9\\%\xa6IY\xbc\xe5\x04(\xd1\xee\x1e\xac\x12\xdd\x91\x7f\xda\xc6\xaf WN\x98\x97p\xe6\x85}\xe2\xa9\xe9H\xe97\x00\x00\xff\xffPK\x07\x08\x9c\x0cu\xc5\xdf\x00\x00\x00i\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16\x00 \x00unary_stream_test.tmplUT\x05\x00\x01\\\xca\xdb^l\x8e\xcdj\xeb0\x10\x85\xd7\x9a\xa7\x98\xeb\xc5\xc5*A\xd9\x17\xbc)$\x90M\n%/\xa0(cG$\xb6\xdc\xd18$\x08\xbd{\xf1\x0f\xc9\xa2\xdd\xce\x99\xf3}\xa7\xb7\xeeb\x1b\xc2H|#\x06\xf0m\x1fX\xb0\x04U\x08E\xf1]S\x00b\xe1C\x01\xa0\n\x17:\xa1\xbb\x8c\xa7\x94\xf0D\xa7\xa1\xdfM\x85\x88E\xe3\xe5<\x1c\x8d\x0b\xed:\n\x93\xb83\xaf'D\xfdX\xdb\x18\x89\xa5@\xb3\xeb\xfaA\xe6\n\xe6\x0c\x1a\xa0\x1e:\x87\x07\x8a\x92\x12\x9a\xbdm s.\x05\xdf\x16\xbb9hL\xa0\x9c\xdc\xf1\xbd\xc2\xc5o>\xac\xbb4\x1c\x86\xeeTj@d\xfa\x1e\xd3\xff#b\xd7\x1d\x1e\xfd\x08I\x19\x00q\x9cb\xdb\x15\x12\xf3\x04\xb8z\x93\xd2\xe4\xc9\xb9tr_\x8de\x0dj^h\xf6\xfeZ\xca\xf4\xad\x01T\x1dx\x94+\xa6\xf8$\xcc@\xf3E\xeeVjP\xca\xd7SRU\xe8\x83\xd9|n\xa7\x82:2\xd9\x0b(\x95\xe1\xf5\xf2\xaf\xc2\xce_\xe7|\xd1m\xed\xd3g6\xcc\x81K\xad\x7f\xd5\xff\x98\xf6:\x06Y\xeeLQ\x83\xca\x90\xe1'\x00\x00\xff\xffPK\x07\x08\xbeJO\x87\x1b\x01\x00\x00\xd3\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x00unary_unary.tmplUT\x05\x00\x01\\\xca\xdb^D\x8eAj\xc30\x10E\xd7\x9eS|\xb4\x92J\xd0%\xba\xf2&Y\xa4\x170\xf2\xb4\x98\xc6\xb2\x18\x8d\xd2\x04\xa1\xbb\x97\xc8\x86\xac\x86\xff\xe6\xc1\xffi\n\xbf\xd3\x0f#\xb3\xdcY\x88\x965m\xa2\xb04\x18\x16\xd9$\x1b\xa2\xc1\x84-*?\xd4\xd0P+f\x9eK\x1a\xbb\x97\xe1\xc7\x98\x8a\xee \xfeR\xf4\x9dZ#G\xf4]b\x80\xcd\xa8\x15\xfe\xcar_\x02\x9f\xa7\x95\xd1\xda\xb5W\xba\xfe9\x90\x0d\xfa\xc0Q\xe6?\xf7{\x82\xe0\xe3\xe5\x8c\xf1\xeb\x99^\x96\x83\xed\xe0R\xf4 '\xf4\xb1\x0e\x95\x06a-\x12\x11\x97\xdbA\xb3?\xf3\x9f5qS\xc2>\x92\x0b\xd4(\x9e\x90\x98+}\xb7\xfa\xddbd;\xedl\x07\xcd\xebA}\xb6\xf7Vj\xff\xed\xe6\xe583\xc5\x0e\n<\x03\x00\x00\xff\xffPK\x07\x08o\x9c@\x0b\xce\x00\x00\x00,\x01\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x12 \xef\xe40\x01\x00\x00\x16\x02\x00\x00\x12\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00stream_stream.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x89.1q#\x01\x00\x00\xee\x01\x00\x00\x17\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\x01\x00\x00stream_stream_test.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x0dG\xdd\xef3\x01\x00\x00\xf7\x01\x00\x00\x11\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xea\x02\x00\x00stream_unary.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xff\x9c \xd3\xf2\x00\x00\x00p\x01\x00\x00\x16\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81e\x04\x00\x00stream_unary_test.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x9c\x0cu\xc5\xdf\x00\x00\x00i\x01\x00\x00\x11\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xa4\x05\x00\x00unary_stream.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xbeJO\x87\x1b\x01\x00\x00\xd3\x01\x00\x00\x16\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xcb\x06\x00\x00unary_stream_test.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xb0d\x95&\xb3\x00\x00\x00\x02\x01\x00\x00\x10\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813\x08\x00\x00unary_unary.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6Po\x9c@\x0b\xce\x00\x00\x00,\x01\x00\x00\x15\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81- \x00\x00unary_unary_test.tmplUT\x05\x00\x01\\\xca\xdb^PK\x05\x06\x00\x00\x00\x00\x08\x00\x08\x00T\x02\x00\x00G\n\x00\x00\x00\x00" + fs.Register(data) + } + \ No newline at end of file diff --git a/protocopy/Makefile b/protocopy/Makefile new file mode 100644 index 0000000..36fd508 --- /dev/null +++ b/protocopy/Makefile @@ -0,0 +1,3 @@ +gen: + protoc -I ./test test.proto \ + --go_out=plugins=grpc,paths=source_relative:./test diff --git a/protocopy/protocopy.go b/protocopy/protocopy.go new file mode 100644 index 0000000..508596a --- /dev/null +++ b/protocopy/protocopy.go @@ -0,0 +1,167 @@ +package protocopy + +import ( + "errors" + "reflect" + "strings" + "time" + + "github.com/golang/protobuf/ptypes" + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/runtime/protoimpl" +) + +func ToProto(src, dest interface{}) error { + in := reflect.ValueOf(src) + out := reflect.ValueOf(dest) + + if reflect.TypeOf(src) == reflect.TypeOf(reflect.Value{}) { + in = src.(reflect.Value) + } + + if reflect.TypeOf(dest) == reflect.TypeOf(reflect.Value{}) { + out = dest.(reflect.Value) + } + + return setValue(in, out) +} + +func toProtoStruct(in, out reflect.Value) error { + if out.IsNil() { + out.Set(reflect.New(out.Type().Elem())) + } + +FIELD_LOOP: + for i := 0; i < in.NumField(); i++ { + field := in.Type().Field(i) + + // Private fields are skipped + if field.PkgPath != "" { + continue FIELD_LOOP + } + + inFieldName := field.Name + + pbTags := strings.Split(field.Tag.Get("pb"), ",") + for _, v := range pbTags { + if v == "ignore=true" { + continue FIELD_LOOP + } + + if v != "" { + inFieldName = strings.TrimSpace(v) + } + } + + inField := in.Field(i) + outField := out.Elem().FieldByNameFunc(func(n string) bool { + return strings.EqualFold(strings.ToLower(n), strings.ToLower(inFieldName)) + }) + + if !outField.IsValid() { + return errors.New("No field found for " + inFieldName) + } + + err := setValue(inField, outField) + if err != nil { + return err + } + } + + return nil +} + +func setValue(inField, outField reflect.Value) error { + k := inField.Type().Kind() + if k == reflect.Ptr { + k = inField.Elem().Type().Kind() + inField = inField.Elem() + } + + switch k { + case reflect.Array, reflect.Slice: + // Same types, so we can directly copy + if inField.Type() == outField.Type() { + outField.Set(inField) + return nil + } + outField.Set(reflect.MakeSlice(outField.Type(), inField.Len(), inField.Len())) + for i := 0; i < inField.Len(); i++ { + err := setValue(inField.Index(i), outField.Index(i)) + if err != nil { + return err + } + } + case reflect.Struct: + err := toProtoStruct(inField, outField) + if err != nil { + return err + } + case reflect.Map: + outField.Set(reflect.MakeMap(outField.Type())) + for _, key := range inField.MapKeys() { + v := reflect.New(outField.Type().Elem()).Elem() + err := setValue(inField.MapIndex(key), v) + if err != nil { + return err + } + + outField.SetMapIndex(key, v) + } + case reflect.Chan, reflect.Func, reflect.Interface: + return errors.New("input type not supported: " + inField.Type().Kind().String()) + default: + err := setScalar(inField, outField) + if err != nil { + return err + } + } + + return nil + +} + +func setScalar(inF, outF reflect.Value) error { + // We're trying to output to an ENUM + if outF.MethodByName("Enum").IsValid() { + // Deal with int enum and string + if inF.Kind() == reflect.String { + if inF.String() == "" { + return nil + } + + d := protoimpl.X.EnumDescriptorOf(outF.Interface()) + dv := d.Values().ByName(protoreflect.Name(inF.String())) + outF.SetInt(int64(dv.Number())) + } else { + outF.SetInt(int64(inF.Int())) + } + + return nil + } + + if outF.Type().String() == "*durationpb.Duration" { + pbd := ptypes.DurationProto(time.Duration(inF.Int())) + outF.Set(reflect.ValueOf(pbd)) + + return nil + } + + if outF.Type().String() == "*timestamppb.Timestamp" { + if inF.Kind() == reflect.Ptr { + inF = reflect.Indirect(inF) + } + + pbd, err := ptypes.TimestampProto(inF.Interface().(time.Time)) + if err != nil { + return err + } + + outF.Set(reflect.ValueOf(pbd)) + + return nil + } + + outF.Set(inF) + return nil +} diff --git a/protocopy/protocopy_test.go b/protocopy/protocopy_test.go new file mode 100644 index 0000000..6fb5c41 --- /dev/null +++ b/protocopy/protocopy_test.go @@ -0,0 +1,187 @@ +package protocopy_test + +import ( + "testing" + "time" + + "github.com/lileio/lile/v2/protocopy" + "github.com/lileio/lile/v2/protocopy/test" + "github.com/stretchr/testify/assert" +) + +type Nested struct { + Name string + Amount uint32 + Ok string +} + +type OriginalBitOfEverything struct { + SingleNested Nested + UUID string + Nested []*Nested + FloatValue float32 + DoubleValue float64 + Int64Value int64 + Uint64Value uint64 + Int32Value int32 + Fixed64Value uint64 + Fixed32Value uint32 + BoolValue bool + StringValue string + BytesValue []byte + Uint32Value uint32 + EnumValue string + EnumValueInt int + Sfixed32Value int32 + Sfixed64Value int64 + Sint32Value int32 + Sint64Value int64 + RepeatedStringValue []string + MapValue map[string]string + MappedStringValue map[string]string + MappedNestedValue map[string]*Nested + NonConventionalNameValue string + TimestampValue time.Time + TimestampValuePointer *time.Time + DurationValue time.Duration + // repeated values. they are comma-separated in path + PathRepeatedFloatValue []float32 + PathRepeatedDoubleValue []float64 + PathRepeatedInt64Value []int64 + PathRepeatedUint64Value []uint64 + PathRepeatedInt32Value []int32 + PathRepeatedFixed64Value []uint64 + PathRepeatedFixed32Value []uint32 + PathRepeatedBoolValue []bool + PathRepeatedStringValue []string + PathRepeatedBytesValue [][]byte + PathRepeatedUint32Value []uint32 + PathRepeatedEnumValue []string + PathRepeatedSfixed32Value []int32 + PathRepeatedSfixed64Value []int64 + PathRepeatedSint32Value []int32 + PathRepeatedSint64Value []int64 +} + +func TestABitOfEverything(t *testing.T) { + tm := time.Now() + testObj := OriginalBitOfEverything{ + SingleNested: Nested{ + Name: "Alex B", + Amount: 32, + Ok: test.ABitOfEverything_Nested_FALSE.String(), + }, + UUID: "123e4567-e89b-12d3-a456-426614174000", + Nested: []*Nested{{Name: "Alex B"}}, + FloatValue: 1.5, + DoubleValue: 2.5, + Int64Value: 4294967296, + Uint64Value: 9223372036854775807, + Int32Value: -2147483648, + Fixed64Value: 9223372036854775807, + Fixed32Value: 4294967295, + BoolValue: true, + StringValue: "somelovely string", + BytesValue: []byte("strings are basically bytes"), + EnumValue: test.NumericEnum_ONE.String(), + EnumValueInt: int(test.NumericEnum_ONE), + Uint32Value: 4294967295, + Sfixed32Value: 2147483647, + Sfixed64Value: -4611686018427387904, + Sint32Value: 2147483647, + Sint64Value: 4611686018427387903, + RepeatedStringValue: []string{"hi", "there"}, + MapValue: map[string]string{ + "1": test.NumericEnum_ONE.String(), + "0": test.NumericEnum_ZERO.String(), + }, + MappedStringValue: map[string]string{ + "help": "test", + "you": "222test", + }, + MappedNestedValue: map[string]*Nested{ + "somekey": { + Name: "Alex B", + Amount: 20, + Ok: test.ABitOfEverything_Nested_TRUE.String(), + }, + }, + NonConventionalNameValue: "camelCase", + TimestampValue: time.Now(), + TimestampValuePointer: &tm, + DurationValue: time.Minute, + PathRepeatedFloatValue: []float32{ + 1.5, + -1.5, + }, + PathRepeatedDoubleValue: []float64{ + 2.5, + -2.5, + }, + PathRepeatedInt64Value: []int64{ + 4294967296, + -4294967296, + }, + PathRepeatedUint64Value: []uint64{ + 0, + 9223372036854775807, + }, + PathRepeatedInt32Value: []int32{ + 2147483647, + -2147483648, + }, + PathRepeatedFixed64Value: []uint64{ + 0, + 9223372036854775807, + }, + PathRepeatedFixed32Value: []uint32{ + 0, + 4294967295, + }, + PathRepeatedBoolValue: []bool{ + true, + false, + }, + PathRepeatedStringValue: []string{ + "foo", + "bar", + }, + PathRepeatedBytesValue: [][]byte{ + []byte{0x00}, + []byte{0xFF}, + }, + PathRepeatedUint32Value: []uint32{ + 0, + 4294967295, + }, + PathRepeatedEnumValue: []string{ + test.NumericEnum_ONE.String(), + test.NumericEnum_ZERO.String(), + }, + PathRepeatedSfixed32Value: []int32{ + 2147483647, + -2147483648, + }, + PathRepeatedSfixed64Value: []int64{ + 4294967296, + -4294967296, + }, + PathRepeatedSint32Value: []int32{ + 2147483647, + -2147483648, + }, + PathRepeatedSint64Value: []int64{ + 4611686018427387903, + -4611686018427387904, + }, + } + + out := &test.ABitOfEverything{} + err := protocopy.ToProto(testObj, out) + assert.Nil(t, err) + + // Test using a nil pointer too + var outnil test.ABitOfEverything + err = protocopy.ToProto(testObj, &outnil) + assert.Nil(t, err) +} diff --git a/protocopy/test/test.pb.go b/protocopy/test/test.pb.go new file mode 100644 index 0000000..81dcbc9 --- /dev/null +++ b/protocopy/test/test.pb.go @@ -0,0 +1,1003 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.23.0 +// protoc v3.11.2 +// source: test.proto + +package test + +import ( + proto "github.com/golang/protobuf/proto" + duration "github.com/golang/protobuf/ptypes/duration" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// NumericEnum is one or zero. +type NumericEnum int32 + +const ( + // ZERO means 0 + NumericEnum_ZERO NumericEnum = 0 + // ONE means 1 + NumericEnum_ONE NumericEnum = 1 +) + +// Enum value maps for NumericEnum. +var ( + NumericEnum_name = map[int32]string{ + 0: "ZERO", + 1: "ONE", + } + NumericEnum_value = map[string]int32{ + "ZERO": 0, + "ONE": 1, + } +) + +func (x NumericEnum) Enum() *NumericEnum { + p := new(NumericEnum) + *p = x + return p +} + +func (x NumericEnum) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (NumericEnum) Descriptor() protoreflect.EnumDescriptor { + return file_test_proto_enumTypes[0].Descriptor() +} + +func (NumericEnum) Type() protoreflect.EnumType { + return &file_test_proto_enumTypes[0] +} + +func (x NumericEnum) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use NumericEnum.Descriptor instead. +func (NumericEnum) EnumDescriptor() ([]byte, []int) { + return file_test_proto_rawDescGZIP(), []int{0} +} + +// DeepEnum is one or zero. +type ABitOfEverything_Nested_DeepEnum int32 + +const ( + // FALSE is false. + ABitOfEverything_Nested_FALSE ABitOfEverything_Nested_DeepEnum = 0 + // TRUE is true. + ABitOfEverything_Nested_TRUE ABitOfEverything_Nested_DeepEnum = 1 +) + +// Enum value maps for ABitOfEverything_Nested_DeepEnum. +var ( + ABitOfEverything_Nested_DeepEnum_name = map[int32]string{ + 0: "FALSE", + 1: "TRUE", + } + ABitOfEverything_Nested_DeepEnum_value = map[string]int32{ + "FALSE": 0, + "TRUE": 1, + } +) + +func (x ABitOfEverything_Nested_DeepEnum) Enum() *ABitOfEverything_Nested_DeepEnum { + p := new(ABitOfEverything_Nested_DeepEnum) + *p = x + return p +} + +func (x ABitOfEverything_Nested_DeepEnum) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ABitOfEverything_Nested_DeepEnum) Descriptor() protoreflect.EnumDescriptor { + return file_test_proto_enumTypes[1].Descriptor() +} + +func (ABitOfEverything_Nested_DeepEnum) Type() protoreflect.EnumType { + return &file_test_proto_enumTypes[1] +} + +func (x ABitOfEverything_Nested_DeepEnum) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ABitOfEverything_Nested_DeepEnum.Descriptor instead. +func (ABitOfEverything_Nested_DeepEnum) EnumDescriptor() ([]byte, []int) { + return file_test_proto_rawDescGZIP(), []int{0, 0, 0} +} + +// Intentionally complicated message type to cover many features of Protobuf. +type ABitOfEverything struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SingleNested *ABitOfEverything_Nested `protobuf:"bytes,25,opt,name=single_nested,json=singleNested,proto3" json:"single_nested,omitempty"` + Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` + Nested []*ABitOfEverything_Nested `protobuf:"bytes,2,rep,name=nested,proto3" json:"nested,omitempty"` + FloatValue float32 `protobuf:"fixed32,3,opt,name=float_value,json=floatValue,proto3" json:"float_value,omitempty"` + DoubleValue float64 `protobuf:"fixed64,4,opt,name=double_value,json=doubleValue,proto3" json:"double_value,omitempty"` + Int64Value int64 `protobuf:"varint,5,opt,name=int64_value,json=int64Value,proto3" json:"int64_value,omitempty"` + Uint64Value uint64 `protobuf:"varint,6,opt,name=uint64_value,json=uint64Value,proto3" json:"uint64_value,omitempty"` + Int32Value int32 `protobuf:"varint,7,opt,name=int32_value,json=int32Value,proto3" json:"int32_value,omitempty"` + Fixed64Value uint64 `protobuf:"fixed64,8,opt,name=fixed64_value,json=fixed64Value,proto3" json:"fixed64_value,omitempty"` + Fixed32Value uint32 `protobuf:"fixed32,9,opt,name=fixed32_value,json=fixed32Value,proto3" json:"fixed32_value,omitempty"` + BoolValue bool `protobuf:"varint,10,opt,name=bool_value,json=boolValue,proto3" json:"bool_value,omitempty"` + StringValue string `protobuf:"bytes,11,opt,name=string_value,json=stringValue,proto3" json:"string_value,omitempty"` + BytesValue []byte `protobuf:"bytes,29,opt,name=bytes_value,json=bytesValue,proto3" json:"bytes_value,omitempty"` + Uint32Value uint32 `protobuf:"varint,13,opt,name=uint32_value,json=uint32Value,proto3" json:"uint32_value,omitempty"` + EnumValue NumericEnum `protobuf:"varint,14,opt,name=enum_value,json=enumValue,proto3,enum=NumericEnum" json:"enum_value,omitempty"` + EnumValueInt NumericEnum `protobuf:"varint,50,opt,name=enum_value_int,json=enumValueInt,proto3,enum=NumericEnum" json:"enum_value_int,omitempty"` + Sfixed32Value int32 `protobuf:"fixed32,15,opt,name=sfixed32_value,json=sfixed32Value,proto3" json:"sfixed32_value,omitempty"` + Sfixed64Value int64 `protobuf:"fixed64,16,opt,name=sfixed64_value,json=sfixed64Value,proto3" json:"sfixed64_value,omitempty"` + Sint32Value int32 `protobuf:"zigzag32,17,opt,name=sint32_value,json=sint32Value,proto3" json:"sint32_value,omitempty"` + Sint64Value int64 `protobuf:"zigzag64,18,opt,name=sint64_value,json=sint64Value,proto3" json:"sint64_value,omitempty"` + RepeatedStringValue []string `protobuf:"bytes,19,rep,name=repeated_string_value,json=repeatedStringValue,proto3" json:"repeated_string_value,omitempty"` + MapValue map[string]NumericEnum `protobuf:"bytes,22,rep,name=map_value,json=mapValue,proto3" json:"map_value,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3,enum=NumericEnum"` + MappedStringValue map[string]string `protobuf:"bytes,23,rep,name=mapped_string_value,json=mappedStringValue,proto3" json:"mapped_string_value,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + MappedNestedValue map[string]*ABitOfEverything_Nested `protobuf:"bytes,24,rep,name=mapped_nested_value,json=mappedNestedValue,proto3" json:"mapped_nested_value,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NonConventionalNameValue string `protobuf:"bytes,26,opt,name=nonConventionalNameValue,proto3" json:"nonConventionalNameValue,omitempty"` + TimestampValue *timestamp.Timestamp `protobuf:"bytes,27,opt,name=timestamp_value,json=timestampValue,proto3" json:"timestamp_value,omitempty"` + TimestampValuePointer *timestamp.Timestamp `protobuf:"bytes,49,opt,name=timestamp_value_pointer,json=timestampValuePointer,proto3" json:"timestamp_value_pointer,omitempty"` + DurationValue *duration.Duration `protobuf:"bytes,47,opt,name=duration_value,json=durationValue,proto3" json:"duration_value,omitempty"` + // repeated values. they are comma-separated in path + PathRepeatedFloatValue []float32 `protobuf:"fixed32,44,rep,packed,name=path_repeated_float_value,json=pathRepeatedFloatValue,proto3" json:"path_repeated_float_value,omitempty"` + PathRepeatedDoubleValue []float64 `protobuf:"fixed64,45,rep,packed,name=path_repeated_double_value,json=pathRepeatedDoubleValue,proto3" json:"path_repeated_double_value,omitempty"` + PathRepeatedInt64Value []int64 `protobuf:"varint,30,rep,packed,name=path_repeated_int64_value,json=pathRepeatedInt64Value,proto3" json:"path_repeated_int64_value,omitempty"` + PathRepeatedUint64Value []uint64 `protobuf:"varint,31,rep,packed,name=path_repeated_uint64_value,json=pathRepeatedUint64Value,proto3" json:"path_repeated_uint64_value,omitempty"` + PathRepeatedInt32Value []int32 `protobuf:"varint,32,rep,packed,name=path_repeated_int32_value,json=pathRepeatedInt32Value,proto3" json:"path_repeated_int32_value,omitempty"` + PathRepeatedFixed64Value []uint64 `protobuf:"fixed64,33,rep,packed,name=path_repeated_fixed64_value,json=pathRepeatedFixed64Value,proto3" json:"path_repeated_fixed64_value,omitempty"` + PathRepeatedFixed32Value []uint32 `protobuf:"fixed32,34,rep,packed,name=path_repeated_fixed32_value,json=pathRepeatedFixed32Value,proto3" json:"path_repeated_fixed32_value,omitempty"` + PathRepeatedBoolValue []bool `protobuf:"varint,35,rep,packed,name=path_repeated_bool_value,json=pathRepeatedBoolValue,proto3" json:"path_repeated_bool_value,omitempty"` + PathRepeatedStringValue []string `protobuf:"bytes,36,rep,name=path_repeated_string_value,json=pathRepeatedStringValue,proto3" json:"path_repeated_string_value,omitempty"` + PathRepeatedBytesValue [][]byte `protobuf:"bytes,37,rep,name=path_repeated_bytes_value,json=pathRepeatedBytesValue,proto3" json:"path_repeated_bytes_value,omitempty"` + PathRepeatedUint32Value []uint32 `protobuf:"varint,38,rep,packed,name=path_repeated_uint32_value,json=pathRepeatedUint32Value,proto3" json:"path_repeated_uint32_value,omitempty"` + PathRepeatedEnumValue []NumericEnum `protobuf:"varint,46,rep,packed,name=path_repeated_enum_value,json=pathRepeatedEnumValue,proto3,enum=NumericEnum" json:"path_repeated_enum_value,omitempty"` + PathRepeatedSfixed32Value []int32 `protobuf:"fixed32,40,rep,packed,name=path_repeated_sfixed32_value,json=pathRepeatedSfixed32Value,proto3" json:"path_repeated_sfixed32_value,omitempty"` + PathRepeatedSfixed64Value []int64 `protobuf:"fixed64,41,rep,packed,name=path_repeated_sfixed64_value,json=pathRepeatedSfixed64Value,proto3" json:"path_repeated_sfixed64_value,omitempty"` + PathRepeatedSint32Value []int32 `protobuf:"zigzag32,42,rep,packed,name=path_repeated_sint32_value,json=pathRepeatedSint32Value,proto3" json:"path_repeated_sint32_value,omitempty"` + PathRepeatedSint64Value []int64 `protobuf:"zigzag64,43,rep,packed,name=path_repeated_sint64_value,json=pathRepeatedSint64Value,proto3" json:"path_repeated_sint64_value,omitempty"` +} + +func (x *ABitOfEverything) Reset() { + *x = ABitOfEverything{} + if protoimpl.UnsafeEnabled { + mi := &file_test_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ABitOfEverything) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ABitOfEverything) ProtoMessage() {} + +func (x *ABitOfEverything) ProtoReflect() protoreflect.Message { + mi := &file_test_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ABitOfEverything.ProtoReflect.Descriptor instead. +func (*ABitOfEverything) Descriptor() ([]byte, []int) { + return file_test_proto_rawDescGZIP(), []int{0} +} + +func (x *ABitOfEverything) GetSingleNested() *ABitOfEverything_Nested { + if x != nil { + return x.SingleNested + } + return nil +} + +func (x *ABitOfEverything) GetUuid() string { + if x != nil { + return x.Uuid + } + return "" +} + +func (x *ABitOfEverything) GetNested() []*ABitOfEverything_Nested { + if x != nil { + return x.Nested + } + return nil +} + +func (x *ABitOfEverything) GetFloatValue() float32 { + if x != nil { + return x.FloatValue + } + return 0 +} + +func (x *ABitOfEverything) GetDoubleValue() float64 { + if x != nil { + return x.DoubleValue + } + return 0 +} + +func (x *ABitOfEverything) GetInt64Value() int64 { + if x != nil { + return x.Int64Value + } + return 0 +} + +func (x *ABitOfEverything) GetUint64Value() uint64 { + if x != nil { + return x.Uint64Value + } + return 0 +} + +func (x *ABitOfEverything) GetInt32Value() int32 { + if x != nil { + return x.Int32Value + } + return 0 +} + +func (x *ABitOfEverything) GetFixed64Value() uint64 { + if x != nil { + return x.Fixed64Value + } + return 0 +} + +func (x *ABitOfEverything) GetFixed32Value() uint32 { + if x != nil { + return x.Fixed32Value + } + return 0 +} + +func (x *ABitOfEverything) GetBoolValue() bool { + if x != nil { + return x.BoolValue + } + return false +} + +func (x *ABitOfEverything) GetStringValue() string { + if x != nil { + return x.StringValue + } + return "" +} + +func (x *ABitOfEverything) GetBytesValue() []byte { + if x != nil { + return x.BytesValue + } + return nil +} + +func (x *ABitOfEverything) GetUint32Value() uint32 { + if x != nil { + return x.Uint32Value + } + return 0 +} + +func (x *ABitOfEverything) GetEnumValue() NumericEnum { + if x != nil { + return x.EnumValue + } + return NumericEnum_ZERO +} + +func (x *ABitOfEverything) GetEnumValueInt() NumericEnum { + if x != nil { + return x.EnumValueInt + } + return NumericEnum_ZERO +} + +func (x *ABitOfEverything) GetSfixed32Value() int32 { + if x != nil { + return x.Sfixed32Value + } + return 0 +} + +func (x *ABitOfEverything) GetSfixed64Value() int64 { + if x != nil { + return x.Sfixed64Value + } + return 0 +} + +func (x *ABitOfEverything) GetSint32Value() int32 { + if x != nil { + return x.Sint32Value + } + return 0 +} + +func (x *ABitOfEverything) GetSint64Value() int64 { + if x != nil { + return x.Sint64Value + } + return 0 +} + +func (x *ABitOfEverything) GetRepeatedStringValue() []string { + if x != nil { + return x.RepeatedStringValue + } + return nil +} + +func (x *ABitOfEverything) GetMapValue() map[string]NumericEnum { + if x != nil { + return x.MapValue + } + return nil +} + +func (x *ABitOfEverything) GetMappedStringValue() map[string]string { + if x != nil { + return x.MappedStringValue + } + return nil +} + +func (x *ABitOfEverything) GetMappedNestedValue() map[string]*ABitOfEverything_Nested { + if x != nil { + return x.MappedNestedValue + } + return nil +} + +func (x *ABitOfEverything) GetNonConventionalNameValue() string { + if x != nil { + return x.NonConventionalNameValue + } + return "" +} + +func (x *ABitOfEverything) GetTimestampValue() *timestamp.Timestamp { + if x != nil { + return x.TimestampValue + } + return nil +} + +func (x *ABitOfEverything) GetTimestampValuePointer() *timestamp.Timestamp { + if x != nil { + return x.TimestampValuePointer + } + return nil +} + +func (x *ABitOfEverything) GetDurationValue() *duration.Duration { + if x != nil { + return x.DurationValue + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedFloatValue() []float32 { + if x != nil { + return x.PathRepeatedFloatValue + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedDoubleValue() []float64 { + if x != nil { + return x.PathRepeatedDoubleValue + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedInt64Value() []int64 { + if x != nil { + return x.PathRepeatedInt64Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedUint64Value() []uint64 { + if x != nil { + return x.PathRepeatedUint64Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedInt32Value() []int32 { + if x != nil { + return x.PathRepeatedInt32Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedFixed64Value() []uint64 { + if x != nil { + return x.PathRepeatedFixed64Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedFixed32Value() []uint32 { + if x != nil { + return x.PathRepeatedFixed32Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedBoolValue() []bool { + if x != nil { + return x.PathRepeatedBoolValue + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedStringValue() []string { + if x != nil { + return x.PathRepeatedStringValue + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedBytesValue() [][]byte { + if x != nil { + return x.PathRepeatedBytesValue + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedUint32Value() []uint32 { + if x != nil { + return x.PathRepeatedUint32Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedEnumValue() []NumericEnum { + if x != nil { + return x.PathRepeatedEnumValue + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedSfixed32Value() []int32 { + if x != nil { + return x.PathRepeatedSfixed32Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedSfixed64Value() []int64 { + if x != nil { + return x.PathRepeatedSfixed64Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedSint32Value() []int32 { + if x != nil { + return x.PathRepeatedSint32Value + } + return nil +} + +func (x *ABitOfEverything) GetPathRepeatedSint64Value() []int64 { + if x != nil { + return x.PathRepeatedSint64Value + } + return nil +} + +type Body struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *Body) Reset() { + *x = Body{} + if protoimpl.UnsafeEnabled { + mi := &file_test_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Body) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Body) ProtoMessage() {} + +func (x *Body) ProtoReflect() protoreflect.Message { + mi := &file_test_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Body.ProtoReflect.Descriptor instead. +func (*Body) Descriptor() ([]byte, []int) { + return file_test_proto_rawDescGZIP(), []int{1} +} + +func (x *Body) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type MessageWithBody struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Data *Body `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *MessageWithBody) Reset() { + *x = MessageWithBody{} + if protoimpl.UnsafeEnabled { + mi := &file_test_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MessageWithBody) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MessageWithBody) ProtoMessage() {} + +func (x *MessageWithBody) ProtoReflect() protoreflect.Message { + mi := &file_test_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MessageWithBody.ProtoReflect.Descriptor instead. +func (*MessageWithBody) Descriptor() ([]byte, []int) { + return file_test_proto_rawDescGZIP(), []int{2} +} + +func (x *MessageWithBody) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *MessageWithBody) GetData() *Body { + if x != nil { + return x.Data + } + return nil +} + +// Nested is nested type. +type ABitOfEverything_Nested struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // name is nested field. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Amount uint32 `protobuf:"varint,2,opt,name=amount,proto3" json:"amount,omitempty"` + // DeepEnum comment. + Ok ABitOfEverything_Nested_DeepEnum `protobuf:"varint,3,opt,name=ok,proto3,enum=ABitOfEverything_Nested_DeepEnum" json:"ok,omitempty"` +} + +func (x *ABitOfEverything_Nested) Reset() { + *x = ABitOfEverything_Nested{} + if protoimpl.UnsafeEnabled { + mi := &file_test_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ABitOfEverything_Nested) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ABitOfEverything_Nested) ProtoMessage() {} + +func (x *ABitOfEverything_Nested) ProtoReflect() protoreflect.Message { + mi := &file_test_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ABitOfEverything_Nested.ProtoReflect.Descriptor instead. +func (*ABitOfEverything_Nested) Descriptor() ([]byte, []int) { + return file_test_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *ABitOfEverything_Nested) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ABitOfEverything_Nested) GetAmount() uint32 { + if x != nil { + return x.Amount + } + return 0 +} + +func (x *ABitOfEverything_Nested) GetOk() ABitOfEverything_Nested_DeepEnum { + if x != nil { + return x.Ok + } + return ABitOfEverything_Nested_FALSE +} + +var File_test_proto protoreflect.FileDescriptor + +var file_test_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x98, 0x15, + 0x0a, 0x10, 0x41, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x45, 0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x5f, 0x6e, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x41, 0x42, 0x69, 0x74, + 0x4f, 0x66, 0x45, 0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x4e, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x52, 0x0c, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x4e, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x41, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x45, 0x76, + 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, + 0x06, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x66, 0x6c, + 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, + 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x69, + 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, + 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x06, 0x52, 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x07, 0x52, 0x0c, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, + 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x62, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x2b, 0x0a, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x45, 0x6e, + 0x75, 0x6d, 0x52, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, + 0x0e, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x18, + 0x32, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x45, + 0x6e, 0x75, 0x6d, 0x52, 0x0c, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x49, 0x6e, + 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0f, 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x66, 0x69, 0x78, + 0x65, 0x64, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x10, + 0x52, 0x0d, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x12, 0x52, 0x0b, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x13, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x6d, 0x61, 0x70, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x41, + 0x42, 0x69, 0x74, 0x4f, 0x66, 0x45, 0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, + 0x4d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, + 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x58, 0x0a, 0x13, 0x6d, 0x61, 0x70, 0x70, 0x65, + 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x17, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x41, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x45, 0x76, 0x65, + 0x72, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, + 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x58, 0x0a, 0x13, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x6e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x41, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x45, 0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, 0x6e, + 0x67, 0x2e, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x6e, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6e, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x17, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x15, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x2c, 0x20, 0x03, 0x28, 0x02, 0x52, 0x16, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, + 0x1a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x64, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x2d, 0x20, 0x03, 0x28, + 0x01, 0x52, 0x17, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x61, + 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x36, + 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x03, 0x52, 0x16, 0x70, + 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x36, 0x34, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x04, 0x52, 0x17, 0x70, 0x61, 0x74, 0x68, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x20, 0x20, 0x03, 0x28, 0x05, 0x52, 0x16, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, + 0x1b, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, + 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x21, 0x20, 0x03, + 0x28, 0x06, 0x52, 0x18, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x1b, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x66, 0x69, + 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x22, 0x20, 0x03, 0x28, + 0x07, 0x52, 0x18, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x6f, 0x6f, + 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x23, 0x20, 0x03, 0x28, 0x08, 0x52, 0x15, 0x70, + 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x6f, 0x6f, 0x6c, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x24, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, + 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x25, + 0x20, 0x03, 0x28, 0x0c, 0x52, 0x16, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x1a, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x26, 0x20, 0x03, 0x28, 0x0d, + 0x52, 0x17, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x55, 0x69, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x45, 0x0a, 0x18, 0x70, 0x61, 0x74, + 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x75, 0x6d, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x2e, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x4e, 0x75, + 0x6d, 0x65, 0x72, 0x69, 0x63, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x15, 0x70, 0x61, 0x74, 0x68, 0x52, + 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x28, 0x20, 0x03, 0x28, 0x0f, 0x52, 0x19, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x73, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x29, 0x20, 0x03, 0x28, 0x10, 0x52, 0x19, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x66, 0x69, 0x78, 0x65, 0x64, 0x36, 0x34, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x2a, 0x20, 0x03, 0x28, 0x11, 0x52, 0x17, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x3b, 0x0a, 0x1a, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x73, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x2b, 0x20, + 0x03, 0x28, 0x12, 0x52, 0x17, 0x70, 0x61, 0x74, 0x68, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x88, 0x01, 0x0a, + 0x06, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x21, 0x2e, 0x41, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x45, 0x76, 0x65, 0x72, 0x79, 0x74, 0x68, 0x69, + 0x6e, 0x67, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x2e, 0x44, 0x65, 0x65, 0x70, 0x45, 0x6e, + 0x75, 0x6d, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x1f, 0x0a, 0x08, 0x44, 0x65, 0x65, 0x70, 0x45, 0x6e, + 0x75, 0x6d, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, + 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, 0x1a, 0x49, 0x0a, 0x0d, 0x4d, 0x61, 0x70, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x4e, 0x75, 0x6d, 0x65, + 0x72, 0x69, 0x63, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x4d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5e, 0x0a, 0x16, 0x4d, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x41, 0x42, 0x69, 0x74, 0x4f, 0x66, 0x45, 0x76, 0x65, 0x72, + 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1a, 0x0a, 0x04, 0x42, 0x6f, 0x64, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a, 0x0f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x57, + 0x69, 0x74, 0x68, 0x42, 0x6f, 0x64, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x05, 0x2e, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x2a, 0x20, 0x0a, 0x0b, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x45, 0x6e, 0x75, + 0x6d, 0x12, 0x08, 0x0a, 0x04, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4f, + 0x4e, 0x45, 0x10, 0x01, 0x42, 0x22, 0x5a, 0x20, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x6c, 0x65, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x70, 0x79, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_test_proto_rawDescOnce sync.Once + file_test_proto_rawDescData = file_test_proto_rawDesc +) + +func file_test_proto_rawDescGZIP() []byte { + file_test_proto_rawDescOnce.Do(func() { + file_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_proto_rawDescData) + }) + return file_test_proto_rawDescData +} + +var file_test_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_test_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_test_proto_goTypes = []interface{}{ + (NumericEnum)(0), // 0: NumericEnum + (ABitOfEverything_Nested_DeepEnum)(0), // 1: ABitOfEverything.Nested.DeepEnum + (*ABitOfEverything)(nil), // 2: ABitOfEverything + (*Body)(nil), // 3: Body + (*MessageWithBody)(nil), // 4: MessageWithBody + (*ABitOfEverything_Nested)(nil), // 5: ABitOfEverything.Nested + nil, // 6: ABitOfEverything.MapValueEntry + nil, // 7: ABitOfEverything.MappedStringValueEntry + nil, // 8: ABitOfEverything.MappedNestedValueEntry + (*timestamp.Timestamp)(nil), // 9: google.protobuf.Timestamp + (*duration.Duration)(nil), // 10: google.protobuf.Duration +} +var file_test_proto_depIdxs = []int32{ + 5, // 0: ABitOfEverything.single_nested:type_name -> ABitOfEverything.Nested + 5, // 1: ABitOfEverything.nested:type_name -> ABitOfEverything.Nested + 0, // 2: ABitOfEverything.enum_value:type_name -> NumericEnum + 0, // 3: ABitOfEverything.enum_value_int:type_name -> NumericEnum + 6, // 4: ABitOfEverything.map_value:type_name -> ABitOfEverything.MapValueEntry + 7, // 5: ABitOfEverything.mapped_string_value:type_name -> ABitOfEverything.MappedStringValueEntry + 8, // 6: ABitOfEverything.mapped_nested_value:type_name -> ABitOfEverything.MappedNestedValueEntry + 9, // 7: ABitOfEverything.timestamp_value:type_name -> google.protobuf.Timestamp + 9, // 8: ABitOfEverything.timestamp_value_pointer:type_name -> google.protobuf.Timestamp + 10, // 9: ABitOfEverything.duration_value:type_name -> google.protobuf.Duration + 0, // 10: ABitOfEverything.path_repeated_enum_value:type_name -> NumericEnum + 3, // 11: MessageWithBody.data:type_name -> Body + 1, // 12: ABitOfEverything.Nested.ok:type_name -> ABitOfEverything.Nested.DeepEnum + 0, // 13: ABitOfEverything.MapValueEntry.value:type_name -> NumericEnum + 5, // 14: ABitOfEverything.MappedNestedValueEntry.value:type_name -> ABitOfEverything.Nested + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name +} + +func init() { file_test_proto_init() } +func file_test_proto_init() { + if File_test_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ABitOfEverything); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Body); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MessageWithBody); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ABitOfEverything_Nested); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_test_proto_rawDesc, + NumEnums: 2, + NumMessages: 7, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_test_proto_goTypes, + DependencyIndexes: file_test_proto_depIdxs, + EnumInfos: file_test_proto_enumTypes, + MessageInfos: file_test_proto_msgTypes, + }.Build() + File_test_proto = out.File + file_test_proto_rawDesc = nil + file_test_proto_goTypes = nil + file_test_proto_depIdxs = nil +} diff --git a/protocopy/test/test.proto b/protocopy/test/test.proto new file mode 100644 index 0000000..185346a --- /dev/null +++ b/protocopy/test/test.proto @@ -0,0 +1,94 @@ +syntax = "proto3"; +option go_package = "github.com/lileio/protocopy/test"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; + +// Intentionally complicated message type to cover many features of Protobuf. +message ABitOfEverything { + // Nested is nested type. + message Nested { + // name is nested field. + string name = 1; + uint32 amount = 2; + // DeepEnum is one or zero. + enum DeepEnum { + // FALSE is false. + FALSE = 0; + // TRUE is true. + TRUE = 1; + } + + // DeepEnum comment. + DeepEnum ok = 3; + } + Nested single_nested = 25; + + string uuid = 1; + repeated Nested nested = 2; + float float_value = 3; + double double_value = 4; + int64 int64_value = 5; + uint64 uint64_value = 6; + int32 int32_value = 7; + fixed64 fixed64_value = 8; + fixed32 fixed32_value = 9; + bool bool_value = 10; + string string_value = 11; + bytes bytes_value = 29; + uint32 uint32_value = 13; + NumericEnum enum_value = 14; + NumericEnum enum_value_int = 50; + sfixed32 sfixed32_value = 15; + sfixed64 sfixed64_value = 16; + sint32 sint32_value = 17; + sint64 sint64_value = 18; + repeated string repeated_string_value = 19; + + map map_value = 22; + map mapped_string_value = 23; + map mapped_nested_value = 24; + + string nonConventionalNameValue = 26; + + google.protobuf.Timestamp timestamp_value = 27; + google.protobuf.Timestamp timestamp_value_pointer = 49; + google.protobuf.Duration duration_value = 47; + + + + // repeated values. they are comma-separated in path + repeated float path_repeated_float_value = 44; + repeated double path_repeated_double_value = 45; + repeated int64 path_repeated_int64_value = 30; + repeated uint64 path_repeated_uint64_value = 31; + repeated int32 path_repeated_int32_value = 32; + repeated fixed64 path_repeated_fixed64_value = 33; + repeated fixed32 path_repeated_fixed32_value = 34; + repeated bool path_repeated_bool_value = 35; + repeated string path_repeated_string_value = 36; + repeated bytes path_repeated_bytes_value = 37; + repeated uint32 path_repeated_uint32_value = 38; + repeated NumericEnum path_repeated_enum_value = 46; + repeated sfixed32 path_repeated_sfixed32_value = 40; + repeated sfixed64 path_repeated_sfixed64_value = 41; + repeated sint32 path_repeated_sint32_value = 42; + repeated sint64 path_repeated_sint64_value = 43; +} + +message Body { + string name = 1; +} + +message MessageWithBody { + string id = 1; + Body data = 2; +} + + +// NumericEnum is one or zero. +enum NumericEnum { + // ZERO means 0 + ZERO = 0; + // ONE means 1 + ONE = 1; +} diff --git a/statik/statik.go b/statik/statik.go index 9c98f99..6a4aae0 100644 --- a/statik/statik.go +++ b/statik/statik.go @@ -1,13 +1,14 @@ // Code generated by statik. DO NOT EDIT. -// Package statik contains static assets. package statik import ( "github.com/rakyll/statik/fs" ) + func init() { - data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00 \x00Dockerfile.tmplUT\x05\x00\x01\xe0a\xed\\t\x90\xc1O\xc20\x14\xc6\xef\xfd+^v\xe0dW\x8e\xc6d\x07\x04$DY\xc9\xc0\x18\x82\xc4\x94\xb6\x94\xc5\xadm\xdaNM\x96\xfd\xeffs\x01\x85x\xfb\xde\xfb\xfa\xbd\xfe\xde{\xc8\xe8\x02\x94)\x98Vw\xac\xb0\xb9\x960Z\xc1\xbe\xca\x0b\x81\xa5\xfe@/4{\x9c\xcc3 u\x0dq\xcaJ M\x83\xb2\xe7\x14\x98}\x87\xca\n\x16$\x0c\x06}\xa5\x1c\x13]\xf9\x8a\x00\xa0k2!\x00cm0g\xfc(a\xcf\xfc\x11T\x1e\xc0X\xa9\xbd?\xa21]n@\x99\xb84\xe2\xcf\x1f\xe4\xa7w\xf2}U^\xf9\xbe*;\x14e\xa0\x8d\x0b\xf3\xa9\x0b\xc3\xfaL|\x8d<\x9e\xd1\xb7i:\xba\x7f\x9aN\x92!\xcc(]%E\xae\xab\xafv@\xb71\xe0^\x90\xba\xee\x92M\x03\xf1Y#\x84\xbasy\xeeX\xe0=;\xc6\x07g\xca\xe4t1 2p\xe2}A\xb8t\xc1\x13\xcep+\xf2C\xceY\x90>\xe6.\\>\xf9o\xd0\xefu/\xb1\x08\x9a\xa6\xebl\xb3\xa4\xf3t\x0d\xdb\xe8\xecD;4^L`\x1bU6\xba\x81\x08c\xe5,\xc7\xd6\xb8\x90\xdc\x0e\xa3\x1d\xfa\x0e\x00\x00\xff\xffPK\x07\x08f\x96,\xd5#\x01\x00\x00\xf1\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00 \x00Makefile.tmplUT\x05\x00\x01\xe0a\xed\\,\x8e1k\xc30\x10F\xe7\xdc\xaf8\xe8\xda;\xd3\xd5\xe0\xbd]\xd2\xae\x9d\x82b.\x17Q\xd9'\xa4\x93\x97\x90\xff^,g{\x0f>>\xde\x1bnq\xc4\x9bOK\xf8\x13\xe0\x9f\xcf\xef\xf3\xef\x88\xb9\x98\x1b\xbaT\x07\xe8<\xc2I\x0dU\x1c5\xfa\xbd]y\xb6ePKa\xd5\xa1\x0f\xae\xedv\xc0L*+\xa9\xc1\xe9P\xa4/d|<\xf8\x1c\x16y>\xf9\xb8&J1 U)\x9b\x94\x8b5\x9f\x18\x89\xd4:\xe6\xd44\xaeu\xd2\x92\xe7\xf7\x1c\xfc^\xa7j\xad\xccr)\x92\x82\xc7MF\x06\xd8\xeb^\xa5=nw\xa4\x8c\x1fH\x1b\xf2\xc0\xcc\xf0\x1f\x00\x00\xff\xffPK\x07\x08\x1e\x06\xed\xa9\xa8\x00\x00\x00\xdd\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x19\xa89O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00client.tmplUT\x05\x00\x01\x83\xd5\x8b]|SAk\xe3<\x10=K\xbfb>\x1f\xbe\xb5!\x95a\x8f\x0b9\xa5l)t\xb3\xd0n\xe8\xb1\xa8\xf2\xc4\x16\x95g\xccXI\x1aB\xfe\xfb\"\xdb\xdbu\xbb4\xbaX\x9e\x99\xf7\xf4\xfc\xf4\xdcY\xf7bk\x84\xd3 \xcc\xda\xb6\x08\xe7\xb3\xd6\xbe\xedX\"\xe4Ze\xfd\x91\\\xa6\xb5\xcaj\x1f\x9b\xdd\xb3q\xdc\x96\xb5t\xee\n\x1d\xf7\xc7>\xe2\xf4\xca\x1dR\x14\xeb<\xd5e\xcd%\xc7T\xcd\xde\xe3\x82\x0f\xe8yx\x94\xfb\xaf\x99V3\x10\xcc\x07\xe7d\xb3\xfdU\xcd\x99\x86i%\xfe\xa7\xd6WU\xc0\x83\x15\x84K\x02\xf9j\xa8\xfc\x9d\x1e\x841\xd7\x01M\xcd\xc1RmX\xear\x94\\h\xbd\xb7\x92>\xde\xb5\xb0\x84\xff\x93\x03\xe6\xc7.\xe2\xeb\xe9\xac\xd5*x\xa48\xd8\xb5\xb2-\x86\x95\xedq\xf2ml%\xfcvG\x0en0~>\x95\x17\x17(\xe0\x94\xce6w\xec^\xf2B\xab\n\xb7(\xe0Z\xb3\xa10\x96\xb4\xf2[\x98f\xff[\x02\xf9\x90 J0\xee\x84\xa6\x86Vg\xadU\x8f\xb2\xf7\x0e7\xf7w\xf0m \xc9y\xb3\xb9\xbf\xfb\xce\xf206\xf2,\xc9\xb8^?L\x02\xb2D^\x96\xf0\x88P1}\x89@\x88\x15D\x06\x14a\x81\x06\x05\x17`{\x88\x8d\xef\xc1 \xda\x88=X\xe8\x98\x03X\xaa\xc01\x11\xba\xe8\x99\xfa\x81\xe7\xe0C\x80\xc6v\x1d\x12\x04\x1bQ\xb4J#\x0bxJz\x92\xe1\xe6\xda\xdb\x90k5\x93\xba\xd0J\x0d\xadG\x1f\x9b[\xea\xd1\xed\x04\xf3\xe2]yCV\x8e\xb7\x14Q\x1cv\x91%\x7f\x0b\xc6\xc7\xf5!(f\xd5XO\x03|\xba\x8aO\x91i\x0d\x96\xad\x98\"\xbe\xc6q~~h\xb1\xb8\x08\x1e\xff\x02\xf3\xb3C\xfa5F\xf8_\x8aY\xbe\xcdM\xe0g\x1b\xd2(J^\\ \x1f\xbc(\xd2]\xb9\xe0\x93\x93k<\\\x08[\xb2\xbcx\xcb\xee\x12\\\xf0\xfaOZ\xd2\xfe\xac\x7f\x07\x00\x00\xff\xffPK\x07\x08\xe4\xe99\xbd\xdf\x01\x00\x00\x07\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\x1d\xa89O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00 \x00cmd_main.tmplUT\x05\x00\x01\x8a\xd5\x8b]t\x91\xc1\x8e\xdb \x10\x86\xcf\xccS\x8c|XA\x15\x81\xd4c\xa4\x9e\xa2m/\xddj\xd5<@\x85\xf1\x84E\x05cap+E~\xf7\n\xe2l\xf7\xe0\x9cl\xfe\x8f\xf9\xff\x19f\xd2\xe6\xb7\xb6\x84A\xbb\x11\xc0\x85)\xa6\x8c\x1c\xd8/\xecF\xca\xea-\xe7IMS\x8a\x97\x0e\x80u\xd6\xe5\xb7\xd2K\x13\x83\xf2\xce\x93\x8b\xed\xa3\x96\xcf\xdd>\x8c6\xed\x93K\x8a\x81\xc6e\x1fN\xa5\x9fK\xff\xd0\xf5\x1d\xab\xe0\x86\xc1\xd3\x1f\x9dH\x0dt\xd1\xc5\xe7\xb9\x95\xc4h=I\x1b\xbd\x1e\xad\x8c\xc9*\x9b&S\xc9\xf5\x8a\xf2%\x0e\xc5\xd3\x0f\x1d\x08\xd7uWT3\xa5\x85\xd2>\xab\xca\xfd\xdf\x84\xa1\x03\x01p)\xa3i/\xc8\x05^\x81\xd5\xb1\xe5\x99\xf2wZ\xc8\x7fM1<\x8f\x0b\x17\xc0f<~\xc1\xa7\x9b\xb9\xac>'\x1d\xc8\x9f\xf4|7?7t]\x01X\x9d\xb5\xe5\xf0\xeeCb'6r\xbb\xc9k0\xb7\xf8\xa9\xce\xb7i\xad\x03\xf6\xa1F\xfe$\xeb\xe6L\xe9q\"\xb7\x07\x9c\x05\xb0U\x00\xb0\xdb\xf3\xd6\xfeO\xde\xd1\x98\xf9\xd3\xa6\xdc\x8e\xd5\xbdV9\xd3<\x8e\xd8\xfa\xf9\xe6c\xaf\xfd\xa6s\xd1\xb2\x0f\xc0\xd8k\x8a\x8b\x1b(\x1d\x11\x11\xb7\xa5\xcb\xd7\xd2\x9fK\x7fG\\\xd4\x8b/\xef\xab<\"\xde\x97)\xff\xab\x87\xad;\x13\x06\xf9\xfc\x97L\xc9\xc4\x05\xac\xf0/\x00\x00\xff\xffPK\x07\x08\xf2\xc9d\xa2[\x01\x00\x00\xc0\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\"\xa89O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00 \x00cmd_root.tmplUT\x05\x00\x01\x91\xd5\x8b]<\x8cMj\xc30\x10F\xd7\x9aSLgeC\xab\xd0.[\xbchM\xba,!7P\xe4\x91:T?A\x92M\xc0\xf8\xee%)\xcd\xea\x83\xef=\xde\xd9\xd8\x1f\xe3\x19m\x9c\x00$\x9esi\xd8\x81\"\x17\x1b\x81\xa2\\ @\x91\x97\xf6=\x9f\xb4\xcdq\x17$\xb0\xe4\xdb\xec\x96\x17\x82\x1e`1\x05\xad\xf3\x9f\x12\x18k+\x92\xfc\xdfw\xcc\xb9\x8dq\xc2\x01\xaf\xb6\xfe0\x95\xc7\x1c\xa3ISG\xeb\x8a\xfa\xcbD\xc6m\xa3G\xa4w\xf4\xc7\xc3\x88'Sy\xc2\xcae\x11\xcb\xd4\x03\xb89Y\xdc_\xd8\xce\x8d\xbb\x1eWP\xe2\x90K\xc1\xd7\xe1?\xaf\xef\xf8\xedF\x1e\x06L\x12\xae\xaar\xb1\xe9C\x91\xd4B\xea\xb8\x94\x1e\x94\xcaU\xef/\xd2\xba\xa7\xe7\x1e\xd4\x06\x1b\xfc\x06\x00\x00\xff\xffPK\x07\x08w+\x85(\xca\x00\x00\x00\x01\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00$\xa89O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00cmd_up.tmplUT\x05\x00\x01\x95\xd5\x8b]l\x91\xbf\x8e\xdc \x10\xc6k\xe6)F.Nv\xe4`]\xd2\xadrEdE\xd1\x15w\x8a\xec\xa4\x8aR``mt\x06,\x066:Y~\xf7\x88\xf5n\xb4\xf9C\x01\x1af\xe6\x9b\x8f\x1f\x8b\x90/b\xd4(\xad\x020v\xf1!b xY\x85\xa7\x02X\xe1\xa9!3:1\xe7\x80^I\x8ay.\x00X1\x9a8\xa5\x81Ko\x9b\xd9\xcc\xda\xf8fI\x03\xa5\xa19\xbd+\xfe\x9b\xce\xc7\xbfIZ\x8e\xf7\xef\x1b\xe9\x87 rf]\x91?y\x95f\xfd,\xac\xc6mk(\x0d$\x83\x19t\xa0\x02*\x80\x93\x08\x98\x96\xd6*|\xc0\xbbs\x1fo\xbd\xb5\xc2\xa9\x15\xd87\xd2\x87\xec=-E\x0d\xac\x9f|\x88\x87\x1caH\x8ep\xf0q\xc2\xeeK\x8b\xa4\xc3\xc9H\x9dk\xba\xe4\x0exLN\x96\xd2*|\xf3\x87`\x8d\"\x8c\x84\xdf\x7fP\x0c\xc6\x8d\x15\xae\xc0\x98\xc4\xc3\x03Z\xf1\xa2K9 \x87\x9ex\x7f\xe6S\xe3}\x05\x8c\xed\xb0\xf8\xb3\x8f\xe6\xf8Z\xca:\x17<\xba\xa8CHK\xac\xf1B\x90\xf7\x8f\x9f\xbf~\xea\x9e*\x00\xc6F\xbf\x1b\xd8\xf5Y\xe6\xc4\xbb\xe4\xca,\xb7\x9d\xf7\xbf*v\xd0\xbc\xbf\x92)\xefn \xf1\x8c\xb0\x15V\xcf\xad\xa0+\xc5~\x7f\xf0\xef\x8e\xb0nWu`\xec\xc3[ \x97\xb9\xfd\x94\xa2\xf2?\xf7\xe1\xd797w[\x0d\x1b@6\x83\xc6\x99\xb8;\xea\xbc\x8f\xadU\xfc\xa3R\x17r\xe5\xf9\x87*\xd8\xe0W\x00\x00\x00\xff\xffPK\x07\x08\xd8\xec\xc5\xadr\x01\x00\x00e\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00 \x00gitignore.tmplUT\x05\x00\x01\xe0a\xed\\J*\xcd\xccI\xd1\xe7\xd2s \x8e\x0f.\xc9/J\xe5\x02\x04\x00\x00\xff\xffPK\x07\x08\xe4\xa5\xd4\x89\x17\x00\x00\x00\x11\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00+\xa89O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00go-mod.tmplUT\x05\x00\x01\xa3\xd5\x8b]\xca\xcdO)\xcdIU\xa8\xaeV\xd0\xf3\x053\xfd\x12sS\x15jk\xb9\xb8\xd2\xf3\x15\x0c\xf5\x0c\x8d\xb9\x00\x01\x00\x00\xff\xffPK\x07\x08\xffkCw%\x00\x00\x00\"\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00proto.tmplUT\x05\x00\x01\xe0a\xed\\t\x8e\xb1\xca\xc20\x14\x85\xf7\xfb\x14\x87N\xed\xf2\xc3\x8fc\xe8\xd4\xc1I\x07_@B{)\xc16\x89\xb9\xa9(!\xef.Q\x8b\"\xb8\x9e\xef\xdc\xf3]\xb9\xd9\xa8\xafhQ\xf9\xe0\xa2\xdbT\x8a\x9c\x8f\xc6Y\x8c\xee\xe8u\x7f\xd2#\x17\x9a\x12\xfevnX&\xde\xeb\x99\x91s\xa5h\xc5\x85\xbdRE4\xb3HI\xb7\x1c\x0f|^X\"\x12\x01\x12\x83\xb1#\xcc\x80\x16\xff\x8a\xf2WQ\xbc\xb3\xc2?\x9a\xc2\xe1b\xfa\xa7\xa8\xd33O\x9d\x96\xf5\x8f\xc7I\xf0}\x99\xa9\xdf\xce\x06\x81\xe3\x12\xac\xa0\xfe\xd8o\x902e\xba\x07\x00\x00\xff\xffPK\x07\x08\x84\x01\x0dr\x9e\x00\x00\x00\xf5\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00server.tmplUT\x05\x00\x01\xe0a\xed\\*HL\xceNLOU(N-*K-\xe2\xe2\xca\xcc-\xc8/*Q\xd0\xe0\xe2T\xaa\xaeV\xd0\xf3\xcdO)\xcdI\xf5K\xccMU\xa8\xadU\xe2\xd2\xe4\xe2\xe2*\xa9,HU\x00\xc99'\xe6\xa6\xe68'\x16\xc3\xa4\x83\xc1F(\x14\x97\x14\x95&\x97(Tsq\x82\x14A\xe5\xf4pk\xe0\xaa\xe5\x02\x04\x00\x00\xff\xffPK\x07\x08\xa1\x1b\xbf\x91a\x00\x00\x00\x85\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x003\xa89O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x00server_test.tmplUT\x05\x00\x01\xb2\xd5\x8b]t\x90\xb1j\xc30\x10\x86g\xddS\x1c\x9e\xa4\x10\x14\xe8X\xc8d:&C\xda\x17P\x9d\xebUT\x96\x8c$'\x05\xe3w/g'\xd0B3i\xf8?}\xf7\xdf\x0d\xae\xfbrLX(_(\x03\xf8~H\xb9\xa2\x06\xd5\xa4\xd2\x80j*\x95\xea#7\x00\xaa\xe1\x948\x90\xe5\x14\\d\x9b2\xef8\x0f\xdd\x1a\xf9\xfa9\xbe\xdb.\xf5\xbb\xe0\x03\xf9\xb4<\xbb\xcb\x938\xa6 \xed!\x9d\xc7@G\xd7\x13\xces\x03\x06\xe0\xe22\x16\xdc\xa3\xa4\xad\xeb)\xb4\xae\xdc\x81\xd7\xa5\xce4/P\x17\xfc\x02\xdd2\xfb\xdf\x876x\x8a\x15\xe0c\x8c\x1d\xbeQ\xa9\x07\xe7\xa3\xeeqs\xebo\x0f\x06'P\xbe\x1f\x02>\xefQ0\xcd\xb8\x91\xfev\x1d\xb6\xe4\xea\xf7\x9c\x13\xb1/\x95\xf2\xe3\x82\x9a\xb7X\x0c\xa8\x19@q\x11\xf1\"<\xd2\xf5\x96\x9bu\xa4\xe6b\x00\x94;\x9f\xf3v=\xb5\xb0r!a\xa5\xee\xdd'6N+\xa3\xe5\x8f,\xbf\xff\xb3\xfe\x91\xae\x8f/\xa0\x17\xa9\x18\xdb\x14\xa3\x96\x89F4\xa9\xd8\x97o_uoOc\xd4\xc6\xc0\x0c?\x01\x00\x00\xff\xffPK\x07\x08\xc5\x07\xd0\x9d\x18\x01\x00\x00\xfb\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x005\xa89O\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x00subscribers.tmplUT\x05\x00\x01\xb6\xd5\x8b]\x94\x911\x8f\xdb0\x0c\x85\xe7\xe8W\x10\xeeb\x07\x81\xd4v\xf4vp\x87.i\x06w\x0fd\x85u\x84\xb3D\x95\xa2\x0ew0\xfc\xdf\x0b\x9f}\xd9\n\xb4\x93@>\xbe\xc7\x0fb\xb2\xee\xd9\x8e\x08\xb9\x0c\xd9\xb1\x1f\x90\xb3R>$b\x81Z\x1d\xaa\xd1\xcb\xbd\x0c\xdaQ0\x93\x9f\xd0\x93Ie\xc8e0/_+\xd5(%o a\x9eAw6\xe0\xd4\xd9\x8c?l@X\x96\x1e\xf9\xc5;\xec\x1f\xb9\x90\x85\x8b\x13\x98\x17\xa5~\x95\xe8\xa0\xcep\xfc'g\x03=JI\xb5\x83\xe3\xb6\\w\x93\xc7(\x0d\xcc\xea`\x0c\xdcERn\x8d\x19\xe9FN\x13\x8f\xe6o\xd4\x9f6\xa3\xbe\xc4w\xa3\xd3\x97X\xef\x91\xdfm\xbcM\xc8\x97$\x9eb\xde\x82\x0f?)y\xd7\x02\x00T\x99\x02^e\xad\xab\xd3&\xae\xb8\xef\x1aTyC\xbeF\x1b\xf0C\xde\x03[\x80\xac{\nxF\xb9\xd3m\x17\xbf\xa1\xbdM>b\x0b_>\xc3\x11\xc4\x07\xd4=:\x8a\x1f\x03\x1dEW\x981\xba\xb7uf\xef>\x15\xa1'\xf7\xdc\x02\x08\x17\xdc\x9aK\xa3\x16\xa5\x8c\x81\xff\xfe\xd4\x07T\xed\xe4\x15\x1cE\xc1W\xd1\xdd\xf6\x9e\x80\xf17\x1c\x13\x93\x90>c\xcev\xc4\x13\\\x1f'8\xe7\xb1\x01d&\x86y\xdd~`\x94\xc2\x11\xa2\x9f\xd6rQ\x7f\x02\x00\x00\xff\xffPK\x07\x08:\x0c!BM\x01\x00\x00Z\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcNf\x96,\xd5#\x01\x00\x00\xf1\x01\x00\x00\x0f\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00Dockerfile.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x1e\x06\xed\xa9\xa8\x00\x00\x00\xdd\x00\x00\x00\x0d\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x01\x00\x00Makefile.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x19\xa89O\xe4\xe99\xbd\xdf\x01\x00\x00\x07\x04\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\x02\x00\x00client.tmplUT\x05\x00\x01\x83\xd5\x8b]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\x1d\xa89O\xf2\xc9d\xa2[\x01\x00\x00\xc0\x02\x00\x00\x0d\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\x04\x00\x00cmd_main.tmplUT\x05\x00\x01\x8a\xd5\x8b]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\"\xa89Ow+\x85(\xca\x00\x00\x00\x01\x01\x00\x00\x0d\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15\x06\x00\x00cmd_root.tmplUT\x05\x00\x01\x91\xd5\x8b]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00$\xa89O\xd8\xec\xc5\xadr\x01\x00\x00e\x02\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\x07\x00\x00cmd_up.tmplUT\x05\x00\x01\x95\xd5\x8b]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\xe4\xa5\xd4\x89\x17\x00\x00\x00\x11\x00\x00\x00\x0e\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd7\x08\x00\x00gitignore.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00+\xa89O\xffkCw%\x00\x00\x00\"\x00\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813 \x00\x00go-mod.tmplUT\x05\x00\x01\xa3\xd5\x8b]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\x84\x01\x0dr\x9e\x00\x00\x00\xf5\x00\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9a \x00\x00proto.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xaa\x83\xbcN\xa1\x1b\xbf\x91a\x00\x00\x00\x85\x00\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\n\x00\x00server.tmplUT\x05\x00\x01\xe0a\xed\\PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x003\xa89O\xc5\x07\xd0\x9d\x18\x01\x00\x00\xfb\x01\x00\x00\x10\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1c\x0b\x00\x00server_test.tmplUT\x05\x00\x01\xb2\xd5\x8b]PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x005\xa89O:\x0c!BM\x01\x00\x00Z\x02\x00\x00\x10\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\x0c\x00\x00subscribers.tmplUT\x05\x00\x01\xb6\xd5\x8b]PK\x05\x06\x00\x00\x00\x00\x0c\x00\x0c\x00.\x03\x00\x00\x0f\x0e\x00\x00\x00\x00" - fs.Register(data) -} + data := "PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00 \x00Dockerfile.tmplUT\x05\x00\x01\\\xca\xdb^t\x90\xc1O\xc20\x14\xc6\xef\xfd+^v\xe0dW\x8e\xc6d\x07\x04$DY\xc9\xc0\x18\x82\xc4\x94\xb6\x94\xc5\xadm\xdaNM\x96\xfd\xeffs\x01\x85x\xfb\xde\xfb\xfa\xbd\xfe\xde{\xc8\xe8\x02\x94)\x98Vw\xac\xb0\xb9\x960Z\xc1\xbe\xca\x0b\x81\xa5\xfe@/4{\x9c\xcc3 u\x0dq\xcaJ M\x83\xb2\xe7\x14\x98}\x87\xca\n\x16$\x0c\x06}\xa5\x1c\x13]\xf9\x8a\x00\xa0k2!\x00cm0g\xfc(a\xcf\xfc\x11T\x1e\xc0X\xa9\xbd?\xa21]n@\x99\xb84\xe2\xcf\x1f\xe4\xa7w\xf2}U^\xf9\xbe*;\x14e\xa0\x8d\x0b\xf3\xa9\x0b\xc3\xfaL|\x8d<\x9e\xd1\xb7i:\xba\x7f\x9aN\x92!\xcc(]%E\xae\xab\xafv@\xb71\xe0^\x90\xba\xee\x92M\x03\xf1Y#\x84\xbasy\xeeX\xe0=;\xc6\x07g\xca\xe4t1 2p\xe2}A\xb8t\xc1\x13\xcep+\xf2C\xceY\x90>\xe6.\\>\xf9o\xd0\xefu/\xb1\x08\x9a\xa6\xebl\xb3\xa4\xf3t\x0d\xdb\xe8\xecD;4^L`\x1bU6\xba\x81\x08c\xe5,\xc7\xd6\xb8\x90\xdc\x0e\xa3\x1d\xfa\x0e\x00\x00\xff\xffPK\x07\x08f\x96,\xd5#\x01\x00\x00\xf1\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00 \x00Makefile.tmplUT\x05\x00\x01\\\xca\xdb^,\x8e1k\xc30\x10F\xe7\xdc\xaf8\xe8\xda;\xd3\xd5\xe0\xbd]\xd2\xae\x9d\x82b.\x17Q\xd9'\xa4\x93\x97\x90\xff^,g{\x0f>>\xde\x1bnq\xc4\x9bOK\xf8\x13\xe0\x9f\xcf\xef\xf3\xef\x88\xb9\x98\x1b\xbaT\x07\xe8<\xc2I\x0dU\x1c5\xfa\xbd]y\xb6ePKa\xd5\xa1\x0f\xae\xedv\xc0L*+\xa9\xc1\xe9P\xa4/d|<\xf8\x1c\x16y>\xf9\xb8&J1 U)\x9b\x94\x8b5\x9f\x18\x89\xd4:\xe6\xd44\xaeu\xd2\x92\xe7\xf7\x1c\xfc^\xa7j\xad\xccr)\x92\x82\xc7MF\x06\xd8\xeb^\xa5=nw\xa4\x8c\x1fH\x1b\xf2\xc0\xcc\xf0\x1f\x00\x00\xff\xffPK\x07\x08\x1e\x06\xed\xa9\xa8\x00\x00\x00\xdd\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00client.tmplUT\x05\x00\x01\\\xca\xdb^|SAk\xe3<\x10=K\xbfb>\x1f\xbe\xb5!\x95a\x8f\x0b9\xa5l)t\xb3\xd0n\xe8\xb1\xa8\xf2\xc4\x16\x95g\xccXI\x1aB\xfe\xfb\"\xdb\xdbu\xbb4\xbaX\x9e\x99\xf7\xf4\xfc\xf4\xdcY\xf7bk\x84\xd3 \xcc\xda\xb6\x08\xe7\xb3\xd6\xbe\xedX\"\xe4Ze\xfd\x91\\\xa6\xb5\xcaj\x1f\x9b\xdd\xb3q\xdc\x96\xb5t\xee\n\x1d\xf7\xc7>\xe2\xf4\xca\x1dR\x14\xeb<\xd5e\xcd%\xc7T\xcd\xde\xe3\x82\x0f\xe8yx\x94\xfb\xaf\x99V3\x10\xcc\x07\xe7d\xb3\xfdU\xcd\x99\x86i%\xfe\xa7\xd6WU\xc0\x83\x15\x84K\x02\xf9j\xa8\xfc\x9d\x1e\x841\xd7\x01M\xcd\xc1RmX\xear\x94\\h\xbd\xb7\x92>\xde\xb5\xb0\x84\xff\x93\x03\xe6\xc7.\xe2\xeb\xe9\xac\xd5*x\xa48\xd8\xb5\xb2-\x86\x95\xedq\xf2ml%\xfcvG\x0en0~>\x95\x17\x17(\xe0\x94\xce6w\xec^\xf2B\xab\n\xb7(\xe0Z\xb3\xa10\x96\xb4\xf2[\x98f\xff[\x02\xf9\x90 J0\xee\x84\xa6\x86Vg\xadU\x8f\xb2\xf7\x0e7\xf7w\xf0m \xc9y\xb3\xb9\xbf\xfb\xce\xf206\xf2,\xc9\xb8^?L\x02\xb2D^\x96\xf0\x88P1}\x89@\x88\x15D\x06\x14a\x81\x06\x05\x17`{\x88\x8d\xef\xc1 \xda\x88=X\xe8\x98\x03X\xaa\xc01\x11\xba\xe8\x99\xfa\x81\xe7\xe0C\x80\xc6v\x1d\x12\x04\x1bQ\xb4J#\x0bxJz\x92\xe1\xe6\xda\xdb\x90k5\x93\xba\xd0J\x0d\xadG\x1f\x9b[\xea\xd1\xed\x04\xf3\xe2]yCV\x8e\xb7\x14Q\x1cv\x91%\x7f\x0b\xc6\xc7\xf5!(f\xd5XO\x03|\xba\x8aO\x91i\x0d\x96\xad\x98\"\xbe\xc6q~~h\xb1\xb8\x08\x1e\xff\x02\xf3\xb3C\xfa5F\xf8_\x8aY\xbe\xcdM\xe0g\x1b\xd2(J^\\ \x1f\xbc(\xd2]\xb9\xe0\x93\x93k<\\\x08[\xb2\xbcx\xcb\xee\x12\\\xf0\xfaOZ\xd2\xfe\xac\x7f\x07\x00\x00\xff\xffPK\x07\x08\xe4\xe99\xbd\xdf\x01\x00\x00\x07\x04\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00 \x00cmd_main.tmplUT\x05\x00\x01\\\xca\xdb^t\x91\xc1\x8e\xdb \x10\x86\xcf\xccS\x8c|XA\x15\x81\xd4c\xa4\x9e\xa2m/\xddj\xd5<@\x85\xf1\x84E\x05cap+E~\xf7\n\xe2l\xf7\xe0\x9cl\xfe\x8f\xf9\xff\x19f\xd2\xe6\xb7\xb6\x84A\xbb\x11\xc0\x85)\xa6\x8c\x1c\xd8/\xecF\xca\xea-\xe7IMS\x8a\x97\x0e\x80u\xd6\xe5\xb7\xd2K\x13\x83\xf2\xce\x93\x8b\xed\xa3\x96\xcf\xdd>\x8c6\xed\x93K\x8a\x81\xc6e\x1fN\xa5\x9fK\xff\xd0\xf5\x1d\xab\xe0\x86\xc1\xd3\x1f\x9dH\x0dt\xd1\xc5\xe7\xb9\x95\xc4h=I\x1b\xbd\x1e\xad\x8c\xc9*\x9b&S\xc9\xf5\x8a\xf2%\x0e\xc5\xd3\x0f\x1d\x08\xd7uWT3\xa5\x85\xd2>\xab\xca\xfd\xdf\x84\xa1\x03\x01p)\xa3i/\xc8\x05^\x81\xd5\xb1\xe5\x99\xf2wZ\xc8\x7fM1<\x8f\x0b\x17\xc0f<~\xc1\xa7\x9b\xb9\xac>'\x1d\xc8\x9f\xf4|7?7t]\x01X\x9d\xb5\xe5\xf0\xeeCb'6r\xbb\xc9k0\xb7\xf8\xa9\xce\xb7i\xad\x03\xf6\xa1F\xfe$\xeb\xe6L\xe9q\"\xb7\x07\x9c\x05\xb0U\x00\xb0\xdb\xf3\xd6\xfeO\xde\xd1\x98\xf9\xd3\xa6\xdc\x8e\xd5\xbdV9\xd3<\x8e\xd8\xfa\xf9\xe6c\xaf\xfd\xa6s\xd1\xb2\x0f\xc0\xd8k\x8a\x8b\x1b(\x1d\x11\x11\xb7\xa5\xcb\xd7\xd2\x9fK\x7fG\\\xd4\x8b/\xef\xab<\"\xde\x97)\xff\xab\x87\xad;\x13\x06\xf9\xfc\x97L\xc9\xc4\x05\xac\xf0/\x00\x00\xff\xffPK\x07\x08\xf2\xc9d\xa2[\x01\x00\x00\xc0\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0d\x00 \x00cmd_root.tmplUT\x05\x00\x01\\\xca\xdb^<\x8cMj\xc30\x10F\xd7\x9aSLgeC\xab\xd0.[\xbchM\xba,!7P\xe4\x91:T?A\x92M\xc0\xf8\xee%)\xcd\xea\x83\xef=\xde\xd9\xd8\x1f\xe3\x19m\x9c\x00$\x9esi\xd8\x81\"\x17\x1b\x81\xa2\\ @\x91\x97\xf6=\x9f\xb4\xcdq\x17$\xb0\xe4\xdb\xec\x96\x17\x82\x1e`1\x05\xad\xf3\x9f\x12\x18k+\x92\xfc\xdfw\xcc\xb9\x8dq\xc2\x01\xaf\xb6\xfe0\x95\xc7\x1c\xa3ISG\xeb\x8a\xfa\xcbD\xc6m\xa3G\xa4w\xf4\xc7\xc3\x88'Sy\xc2\xcae\x11\xcb\xd4\x03\xb89Y\xdc_\xd8\xce\x8d\xbb\x1eWP\xe2\x90K\xc1\xd7\xe1?\xaf\xef\xf8\xedF\x1e\x06L\x12\xae\xaar\xb1\xe9C\x91\xd4B\xea\xb8\x94\x1e\x94\xcaU\xef/\xd2\xba\xa7\xe7\x1e\xd4\x06\x1b\xfc\x06\x00\x00\xff\xffPK\x07\x08w+\x85(\xca\x00\x00\x00\x01\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00cmd_up.tmplUT\x05\x00\x01\\\xca\xdb^l\x91\xbf\x8e\xdc \x10\xc6k\xe6)F.Nv\xe4`]\xd2\xadrEdE\xd1\x15w\x8a\xec\xa4\x8aR``mt\x06,\x066:Y~\xf7\x88\xf5n\xb4\xf9C\x01\x1af\xe6\x9b\x8f\x1f\x8b\x90/b\xd4(\xad\x020v\xf1!b xY\x85\xa7\x02X\xe1\xa9!3:1\xe7\x80^I\x8ay.\x00X1\x9a8\xa5\x81Ko\x9b\xd9\xcc\xda\xf8fI\x03\xa5\xa19\xbd+\xfe\x9b\xce\xc7\xbfIZ\x8e\xf7\xef\x1b\xe9\x87 rf]\x91?y\x95f\xfd,\xac\xc6mk(\x0d$\x83\x19t\xa0\x02*\x80\x93\x08\x98\x96\xd6*|\xc0\xbbs\x1fo\xbd\xb5\xc2\xa9\x15\xd87\xd2\x87\xec=-E\x0d\xac\x9f|\x88\x87\x1caH\x8ep\xf0q\xc2\xeeK\x8b\xa4\xc3\xc9H\x9dk\xba\xe4\x0exLN\x96\xd2*|\xf3\x87`\x8d\"\x8c\x84\xdf\x7fP\x0c\xc6\x8d\x15\xae\xc0\x98\xc4\xc3\x03Z\xf1\xa2K9 \x87\x9ex\x7f\xe6S\xe3}\x05\x8c\xed\xb0\xf8\xb3\x8f\xe6\xf8Z\xca:\x17<\xba\xa8CHK\xac\xf1B\x90\xf7\x8f\x9f\xbf~\xea\x9e*\x00\xc6F\xbf\x1b\xd8\xf5Y\xe6\xc4\xbb\xe4\xca,\xb7\x9d\xf7\xbf*v\xd0\xbc\xbf\x92)\xefn \xf1\x8c\xb0\x15V\xcf\xad\xa0+\xc5~\x7f\xf0\xef\x8e\xb0nWu`\xec\xc3[ \x97\xb9\xfd\x94\xa2\xf2?\xf7\xe1\xd797w[\x0d\x1b@6\x83\xc6\x99\xb8;\xea\xbc\x8f\xadU\xfc\xa3R\x17r\xe5\xf9\x87*\xd8\xe0W\x00\x00\x00\xff\xffPK\x07\x08\xd8\xec\xc5\xadr\x01\x00\x00e\x02\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00 \x00gitignore.tmplUT\x05\x00\x01\\\xca\xdb^J*\xcd\xccI\xd1\xe7\xd2s \x8e\x0f.\xc9/J\xe5\x02\x04\x00\x00\xff\xffPK\x07\x08\xe4\xa5\xd4\x89\x17\x00\x00\x00\x11\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00go-mod.tmplUT\x05\x00\x01\\\xca\xdb^\xca\xcdO)\xcdIU\xa8\xaeV\xd0\xf3\x053\xfd\x12sS\x15jk\xb9\xb8\xd2\xf3\x15\x0c\xf5\x0c\x8d\xb9\x00\x01\x00\x00\xff\xffPK\x07\x08\xffkCw%\x00\x00\x00\"\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00 \x00proto.tmplUT\x05\x00\x01\\\xca\xdb^t\x8e\xb1\xca\xc20\x14\x85\xf7\xfb\x14\x87N\xed\xf2\xc3\x8fc\xe8\xd4\xc1I\x07_@B{)\xc16\x89\xb9\xa9(!\xef.Q\x8b\"\xb8\x9e\xef\xdc\xf3]\xb9\xd9\xa8\xafhQ\xf9\xe0\xa2\xdbT\x8a\x9c\x8f\xc6Y\x8c\xee\xe8u\x7f\xd2#\x17\x9a\x12\xfevnX&\xde\xeb\x99\x91s\xa5h\xc5\x85\xbdRE4\xb3HI\xb7\x1c\x0f|^X\"\x12\x01\x12\x83\xb1#\xcc\x80\x16\xff\x8a\xf2WQ\xbc\xb3\xc2?\x9a\xc2\xe1b\xfa\xa7\xa8\xd33O\x9d\x96\xf5\x8f\xc7I\xf0}\x99\xa9\xdf\xce\x06\x81\xe3\x12\xac\xa0\xfe\xd8o\x902e\xba\x07\x00\x00\xff\xffPK\x07\x08\x84\x01\x0dr\x9e\x00\x00\x00\xf5\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00 \x00server.tmplUT\x05\x00\x01\\\xca\xdb^*HL\xceNLOU(N-*K-\xe2\xe2\xca\xcc-\xc8/*Q\xd0\xe0\xe2T\xaa\xaeV\xd0\xf3\xcdO)\xcdI\xf5K\xccMU\xa8\xadU\xe2\xd2\xe4\xe2\xe2*\xa9,HU\x00\xc99'\xe6\xa6\xe68'\x16\xc3\xa4\x83\xc1F(\x14\x97\x14\x95&\x97(Tsq\x82\x14A\xe5\xf4pk\xe0\xaa\xe5\x02\x04\x00\x00\xff\xffPK\x07\x08\xa1\x1b\xbf\x91a\x00\x00\x00\x85\x00\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x00server_test.tmplUT\x05\x00\x01\\\xca\xdb^t\x90\xb1j\xc30\x10\x86g\xddS\x1c\x9e\xa4\x10\x14\xe8X\xc8d:&C\xda\x17P\x9d\xebUT\x96\x8c$'\x05\xe3w/g'\xd0B3i\xf8?}\xf7\xdf\x0d\xae\xfbrLX(_(\x03\xf8~H\xb9\xa2\x06\xd5\xa4\xd2\x80j*\x95\xea#7\x00\xaa\xe1\x948\x90\xe5\x14\\d\x9b2\xef8\x0f\xdd\x1a\xf9\xfa9\xbe\xdb.\xf5\xbb\xe0\x03\xf9\xb4<\xbb\xcb\x938\xa6 \xed!\x9d\xc7@G\xd7\x13\xces\x03\x06\xe0\xe22\x16\xdc\xa3\xa4\xad\xeb)\xb4\xae\xdc\x81\xd7\xa5\xce4/P\x17\xfc\x02\xdd2\xfb\xdf\x876x\x8a\x15\xe0c\x8c\x1d\xbeQ\xa9\x07\xe7\xa3\xeeqs\xebo\x0f\x06'P\xbe\x1f\x02>\xefQ0\xcd\xb8\x91\xfev\x1d\xb6\xe4\xea\xf7\x9c\x13\xb1/\x95\xf2\xe3\x82\x9a\xb7X\x0c\xa8\x19@q\x11\xf1\"<\xd2\xf5\x96\x9bu\xa4\xe6b\x00\x94;\x9f\xf3v=\xb5\xb0r!a\xa5\xee\xdd'6N+\xa3\xe5\x8f,\xbf\xff\xb3\xfe\x91\xae\x8f/\xa0\x17\xa9\x18\xdb\x14\xa3\x96\x89F4\xa9\xd8\x97o_uoOc\xd4\xc6\xc0\x0c?\x01\x00\x00\xff\xffPK\x07\x08\xc5\x07\xd0\x9d\x18\x01\x00\x00\xfb\x01\x00\x00PK\x03\x04\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00 \x00subscribers.tmplUT\x05\x00\x01\\\xca\xdb^\x94\x911\x8f\xdb0\x0c\x85\xe7\xe8W\x10\xeeb\x07\x81\xd4v\xf4vp\x87.i\x06w\x0fd\x85u\x84\xb3D\x95\xa2\x0ew0\xfc\xdf\x0b\x9f}\xd9\n\xb4\x93@>\xbe\xc7\x0fb\xb2\xee\xd9\x8e\x08\xb9\x0c\xd9\xb1\x1f\x90\xb3R>$b\x81Z\x1d\xaa\xd1\xcb\xbd\x0c\xdaQ0\x93\x9f\xd0\x93Ie\xc8e0/_+\xd5(%o a\x9eAw6\xe0\xd4\xd9\x8c?l@X\x96\x1e\xf9\xc5;\xec\x1f\xb9\x90\x85\x8b\x13\x98\x17\xa5~\x95\xe8\xa0\xcep\xfc'g\x03=JI\xb5\x83\xe3\xb6\\w\x93\xc7(\x0d\xcc\xea`\x0c\xdcERn\x8d\x19\xe9FN\x13\x8f\xe6o\xd4\x9f6\xa3\xbe\xc4w\xa3\xd3\x97X\xef\x91\xdfm\xbcM\xc8\x97$\x9eb\xde\x82\x0f?)y\xd7\x02\x00T\x99\x02^e\xad\xab\xd3&\xae\xb8\xef\x1aTyC\xbeF\x1b\xf0C\xde\x03[\x80\xac{\nxF\xb9\xd3m\x17\xbf\xa1\xbdM>b\x0b_>\xc3\x11\xc4\x07\xd4=:\x8a\x1f\x03\x1dEW\x981\xba\xb7uf\xef>\x15\xa1'\xf7\xdc\x02\x08\x17\xdc\x9aK\xa3\x16\xa5\x8c\x81\xff\xfe\xd4\x07T\xed\xe4\x15\x1cE\xc1W\xd1\xdd\xf6\x9e\x80\xf17\x1c\x13\x93\x90>c\xcev\xc4\x13\\\x1f'8\xe7\xb1\x01d&\x86y\xdd~`\x94\xc2\x11\xa2\x9f\xd6rQ\x7f\x02\x00\x00\xff\xffPK\x07\x08:\x0c!BM\x01\x00\x00Z\x02\x00\x00PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6Pf\x96,\xd5#\x01\x00\x00\xf1\x01\x00\x00\x0f\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x00\x00\x00\x00Dockerfile.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x1e\x06\xed\xa9\xa8\x00\x00\x00\xdd\x00\x00\x00\x0d\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81i\x01\x00\x00Makefile.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xe4\xe99\xbd\xdf\x01\x00\x00\x07\x04\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81U\x02\x00\x00client.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xf2\xc9d\xa2[\x01\x00\x00\xc0\x02\x00\x00\x0d\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81v\x04\x00\x00cmd_main.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6Pw+\x85(\xca\x00\x00\x00\x01\x01\x00\x00\x0d\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x15\x06\x00\x00cmd_root.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xd8\xec\xc5\xadr\x01\x00\x00e\x02\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81#\x07\x00\x00cmd_up.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xe4\xa5\xd4\x89\x17\x00\x00\x00\x11\x00\x00\x00\x0e\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\xd7\x08\x00\x00gitignore.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xffkCw%\x00\x00\x00\"\x00\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x813 \x00\x00go-mod.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\x84\x01\x0dr\x9e\x00\x00\x00\xf5\x00\x00\x00\n\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x9a \x00\x00proto.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xa1\x1b\xbf\x91a\x00\x00\x00\x85\x00\x00\x00\x0b\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81y\n\x00\x00server.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P\xc5\x07\xd0\x9d\x18\x01\x00\x00\xfb\x01\x00\x00\x10\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81\x1c\x0b\x00\x00server_test.tmplUT\x05\x00\x01\\\xca\xdb^PK\x01\x02\x14\x03\x14\x00\x08\x00\x08\x00\xda\x86\xc6P:\x0c!BM\x01\x00\x00Z\x02\x00\x00\x10\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\xa4\x81{\x0c\x00\x00subscribers.tmplUT\x05\x00\x01\\\xca\xdb^PK\x05\x06\x00\x00\x00\x00\x0c\x00\x0c\x00.\x03\x00\x00\x0f\x0e\x00\x00\x00\x00" + fs.Register(data) + } + \ No newline at end of file From 67284c38c56e9aaa1d2f7236a5b1b69e17e4306c Mon Sep 17 00:00:00 2001 From: Alex Barlow Date: Wed, 17 Jun 2020 15:57:58 +0100 Subject: [PATCH 2/2] Fix timestamps and pointers to scalars --- go.mod | 1 + protocopy/protocopy.go | 34 +++++++++++++++++++--------------- protocopy/protocopy_test.go | 4 ++++ 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 8267317..3a7601a 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/prometheus/client_golang v0.9.2 github.com/prometheus/common v0.4.0 // indirect github.com/rakyll/statik v0.1.7 + github.com/sanity-io/litter v1.2.0 github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516 github.com/sirupsen/logrus v1.4.2 github.com/spf13/cobra v0.0.3 diff --git a/protocopy/protocopy.go b/protocopy/protocopy.go index 508596a..38db057 100644 --- a/protocopy/protocopy.go +++ b/protocopy/protocopy.go @@ -31,6 +31,21 @@ func toProtoStruct(in, out reflect.Value) error { out.Set(reflect.New(out.Type().Elem())) } + if out.Type().String() == "*timestamppb.Timestamp" { + if in.Kind() == reflect.Ptr { + in = reflect.Indirect(in) + } + + pbd, err := ptypes.TimestampProto(in.Interface().(time.Time)) + if err != nil { + return err + } + + out.Set(reflect.ValueOf(pbd)) + + return nil + } + FIELD_LOOP: for i := 0; i < in.NumField(); i++ { field := in.Type().Field(i) @@ -74,6 +89,10 @@ FIELD_LOOP: func setValue(inField, outField reflect.Value) error { k := inField.Type().Kind() if k == reflect.Ptr { + if inField.IsZero() { + return nil + } + k = inField.Elem().Type().Kind() inField = inField.Elem() } @@ -147,21 +166,6 @@ func setScalar(inF, outF reflect.Value) error { return nil } - if outF.Type().String() == "*timestamppb.Timestamp" { - if inF.Kind() == reflect.Ptr { - inF = reflect.Indirect(inF) - } - - pbd, err := ptypes.TimestampProto(inF.Interface().(time.Time)) - if err != nil { - return err - } - - outF.Set(reflect.ValueOf(pbd)) - - return nil - } - outF.Set(inF) return nil } diff --git a/protocopy/protocopy_test.go b/protocopy/protocopy_test.go index 6fb5c41..db38bd6 100644 --- a/protocopy/protocopy_test.go +++ b/protocopy/protocopy_test.go @@ -6,6 +6,7 @@ import ( "github.com/lileio/lile/v2/protocopy" "github.com/lileio/lile/v2/protocopy/test" + "github.com/sanity-io/litter" "github.com/stretchr/testify/assert" ) @@ -18,6 +19,7 @@ type Nested struct { type OriginalBitOfEverything struct { SingleNested Nested UUID string + UUIDStrPtr *string `pb:"UUID"` Nested []*Nested FloatValue float32 DoubleValue float64 @@ -184,4 +186,6 @@ func TestABitOfEverything(t *testing.T) { var outnil test.ABitOfEverything err = protocopy.ToProto(testObj, &outnil) assert.Nil(t, err) + + litter.Dump(outnil) }