diff --git a/.gitignore b/.gitignore
index d8feac9..7d8c9d3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ client/build/bin
client/node_modules
client/frontend/dist
tmp
+node_modules/
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..e4b6d3f
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "app/spilothq/googleapis"]
+ path = app/spilothq/googleapis
+ url = https://github.com/googleapis/googleapis
diff --git a/Makefile b/Makefile
index 1e36447..c96f05a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,8 @@
gen:
- protoc --go_out=./internal --go-grpc_out=./internal internal/proto/*.proto;
+ protoc --go_out=. --go-grpc_out=. app/spilothq/proto/*.proto;
+genapi:
+ protoc --go_out=app/spilothq/api --go-grpc_out=app/spilothq/api app/spilothq/api/v1/*.proto;
# gen:
# protoc --proto_path=internal/proto internal/proto/*.proto --go_out=plugins=grpc:pb
@@ -14,4 +16,6 @@ devhq:
devadmin:
air -c ./zarf/air/admin.toml
-
\ No newline at end of file
+
+startui:
+ cd ./app/spilotui && wails dev
\ No newline at end of file
diff --git a/api/spilot/driver/grpc/grpc_driver.go b/api/spilot/driver/grpc/grpc_driver.go
new file mode 100644
index 0000000..c7ad57d
--- /dev/null
+++ b/api/spilot/driver/grpc/grpc_driver.go
@@ -0,0 +1,62 @@
+package driver
+
+import (
+ "context"
+ "fmt"
+ "net"
+
+ apiv1 "github.com/aforamitdev/server-pilot/app/spilothq/gen/proto/api/v1"
+ "google.golang.org/grpc"
+ "google.golang.org/grpc/credentials/insecure"
+)
+
+type GrpcDriver struct {
+ ctx context.Context
+ conn *grpc.ClientConn
+}
+
+func NewGrpcDriver() *GrpcDriver {
+ return &GrpcDriver{}
+}
+
+func (g *GrpcDriver) Startup(ctx context.Context) {
+ g.ctx = ctx
+}
+
+func (g *GrpcDriver) ConnectServer(ip net.IP, port string) (success bool, err error) {
+ conn, err := grpc.NewClient(fmt.Sprintf(`%s:%s`, ip, port), grpc.WithTransportCredentials(insecure.NewCredentials()))
+
+ if err != nil {
+ fmt.Println(err)
+ return false, err
+ }
+ fmt.Println(conn.GetState())
+
+ g.conn = conn
+
+ s := apiv1.NewSystemServicesClient(conn)
+
+ req := apiv1.GetStatusRequest{}
+ res, err := s.GetStatus(g.ctx, &req)
+ if err != nil {
+ fmt.Println(err, "Errr")
+ }
+ fmt.Println(res)
+
+ return true, nil
+
+}
+
+func (g *GrpcDriver) GetServerStatus(ctx context.Context) apiv1.GetStatusResponse {
+
+ s := apiv1.NewSystemServicesClient(g.conn)
+
+ req := apiv1.GetStatusRequest{}
+ res, err := s.GetStatus(ctx, &req)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ return *res
+
+}
diff --git a/api/spilot/spilot.go b/api/spilot/spilot.go
index b036394..0627301 100644
--- a/api/spilot/spilot.go
+++ b/api/spilot/spilot.go
@@ -2,8 +2,10 @@ package main
import (
"context"
+ "fmt"
"os"
+ apiv1 "github.com/aforamitdev/server-pilot/app/spilothq/gen/proto/api/v1"
"github.com/aforamitdev/server-pilot/pkg/logger"
"github.com/aforamitdev/server-pilot/pkg/web"
"google.golang.org/grpc"
@@ -24,21 +26,31 @@ func main() {
log = logger.NewWithEvents(os.Stdout, logger.LevelInfo, "SPILOT-CLIENT", traceIDFn, events)
ctx := context.Background()
- conn, err := grpc.NewClient("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
+ conn, err := grpc.NewClient("127.0.0.1:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
+ fmt.Println(conn)
if err != nil {
log.Error(ctx, "startup", "msg", err)
}
+
defer conn.Close()
- // client := pb.NewInformerClient(conn)
+ c := apiv1.NewLogServiceClient(conn)
- // ctx, cancel := context.WithTimeout(context.Background(), time.Second)
+ if err != nil {
+ fmt.Println(err)
+ }
+ r, err := c.GetLogs(ctx, &apiv1.LogRequest{})
- // defer cancel()
+ if err != nil {
+ fmt.Println(err)
+ }
- // r, err := client.GetSystem(ctx, &pb.SystemRequest{})
+ logchan := logstream(r)
+ for res := range logchan {
+ fmt.Println(res)
+ }
- // stream, err := client.GetLogs(context.Background(), &pb.LogRequest{})
+ // r, err := client.
// fmt.Println(r.Name)
@@ -60,3 +72,22 @@ func main() {
// }
}
+
+// ServerStreamingClient[apiv1.LogResponse]
+func logstream(r grpc.ServerStreamingClient[apiv1.LogResponse]) chan *apiv1.LogResponse {
+ logchan := make(chan *apiv1.LogResponse)
+
+ go func() {
+ for {
+ resp, err := r.Recv()
+ if err != nil {
+ fmt.Println(err)
+ }
+ fmt.Println(resp)
+ logchan <- resp
+ }
+ }()
+
+ return logchan
+
+}
diff --git a/api/spilot/stream.go b/api/spilot/stream.go
new file mode 100644
index 0000000..06ab7d0
--- /dev/null
+++ b/api/spilot/stream.go
@@ -0,0 +1 @@
+package main
diff --git a/app/spilothq/buf.gen.yaml b/app/spilothq/buf.gen.yaml
new file mode 100644
index 0000000..40c9879
--- /dev/null
+++ b/app/spilothq/buf.gen.yaml
@@ -0,0 +1,46 @@
+# version: v2
+# managed:
+# enabled: true
+# override:
+# - file_option: go_package_prefix
+# value: github.com/bufbuild/buf-tour/gen
+# plugins:
+# - remote: buf.build/protocolbuffers/go
+# out: api/gen/proto
+# opt: paths=source_relative
+# - remote: buf.build/connectrpc/go
+# out: api/gen/proto
+# opt: paths=source_relative
+# inputs:
+# - directory: proto
+
+version: v2
+managed:
+ enabled: true
+ disable:
+ - file_option: go_package
+ module: buf.build/googleapis/googleapis
+ override:
+ - file_option: go_package_prefix
+ value: github.com/aforamitdev/server-pilot/app/spilothq/proto
+plugins:
+ - local: protoc-gen-go
+ out: gen
+ opt: paths=source_relative
+ - remote: buf.build/grpc/go
+ out: gen
+ opt: paths=source_relative
+ - remote: buf.build/grpc-ecosystem/openapiv2
+ out: gen
+ opt: output_format=yaml,allow_merge=true
+
+ - remote: buf.build/community/stephenh-ts-proto
+ out: ../spilotui/frontend/src/app/types
+ opt:
+ - env=browser
+ - useOptionals=messages
+ - outputServices=generic-definitions
+ - outputJsonMethods=false
+ - useExactTypes=false
+ - esModuleInterop=true
+ - stringEnums=true
diff --git a/app/spilothq/buf.yaml b/app/spilothq/buf.yaml
new file mode 100644
index 0000000..8f90480
--- /dev/null
+++ b/app/spilothq/buf.yaml
@@ -0,0 +1,16 @@
+# For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yaml
+version: v2
+# name: buf.build/aforamitdev/server-pilot
+modules:
+ - path: proto/api/v1/
+ - path: proto/api/store/
+
+deps:
+ - buf.build/googleapis/googleapis
+ - buf.build/grpc-ecosystem/grpc-gateway
+lint:
+ use:
+ - STANDARD
+breaking:
+ use:
+ - FILE
diff --git a/app/spilothq/gen/apidocs.swagger.yaml b/app/spilothq/gen/apidocs.swagger.yaml
new file mode 100644
index 0000000..e481479
--- /dev/null
+++ b/app/spilothq/gen/apidocs.swagger.yaml
@@ -0,0 +1,42 @@
+swagger: "2.0"
+info:
+ title: log_service.proto
+ version: version not set
+tags:
+ - name: LogService
+ - name: SystemServices
+consumes:
+ - application/json
+produces:
+ - application/json
+paths: {}
+definitions:
+ protobufAny:
+ type: object
+ properties:
+ '@type':
+ type: string
+ additionalProperties: {}
+ rpcStatus:
+ type: object
+ properties:
+ code:
+ type: integer
+ format: int32
+ message:
+ type: string
+ details:
+ type: array
+ items:
+ type: object
+ $ref: '#/definitions/protobufAny'
+ v1GetStatusResponse:
+ type: object
+ properties:
+ system:
+ type: string
+ v1LogResponse:
+ type: object
+ properties:
+ log:
+ type: string
diff --git a/app/spilothq/gen/log_service.pb.go b/app/spilothq/gen/log_service.pb.go
new file mode 100644
index 0000000..5808150
--- /dev/null
+++ b/app/spilothq/gen/log_service.pb.go
@@ -0,0 +1,222 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc (unknown)
+// source: log_service.proto
+
+package apiv1
+
+import (
+ 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)
+)
+
+type LogResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Log string `protobuf:"bytes,1,opt,name=log,proto3" json:"log,omitempty"`
+}
+
+func (x *LogResponse) Reset() {
+ *x = LogResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_log_service_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *LogResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogResponse) ProtoMessage() {}
+
+func (x *LogResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_log_service_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 LogResponse.ProtoReflect.Descriptor instead.
+func (*LogResponse) Descriptor() ([]byte, []int) {
+ return file_log_service_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *LogResponse) GetLog() string {
+ if x != nil {
+ return x.Log
+ }
+ return ""
+}
+
+type LogRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Log string `protobuf:"bytes,1,opt,name=log,proto3" json:"log,omitempty"`
+}
+
+func (x *LogRequest) Reset() {
+ *x = LogRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_log_service_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *LogRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LogRequest) ProtoMessage() {}
+
+func (x *LogRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_log_service_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 LogRequest.ProtoReflect.Descriptor instead.
+func (*LogRequest) Descriptor() ([]byte, []int) {
+ return file_log_service_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *LogRequest) GetLog() string {
+ if x != nil {
+ return x.Log
+ }
+ return ""
+}
+
+var File_log_service_proto protoreflect.FileDescriptor
+
+var file_log_service_proto_rawDesc = []byte{
+ 0x0a, 0x11, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72,
+ 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+ 0x76, 0x31, 0x22, 0x1f, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
+ 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+ 0x6c, 0x6f, 0x67, 0x22, 0x1e, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
+ 0x6c, 0x6f, 0x67, 0x32, 0x52, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x12, 0x44, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x19, 0x2e, 0x73,
+ 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67,
+ 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74,
+ 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0xb8, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e,
+ 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0f, 0x4c,
+ 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
+ 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x66, 0x6f,
+ 0x72, 0x61, 0x6d, 0x69, 0x74, 0x64, 0x65, 0x76, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d,
+ 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74,
+ 0x68, 0x71, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02,
+ 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0d, 0x53, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e, 0x41, 0x70,
+ 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, 0x53, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x5c, 0x41, 0x70,
+ 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, 0x53, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x5c, 0x41, 0x70,
+ 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+ 0xea, 0x02, 0x0f, 0x53, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a,
+ 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_log_service_proto_rawDescOnce sync.Once
+ file_log_service_proto_rawDescData = file_log_service_proto_rawDesc
+)
+
+func file_log_service_proto_rawDescGZIP() []byte {
+ file_log_service_proto_rawDescOnce.Do(func() {
+ file_log_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_log_service_proto_rawDescData)
+ })
+ return file_log_service_proto_rawDescData
+}
+
+var file_log_service_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_log_service_proto_goTypes = []interface{}{
+ (*LogResponse)(nil), // 0: spilot.api.v1.LogResponse
+ (*LogRequest)(nil), // 1: spilot.api.v1.LogRequest
+}
+var file_log_service_proto_depIdxs = []int32{
+ 1, // 0: spilot.api.v1.LogService.GetLogs:input_type -> spilot.api.v1.LogRequest
+ 0, // 1: spilot.api.v1.LogService.GetLogs:output_type -> spilot.api.v1.LogResponse
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_log_service_proto_init() }
+func file_log_service_proto_init() {
+ if File_log_service_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_log_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*LogResponse); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_log_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*LogRequest); 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_log_service_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_log_service_proto_goTypes,
+ DependencyIndexes: file_log_service_proto_depIdxs,
+ MessageInfos: file_log_service_proto_msgTypes,
+ }.Build()
+ File_log_service_proto = out.File
+ file_log_service_proto_rawDesc = nil
+ file_log_service_proto_goTypes = nil
+ file_log_service_proto_depIdxs = nil
+}
diff --git a/app/spilothq/gen/log_service_grpc.pb.go b/app/spilothq/gen/log_service_grpc.pb.go
new file mode 100644
index 0000000..261e2e9
--- /dev/null
+++ b/app/spilothq/gen/log_service_grpc.pb.go
@@ -0,0 +1,124 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.5.1
+// - protoc (unknown)
+// source: log_service.proto
+
+package apiv1
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.64.0 or later.
+const _ = grpc.SupportPackageIsVersion9
+
+const (
+ LogService_GetLogs_FullMethodName = "/spilot.api.v1.LogService/GetLogs"
+)
+
+// LogServiceClient is the client API for LogService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type LogServiceClient interface {
+ GetLogs(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[LogResponse], error)
+}
+
+type logServiceClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewLogServiceClient(cc grpc.ClientConnInterface) LogServiceClient {
+ return &logServiceClient{cc}
+}
+
+func (c *logServiceClient) GetLogs(ctx context.Context, in *LogRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[LogResponse], error) {
+ cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+ stream, err := c.cc.NewStream(ctx, &LogService_ServiceDesc.Streams[0], LogService_GetLogs_FullMethodName, cOpts...)
+ if err != nil {
+ return nil, err
+ }
+ x := &grpc.GenericClientStream[LogRequest, LogResponse]{ClientStream: stream}
+ if err := x.ClientStream.SendMsg(in); err != nil {
+ return nil, err
+ }
+ if err := x.ClientStream.CloseSend(); err != nil {
+ return nil, err
+ }
+ return x, nil
+}
+
+// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
+type LogService_GetLogsClient = grpc.ServerStreamingClient[LogResponse]
+
+// LogServiceServer is the server API for LogService service.
+// All implementations must embed UnimplementedLogServiceServer
+// for forward compatibility.
+type LogServiceServer interface {
+ GetLogs(*LogRequest, grpc.ServerStreamingServer[LogResponse]) error
+ mustEmbedUnimplementedLogServiceServer()
+}
+
+// UnimplementedLogServiceServer must be embedded to have
+// forward compatible implementations.
+//
+// NOTE: this should be embedded by value instead of pointer to avoid a nil
+// pointer dereference when methods are called.
+type UnimplementedLogServiceServer struct{}
+
+func (UnimplementedLogServiceServer) GetLogs(*LogRequest, grpc.ServerStreamingServer[LogResponse]) error {
+ return status.Errorf(codes.Unimplemented, "method GetLogs not implemented")
+}
+func (UnimplementedLogServiceServer) mustEmbedUnimplementedLogServiceServer() {}
+func (UnimplementedLogServiceServer) testEmbeddedByValue() {}
+
+// UnsafeLogServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to LogServiceServer will
+// result in compilation errors.
+type UnsafeLogServiceServer interface {
+ mustEmbedUnimplementedLogServiceServer()
+}
+
+func RegisterLogServiceServer(s grpc.ServiceRegistrar, srv LogServiceServer) {
+ // If the following call pancis, it indicates UnimplementedLogServiceServer was
+ // embedded by pointer and is nil. This will cause panics if an
+ // unimplemented method is ever invoked, so we test this at initialization
+ // time to prevent it from happening at runtime later due to I/O.
+ if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
+ t.testEmbeddedByValue()
+ }
+ s.RegisterService(&LogService_ServiceDesc, srv)
+}
+
+func _LogService_GetLogs_Handler(srv interface{}, stream grpc.ServerStream) error {
+ m := new(LogRequest)
+ if err := stream.RecvMsg(m); err != nil {
+ return err
+ }
+ return srv.(LogServiceServer).GetLogs(m, &grpc.GenericServerStream[LogRequest, LogResponse]{ServerStream: stream})
+}
+
+// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name.
+type LogService_GetLogsServer = grpc.ServerStreamingServer[LogResponse]
+
+// LogService_ServiceDesc is the grpc.ServiceDesc for LogService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var LogService_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "spilot.api.v1.LogService",
+ HandlerType: (*LogServiceServer)(nil),
+ Methods: []grpc.MethodDesc{},
+ Streams: []grpc.StreamDesc{
+ {
+ StreamName: "GetLogs",
+ Handler: _LogService_GetLogs_Handler,
+ ServerStreams: true,
+ },
+ },
+ Metadata: "log_service.proto",
+}
diff --git a/app/spilothq/gen/system_service.pb.go b/app/spilothq/gen/system_service.pb.go
new file mode 100644
index 0000000..03765f4
--- /dev/null
+++ b/app/spilothq/gen/system_service.pb.go
@@ -0,0 +1,214 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// protoc-gen-go v1.28.1
+// protoc (unknown)
+// source: system_service.proto
+
+package apiv1
+
+import (
+ 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)
+)
+
+type GetStatusRequest struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+}
+
+func (x *GetStatusRequest) Reset() {
+ *x = GetStatusRequest{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_system_service_proto_msgTypes[0]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetStatusRequest) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetStatusRequest) ProtoMessage() {}
+
+func (x *GetStatusRequest) ProtoReflect() protoreflect.Message {
+ mi := &file_system_service_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 GetStatusRequest.ProtoReflect.Descriptor instead.
+func (*GetStatusRequest) Descriptor() ([]byte, []int) {
+ return file_system_service_proto_rawDescGZIP(), []int{0}
+}
+
+type GetStatusResponse struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ System string `protobuf:"bytes,1,opt,name=system,proto3" json:"system,omitempty"`
+}
+
+func (x *GetStatusResponse) Reset() {
+ *x = GetStatusResponse{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_system_service_proto_msgTypes[1]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *GetStatusResponse) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetStatusResponse) ProtoMessage() {}
+
+func (x *GetStatusResponse) ProtoReflect() protoreflect.Message {
+ mi := &file_system_service_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 GetStatusResponse.ProtoReflect.Descriptor instead.
+func (*GetStatusResponse) Descriptor() ([]byte, []int) {
+ return file_system_service_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *GetStatusResponse) GetSystem() string {
+ if x != nil {
+ return x.System
+ }
+ return ""
+}
+
+var File_system_service_proto protoreflect.FileDescriptor
+
+var file_system_service_proto_rawDesc = []byte{
+ 0x0a, 0x14, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e, 0x61,
+ 0x70, 0x69, 0x2e, 0x76, 0x31, 0x22, 0x12, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x2b, 0x0a, 0x11, 0x47, 0x65, 0x74,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16,
+ 0x0a, 0x06, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
+ 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x32, 0x60, 0x0a, 0x0e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
+ 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53,
+ 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e, 0x61,
+ 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52,
+ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e,
+ 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0xbb, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d,
+ 0x2e, 0x73, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x12,
+ 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f,
+ 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x2f, 0x61, 0x66, 0x6f, 0x72, 0x61, 0x6d, 0x69, 0x74, 0x64, 0x65, 0x76, 0x2f, 0x73, 0x65, 0x72,
+ 0x76, 0x65, 0x72, 0x2d, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x73, 0x70,
+ 0x69, 0x6c, 0x6f, 0x74, 0x68, 0x71, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x3b, 0x61, 0x70, 0x69,
+ 0x76, 0x31, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0d, 0x53, 0x70, 0x69, 0x6c, 0x6f,
+ 0x74, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0d, 0x53, 0x70, 0x69, 0x6c, 0x6f,
+ 0x74, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x19, 0x53, 0x70, 0x69, 0x6c, 0x6f,
+ 0x74, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61,
+ 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x53, 0x70, 0x69, 0x6c, 0x6f, 0x74, 0x3a, 0x3a, 0x41,
+ 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+ file_system_service_proto_rawDescOnce sync.Once
+ file_system_service_proto_rawDescData = file_system_service_proto_rawDesc
+)
+
+func file_system_service_proto_rawDescGZIP() []byte {
+ file_system_service_proto_rawDescOnce.Do(func() {
+ file_system_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_system_service_proto_rawDescData)
+ })
+ return file_system_service_proto_rawDescData
+}
+
+var file_system_service_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_system_service_proto_goTypes = []interface{}{
+ (*GetStatusRequest)(nil), // 0: spilot.api.v1.GetStatusRequest
+ (*GetStatusResponse)(nil), // 1: spilot.api.v1.GetStatusResponse
+}
+var file_system_service_proto_depIdxs = []int32{
+ 0, // 0: spilot.api.v1.SystemServices.GetStatus:input_type -> spilot.api.v1.GetStatusRequest
+ 1, // 1: spilot.api.v1.SystemServices.GetStatus:output_type -> spilot.api.v1.GetStatusResponse
+ 1, // [1:2] is the sub-list for method output_type
+ 0, // [0:1] is the sub-list for method input_type
+ 0, // [0:0] is the sub-list for extension type_name
+ 0, // [0:0] is the sub-list for extension extendee
+ 0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_system_service_proto_init() }
+func file_system_service_proto_init() {
+ if File_system_service_proto != nil {
+ return
+ }
+ if !protoimpl.UnsafeEnabled {
+ file_system_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetStatusRequest); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_system_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*GetStatusResponse); 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_system_service_proto_rawDesc,
+ NumEnums: 0,
+ NumMessages: 2,
+ NumExtensions: 0,
+ NumServices: 1,
+ },
+ GoTypes: file_system_service_proto_goTypes,
+ DependencyIndexes: file_system_service_proto_depIdxs,
+ MessageInfos: file_system_service_proto_msgTypes,
+ }.Build()
+ File_system_service_proto = out.File
+ file_system_service_proto_rawDesc = nil
+ file_system_service_proto_goTypes = nil
+ file_system_service_proto_depIdxs = nil
+}
diff --git a/app/spilothq/gen/system_service_grpc.pb.go b/app/spilothq/gen/system_service_grpc.pb.go
new file mode 100644
index 0000000..50d723c
--- /dev/null
+++ b/app/spilothq/gen/system_service_grpc.pb.go
@@ -0,0 +1,121 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.5.1
+// - protoc (unknown)
+// source: system_service.proto
+
+package apiv1
+
+import (
+ context "context"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.64.0 or later.
+const _ = grpc.SupportPackageIsVersion9
+
+const (
+ SystemServices_GetStatus_FullMethodName = "/spilot.api.v1.SystemServices/GetStatus"
+)
+
+// SystemServicesClient is the client API for SystemServices service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type SystemServicesClient interface {
+ GetStatus(ctx context.Context, in *GetStatusRequest, opts ...grpc.CallOption) (*GetStatusResponse, error)
+}
+
+type systemServicesClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewSystemServicesClient(cc grpc.ClientConnInterface) SystemServicesClient {
+ return &systemServicesClient{cc}
+}
+
+func (c *systemServicesClient) GetStatus(ctx context.Context, in *GetStatusRequest, opts ...grpc.CallOption) (*GetStatusResponse, error) {
+ cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
+ out := new(GetStatusResponse)
+ err := c.cc.Invoke(ctx, SystemServices_GetStatus_FullMethodName, in, out, cOpts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// SystemServicesServer is the server API for SystemServices service.
+// All implementations must embed UnimplementedSystemServicesServer
+// for forward compatibility.
+type SystemServicesServer interface {
+ GetStatus(context.Context, *GetStatusRequest) (*GetStatusResponse, error)
+ mustEmbedUnimplementedSystemServicesServer()
+}
+
+// UnimplementedSystemServicesServer must be embedded to have
+// forward compatible implementations.
+//
+// NOTE: this should be embedded by value instead of pointer to avoid a nil
+// pointer dereference when methods are called.
+type UnimplementedSystemServicesServer struct{}
+
+func (UnimplementedSystemServicesServer) GetStatus(context.Context, *GetStatusRequest) (*GetStatusResponse, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetStatus not implemented")
+}
+func (UnimplementedSystemServicesServer) mustEmbedUnimplementedSystemServicesServer() {}
+func (UnimplementedSystemServicesServer) testEmbeddedByValue() {}
+
+// UnsafeSystemServicesServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to SystemServicesServer will
+// result in compilation errors.
+type UnsafeSystemServicesServer interface {
+ mustEmbedUnimplementedSystemServicesServer()
+}
+
+func RegisterSystemServicesServer(s grpc.ServiceRegistrar, srv SystemServicesServer) {
+ // If the following call pancis, it indicates UnimplementedSystemServicesServer was
+ // embedded by pointer and is nil. This will cause panics if an
+ // unimplemented method is ever invoked, so we test this at initialization
+ // time to prevent it from happening at runtime later due to I/O.
+ if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
+ t.testEmbeddedByValue()
+ }
+ s.RegisterService(&SystemServices_ServiceDesc, srv)
+}
+
+func _SystemServices_GetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetStatusRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(SystemServicesServer).GetStatus(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: SystemServices_GetStatus_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(SystemServicesServer).GetStatus(ctx, req.(*GetStatusRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+// SystemServices_ServiceDesc is the grpc.ServiceDesc for SystemServices service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var SystemServices_ServiceDesc = grpc.ServiceDesc{
+ ServiceName: "spilot.api.v1.SystemServices",
+ HandlerType: (*SystemServicesServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "GetStatus",
+ Handler: _SystemServices_GetStatus_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "system_service.proto",
+}
diff --git a/app/spilothq/main.go b/app/spilothq/main.go
index 35a79b1..4f7ef23 100644
--- a/app/spilothq/main.go
+++ b/app/spilothq/main.go
@@ -9,7 +9,6 @@ import (
"syscall"
"github.com/aforamitdev/server-pilot/app/spilothq/services"
- "github.com/aforamitdev/server-pilot/internal/rsyslog"
"github.com/aforamitdev/server-pilot/pkg/logger"
"github.com/aforamitdev/server-pilot/pkg/web"
)
@@ -43,17 +42,17 @@ func run(ctx context.Context, log *logger.Logger) {
signal.Notify(shutdown, os.Interrupt, syscall.SIGTERM)
// start rsys log listener
- rlog, err := rsyslog.NewLogListener(":5000")
+
if err != nil {
log.Error(ctx, "error starting log listener")
os.Exit(1)
}
- server, err := services.NewServer(ctx, rlog)
+ server, err := services.NewServer(ctx, log)
+
if err != nil {
log.Error(ctx, "main:fail to init grpc server")
os.Exit(1)
-
}
serviceErr := make(chan error, 1)
@@ -62,8 +61,6 @@ func run(ctx context.Context, log *logger.Logger) {
serviceErr <- server.GrpcServer.Serve(lis)
}()
- // err = server.Serve(lis)
-
if err != nil {
log.Info(ctx, "impossible to server %s", err)
}
@@ -71,6 +68,8 @@ func run(ctx context.Context, log *logger.Logger) {
select {
case err := <-serviceErr:
fmt.Println(err)
+ os.Exit(1)
+
case sig := <-shutdown:
fmt.Println("closing service", sig)
server.GrpcServer.Stop()
diff --git a/app/spilothq/proto/api/v1/log_service.proto b/app/spilothq/proto/api/v1/log_service.proto
new file mode 100644
index 0000000..6dfd912
--- /dev/null
+++ b/app/spilothq/proto/api/v1/log_service.proto
@@ -0,0 +1,20 @@
+
+
+syntax = "proto3";
+
+package spilot.api.v1;
+
+option go_package = "gen/api/v1";
+
+
+message LogResponse{
+ string log=1;
+}
+
+message LogRequest{
+ string log=1;
+}
+
+service LogService {
+ rpc GetLogs(LogRequest) returns (stream LogResponse){}
+ }
\ No newline at end of file
diff --git a/app/spilothq/proto/api/v1/system_service.proto b/app/spilothq/proto/api/v1/system_service.proto
new file mode 100644
index 0000000..1788377
--- /dev/null
+++ b/app/spilothq/proto/api/v1/system_service.proto
@@ -0,0 +1,22 @@
+
+syntax = "proto3";
+
+
+package spilot.api.v1;
+
+
+option go_package = "gen/api/v1";
+
+service SystemServices {
+ rpc GetStatus(GetStatusRequest) returns (GetStatusResponse);
+}
+
+
+message GetStatusRequest{
+
+}
+
+message GetStatusResponse{
+ string system=1;
+
+}
\ No newline at end of file
diff --git a/app/spilothq/proto/store/status.proto b/app/spilothq/proto/store/status.proto
new file mode 100644
index 0000000..32a94cb
--- /dev/null
+++ b/app/spilothq/proto/store/status.proto
@@ -0,0 +1,14 @@
+syntax = "proto3";
+
+
+package spilot.api.store;
+
+
+option go_package = "gen/api/store";
+
+
+
+message Status{
+ string message=1;
+}
+
diff --git a/app/spilothq/services/services.go b/app/spilothq/services/services.go
index e9cc87d..fb240f5 100644
--- a/app/spilothq/services/services.go
+++ b/app/spilothq/services/services.go
@@ -4,20 +4,40 @@ import (
"context"
"github.com/aforamitdev/server-pilot/internal/rsyslog"
+ "github.com/aforamitdev/server-pilot/internal/system"
+ "github.com/aforamitdev/server-pilot/pkg/logger"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
type Server struct {
+ // loge
+ apiv1.UnimplementedLogServiceServer
+ apiv1.UnimplementedSystemServicesServer
+
GrpcServer *grpc.Server
rlog *rsyslog.RLog
+ system *system.SystemInformer
}
-func NewServer(ctx context.Context, rlog *rsyslog.RLog) (*Server, error) {
+func NewServer(ctx context.Context, log *logger.Logger) (*Server, error) {
+
+ system := system.NewSystemInformer(log)
+ rlog, err := rsyslog.NewLogListener(":5000")
+
+ if err != nil {
+ return &Server{}, err
+ }
+
grpcServer := grpc.NewServer()
+ grpcApiService := &Server{GrpcServer: grpcServer, rlog: rlog, system: system}
+
reflection.Register(grpcServer)
- return &Server{GrpcServer: grpcServer, rlog: rlog}, nil
+ apiv1.RegisterLogServiceServer(grpcServer, rlog)
+ apiv1.RegisterSystemServicesServer(grpcServer, system)
+
+ return grpcApiService, nil
}
diff --git a/app/spilotui/.gitignore b/app/spilotui/.gitignore
new file mode 100644
index 0000000..129d522
--- /dev/null
+++ b/app/spilotui/.gitignore
@@ -0,0 +1,3 @@
+build/bin
+node_modules
+frontend/dist
diff --git a/app/spilotui/README.md b/app/spilotui/README.md
new file mode 100644
index 0000000..d2169cc
--- /dev/null
+++ b/app/spilotui/README.md
@@ -0,0 +1,19 @@
+# README
+
+## About
+
+This is the official Wails React-TS template.
+
+You can configure the project by editing `wails.json`. More information about the project settings can be found
+here: https://wails.io/docs/reference/project-config
+
+## Live Development
+
+To run in live development mode, run `wails dev` in the project directory. This will run a Vite development
+server that will provide very fast hot reload of your frontend changes. If you want to develop in a browser
+and have access to your Go methods, there is also a dev server that runs on http://localhost:34115. Connect
+to this in your browser, and you can call your Go code from devtools.
+
+## Building
+
+To build a redistributable, production mode package, use `wails build`.
diff --git a/app/spilotui/app.go b/app/spilotui/app.go
new file mode 100644
index 0000000..b5eb2ab
--- /dev/null
+++ b/app/spilotui/app.go
@@ -0,0 +1,27 @@
+package main
+
+import (
+ "context"
+)
+
+// App struct
+type App struct {
+ ctx context.Context
+}
+
+// NewApp creates a new App application struct
+func NewApp() *App {
+ return &App{}
+}
+
+// startup is called when the app starts. The context is saved
+// so we can call the runtime methods
+func (a *App) startup(ctx context.Context) {
+ a.ctx = ctx
+
+}
+
+// // Greet returns a greeting for the given name
+// func (a *App) Greet(name string) string {
+
+// }
diff --git a/app/spilotui/build/README.md b/app/spilotui/build/README.md
new file mode 100644
index 0000000..1ae2f67
--- /dev/null
+++ b/app/spilotui/build/README.md
@@ -0,0 +1,35 @@
+# Build Directory
+
+The build directory is used to house all the build files and assets for your application.
+
+The structure is:
+
+* bin - Output directory
+* darwin - macOS specific files
+* windows - Windows specific files
+
+## Mac
+
+The `darwin` directory holds files specific to Mac builds.
+These may be customised and used as part of the build. To return these files to the default state, simply delete them
+and
+build with `wails build`.
+
+The directory contains the following files:
+
+- `Info.plist` - the main plist file used for Mac builds. It is used when building using `wails build`.
+- `Info.dev.plist` - same as the main plist file but used when building using `wails dev`.
+
+## Windows
+
+The `windows` directory contains the manifest and rc files used when building with `wails build`.
+These may be customised for your application. To return these files to the default state, simply delete them and
+build with `wails build`.
+
+- `icon.ico` - The icon used for the application. This is used when building using `wails build`. If you wish to
+ use a different icon, simply replace this file with your own. If it is missing, a new `icon.ico` file
+ will be created using the `appicon.png` file in the build directory.
+- `installer/*` - The files used to create the Windows installer. These are used when building using `wails build`.
+- `info.json` - Application details used for Windows builds. The data here will be used by the Windows installer,
+ as well as the application itself (right click the exe -> properties -> details)
+- `wails.exe.manifest` - The main application manifest file.
\ No newline at end of file
diff --git a/app/spilotui/build/appicon.png b/app/spilotui/build/appicon.png
new file mode 100644
index 0000000..63617fe
Binary files /dev/null and b/app/spilotui/build/appicon.png differ
diff --git a/app/spilotui/build/darwin/Info.dev.plist b/app/spilotui/build/darwin/Info.dev.plist
new file mode 100644
index 0000000..04727c2
--- /dev/null
+++ b/app/spilotui/build/darwin/Info.dev.plist
@@ -0,0 +1,68 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{.Info.ProductName}}
+ CFBundleExecutable
+ {{.Name}}
+ CFBundleIdentifier
+ com.wails.{{.Name}}
+ CFBundleVersion
+ {{.Info.ProductVersion}}
+ CFBundleGetInfoString
+ {{.Info.Comments}}
+ CFBundleShortVersionString
+ {{.Info.ProductVersion}}
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ {{.Info.Copyright}}
+ {{if .Info.FileAssociations}}
+ CFBundleDocumentTypes
+
+ {{range .Info.FileAssociations}}
+
+ CFBundleTypeExtensions
+
+ {{.Ext}}
+
+ CFBundleTypeName
+ {{.Name}}
+ CFBundleTypeRole
+ {{.Role}}
+ CFBundleTypeIconFile
+ {{.IconName}}
+
+ {{end}}
+
+ {{end}}
+ {{if .Info.Protocols}}
+ CFBundleURLTypes
+
+ {{range .Info.Protocols}}
+
+ CFBundleURLName
+ com.wails.{{.Scheme}}
+ CFBundleURLSchemes
+
+ {{.Scheme}}
+
+ CFBundleTypeRole
+ {{.Role}}
+
+ {{end}}
+
+ {{end}}
+ NSAppTransportSecurity
+
+ NSAllowsLocalNetworking
+
+
+
+
diff --git a/app/spilotui/build/darwin/Info.plist b/app/spilotui/build/darwin/Info.plist
new file mode 100644
index 0000000..19cc937
--- /dev/null
+++ b/app/spilotui/build/darwin/Info.plist
@@ -0,0 +1,63 @@
+
+
+
+ CFBundlePackageType
+ APPL
+ CFBundleName
+ {{.Info.ProductName}}
+ CFBundleExecutable
+ {{.Name}}
+ CFBundleIdentifier
+ com.wails.{{.Name}}
+ CFBundleVersion
+ {{.Info.ProductVersion}}
+ CFBundleGetInfoString
+ {{.Info.Comments}}
+ CFBundleShortVersionString
+ {{.Info.ProductVersion}}
+ CFBundleIconFile
+ iconfile
+ LSMinimumSystemVersion
+ 10.13.0
+ NSHighResolutionCapable
+ true
+ NSHumanReadableCopyright
+ {{.Info.Copyright}}
+ {{if .Info.FileAssociations}}
+ CFBundleDocumentTypes
+
+ {{range .Info.FileAssociations}}
+
+ CFBundleTypeExtensions
+
+ {{.Ext}}
+
+ CFBundleTypeName
+ {{.Name}}
+ CFBundleTypeRole
+ {{.Role}}
+ CFBundleTypeIconFile
+ {{.IconName}}
+
+ {{end}}
+
+ {{end}}
+ {{if .Info.Protocols}}
+ CFBundleURLTypes
+
+ {{range .Info.Protocols}}
+
+ CFBundleURLName
+ com.wails.{{.Scheme}}
+ CFBundleURLSchemes
+
+ {{.Scheme}}
+
+ CFBundleTypeRole
+ {{.Role}}
+
+ {{end}}
+
+ {{end}}
+
+
diff --git a/app/spilotui/build/windows/icon.ico b/app/spilotui/build/windows/icon.ico
new file mode 100644
index 0000000..f334798
Binary files /dev/null and b/app/spilotui/build/windows/icon.ico differ
diff --git a/app/spilotui/build/windows/info.json b/app/spilotui/build/windows/info.json
new file mode 100644
index 0000000..9727946
--- /dev/null
+++ b/app/spilotui/build/windows/info.json
@@ -0,0 +1,15 @@
+{
+ "fixed": {
+ "file_version": "{{.Info.ProductVersion}}"
+ },
+ "info": {
+ "0000": {
+ "ProductVersion": "{{.Info.ProductVersion}}",
+ "CompanyName": "{{.Info.CompanyName}}",
+ "FileDescription": "{{.Info.ProductName}}",
+ "LegalCopyright": "{{.Info.Copyright}}",
+ "ProductName": "{{.Info.ProductName}}",
+ "Comments": "{{.Info.Comments}}"
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/spilotui/build/windows/installer/project.nsi b/app/spilotui/build/windows/installer/project.nsi
new file mode 100644
index 0000000..654ae2e
--- /dev/null
+++ b/app/spilotui/build/windows/installer/project.nsi
@@ -0,0 +1,114 @@
+Unicode true
+
+####
+## Please note: Template replacements don't work in this file. They are provided with default defines like
+## mentioned underneath.
+## If the keyword is not defined, "wails_tools.nsh" will populate them with the values from ProjectInfo.
+## If they are defined here, "wails_tools.nsh" will not touch them. This allows to use this project.nsi manually
+## from outside of Wails for debugging and development of the installer.
+##
+## For development first make a wails nsis build to populate the "wails_tools.nsh":
+## > wails build --target windows/amd64 --nsis
+## Then you can call makensis on this file with specifying the path to your binary:
+## For a AMD64 only installer:
+## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe
+## For a ARM64 only installer:
+## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe
+## For a installer with both architectures:
+## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe
+####
+## The following information is taken from the ProjectInfo file, but they can be overwritten here.
+####
+## !define INFO_PROJECTNAME "MyProject" # Default "{{.Name}}"
+## !define INFO_COMPANYNAME "MyCompany" # Default "{{.Info.CompanyName}}"
+## !define INFO_PRODUCTNAME "MyProduct" # Default "{{.Info.ProductName}}"
+## !define INFO_PRODUCTVERSION "1.0.0" # Default "{{.Info.ProductVersion}}"
+## !define INFO_COPYRIGHT "Copyright" # Default "{{.Info.Copyright}}"
+###
+## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe"
+## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
+####
+## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html
+####
+## Include the wails tools
+####
+!include "wails_tools.nsh"
+
+# The version information for this two must consist of 4 parts
+VIProductVersion "${INFO_PRODUCTVERSION}.0"
+VIFileVersion "${INFO_PRODUCTVERSION}.0"
+
+VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}"
+VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
+VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}"
+VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}"
+VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}"
+VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
+
+# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware
+ManifestDPIAware true
+
+!include "MUI.nsh"
+
+!define MUI_ICON "..\icon.ico"
+!define MUI_UNICON "..\icon.ico"
+# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
+!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
+!define MUI_ABORTWARNING # This will warn the user if they exit from the installer.
+
+!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
+# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer
+!insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
+!insertmacro MUI_PAGE_INSTFILES # Installing page.
+!insertmacro MUI_PAGE_FINISH # Finished installation page.
+
+!insertmacro MUI_UNPAGE_INSTFILES # Uinstalling page
+
+!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer
+
+## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1
+#!uninstfinalize 'signtool --file "%1"'
+#!finalize 'signtool --file "%1"'
+
+Name "${INFO_PRODUCTNAME}"
+OutFile "..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file.
+InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
+ShowInstDetails show # This will always show the installation details.
+
+Function .onInit
+ !insertmacro wails.checkArchitecture
+FunctionEnd
+
+Section
+ !insertmacro wails.setShellContext
+
+ !insertmacro wails.webview2runtime
+
+ SetOutPath $INSTDIR
+
+ !insertmacro wails.files
+
+ CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
+ CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
+
+ !insertmacro wails.associateFiles
+ !insertmacro wails.associateCustomProtocols
+
+ !insertmacro wails.writeUninstaller
+SectionEnd
+
+Section "uninstall"
+ !insertmacro wails.setShellContext
+
+ RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath
+
+ RMDir /r $INSTDIR
+
+ Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
+ Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
+
+ !insertmacro wails.unassociateFiles
+ !insertmacro wails.unassociateCustomProtocols
+
+ !insertmacro wails.deleteUninstaller
+SectionEnd
diff --git a/app/spilotui/build/windows/installer/wails_tools.nsh b/app/spilotui/build/windows/installer/wails_tools.nsh
new file mode 100644
index 0000000..f9c0f88
--- /dev/null
+++ b/app/spilotui/build/windows/installer/wails_tools.nsh
@@ -0,0 +1,249 @@
+# DO NOT EDIT - Generated automatically by `wails build`
+
+!include "x64.nsh"
+!include "WinVer.nsh"
+!include "FileFunc.nsh"
+
+!ifndef INFO_PROJECTNAME
+ !define INFO_PROJECTNAME "{{.Name}}"
+!endif
+!ifndef INFO_COMPANYNAME
+ !define INFO_COMPANYNAME "{{.Info.CompanyName}}"
+!endif
+!ifndef INFO_PRODUCTNAME
+ !define INFO_PRODUCTNAME "{{.Info.ProductName}}"
+!endif
+!ifndef INFO_PRODUCTVERSION
+ !define INFO_PRODUCTVERSION "{{.Info.ProductVersion}}"
+!endif
+!ifndef INFO_COPYRIGHT
+ !define INFO_COPYRIGHT "{{.Info.Copyright}}"
+!endif
+!ifndef PRODUCT_EXECUTABLE
+ !define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
+!endif
+!ifndef UNINST_KEY_NAME
+ !define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
+!endif
+!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"
+
+!ifndef REQUEST_EXECUTION_LEVEL
+ !define REQUEST_EXECUTION_LEVEL "admin"
+!endif
+
+RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
+
+!ifdef ARG_WAILS_AMD64_BINARY
+ !define SUPPORTS_AMD64
+!endif
+
+!ifdef ARG_WAILS_ARM64_BINARY
+ !define SUPPORTS_ARM64
+!endif
+
+!ifdef SUPPORTS_AMD64
+ !ifdef SUPPORTS_ARM64
+ !define ARCH "amd64_arm64"
+ !else
+ !define ARCH "amd64"
+ !endif
+!else
+ !ifdef SUPPORTS_ARM64
+ !define ARCH "arm64"
+ !else
+ !error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY"
+ !endif
+!endif
+
+!macro wails.checkArchitecture
+ !ifndef WAILS_WIN10_REQUIRED
+ !define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later."
+ !endif
+
+ !ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED
+ !define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}"
+ !endif
+
+ ${If} ${AtLeastWin10}
+ !ifdef SUPPORTS_AMD64
+ ${if} ${IsNativeAMD64}
+ Goto ok
+ ${EndIf}
+ !endif
+
+ !ifdef SUPPORTS_ARM64
+ ${if} ${IsNativeARM64}
+ Goto ok
+ ${EndIf}
+ !endif
+
+ IfSilent silentArch notSilentArch
+ silentArch:
+ SetErrorLevel 65
+ Abort
+ notSilentArch:
+ MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}"
+ Quit
+ ${else}
+ IfSilent silentWin notSilentWin
+ silentWin:
+ SetErrorLevel 64
+ Abort
+ notSilentWin:
+ MessageBox MB_OK "${WAILS_WIN10_REQUIRED}"
+ Quit
+ ${EndIf}
+
+ ok:
+!macroend
+
+!macro wails.files
+ !ifdef SUPPORTS_AMD64
+ ${if} ${IsNativeAMD64}
+ File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}"
+ ${EndIf}
+ !endif
+
+ !ifdef SUPPORTS_ARM64
+ ${if} ${IsNativeARM64}
+ File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}"
+ ${EndIf}
+ !endif
+!macroend
+
+!macro wails.writeUninstaller
+ WriteUninstaller "$INSTDIR\uninstall.exe"
+
+ SetRegView 64
+ WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
+ WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
+ WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
+ WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
+ WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
+ WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
+
+ ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
+ IntFmt $0 "0x%08X" $0
+ WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
+!macroend
+
+!macro wails.deleteUninstaller
+ Delete "$INSTDIR\uninstall.exe"
+
+ SetRegView 64
+ DeleteRegKey HKLM "${UNINST_KEY}"
+!macroend
+
+!macro wails.setShellContext
+ ${If} ${REQUEST_EXECUTION_LEVEL} == "admin"
+ SetShellVarContext all
+ ${else}
+ SetShellVarContext current
+ ${EndIf}
+!macroend
+
+# Install webview2 by launching the bootstrapper
+# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment
+!macro wails.webview2runtime
+ !ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT
+ !define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime"
+ !endif
+
+ SetRegView 64
+ # If the admin key exists and is not empty then webview2 is already installed
+ ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${If} $0 != ""
+ Goto ok
+ ${EndIf}
+
+ ${If} ${REQUEST_EXECUTION_LEVEL} == "user"
+ # If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed
+ ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
+ ${If} $0 != ""
+ Goto ok
+ ${EndIf}
+ ${EndIf}
+
+ SetDetailsPrint both
+ DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}"
+ SetDetailsPrint listonly
+
+ InitPluginsDir
+ CreateDirectory "$pluginsdir\webview2bootstrapper"
+ SetOutPath "$pluginsdir\webview2bootstrapper"
+ File "tmp\MicrosoftEdgeWebview2Setup.exe"
+ ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install'
+
+ SetDetailsPrint both
+ ok:
+!macroend
+
+# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b
+!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
+ ; Backup the previously associated file class
+ ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
+
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
+
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
+!macroend
+
+!macro APP_UNASSOCIATE EXT FILECLASS
+ ; Backup the previously associated file class
+ ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
+ WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"
+
+ DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
+!macroend
+
+!macro wails.associateFiles
+ ; Create file associations
+ {{range .Info.FileAssociations}}
+ !insertmacro APP_ASSOCIATE "{{.Ext}}" "{{.Name}}" "{{.Description}}" "$INSTDIR\{{.IconName}}.ico" "Open with ${INFO_PRODUCTNAME}" "$INSTDIR\${PRODUCT_EXECUTABLE} $\"%1$\""
+
+ File "..\{{.IconName}}.ico"
+ {{end}}
+!macroend
+
+!macro wails.unassociateFiles
+ ; Delete app associations
+ {{range .Info.FileAssociations}}
+ !insertmacro APP_UNASSOCIATE "{{.Ext}}" "{{.Name}}"
+
+ Delete "$INSTDIR\{{.IconName}}.ico"
+ {{end}}
+!macroend
+
+!macro CUSTOM_PROTOCOL_ASSOCIATE PROTOCOL DESCRIPTION ICON COMMAND
+ DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "" "${DESCRIPTION}"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "URL Protocol" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\DefaultIcon" "" "${ICON}"
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell" "" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open" "" ""
+ WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open\command" "" "${COMMAND}"
+!macroend
+
+!macro CUSTOM_PROTOCOL_UNASSOCIATE PROTOCOL
+ DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
+!macroend
+
+!macro wails.associateCustomProtocols
+ ; Create custom protocols associations
+ {{range .Info.Protocols}}
+ !insertmacro CUSTOM_PROTOCOL_ASSOCIATE "{{.Scheme}}" "{{.Description}}" "$INSTDIR\${PRODUCT_EXECUTABLE},0" "$INSTDIR\${PRODUCT_EXECUTABLE} $\"%1$\""
+
+ {{end}}
+!macroend
+
+!macro wails.unassociateCustomProtocols
+ ; Delete app custom protocol associations
+ {{range .Info.Protocols}}
+ !insertmacro CUSTOM_PROTOCOL_UNASSOCIATE "{{.Scheme}}"
+ {{end}}
+!macroend
diff --git a/app/spilotui/build/windows/wails.exe.manifest b/app/spilotui/build/windows/wails.exe.manifest
new file mode 100644
index 0000000..17e1a23
--- /dev/null
+++ b/app/spilotui/build/windows/wails.exe.manifest
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+ true/pm
+ permonitorv2,permonitor
+
+
+
\ No newline at end of file
diff --git a/app/spilotui/frontend/components.json b/app/spilotui/frontend/components.json
new file mode 100644
index 0000000..c9073e2
--- /dev/null
+++ b/app/spilotui/frontend/components.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "https://ui.shadcn.com/schema.json",
+ "style": "new-york",
+ "rsc": false,
+ "tsx": true,
+ "tailwind": {
+ "config": "tailwind.config.js",
+ "css": "src/style.css",
+ "baseColor": "slate",
+ "cssVariables": true,
+ "prefix": ""
+ },
+ "aliases": {
+ "utils": "@/lib/utils",
+ "components": "@/components",
+ "ui": "@/shadcn"
+ }
+}
diff --git a/app/spilotui/frontend/index.html b/app/spilotui/frontend/index.html
new file mode 100644
index 0000000..f1c7241
--- /dev/null
+++ b/app/spilotui/frontend/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Server Pilot
+
+
+
+
+
+
diff --git a/app/spilotui/frontend/jsconfig.json b/app/spilotui/frontend/jsconfig.json
new file mode 100644
index 0000000..9c33383
--- /dev/null
+++ b/app/spilotui/frontend/jsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./*"]
+ }
+ }
+}
diff --git a/app/spilotui/frontend/package.json b/app/spilotui/frontend/package.json
new file mode 100644
index 0000000..bd5d26a
--- /dev/null
+++ b/app/spilotui/frontend/package.json
@@ -0,0 +1,73 @@
+{
+ "name": "frontend",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build ",
+ "preview": "vite preview",
+ "build:css": "npx tailwindcss -i ./src/style.css -o ./src/output.css --watch"
+ },
+ "dependencies": {
+ "@bufbuild/protobuf": "^2.2.0",
+ "@hookform/resolvers": "^3.3.4",
+ "@radix-ui/react-accordion": "^1.1.2",
+ "@radix-ui/react-alert-dialog": "^1.0.5",
+ "@radix-ui/react-aspect-ratio": "^1.0.3",
+ "@radix-ui/react-avatar": "^1.0.4",
+ "@radix-ui/react-checkbox": "^1.0.4",
+ "@radix-ui/react-collapsible": "^1.0.3",
+ "@radix-ui/react-context-menu": "^2.1.5",
+ "@radix-ui/react-dialog": "^1.0.5",
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
+ "@radix-ui/react-hover-card": "^1.0.7",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-label": "^2.0.2",
+ "@radix-ui/react-menubar": "^1.0.4",
+ "@radix-ui/react-navigation-menu": "^1.1.4",
+ "@radix-ui/react-popover": "^1.0.7",
+ "@radix-ui/react-progress": "^1.0.3",
+ "@radix-ui/react-radio-group": "^1.1.3",
+ "@radix-ui/react-scroll-area": "^1.0.5",
+ "@radix-ui/react-select": "^2.1.2",
+ "@radix-ui/react-separator": "^1.0.3",
+ "@radix-ui/react-slider": "^1.1.2",
+ "@radix-ui/react-slot": "^1.0.2",
+ "@radix-ui/react-switch": "^1.0.3",
+ "@radix-ui/react-tabs": "^1.1.1",
+ "@radix-ui/react-toast": "^1.2.2",
+ "@radix-ui/react-toggle": "^1.0.3",
+ "@radix-ui/react-toggle-group": "^1.0.4",
+ "@radix-ui/react-tooltip": "^1.0.7",
+ "@radix-ui/themes": "^2.0.3",
+ "@wailsapp/runtime": "^1.1.1",
+ "class-variance-authority": "^0.7.0",
+ "clsx": "^2.1.0",
+ "cmdk": "^0.2.1",
+ "date-fns": "^3.3.1",
+ "embla-carousel-react": "^8.0.0",
+ "lucide-react": "^0.338.0",
+ "next-themes": "^0.2.1",
+ "react": "^18.2.0",
+ "react-day-picker": "^8.10.0",
+ "react-dom": "^18.2.0",
+ "react-hook-form": "^7.50.1",
+ "react-resizable-panels": "^2.1.4",
+ "sonner": "^1.4.1",
+ "vaul": "^0.9.0",
+ "zod": "^3.22.4",
+ "tailwind-merge": "^2.5.4",
+ "tailwindcss-animate": "^1.0.7"
+ },
+ "devDependencies": {
+ "@types/node": "^20.11.20",
+ "@types/react": "^18.0.17",
+ "@types/react-dom": "^18.0.6",
+ "@vitejs/plugin-react": "^2.0.1",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^4.6.4",
+ "vite": "^3.0.7"
+ }
+}
diff --git a/app/spilotui/frontend/package.json.md5 b/app/spilotui/frontend/package.json.md5
new file mode 100755
index 0000000..3e5e896
--- /dev/null
+++ b/app/spilotui/frontend/package.json.md5
@@ -0,0 +1 @@
+f5dfc519466088db2bfb31cc74d7d1ce
\ No newline at end of file
diff --git a/app/spilotui/frontend/src/App.tsx b/app/spilotui/frontend/src/App.tsx
new file mode 100644
index 0000000..8b2b881
--- /dev/null
+++ b/app/spilotui/frontend/src/App.tsx
@@ -0,0 +1,8 @@
+import { useEffect, useState } from 'react';
+
+import Pilot from './app/Pilot.js';
+function App() {
+ return ;
+}
+
+export default App;
diff --git a/app/spilotui/frontend/src/app/Pilot.tsx b/app/spilotui/frontend/src/app/Pilot.tsx
new file mode 100644
index 0000000..ac43764
--- /dev/null
+++ b/app/spilotui/frontend/src/app/Pilot.tsx
@@ -0,0 +1,25 @@
+import React from 'react';
+import { Badge } from '@radix-ui/themes';
+import MainView from './components/main/MainView';
+import { TooltipProvider } from '@radix-ui/react-tooltip';
+
+type Props = {};
+
+const Pilot = (props: Props) => {
+ return (
+
+
+
+
+ linux | ubuntu 20.10 127.0.0.0.1
+
+
+
+
+
+
+
+ );
+};
+
+export default Pilot;
diff --git a/app/spilotui/frontend/src/app/components/dashboard/Index.tsx b/app/spilotui/frontend/src/app/components/dashboard/Index.tsx
new file mode 100644
index 0000000..fc37673
--- /dev/null
+++ b/app/spilotui/frontend/src/app/components/dashboard/Index.tsx
@@ -0,0 +1,9 @@
+import React from 'react';
+
+type Props = {};
+
+const Dashboard = (props: Props) => {
+ return Dashboard
;
+};
+
+export default Dashboard;
diff --git a/app/spilotui/frontend/src/app/components/main/MainView.tsx b/app/spilotui/frontend/src/app/components/main/MainView.tsx
new file mode 100644
index 0000000..ee842b6
--- /dev/null
+++ b/app/spilotui/frontend/src/app/components/main/MainView.tsx
@@ -0,0 +1,72 @@
+import React from 'react';
+import {
+ ResizableHandle,
+ ResizablePanel,
+ ResizablePanelGroup,
+} from './ResizableContainer';
+import { cn } from '@/lib/utils';
+import Utilization from '../utlization/Utilization';
+
+type Props = {
+ defaultLayout?: number[];
+ defaultCollapsed?: boolean;
+ navCollapsedSize?: number;
+};
+
+function MainView({
+ defaultLayout = [20, 32, 48],
+ defaultCollapsed = false,
+ navCollapsedSize = 5,
+}: Props) {
+ const [isCollapsed, setIsCollapsed] = React.useState(defaultCollapsed);
+
+ return (
+ {
+ document.cookie = `react-resizable-panels:layout:mail=${JSON.stringify(
+ sizes
+ )}`;
+ }}
+ className='h-full items-stretch '
+ >
+ {
+ setIsCollapsed(true);
+ document.cookie = `react-resizable-panels:collapsed=${JSON.stringify(
+ true
+ )}`;
+ }}
+ onResize={() => {
+ setIsCollapsed(false);
+ document.cookie = `react-resizable-panels:collapsed=${JSON.stringify(
+ false
+ )}`;
+ }}
+ className={cn(
+ isCollapsed && 'min-w-[50px] transition-all duration-300 ease-in-out'
+ )}
+ >
+
+
+
+
+
+
+
+ );
+}
+
+export default MainView;
diff --git a/app/spilotui/frontend/src/app/components/main/ResizableContainer.tsx b/app/spilotui/frontend/src/app/components/main/ResizableContainer.tsx
new file mode 100644
index 0000000..fa6a07f
--- /dev/null
+++ b/app/spilotui/frontend/src/app/components/main/ResizableContainer.tsx
@@ -0,0 +1,45 @@
+'use client';
+
+import { DragHandleDots2Icon } from '@radix-ui/react-icons';
+import * as ResizablePrimitive from 'react-resizable-panels';
+
+import { cn } from '@/lib/utils';
+
+const ResizablePanelGroup = ({
+ className,
+ ...props
+}: React.ComponentProps) => (
+
+);
+
+const ResizablePanel = ResizablePrimitive.Panel;
+
+const ResizableHandle = ({
+ withHandle,
+ className,
+ ...props
+}: React.ComponentProps & {
+ withHandle?: boolean;
+}) => (
+ div]:rotate-90',
+ className
+ )}
+ {...props}
+ >
+ {withHandle && (
+
+
+
+ )}
+
+);
+
+export { ResizablePanelGroup, ResizablePanel, ResizableHandle };
diff --git a/app/spilotui/frontend/src/app/components/utlization/Utilization.tsx b/app/spilotui/frontend/src/app/components/utlization/Utilization.tsx
new file mode 100644
index 0000000..7f0b441
--- /dev/null
+++ b/app/spilotui/frontend/src/app/components/utlization/Utilization.tsx
@@ -0,0 +1,66 @@
+import React from 'react';
+import {
+ Badge,
+ Box,
+ Container,
+ Flex,
+ IconButton,
+ Text,
+} from '@radix-ui/themes';
+import { ArrowLeft, CheckCircle2, ChevronDown } from 'lucide-react';
+
+type Props = {};
+
+const Utilization = (props: Props) => {
+ return (
+
+
+
+
+ {/* status */}
+
+
+
+
+
+
+
+ {/* status */}
+
+
+
check every 30 seconds
+
+ {/* details */}
+
+
+
+
+
+
+
System Utilization
+
+ Data is updated every 30 seconds{' '}
+
+
+
+
+
+ );
+};
+
+export default Utilization;
diff --git a/app/spilotui/frontend/src/app/shared/nav/Nav.tsx b/app/spilotui/frontend/src/app/shared/nav/Nav.tsx
new file mode 100644
index 0000000..a74757a
--- /dev/null
+++ b/app/spilotui/frontend/src/app/shared/nav/Nav.tsx
@@ -0,0 +1,83 @@
+import { Link, LucideIcon } from 'lucide-react';
+
+import { buttonVariants, cn } from '@/lib/utils';
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@radix-ui/react-tooltip';
+
+interface NavProps {
+ isCollapsed: boolean;
+ links: {
+ title: string;
+ label?: string;
+ icon: LucideIcon;
+ variant: 'default' | 'ghost';
+ }[];
+}
+
+export function Nav({ links, isCollapsed }: NavProps) {
+ return (
+
+
+
+ );
+}
diff --git a/app/spilotui/frontend/src/app/types/google/protobuf/descriptor.ts b/app/spilotui/frontend/src/app/types/google/protobuf/descriptor.ts
new file mode 100644
index 0000000..84e4d4d
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/google/protobuf/descriptor.ts
@@ -0,0 +1,5353 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.2.0
+// protoc unknown
+// source: google/protobuf/descriptor.proto
+
+/* eslint-disable */
+import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
+
+export const protobufPackage = "google.protobuf";
+
+/** The full set of known editions. */
+export enum Edition {
+ /** EDITION_UNKNOWN - A placeholder for an unknown edition value. */
+ EDITION_UNKNOWN = "EDITION_UNKNOWN",
+ /**
+ * EDITION_LEGACY - A placeholder edition for specifying default behaviors *before* a feature
+ * was first introduced. This is effectively an "infinite past".
+ */
+ EDITION_LEGACY = "EDITION_LEGACY",
+ /**
+ * EDITION_PROTO2 - Legacy syntax "editions". These pre-date editions, but behave much like
+ * distinct editions. These can't be used to specify the edition of proto
+ * files, but feature definitions must supply proto2/proto3 defaults for
+ * backwards compatibility.
+ */
+ EDITION_PROTO2 = "EDITION_PROTO2",
+ EDITION_PROTO3 = "EDITION_PROTO3",
+ /**
+ * EDITION_2023 - Editions that have been released. The specific values are arbitrary and
+ * should not be depended on, but they will always be time-ordered for easy
+ * comparison.
+ */
+ EDITION_2023 = "EDITION_2023",
+ EDITION_2024 = "EDITION_2024",
+ /**
+ * EDITION_1_TEST_ONLY - Placeholder editions for testing feature resolution. These should not be
+ * used or relyed on outside of tests.
+ */
+ EDITION_1_TEST_ONLY = "EDITION_1_TEST_ONLY",
+ EDITION_2_TEST_ONLY = "EDITION_2_TEST_ONLY",
+ EDITION_99997_TEST_ONLY = "EDITION_99997_TEST_ONLY",
+ EDITION_99998_TEST_ONLY = "EDITION_99998_TEST_ONLY",
+ EDITION_99999_TEST_ONLY = "EDITION_99999_TEST_ONLY",
+ /**
+ * EDITION_MAX - Placeholder for specifying unbounded edition support. This should only
+ * ever be used by plugins that can expect to never require any changes to
+ * support a new edition.
+ */
+ EDITION_MAX = "EDITION_MAX",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function editionFromJSON(object: any): Edition {
+ switch (object) {
+ case 0:
+ case "EDITION_UNKNOWN":
+ return Edition.EDITION_UNKNOWN;
+ case 900:
+ case "EDITION_LEGACY":
+ return Edition.EDITION_LEGACY;
+ case 998:
+ case "EDITION_PROTO2":
+ return Edition.EDITION_PROTO2;
+ case 999:
+ case "EDITION_PROTO3":
+ return Edition.EDITION_PROTO3;
+ case 1000:
+ case "EDITION_2023":
+ return Edition.EDITION_2023;
+ case 1001:
+ case "EDITION_2024":
+ return Edition.EDITION_2024;
+ case 1:
+ case "EDITION_1_TEST_ONLY":
+ return Edition.EDITION_1_TEST_ONLY;
+ case 2:
+ case "EDITION_2_TEST_ONLY":
+ return Edition.EDITION_2_TEST_ONLY;
+ case 99997:
+ case "EDITION_99997_TEST_ONLY":
+ return Edition.EDITION_99997_TEST_ONLY;
+ case 99998:
+ case "EDITION_99998_TEST_ONLY":
+ return Edition.EDITION_99998_TEST_ONLY;
+ case 99999:
+ case "EDITION_99999_TEST_ONLY":
+ return Edition.EDITION_99999_TEST_ONLY;
+ case 2147483647:
+ case "EDITION_MAX":
+ return Edition.EDITION_MAX;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return Edition.UNRECOGNIZED;
+ }
+}
+
+export function editionToNumber(object: Edition): number {
+ switch (object) {
+ case Edition.EDITION_UNKNOWN:
+ return 0;
+ case Edition.EDITION_LEGACY:
+ return 900;
+ case Edition.EDITION_PROTO2:
+ return 998;
+ case Edition.EDITION_PROTO3:
+ return 999;
+ case Edition.EDITION_2023:
+ return 1000;
+ case Edition.EDITION_2024:
+ return 1001;
+ case Edition.EDITION_1_TEST_ONLY:
+ return 1;
+ case Edition.EDITION_2_TEST_ONLY:
+ return 2;
+ case Edition.EDITION_99997_TEST_ONLY:
+ return 99997;
+ case Edition.EDITION_99998_TEST_ONLY:
+ return 99998;
+ case Edition.EDITION_99999_TEST_ONLY:
+ return 99999;
+ case Edition.EDITION_MAX:
+ return 2147483647;
+ case Edition.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+/**
+ * The protocol compiler can output a FileDescriptorSet containing the .proto
+ * files it parses.
+ */
+export interface FileDescriptorSet {
+ file: FileDescriptorProto[];
+}
+
+/** Describes a complete .proto file. */
+export interface FileDescriptorProto {
+ /** file name, relative to root of source tree */
+ name?:
+ | string
+ | undefined;
+ /** e.g. "foo", "foo.bar", etc. */
+ package?:
+ | string
+ | undefined;
+ /** Names of files imported by this file. */
+ dependency: string[];
+ /** Indexes of the public imported files in the dependency list above. */
+ publicDependency: number[];
+ /**
+ * Indexes of the weak imported files in the dependency list.
+ * For Google-internal migration only. Do not use.
+ */
+ weakDependency: number[];
+ /** All top-level definitions in this file. */
+ messageType: DescriptorProto[];
+ enumType: EnumDescriptorProto[];
+ service: ServiceDescriptorProto[];
+ extension: FieldDescriptorProto[];
+ options?:
+ | FileOptions
+ | undefined;
+ /**
+ * This field contains optional information about the original source code.
+ * You may safely remove this entire field without harming runtime
+ * functionality of the descriptors -- the information is needed only by
+ * development tools.
+ */
+ sourceCodeInfo?:
+ | SourceCodeInfo
+ | undefined;
+ /**
+ * The syntax of the proto file.
+ * The supported values are "proto2", "proto3", and "editions".
+ *
+ * If `edition` is present, this value must be "editions".
+ */
+ syntax?:
+ | string
+ | undefined;
+ /** The edition of the proto file. */
+ edition?: Edition | undefined;
+}
+
+/** Describes a message type. */
+export interface DescriptorProto {
+ name?: string | undefined;
+ field: FieldDescriptorProto[];
+ extension: FieldDescriptorProto[];
+ nestedType: DescriptorProto[];
+ enumType: EnumDescriptorProto[];
+ extensionRange: DescriptorProto_ExtensionRange[];
+ oneofDecl: OneofDescriptorProto[];
+ options?: MessageOptions | undefined;
+ reservedRange: DescriptorProto_ReservedRange[];
+ /**
+ * Reserved field names, which may not be used by fields in the same message.
+ * A given name may only be reserved once.
+ */
+ reservedName: string[];
+}
+
+export interface DescriptorProto_ExtensionRange {
+ /** Inclusive. */
+ start?:
+ | number
+ | undefined;
+ /** Exclusive. */
+ end?: number | undefined;
+ options?: ExtensionRangeOptions | undefined;
+}
+
+/**
+ * Range of reserved tag numbers. Reserved tag numbers may not be used by
+ * fields or extension ranges in the same message. Reserved ranges may
+ * not overlap.
+ */
+export interface DescriptorProto_ReservedRange {
+ /** Inclusive. */
+ start?:
+ | number
+ | undefined;
+ /** Exclusive. */
+ end?: number | undefined;
+}
+
+export interface ExtensionRangeOptions {
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+ /**
+ * For external users: DO NOT USE. We are in the process of open sourcing
+ * extension declaration and executing internal cleanups before it can be
+ * used externally.
+ */
+ declaration: ExtensionRangeOptions_Declaration[];
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /**
+ * The verification state of the range.
+ * TODO: flip the default to DECLARATION once all empty ranges
+ * are marked as UNVERIFIED.
+ */
+ verification?: ExtensionRangeOptions_VerificationState | undefined;
+}
+
+/** The verification state of the extension range. */
+export enum ExtensionRangeOptions_VerificationState {
+ /** DECLARATION - All the extensions of the range must be declared. */
+ DECLARATION = "DECLARATION",
+ UNVERIFIED = "UNVERIFIED",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function extensionRangeOptions_VerificationStateFromJSON(object: any): ExtensionRangeOptions_VerificationState {
+ switch (object) {
+ case 0:
+ case "DECLARATION":
+ return ExtensionRangeOptions_VerificationState.DECLARATION;
+ case 1:
+ case "UNVERIFIED":
+ return ExtensionRangeOptions_VerificationState.UNVERIFIED;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return ExtensionRangeOptions_VerificationState.UNRECOGNIZED;
+ }
+}
+
+export function extensionRangeOptions_VerificationStateToNumber(
+ object: ExtensionRangeOptions_VerificationState,
+): number {
+ switch (object) {
+ case ExtensionRangeOptions_VerificationState.DECLARATION:
+ return 0;
+ case ExtensionRangeOptions_VerificationState.UNVERIFIED:
+ return 1;
+ case ExtensionRangeOptions_VerificationState.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export interface ExtensionRangeOptions_Declaration {
+ /** The extension number declared within the extension range. */
+ number?:
+ | number
+ | undefined;
+ /**
+ * The fully-qualified name of the extension field. There must be a leading
+ * dot in front of the full name.
+ */
+ fullName?:
+ | string
+ | undefined;
+ /**
+ * The fully-qualified type name of the extension field. Unlike
+ * Metadata.type, Declaration.type must have a leading dot for messages
+ * and enums.
+ */
+ type?:
+ | string
+ | undefined;
+ /**
+ * If true, indicates that the number is reserved in the extension range,
+ * and any extension field with the number will fail to compile. Set this
+ * when a declared extension field is deleted.
+ */
+ reserved?:
+ | boolean
+ | undefined;
+ /**
+ * If true, indicates that the extension must be defined as repeated.
+ * Otherwise the extension must be defined as optional.
+ */
+ repeated?: boolean | undefined;
+}
+
+/** Describes a field within a message. */
+export interface FieldDescriptorProto {
+ name?: string | undefined;
+ number?: number | undefined;
+ label?:
+ | FieldDescriptorProto_Label
+ | undefined;
+ /**
+ * If type_name is set, this need not be set. If both this and type_name
+ * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
+ */
+ type?:
+ | FieldDescriptorProto_Type
+ | undefined;
+ /**
+ * For message and enum types, this is the name of the type. If the name
+ * starts with a '.', it is fully-qualified. Otherwise, C++-like scoping
+ * rules are used to find the type (i.e. first the nested types within this
+ * message are searched, then within the parent, on up to the root
+ * namespace).
+ */
+ typeName?:
+ | string
+ | undefined;
+ /**
+ * For extensions, this is the name of the type being extended. It is
+ * resolved in the same manner as type_name.
+ */
+ extendee?:
+ | string
+ | undefined;
+ /**
+ * For numeric types, contains the original text representation of the value.
+ * For booleans, "true" or "false".
+ * For strings, contains the default text contents (not escaped in any way).
+ * For bytes, contains the C escaped value. All bytes >= 128 are escaped.
+ */
+ defaultValue?:
+ | string
+ | undefined;
+ /**
+ * If set, gives the index of a oneof in the containing type's oneof_decl
+ * list. This field is a member of that oneof.
+ */
+ oneofIndex?:
+ | number
+ | undefined;
+ /**
+ * JSON name of this field. The value is set by protocol compiler. If the
+ * user has set a "json_name" option on this field, that option's value
+ * will be used. Otherwise, it's deduced from the field's name by converting
+ * it to camelCase.
+ */
+ jsonName?: string | undefined;
+ options?:
+ | FieldOptions
+ | undefined;
+ /**
+ * If true, this is a proto3 "optional". When a proto3 field is optional, it
+ * tracks presence regardless of field type.
+ *
+ * When proto3_optional is true, this field must belong to a oneof to signal
+ * to old proto3 clients that presence is tracked for this field. This oneof
+ * is known as a "synthetic" oneof, and this field must be its sole member
+ * (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs
+ * exist in the descriptor only, and do not generate any API. Synthetic oneofs
+ * must be ordered after all "real" oneofs.
+ *
+ * For message fields, proto3_optional doesn't create any semantic change,
+ * since non-repeated message fields always track presence. However it still
+ * indicates the semantic detail of whether the user wrote "optional" or not.
+ * This can be useful for round-tripping the .proto file. For consistency we
+ * give message fields a synthetic oneof also, even though it is not required
+ * to track presence. This is especially important because the parser can't
+ * tell if a field is a message or an enum, so it must always create a
+ * synthetic oneof.
+ *
+ * Proto2 optional fields do not set this flag, because they already indicate
+ * optional with `LABEL_OPTIONAL`.
+ */
+ proto3Optional?: boolean | undefined;
+}
+
+export enum FieldDescriptorProto_Type {
+ /**
+ * TYPE_DOUBLE - 0 is reserved for errors.
+ * Order is weird for historical reasons.
+ */
+ TYPE_DOUBLE = "TYPE_DOUBLE",
+ TYPE_FLOAT = "TYPE_FLOAT",
+ /**
+ * TYPE_INT64 - Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if
+ * negative values are likely.
+ */
+ TYPE_INT64 = "TYPE_INT64",
+ TYPE_UINT64 = "TYPE_UINT64",
+ /**
+ * TYPE_INT32 - Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if
+ * negative values are likely.
+ */
+ TYPE_INT32 = "TYPE_INT32",
+ TYPE_FIXED64 = "TYPE_FIXED64",
+ TYPE_FIXED32 = "TYPE_FIXED32",
+ TYPE_BOOL = "TYPE_BOOL",
+ TYPE_STRING = "TYPE_STRING",
+ /**
+ * TYPE_GROUP - Tag-delimited aggregate.
+ * Group type is deprecated and not supported after google.protobuf. However, Proto3
+ * implementations should still be able to parse the group wire format and
+ * treat group fields as unknown fields. In Editions, the group wire format
+ * can be enabled via the `message_encoding` feature.
+ */
+ TYPE_GROUP = "TYPE_GROUP",
+ /** TYPE_MESSAGE - Length-delimited aggregate. */
+ TYPE_MESSAGE = "TYPE_MESSAGE",
+ /** TYPE_BYTES - New in version 2. */
+ TYPE_BYTES = "TYPE_BYTES",
+ TYPE_UINT32 = "TYPE_UINT32",
+ TYPE_ENUM = "TYPE_ENUM",
+ TYPE_SFIXED32 = "TYPE_SFIXED32",
+ TYPE_SFIXED64 = "TYPE_SFIXED64",
+ /** TYPE_SINT32 - Uses ZigZag encoding. */
+ TYPE_SINT32 = "TYPE_SINT32",
+ /** TYPE_SINT64 - Uses ZigZag encoding. */
+ TYPE_SINT64 = "TYPE_SINT64",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function fieldDescriptorProto_TypeFromJSON(object: any): FieldDescriptorProto_Type {
+ switch (object) {
+ case 1:
+ case "TYPE_DOUBLE":
+ return FieldDescriptorProto_Type.TYPE_DOUBLE;
+ case 2:
+ case "TYPE_FLOAT":
+ return FieldDescriptorProto_Type.TYPE_FLOAT;
+ case 3:
+ case "TYPE_INT64":
+ return FieldDescriptorProto_Type.TYPE_INT64;
+ case 4:
+ case "TYPE_UINT64":
+ return FieldDescriptorProto_Type.TYPE_UINT64;
+ case 5:
+ case "TYPE_INT32":
+ return FieldDescriptorProto_Type.TYPE_INT32;
+ case 6:
+ case "TYPE_FIXED64":
+ return FieldDescriptorProto_Type.TYPE_FIXED64;
+ case 7:
+ case "TYPE_FIXED32":
+ return FieldDescriptorProto_Type.TYPE_FIXED32;
+ case 8:
+ case "TYPE_BOOL":
+ return FieldDescriptorProto_Type.TYPE_BOOL;
+ case 9:
+ case "TYPE_STRING":
+ return FieldDescriptorProto_Type.TYPE_STRING;
+ case 10:
+ case "TYPE_GROUP":
+ return FieldDescriptorProto_Type.TYPE_GROUP;
+ case 11:
+ case "TYPE_MESSAGE":
+ return FieldDescriptorProto_Type.TYPE_MESSAGE;
+ case 12:
+ case "TYPE_BYTES":
+ return FieldDescriptorProto_Type.TYPE_BYTES;
+ case 13:
+ case "TYPE_UINT32":
+ return FieldDescriptorProto_Type.TYPE_UINT32;
+ case 14:
+ case "TYPE_ENUM":
+ return FieldDescriptorProto_Type.TYPE_ENUM;
+ case 15:
+ case "TYPE_SFIXED32":
+ return FieldDescriptorProto_Type.TYPE_SFIXED32;
+ case 16:
+ case "TYPE_SFIXED64":
+ return FieldDescriptorProto_Type.TYPE_SFIXED64;
+ case 17:
+ case "TYPE_SINT32":
+ return FieldDescriptorProto_Type.TYPE_SINT32;
+ case 18:
+ case "TYPE_SINT64":
+ return FieldDescriptorProto_Type.TYPE_SINT64;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FieldDescriptorProto_Type.UNRECOGNIZED;
+ }
+}
+
+export function fieldDescriptorProto_TypeToNumber(object: FieldDescriptorProto_Type): number {
+ switch (object) {
+ case FieldDescriptorProto_Type.TYPE_DOUBLE:
+ return 1;
+ case FieldDescriptorProto_Type.TYPE_FLOAT:
+ return 2;
+ case FieldDescriptorProto_Type.TYPE_INT64:
+ return 3;
+ case FieldDescriptorProto_Type.TYPE_UINT64:
+ return 4;
+ case FieldDescriptorProto_Type.TYPE_INT32:
+ return 5;
+ case FieldDescriptorProto_Type.TYPE_FIXED64:
+ return 6;
+ case FieldDescriptorProto_Type.TYPE_FIXED32:
+ return 7;
+ case FieldDescriptorProto_Type.TYPE_BOOL:
+ return 8;
+ case FieldDescriptorProto_Type.TYPE_STRING:
+ return 9;
+ case FieldDescriptorProto_Type.TYPE_GROUP:
+ return 10;
+ case FieldDescriptorProto_Type.TYPE_MESSAGE:
+ return 11;
+ case FieldDescriptorProto_Type.TYPE_BYTES:
+ return 12;
+ case FieldDescriptorProto_Type.TYPE_UINT32:
+ return 13;
+ case FieldDescriptorProto_Type.TYPE_ENUM:
+ return 14;
+ case FieldDescriptorProto_Type.TYPE_SFIXED32:
+ return 15;
+ case FieldDescriptorProto_Type.TYPE_SFIXED64:
+ return 16;
+ case FieldDescriptorProto_Type.TYPE_SINT32:
+ return 17;
+ case FieldDescriptorProto_Type.TYPE_SINT64:
+ return 18;
+ case FieldDescriptorProto_Type.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export enum FieldDescriptorProto_Label {
+ /** LABEL_OPTIONAL - 0 is reserved for errors */
+ LABEL_OPTIONAL = "LABEL_OPTIONAL",
+ LABEL_REPEATED = "LABEL_REPEATED",
+ /**
+ * LABEL_REQUIRED - The required label is only allowed in google.protobuf. In proto3 and Editions
+ * it's explicitly prohibited. In Editions, the `field_presence` feature
+ * can be used to get this behavior.
+ */
+ LABEL_REQUIRED = "LABEL_REQUIRED",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function fieldDescriptorProto_LabelFromJSON(object: any): FieldDescriptorProto_Label {
+ switch (object) {
+ case 1:
+ case "LABEL_OPTIONAL":
+ return FieldDescriptorProto_Label.LABEL_OPTIONAL;
+ case 3:
+ case "LABEL_REPEATED":
+ return FieldDescriptorProto_Label.LABEL_REPEATED;
+ case 2:
+ case "LABEL_REQUIRED":
+ return FieldDescriptorProto_Label.LABEL_REQUIRED;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FieldDescriptorProto_Label.UNRECOGNIZED;
+ }
+}
+
+export function fieldDescriptorProto_LabelToNumber(object: FieldDescriptorProto_Label): number {
+ switch (object) {
+ case FieldDescriptorProto_Label.LABEL_OPTIONAL:
+ return 1;
+ case FieldDescriptorProto_Label.LABEL_REPEATED:
+ return 3;
+ case FieldDescriptorProto_Label.LABEL_REQUIRED:
+ return 2;
+ case FieldDescriptorProto_Label.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+/** Describes a oneof. */
+export interface OneofDescriptorProto {
+ name?: string | undefined;
+ options?: OneofOptions | undefined;
+}
+
+/** Describes an enum type. */
+export interface EnumDescriptorProto {
+ name?: string | undefined;
+ value: EnumValueDescriptorProto[];
+ options?:
+ | EnumOptions
+ | undefined;
+ /**
+ * Range of reserved numeric values. Reserved numeric values may not be used
+ * by enum values in the same enum declaration. Reserved ranges may not
+ * overlap.
+ */
+ reservedRange: EnumDescriptorProto_EnumReservedRange[];
+ /**
+ * Reserved enum value names, which may not be reused. A given name may only
+ * be reserved once.
+ */
+ reservedName: string[];
+}
+
+/**
+ * Range of reserved numeric values. Reserved values may not be used by
+ * entries in the same enum. Reserved ranges may not overlap.
+ *
+ * Note that this is distinct from DescriptorProto.ReservedRange in that it
+ * is inclusive such that it can appropriately represent the entire int32
+ * domain.
+ */
+export interface EnumDescriptorProto_EnumReservedRange {
+ /** Inclusive. */
+ start?:
+ | number
+ | undefined;
+ /** Inclusive. */
+ end?: number | undefined;
+}
+
+/** Describes a value within an enum. */
+export interface EnumValueDescriptorProto {
+ name?: string | undefined;
+ number?: number | undefined;
+ options?: EnumValueOptions | undefined;
+}
+
+/** Describes a service. */
+export interface ServiceDescriptorProto {
+ name?: string | undefined;
+ method: MethodDescriptorProto[];
+ options?: ServiceOptions | undefined;
+}
+
+/** Describes a method of a service. */
+export interface MethodDescriptorProto {
+ name?:
+ | string
+ | undefined;
+ /**
+ * Input and output type names. These are resolved in the same way as
+ * FieldDescriptorProto.type_name, but must refer to a message type.
+ */
+ inputType?: string | undefined;
+ outputType?: string | undefined;
+ options?:
+ | MethodOptions
+ | undefined;
+ /** Identifies if client streams multiple client messages */
+ clientStreaming?:
+ | boolean
+ | undefined;
+ /** Identifies if server streams multiple server messages */
+ serverStreaming?: boolean | undefined;
+}
+
+export interface FileOptions {
+ /**
+ * Sets the Java package where classes generated from this .proto will be
+ * placed. By default, the proto package is used, but this is often
+ * inappropriate because proto packages do not normally start with backwards
+ * domain names.
+ */
+ javaPackage?:
+ | string
+ | undefined;
+ /**
+ * Controls the name of the wrapper Java class generated for the .proto file.
+ * That class will always contain the .proto file's getDescriptor() method as
+ * well as any top-level extensions defined in the .proto file.
+ * If java_multiple_files is disabled, then all the other classes from the
+ * .proto file will be nested inside the single wrapper outer class.
+ */
+ javaOuterClassname?:
+ | string
+ | undefined;
+ /**
+ * If enabled, then the Java code generator will generate a separate .java
+ * file for each top-level message, enum, and service defined in the .proto
+ * file. Thus, these types will *not* be nested inside the wrapper class
+ * named by java_outer_classname. However, the wrapper class will still be
+ * generated to contain the file's getDescriptor() method as well as any
+ * top-level extensions defined in the file.
+ */
+ javaMultipleFiles?:
+ | boolean
+ | undefined;
+ /**
+ * This option does nothing.
+ *
+ * @deprecated
+ */
+ javaGenerateEqualsAndHash?:
+ | boolean
+ | undefined;
+ /**
+ * A proto2 file can set this to true to opt in to UTF-8 checking for Java,
+ * which will throw an exception if invalid UTF-8 is parsed from the wire or
+ * assigned to a string field.
+ *
+ * TODO: clarify exactly what kinds of field types this option
+ * applies to, and update these docs accordingly.
+ *
+ * Proto3 files already perform these checks. Setting the option explicitly to
+ * false has no effect: it cannot be used to opt proto3 files out of UTF-8
+ * checks.
+ */
+ javaStringCheckUtf8?: boolean | undefined;
+ optimizeFor?:
+ | FileOptions_OptimizeMode
+ | undefined;
+ /**
+ * Sets the Go package where structs generated from this .proto will be
+ * placed. If omitted, the Go package will be derived from the following:
+ * - The basename of the package import path, if provided.
+ * - Otherwise, the package statement in the .proto file, if present.
+ * - Otherwise, the basename of the .proto file, without extension.
+ */
+ goPackage?:
+ | string
+ | undefined;
+ /**
+ * Should generic services be generated in each language? "Generic" services
+ * are not specific to any particular RPC system. They are generated by the
+ * main code generators in each language (without additional plugins).
+ * Generic services were the only kind of service generation supported by
+ * early versions of google.protobuf.
+ *
+ * Generic services are now considered deprecated in favor of using plugins
+ * that generate code specific to your particular RPC system. Therefore,
+ * these default to false. Old code which depends on generic services should
+ * explicitly set them to true.
+ */
+ ccGenericServices?: boolean | undefined;
+ javaGenericServices?: boolean | undefined;
+ pyGenericServices?:
+ | boolean
+ | undefined;
+ /**
+ * Is this file deprecated?
+ * Depending on the target platform, this can emit Deprecated annotations
+ * for everything in the file, or it will be completely ignored; in the very
+ * least, this is a formalization for deprecating files.
+ */
+ deprecated?:
+ | boolean
+ | undefined;
+ /**
+ * Enables the use of arenas for the proto messages in this file. This applies
+ * only to generated classes for C++.
+ */
+ ccEnableArenas?:
+ | boolean
+ | undefined;
+ /**
+ * Sets the objective c class prefix which is prepended to all objective c
+ * generated classes from this .proto. There is no default.
+ */
+ objcClassPrefix?:
+ | string
+ | undefined;
+ /** Namespace for generated classes; defaults to the package. */
+ csharpNamespace?:
+ | string
+ | undefined;
+ /**
+ * By default Swift generators will take the proto package and CamelCase it
+ * replacing '.' with underscore and use that to prefix the types/symbols
+ * defined. When this options is provided, they will use this value instead
+ * to prefix the types/symbols defined.
+ */
+ swiftPrefix?:
+ | string
+ | undefined;
+ /**
+ * Sets the php class prefix which is prepended to all php generated classes
+ * from this .proto. Default is empty.
+ */
+ phpClassPrefix?:
+ | string
+ | undefined;
+ /**
+ * Use this option to change the namespace of php generated classes. Default
+ * is empty. When this option is empty, the package name will be used for
+ * determining the namespace.
+ */
+ phpNamespace?:
+ | string
+ | undefined;
+ /**
+ * Use this option to change the namespace of php generated metadata classes.
+ * Default is empty. When this option is empty, the proto file name will be
+ * used for determining the namespace.
+ */
+ phpMetadataNamespace?:
+ | string
+ | undefined;
+ /**
+ * Use this option to change the package of ruby generated classes. Default
+ * is empty. When this option is not set, the package name will be used for
+ * determining the ruby package.
+ */
+ rubyPackage?:
+ | string
+ | undefined;
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /**
+ * The parser stores options it doesn't recognize here.
+ * See the documentation for the "Options" section above.
+ */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+/** Generated classes can be optimized for speed or code size. */
+export enum FileOptions_OptimizeMode {
+ /** SPEED - Generate complete code for parsing, serialization, */
+ SPEED = "SPEED",
+ /** CODE_SIZE - etc. */
+ CODE_SIZE = "CODE_SIZE",
+ /** LITE_RUNTIME - Generate code using MessageLite and the lite runtime. */
+ LITE_RUNTIME = "LITE_RUNTIME",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function fileOptions_OptimizeModeFromJSON(object: any): FileOptions_OptimizeMode {
+ switch (object) {
+ case 1:
+ case "SPEED":
+ return FileOptions_OptimizeMode.SPEED;
+ case 2:
+ case "CODE_SIZE":
+ return FileOptions_OptimizeMode.CODE_SIZE;
+ case 3:
+ case "LITE_RUNTIME":
+ return FileOptions_OptimizeMode.LITE_RUNTIME;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FileOptions_OptimizeMode.UNRECOGNIZED;
+ }
+}
+
+export function fileOptions_OptimizeModeToNumber(object: FileOptions_OptimizeMode): number {
+ switch (object) {
+ case FileOptions_OptimizeMode.SPEED:
+ return 1;
+ case FileOptions_OptimizeMode.CODE_SIZE:
+ return 2;
+ case FileOptions_OptimizeMode.LITE_RUNTIME:
+ return 3;
+ case FileOptions_OptimizeMode.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export interface MessageOptions {
+ /**
+ * Set true to use the old proto1 MessageSet wire format for extensions.
+ * This is provided for backwards-compatibility with the MessageSet wire
+ * format. You should not use this for any other reason: It's less
+ * efficient, has fewer features, and is more complicated.
+ *
+ * The message must be defined exactly as follows:
+ * message Foo {
+ * option message_set_wire_format = true;
+ * extensions 4 to max;
+ * }
+ * Note that the message cannot have any defined fields; MessageSets only
+ * have extensions.
+ *
+ * All extensions of your type must be singular messages; e.g. they cannot
+ * be int32s, enums, or repeated messages.
+ *
+ * Because this is an option, the above two restrictions are not enforced by
+ * the protocol compiler.
+ */
+ messageSetWireFormat?:
+ | boolean
+ | undefined;
+ /**
+ * Disables the generation of the standard "descriptor()" accessor, which can
+ * conflict with a field of the same name. This is meant to make migration
+ * from proto1 easier; new code should avoid fields named "descriptor".
+ */
+ noStandardDescriptorAccessor?:
+ | boolean
+ | undefined;
+ /**
+ * Is this message deprecated?
+ * Depending on the target platform, this can emit Deprecated annotations
+ * for the message, or it will be completely ignored; in the very least,
+ * this is a formalization for deprecating messages.
+ */
+ deprecated?:
+ | boolean
+ | undefined;
+ /**
+ * Whether the message is an automatically generated map entry type for the
+ * maps field.
+ *
+ * For maps fields:
+ * map map_field = 1;
+ * The parsed descriptor looks like:
+ * message MapFieldEntry {
+ * option map_entry = true;
+ * optional KeyType key = 1;
+ * optional ValueType value = 2;
+ * }
+ * repeated MapFieldEntry map_field = 1;
+ *
+ * Implementations may choose not to generate the map_entry=true message, but
+ * use a native map in the target language to hold the keys and values.
+ * The reflection APIs in such implementations still need to work as
+ * if the field is a repeated message field.
+ *
+ * NOTE: Do not set the option in .proto files. Always use the maps syntax
+ * instead. The option should only be implicitly set by the proto compiler
+ * parser.
+ */
+ mapEntry?:
+ | boolean
+ | undefined;
+ /**
+ * Enable the legacy handling of JSON field name conflicts. This lowercases
+ * and strips underscored from the fields before comparison in proto3 only.
+ * The new behavior takes `json_name` into account and applies to proto2 as
+ * well.
+ *
+ * This should only be used as a temporary measure against broken builds due
+ * to the change in behavior for JSON field name conflicts.
+ *
+ * TODO This is legacy behavior we plan to remove once downstream
+ * teams have had time to migrate.
+ *
+ * @deprecated
+ */
+ deprecatedLegacyJsonFieldConflicts?:
+ | boolean
+ | undefined;
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+export interface FieldOptions {
+ /**
+ * The ctype option instructs the C++ code generator to use a different
+ * representation of the field than it normally would. See the specific
+ * options below. This option is only implemented to support use of
+ * [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of
+ * type "bytes" in the open source release -- sorry, we'll try to include
+ * other types in a future version!
+ */
+ ctype?:
+ | FieldOptions_CType
+ | undefined;
+ /**
+ * The packed option can be enabled for repeated primitive fields to enable
+ * a more efficient representation on the wire. Rather than repeatedly
+ * writing the tag and type for each element, the entire array is encoded as
+ * a single length-delimited blob. In proto3, only explicit setting it to
+ * false will avoid using packed encoding. This option is prohibited in
+ * Editions, but the `repeated_field_encoding` feature can be used to control
+ * the behavior.
+ */
+ packed?:
+ | boolean
+ | undefined;
+ /**
+ * The jstype option determines the JavaScript type used for values of the
+ * field. The option is permitted only for 64 bit integral and fixed types
+ * (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING
+ * is represented as JavaScript string, which avoids loss of precision that
+ * can happen when a large value is converted to a floating point JavaScript.
+ * Specifying JS_NUMBER for the jstype causes the generated JavaScript code to
+ * use the JavaScript "number" type. The behavior of the default option
+ * JS_NORMAL is implementation dependent.
+ *
+ * This option is an enum to permit additional types to be added, e.g.
+ * goog.math.Integer.
+ */
+ jstype?:
+ | FieldOptions_JSType
+ | undefined;
+ /**
+ * Should this field be parsed lazily? Lazy applies only to message-type
+ * fields. It means that when the outer message is initially parsed, the
+ * inner message's contents will not be parsed but instead stored in encoded
+ * form. The inner message will actually be parsed when it is first accessed.
+ *
+ * This is only a hint. Implementations are free to choose whether to use
+ * eager or lazy parsing regardless of the value of this option. However,
+ * setting this option true suggests that the protocol author believes that
+ * using lazy parsing on this field is worth the additional bookkeeping
+ * overhead typically needed to implement it.
+ *
+ * This option does not affect the public interface of any generated code;
+ * all method signatures remain the same. Furthermore, thread-safety of the
+ * interface is not affected by this option; const methods remain safe to
+ * call from multiple threads concurrently, while non-const methods continue
+ * to require exclusive access.
+ *
+ * Note that lazy message fields are still eagerly verified to check
+ * ill-formed wireformat or missing required fields. Calling IsInitialized()
+ * on the outer message would fail if the inner message has missing required
+ * fields. Failed verification would result in parsing failure (except when
+ * uninitialized messages are acceptable).
+ */
+ lazy?:
+ | boolean
+ | undefined;
+ /**
+ * unverified_lazy does no correctness checks on the byte stream. This should
+ * only be used where lazy with verification is prohibitive for performance
+ * reasons.
+ */
+ unverifiedLazy?:
+ | boolean
+ | undefined;
+ /**
+ * Is this field deprecated?
+ * Depending on the target platform, this can emit Deprecated annotations
+ * for accessors, or it will be completely ignored; in the very least, this
+ * is a formalization for deprecating fields.
+ */
+ deprecated?:
+ | boolean
+ | undefined;
+ /** For Google-internal migration only. Do not use. */
+ weak?:
+ | boolean
+ | undefined;
+ /**
+ * Indicate that the field value should not be printed out when using debug
+ * formats, e.g. when the field contains sensitive credentials.
+ */
+ debugRedact?: boolean | undefined;
+ retention?: FieldOptions_OptionRetention | undefined;
+ targets: FieldOptions_OptionTargetType[];
+ editionDefaults: FieldOptions_EditionDefault[];
+ /** Any features defined in the specific edition. */
+ features?: FeatureSet | undefined;
+ featureSupport?:
+ | FieldOptions_FeatureSupport
+ | undefined;
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+export enum FieldOptions_CType {
+ /** STRING - Default mode. */
+ STRING = "STRING",
+ /**
+ * CORD - The option [ctype=CORD] may be applied to a non-repeated field of type
+ * "bytes". It indicates that in C++, the data should be stored in a Cord
+ * instead of a string. For very large strings, this may reduce memory
+ * fragmentation. It may also allow better performance when parsing from a
+ * Cord, or when parsing with aliasing enabled, as the parsed Cord may then
+ * alias the original buffer.
+ */
+ CORD = "CORD",
+ STRING_PIECE = "STRING_PIECE",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function fieldOptions_CTypeFromJSON(object: any): FieldOptions_CType {
+ switch (object) {
+ case 0:
+ case "STRING":
+ return FieldOptions_CType.STRING;
+ case 1:
+ case "CORD":
+ return FieldOptions_CType.CORD;
+ case 2:
+ case "STRING_PIECE":
+ return FieldOptions_CType.STRING_PIECE;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FieldOptions_CType.UNRECOGNIZED;
+ }
+}
+
+export function fieldOptions_CTypeToNumber(object: FieldOptions_CType): number {
+ switch (object) {
+ case FieldOptions_CType.STRING:
+ return 0;
+ case FieldOptions_CType.CORD:
+ return 1;
+ case FieldOptions_CType.STRING_PIECE:
+ return 2;
+ case FieldOptions_CType.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export enum FieldOptions_JSType {
+ /** JS_NORMAL - Use the default type. */
+ JS_NORMAL = "JS_NORMAL",
+ /** JS_STRING - Use JavaScript strings. */
+ JS_STRING = "JS_STRING",
+ /** JS_NUMBER - Use JavaScript numbers. */
+ JS_NUMBER = "JS_NUMBER",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function fieldOptions_JSTypeFromJSON(object: any): FieldOptions_JSType {
+ switch (object) {
+ case 0:
+ case "JS_NORMAL":
+ return FieldOptions_JSType.JS_NORMAL;
+ case 1:
+ case "JS_STRING":
+ return FieldOptions_JSType.JS_STRING;
+ case 2:
+ case "JS_NUMBER":
+ return FieldOptions_JSType.JS_NUMBER;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FieldOptions_JSType.UNRECOGNIZED;
+ }
+}
+
+export function fieldOptions_JSTypeToNumber(object: FieldOptions_JSType): number {
+ switch (object) {
+ case FieldOptions_JSType.JS_NORMAL:
+ return 0;
+ case FieldOptions_JSType.JS_STRING:
+ return 1;
+ case FieldOptions_JSType.JS_NUMBER:
+ return 2;
+ case FieldOptions_JSType.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+/**
+ * If set to RETENTION_SOURCE, the option will be omitted from the binary.
+ * Note: as of January 2023, support for this is in progress and does not yet
+ * have an effect (b/264593489).
+ */
+export enum FieldOptions_OptionRetention {
+ RETENTION_UNKNOWN = "RETENTION_UNKNOWN",
+ RETENTION_RUNTIME = "RETENTION_RUNTIME",
+ RETENTION_SOURCE = "RETENTION_SOURCE",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function fieldOptions_OptionRetentionFromJSON(object: any): FieldOptions_OptionRetention {
+ switch (object) {
+ case 0:
+ case "RETENTION_UNKNOWN":
+ return FieldOptions_OptionRetention.RETENTION_UNKNOWN;
+ case 1:
+ case "RETENTION_RUNTIME":
+ return FieldOptions_OptionRetention.RETENTION_RUNTIME;
+ case 2:
+ case "RETENTION_SOURCE":
+ return FieldOptions_OptionRetention.RETENTION_SOURCE;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FieldOptions_OptionRetention.UNRECOGNIZED;
+ }
+}
+
+export function fieldOptions_OptionRetentionToNumber(object: FieldOptions_OptionRetention): number {
+ switch (object) {
+ case FieldOptions_OptionRetention.RETENTION_UNKNOWN:
+ return 0;
+ case FieldOptions_OptionRetention.RETENTION_RUNTIME:
+ return 1;
+ case FieldOptions_OptionRetention.RETENTION_SOURCE:
+ return 2;
+ case FieldOptions_OptionRetention.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+/**
+ * This indicates the types of entities that the field may apply to when used
+ * as an option. If it is unset, then the field may be freely used as an
+ * option on any kind of entity. Note: as of January 2023, support for this is
+ * in progress and does not yet have an effect (b/264593489).
+ */
+export enum FieldOptions_OptionTargetType {
+ TARGET_TYPE_UNKNOWN = "TARGET_TYPE_UNKNOWN",
+ TARGET_TYPE_FILE = "TARGET_TYPE_FILE",
+ TARGET_TYPE_EXTENSION_RANGE = "TARGET_TYPE_EXTENSION_RANGE",
+ TARGET_TYPE_MESSAGE = "TARGET_TYPE_MESSAGE",
+ TARGET_TYPE_FIELD = "TARGET_TYPE_FIELD",
+ TARGET_TYPE_ONEOF = "TARGET_TYPE_ONEOF",
+ TARGET_TYPE_ENUM = "TARGET_TYPE_ENUM",
+ TARGET_TYPE_ENUM_ENTRY = "TARGET_TYPE_ENUM_ENTRY",
+ TARGET_TYPE_SERVICE = "TARGET_TYPE_SERVICE",
+ TARGET_TYPE_METHOD = "TARGET_TYPE_METHOD",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function fieldOptions_OptionTargetTypeFromJSON(object: any): FieldOptions_OptionTargetType {
+ switch (object) {
+ case 0:
+ case "TARGET_TYPE_UNKNOWN":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_UNKNOWN;
+ case 1:
+ case "TARGET_TYPE_FILE":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_FILE;
+ case 2:
+ case "TARGET_TYPE_EXTENSION_RANGE":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_EXTENSION_RANGE;
+ case 3:
+ case "TARGET_TYPE_MESSAGE":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_MESSAGE;
+ case 4:
+ case "TARGET_TYPE_FIELD":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_FIELD;
+ case 5:
+ case "TARGET_TYPE_ONEOF":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_ONEOF;
+ case 6:
+ case "TARGET_TYPE_ENUM":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_ENUM;
+ case 7:
+ case "TARGET_TYPE_ENUM_ENTRY":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_ENUM_ENTRY;
+ case 8:
+ case "TARGET_TYPE_SERVICE":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_SERVICE;
+ case 9:
+ case "TARGET_TYPE_METHOD":
+ return FieldOptions_OptionTargetType.TARGET_TYPE_METHOD;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FieldOptions_OptionTargetType.UNRECOGNIZED;
+ }
+}
+
+export function fieldOptions_OptionTargetTypeToNumber(object: FieldOptions_OptionTargetType): number {
+ switch (object) {
+ case FieldOptions_OptionTargetType.TARGET_TYPE_UNKNOWN:
+ return 0;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_FILE:
+ return 1;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_EXTENSION_RANGE:
+ return 2;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_MESSAGE:
+ return 3;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_FIELD:
+ return 4;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_ONEOF:
+ return 5;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_ENUM:
+ return 6;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_ENUM_ENTRY:
+ return 7;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_SERVICE:
+ return 8;
+ case FieldOptions_OptionTargetType.TARGET_TYPE_METHOD:
+ return 9;
+ case FieldOptions_OptionTargetType.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export interface FieldOptions_EditionDefault {
+ edition?:
+ | Edition
+ | undefined;
+ /** Textproto value. */
+ value?: string | undefined;
+}
+
+/** Information about the support window of a feature. */
+export interface FieldOptions_FeatureSupport {
+ /**
+ * The edition that this feature was first available in. In editions
+ * earlier than this one, the default assigned to EDITION_LEGACY will be
+ * used, and proto files will not be able to override it.
+ */
+ editionIntroduced?:
+ | Edition
+ | undefined;
+ /**
+ * The edition this feature becomes deprecated in. Using this after this
+ * edition may trigger warnings.
+ */
+ editionDeprecated?:
+ | Edition
+ | undefined;
+ /**
+ * The deprecation warning text if this feature is used after the edition it
+ * was marked deprecated in.
+ */
+ deprecationWarning?:
+ | string
+ | undefined;
+ /**
+ * The edition this feature is no longer available in. In editions after
+ * this one, the last default assigned will be used, and proto files will
+ * not be able to override it.
+ */
+ editionRemoved?: Edition | undefined;
+}
+
+export interface OneofOptions {
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+export interface EnumOptions {
+ /**
+ * Set this option to true to allow mapping different tag names to the same
+ * value.
+ */
+ allowAlias?:
+ | boolean
+ | undefined;
+ /**
+ * Is this enum deprecated?
+ * Depending on the target platform, this can emit Deprecated annotations
+ * for the enum, or it will be completely ignored; in the very least, this
+ * is a formalization for deprecating enums.
+ */
+ deprecated?:
+ | boolean
+ | undefined;
+ /**
+ * Enable the legacy handling of JSON field name conflicts. This lowercases
+ * and strips underscored from the fields before comparison in proto3 only.
+ * The new behavior takes `json_name` into account and applies to proto2 as
+ * well.
+ * TODO Remove this legacy behavior once downstream teams have
+ * had time to migrate.
+ *
+ * @deprecated
+ */
+ deprecatedLegacyJsonFieldConflicts?:
+ | boolean
+ | undefined;
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+export interface EnumValueOptions {
+ /**
+ * Is this enum value deprecated?
+ * Depending on the target platform, this can emit Deprecated annotations
+ * for the enum value, or it will be completely ignored; in the very least,
+ * this is a formalization for deprecating enum values.
+ */
+ deprecated?:
+ | boolean
+ | undefined;
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /**
+ * Indicate that fields annotated with this enum value should not be printed
+ * out when using debug formats, e.g. when the field contains sensitive
+ * credentials.
+ */
+ debugRedact?:
+ | boolean
+ | undefined;
+ /** Information about the support window of a feature value. */
+ featureSupport?:
+ | FieldOptions_FeatureSupport
+ | undefined;
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+export interface ServiceOptions {
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /**
+ * Is this service deprecated?
+ * Depending on the target platform, this can emit Deprecated annotations
+ * for the service, or it will be completely ignored; in the very least,
+ * this is a formalization for deprecating services.
+ */
+ deprecated?:
+ | boolean
+ | undefined;
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+export interface MethodOptions {
+ /**
+ * Is this method deprecated?
+ * Depending on the target platform, this can emit Deprecated annotations
+ * for the method, or it will be completely ignored; in the very least,
+ * this is a formalization for deprecating methods.
+ */
+ deprecated?: boolean | undefined;
+ idempotencyLevel?:
+ | MethodOptions_IdempotencyLevel
+ | undefined;
+ /** Any features defined in the specific edition. */
+ features?:
+ | FeatureSet
+ | undefined;
+ /** The parser stores options it doesn't recognize here. See above. */
+ uninterpretedOption: UninterpretedOption[];
+}
+
+/**
+ * Is this method side-effect-free (or safe in HTTP parlance), or idempotent,
+ * or neither? HTTP based RPC implementation may choose GET verb for safe
+ * methods, and PUT verb for idempotent methods instead of the default POST.
+ */
+export enum MethodOptions_IdempotencyLevel {
+ IDEMPOTENCY_UNKNOWN = "IDEMPOTENCY_UNKNOWN",
+ /** NO_SIDE_EFFECTS - implies idempotent */
+ NO_SIDE_EFFECTS = "NO_SIDE_EFFECTS",
+ /** IDEMPOTENT - idempotent, but may have side effects */
+ IDEMPOTENT = "IDEMPOTENT",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function methodOptions_IdempotencyLevelFromJSON(object: any): MethodOptions_IdempotencyLevel {
+ switch (object) {
+ case 0:
+ case "IDEMPOTENCY_UNKNOWN":
+ return MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN;
+ case 1:
+ case "NO_SIDE_EFFECTS":
+ return MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS;
+ case 2:
+ case "IDEMPOTENT":
+ return MethodOptions_IdempotencyLevel.IDEMPOTENT;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return MethodOptions_IdempotencyLevel.UNRECOGNIZED;
+ }
+}
+
+export function methodOptions_IdempotencyLevelToNumber(object: MethodOptions_IdempotencyLevel): number {
+ switch (object) {
+ case MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN:
+ return 0;
+ case MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS:
+ return 1;
+ case MethodOptions_IdempotencyLevel.IDEMPOTENT:
+ return 2;
+ case MethodOptions_IdempotencyLevel.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+/**
+ * A message representing a option the parser does not recognize. This only
+ * appears in options protos created by the compiler::Parser class.
+ * DescriptorPool resolves these when building Descriptor objects. Therefore,
+ * options protos in descriptor objects (e.g. returned by Descriptor::options(),
+ * or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
+ * in them.
+ */
+export interface UninterpretedOption {
+ name: UninterpretedOption_NamePart[];
+ /**
+ * The value of the uninterpreted option, in whatever type the tokenizer
+ * identified it as during parsing. Exactly one of these should be set.
+ */
+ identifierValue?: string | undefined;
+ positiveIntValue?: number | undefined;
+ negativeIntValue?: number | undefined;
+ doubleValue?: number | undefined;
+ stringValue?: Uint8Array | undefined;
+ aggregateValue?: string | undefined;
+}
+
+/**
+ * The name of the uninterpreted option. Each string represents a segment in
+ * a dot-separated name. is_extension is true iff a segment represents an
+ * extension (denoted with parentheses in options specs in .proto files).
+ * E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents
+ * "foo.(bar.baz).moo".
+ */
+export interface UninterpretedOption_NamePart {
+ namePart: string;
+ isExtension: boolean;
+}
+
+/**
+ * TODO Enums in C++ gencode (and potentially other languages) are
+ * not well scoped. This means that each of the feature enums below can clash
+ * with each other. The short names we've chosen maximize call-site
+ * readability, but leave us very open to this scenario. A future feature will
+ * be designed and implemented to handle this, hopefully before we ever hit a
+ * conflict here.
+ */
+export interface FeatureSet {
+ fieldPresence?: FeatureSet_FieldPresence | undefined;
+ enumType?: FeatureSet_EnumType | undefined;
+ repeatedFieldEncoding?: FeatureSet_RepeatedFieldEncoding | undefined;
+ utf8Validation?: FeatureSet_Utf8Validation | undefined;
+ messageEncoding?: FeatureSet_MessageEncoding | undefined;
+ jsonFormat?: FeatureSet_JsonFormat | undefined;
+}
+
+export enum FeatureSet_FieldPresence {
+ FIELD_PRESENCE_UNKNOWN = "FIELD_PRESENCE_UNKNOWN",
+ EXPLICIT = "EXPLICIT",
+ IMPLICIT = "IMPLICIT",
+ LEGACY_REQUIRED = "LEGACY_REQUIRED",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function featureSet_FieldPresenceFromJSON(object: any): FeatureSet_FieldPresence {
+ switch (object) {
+ case 0:
+ case "FIELD_PRESENCE_UNKNOWN":
+ return FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN;
+ case 1:
+ case "EXPLICIT":
+ return FeatureSet_FieldPresence.EXPLICIT;
+ case 2:
+ case "IMPLICIT":
+ return FeatureSet_FieldPresence.IMPLICIT;
+ case 3:
+ case "LEGACY_REQUIRED":
+ return FeatureSet_FieldPresence.LEGACY_REQUIRED;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FeatureSet_FieldPresence.UNRECOGNIZED;
+ }
+}
+
+export function featureSet_FieldPresenceToNumber(object: FeatureSet_FieldPresence): number {
+ switch (object) {
+ case FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN:
+ return 0;
+ case FeatureSet_FieldPresence.EXPLICIT:
+ return 1;
+ case FeatureSet_FieldPresence.IMPLICIT:
+ return 2;
+ case FeatureSet_FieldPresence.LEGACY_REQUIRED:
+ return 3;
+ case FeatureSet_FieldPresence.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export enum FeatureSet_EnumType {
+ ENUM_TYPE_UNKNOWN = "ENUM_TYPE_UNKNOWN",
+ OPEN = "OPEN",
+ CLOSED = "CLOSED",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function featureSet_EnumTypeFromJSON(object: any): FeatureSet_EnumType {
+ switch (object) {
+ case 0:
+ case "ENUM_TYPE_UNKNOWN":
+ return FeatureSet_EnumType.ENUM_TYPE_UNKNOWN;
+ case 1:
+ case "OPEN":
+ return FeatureSet_EnumType.OPEN;
+ case 2:
+ case "CLOSED":
+ return FeatureSet_EnumType.CLOSED;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FeatureSet_EnumType.UNRECOGNIZED;
+ }
+}
+
+export function featureSet_EnumTypeToNumber(object: FeatureSet_EnumType): number {
+ switch (object) {
+ case FeatureSet_EnumType.ENUM_TYPE_UNKNOWN:
+ return 0;
+ case FeatureSet_EnumType.OPEN:
+ return 1;
+ case FeatureSet_EnumType.CLOSED:
+ return 2;
+ case FeatureSet_EnumType.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export enum FeatureSet_RepeatedFieldEncoding {
+ REPEATED_FIELD_ENCODING_UNKNOWN = "REPEATED_FIELD_ENCODING_UNKNOWN",
+ PACKED = "PACKED",
+ EXPANDED = "EXPANDED",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function featureSet_RepeatedFieldEncodingFromJSON(object: any): FeatureSet_RepeatedFieldEncoding {
+ switch (object) {
+ case 0:
+ case "REPEATED_FIELD_ENCODING_UNKNOWN":
+ return FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN;
+ case 1:
+ case "PACKED":
+ return FeatureSet_RepeatedFieldEncoding.PACKED;
+ case 2:
+ case "EXPANDED":
+ return FeatureSet_RepeatedFieldEncoding.EXPANDED;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FeatureSet_RepeatedFieldEncoding.UNRECOGNIZED;
+ }
+}
+
+export function featureSet_RepeatedFieldEncodingToNumber(object: FeatureSet_RepeatedFieldEncoding): number {
+ switch (object) {
+ case FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN:
+ return 0;
+ case FeatureSet_RepeatedFieldEncoding.PACKED:
+ return 1;
+ case FeatureSet_RepeatedFieldEncoding.EXPANDED:
+ return 2;
+ case FeatureSet_RepeatedFieldEncoding.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export enum FeatureSet_Utf8Validation {
+ UTF8_VALIDATION_UNKNOWN = "UTF8_VALIDATION_UNKNOWN",
+ VERIFY = "VERIFY",
+ NONE = "NONE",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function featureSet_Utf8ValidationFromJSON(object: any): FeatureSet_Utf8Validation {
+ switch (object) {
+ case 0:
+ case "UTF8_VALIDATION_UNKNOWN":
+ return FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN;
+ case 2:
+ case "VERIFY":
+ return FeatureSet_Utf8Validation.VERIFY;
+ case 3:
+ case "NONE":
+ return FeatureSet_Utf8Validation.NONE;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FeatureSet_Utf8Validation.UNRECOGNIZED;
+ }
+}
+
+export function featureSet_Utf8ValidationToNumber(object: FeatureSet_Utf8Validation): number {
+ switch (object) {
+ case FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN:
+ return 0;
+ case FeatureSet_Utf8Validation.VERIFY:
+ return 2;
+ case FeatureSet_Utf8Validation.NONE:
+ return 3;
+ case FeatureSet_Utf8Validation.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export enum FeatureSet_MessageEncoding {
+ MESSAGE_ENCODING_UNKNOWN = "MESSAGE_ENCODING_UNKNOWN",
+ LENGTH_PREFIXED = "LENGTH_PREFIXED",
+ DELIMITED = "DELIMITED",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function featureSet_MessageEncodingFromJSON(object: any): FeatureSet_MessageEncoding {
+ switch (object) {
+ case 0:
+ case "MESSAGE_ENCODING_UNKNOWN":
+ return FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN;
+ case 1:
+ case "LENGTH_PREFIXED":
+ return FeatureSet_MessageEncoding.LENGTH_PREFIXED;
+ case 2:
+ case "DELIMITED":
+ return FeatureSet_MessageEncoding.DELIMITED;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FeatureSet_MessageEncoding.UNRECOGNIZED;
+ }
+}
+
+export function featureSet_MessageEncodingToNumber(object: FeatureSet_MessageEncoding): number {
+ switch (object) {
+ case FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN:
+ return 0;
+ case FeatureSet_MessageEncoding.LENGTH_PREFIXED:
+ return 1;
+ case FeatureSet_MessageEncoding.DELIMITED:
+ return 2;
+ case FeatureSet_MessageEncoding.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+export enum FeatureSet_JsonFormat {
+ JSON_FORMAT_UNKNOWN = "JSON_FORMAT_UNKNOWN",
+ ALLOW = "ALLOW",
+ LEGACY_BEST_EFFORT = "LEGACY_BEST_EFFORT",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function featureSet_JsonFormatFromJSON(object: any): FeatureSet_JsonFormat {
+ switch (object) {
+ case 0:
+ case "JSON_FORMAT_UNKNOWN":
+ return FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN;
+ case 1:
+ case "ALLOW":
+ return FeatureSet_JsonFormat.ALLOW;
+ case 2:
+ case "LEGACY_BEST_EFFORT":
+ return FeatureSet_JsonFormat.LEGACY_BEST_EFFORT;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return FeatureSet_JsonFormat.UNRECOGNIZED;
+ }
+}
+
+export function featureSet_JsonFormatToNumber(object: FeatureSet_JsonFormat): number {
+ switch (object) {
+ case FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN:
+ return 0;
+ case FeatureSet_JsonFormat.ALLOW:
+ return 1;
+ case FeatureSet_JsonFormat.LEGACY_BEST_EFFORT:
+ return 2;
+ case FeatureSet_JsonFormat.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+/**
+ * A compiled specification for the defaults of a set of features. These
+ * messages are generated from FeatureSet extensions and can be used to seed
+ * feature resolution. The resolution with this object becomes a simple search
+ * for the closest matching edition, followed by proto merges.
+ */
+export interface FeatureSetDefaults {
+ defaults: FeatureSetDefaults_FeatureSetEditionDefault[];
+ /**
+ * The minimum supported edition (inclusive) when this was constructed.
+ * Editions before this will not have defaults.
+ */
+ minimumEdition?:
+ | Edition
+ | undefined;
+ /**
+ * The maximum known edition (inclusive) when this was constructed. Editions
+ * after this will not have reliable defaults.
+ */
+ maximumEdition?: Edition | undefined;
+}
+
+/**
+ * A map from every known edition with a unique set of defaults to its
+ * defaults. Not all editions may be contained here. For a given edition,
+ * the defaults at the closest matching edition ordered at or before it should
+ * be used. This field must be in strict ascending order by edition.
+ */
+export interface FeatureSetDefaults_FeatureSetEditionDefault {
+ edition?:
+ | Edition
+ | undefined;
+ /** Defaults of features that can be overridden in this edition. */
+ overridableFeatures?:
+ | FeatureSet
+ | undefined;
+ /** Defaults of features that can't be overridden in this edition. */
+ fixedFeatures?: FeatureSet | undefined;
+}
+
+/**
+ * Encapsulates information about the original source file from which a
+ * FileDescriptorProto was generated.
+ */
+export interface SourceCodeInfo {
+ /**
+ * A Location identifies a piece of source code in a .proto file which
+ * corresponds to a particular definition. This information is intended
+ * to be useful to IDEs, code indexers, documentation generators, and similar
+ * tools.
+ *
+ * For example, say we have a file like:
+ * message Foo {
+ * optional string foo = 1;
+ * }
+ * Let's look at just the field definition:
+ * optional string foo = 1;
+ * ^ ^^ ^^ ^ ^^^
+ * a bc de f ghi
+ * We have the following locations:
+ * span path represents
+ * [a,i) [ 4, 0, 2, 0 ] The whole field definition.
+ * [a,b) [ 4, 0, 2, 0, 4 ] The label (optional).
+ * [c,d) [ 4, 0, 2, 0, 5 ] The type (string).
+ * [e,f) [ 4, 0, 2, 0, 1 ] The name (foo).
+ * [g,h) [ 4, 0, 2, 0, 3 ] The number (1).
+ *
+ * Notes:
+ * - A location may refer to a repeated field itself (i.e. not to any
+ * particular index within it). This is used whenever a set of elements are
+ * logically enclosed in a single code segment. For example, an entire
+ * extend block (possibly containing multiple extension definitions) will
+ * have an outer location whose path refers to the "extensions" repeated
+ * field without an index.
+ * - Multiple locations may have the same path. This happens when a single
+ * logical declaration is spread out across multiple places. The most
+ * obvious example is the "extend" block again -- there may be multiple
+ * extend blocks in the same scope, each of which will have the same path.
+ * - A location's span is not always a subset of its parent's span. For
+ * example, the "extendee" of an extension declaration appears at the
+ * beginning of the "extend" block and is shared by all extensions within
+ * the block.
+ * - Just because a location's span is a subset of some other location's span
+ * does not mean that it is a descendant. For example, a "group" defines
+ * both a type and a field in a single declaration. Thus, the locations
+ * corresponding to the type and field and their components will overlap.
+ * - Code which tries to interpret locations should probably be designed to
+ * ignore those that it doesn't understand, as more types of locations could
+ * be recorded in the future.
+ */
+ location: SourceCodeInfo_Location[];
+}
+
+export interface SourceCodeInfo_Location {
+ /**
+ * Identifies which part of the FileDescriptorProto was defined at this
+ * location.
+ *
+ * Each element is a field number or an index. They form a path from
+ * the root FileDescriptorProto to the place where the definition appears.
+ * For example, this path:
+ * [ 4, 3, 2, 7, 1 ]
+ * refers to:
+ * file.message_type(3) // 4, 3
+ * .field(7) // 2, 7
+ * .name() // 1
+ * This is because FileDescriptorProto.message_type has field number 4:
+ * repeated DescriptorProto message_type = 4;
+ * and DescriptorProto.field has field number 2:
+ * repeated FieldDescriptorProto field = 2;
+ * and FieldDescriptorProto.name has field number 1:
+ * optional string name = 1;
+ *
+ * Thus, the above path gives the location of a field name. If we removed
+ * the last element:
+ * [ 4, 3, 2, 7 ]
+ * this path refers to the whole field declaration (from the beginning
+ * of the label to the terminating semicolon).
+ */
+ path: number[];
+ /**
+ * Always has exactly three or four elements: start line, start column,
+ * end line (optional, otherwise assumed same as start line), end column.
+ * These are packed into a single field for efficiency. Note that line
+ * and column numbers are zero-based -- typically you will want to add
+ * 1 to each before displaying to a user.
+ */
+ span: number[];
+ /**
+ * If this SourceCodeInfo represents a complete declaration, these are any
+ * comments appearing before and after the declaration which appear to be
+ * attached to the declaration.
+ *
+ * A series of line comments appearing on consecutive lines, with no other
+ * tokens appearing on those lines, will be treated as a single comment.
+ *
+ * leading_detached_comments will keep paragraphs of comments that appear
+ * before (but not connected to) the current element. Each paragraph,
+ * separated by empty lines, will be one comment element in the repeated
+ * field.
+ *
+ * Only the comment content is provided; comment markers (e.g. //) are
+ * stripped out. For block comments, leading whitespace and an asterisk
+ * will be stripped from the beginning of each line other than the first.
+ * Newlines are included in the output.
+ *
+ * Examples:
+ *
+ * optional int32 foo = 1; // Comment attached to foo.
+ * // Comment attached to bar.
+ * optional int32 bar = 2;
+ *
+ * optional string baz = 3;
+ * // Comment attached to baz.
+ * // Another line attached to baz.
+ *
+ * // Comment attached to moo.
+ * //
+ * // Another line attached to moo.
+ * optional double moo = 4;
+ *
+ * // Detached comment for corge. This is not leading or trailing comments
+ * // to moo or corge because there are blank lines separating it from
+ * // both.
+ *
+ * // Detached comment for corge paragraph 2.
+ *
+ * optional string corge = 5;
+ * /* Block comment attached
+ * * to corge. Leading asterisks
+ * * will be removed. * /
+ * /* Block comment attached to
+ * * grault. * /
+ * optional int32 grault = 6;
+ *
+ * // ignored detached comments.
+ */
+ leadingComments?: string | undefined;
+ trailingComments?: string | undefined;
+ leadingDetachedComments: string[];
+}
+
+/**
+ * Describes the relationship between generated code and its original source
+ * file. A GeneratedCodeInfo message is associated with only one generated
+ * source file, but may contain references to different source .proto files.
+ */
+export interface GeneratedCodeInfo {
+ /**
+ * An Annotation connects some span of text in generated code to an element
+ * of its generating .proto file.
+ */
+ annotation: GeneratedCodeInfo_Annotation[];
+}
+
+export interface GeneratedCodeInfo_Annotation {
+ /**
+ * Identifies the element in the original source .proto file. This field
+ * is formatted the same as SourceCodeInfo.Location.path.
+ */
+ path: number[];
+ /** Identifies the filesystem path to the original source .proto. */
+ sourceFile?:
+ | string
+ | undefined;
+ /**
+ * Identifies the starting offset in bytes in the generated code
+ * that relates to the identified object.
+ */
+ begin?:
+ | number
+ | undefined;
+ /**
+ * Identifies the ending offset in bytes in the generated code that
+ * relates to the identified object. The end offset should be one past
+ * the last relevant byte (so the length of the text = end - begin).
+ */
+ end?: number | undefined;
+ semantic?: GeneratedCodeInfo_Annotation_Semantic | undefined;
+}
+
+/**
+ * Represents the identified object's effect on the element in the original
+ * .proto file.
+ */
+export enum GeneratedCodeInfo_Annotation_Semantic {
+ /** NONE - There is no effect or the effect is indescribable. */
+ NONE = "NONE",
+ /** SET - The element is set or otherwise mutated. */
+ SET = "SET",
+ /** ALIAS - An alias to the element is returned. */
+ ALIAS = "ALIAS",
+ UNRECOGNIZED = "UNRECOGNIZED",
+}
+
+export function generatedCodeInfo_Annotation_SemanticFromJSON(object: any): GeneratedCodeInfo_Annotation_Semantic {
+ switch (object) {
+ case 0:
+ case "NONE":
+ return GeneratedCodeInfo_Annotation_Semantic.NONE;
+ case 1:
+ case "SET":
+ return GeneratedCodeInfo_Annotation_Semantic.SET;
+ case 2:
+ case "ALIAS":
+ return GeneratedCodeInfo_Annotation_Semantic.ALIAS;
+ case -1:
+ case "UNRECOGNIZED":
+ default:
+ return GeneratedCodeInfo_Annotation_Semantic.UNRECOGNIZED;
+ }
+}
+
+export function generatedCodeInfo_Annotation_SemanticToNumber(object: GeneratedCodeInfo_Annotation_Semantic): number {
+ switch (object) {
+ case GeneratedCodeInfo_Annotation_Semantic.NONE:
+ return 0;
+ case GeneratedCodeInfo_Annotation_Semantic.SET:
+ return 1;
+ case GeneratedCodeInfo_Annotation_Semantic.ALIAS:
+ return 2;
+ case GeneratedCodeInfo_Annotation_Semantic.UNRECOGNIZED:
+ default:
+ return -1;
+ }
+}
+
+function createBaseFileDescriptorSet(): FileDescriptorSet {
+ return { file: [] };
+}
+
+export const FileDescriptorSet: MessageFns = {
+ encode(message: FileDescriptorSet, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ for (const v of message.file) {
+ FileDescriptorProto.encode(v!, writer.uint32(10).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FileDescriptorSet {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFileDescriptorSet();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.file.push(FileDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FileDescriptorSet {
+ return FileDescriptorSet.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FileDescriptorSet {
+ const message = createBaseFileDescriptorSet();
+ message.file = object.file?.map((e) => FileDescriptorProto.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseFileDescriptorProto(): FileDescriptorProto {
+ return {
+ name: "",
+ package: "",
+ dependency: [],
+ publicDependency: [],
+ weakDependency: [],
+ messageType: [],
+ enumType: [],
+ service: [],
+ extension: [],
+ options: undefined,
+ sourceCodeInfo: undefined,
+ syntax: "",
+ edition: Edition.EDITION_UNKNOWN,
+ };
+}
+
+export const FileDescriptorProto: MessageFns = {
+ encode(message: FileDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ if (message.package !== undefined && message.package !== "") {
+ writer.uint32(18).string(message.package);
+ }
+ for (const v of message.dependency) {
+ writer.uint32(26).string(v!);
+ }
+ writer.uint32(82).fork();
+ for (const v of message.publicDependency) {
+ writer.int32(v);
+ }
+ writer.join();
+ writer.uint32(90).fork();
+ for (const v of message.weakDependency) {
+ writer.int32(v);
+ }
+ writer.join();
+ for (const v of message.messageType) {
+ DescriptorProto.encode(v!, writer.uint32(34).fork()).join();
+ }
+ for (const v of message.enumType) {
+ EnumDescriptorProto.encode(v!, writer.uint32(42).fork()).join();
+ }
+ for (const v of message.service) {
+ ServiceDescriptorProto.encode(v!, writer.uint32(50).fork()).join();
+ }
+ for (const v of message.extension) {
+ FieldDescriptorProto.encode(v!, writer.uint32(58).fork()).join();
+ }
+ if (message.options !== undefined) {
+ FileOptions.encode(message.options, writer.uint32(66).fork()).join();
+ }
+ if (message.sourceCodeInfo !== undefined) {
+ SourceCodeInfo.encode(message.sourceCodeInfo, writer.uint32(74).fork()).join();
+ }
+ if (message.syntax !== undefined && message.syntax !== "") {
+ writer.uint32(98).string(message.syntax);
+ }
+ if (message.edition !== undefined && message.edition !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(112).int32(editionToNumber(message.edition));
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FileDescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFileDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.package = reader.string();
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.dependency.push(reader.string());
+ continue;
+ case 10:
+ if (tag === 80) {
+ message.publicDependency.push(reader.int32());
+
+ continue;
+ }
+
+ if (tag === 82) {
+ const end2 = reader.uint32() + reader.pos;
+ while (reader.pos < end2) {
+ message.publicDependency.push(reader.int32());
+ }
+
+ continue;
+ }
+
+ break;
+ case 11:
+ if (tag === 88) {
+ message.weakDependency.push(reader.int32());
+
+ continue;
+ }
+
+ if (tag === 90) {
+ const end2 = reader.uint32() + reader.pos;
+ while (reader.pos < end2) {
+ message.weakDependency.push(reader.int32());
+ }
+
+ continue;
+ }
+
+ break;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.messageType.push(DescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 5:
+ if (tag !== 42) {
+ break;
+ }
+
+ message.enumType.push(EnumDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 6:
+ if (tag !== 50) {
+ break;
+ }
+
+ message.service.push(ServiceDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 7:
+ if (tag !== 58) {
+ break;
+ }
+
+ message.extension.push(FieldDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 8:
+ if (tag !== 66) {
+ break;
+ }
+
+ message.options = FileOptions.decode(reader, reader.uint32());
+ continue;
+ case 9:
+ if (tag !== 74) {
+ break;
+ }
+
+ message.sourceCodeInfo = SourceCodeInfo.decode(reader, reader.uint32());
+ continue;
+ case 12:
+ if (tag !== 98) {
+ break;
+ }
+
+ message.syntax = reader.string();
+ continue;
+ case 14:
+ if (tag !== 112) {
+ break;
+ }
+
+ message.edition = editionFromJSON(reader.int32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FileDescriptorProto {
+ return FileDescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FileDescriptorProto {
+ const message = createBaseFileDescriptorProto();
+ message.name = object.name ?? "";
+ message.package = object.package ?? "";
+ message.dependency = object.dependency?.map((e) => e) || [];
+ message.publicDependency = object.publicDependency?.map((e) => e) || [];
+ message.weakDependency = object.weakDependency?.map((e) => e) || [];
+ message.messageType = object.messageType?.map((e) => DescriptorProto.fromPartial(e)) || [];
+ message.enumType = object.enumType?.map((e) => EnumDescriptorProto.fromPartial(e)) || [];
+ message.service = object.service?.map((e) => ServiceDescriptorProto.fromPartial(e)) || [];
+ message.extension = object.extension?.map((e) => FieldDescriptorProto.fromPartial(e)) || [];
+ message.options = (object.options !== undefined && object.options !== null)
+ ? FileOptions.fromPartial(object.options)
+ : undefined;
+ message.sourceCodeInfo = (object.sourceCodeInfo !== undefined && object.sourceCodeInfo !== null)
+ ? SourceCodeInfo.fromPartial(object.sourceCodeInfo)
+ : undefined;
+ message.syntax = object.syntax ?? "";
+ message.edition = object.edition ?? Edition.EDITION_UNKNOWN;
+ return message;
+ },
+};
+
+function createBaseDescriptorProto(): DescriptorProto {
+ return {
+ name: "",
+ field: [],
+ extension: [],
+ nestedType: [],
+ enumType: [],
+ extensionRange: [],
+ oneofDecl: [],
+ options: undefined,
+ reservedRange: [],
+ reservedName: [],
+ };
+}
+
+export const DescriptorProto: MessageFns = {
+ encode(message: DescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ for (const v of message.field) {
+ FieldDescriptorProto.encode(v!, writer.uint32(18).fork()).join();
+ }
+ for (const v of message.extension) {
+ FieldDescriptorProto.encode(v!, writer.uint32(50).fork()).join();
+ }
+ for (const v of message.nestedType) {
+ DescriptorProto.encode(v!, writer.uint32(26).fork()).join();
+ }
+ for (const v of message.enumType) {
+ EnumDescriptorProto.encode(v!, writer.uint32(34).fork()).join();
+ }
+ for (const v of message.extensionRange) {
+ DescriptorProto_ExtensionRange.encode(v!, writer.uint32(42).fork()).join();
+ }
+ for (const v of message.oneofDecl) {
+ OneofDescriptorProto.encode(v!, writer.uint32(66).fork()).join();
+ }
+ if (message.options !== undefined) {
+ MessageOptions.encode(message.options, writer.uint32(58).fork()).join();
+ }
+ for (const v of message.reservedRange) {
+ DescriptorProto_ReservedRange.encode(v!, writer.uint32(74).fork()).join();
+ }
+ for (const v of message.reservedName) {
+ writer.uint32(82).string(v!);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): DescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.field.push(FieldDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 6:
+ if (tag !== 50) {
+ break;
+ }
+
+ message.extension.push(FieldDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.nestedType.push(DescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.enumType.push(EnumDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 5:
+ if (tag !== 42) {
+ break;
+ }
+
+ message.extensionRange.push(DescriptorProto_ExtensionRange.decode(reader, reader.uint32()));
+ continue;
+ case 8:
+ if (tag !== 66) {
+ break;
+ }
+
+ message.oneofDecl.push(OneofDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 7:
+ if (tag !== 58) {
+ break;
+ }
+
+ message.options = MessageOptions.decode(reader, reader.uint32());
+ continue;
+ case 9:
+ if (tag !== 74) {
+ break;
+ }
+
+ message.reservedRange.push(DescriptorProto_ReservedRange.decode(reader, reader.uint32()));
+ continue;
+ case 10:
+ if (tag !== 82) {
+ break;
+ }
+
+ message.reservedName.push(reader.string());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): DescriptorProto {
+ return DescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): DescriptorProto {
+ const message = createBaseDescriptorProto();
+ message.name = object.name ?? "";
+ message.field = object.field?.map((e) => FieldDescriptorProto.fromPartial(e)) || [];
+ message.extension = object.extension?.map((e) => FieldDescriptorProto.fromPartial(e)) || [];
+ message.nestedType = object.nestedType?.map((e) => DescriptorProto.fromPartial(e)) || [];
+ message.enumType = object.enumType?.map((e) => EnumDescriptorProto.fromPartial(e)) || [];
+ message.extensionRange = object.extensionRange?.map((e) => DescriptorProto_ExtensionRange.fromPartial(e)) || [];
+ message.oneofDecl = object.oneofDecl?.map((e) => OneofDescriptorProto.fromPartial(e)) || [];
+ message.options = (object.options !== undefined && object.options !== null)
+ ? MessageOptions.fromPartial(object.options)
+ : undefined;
+ message.reservedRange = object.reservedRange?.map((e) => DescriptorProto_ReservedRange.fromPartial(e)) || [];
+ message.reservedName = object.reservedName?.map((e) => e) || [];
+ return message;
+ },
+};
+
+function createBaseDescriptorProto_ExtensionRange(): DescriptorProto_ExtensionRange {
+ return { start: 0, end: 0, options: undefined };
+}
+
+export const DescriptorProto_ExtensionRange: MessageFns = {
+ encode(message: DescriptorProto_ExtensionRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.start !== undefined && message.start !== 0) {
+ writer.uint32(8).int32(message.start);
+ }
+ if (message.end !== undefined && message.end !== 0) {
+ writer.uint32(16).int32(message.end);
+ }
+ if (message.options !== undefined) {
+ ExtensionRangeOptions.encode(message.options, writer.uint32(26).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): DescriptorProto_ExtensionRange {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseDescriptorProto_ExtensionRange();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.start = reader.int32();
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.end = reader.int32();
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.options = ExtensionRangeOptions.decode(reader, reader.uint32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): DescriptorProto_ExtensionRange {
+ return DescriptorProto_ExtensionRange.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): DescriptorProto_ExtensionRange {
+ const message = createBaseDescriptorProto_ExtensionRange();
+ message.start = object.start ?? 0;
+ message.end = object.end ?? 0;
+ message.options = (object.options !== undefined && object.options !== null)
+ ? ExtensionRangeOptions.fromPartial(object.options)
+ : undefined;
+ return message;
+ },
+};
+
+function createBaseDescriptorProto_ReservedRange(): DescriptorProto_ReservedRange {
+ return { start: 0, end: 0 };
+}
+
+export const DescriptorProto_ReservedRange: MessageFns = {
+ encode(message: DescriptorProto_ReservedRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.start !== undefined && message.start !== 0) {
+ writer.uint32(8).int32(message.start);
+ }
+ if (message.end !== undefined && message.end !== 0) {
+ writer.uint32(16).int32(message.end);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): DescriptorProto_ReservedRange {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseDescriptorProto_ReservedRange();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.start = reader.int32();
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.end = reader.int32();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): DescriptorProto_ReservedRange {
+ return DescriptorProto_ReservedRange.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): DescriptorProto_ReservedRange {
+ const message = createBaseDescriptorProto_ReservedRange();
+ message.start = object.start ?? 0;
+ message.end = object.end ?? 0;
+ return message;
+ },
+};
+
+function createBaseExtensionRangeOptions(): ExtensionRangeOptions {
+ return {
+ uninterpretedOption: [],
+ declaration: [],
+ features: undefined,
+ verification: ExtensionRangeOptions_VerificationState.UNVERIFIED,
+ };
+}
+
+export const ExtensionRangeOptions: MessageFns = {
+ encode(message: ExtensionRangeOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ for (const v of message.declaration) {
+ ExtensionRangeOptions_Declaration.encode(v!, writer.uint32(18).fork()).join();
+ }
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(402).fork()).join();
+ }
+ if (
+ message.verification !== undefined && message.verification !== ExtensionRangeOptions_VerificationState.DECLARATION
+ ) {
+ writer.uint32(24).int32(extensionRangeOptions_VerificationStateToNumber(message.verification));
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): ExtensionRangeOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseExtensionRangeOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.declaration.push(ExtensionRangeOptions_Declaration.decode(reader, reader.uint32()));
+ continue;
+ case 50:
+ if (tag !== 402) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.verification = extensionRangeOptions_VerificationStateFromJSON(reader.int32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): ExtensionRangeOptions {
+ return ExtensionRangeOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): ExtensionRangeOptions {
+ const message = createBaseExtensionRangeOptions();
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ message.declaration = object.declaration?.map((e) => ExtensionRangeOptions_Declaration.fromPartial(e)) || [];
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.verification = object.verification ?? ExtensionRangeOptions_VerificationState.UNVERIFIED;
+ return message;
+ },
+};
+
+function createBaseExtensionRangeOptions_Declaration(): ExtensionRangeOptions_Declaration {
+ return { number: 0, fullName: "", type: "", reserved: false, repeated: false };
+}
+
+export const ExtensionRangeOptions_Declaration: MessageFns = {
+ encode(message: ExtensionRangeOptions_Declaration, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.number !== undefined && message.number !== 0) {
+ writer.uint32(8).int32(message.number);
+ }
+ if (message.fullName !== undefined && message.fullName !== "") {
+ writer.uint32(18).string(message.fullName);
+ }
+ if (message.type !== undefined && message.type !== "") {
+ writer.uint32(26).string(message.type);
+ }
+ if (message.reserved !== undefined && message.reserved !== false) {
+ writer.uint32(40).bool(message.reserved);
+ }
+ if (message.repeated !== undefined && message.repeated !== false) {
+ writer.uint32(48).bool(message.repeated);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): ExtensionRangeOptions_Declaration {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseExtensionRangeOptions_Declaration();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.number = reader.int32();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.fullName = reader.string();
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.type = reader.string();
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.reserved = reader.bool();
+ continue;
+ case 6:
+ if (tag !== 48) {
+ break;
+ }
+
+ message.repeated = reader.bool();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): ExtensionRangeOptions_Declaration {
+ return ExtensionRangeOptions_Declaration.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): ExtensionRangeOptions_Declaration {
+ const message = createBaseExtensionRangeOptions_Declaration();
+ message.number = object.number ?? 0;
+ message.fullName = object.fullName ?? "";
+ message.type = object.type ?? "";
+ message.reserved = object.reserved ?? false;
+ message.repeated = object.repeated ?? false;
+ return message;
+ },
+};
+
+function createBaseFieldDescriptorProto(): FieldDescriptorProto {
+ return {
+ name: "",
+ number: 0,
+ label: FieldDescriptorProto_Label.LABEL_OPTIONAL,
+ type: FieldDescriptorProto_Type.TYPE_DOUBLE,
+ typeName: "",
+ extendee: "",
+ defaultValue: "",
+ oneofIndex: 0,
+ jsonName: "",
+ options: undefined,
+ proto3Optional: false,
+ };
+}
+
+export const FieldDescriptorProto: MessageFns = {
+ encode(message: FieldDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ if (message.number !== undefined && message.number !== 0) {
+ writer.uint32(24).int32(message.number);
+ }
+ if (message.label !== undefined && message.label !== FieldDescriptorProto_Label.LABEL_OPTIONAL) {
+ writer.uint32(32).int32(fieldDescriptorProto_LabelToNumber(message.label));
+ }
+ if (message.type !== undefined && message.type !== FieldDescriptorProto_Type.TYPE_DOUBLE) {
+ writer.uint32(40).int32(fieldDescriptorProto_TypeToNumber(message.type));
+ }
+ if (message.typeName !== undefined && message.typeName !== "") {
+ writer.uint32(50).string(message.typeName);
+ }
+ if (message.extendee !== undefined && message.extendee !== "") {
+ writer.uint32(18).string(message.extendee);
+ }
+ if (message.defaultValue !== undefined && message.defaultValue !== "") {
+ writer.uint32(58).string(message.defaultValue);
+ }
+ if (message.oneofIndex !== undefined && message.oneofIndex !== 0) {
+ writer.uint32(72).int32(message.oneofIndex);
+ }
+ if (message.jsonName !== undefined && message.jsonName !== "") {
+ writer.uint32(82).string(message.jsonName);
+ }
+ if (message.options !== undefined) {
+ FieldOptions.encode(message.options, writer.uint32(66).fork()).join();
+ }
+ if (message.proto3Optional !== undefined && message.proto3Optional !== false) {
+ writer.uint32(136).bool(message.proto3Optional);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FieldDescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFieldDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.number = reader.int32();
+ continue;
+ case 4:
+ if (tag !== 32) {
+ break;
+ }
+
+ message.label = fieldDescriptorProto_LabelFromJSON(reader.int32());
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.type = fieldDescriptorProto_TypeFromJSON(reader.int32());
+ continue;
+ case 6:
+ if (tag !== 50) {
+ break;
+ }
+
+ message.typeName = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.extendee = reader.string();
+ continue;
+ case 7:
+ if (tag !== 58) {
+ break;
+ }
+
+ message.defaultValue = reader.string();
+ continue;
+ case 9:
+ if (tag !== 72) {
+ break;
+ }
+
+ message.oneofIndex = reader.int32();
+ continue;
+ case 10:
+ if (tag !== 82) {
+ break;
+ }
+
+ message.jsonName = reader.string();
+ continue;
+ case 8:
+ if (tag !== 66) {
+ break;
+ }
+
+ message.options = FieldOptions.decode(reader, reader.uint32());
+ continue;
+ case 17:
+ if (tag !== 136) {
+ break;
+ }
+
+ message.proto3Optional = reader.bool();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FieldDescriptorProto {
+ return FieldDescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FieldDescriptorProto {
+ const message = createBaseFieldDescriptorProto();
+ message.name = object.name ?? "";
+ message.number = object.number ?? 0;
+ message.label = object.label ?? FieldDescriptorProto_Label.LABEL_OPTIONAL;
+ message.type = object.type ?? FieldDescriptorProto_Type.TYPE_DOUBLE;
+ message.typeName = object.typeName ?? "";
+ message.extendee = object.extendee ?? "";
+ message.defaultValue = object.defaultValue ?? "";
+ message.oneofIndex = object.oneofIndex ?? 0;
+ message.jsonName = object.jsonName ?? "";
+ message.options = (object.options !== undefined && object.options !== null)
+ ? FieldOptions.fromPartial(object.options)
+ : undefined;
+ message.proto3Optional = object.proto3Optional ?? false;
+ return message;
+ },
+};
+
+function createBaseOneofDescriptorProto(): OneofDescriptorProto {
+ return { name: "", options: undefined };
+}
+
+export const OneofDescriptorProto: MessageFns = {
+ encode(message: OneofDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ if (message.options !== undefined) {
+ OneofOptions.encode(message.options, writer.uint32(18).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): OneofDescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseOneofDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.options = OneofOptions.decode(reader, reader.uint32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): OneofDescriptorProto {
+ return OneofDescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): OneofDescriptorProto {
+ const message = createBaseOneofDescriptorProto();
+ message.name = object.name ?? "";
+ message.options = (object.options !== undefined && object.options !== null)
+ ? OneofOptions.fromPartial(object.options)
+ : undefined;
+ return message;
+ },
+};
+
+function createBaseEnumDescriptorProto(): EnumDescriptorProto {
+ return { name: "", value: [], options: undefined, reservedRange: [], reservedName: [] };
+}
+
+export const EnumDescriptorProto: MessageFns = {
+ encode(message: EnumDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ for (const v of message.value) {
+ EnumValueDescriptorProto.encode(v!, writer.uint32(18).fork()).join();
+ }
+ if (message.options !== undefined) {
+ EnumOptions.encode(message.options, writer.uint32(26).fork()).join();
+ }
+ for (const v of message.reservedRange) {
+ EnumDescriptorProto_EnumReservedRange.encode(v!, writer.uint32(34).fork()).join();
+ }
+ for (const v of message.reservedName) {
+ writer.uint32(42).string(v!);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): EnumDescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseEnumDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.value.push(EnumValueDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.options = EnumOptions.decode(reader, reader.uint32());
+ continue;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.reservedRange.push(EnumDescriptorProto_EnumReservedRange.decode(reader, reader.uint32()));
+ continue;
+ case 5:
+ if (tag !== 42) {
+ break;
+ }
+
+ message.reservedName.push(reader.string());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): EnumDescriptorProto {
+ return EnumDescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): EnumDescriptorProto {
+ const message = createBaseEnumDescriptorProto();
+ message.name = object.name ?? "";
+ message.value = object.value?.map((e) => EnumValueDescriptorProto.fromPartial(e)) || [];
+ message.options = (object.options !== undefined && object.options !== null)
+ ? EnumOptions.fromPartial(object.options)
+ : undefined;
+ message.reservedRange = object.reservedRange?.map((e) => EnumDescriptorProto_EnumReservedRange.fromPartial(e)) ||
+ [];
+ message.reservedName = object.reservedName?.map((e) => e) || [];
+ return message;
+ },
+};
+
+function createBaseEnumDescriptorProto_EnumReservedRange(): EnumDescriptorProto_EnumReservedRange {
+ return { start: 0, end: 0 };
+}
+
+export const EnumDescriptorProto_EnumReservedRange: MessageFns = {
+ encode(message: EnumDescriptorProto_EnumReservedRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.start !== undefined && message.start !== 0) {
+ writer.uint32(8).int32(message.start);
+ }
+ if (message.end !== undefined && message.end !== 0) {
+ writer.uint32(16).int32(message.end);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): EnumDescriptorProto_EnumReservedRange {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseEnumDescriptorProto_EnumReservedRange();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.start = reader.int32();
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.end = reader.int32();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): EnumDescriptorProto_EnumReservedRange {
+ return EnumDescriptorProto_EnumReservedRange.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): EnumDescriptorProto_EnumReservedRange {
+ const message = createBaseEnumDescriptorProto_EnumReservedRange();
+ message.start = object.start ?? 0;
+ message.end = object.end ?? 0;
+ return message;
+ },
+};
+
+function createBaseEnumValueDescriptorProto(): EnumValueDescriptorProto {
+ return { name: "", number: 0, options: undefined };
+}
+
+export const EnumValueDescriptorProto: MessageFns = {
+ encode(message: EnumValueDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ if (message.number !== undefined && message.number !== 0) {
+ writer.uint32(16).int32(message.number);
+ }
+ if (message.options !== undefined) {
+ EnumValueOptions.encode(message.options, writer.uint32(26).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): EnumValueDescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseEnumValueDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.number = reader.int32();
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.options = EnumValueOptions.decode(reader, reader.uint32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): EnumValueDescriptorProto {
+ return EnumValueDescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): EnumValueDescriptorProto {
+ const message = createBaseEnumValueDescriptorProto();
+ message.name = object.name ?? "";
+ message.number = object.number ?? 0;
+ message.options = (object.options !== undefined && object.options !== null)
+ ? EnumValueOptions.fromPartial(object.options)
+ : undefined;
+ return message;
+ },
+};
+
+function createBaseServiceDescriptorProto(): ServiceDescriptorProto {
+ return { name: "", method: [], options: undefined };
+}
+
+export const ServiceDescriptorProto: MessageFns = {
+ encode(message: ServiceDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ for (const v of message.method) {
+ MethodDescriptorProto.encode(v!, writer.uint32(18).fork()).join();
+ }
+ if (message.options !== undefined) {
+ ServiceOptions.encode(message.options, writer.uint32(26).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): ServiceDescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseServiceDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.method.push(MethodDescriptorProto.decode(reader, reader.uint32()));
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.options = ServiceOptions.decode(reader, reader.uint32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): ServiceDescriptorProto {
+ return ServiceDescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): ServiceDescriptorProto {
+ const message = createBaseServiceDescriptorProto();
+ message.name = object.name ?? "";
+ message.method = object.method?.map((e) => MethodDescriptorProto.fromPartial(e)) || [];
+ message.options = (object.options !== undefined && object.options !== null)
+ ? ServiceOptions.fromPartial(object.options)
+ : undefined;
+ return message;
+ },
+};
+
+function createBaseMethodDescriptorProto(): MethodDescriptorProto {
+ return {
+ name: "",
+ inputType: "",
+ outputType: "",
+ options: undefined,
+ clientStreaming: false,
+ serverStreaming: false,
+ };
+}
+
+export const MethodDescriptorProto: MessageFns = {
+ encode(message: MethodDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.name !== undefined && message.name !== "") {
+ writer.uint32(10).string(message.name);
+ }
+ if (message.inputType !== undefined && message.inputType !== "") {
+ writer.uint32(18).string(message.inputType);
+ }
+ if (message.outputType !== undefined && message.outputType !== "") {
+ writer.uint32(26).string(message.outputType);
+ }
+ if (message.options !== undefined) {
+ MethodOptions.encode(message.options, writer.uint32(34).fork()).join();
+ }
+ if (message.clientStreaming !== undefined && message.clientStreaming !== false) {
+ writer.uint32(40).bool(message.clientStreaming);
+ }
+ if (message.serverStreaming !== undefined && message.serverStreaming !== false) {
+ writer.uint32(48).bool(message.serverStreaming);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): MethodDescriptorProto {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseMethodDescriptorProto();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.name = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.inputType = reader.string();
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.outputType = reader.string();
+ continue;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.options = MethodOptions.decode(reader, reader.uint32());
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.clientStreaming = reader.bool();
+ continue;
+ case 6:
+ if (tag !== 48) {
+ break;
+ }
+
+ message.serverStreaming = reader.bool();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): MethodDescriptorProto {
+ return MethodDescriptorProto.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): MethodDescriptorProto {
+ const message = createBaseMethodDescriptorProto();
+ message.name = object.name ?? "";
+ message.inputType = object.inputType ?? "";
+ message.outputType = object.outputType ?? "";
+ message.options = (object.options !== undefined && object.options !== null)
+ ? MethodOptions.fromPartial(object.options)
+ : undefined;
+ message.clientStreaming = object.clientStreaming ?? false;
+ message.serverStreaming = object.serverStreaming ?? false;
+ return message;
+ },
+};
+
+function createBaseFileOptions(): FileOptions {
+ return {
+ javaPackage: "",
+ javaOuterClassname: "",
+ javaMultipleFiles: false,
+ javaGenerateEqualsAndHash: false,
+ javaStringCheckUtf8: false,
+ optimizeFor: FileOptions_OptimizeMode.SPEED,
+ goPackage: "",
+ ccGenericServices: false,
+ javaGenericServices: false,
+ pyGenericServices: false,
+ deprecated: false,
+ ccEnableArenas: true,
+ objcClassPrefix: "",
+ csharpNamespace: "",
+ swiftPrefix: "",
+ phpClassPrefix: "",
+ phpNamespace: "",
+ phpMetadataNamespace: "",
+ rubyPackage: "",
+ features: undefined,
+ uninterpretedOption: [],
+ };
+}
+
+export const FileOptions: MessageFns = {
+ encode(message: FileOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.javaPackage !== undefined && message.javaPackage !== "") {
+ writer.uint32(10).string(message.javaPackage);
+ }
+ if (message.javaOuterClassname !== undefined && message.javaOuterClassname !== "") {
+ writer.uint32(66).string(message.javaOuterClassname);
+ }
+ if (message.javaMultipleFiles !== undefined && message.javaMultipleFiles !== false) {
+ writer.uint32(80).bool(message.javaMultipleFiles);
+ }
+ if (message.javaGenerateEqualsAndHash !== undefined && message.javaGenerateEqualsAndHash !== false) {
+ writer.uint32(160).bool(message.javaGenerateEqualsAndHash);
+ }
+ if (message.javaStringCheckUtf8 !== undefined && message.javaStringCheckUtf8 !== false) {
+ writer.uint32(216).bool(message.javaStringCheckUtf8);
+ }
+ if (message.optimizeFor !== undefined && message.optimizeFor !== FileOptions_OptimizeMode.SPEED) {
+ writer.uint32(72).int32(fileOptions_OptimizeModeToNumber(message.optimizeFor));
+ }
+ if (message.goPackage !== undefined && message.goPackage !== "") {
+ writer.uint32(90).string(message.goPackage);
+ }
+ if (message.ccGenericServices !== undefined && message.ccGenericServices !== false) {
+ writer.uint32(128).bool(message.ccGenericServices);
+ }
+ if (message.javaGenericServices !== undefined && message.javaGenericServices !== false) {
+ writer.uint32(136).bool(message.javaGenericServices);
+ }
+ if (message.pyGenericServices !== undefined && message.pyGenericServices !== false) {
+ writer.uint32(144).bool(message.pyGenericServices);
+ }
+ if (message.deprecated !== undefined && message.deprecated !== false) {
+ writer.uint32(184).bool(message.deprecated);
+ }
+ if (message.ccEnableArenas !== undefined && message.ccEnableArenas !== true) {
+ writer.uint32(248).bool(message.ccEnableArenas);
+ }
+ if (message.objcClassPrefix !== undefined && message.objcClassPrefix !== "") {
+ writer.uint32(290).string(message.objcClassPrefix);
+ }
+ if (message.csharpNamespace !== undefined && message.csharpNamespace !== "") {
+ writer.uint32(298).string(message.csharpNamespace);
+ }
+ if (message.swiftPrefix !== undefined && message.swiftPrefix !== "") {
+ writer.uint32(314).string(message.swiftPrefix);
+ }
+ if (message.phpClassPrefix !== undefined && message.phpClassPrefix !== "") {
+ writer.uint32(322).string(message.phpClassPrefix);
+ }
+ if (message.phpNamespace !== undefined && message.phpNamespace !== "") {
+ writer.uint32(330).string(message.phpNamespace);
+ }
+ if (message.phpMetadataNamespace !== undefined && message.phpMetadataNamespace !== "") {
+ writer.uint32(354).string(message.phpMetadataNamespace);
+ }
+ if (message.rubyPackage !== undefined && message.rubyPackage !== "") {
+ writer.uint32(362).string(message.rubyPackage);
+ }
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(402).fork()).join();
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FileOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFileOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.javaPackage = reader.string();
+ continue;
+ case 8:
+ if (tag !== 66) {
+ break;
+ }
+
+ message.javaOuterClassname = reader.string();
+ continue;
+ case 10:
+ if (tag !== 80) {
+ break;
+ }
+
+ message.javaMultipleFiles = reader.bool();
+ continue;
+ case 20:
+ if (tag !== 160) {
+ break;
+ }
+
+ message.javaGenerateEqualsAndHash = reader.bool();
+ continue;
+ case 27:
+ if (tag !== 216) {
+ break;
+ }
+
+ message.javaStringCheckUtf8 = reader.bool();
+ continue;
+ case 9:
+ if (tag !== 72) {
+ break;
+ }
+
+ message.optimizeFor = fileOptions_OptimizeModeFromJSON(reader.int32());
+ continue;
+ case 11:
+ if (tag !== 90) {
+ break;
+ }
+
+ message.goPackage = reader.string();
+ continue;
+ case 16:
+ if (tag !== 128) {
+ break;
+ }
+
+ message.ccGenericServices = reader.bool();
+ continue;
+ case 17:
+ if (tag !== 136) {
+ break;
+ }
+
+ message.javaGenericServices = reader.bool();
+ continue;
+ case 18:
+ if (tag !== 144) {
+ break;
+ }
+
+ message.pyGenericServices = reader.bool();
+ continue;
+ case 23:
+ if (tag !== 184) {
+ break;
+ }
+
+ message.deprecated = reader.bool();
+ continue;
+ case 31:
+ if (tag !== 248) {
+ break;
+ }
+
+ message.ccEnableArenas = reader.bool();
+ continue;
+ case 36:
+ if (tag !== 290) {
+ break;
+ }
+
+ message.objcClassPrefix = reader.string();
+ continue;
+ case 37:
+ if (tag !== 298) {
+ break;
+ }
+
+ message.csharpNamespace = reader.string();
+ continue;
+ case 39:
+ if (tag !== 314) {
+ break;
+ }
+
+ message.swiftPrefix = reader.string();
+ continue;
+ case 40:
+ if (tag !== 322) {
+ break;
+ }
+
+ message.phpClassPrefix = reader.string();
+ continue;
+ case 41:
+ if (tag !== 330) {
+ break;
+ }
+
+ message.phpNamespace = reader.string();
+ continue;
+ case 44:
+ if (tag !== 354) {
+ break;
+ }
+
+ message.phpMetadataNamespace = reader.string();
+ continue;
+ case 45:
+ if (tag !== 362) {
+ break;
+ }
+
+ message.rubyPackage = reader.string();
+ continue;
+ case 50:
+ if (tag !== 402) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FileOptions {
+ return FileOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FileOptions {
+ const message = createBaseFileOptions();
+ message.javaPackage = object.javaPackage ?? "";
+ message.javaOuterClassname = object.javaOuterClassname ?? "";
+ message.javaMultipleFiles = object.javaMultipleFiles ?? false;
+ message.javaGenerateEqualsAndHash = object.javaGenerateEqualsAndHash ?? false;
+ message.javaStringCheckUtf8 = object.javaStringCheckUtf8 ?? false;
+ message.optimizeFor = object.optimizeFor ?? FileOptions_OptimizeMode.SPEED;
+ message.goPackage = object.goPackage ?? "";
+ message.ccGenericServices = object.ccGenericServices ?? false;
+ message.javaGenericServices = object.javaGenericServices ?? false;
+ message.pyGenericServices = object.pyGenericServices ?? false;
+ message.deprecated = object.deprecated ?? false;
+ message.ccEnableArenas = object.ccEnableArenas ?? true;
+ message.objcClassPrefix = object.objcClassPrefix ?? "";
+ message.csharpNamespace = object.csharpNamespace ?? "";
+ message.swiftPrefix = object.swiftPrefix ?? "";
+ message.phpClassPrefix = object.phpClassPrefix ?? "";
+ message.phpNamespace = object.phpNamespace ?? "";
+ message.phpMetadataNamespace = object.phpMetadataNamespace ?? "";
+ message.rubyPackage = object.rubyPackage ?? "";
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseMessageOptions(): MessageOptions {
+ return {
+ messageSetWireFormat: false,
+ noStandardDescriptorAccessor: false,
+ deprecated: false,
+ mapEntry: false,
+ deprecatedLegacyJsonFieldConflicts: false,
+ features: undefined,
+ uninterpretedOption: [],
+ };
+}
+
+export const MessageOptions: MessageFns = {
+ encode(message: MessageOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.messageSetWireFormat !== undefined && message.messageSetWireFormat !== false) {
+ writer.uint32(8).bool(message.messageSetWireFormat);
+ }
+ if (message.noStandardDescriptorAccessor !== undefined && message.noStandardDescriptorAccessor !== false) {
+ writer.uint32(16).bool(message.noStandardDescriptorAccessor);
+ }
+ if (message.deprecated !== undefined && message.deprecated !== false) {
+ writer.uint32(24).bool(message.deprecated);
+ }
+ if (message.mapEntry !== undefined && message.mapEntry !== false) {
+ writer.uint32(56).bool(message.mapEntry);
+ }
+ if (
+ message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false
+ ) {
+ writer.uint32(88).bool(message.deprecatedLegacyJsonFieldConflicts);
+ }
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(98).fork()).join();
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): MessageOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseMessageOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.messageSetWireFormat = reader.bool();
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.noStandardDescriptorAccessor = reader.bool();
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.deprecated = reader.bool();
+ continue;
+ case 7:
+ if (tag !== 56) {
+ break;
+ }
+
+ message.mapEntry = reader.bool();
+ continue;
+ case 11:
+ if (tag !== 88) {
+ break;
+ }
+
+ message.deprecatedLegacyJsonFieldConflicts = reader.bool();
+ continue;
+ case 12:
+ if (tag !== 98) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): MessageOptions {
+ return MessageOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): MessageOptions {
+ const message = createBaseMessageOptions();
+ message.messageSetWireFormat = object.messageSetWireFormat ?? false;
+ message.noStandardDescriptorAccessor = object.noStandardDescriptorAccessor ?? false;
+ message.deprecated = object.deprecated ?? false;
+ message.mapEntry = object.mapEntry ?? false;
+ message.deprecatedLegacyJsonFieldConflicts = object.deprecatedLegacyJsonFieldConflicts ?? false;
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseFieldOptions(): FieldOptions {
+ return {
+ ctype: FieldOptions_CType.STRING,
+ packed: false,
+ jstype: FieldOptions_JSType.JS_NORMAL,
+ lazy: false,
+ unverifiedLazy: false,
+ deprecated: false,
+ weak: false,
+ debugRedact: false,
+ retention: FieldOptions_OptionRetention.RETENTION_UNKNOWN,
+ targets: [],
+ editionDefaults: [],
+ features: undefined,
+ featureSupport: undefined,
+ uninterpretedOption: [],
+ };
+}
+
+export const FieldOptions: MessageFns = {
+ encode(message: FieldOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.ctype !== undefined && message.ctype !== FieldOptions_CType.STRING) {
+ writer.uint32(8).int32(fieldOptions_CTypeToNumber(message.ctype));
+ }
+ if (message.packed !== undefined && message.packed !== false) {
+ writer.uint32(16).bool(message.packed);
+ }
+ if (message.jstype !== undefined && message.jstype !== FieldOptions_JSType.JS_NORMAL) {
+ writer.uint32(48).int32(fieldOptions_JSTypeToNumber(message.jstype));
+ }
+ if (message.lazy !== undefined && message.lazy !== false) {
+ writer.uint32(40).bool(message.lazy);
+ }
+ if (message.unverifiedLazy !== undefined && message.unverifiedLazy !== false) {
+ writer.uint32(120).bool(message.unverifiedLazy);
+ }
+ if (message.deprecated !== undefined && message.deprecated !== false) {
+ writer.uint32(24).bool(message.deprecated);
+ }
+ if (message.weak !== undefined && message.weak !== false) {
+ writer.uint32(80).bool(message.weak);
+ }
+ if (message.debugRedact !== undefined && message.debugRedact !== false) {
+ writer.uint32(128).bool(message.debugRedact);
+ }
+ if (message.retention !== undefined && message.retention !== FieldOptions_OptionRetention.RETENTION_UNKNOWN) {
+ writer.uint32(136).int32(fieldOptions_OptionRetentionToNumber(message.retention));
+ }
+ writer.uint32(154).fork();
+ for (const v of message.targets) {
+ writer.int32(fieldOptions_OptionTargetTypeToNumber(v));
+ }
+ writer.join();
+ for (const v of message.editionDefaults) {
+ FieldOptions_EditionDefault.encode(v!, writer.uint32(162).fork()).join();
+ }
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(170).fork()).join();
+ }
+ if (message.featureSupport !== undefined) {
+ FieldOptions_FeatureSupport.encode(message.featureSupport, writer.uint32(178).fork()).join();
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FieldOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFieldOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.ctype = fieldOptions_CTypeFromJSON(reader.int32());
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.packed = reader.bool();
+ continue;
+ case 6:
+ if (tag !== 48) {
+ break;
+ }
+
+ message.jstype = fieldOptions_JSTypeFromJSON(reader.int32());
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.lazy = reader.bool();
+ continue;
+ case 15:
+ if (tag !== 120) {
+ break;
+ }
+
+ message.unverifiedLazy = reader.bool();
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.deprecated = reader.bool();
+ continue;
+ case 10:
+ if (tag !== 80) {
+ break;
+ }
+
+ message.weak = reader.bool();
+ continue;
+ case 16:
+ if (tag !== 128) {
+ break;
+ }
+
+ message.debugRedact = reader.bool();
+ continue;
+ case 17:
+ if (tag !== 136) {
+ break;
+ }
+
+ message.retention = fieldOptions_OptionRetentionFromJSON(reader.int32());
+ continue;
+ case 19:
+ if (tag === 152) {
+ message.targets.push(fieldOptions_OptionTargetTypeFromJSON(reader.int32()));
+
+ continue;
+ }
+
+ if (tag === 154) {
+ const end2 = reader.uint32() + reader.pos;
+ while (reader.pos < end2) {
+ message.targets.push(fieldOptions_OptionTargetTypeFromJSON(reader.int32()));
+ }
+
+ continue;
+ }
+
+ break;
+ case 20:
+ if (tag !== 162) {
+ break;
+ }
+
+ message.editionDefaults.push(FieldOptions_EditionDefault.decode(reader, reader.uint32()));
+ continue;
+ case 21:
+ if (tag !== 170) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 22:
+ if (tag !== 178) {
+ break;
+ }
+
+ message.featureSupport = FieldOptions_FeatureSupport.decode(reader, reader.uint32());
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FieldOptions {
+ return FieldOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FieldOptions {
+ const message = createBaseFieldOptions();
+ message.ctype = object.ctype ?? FieldOptions_CType.STRING;
+ message.packed = object.packed ?? false;
+ message.jstype = object.jstype ?? FieldOptions_JSType.JS_NORMAL;
+ message.lazy = object.lazy ?? false;
+ message.unverifiedLazy = object.unverifiedLazy ?? false;
+ message.deprecated = object.deprecated ?? false;
+ message.weak = object.weak ?? false;
+ message.debugRedact = object.debugRedact ?? false;
+ message.retention = object.retention ?? FieldOptions_OptionRetention.RETENTION_UNKNOWN;
+ message.targets = object.targets?.map((e) => e) || [];
+ message.editionDefaults = object.editionDefaults?.map((e) => FieldOptions_EditionDefault.fromPartial(e)) || [];
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.featureSupport = (object.featureSupport !== undefined && object.featureSupport !== null)
+ ? FieldOptions_FeatureSupport.fromPartial(object.featureSupport)
+ : undefined;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseFieldOptions_EditionDefault(): FieldOptions_EditionDefault {
+ return { edition: Edition.EDITION_UNKNOWN, value: "" };
+}
+
+export const FieldOptions_EditionDefault: MessageFns = {
+ encode(message: FieldOptions_EditionDefault, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.edition !== undefined && message.edition !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(24).int32(editionToNumber(message.edition));
+ }
+ if (message.value !== undefined && message.value !== "") {
+ writer.uint32(18).string(message.value);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FieldOptions_EditionDefault {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFieldOptions_EditionDefault();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.edition = editionFromJSON(reader.int32());
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.value = reader.string();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FieldOptions_EditionDefault {
+ return FieldOptions_EditionDefault.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FieldOptions_EditionDefault {
+ const message = createBaseFieldOptions_EditionDefault();
+ message.edition = object.edition ?? Edition.EDITION_UNKNOWN;
+ message.value = object.value ?? "";
+ return message;
+ },
+};
+
+function createBaseFieldOptions_FeatureSupport(): FieldOptions_FeatureSupport {
+ return {
+ editionIntroduced: Edition.EDITION_UNKNOWN,
+ editionDeprecated: Edition.EDITION_UNKNOWN,
+ deprecationWarning: "",
+ editionRemoved: Edition.EDITION_UNKNOWN,
+ };
+}
+
+export const FieldOptions_FeatureSupport: MessageFns = {
+ encode(message: FieldOptions_FeatureSupport, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.editionIntroduced !== undefined && message.editionIntroduced !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(8).int32(editionToNumber(message.editionIntroduced));
+ }
+ if (message.editionDeprecated !== undefined && message.editionDeprecated !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(16).int32(editionToNumber(message.editionDeprecated));
+ }
+ if (message.deprecationWarning !== undefined && message.deprecationWarning !== "") {
+ writer.uint32(26).string(message.deprecationWarning);
+ }
+ if (message.editionRemoved !== undefined && message.editionRemoved !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(32).int32(editionToNumber(message.editionRemoved));
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FieldOptions_FeatureSupport {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFieldOptions_FeatureSupport();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.editionIntroduced = editionFromJSON(reader.int32());
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.editionDeprecated = editionFromJSON(reader.int32());
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.deprecationWarning = reader.string();
+ continue;
+ case 4:
+ if (tag !== 32) {
+ break;
+ }
+
+ message.editionRemoved = editionFromJSON(reader.int32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FieldOptions_FeatureSupport {
+ return FieldOptions_FeatureSupport.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FieldOptions_FeatureSupport {
+ const message = createBaseFieldOptions_FeatureSupport();
+ message.editionIntroduced = object.editionIntroduced ?? Edition.EDITION_UNKNOWN;
+ message.editionDeprecated = object.editionDeprecated ?? Edition.EDITION_UNKNOWN;
+ message.deprecationWarning = object.deprecationWarning ?? "";
+ message.editionRemoved = object.editionRemoved ?? Edition.EDITION_UNKNOWN;
+ return message;
+ },
+};
+
+function createBaseOneofOptions(): OneofOptions {
+ return { features: undefined, uninterpretedOption: [] };
+}
+
+export const OneofOptions: MessageFns = {
+ encode(message: OneofOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(10).fork()).join();
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): OneofOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseOneofOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): OneofOptions {
+ return OneofOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): OneofOptions {
+ const message = createBaseOneofOptions();
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseEnumOptions(): EnumOptions {
+ return {
+ allowAlias: false,
+ deprecated: false,
+ deprecatedLegacyJsonFieldConflicts: false,
+ features: undefined,
+ uninterpretedOption: [],
+ };
+}
+
+export const EnumOptions: MessageFns = {
+ encode(message: EnumOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.allowAlias !== undefined && message.allowAlias !== false) {
+ writer.uint32(16).bool(message.allowAlias);
+ }
+ if (message.deprecated !== undefined && message.deprecated !== false) {
+ writer.uint32(24).bool(message.deprecated);
+ }
+ if (
+ message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false
+ ) {
+ writer.uint32(48).bool(message.deprecatedLegacyJsonFieldConflicts);
+ }
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(58).fork()).join();
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): EnumOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseEnumOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.allowAlias = reader.bool();
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.deprecated = reader.bool();
+ continue;
+ case 6:
+ if (tag !== 48) {
+ break;
+ }
+
+ message.deprecatedLegacyJsonFieldConflicts = reader.bool();
+ continue;
+ case 7:
+ if (tag !== 58) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): EnumOptions {
+ return EnumOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): EnumOptions {
+ const message = createBaseEnumOptions();
+ message.allowAlias = object.allowAlias ?? false;
+ message.deprecated = object.deprecated ?? false;
+ message.deprecatedLegacyJsonFieldConflicts = object.deprecatedLegacyJsonFieldConflicts ?? false;
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseEnumValueOptions(): EnumValueOptions {
+ return {
+ deprecated: false,
+ features: undefined,
+ debugRedact: false,
+ featureSupport: undefined,
+ uninterpretedOption: [],
+ };
+}
+
+export const EnumValueOptions: MessageFns = {
+ encode(message: EnumValueOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.deprecated !== undefined && message.deprecated !== false) {
+ writer.uint32(8).bool(message.deprecated);
+ }
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(18).fork()).join();
+ }
+ if (message.debugRedact !== undefined && message.debugRedact !== false) {
+ writer.uint32(24).bool(message.debugRedact);
+ }
+ if (message.featureSupport !== undefined) {
+ FieldOptions_FeatureSupport.encode(message.featureSupport, writer.uint32(34).fork()).join();
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): EnumValueOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseEnumValueOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.deprecated = reader.bool();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.debugRedact = reader.bool();
+ continue;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.featureSupport = FieldOptions_FeatureSupport.decode(reader, reader.uint32());
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): EnumValueOptions {
+ return EnumValueOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): EnumValueOptions {
+ const message = createBaseEnumValueOptions();
+ message.deprecated = object.deprecated ?? false;
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.debugRedact = object.debugRedact ?? false;
+ message.featureSupport = (object.featureSupport !== undefined && object.featureSupport !== null)
+ ? FieldOptions_FeatureSupport.fromPartial(object.featureSupport)
+ : undefined;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseServiceOptions(): ServiceOptions {
+ return { features: undefined, deprecated: false, uninterpretedOption: [] };
+}
+
+export const ServiceOptions: MessageFns = {
+ encode(message: ServiceOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(274).fork()).join();
+ }
+ if (message.deprecated !== undefined && message.deprecated !== false) {
+ writer.uint32(264).bool(message.deprecated);
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): ServiceOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseServiceOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 34:
+ if (tag !== 274) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 33:
+ if (tag !== 264) {
+ break;
+ }
+
+ message.deprecated = reader.bool();
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): ServiceOptions {
+ return ServiceOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): ServiceOptions {
+ const message = createBaseServiceOptions();
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.deprecated = object.deprecated ?? false;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseMethodOptions(): MethodOptions {
+ return {
+ deprecated: false,
+ idempotencyLevel: MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN,
+ features: undefined,
+ uninterpretedOption: [],
+ };
+}
+
+export const MethodOptions: MessageFns = {
+ encode(message: MethodOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.deprecated !== undefined && message.deprecated !== false) {
+ writer.uint32(264).bool(message.deprecated);
+ }
+ if (
+ message.idempotencyLevel !== undefined &&
+ message.idempotencyLevel !== MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN
+ ) {
+ writer.uint32(272).int32(methodOptions_IdempotencyLevelToNumber(message.idempotencyLevel));
+ }
+ if (message.features !== undefined) {
+ FeatureSet.encode(message.features, writer.uint32(282).fork()).join();
+ }
+ for (const v of message.uninterpretedOption) {
+ UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): MethodOptions {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseMethodOptions();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 33:
+ if (tag !== 264) {
+ break;
+ }
+
+ message.deprecated = reader.bool();
+ continue;
+ case 34:
+ if (tag !== 272) {
+ break;
+ }
+
+ message.idempotencyLevel = methodOptions_IdempotencyLevelFromJSON(reader.int32());
+ continue;
+ case 35:
+ if (tag !== 282) {
+ break;
+ }
+
+ message.features = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 999:
+ if (tag !== 7994) {
+ break;
+ }
+
+ message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): MethodOptions {
+ return MethodOptions.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): MethodOptions {
+ const message = createBaseMethodOptions();
+ message.deprecated = object.deprecated ?? false;
+ message.idempotencyLevel = object.idempotencyLevel ?? MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN;
+ message.features = (object.features !== undefined && object.features !== null)
+ ? FeatureSet.fromPartial(object.features)
+ : undefined;
+ message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseUninterpretedOption(): UninterpretedOption {
+ return {
+ name: [],
+ identifierValue: "",
+ positiveIntValue: 0,
+ negativeIntValue: 0,
+ doubleValue: 0,
+ stringValue: new Uint8Array(0),
+ aggregateValue: "",
+ };
+}
+
+export const UninterpretedOption: MessageFns = {
+ encode(message: UninterpretedOption, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ for (const v of message.name) {
+ UninterpretedOption_NamePart.encode(v!, writer.uint32(18).fork()).join();
+ }
+ if (message.identifierValue !== undefined && message.identifierValue !== "") {
+ writer.uint32(26).string(message.identifierValue);
+ }
+ if (message.positiveIntValue !== undefined && message.positiveIntValue !== 0) {
+ writer.uint32(32).uint64(message.positiveIntValue);
+ }
+ if (message.negativeIntValue !== undefined && message.negativeIntValue !== 0) {
+ writer.uint32(40).int64(message.negativeIntValue);
+ }
+ if (message.doubleValue !== undefined && message.doubleValue !== 0) {
+ writer.uint32(49).double(message.doubleValue);
+ }
+ if (message.stringValue !== undefined && message.stringValue.length !== 0) {
+ writer.uint32(58).bytes(message.stringValue);
+ }
+ if (message.aggregateValue !== undefined && message.aggregateValue !== "") {
+ writer.uint32(66).string(message.aggregateValue);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): UninterpretedOption {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseUninterpretedOption();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.name.push(UninterpretedOption_NamePart.decode(reader, reader.uint32()));
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.identifierValue = reader.string();
+ continue;
+ case 4:
+ if (tag !== 32) {
+ break;
+ }
+
+ message.positiveIntValue = longToNumber(reader.uint64());
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.negativeIntValue = longToNumber(reader.int64());
+ continue;
+ case 6:
+ if (tag !== 49) {
+ break;
+ }
+
+ message.doubleValue = reader.double();
+ continue;
+ case 7:
+ if (tag !== 58) {
+ break;
+ }
+
+ message.stringValue = reader.bytes();
+ continue;
+ case 8:
+ if (tag !== 66) {
+ break;
+ }
+
+ message.aggregateValue = reader.string();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): UninterpretedOption {
+ return UninterpretedOption.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): UninterpretedOption {
+ const message = createBaseUninterpretedOption();
+ message.name = object.name?.map((e) => UninterpretedOption_NamePart.fromPartial(e)) || [];
+ message.identifierValue = object.identifierValue ?? "";
+ message.positiveIntValue = object.positiveIntValue ?? 0;
+ message.negativeIntValue = object.negativeIntValue ?? 0;
+ message.doubleValue = object.doubleValue ?? 0;
+ message.stringValue = object.stringValue ?? new Uint8Array(0);
+ message.aggregateValue = object.aggregateValue ?? "";
+ return message;
+ },
+};
+
+function createBaseUninterpretedOption_NamePart(): UninterpretedOption_NamePart {
+ return { namePart: "", isExtension: false };
+}
+
+export const UninterpretedOption_NamePart: MessageFns = {
+ encode(message: UninterpretedOption_NamePart, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.namePart !== "") {
+ writer.uint32(10).string(message.namePart);
+ }
+ if (message.isExtension !== false) {
+ writer.uint32(16).bool(message.isExtension);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): UninterpretedOption_NamePart {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseUninterpretedOption_NamePart();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.namePart = reader.string();
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.isExtension = reader.bool();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): UninterpretedOption_NamePart {
+ return UninterpretedOption_NamePart.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): UninterpretedOption_NamePart {
+ const message = createBaseUninterpretedOption_NamePart();
+ message.namePart = object.namePart ?? "";
+ message.isExtension = object.isExtension ?? false;
+ return message;
+ },
+};
+
+function createBaseFeatureSet(): FeatureSet {
+ return {
+ fieldPresence: FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN,
+ enumType: FeatureSet_EnumType.ENUM_TYPE_UNKNOWN,
+ repeatedFieldEncoding: FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN,
+ utf8Validation: FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN,
+ messageEncoding: FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN,
+ jsonFormat: FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN,
+ };
+}
+
+export const FeatureSet: MessageFns = {
+ encode(message: FeatureSet, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (
+ message.fieldPresence !== undefined && message.fieldPresence !== FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN
+ ) {
+ writer.uint32(8).int32(featureSet_FieldPresenceToNumber(message.fieldPresence));
+ }
+ if (message.enumType !== undefined && message.enumType !== FeatureSet_EnumType.ENUM_TYPE_UNKNOWN) {
+ writer.uint32(16).int32(featureSet_EnumTypeToNumber(message.enumType));
+ }
+ if (
+ message.repeatedFieldEncoding !== undefined &&
+ message.repeatedFieldEncoding !== FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN
+ ) {
+ writer.uint32(24).int32(featureSet_RepeatedFieldEncodingToNumber(message.repeatedFieldEncoding));
+ }
+ if (
+ message.utf8Validation !== undefined &&
+ message.utf8Validation !== FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN
+ ) {
+ writer.uint32(32).int32(featureSet_Utf8ValidationToNumber(message.utf8Validation));
+ }
+ if (
+ message.messageEncoding !== undefined &&
+ message.messageEncoding !== FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN
+ ) {
+ writer.uint32(40).int32(featureSet_MessageEncodingToNumber(message.messageEncoding));
+ }
+ if (message.jsonFormat !== undefined && message.jsonFormat !== FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN) {
+ writer.uint32(48).int32(featureSet_JsonFormatToNumber(message.jsonFormat));
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FeatureSet {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFeatureSet();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 8) {
+ break;
+ }
+
+ message.fieldPresence = featureSet_FieldPresenceFromJSON(reader.int32());
+ continue;
+ case 2:
+ if (tag !== 16) {
+ break;
+ }
+
+ message.enumType = featureSet_EnumTypeFromJSON(reader.int32());
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.repeatedFieldEncoding = featureSet_RepeatedFieldEncodingFromJSON(reader.int32());
+ continue;
+ case 4:
+ if (tag !== 32) {
+ break;
+ }
+
+ message.utf8Validation = featureSet_Utf8ValidationFromJSON(reader.int32());
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.messageEncoding = featureSet_MessageEncodingFromJSON(reader.int32());
+ continue;
+ case 6:
+ if (tag !== 48) {
+ break;
+ }
+
+ message.jsonFormat = featureSet_JsonFormatFromJSON(reader.int32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FeatureSet {
+ return FeatureSet.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FeatureSet {
+ const message = createBaseFeatureSet();
+ message.fieldPresence = object.fieldPresence ?? FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN;
+ message.enumType = object.enumType ?? FeatureSet_EnumType.ENUM_TYPE_UNKNOWN;
+ message.repeatedFieldEncoding = object.repeatedFieldEncoding ??
+ FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN;
+ message.utf8Validation = object.utf8Validation ?? FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN;
+ message.messageEncoding = object.messageEncoding ?? FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN;
+ message.jsonFormat = object.jsonFormat ?? FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN;
+ return message;
+ },
+};
+
+function createBaseFeatureSetDefaults(): FeatureSetDefaults {
+ return { defaults: [], minimumEdition: Edition.EDITION_UNKNOWN, maximumEdition: Edition.EDITION_UNKNOWN };
+}
+
+export const FeatureSetDefaults: MessageFns = {
+ encode(message: FeatureSetDefaults, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ for (const v of message.defaults) {
+ FeatureSetDefaults_FeatureSetEditionDefault.encode(v!, writer.uint32(10).fork()).join();
+ }
+ if (message.minimumEdition !== undefined && message.minimumEdition !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(32).int32(editionToNumber(message.minimumEdition));
+ }
+ if (message.maximumEdition !== undefined && message.maximumEdition !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(40).int32(editionToNumber(message.maximumEdition));
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FeatureSetDefaults {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFeatureSetDefaults();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.defaults.push(FeatureSetDefaults_FeatureSetEditionDefault.decode(reader, reader.uint32()));
+ continue;
+ case 4:
+ if (tag !== 32) {
+ break;
+ }
+
+ message.minimumEdition = editionFromJSON(reader.int32());
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.maximumEdition = editionFromJSON(reader.int32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FeatureSetDefaults {
+ return FeatureSetDefaults.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): FeatureSetDefaults {
+ const message = createBaseFeatureSetDefaults();
+ message.defaults = object.defaults?.map((e) => FeatureSetDefaults_FeatureSetEditionDefault.fromPartial(e)) || [];
+ message.minimumEdition = object.minimumEdition ?? Edition.EDITION_UNKNOWN;
+ message.maximumEdition = object.maximumEdition ?? Edition.EDITION_UNKNOWN;
+ return message;
+ },
+};
+
+function createBaseFeatureSetDefaults_FeatureSetEditionDefault(): FeatureSetDefaults_FeatureSetEditionDefault {
+ return { edition: Edition.EDITION_UNKNOWN, overridableFeatures: undefined, fixedFeatures: undefined };
+}
+
+export const FeatureSetDefaults_FeatureSetEditionDefault: MessageFns = {
+ encode(
+ message: FeatureSetDefaults_FeatureSetEditionDefault,
+ writer: BinaryWriter = new BinaryWriter(),
+ ): BinaryWriter {
+ if (message.edition !== undefined && message.edition !== Edition.EDITION_UNKNOWN) {
+ writer.uint32(24).int32(editionToNumber(message.edition));
+ }
+ if (message.overridableFeatures !== undefined) {
+ FeatureSet.encode(message.overridableFeatures, writer.uint32(34).fork()).join();
+ }
+ if (message.fixedFeatures !== undefined) {
+ FeatureSet.encode(message.fixedFeatures, writer.uint32(42).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): FeatureSetDefaults_FeatureSetEditionDefault {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseFeatureSetDefaults_FeatureSetEditionDefault();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.edition = editionFromJSON(reader.int32());
+ continue;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.overridableFeatures = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ case 5:
+ if (tag !== 42) {
+ break;
+ }
+
+ message.fixedFeatures = FeatureSet.decode(reader, reader.uint32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): FeatureSetDefaults_FeatureSetEditionDefault {
+ return FeatureSetDefaults_FeatureSetEditionDefault.fromPartial(base ?? {});
+ },
+ fromPartial(
+ object: DeepPartial,
+ ): FeatureSetDefaults_FeatureSetEditionDefault {
+ const message = createBaseFeatureSetDefaults_FeatureSetEditionDefault();
+ message.edition = object.edition ?? Edition.EDITION_UNKNOWN;
+ message.overridableFeatures = (object.overridableFeatures !== undefined && object.overridableFeatures !== null)
+ ? FeatureSet.fromPartial(object.overridableFeatures)
+ : undefined;
+ message.fixedFeatures = (object.fixedFeatures !== undefined && object.fixedFeatures !== null)
+ ? FeatureSet.fromPartial(object.fixedFeatures)
+ : undefined;
+ return message;
+ },
+};
+
+function createBaseSourceCodeInfo(): SourceCodeInfo {
+ return { location: [] };
+}
+
+export const SourceCodeInfo: MessageFns = {
+ encode(message: SourceCodeInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ for (const v of message.location) {
+ SourceCodeInfo_Location.encode(v!, writer.uint32(10).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): SourceCodeInfo {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseSourceCodeInfo();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.location.push(SourceCodeInfo_Location.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): SourceCodeInfo {
+ return SourceCodeInfo.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): SourceCodeInfo {
+ const message = createBaseSourceCodeInfo();
+ message.location = object.location?.map((e) => SourceCodeInfo_Location.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseSourceCodeInfo_Location(): SourceCodeInfo_Location {
+ return { path: [], span: [], leadingComments: "", trailingComments: "", leadingDetachedComments: [] };
+}
+
+export const SourceCodeInfo_Location: MessageFns = {
+ encode(message: SourceCodeInfo_Location, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ writer.uint32(10).fork();
+ for (const v of message.path) {
+ writer.int32(v);
+ }
+ writer.join();
+ writer.uint32(18).fork();
+ for (const v of message.span) {
+ writer.int32(v);
+ }
+ writer.join();
+ if (message.leadingComments !== undefined && message.leadingComments !== "") {
+ writer.uint32(26).string(message.leadingComments);
+ }
+ if (message.trailingComments !== undefined && message.trailingComments !== "") {
+ writer.uint32(34).string(message.trailingComments);
+ }
+ for (const v of message.leadingDetachedComments) {
+ writer.uint32(50).string(v!);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): SourceCodeInfo_Location {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseSourceCodeInfo_Location();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag === 8) {
+ message.path.push(reader.int32());
+
+ continue;
+ }
+
+ if (tag === 10) {
+ const end2 = reader.uint32() + reader.pos;
+ while (reader.pos < end2) {
+ message.path.push(reader.int32());
+ }
+
+ continue;
+ }
+
+ break;
+ case 2:
+ if (tag === 16) {
+ message.span.push(reader.int32());
+
+ continue;
+ }
+
+ if (tag === 18) {
+ const end2 = reader.uint32() + reader.pos;
+ while (reader.pos < end2) {
+ message.span.push(reader.int32());
+ }
+
+ continue;
+ }
+
+ break;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.leadingComments = reader.string();
+ continue;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.trailingComments = reader.string();
+ continue;
+ case 6:
+ if (tag !== 50) {
+ break;
+ }
+
+ message.leadingDetachedComments.push(reader.string());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): SourceCodeInfo_Location {
+ return SourceCodeInfo_Location.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): SourceCodeInfo_Location {
+ const message = createBaseSourceCodeInfo_Location();
+ message.path = object.path?.map((e) => e) || [];
+ message.span = object.span?.map((e) => e) || [];
+ message.leadingComments = object.leadingComments ?? "";
+ message.trailingComments = object.trailingComments ?? "";
+ message.leadingDetachedComments = object.leadingDetachedComments?.map((e) => e) || [];
+ return message;
+ },
+};
+
+function createBaseGeneratedCodeInfo(): GeneratedCodeInfo {
+ return { annotation: [] };
+}
+
+export const GeneratedCodeInfo: MessageFns = {
+ encode(message: GeneratedCodeInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ for (const v of message.annotation) {
+ GeneratedCodeInfo_Annotation.encode(v!, writer.uint32(10).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): GeneratedCodeInfo {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseGeneratedCodeInfo();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.annotation.push(GeneratedCodeInfo_Annotation.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): GeneratedCodeInfo {
+ return GeneratedCodeInfo.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): GeneratedCodeInfo {
+ const message = createBaseGeneratedCodeInfo();
+ message.annotation = object.annotation?.map((e) => GeneratedCodeInfo_Annotation.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseGeneratedCodeInfo_Annotation(): GeneratedCodeInfo_Annotation {
+ return { path: [], sourceFile: "", begin: 0, end: 0, semantic: GeneratedCodeInfo_Annotation_Semantic.NONE };
+}
+
+export const GeneratedCodeInfo_Annotation: MessageFns = {
+ encode(message: GeneratedCodeInfo_Annotation, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ writer.uint32(10).fork();
+ for (const v of message.path) {
+ writer.int32(v);
+ }
+ writer.join();
+ if (message.sourceFile !== undefined && message.sourceFile !== "") {
+ writer.uint32(18).string(message.sourceFile);
+ }
+ if (message.begin !== undefined && message.begin !== 0) {
+ writer.uint32(24).int32(message.begin);
+ }
+ if (message.end !== undefined && message.end !== 0) {
+ writer.uint32(32).int32(message.end);
+ }
+ if (message.semantic !== undefined && message.semantic !== GeneratedCodeInfo_Annotation_Semantic.NONE) {
+ writer.uint32(40).int32(generatedCodeInfo_Annotation_SemanticToNumber(message.semantic));
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): GeneratedCodeInfo_Annotation {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseGeneratedCodeInfo_Annotation();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag === 8) {
+ message.path.push(reader.int32());
+
+ continue;
+ }
+
+ if (tag === 10) {
+ const end2 = reader.uint32() + reader.pos;
+ while (reader.pos < end2) {
+ message.path.push(reader.int32());
+ }
+
+ continue;
+ }
+
+ break;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.sourceFile = reader.string();
+ continue;
+ case 3:
+ if (tag !== 24) {
+ break;
+ }
+
+ message.begin = reader.int32();
+ continue;
+ case 4:
+ if (tag !== 32) {
+ break;
+ }
+
+ message.end = reader.int32();
+ continue;
+ case 5:
+ if (tag !== 40) {
+ break;
+ }
+
+ message.semantic = generatedCodeInfo_Annotation_SemanticFromJSON(reader.int32());
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): GeneratedCodeInfo_Annotation {
+ return GeneratedCodeInfo_Annotation.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): GeneratedCodeInfo_Annotation {
+ const message = createBaseGeneratedCodeInfo_Annotation();
+ message.path = object.path?.map((e) => e) || [];
+ message.sourceFile = object.sourceFile ?? "";
+ message.begin = object.begin ?? 0;
+ message.end = object.end ?? 0;
+ message.semantic = object.semantic ?? GeneratedCodeInfo_Annotation_Semantic.NONE;
+ return message;
+ },
+};
+
+type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
+
+export type DeepPartial = T extends Builtin ? T
+ : T extends globalThis.Array ? globalThis.Array>
+ : T extends ReadonlyArray ? ReadonlyArray>
+ : T extends {} ? { [K in keyof T]?: DeepPartial }
+ : Partial;
+
+function longToNumber(int64: { toString(): string }): number {
+ const num = globalThis.Number(int64.toString());
+ if (num > globalThis.Number.MAX_SAFE_INTEGER) {
+ throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
+ }
+ if (num < globalThis.Number.MIN_SAFE_INTEGER) {
+ throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER");
+ }
+ return num;
+}
+
+export interface MessageFns {
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
+ create(base?: DeepPartial): T;
+ fromPartial(object: DeepPartial): T;
+}
diff --git a/app/spilotui/frontend/src/app/types/log_service.ts b/app/spilotui/frontend/src/app/types/log_service.ts
new file mode 100644
index 0000000..953be09
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/log_service.ts
@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.3.0
+// protoc unknown
+// source: log_service.proto
+
+/* eslint-disable */
+import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
+
+export const protobufPackage = "spilot.api.v1";
+
+export interface LogResponse {
+ log: string;
+}
+
+export interface LogRequest {
+ log: string;
+}
+
+function createBaseLogResponse(): LogResponse {
+ return { log: "" };
+}
+
+export const LogResponse: MessageFns = {
+ encode(message: LogResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.log !== "") {
+ writer.uint32(10).string(message.log);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): LogResponse {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseLogResponse();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1: {
+ if (tag !== 10) {
+ break;
+ }
+
+ message.log = reader.string();
+ continue;
+ }
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): LogResponse {
+ return LogResponse.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): LogResponse {
+ const message = createBaseLogResponse();
+ message.log = object.log ?? "";
+ return message;
+ },
+};
+
+function createBaseLogRequest(): LogRequest {
+ return { log: "" };
+}
+
+export const LogRequest: MessageFns = {
+ encode(message: LogRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.log !== "") {
+ writer.uint32(10).string(message.log);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): LogRequest {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseLogRequest();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1: {
+ if (tag !== 10) {
+ break;
+ }
+
+ message.log = reader.string();
+ continue;
+ }
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): LogRequest {
+ return LogRequest.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): LogRequest {
+ const message = createBaseLogRequest();
+ message.log = object.log ?? "";
+ return message;
+ },
+};
+
+export type LogServiceDefinition = typeof LogServiceDefinition;
+export const LogServiceDefinition = {
+ name: "LogService",
+ fullName: "spilot.api.v1.LogService",
+ methods: {
+ getLogs: {
+ name: "GetLogs",
+ requestType: LogRequest,
+ requestStream: false,
+ responseType: LogResponse,
+ responseStream: true,
+ options: {},
+ },
+ },
+} as const;
+
+type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
+
+export type DeepPartial = T extends Builtin ? T
+ : T extends globalThis.Array ? globalThis.Array>
+ : T extends ReadonlyArray ? ReadonlyArray>
+ : T extends {} ? { [K in keyof T]?: DeepPartial }
+ : Partial;
+
+export interface MessageFns {
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
+ create(base?: DeepPartial): T;
+ fromPartial(object: DeepPartial): T;
+}
diff --git a/app/spilotui/frontend/src/app/types/proto/api/v1/log_service.ts b/app/spilotui/frontend/src/app/types/proto/api/v1/log_service.ts
new file mode 100644
index 0000000..11dafa5
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/proto/api/v1/log_service.ts
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.2.0
+// protoc unknown
+// source: proto/api/v1/log_service.proto
+
+/* eslint-disable */
+import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
+
+export const protobufPackage = "spilot.api.v1";
+
+export interface LogResponse {
+ log: string;
+}
+
+export interface LogRequest {
+ log: string;
+}
+
+function createBaseLogResponse(): LogResponse {
+ return { log: "" };
+}
+
+export const LogResponse: MessageFns = {
+ encode(message: LogResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.log !== "") {
+ writer.uint32(10).string(message.log);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): LogResponse {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseLogResponse();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.log = reader.string();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): LogResponse {
+ return LogResponse.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): LogResponse {
+ const message = createBaseLogResponse();
+ message.log = object.log ?? "";
+ return message;
+ },
+};
+
+function createBaseLogRequest(): LogRequest {
+ return { log: "" };
+}
+
+export const LogRequest: MessageFns = {
+ encode(message: LogRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.log !== "") {
+ writer.uint32(10).string(message.log);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): LogRequest {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseLogRequest();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.log = reader.string();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): LogRequest {
+ return LogRequest.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): LogRequest {
+ const message = createBaseLogRequest();
+ message.log = object.log ?? "";
+ return message;
+ },
+};
+
+export type LogServiceDefinition = typeof LogServiceDefinition;
+export const LogServiceDefinition = {
+ name: "LogService",
+ fullName: "spilot.api.v1.LogService",
+ methods: {
+ getLogs: {
+ name: "GetLogs",
+ requestType: LogRequest,
+ requestStream: false,
+ responseType: LogResponse,
+ responseStream: true,
+ options: {},
+ },
+ },
+} as const;
+
+type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
+
+export type DeepPartial = T extends Builtin ? T
+ : T extends globalThis.Array ? globalThis.Array>
+ : T extends ReadonlyArray ? ReadonlyArray>
+ : T extends {} ? { [K in keyof T]?: DeepPartial }
+ : Partial;
+
+export interface MessageFns {
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
+ create(base?: DeepPartial): T;
+ fromPartial(object: DeepPartial): T;
+}
diff --git a/app/spilotui/frontend/src/app/types/proto/api/v1/system_service.ts b/app/spilotui/frontend/src/app/types/proto/api/v1/system_service.ts
new file mode 100644
index 0000000..7a1a04d
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/proto/api/v1/system_service.ts
@@ -0,0 +1,139 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.2.0
+// protoc unknown
+// source: proto/api/v1/system_service.proto
+
+/* eslint-disable */
+import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
+
+export const protobufPackage = "spilot.api.v1";
+
+export interface GetStatusRequest {
+}
+
+export interface GetStatusResponse {
+ system: string;
+ uptime: string;
+}
+
+function createBaseGetStatusRequest(): GetStatusRequest {
+ return {};
+}
+
+export const GetStatusRequest: MessageFns = {
+ encode(_: GetStatusRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): GetStatusRequest {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseGetStatusRequest();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): GetStatusRequest {
+ return GetStatusRequest.fromPartial(base ?? {});
+ },
+ fromPartial(_: DeepPartial): GetStatusRequest {
+ const message = createBaseGetStatusRequest();
+ return message;
+ },
+};
+
+function createBaseGetStatusResponse(): GetStatusResponse {
+ return { system: "", uptime: "" };
+}
+
+export const GetStatusResponse: MessageFns = {
+ encode(message: GetStatusResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.system !== "") {
+ writer.uint32(10).string(message.system);
+ }
+ if (message.uptime !== "") {
+ writer.uint32(18).string(message.uptime);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): GetStatusResponse {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseGetStatusResponse();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.system = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.uptime = reader.string();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): GetStatusResponse {
+ return GetStatusResponse.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): GetStatusResponse {
+ const message = createBaseGetStatusResponse();
+ message.system = object.system ?? "";
+ message.uptime = object.uptime ?? "";
+ return message;
+ },
+};
+
+export type SystemServicesDefinition = typeof SystemServicesDefinition;
+export const SystemServicesDefinition = {
+ name: "SystemServices",
+ fullName: "spilot.api.v1.SystemServices",
+ methods: {
+ getStatus: {
+ name: "GetStatus",
+ requestType: GetStatusRequest,
+ requestStream: false,
+ responseType: GetStatusResponse,
+ responseStream: false,
+ options: {},
+ },
+ },
+} as const;
+
+type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
+
+export type DeepPartial = T extends Builtin ? T
+ : T extends globalThis.Array ? globalThis.Array>
+ : T extends ReadonlyArray ? ReadonlyArray>
+ : T extends {} ? { [K in keyof T]?: DeepPartial }
+ : Partial;
+
+export interface MessageFns {
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
+ create(base?: DeepPartial): T;
+ fromPartial(object: DeepPartial): T;
+}
diff --git a/app/spilotui/frontend/src/app/types/proto/google/api/annotations.ts b/app/spilotui/frontend/src/app/types/proto/google/api/annotations.ts
new file mode 100644
index 0000000..d7c6306
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/proto/google/api/annotations.ts
@@ -0,0 +1,9 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.2.0
+// protoc unknown
+// source: proto/google/api/annotations.proto
+
+/* eslint-disable */
+
+export const protobufPackage = "spilot.api.v1";
diff --git a/app/spilotui/frontend/src/app/types/proto/google/api/http.ts b/app/spilotui/frontend/src/app/types/proto/google/api/http.ts
new file mode 100644
index 0000000..300f327
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/proto/google/api/http.ts
@@ -0,0 +1,292 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.2.0
+// protoc unknown
+// source: proto/google/api/http.proto
+
+/* eslint-disable */
+import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
+
+export const protobufPackage = "spilot.api.v1";
+
+export interface Http {
+ rules: HttpRule[];
+}
+
+export interface HttpRule {
+ get?: string | undefined;
+ put?: string | undefined;
+ post?: string | undefined;
+ delete?: string | undefined;
+ patch?: string | undefined;
+ custom?: CustomHttpPattern | undefined;
+ selector: string;
+ body: string;
+ additionalBindings: HttpRule[];
+}
+
+export interface CustomHttpPattern {
+ kind: string;
+ path: string;
+}
+
+function createBaseHttp(): Http {
+ return { rules: [] };
+}
+
+export const Http: MessageFns = {
+ encode(message: Http, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ for (const v of message.rules) {
+ HttpRule.encode(v!, writer.uint32(10).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): Http {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseHttp();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.rules.push(HttpRule.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): Http {
+ return Http.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): Http {
+ const message = createBaseHttp();
+ message.rules = object.rules?.map((e) => HttpRule.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseHttpRule(): HttpRule {
+ return {
+ get: undefined,
+ put: undefined,
+ post: undefined,
+ delete: undefined,
+ patch: undefined,
+ custom: undefined,
+ selector: "",
+ body: "",
+ additionalBindings: [],
+ };
+}
+
+export const HttpRule: MessageFns = {
+ encode(message: HttpRule, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.get !== undefined) {
+ writer.uint32(18).string(message.get);
+ }
+ if (message.put !== undefined) {
+ writer.uint32(26).string(message.put);
+ }
+ if (message.post !== undefined) {
+ writer.uint32(34).string(message.post);
+ }
+ if (message.delete !== undefined) {
+ writer.uint32(42).string(message.delete);
+ }
+ if (message.patch !== undefined) {
+ writer.uint32(50).string(message.patch);
+ }
+ if (message.custom !== undefined) {
+ CustomHttpPattern.encode(message.custom, writer.uint32(66).fork()).join();
+ }
+ if (message.selector !== "") {
+ writer.uint32(10).string(message.selector);
+ }
+ if (message.body !== "") {
+ writer.uint32(58).string(message.body);
+ }
+ for (const v of message.additionalBindings) {
+ HttpRule.encode(v!, writer.uint32(90).fork()).join();
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): HttpRule {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseHttpRule();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.get = reader.string();
+ continue;
+ case 3:
+ if (tag !== 26) {
+ break;
+ }
+
+ message.put = reader.string();
+ continue;
+ case 4:
+ if (tag !== 34) {
+ break;
+ }
+
+ message.post = reader.string();
+ continue;
+ case 5:
+ if (tag !== 42) {
+ break;
+ }
+
+ message.delete = reader.string();
+ continue;
+ case 6:
+ if (tag !== 50) {
+ break;
+ }
+
+ message.patch = reader.string();
+ continue;
+ case 8:
+ if (tag !== 66) {
+ break;
+ }
+
+ message.custom = CustomHttpPattern.decode(reader, reader.uint32());
+ continue;
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.selector = reader.string();
+ continue;
+ case 7:
+ if (tag !== 58) {
+ break;
+ }
+
+ message.body = reader.string();
+ continue;
+ case 11:
+ if (tag !== 90) {
+ break;
+ }
+
+ message.additionalBindings.push(HttpRule.decode(reader, reader.uint32()));
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): HttpRule {
+ return HttpRule.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): HttpRule {
+ const message = createBaseHttpRule();
+ message.get = object.get ?? undefined;
+ message.put = object.put ?? undefined;
+ message.post = object.post ?? undefined;
+ message.delete = object.delete ?? undefined;
+ message.patch = object.patch ?? undefined;
+ message.custom = (object.custom !== undefined && object.custom !== null)
+ ? CustomHttpPattern.fromPartial(object.custom)
+ : undefined;
+ message.selector = object.selector ?? "";
+ message.body = object.body ?? "";
+ message.additionalBindings = object.additionalBindings?.map((e) => HttpRule.fromPartial(e)) || [];
+ return message;
+ },
+};
+
+function createBaseCustomHttpPattern(): CustomHttpPattern {
+ return { kind: "", path: "" };
+}
+
+export const CustomHttpPattern: MessageFns = {
+ encode(message: CustomHttpPattern, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.kind !== "") {
+ writer.uint32(10).string(message.kind);
+ }
+ if (message.path !== "") {
+ writer.uint32(18).string(message.path);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): CustomHttpPattern {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseCustomHttpPattern();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.kind = reader.string();
+ continue;
+ case 2:
+ if (tag !== 18) {
+ break;
+ }
+
+ message.path = reader.string();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): CustomHttpPattern {
+ return CustomHttpPattern.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): CustomHttpPattern {
+ const message = createBaseCustomHttpPattern();
+ message.kind = object.kind ?? "";
+ message.path = object.path ?? "";
+ return message;
+ },
+};
+
+type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
+
+export type DeepPartial = T extends Builtin ? T
+ : T extends globalThis.Array ? globalThis.Array>
+ : T extends ReadonlyArray ? ReadonlyArray>
+ : T extends {} ? { [K in keyof T]?: DeepPartial }
+ : Partial;
+
+export interface MessageFns {
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
+ create(base?: DeepPartial): T;
+ fromPartial(object: DeepPartial): T;
+}
diff --git a/app/spilotui/frontend/src/app/types/proto/store/status.ts b/app/spilotui/frontend/src/app/types/proto/store/status.ts
new file mode 100644
index 0000000..da62da3
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/proto/store/status.ts
@@ -0,0 +1,111 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.2.0
+// protoc unknown
+// source: proto/store/status.proto
+
+/* eslint-disable */
+import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
+
+export const protobufPackage = "spilot.store";
+
+export interface StatusRequest {
+}
+
+export interface StatusResponse {
+ status: string;
+}
+
+function createBaseStatusRequest(): StatusRequest {
+ return {};
+}
+
+export const StatusRequest: MessageFns = {
+ encode(_: StatusRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): StatusRequest {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseStatusRequest();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): StatusRequest {
+ return StatusRequest.fromPartial(base ?? {});
+ },
+ fromPartial(_: DeepPartial): StatusRequest {
+ const message = createBaseStatusRequest();
+ return message;
+ },
+};
+
+function createBaseStatusResponse(): StatusResponse {
+ return { status: "" };
+}
+
+export const StatusResponse: MessageFns = {
+ encode(message: StatusResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.status !== "") {
+ writer.uint32(10).string(message.status);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): StatusResponse {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseStatusResponse();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1:
+ if (tag !== 10) {
+ break;
+ }
+
+ message.status = reader.string();
+ continue;
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): StatusResponse {
+ return StatusResponse.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): StatusResponse {
+ const message = createBaseStatusResponse();
+ message.status = object.status ?? "";
+ return message;
+ },
+};
+
+type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
+
+export type DeepPartial = T extends Builtin ? T
+ : T extends globalThis.Array ? globalThis.Array>
+ : T extends ReadonlyArray ? ReadonlyArray>
+ : T extends {} ? { [K in keyof T]?: DeepPartial }
+ : Partial;
+
+export interface MessageFns {
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
+ create(base?: DeepPartial): T;
+ fromPartial(object: DeepPartial): T;
+}
diff --git a/app/spilotui/frontend/src/app/types/system_service.ts b/app/spilotui/frontend/src/app/types/system_service.ts
new file mode 100644
index 0000000..6dc5561
--- /dev/null
+++ b/app/spilotui/frontend/src/app/types/system_service.ts
@@ -0,0 +1,128 @@
+// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
+// versions:
+// protoc-gen-ts_proto v2.3.0
+// protoc unknown
+// source: system_service.proto
+
+/* eslint-disable */
+import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
+
+export const protobufPackage = "spilot.api.v1";
+
+export interface GetStatusRequest {
+}
+
+export interface GetStatusResponse {
+ system: string;
+}
+
+function createBaseGetStatusRequest(): GetStatusRequest {
+ return {};
+}
+
+export const GetStatusRequest: MessageFns = {
+ encode(_: GetStatusRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): GetStatusRequest {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseGetStatusRequest();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): GetStatusRequest {
+ return GetStatusRequest.fromPartial(base ?? {});
+ },
+ fromPartial(_: DeepPartial): GetStatusRequest {
+ const message = createBaseGetStatusRequest();
+ return message;
+ },
+};
+
+function createBaseGetStatusResponse(): GetStatusResponse {
+ return { system: "" };
+}
+
+export const GetStatusResponse: MessageFns = {
+ encode(message: GetStatusResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
+ if (message.system !== "") {
+ writer.uint32(10).string(message.system);
+ }
+ return writer;
+ },
+
+ decode(input: BinaryReader | Uint8Array, length?: number): GetStatusResponse {
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
+ let end = length === undefined ? reader.len : reader.pos + length;
+ const message = createBaseGetStatusResponse();
+ while (reader.pos < end) {
+ const tag = reader.uint32();
+ switch (tag >>> 3) {
+ case 1: {
+ if (tag !== 10) {
+ break;
+ }
+
+ message.system = reader.string();
+ continue;
+ }
+ }
+ if ((tag & 7) === 4 || tag === 0) {
+ break;
+ }
+ reader.skip(tag & 7);
+ }
+ return message;
+ },
+
+ create(base?: DeepPartial): GetStatusResponse {
+ return GetStatusResponse.fromPartial(base ?? {});
+ },
+ fromPartial(object: DeepPartial): GetStatusResponse {
+ const message = createBaseGetStatusResponse();
+ message.system = object.system ?? "";
+ return message;
+ },
+};
+
+export type SystemServicesDefinition = typeof SystemServicesDefinition;
+export const SystemServicesDefinition = {
+ name: "SystemServices",
+ fullName: "spilot.api.v1.SystemServices",
+ methods: {
+ getStatus: {
+ name: "GetStatus",
+ requestType: GetStatusRequest,
+ requestStream: false,
+ responseType: GetStatusResponse,
+ responseStream: false,
+ options: {},
+ },
+ },
+} as const;
+
+type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
+
+export type DeepPartial = T extends Builtin ? T
+ : T extends globalThis.Array ? globalThis.Array>
+ : T extends ReadonlyArray ? ReadonlyArray>
+ : T extends {} ? { [K in keyof T]?: DeepPartial }
+ : Partial;
+
+export interface MessageFns {
+ encode(message: T, writer?: BinaryWriter): BinaryWriter;
+ decode(input: BinaryReader | Uint8Array, length?: number): T;
+ create(base?: DeepPartial): T;
+ fromPartial(object: DeepPartial): T;
+}
diff --git a/app/spilotui/frontend/src/assets/fonts/OFL.txt b/app/spilotui/frontend/src/assets/fonts/OFL.txt
new file mode 100644
index 0000000..9cac04c
--- /dev/null
+++ b/app/spilotui/frontend/src/assets/fonts/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com),
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/app/spilotui/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 b/app/spilotui/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2
new file mode 100644
index 0000000..2f9cc59
Binary files /dev/null and b/app/spilotui/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 differ
diff --git a/app/spilotui/frontend/src/assets/images/logo-universal.png b/app/spilotui/frontend/src/assets/images/logo-universal.png
new file mode 100644
index 0000000..99ac71f
Binary files /dev/null and b/app/spilotui/frontend/src/assets/images/logo-universal.png differ
diff --git a/app/spilotui/frontend/src/hooks/use-toast.ts b/app/spilotui/frontend/src/hooks/use-toast.ts
new file mode 100644
index 0000000..88e7e6d
--- /dev/null
+++ b/app/spilotui/frontend/src/hooks/use-toast.ts
@@ -0,0 +1,188 @@
+import * as React from 'react';
+
+import type { ToastActionElement, ToastProps } from '@/shadcn/toast';
+
+const TOAST_LIMIT = 1;
+const TOAST_REMOVE_DELAY = 1000000;
+
+type ToasterToast = ToastProps & {
+ id: string;
+ title?: React.ReactNode;
+ description?: React.ReactNode;
+ action?: ToastActionElement;
+};
+
+const actionTypes = {
+ ADD_TOAST: 'ADD_TOAST',
+ UPDATE_TOAST: 'UPDATE_TOAST',
+ DISMISS_TOAST: 'DISMISS_TOAST',
+ REMOVE_TOAST: 'REMOVE_TOAST',
+} as const;
+
+let count = 0;
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
+ return count.toString();
+}
+
+type ActionType = typeof actionTypes;
+
+type Action =
+ | {
+ type: ActionType['ADD_TOAST'];
+ toast: ToasterToast;
+ }
+ | {
+ type: ActionType['UPDATE_TOAST'];
+ toast: Partial;
+ }
+ | {
+ type: ActionType['DISMISS_TOAST'];
+ toastId?: ToasterToast['id'];
+ }
+ | {
+ type: ActionType['REMOVE_TOAST'];
+ toastId?: ToasterToast['id'];
+ };
+
+interface State {
+ toasts: ToasterToast[];
+}
+
+const toastTimeouts = new Map>();
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId);
+ dispatch({
+ type: 'REMOVE_TOAST',
+ toastId: toastId,
+ });
+ }, TOAST_REMOVE_DELAY);
+
+ toastTimeouts.set(toastId, timeout);
+};
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case 'ADD_TOAST':
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+ };
+
+ case 'UPDATE_TOAST':
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ ),
+ };
+
+ case 'DISMISS_TOAST': {
+ const { toastId } = action;
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId);
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id);
+ });
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false,
+ }
+ : t
+ ),
+ };
+ }
+ case 'REMOVE_TOAST':
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: [],
+ };
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
+ };
+ }
+};
+
+const listeners: Array<(state: State) => void> = [];
+
+let memoryState: State = { toasts: [] };
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action);
+ listeners.forEach((listener) => {
+ listener(memoryState);
+ });
+}
+
+type Toast = Omit;
+
+function toast({ ...props }: Toast) {
+ const id = genId();
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: 'UPDATE_TOAST',
+ toast: { ...props, id },
+ });
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id });
+
+ dispatch({
+ type: 'ADD_TOAST',
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss();
+ },
+ },
+ });
+
+ return {
+ id: id,
+ dismiss,
+ update,
+ };
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState);
+
+ React.useEffect(() => {
+ listeners.push(setState);
+ return () => {
+ const index = listeners.indexOf(setState);
+ if (index > -1) {
+ listeners.splice(index, 1);
+ }
+ };
+ }, [state]);
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),
+ };
+}
+
+export { useToast, toast };
diff --git a/app/spilotui/frontend/src/lib/utils.ts b/app/spilotui/frontend/src/lib/utils.ts
new file mode 100644
index 0000000..f867a3e
--- /dev/null
+++ b/app/spilotui/frontend/src/lib/utils.ts
@@ -0,0 +1,36 @@
+import { clsx, type ClassValue } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+import { cva, type VariantProps } from 'class-variance-authority';
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+}
+
+export const buttonVariants = cva(
+ 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
+ {
+ variants: {
+ variant: {
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
+ destructive:
+ 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
+ outline:
+ 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
+ secondary:
+ 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
+ link: 'text-primary underline-offset-4 hover:underline',
+ },
+ size: {
+ default: 'h-10 px-4 py-2',
+ sm: 'h-9 rounded-md px-3',
+ lg: 'h-11 rounded-md px-8',
+ icon: 'h-10 w-10',
+ },
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default',
+ },
+ }
+);
diff --git a/app/spilotui/frontend/src/main.tsx b/app/spilotui/frontend/src/main.tsx
new file mode 100644
index 0000000..0aca0b8
--- /dev/null
+++ b/app/spilotui/frontend/src/main.tsx
@@ -0,0 +1,26 @@
+import React from 'react';
+import { createRoot } from 'react-dom/client';
+import '@radix-ui/themes/styles.css';
+import './output.css';
+import App from './App';
+import { Theme, ThemePanel } from '@radix-ui/themes';
+
+const container = document.getElementById('root');
+
+const root = createRoot(container!);
+
+root.render(
+
+
+
+);
diff --git a/app/spilotui/frontend/src/output.css b/app/spilotui/frontend/src/output.css
new file mode 100644
index 0000000..0ab2067
--- /dev/null
+++ b/app/spilotui/frontend/src/output.css
@@ -0,0 +1,1563 @@
+@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap');
+
+*, ::before, ::after{
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+::backdrop{
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-gradient-from-position: ;
+ --tw-gradient-via-position: ;
+ --tw-gradient-to-position: ;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+ --tw-contain-size: ;
+ --tw-contain-layout: ;
+ --tw-contain-paint: ;
+ --tw-contain-style: ;
+}
+
+/*
+! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+ /* 1 */
+ border-width: 0;
+ /* 2 */
+ border-style: solid;
+ /* 2 */
+ border-color: #e5e7eb;
+ /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings by default.
+7. Disable tap highlights on iOS
+*/
+
+html,
+:host {
+ line-height: 1.5;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+ -moz-tab-size: 4;
+ /* 3 */
+ -o-tab-size: 4;
+ tab-size: 4;
+ /* 3 */
+ font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ /* 4 */
+ font-feature-settings: normal;
+ /* 5 */
+ font-variation-settings: normal;
+ /* 6 */
+ -webkit-tap-highlight-color: transparent;
+ /* 7 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0;
+ /* 1 */
+ line-height: inherit;
+ /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ border-top-width: 1px;
+ /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font-family by default.
+2. Use the user's configured `mono` font-feature-settings by default.
+3. Use the user's configured `mono` font-variation-settings by default.
+4. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ /* 1 */
+ font-feature-settings: normal;
+ /* 2 */
+ font-variation-settings: normal;
+ /* 3 */
+ font-size: 1em;
+ /* 4 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0;
+ /* 1 */
+ border-color: inherit;
+ /* 2 */
+ border-collapse: collapse;
+ /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-feature-settings: inherit;
+ /* 1 */
+ font-variation-settings: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ font-weight: inherit;
+ /* 1 */
+ line-height: inherit;
+ /* 1 */
+ letter-spacing: inherit;
+ /* 1 */
+ color: inherit;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+ padding: 0;
+ /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+input:where([type='button']),
+input:where([type='reset']),
+input:where([type='submit']) {
+ -webkit-appearance: button;
+ /* 1 */
+ background-color: transparent;
+ /* 2 */
+ background-image: none;
+ /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+Reset default styling for dialogs.
+*/
+
+dialog {
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ /* 1 */
+ vertical-align: middle;
+ /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+
+[hidden] {
+ display: none;
+}
+
+.container{
+ width: 100%;
+ margin-right: auto;
+ margin-left: auto;
+ padding-right: 2rem;
+ padding-left: 2rem;
+}
+
+@media (min-width: 1400px){
+ .container{
+ max-width: 1400px;
+ }
+}
+
+.sr-only{
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0;
+}
+
+.pointer-events-auto{
+ pointer-events: auto;
+}
+
+.fixed{
+ position: fixed;
+}
+
+.absolute{
+ position: absolute;
+}
+
+.relative{
+ position: relative;
+}
+
+.right-2{
+ right: 0.5rem;
+}
+
+.top-0{
+ top: 0px;
+}
+
+.top-2{
+ top: 0.5rem;
+}
+
+.z-10{
+ z-index: 10;
+}
+
+.z-\[100\]{
+ z-index: 100;
+}
+
+.mx-5{
+ margin-left: 1.25rem;
+ margin-right: 1.25rem;
+}
+
+.mx-2{
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+}
+
+.ml-auto{
+ margin-left: auto;
+}
+
+.mr-2{
+ margin-right: 0.5rem;
+}
+
+.flex{
+ display: flex;
+}
+
+.inline-flex{
+ display: inline-flex;
+}
+
+.grid{
+ display: grid;
+}
+
+.h-10{
+ height: 2.5rem;
+}
+
+.h-11{
+ height: 2.75rem;
+}
+
+.h-2\.5{
+ height: 0.625rem;
+}
+
+.h-4{
+ height: 1rem;
+}
+
+.h-8{
+ height: 2rem;
+}
+
+.h-9{
+ height: 2.25rem;
+}
+
+.h-\[52px\]{
+ height: 52px;
+}
+
+.h-full{
+ height: 100%;
+}
+
+.h-screen{
+ height: 100vh;
+}
+
+.h-36{
+ height: 9rem;
+}
+
+.h-52{
+ height: 13rem;
+}
+
+.h-64{
+ height: 16rem;
+}
+
+.max-h-screen{
+ max-height: 100vh;
+}
+
+.w-10{
+ width: 2.5rem;
+}
+
+.w-2\.5{
+ width: 0.625rem;
+}
+
+.w-3{
+ width: 0.75rem;
+}
+
+.w-4{
+ width: 1rem;
+}
+
+.w-9{
+ width: 2.25rem;
+}
+
+.w-full{
+ width: 100%;
+}
+
+.w-px{
+ width: 1px;
+}
+
+.min-w-\[50px\]{
+ min-width: 50px;
+}
+
+.shrink-0{
+ flex-shrink: 0;
+}
+
+.flex-col{
+ flex-direction: column;
+}
+
+.flex-col-reverse{
+ flex-direction: column-reverse;
+}
+
+.items-center{
+ align-items: center;
+}
+
+.items-stretch{
+ align-items: stretch;
+}
+
+.justify-start{
+ justify-content: flex-start;
+}
+
+.justify-center{
+ justify-content: center;
+}
+
+.justify-between{
+ justify-content: space-between;
+}
+
+.gap-1{
+ gap: 0.25rem;
+}
+
+.gap-2{
+ gap: 0.5rem;
+}
+
+.gap-4{
+ gap: 1rem;
+}
+
+.space-x-2 > :not([hidden]) ~ :not([hidden]){
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-4 > :not([hidden]) ~ :not([hidden]){
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.overflow-hidden{
+ overflow: hidden;
+}
+
+.whitespace-nowrap{
+ white-space: nowrap;
+}
+
+.rounded-md{
+ border-radius: calc(var(--radius) - 2px);
+}
+
+.rounded-sm{
+ border-radius: calc(var(--radius) - 4px);
+}
+
+.rounded-full{
+ border-radius: 9999px;
+}
+
+.rounded-xl{
+ border-radius: 0.75rem;
+}
+
+.rounded-lg{
+ border-radius: var(--radius);
+}
+
+.rounded-3xl{
+ border-radius: 1.5rem;
+}
+
+.rounded-2xl{
+ border-radius: 1rem;
+}
+
+.border{
+ border-width: 1px;
+}
+
+.border-b{
+ border-bottom-width: 1px;
+}
+
+.border-t{
+ border-top-width: 1px;
+}
+
+.border-r{
+ border-right-width: 1px;
+}
+
+.border-destructive{
+ border-color: hsl(var(--destructive));
+}
+
+.border-input{
+ border-color: hsl(var(--input));
+}
+
+.bg-background{
+ background-color: hsl(var(--background));
+}
+
+.bg-border{
+ background-color: hsl(var(--border));
+}
+
+.bg-destructive{
+ background-color: hsl(var(--destructive));
+}
+
+.bg-primary{
+ background-color: hsl(var(--primary));
+}
+
+.bg-secondary{
+ background-color: hsl(var(--secondary));
+}
+
+.bg-transparent{
+ background-color: transparent;
+}
+
+.bg-black{
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 0 0 / var(--tw-bg-opacity));
+}
+
+.bg-slate-100{
+ --tw-bg-opacity: 1;
+ background-color: rgb(241 245 249 / var(--tw-bg-opacity));
+}
+
+.bg-gray-100{
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.bg-white{
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+}
+
+.p-1{
+ padding: 0.25rem;
+}
+
+.p-4{
+ padding: 1rem;
+}
+
+.p-6{
+ padding: 1.5rem;
+}
+
+.px-2{
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.px-3{
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.px-4{
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.px-8{
+ padding-left: 2rem;
+ padding-right: 2rem;
+}
+
+.py-2{
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.py-5{
+ padding-top: 1.25rem;
+ padding-bottom: 1.25rem;
+}
+
+.px-5{
+ padding-left: 1.25rem;
+ padding-right: 1.25rem;
+}
+
+.py-4{
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.pr-8{
+ padding-right: 2rem;
+}
+
+.pt-2{
+ padding-top: 0.5rem;
+}
+
+.pt-4{
+ padding-top: 1rem;
+}
+
+.font-nato{
+ font-family: Noto Sans;
+}
+
+.text-sm{
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.text-xl{
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+.text-xs{
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.font-bold{
+ font-weight: 700;
+}
+
+.font-medium{
+ font-weight: 500;
+}
+
+.font-semibold{
+ font-weight: 600;
+}
+
+.leading-none{
+ line-height: 1;
+}
+
+.leading-5{
+ line-height: 1.25rem;
+}
+
+.text-background{
+ color: hsl(var(--background));
+}
+
+.text-destructive-foreground{
+ color: hsl(var(--destructive-foreground));
+}
+
+.text-foreground{
+ color: hsl(var(--foreground));
+}
+
+.text-foreground\/50{
+ color: hsl(var(--foreground) / 0.5);
+}
+
+.text-gray-300{
+ --tw-text-opacity: 1;
+ color: rgb(209 213 219 / var(--tw-text-opacity));
+}
+
+.text-muted-foreground{
+ color: hsl(var(--muted-foreground));
+}
+
+.text-primary{
+ color: hsl(var(--primary));
+}
+
+.text-primary-foreground{
+ color: hsl(var(--primary-foreground));
+}
+
+.text-red-600{
+ --tw-text-opacity: 1;
+ color: rgb(220 38 38 / var(--tw-text-opacity));
+}
+
+.text-secondary-foreground{
+ color: hsl(var(--secondary-foreground));
+}
+
+.text-gray-500{
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.text-green-600{
+ --tw-text-opacity: 1;
+ color: rgb(22 163 74 / var(--tw-text-opacity));
+}
+
+.text-green-950{
+ --tw-text-opacity: 1;
+ color: rgb(5 46 22 / var(--tw-text-opacity));
+}
+
+.text-green-700{
+ --tw-text-opacity: 1;
+ color: rgb(21 128 61 / var(--tw-text-opacity));
+}
+
+.text-gray-400{
+ --tw-text-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-text-opacity));
+}
+
+.text-gray-600{
+ --tw-text-opacity: 1;
+ color: rgb(75 85 99 / var(--tw-text-opacity));
+}
+
+.underline-offset-4{
+ text-underline-offset: 4px;
+}
+
+.opacity-0{
+ opacity: 0;
+}
+
+.opacity-90{
+ opacity: 0.9;
+}
+
+.shadow-lg{
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.outline{
+ outline-style: solid;
+}
+
+.ring-offset-background{
+ --tw-ring-offset-color: hsl(var(--background));
+}
+
+.filter{
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
+}
+
+.transition-all{
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-colors{
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-opacity{
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.duration-300{
+ transition-duration: 300ms;
+}
+
+.ease-in-out{
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+@keyframes enter{
+ from{
+ opacity: var(--tw-enter-opacity, 1);
+ transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));
+ }
+}
+
+@keyframes exit{
+ to{
+ opacity: var(--tw-exit-opacity, 1);
+ transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
+ }
+}
+
+.duration-300{
+ animation-duration: 300ms;
+}
+
+.ease-in-out{
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+/* @layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 40% 98%;
+
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 222.2 84% 4.9%;
+
+ --radius: 0.5rem;
+ }
+
+ .dark {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 212.7 26.8% 83.9%;
+ }
+} */
+
+/* @layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+} */
+
+.after\:absolute::after{
+ content: var(--tw-content);
+ position: absolute;
+}
+
+.after\:inset-y-0::after{
+ content: var(--tw-content);
+ top: 0px;
+ bottom: 0px;
+}
+
+.after\:left-1\/2::after{
+ content: var(--tw-content);
+ left: 50%;
+}
+
+.after\:w-1::after{
+ content: var(--tw-content);
+ width: 0.25rem;
+}
+
+.after\:-translate-x-1\/2::after{
+ content: var(--tw-content);
+ --tw-translate-x: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.hover\:bg-accent:hover{
+ background-color: hsl(var(--accent));
+}
+
+.hover\:bg-destructive\/90:hover{
+ background-color: hsl(var(--destructive) / 0.9);
+}
+
+.hover\:bg-primary\/90:hover{
+ background-color: hsl(var(--primary) / 0.9);
+}
+
+.hover\:bg-secondary:hover{
+ background-color: hsl(var(--secondary));
+}
+
+.hover\:bg-secondary\/80:hover{
+ background-color: hsl(var(--secondary) / 0.8);
+}
+
+.hover\:text-accent-foreground:hover{
+ color: hsl(var(--accent-foreground));
+}
+
+.hover\:text-foreground:hover{
+ color: hsl(var(--foreground));
+}
+
+.hover\:underline:hover{
+ text-decoration-line: underline;
+}
+
+.focus\:opacity-100:focus{
+ opacity: 1;
+}
+
+.focus\:outline-none:focus{
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus\:ring-2:focus{
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus\:ring-ring:focus{
+ --tw-ring-color: hsl(var(--ring));
+}
+
+.focus\:ring-offset-2:focus{
+ --tw-ring-offset-width: 2px;
+}
+
+.focus-visible\:outline-none:focus-visible{
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus-visible\:ring-1:focus-visible{
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus-visible\:ring-2:focus-visible{
+ --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
+ --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
+ box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
+}
+
+.focus-visible\:ring-ring:focus-visible{
+ --tw-ring-color: hsl(var(--ring));
+}
+
+.focus-visible\:ring-offset-1:focus-visible{
+ --tw-ring-offset-width: 1px;
+}
+
+.focus-visible\:ring-offset-2:focus-visible{
+ --tw-ring-offset-width: 2px;
+}
+
+.disabled\:pointer-events-none:disabled{
+ pointer-events: none;
+}
+
+.disabled\:opacity-50:disabled{
+ opacity: 0.5;
+}
+
+.group:hover .group-hover\:opacity-100{
+ opacity: 1;
+}
+
+.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:justify-center{
+ justify-content: center;
+}
+
+.group.destructive .group-\[\.destructive\]\:border-muted\/40{
+ border-color: hsl(var(--muted) / 0.4);
+}
+
+.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:px-2{
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.group.destructive .group-\[\.destructive\]\:text-red-300{
+ --tw-text-opacity: 1;
+ color: rgb(252 165 165 / var(--tw-text-opacity));
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover{
+ border-color: hsl(var(--destructive) / 0.3);
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover{
+ background-color: hsl(var(--destructive));
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover{
+ color: hsl(var(--destructive-foreground));
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover{
+ --tw-text-opacity: 1;
+ color: rgb(254 242 242 / var(--tw-text-opacity));
+}
+
+.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus{
+ --tw-ring-color: hsl(var(--destructive));
+}
+
+.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus{
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity));
+}
+
+.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus{
+ --tw-ring-offset-color: #dc2626;
+}
+
+.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction="vertical"]{
+ height: 1px;
+}
+
+.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction="vertical"]{
+ width: 100%;
+}
+
+.data-\[swipe\=cancel\]\:translate-x-0[data-swipe="cancel"]{
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe="end"]{
+ --tw-translate-x: var(--radix-toast-swipe-end-x);
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe="move"]{
+ --tw-translate-x: var(--radix-toast-swipe-move-x);
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction="vertical"]{
+ flex-direction: column;
+}
+
+.data-\[collapsed\=true\]\:py-2[data-collapsed="true"]{
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.data-\[swipe\=move\]\:transition-none[data-swipe="move"]{
+ transition-property: none;
+}
+
+.data-\[state\=open\]\:animate-in[data-state="open"]{
+ animation-name: enter;
+ animation-duration: 150ms;
+ --tw-enter-opacity: initial;
+ --tw-enter-scale: initial;
+ --tw-enter-rotate: initial;
+ --tw-enter-translate-x: initial;
+ --tw-enter-translate-y: initial;
+}
+
+.data-\[state\=closed\]\:animate-out[data-state="closed"]{
+ animation-name: exit;
+ animation-duration: 150ms;
+ --tw-exit-opacity: initial;
+ --tw-exit-scale: initial;
+ --tw-exit-rotate: initial;
+ --tw-exit-translate-x: initial;
+ --tw-exit-translate-y: initial;
+}
+
+.data-\[swipe\=end\]\:animate-out[data-swipe="end"]{
+ animation-name: exit;
+ animation-duration: 150ms;
+ --tw-exit-opacity: initial;
+ --tw-exit-scale: initial;
+ --tw-exit-rotate: initial;
+ --tw-exit-translate-x: initial;
+ --tw-exit-translate-y: initial;
+}
+
+.data-\[state\=closed\]\:fade-out-80[data-state="closed"]{
+ --tw-exit-opacity: 0.8;
+}
+
+.data-\[state\=closed\]\:slide-out-to-right-full[data-state="closed"]{
+ --tw-exit-translate-x: 100%;
+}
+
+.data-\[state\=open\]\:slide-in-from-top-full[data-state="open"]{
+ --tw-enter-translate-y: -100%;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction="vertical"]::after{
+ content: var(--tw-content);
+ left: 0px;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction="vertical"]::after{
+ content: var(--tw-content);
+ height: 0.25rem;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction="vertical"]::after{
+ content: var(--tw-content);
+ width: 100%;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction="vertical"]::after{
+ content: var(--tw-content);
+ --tw-translate-y: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction="vertical"]::after{
+ content: var(--tw-content);
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.dark\:bg-muted:is(.dark *){
+ background-color: hsl(var(--muted));
+}
+
+.dark\:text-muted-foreground:is(.dark *){
+ color: hsl(var(--muted-foreground));
+}
+
+.dark\:text-white:is(.dark *){
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.dark\:hover\:bg-muted:hover:is(.dark *){
+ background-color: hsl(var(--muted));
+}
+
+.dark\:hover\:text-white:hover:is(.dark *){
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+@media (min-width: 640px){
+ .sm\:bottom-0{
+ bottom: 0px;
+ }
+
+ .sm\:right-0{
+ right: 0px;
+ }
+
+ .sm\:top-auto{
+ top: auto;
+ }
+
+ .sm\:flex-col{
+ flex-direction: column;
+ }
+
+ .data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state="open"]{
+ --tw-enter-translate-y: 100%;
+ }
+}
+
+@media (min-width: 768px){
+ .md\:max-w-\[420px\]{
+ max-width: 420px;
+ }
+}
+
+.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div{
+ --tw-rotate: 90deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&_svg\]\:pointer-events-none svg{
+ pointer-events: none;
+}
+
+.\[\&_svg\]\:size-4 svg{
+ width: 1rem;
+ height: 1rem;
+}
+
+.\[\&_svg\]\:shrink-0 svg{
+ flex-shrink: 0;
+}
\ No newline at end of file
diff --git a/app/spilotui/frontend/src/shadcn/toast.tsx b/app/spilotui/frontend/src/shadcn/toast.tsx
new file mode 100644
index 0000000..a822477
--- /dev/null
+++ b/app/spilotui/frontend/src/shadcn/toast.tsx
@@ -0,0 +1,127 @@
+import * as React from "react"
+import * as ToastPrimitives from "@radix-ui/react-toast"
+import { cva, type VariantProps } from "class-variance-authority"
+import { X } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+const ToastProvider = ToastPrimitives.Provider
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName
+
+const toastVariants = cva(
+ "group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
+ {
+ variants: {
+ variant: {
+ default: "border bg-background text-foreground",
+ destructive:
+ "destructive group border-destructive bg-destructive text-destructive-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+const Toast = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ )
+})
+Toast.displayName = ToastPrimitives.Root.displayName
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastAction.displayName = ToastPrimitives.Action.displayName
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+))
+ToastClose.displayName = ToastPrimitives.Close.displayName
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastTitle.displayName = ToastPrimitives.Title.displayName
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+ToastDescription.displayName = ToastPrimitives.Description.displayName
+
+type ToastProps = React.ComponentPropsWithoutRef
+
+type ToastActionElement = React.ReactElement
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction,
+}
diff --git a/app/spilotui/frontend/src/shadcn/toaster.tsx b/app/spilotui/frontend/src/shadcn/toaster.tsx
new file mode 100644
index 0000000..805c149
--- /dev/null
+++ b/app/spilotui/frontend/src/shadcn/toaster.tsx
@@ -0,0 +1,33 @@
+import { useToast } from '@/hooks/use-toast';
+import {
+ Toast,
+ ToastClose,
+ ToastDescription,
+ ToastProvider,
+ ToastTitle,
+ ToastViewport,
+} from '@/shadcn/toast';
+
+export function Toaster() {
+ const { toasts } = useToast();
+
+ return (
+
+ {toasts.map(function ({ id, title, description, action, ...props }) {
+ return (
+
+
+ {title && {title}}
+ {description && (
+ {description}
+ )}
+
+ {action}
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/app/spilotui/frontend/src/shadcn/use-toast.ts b/app/spilotui/frontend/src/shadcn/use-toast.ts
new file mode 100644
index 0000000..1505a16
--- /dev/null
+++ b/app/spilotui/frontend/src/shadcn/use-toast.ts
@@ -0,0 +1,189 @@
+// Inspired by react-hot-toast library
+import * as React from 'react';
+
+import type { ToastActionElement, ToastProps } from '@/shadcn/toast';
+
+const TOAST_LIMIT = 1;
+const TOAST_REMOVE_DELAY = 1000000;
+
+type ToasterToast = ToastProps & {
+ id: string;
+ title?: React.ReactNode;
+ description?: React.ReactNode;
+ action?: ToastActionElement;
+};
+
+const actionTypes = {
+ ADD_TOAST: 'ADD_TOAST',
+ UPDATE_TOAST: 'UPDATE_TOAST',
+ DISMISS_TOAST: 'DISMISS_TOAST',
+ REMOVE_TOAST: 'REMOVE_TOAST',
+} as const;
+
+let count = 0;
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
+ return count.toString();
+}
+
+type ActionType = typeof actionTypes;
+
+type Action =
+ | {
+ type: ActionType['ADD_TOAST'];
+ toast: ToasterToast;
+ }
+ | {
+ type: ActionType['UPDATE_TOAST'];
+ toast: Partial;
+ }
+ | {
+ type: ActionType['DISMISS_TOAST'];
+ toastId?: ToasterToast['id'];
+ }
+ | {
+ type: ActionType['REMOVE_TOAST'];
+ toastId?: ToasterToast['id'];
+ };
+
+interface State {
+ toasts: ToasterToast[];
+}
+
+const toastTimeouts = new Map>();
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId);
+ dispatch({
+ type: 'REMOVE_TOAST',
+ toastId: toastId,
+ });
+ }, TOAST_REMOVE_DELAY);
+
+ toastTimeouts.set(toastId, timeout);
+};
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case 'ADD_TOAST':
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
+ };
+
+ case 'UPDATE_TOAST':
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ ),
+ };
+
+ case 'DISMISS_TOAST': {
+ const { toastId } = action;
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId);
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id);
+ });
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false,
+ }
+ : t
+ ),
+ };
+ }
+ case 'REMOVE_TOAST':
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: [],
+ };
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId),
+ };
+ }
+};
+
+const listeners: Array<(state: State) => void> = [];
+
+let memoryState: State = { toasts: [] };
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action);
+ listeners.forEach((listener) => {
+ listener(memoryState);
+ });
+}
+
+type Toast = Omit;
+
+function toast({ ...props }: Toast) {
+ const id = genId();
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: 'UPDATE_TOAST',
+ toast: { ...props, id },
+ });
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id });
+
+ dispatch({
+ type: 'ADD_TOAST',
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss();
+ },
+ },
+ });
+
+ return {
+ id: id,
+ dismiss,
+ update,
+ };
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState);
+
+ React.useEffect(() => {
+ listeners.push(setState);
+ return () => {
+ const index = listeners.indexOf(setState);
+ if (index > -1) {
+ listeners.splice(index, 1);
+ }
+ };
+ }, [state]);
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),
+ };
+}
+
+export { useToast, toast };
diff --git a/app/spilotui/frontend/src/style.css b/app/spilotui/frontend/src/style.css
new file mode 100644
index 0000000..befc7db
--- /dev/null
+++ b/app/spilotui/frontend/src/style.css
@@ -0,0 +1,79 @@
+@import url('https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap');
+
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+
+/* @layer base {
+ :root {
+ --background: 0 0% 100%;
+ --foreground: 222.2 84% 4.9%;
+
+ --card: 0 0% 100%;
+ --card-foreground: 222.2 84% 4.9%;
+
+ --popover: 0 0% 100%;
+ --popover-foreground: 222.2 84% 4.9%;
+
+ --primary: 222.2 47.4% 11.2%;
+ --primary-foreground: 210 40% 98%;
+
+ --secondary: 210 40% 96.1%;
+ --secondary-foreground: 222.2 47.4% 11.2%;
+
+ --muted: 210 40% 96.1%;
+ --muted-foreground: 215.4 16.3% 46.9%;
+
+ --accent: 210 40% 96.1%;
+ --accent-foreground: 222.2 47.4% 11.2%;
+
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 210 40% 98%;
+
+ --border: 214.3 31.8% 91.4%;
+ --input: 214.3 31.8% 91.4%;
+ --ring: 222.2 84% 4.9%;
+
+ --radius: 0.5rem;
+ }
+
+ .dark {
+ --background: 222.2 84% 4.9%;
+ --foreground: 210 40% 98%;
+
+ --card: 222.2 84% 4.9%;
+ --card-foreground: 210 40% 98%;
+
+ --popover: 222.2 84% 4.9%;
+ --popover-foreground: 210 40% 98%;
+
+ --primary: 210 40% 98%;
+ --primary-foreground: 222.2 47.4% 11.2%;
+
+ --secondary: 217.2 32.6% 17.5%;
+ --secondary-foreground: 210 40% 98%;
+
+ --muted: 217.2 32.6% 17.5%;
+ --muted-foreground: 215 20.2% 65.1%;
+
+ --accent: 217.2 32.6% 17.5%;
+ --accent-foreground: 210 40% 98%;
+
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 210 40% 98%;
+
+ --border: 217.2 32.6% 17.5%;
+ --input: 217.2 32.6% 17.5%;
+ --ring: 212.7 26.8% 83.9%;
+ }
+} */
+
+/* @layer base {
+ * {
+ @apply border-border;
+ }
+ body {
+ @apply bg-background text-foreground;
+ }
+} */
\ No newline at end of file
diff --git a/app/spilotui/frontend/src/vite-env.d.ts b/app/spilotui/frontend/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/app/spilotui/frontend/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/app/spilotui/frontend/tailwind.config.js b/app/spilotui/frontend/tailwind.config.js
new file mode 100644
index 0000000..c74449e
--- /dev/null
+++ b/app/spilotui/frontend/tailwind.config.js
@@ -0,0 +1,80 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ darkMode: ['class'],
+ content: [
+ './pages/**/*.{ts,tsx}',
+ './components/**/*.{ts,tsx}',
+ './app/**/*.{ts,tsx}',
+ './src/**/*.{ts,tsx}',
+ ],
+ prefix: '',
+ theme: {
+ container: {
+ center: true,
+ padding: '2rem',
+ screens: {
+ '2xl': '1400px',
+ },
+ },
+ extend: {
+ fontFamily: {
+ nato: ['Noto Sans'],
+ },
+ colors: {
+ border: 'hsl(var(--border))',
+ input: 'hsl(var(--input))',
+ ring: 'hsl(var(--ring))',
+ background: 'hsl(var(--background))',
+ foreground: 'hsl(var(--foreground))',
+ primary: {
+ DEFAULT: 'hsl(var(--primary))',
+ foreground: 'hsl(var(--primary-foreground))',
+ },
+ secondary: {
+ DEFAULT: 'hsl(var(--secondary))',
+ foreground: 'hsl(var(--secondary-foreground))',
+ },
+ destructive: {
+ DEFAULT: 'hsl(var(--destructive))',
+ foreground: 'hsl(var(--destructive-foreground))',
+ },
+ muted: {
+ DEFAULT: 'hsl(var(--muted))',
+ foreground: 'hsl(var(--muted-foreground))',
+ },
+ accent: {
+ DEFAULT: 'hsl(var(--accent))',
+ foreground: 'hsl(var(--accent-foreground))',
+ },
+ popover: {
+ DEFAULT: 'hsl(var(--popover))',
+ foreground: 'hsl(var(--popover-foreground))',
+ },
+ card: {
+ DEFAULT: 'hsl(var(--card))',
+ foreground: 'hsl(var(--card-foreground))',
+ },
+ },
+ borderRadius: {
+ lg: 'var(--radius)',
+ md: 'calc(var(--radius) - 2px)',
+ sm: 'calc(var(--radius) - 4px)',
+ },
+ keyframes: {
+ 'accordion-down': {
+ from: { height: '0' },
+ to: { height: 'var(--radix-accordion-content-height)' },
+ },
+ 'accordion-up': {
+ from: { height: 'var(--radix-accordion-content-height)' },
+ to: { height: '0' },
+ },
+ },
+ animation: {
+ 'accordion-down': 'accordion-down 0.2s ease-out',
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+ },
+ },
+ },
+ plugins: [require('tailwindcss-animate')],
+};
diff --git a/app/spilotui/frontend/tsconfig.json b/app/spilotui/frontend/tsconfig.json
new file mode 100644
index 0000000..f108c2a
--- /dev/null
+++ b/app/spilotui/frontend/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ },
+ "include": ["src"],
+ "references": [
+ {
+ "path": "./tsconfig.node.json"
+ }
+ ]
+}
diff --git a/app/spilotui/frontend/tsconfig.node.json b/app/spilotui/frontend/tsconfig.node.json
new file mode 100644
index 0000000..b8afcc8
--- /dev/null
+++ b/app/spilotui/frontend/tsconfig.node.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": [
+ "vite.config.ts"
+ ]
+}
diff --git a/app/spilotui/frontend/vite.config.ts b/app/spilotui/frontend/vite.config.ts
new file mode 100644
index 0000000..b53859f
--- /dev/null
+++ b/app/spilotui/frontend/vite.config.ts
@@ -0,0 +1,13 @@
+import path from 'path';
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src'),
+ },
+ },
+});
diff --git a/app/spilotui/frontend/wailsjs/go/driver/GrpcDriver.d.ts b/app/spilotui/frontend/wailsjs/go/driver/GrpcDriver.d.ts
new file mode 100755
index 0000000..5f2e331
--- /dev/null
+++ b/app/spilotui/frontend/wailsjs/go/driver/GrpcDriver.d.ts
@@ -0,0 +1,11 @@
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+import {net} from '../models';
+import {context} from '../models';
+import {apiv1} from '../models';
+
+export function ConnectServer(arg1:net.IP,arg2:string):Promise;
+
+export function GetServerStatus(arg1:context.Context):Promise;
+
+export function Startup(arg1:context.Context):Promise;
diff --git a/app/spilotui/frontend/wailsjs/go/driver/GrpcDriver.js b/app/spilotui/frontend/wailsjs/go/driver/GrpcDriver.js
new file mode 100755
index 0000000..6d198e5
--- /dev/null
+++ b/app/spilotui/frontend/wailsjs/go/driver/GrpcDriver.js
@@ -0,0 +1,15 @@
+// @ts-check
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+export function ConnectServer(arg1, arg2) {
+ return window['go']['driver']['GrpcDriver']['ConnectServer'](arg1, arg2);
+}
+
+export function GetServerStatus(arg1) {
+ return window['go']['driver']['GrpcDriver']['GetServerStatus'](arg1);
+}
+
+export function Startup(arg1) {
+ return window['go']['driver']['GrpcDriver']['Startup'](arg1);
+}
diff --git a/app/spilotui/frontend/wailsjs/go/models.ts b/app/spilotui/frontend/wailsjs/go/models.ts
new file mode 100755
index 0000000..106302c
--- /dev/null
+++ b/app/spilotui/frontend/wailsjs/go/models.ts
@@ -0,0 +1,19 @@
+export namespace apiv1 {
+
+ export class GetStatusResponse {
+ system?: string;
+ uptime?: string;
+
+ static createFrom(source: any = {}) {
+ return new GetStatusResponse(source);
+ }
+
+ constructor(source: any = {}) {
+ if ('string' === typeof source) source = JSON.parse(source);
+ this.system = source["system"];
+ this.uptime = source["uptime"];
+ }
+ }
+
+}
+
diff --git a/app/spilotui/frontend/wailsjs/runtime/package.json b/app/spilotui/frontend/wailsjs/runtime/package.json
new file mode 100644
index 0000000..1e7c8a5
--- /dev/null
+++ b/app/spilotui/frontend/wailsjs/runtime/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "@wailsapp/runtime",
+ "version": "2.0.0",
+ "description": "Wails Javascript runtime library",
+ "main": "runtime.js",
+ "types": "runtime.d.ts",
+ "scripts": {
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/wailsapp/wails.git"
+ },
+ "keywords": [
+ "Wails",
+ "Javascript",
+ "Go"
+ ],
+ "author": "Lea Anthony ",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/wailsapp/wails/issues"
+ },
+ "homepage": "https://github.com/wailsapp/wails#readme"
+}
diff --git a/app/spilotui/frontend/wailsjs/runtime/runtime.d.ts b/app/spilotui/frontend/wailsjs/runtime/runtime.d.ts
new file mode 100644
index 0000000..a3723f9
--- /dev/null
+++ b/app/spilotui/frontend/wailsjs/runtime/runtime.d.ts
@@ -0,0 +1,235 @@
+/*
+ _ __ _ __
+| | / /___ _(_) /____
+| | /| / / __ `/ / / ___/
+| |/ |/ / /_/ / / (__ )
+|__/|__/\__,_/_/_/____/
+The electron alternative for Go
+(c) Lea Anthony 2019-present
+*/
+
+export interface Position {
+ x: number;
+ y: number;
+}
+
+export interface Size {
+ w: number;
+ h: number;
+}
+
+export interface Screen {
+ isCurrent: boolean;
+ isPrimary: boolean;
+ width : number
+ height : number
+}
+
+// Environment information such as platform, buildtype, ...
+export interface EnvironmentInfo {
+ buildType: string;
+ platform: string;
+ arch: string;
+}
+
+// [EventsEmit](https://wails.io/docs/reference/runtime/events#eventsemit)
+// emits the given event. Optional data may be passed with the event.
+// This will trigger any event listeners.
+export function EventsEmit(eventName: string, ...data: any): void;
+
+// [EventsOn](https://wails.io/docs/reference/runtime/events#eventson) sets up a listener for the given event name.
+export function EventsOn(eventName: string, callback: (...data: any) => void): () => void;
+
+// [EventsOnMultiple](https://wails.io/docs/reference/runtime/events#eventsonmultiple)
+// sets up a listener for the given event name, but will only trigger a given number times.
+export function EventsOnMultiple(eventName: string, callback: (...data: any) => void, maxCallbacks: number): () => void;
+
+// [EventsOnce](https://wails.io/docs/reference/runtime/events#eventsonce)
+// sets up a listener for the given event name, but will only trigger once.
+export function EventsOnce(eventName: string, callback: (...data: any) => void): () => void;
+
+// [EventsOff](https://wails.io/docs/reference/runtime/events#eventsoff)
+// unregisters the listener for the given event name.
+export function EventsOff(eventName: string, ...additionalEventNames: string[]): void;
+
+// [EventsOffAll](https://wails.io/docs/reference/runtime/events#eventsoffall)
+// unregisters all listeners.
+export function EventsOffAll(): void;
+
+// [LogPrint](https://wails.io/docs/reference/runtime/log#logprint)
+// logs the given message as a raw message
+export function LogPrint(message: string): void;
+
+// [LogTrace](https://wails.io/docs/reference/runtime/log#logtrace)
+// logs the given message at the `trace` log level.
+export function LogTrace(message: string): void;
+
+// [LogDebug](https://wails.io/docs/reference/runtime/log#logdebug)
+// logs the given message at the `debug` log level.
+export function LogDebug(message: string): void;
+
+// [LogError](https://wails.io/docs/reference/runtime/log#logerror)
+// logs the given message at the `error` log level.
+export function LogError(message: string): void;
+
+// [LogFatal](https://wails.io/docs/reference/runtime/log#logfatal)
+// logs the given message at the `fatal` log level.
+// The application will quit after calling this method.
+export function LogFatal(message: string): void;
+
+// [LogInfo](https://wails.io/docs/reference/runtime/log#loginfo)
+// logs the given message at the `info` log level.
+export function LogInfo(message: string): void;
+
+// [LogWarning](https://wails.io/docs/reference/runtime/log#logwarning)
+// logs the given message at the `warning` log level.
+export function LogWarning(message: string): void;
+
+// [WindowReload](https://wails.io/docs/reference/runtime/window#windowreload)
+// Forces a reload by the main application as well as connected browsers.
+export function WindowReload(): void;
+
+// [WindowReloadApp](https://wails.io/docs/reference/runtime/window#windowreloadapp)
+// Reloads the application frontend.
+export function WindowReloadApp(): void;
+
+// [WindowSetAlwaysOnTop](https://wails.io/docs/reference/runtime/window#windowsetalwaysontop)
+// Sets the window AlwaysOnTop or not on top.
+export function WindowSetAlwaysOnTop(b: boolean): void;
+
+// [WindowSetSystemDefaultTheme](https://wails.io/docs/next/reference/runtime/window#windowsetsystemdefaulttheme)
+// *Windows only*
+// Sets window theme to system default (dark/light).
+export function WindowSetSystemDefaultTheme(): void;
+
+// [WindowSetLightTheme](https://wails.io/docs/next/reference/runtime/window#windowsetlighttheme)
+// *Windows only*
+// Sets window to light theme.
+export function WindowSetLightTheme(): void;
+
+// [WindowSetDarkTheme](https://wails.io/docs/next/reference/runtime/window#windowsetdarktheme)
+// *Windows only*
+// Sets window to dark theme.
+export function WindowSetDarkTheme(): void;
+
+// [WindowCenter](https://wails.io/docs/reference/runtime/window#windowcenter)
+// Centers the window on the monitor the window is currently on.
+export function WindowCenter(): void;
+
+// [WindowSetTitle](https://wails.io/docs/reference/runtime/window#windowsettitle)
+// Sets the text in the window title bar.
+export function WindowSetTitle(title: string): void;
+
+// [WindowFullscreen](https://wails.io/docs/reference/runtime/window#windowfullscreen)
+// Makes the window full screen.
+export function WindowFullscreen(): void;
+
+// [WindowUnfullscreen](https://wails.io/docs/reference/runtime/window#windowunfullscreen)
+// Restores the previous window dimensions and position prior to full screen.
+export function WindowUnfullscreen(): void;
+
+// [WindowIsFullscreen](https://wails.io/docs/reference/runtime/window#windowisfullscreen)
+// Returns the state of the window, i.e. whether the window is in full screen mode or not.
+export function WindowIsFullscreen(): Promise;
+
+// [WindowSetSize](https://wails.io/docs/reference/runtime/window#windowsetsize)
+// Sets the width and height of the window.
+export function WindowSetSize(width: number, height: number): Promise;
+
+// [WindowGetSize](https://wails.io/docs/reference/runtime/window#windowgetsize)
+// Gets the width and height of the window.
+export function WindowGetSize(): Promise;
+
+// [WindowSetMaxSize](https://wails.io/docs/reference/runtime/window#windowsetmaxsize)
+// Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions.
+// Setting a size of 0,0 will disable this constraint.
+export function WindowSetMaxSize(width: number, height: number): void;
+
+// [WindowSetMinSize](https://wails.io/docs/reference/runtime/window#windowsetminsize)
+// Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions.
+// Setting a size of 0,0 will disable this constraint.
+export function WindowSetMinSize(width: number, height: number): void;
+
+// [WindowSetPosition](https://wails.io/docs/reference/runtime/window#windowsetposition)
+// Sets the window position relative to the monitor the window is currently on.
+export function WindowSetPosition(x: number, y: number): void;
+
+// [WindowGetPosition](https://wails.io/docs/reference/runtime/window#windowgetposition)
+// Gets the window position relative to the monitor the window is currently on.
+export function WindowGetPosition(): Promise;
+
+// [WindowHide](https://wails.io/docs/reference/runtime/window#windowhide)
+// Hides the window.
+export function WindowHide(): void;
+
+// [WindowShow](https://wails.io/docs/reference/runtime/window#windowshow)
+// Shows the window, if it is currently hidden.
+export function WindowShow(): void;
+
+// [WindowMaximise](https://wails.io/docs/reference/runtime/window#windowmaximise)
+// Maximises the window to fill the screen.
+export function WindowMaximise(): void;
+
+// [WindowToggleMaximise](https://wails.io/docs/reference/runtime/window#windowtogglemaximise)
+// Toggles between Maximised and UnMaximised.
+export function WindowToggleMaximise(): void;
+
+// [WindowUnmaximise](https://wails.io/docs/reference/runtime/window#windowunmaximise)
+// Restores the window to the dimensions and position prior to maximising.
+export function WindowUnmaximise(): void;
+
+// [WindowIsMaximised](https://wails.io/docs/reference/runtime/window#windowismaximised)
+// Returns the state of the window, i.e. whether the window is maximised or not.
+export function WindowIsMaximised(): Promise;
+
+// [WindowMinimise](https://wails.io/docs/reference/runtime/window#windowminimise)
+// Minimises the window.
+export function WindowMinimise(): void;
+
+// [WindowUnminimise](https://wails.io/docs/reference/runtime/window#windowunminimise)
+// Restores the window to the dimensions and position prior to minimising.
+export function WindowUnminimise(): void;
+
+// [WindowIsMinimised](https://wails.io/docs/reference/runtime/window#windowisminimised)
+// Returns the state of the window, i.e. whether the window is minimised or not.
+export function WindowIsMinimised(): Promise;
+
+// [WindowIsNormal](https://wails.io/docs/reference/runtime/window#windowisnormal)
+// Returns the state of the window, i.e. whether the window is normal or not.
+export function WindowIsNormal(): Promise;
+
+// [WindowSetBackgroundColour](https://wails.io/docs/reference/runtime/window#windowsetbackgroundcolour)
+// Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels.
+export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void;
+
+// [ScreenGetAll](https://wails.io/docs/reference/runtime/window#screengetall)
+// Gets the all screens. Call this anew each time you want to refresh data from the underlying windowing system.
+export function ScreenGetAll(): Promise;
+
+// [BrowserOpenURL](https://wails.io/docs/reference/runtime/browser#browseropenurl)
+// Opens the given URL in the system browser.
+export function BrowserOpenURL(url: string): void;
+
+// [Environment](https://wails.io/docs/reference/runtime/intro#environment)
+// Returns information about the environment
+export function Environment(): Promise;
+
+// [Quit](https://wails.io/docs/reference/runtime/intro#quit)
+// Quits the application.
+export function Quit(): void;
+
+// [Hide](https://wails.io/docs/reference/runtime/intro#hide)
+// Hides the application.
+export function Hide(): void;
+
+// [Show](https://wails.io/docs/reference/runtime/intro#show)
+// Shows the application.
+export function Show(): void;
+
+// [ClipboardGetText](https://wails.io/docs/reference/runtime/clipboard#clipboardgettext)
+// Returns the current text stored on clipboard
+export function ClipboardGetText(): Promise;
+
+// [ClipboardSetText](https://wails.io/docs/reference/runtime/clipboard#clipboardsettext)
+// Sets a text on the clipboard
+export function ClipboardSetText(text: string): Promise;
diff --git a/app/spilotui/frontend/wailsjs/runtime/runtime.js b/app/spilotui/frontend/wailsjs/runtime/runtime.js
new file mode 100644
index 0000000..bd4f371
--- /dev/null
+++ b/app/spilotui/frontend/wailsjs/runtime/runtime.js
@@ -0,0 +1,202 @@
+/*
+ _ __ _ __
+| | / /___ _(_) /____
+| | /| / / __ `/ / / ___/
+| |/ |/ / /_/ / / (__ )
+|__/|__/\__,_/_/_/____/
+The electron alternative for Go
+(c) Lea Anthony 2019-present
+*/
+
+export function LogPrint(message) {
+ window.runtime.LogPrint(message);
+}
+
+export function LogTrace(message) {
+ window.runtime.LogTrace(message);
+}
+
+export function LogDebug(message) {
+ window.runtime.LogDebug(message);
+}
+
+export function LogInfo(message) {
+ window.runtime.LogInfo(message);
+}
+
+export function LogWarning(message) {
+ window.runtime.LogWarning(message);
+}
+
+export function LogError(message) {
+ window.runtime.LogError(message);
+}
+
+export function LogFatal(message) {
+ window.runtime.LogFatal(message);
+}
+
+export function EventsOnMultiple(eventName, callback, maxCallbacks) {
+ return window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks);
+}
+
+export function EventsOn(eventName, callback) {
+ return EventsOnMultiple(eventName, callback, -1);
+}
+
+export function EventsOff(eventName, ...additionalEventNames) {
+ return window.runtime.EventsOff(eventName, ...additionalEventNames);
+}
+
+export function EventsOnce(eventName, callback) {
+ return EventsOnMultiple(eventName, callback, 1);
+}
+
+export function EventsEmit(eventName) {
+ let args = [eventName].slice.call(arguments);
+ return window.runtime.EventsEmit.apply(null, args);
+}
+
+export function WindowReload() {
+ window.runtime.WindowReload();
+}
+
+export function WindowReloadApp() {
+ window.runtime.WindowReloadApp();
+}
+
+export function WindowSetAlwaysOnTop(b) {
+ window.runtime.WindowSetAlwaysOnTop(b);
+}
+
+export function WindowSetSystemDefaultTheme() {
+ window.runtime.WindowSetSystemDefaultTheme();
+}
+
+export function WindowSetLightTheme() {
+ window.runtime.WindowSetLightTheme();
+}
+
+export function WindowSetDarkTheme() {
+ window.runtime.WindowSetDarkTheme();
+}
+
+export function WindowCenter() {
+ window.runtime.WindowCenter();
+}
+
+export function WindowSetTitle(title) {
+ window.runtime.WindowSetTitle(title);
+}
+
+export function WindowFullscreen() {
+ window.runtime.WindowFullscreen();
+}
+
+export function WindowUnfullscreen() {
+ window.runtime.WindowUnfullscreen();
+}
+
+export function WindowIsFullscreen() {
+ return window.runtime.WindowIsFullscreen();
+}
+
+export function WindowGetSize() {
+ return window.runtime.WindowGetSize();
+}
+
+export function WindowSetSize(width, height) {
+ window.runtime.WindowSetSize(width, height);
+}
+
+export function WindowSetMaxSize(width, height) {
+ window.runtime.WindowSetMaxSize(width, height);
+}
+
+export function WindowSetMinSize(width, height) {
+ window.runtime.WindowSetMinSize(width, height);
+}
+
+export function WindowSetPosition(x, y) {
+ window.runtime.WindowSetPosition(x, y);
+}
+
+export function WindowGetPosition() {
+ return window.runtime.WindowGetPosition();
+}
+
+export function WindowHide() {
+ window.runtime.WindowHide();
+}
+
+export function WindowShow() {
+ window.runtime.WindowShow();
+}
+
+export function WindowMaximise() {
+ window.runtime.WindowMaximise();
+}
+
+export function WindowToggleMaximise() {
+ window.runtime.WindowToggleMaximise();
+}
+
+export function WindowUnmaximise() {
+ window.runtime.WindowUnmaximise();
+}
+
+export function WindowIsMaximised() {
+ return window.runtime.WindowIsMaximised();
+}
+
+export function WindowMinimise() {
+ window.runtime.WindowMinimise();
+}
+
+export function WindowUnminimise() {
+ window.runtime.WindowUnminimise();
+}
+
+export function WindowSetBackgroundColour(R, G, B, A) {
+ window.runtime.WindowSetBackgroundColour(R, G, B, A);
+}
+
+export function ScreenGetAll() {
+ return window.runtime.ScreenGetAll();
+}
+
+export function WindowIsMinimised() {
+ return window.runtime.WindowIsMinimised();
+}
+
+export function WindowIsNormal() {
+ return window.runtime.WindowIsNormal();
+}
+
+export function BrowserOpenURL(url) {
+ window.runtime.BrowserOpenURL(url);
+}
+
+export function Environment() {
+ return window.runtime.Environment();
+}
+
+export function Quit() {
+ window.runtime.Quit();
+}
+
+export function Hide() {
+ window.runtime.Hide();
+}
+
+export function Show() {
+ window.runtime.Show();
+}
+
+export function ClipboardGetText() {
+ return window.runtime.ClipboardGetText();
+}
+
+export function ClipboardSetText(text) {
+ return window.runtime.ClipboardSetText(text);
+}
\ No newline at end of file
diff --git a/app/spilotui/frontend/yarn.lock b/app/spilotui/frontend/yarn.lock
new file mode 100644
index 0000000..6c262ae
--- /dev/null
+++ b/app/spilotui/frontend/yarn.lock
@@ -0,0 +1,2427 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@alloc/quick-lru@^5.2.0":
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz"
+ integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz"
+ integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
+ dependencies:
+ "@babel/highlight" "^7.25.7"
+ picocolors "^1.0.0"
+
+"@babel/compat-data@^7.25.7":
+ version "7.25.8"
+ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz"
+ integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==
+
+"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.19.6":
+ version "7.25.8"
+ resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz"
+ integrity sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helpers" "^7.25.7"
+ "@babel/parser" "^7.25.8"
+ "@babel/template" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.8"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz"
+ integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==
+ dependencies:
+ "@babel/types" "^7.25.7"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-annotate-as-pure@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz"
+ integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==
+ dependencies:
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-compilation-targets@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz"
+ integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==
+ dependencies:
+ "@babel/compat-data" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-module-imports@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz"
+ integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-module-transforms@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz"
+ integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-simple-access" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/helper-plugin-utils@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz"
+ integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==
+
+"@babel/helper-simple-access@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz"
+ integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-string-parser@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz"
+ integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==
+
+"@babel/helper-validator-identifier@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz"
+ integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
+
+"@babel/helper-validator-option@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz"
+ integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==
+
+"@babel/helpers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz"
+ integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==
+ dependencies:
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/highlight@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz"
+ integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/parser@^7.25.7", "@babel/parser@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz"
+ integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==
+ dependencies:
+ "@babel/types" "^7.25.8"
+
+"@babel/plugin-syntax-jsx@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz"
+ integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-react-jsx-development@^7.18.6":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz"
+ integrity sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==
+ dependencies:
+ "@babel/plugin-transform-react-jsx" "^7.25.7"
+
+"@babel/plugin-transform-react-jsx-self@^7.18.6":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz"
+ integrity sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-react-jsx-source@^7.19.6":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz"
+ integrity sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-react-jsx@^7.19.0", "@babel/plugin-transform-react-jsx@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz"
+ integrity sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/plugin-syntax-jsx" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/runtime@^7.13.10":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz"
+ integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz"
+ integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/traverse@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz"
+ integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.25.7", "@babel/types@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz"
+ integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ to-fast-properties "^2.0.0"
+
+"@bufbuild/protobuf@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz"
+ integrity sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==
+
+"@floating-ui/core@^1.6.0":
+ version "1.6.8"
+ resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz"
+ integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==
+ dependencies:
+ "@floating-ui/utils" "^0.2.8"
+
+"@floating-ui/dom@^1.0.0":
+ version "1.6.11"
+ resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.11.tgz"
+ integrity sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==
+ dependencies:
+ "@floating-ui/core" "^1.6.0"
+ "@floating-ui/utils" "^0.2.8"
+
+"@floating-ui/react-dom@^2.0.0":
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz"
+ integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==
+ dependencies:
+ "@floating-ui/dom" "^1.0.0"
+
+"@floating-ui/utils@^0.2.8":
+ version "0.2.8"
+ resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz"
+ integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==
+
+"@hookform/resolvers@^3.3.4":
+ version "3.9.0"
+ resolved "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz"
+ integrity sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==
+
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
+"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@next/env@14.2.15":
+ version "14.2.15"
+ resolved "https://registry.npmjs.org/@next/env/-/env-14.2.15.tgz"
+ integrity sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==
+
+"@next/swc-linux-x64-gnu@14.2.15":
+ version "14.2.15"
+ resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.15.tgz"
+ integrity sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==
+
+"@next/swc-linux-x64-musl@14.2.15":
+ version "14.2.15"
+ resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.15.tgz"
+ integrity sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@radix-ui/colors@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz"
+ integrity sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==
+
+"@radix-ui/number@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.0.tgz"
+ integrity sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==
+
+"@radix-ui/primitive@^1.0.1", "@radix-ui/primitive@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz"
+ integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==
+
+"@radix-ui/primitive@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz"
+ integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/primitive@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz"
+ integrity sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-accessible-icon@^1.0.3":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.0.tgz"
+ integrity sha512-i9Zg4NOSXlfUva0agzI2DjWrvFJm9uO4L6CMW7nmMa5CIOOX/Yin894W7WwjodFQWPwe5kmAJ4JF33R8slKI2g==
+ dependencies:
+ "@radix-ui/react-visually-hidden" "1.1.0"
+
+"@radix-ui/react-accordion@^1.1.2":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz"
+ integrity sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collapsible" "1.1.1"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-alert-dialog@^1.0.5":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.2.tgz"
+ integrity sha512-eGSlLzPhKO+TErxkiGcCZGuvbVMnLA1MTnyBksGOeGRGkxHiiJUujsjmNTdWTm4iHVSRaUao9/4Ur671auMghQ==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-dialog" "1.1.2"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-slot" "1.1.0"
+
+"@radix-ui/react-arrow@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz"
+ integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==
+ dependencies:
+ "@radix-ui/react-primitive" "2.0.0"
+
+"@radix-ui/react-aspect-ratio@^1.0.3":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.0.tgz"
+ integrity sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==
+ dependencies:
+ "@radix-ui/react-primitive" "2.0.0"
+
+"@radix-ui/react-avatar@^1.0.4":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.1.tgz"
+ integrity sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==
+ dependencies:
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
+"@radix-ui/react-checkbox@^1.0.4":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz"
+ integrity sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-previous" "1.1.0"
+ "@radix-ui/react-use-size" "1.1.0"
+
+"@radix-ui/react-collapsible@^1.0.3", "@radix-ui/react-collapsible@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz"
+ integrity sha512-1///SnrfQHJEofLokyczERxQbWfCGQlQ2XsCZMucVs6it+lq9iw4vXy+uDn1edlb58cOZOWSldnfPAYcT4O/Yg==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
+"@radix-ui/react-collection@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz"
+ integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-slot" "1.1.0"
+
+"@radix-ui/react-compose-refs@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz"
+ integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-compose-refs@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz"
+ integrity sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-compose-refs@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz"
+ integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==
+
+"@radix-ui/react-context-menu@^2.1.5":
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.2.tgz"
+ integrity sha512-99EatSTpW+hRYHt7m8wdDlLtkmTovEe8Z/hnxUPV+SKuuNL5HWNhQI4QSdjZqNSgXHay2z4M3Dym73j9p2Gx5Q==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-menu" "2.1.2"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-context@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz"
+ integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-context@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz"
+ integrity sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-context@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz"
+ integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==
+
+"@radix-ui/react-context@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz"
+ integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==
+
+"@radix-ui/react-dialog@^1.0.5", "@radix-ui/react-dialog@^1.1.1", "@radix-ui/react-dialog@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz"
+ integrity sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-focus-guards" "1.1.1"
+ "@radix-ui/react-focus-scope" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-portal" "1.1.2"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-slot" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ aria-hidden "^1.1.1"
+ react-remove-scroll "2.6.0"
+
+"@radix-ui/react-dialog@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz"
+ integrity sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/primitive" "1.0.0"
+ "@radix-ui/react-compose-refs" "1.0.0"
+ "@radix-ui/react-context" "1.0.0"
+ "@radix-ui/react-dismissable-layer" "1.0.0"
+ "@radix-ui/react-focus-guards" "1.0.0"
+ "@radix-ui/react-focus-scope" "1.0.0"
+ "@radix-ui/react-id" "1.0.0"
+ "@radix-ui/react-portal" "1.0.0"
+ "@radix-ui/react-presence" "1.0.0"
+ "@radix-ui/react-primitive" "1.0.0"
+ "@radix-ui/react-slot" "1.0.0"
+ "@radix-ui/react-use-controllable-state" "1.0.0"
+ aria-hidden "^1.1.1"
+ react-remove-scroll "2.5.4"
+
+"@radix-ui/react-direction@^1.0.1", "@radix-ui/react-direction@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.0.tgz"
+ integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==
+
+"@radix-ui/react-dismissable-layer@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz"
+ integrity sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/primitive" "1.0.0"
+ "@radix-ui/react-compose-refs" "1.0.0"
+ "@radix-ui/react-primitive" "1.0.0"
+ "@radix-ui/react-use-callback-ref" "1.0.0"
+ "@radix-ui/react-use-escape-keydown" "1.0.0"
+
+"@radix-ui/react-dismissable-layer@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz"
+ integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-escape-keydown" "1.1.0"
+
+"@radix-ui/react-dropdown-menu@^2.0.6":
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz"
+ integrity sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-menu" "2.1.2"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-focus-guards@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz"
+ integrity sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-focus-guards@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz"
+ integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==
+
+"@radix-ui/react-focus-scope@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz"
+ integrity sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-compose-refs" "1.0.0"
+ "@radix-ui/react-primitive" "1.0.0"
+ "@radix-ui/react-use-callback-ref" "1.0.0"
+
+"@radix-ui/react-focus-scope@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz"
+ integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+
+"@radix-ui/react-form@^0.0.3":
+ version "0.0.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.0.3.tgz"
+ integrity sha512-kgE+Z/haV6fxE5WqIXj05KkaXa3OkZASoTDy25yX2EIp/x0c54rOH/vFr5nOZTg7n7T1z8bSyXmiVIFP9bbhPQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/primitive" "1.0.1"
+ "@radix-ui/react-compose-refs" "1.0.1"
+ "@radix-ui/react-context" "1.0.1"
+ "@radix-ui/react-id" "1.0.1"
+ "@radix-ui/react-label" "2.0.2"
+ "@radix-ui/react-primitive" "1.0.3"
+
+"@radix-ui/react-hover-card@^1.0.7":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.2.tgz"
+ integrity sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-popper" "1.2.0"
+ "@radix-ui/react-portal" "1.1.2"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-icons@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz"
+ integrity sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==
+
+"@radix-ui/react-id@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz"
+ integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-use-layout-effect" "1.0.0"
+
+"@radix-ui/react-id@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz"
+ integrity sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-use-layout-effect" "1.0.1"
+
+"@radix-ui/react-id@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz"
+ integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==
+ dependencies:
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
+"@radix-ui/react-label@^2.0.2":
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.0.tgz"
+ integrity sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==
+ dependencies:
+ "@radix-ui/react-primitive" "2.0.0"
+
+"@radix-ui/react-label@2.0.2":
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.0.2.tgz"
+ integrity sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-primitive" "1.0.3"
+
+"@radix-ui/react-menu@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.2.tgz"
+ integrity sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-focus-guards" "1.1.1"
+ "@radix-ui/react-focus-scope" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-popper" "1.2.0"
+ "@radix-ui/react-portal" "1.1.2"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-roving-focus" "1.1.0"
+ "@radix-ui/react-slot" "1.1.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ aria-hidden "^1.1.1"
+ react-remove-scroll "2.6.0"
+
+"@radix-ui/react-menubar@^1.0.4":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.2.tgz"
+ integrity sha512-cKmj5Gte7LVyuz+8gXinxZAZECQU+N7aq5pw7kUPpx3xjnDXDbsdzHtCCD2W72bwzy74AvrqdYnKYS42ueskUQ==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-menu" "2.1.2"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-roving-focus" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-navigation-menu@^1.1.4":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.1.tgz"
+ integrity sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+ "@radix-ui/react-use-previous" "1.1.0"
+ "@radix-ui/react-visually-hidden" "1.1.0"
+
+"@radix-ui/react-popover@^1.0.7":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.2.tgz"
+ integrity sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-focus-guards" "1.1.1"
+ "@radix-ui/react-focus-scope" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-popper" "1.2.0"
+ "@radix-ui/react-portal" "1.1.2"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-slot" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ aria-hidden "^1.1.1"
+ react-remove-scroll "2.6.0"
+
+"@radix-ui/react-popper@1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.0.tgz"
+ integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==
+ dependencies:
+ "@floating-ui/react-dom" "^2.0.0"
+ "@radix-ui/react-arrow" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+ "@radix-ui/react-use-rect" "1.1.0"
+ "@radix-ui/react-use-size" "1.1.0"
+ "@radix-ui/rect" "1.1.0"
+
+"@radix-ui/react-portal@^1.0.4", "@radix-ui/react-portal@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz"
+ integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==
+ dependencies:
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
+"@radix-ui/react-portal@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.0.tgz"
+ integrity sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-primitive" "1.0.0"
+
+"@radix-ui/react-presence@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz"
+ integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-compose-refs" "1.0.0"
+ "@radix-ui/react-use-layout-effect" "1.0.0"
+
+"@radix-ui/react-presence@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz"
+ integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
+"@radix-ui/react-primitive@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz"
+ integrity sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-slot" "1.0.0"
+
+"@radix-ui/react-primitive@1.0.3":
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz"
+ integrity sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-slot" "1.0.2"
+
+"@radix-ui/react-primitive@2.0.0":
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz"
+ integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==
+ dependencies:
+ "@radix-ui/react-slot" "1.1.0"
+
+"@radix-ui/react-progress@^1.0.3":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.0.tgz"
+ integrity sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==
+ dependencies:
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+
+"@radix-ui/react-radio-group@^1.1.3":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.1.tgz"
+ integrity sha512-kdbv54g4vfRjja9DNWPMxKvXblzqbpEC8kspEkZ6dVP7kQksGCn+iZHkcCz2nb00+lPdRvxrqy4WrvvV1cNqrQ==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-roving-focus" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-previous" "1.1.0"
+ "@radix-ui/react-use-size" "1.1.0"
+
+"@radix-ui/react-roving-focus@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz"
+ integrity sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-scroll-area@^1.0.5":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.0.tgz"
+ integrity sha512-q2jMBdsJ9zB7QG6ngQNzNwlvxLQqONyL58QbEGwuyRZZb/ARQwk3uQVbCF7GvQVOtV6EU/pDxAw3zRzJZI3rpQ==
+ dependencies:
+ "@radix-ui/number" "1.1.0"
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
+"@radix-ui/react-select@^2.0.0", "@radix-ui/react-select@^2.1.2":
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.2.tgz"
+ integrity sha512-rZJtWmorC7dFRi0owDmoijm6nSJH1tVw64QGiNIZ9PNLyBDtG+iAq+XGsya052At4BfarzY/Dhv9wrrUr6IMZA==
+ dependencies:
+ "@radix-ui/number" "1.1.0"
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-focus-guards" "1.1.1"
+ "@radix-ui/react-focus-scope" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-popper" "1.2.0"
+ "@radix-ui/react-portal" "1.1.2"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-slot" "1.1.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+ "@radix-ui/react-use-previous" "1.1.0"
+ "@radix-ui/react-visually-hidden" "1.1.0"
+ aria-hidden "^1.1.1"
+ react-remove-scroll "2.6.0"
+
+"@radix-ui/react-separator@^1.0.3":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.0.tgz"
+ integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA==
+ dependencies:
+ "@radix-ui/react-primitive" "2.0.0"
+
+"@radix-ui/react-slider@^1.1.2":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.1.tgz"
+ integrity sha512-bEzQoDW0XP+h/oGbutF5VMWJPAl/UU8IJjr7h02SOHDIIIxq+cep8nItVNoBV+OMmahCdqdF38FTpmXoqQUGvw==
+ dependencies:
+ "@radix-ui/number" "1.1.0"
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+ "@radix-ui/react-use-previous" "1.1.0"
+ "@radix-ui/react-use-size" "1.1.0"
+
+"@radix-ui/react-slot@^1.0.2", "@radix-ui/react-slot@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz"
+ integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.0"
+
+"@radix-ui/react-slot@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.0.tgz"
+ integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-compose-refs" "1.0.0"
+
+"@radix-ui/react-slot@1.0.2":
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz"
+ integrity sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-compose-refs" "1.0.1"
+
+"@radix-ui/react-switch@^1.0.3":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.1.tgz"
+ integrity sha512-diPqDDoBcZPSicYoMWdWx+bCPuTRH4QSp9J+65IvtdS0Kuzt67bI6n32vCj8q6NZmYW/ah+2orOtMwcX5eQwIg==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-previous" "1.1.0"
+ "@radix-ui/react-use-size" "1.1.0"
+
+"@radix-ui/react-tabs@^1.0.4", "@radix-ui/react-tabs@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.1.tgz"
+ integrity sha512-3GBUDmP2DvzmtYLMsHmpA1GtR46ZDZ+OreXM/N+kkQJOPIgytFWWTfDQmBQKBvaFS0Vno0FktdbVzN28KGrMdw==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-roving-focus" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-toast@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.2.tgz"
+ integrity sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-collection" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-portal" "1.1.2"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+ "@radix-ui/react-visually-hidden" "1.1.0"
+
+"@radix-ui/react-toggle-group@^1.0.4":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.0.tgz"
+ integrity sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-context" "1.1.0"
+ "@radix-ui/react-direction" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-roving-focus" "1.1.0"
+ "@radix-ui/react-toggle" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-toggle@^1.0.3", "@radix-ui/react-toggle@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz"
+ integrity sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+
+"@radix-ui/react-tooltip@^1.0.7":
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.3.tgz"
+ integrity sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==
+ dependencies:
+ "@radix-ui/primitive" "1.1.0"
+ "@radix-ui/react-compose-refs" "1.1.0"
+ "@radix-ui/react-context" "1.1.1"
+ "@radix-ui/react-dismissable-layer" "1.1.1"
+ "@radix-ui/react-id" "1.1.0"
+ "@radix-ui/react-popper" "1.2.0"
+ "@radix-ui/react-portal" "1.1.2"
+ "@radix-ui/react-presence" "1.1.1"
+ "@radix-ui/react-primitive" "2.0.0"
+ "@radix-ui/react-slot" "1.1.0"
+ "@radix-ui/react-use-controllable-state" "1.1.0"
+ "@radix-ui/react-visually-hidden" "1.1.0"
+
+"@radix-ui/react-use-callback-ref@^1.0.1", "@radix-ui/react-use-callback-ref@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz"
+ integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==
+
+"@radix-ui/react-use-callback-ref@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz"
+ integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-use-controllable-state@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz"
+ integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-use-callback-ref" "1.0.0"
+
+"@radix-ui/react-use-controllable-state@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz"
+ integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==
+ dependencies:
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+
+"@radix-ui/react-use-escape-keydown@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz"
+ integrity sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+ "@radix-ui/react-use-callback-ref" "1.0.0"
+
+"@radix-ui/react-use-escape-keydown@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz"
+ integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==
+ dependencies:
+ "@radix-ui/react-use-callback-ref" "1.1.0"
+
+"@radix-ui/react-use-layout-effect@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz"
+ integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-use-layout-effect@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz"
+ integrity sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==
+ dependencies:
+ "@babel/runtime" "^7.13.10"
+
+"@radix-ui/react-use-layout-effect@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz"
+ integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==
+
+"@radix-ui/react-use-previous@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz"
+ integrity sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==
+
+"@radix-ui/react-use-rect@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz"
+ integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==
+ dependencies:
+ "@radix-ui/rect" "1.1.0"
+
+"@radix-ui/react-use-size@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz"
+ integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==
+ dependencies:
+ "@radix-ui/react-use-layout-effect" "1.1.0"
+
+"@radix-ui/react-visually-hidden@^1.0.3", "@radix-ui/react-visually-hidden@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz"
+ integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==
+ dependencies:
+ "@radix-ui/react-primitive" "2.0.0"
+
+"@radix-ui/rect@1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.0.tgz"
+ integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==
+
+"@radix-ui/themes@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/@radix-ui/themes/-/themes-2.0.3.tgz"
+ integrity sha512-yaXQ8aWT2P1CQ0Xe6YCRD9HXsfMTvKkrIYkrc4aitCzhGTLS0sjtTqKmrxIWMVA+3DIbEuG9K/8aAMRJBhep8g==
+ dependencies:
+ "@radix-ui/colors" "^3.0.0"
+ "@radix-ui/primitive" "^1.0.1"
+ "@radix-ui/react-accessible-icon" "^1.0.3"
+ "@radix-ui/react-alert-dialog" "^1.0.5"
+ "@radix-ui/react-aspect-ratio" "^1.0.3"
+ "@radix-ui/react-avatar" "^1.0.4"
+ "@radix-ui/react-checkbox" "^1.0.4"
+ "@radix-ui/react-context-menu" "^2.1.5"
+ "@radix-ui/react-dialog" "^1.0.5"
+ "@radix-ui/react-direction" "^1.0.1"
+ "@radix-ui/react-dropdown-menu" "^2.0.6"
+ "@radix-ui/react-form" "^0.0.3"
+ "@radix-ui/react-hover-card" "^1.0.7"
+ "@radix-ui/react-popover" "^1.0.7"
+ "@radix-ui/react-portal" "^1.0.4"
+ "@radix-ui/react-radio-group" "^1.1.3"
+ "@radix-ui/react-scroll-area" "^1.0.5"
+ "@radix-ui/react-select" "^2.0.0"
+ "@radix-ui/react-separator" "^1.0.3"
+ "@radix-ui/react-slider" "^1.1.2"
+ "@radix-ui/react-slot" "^1.0.2"
+ "@radix-ui/react-switch" "^1.0.3"
+ "@radix-ui/react-tabs" "^1.0.4"
+ "@radix-ui/react-tooltip" "^1.0.7"
+ "@radix-ui/react-use-callback-ref" "^1.0.1"
+ "@radix-ui/react-visually-hidden" "^1.0.3"
+ classnames "^2.3.2"
+
+"@swc/counter@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz"
+ integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
+
+"@swc/helpers@0.5.5":
+ version "0.5.5"
+ resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz"
+ integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==
+ dependencies:
+ "@swc/counter" "^0.1.3"
+ tslib "^2.4.0"
+
+"@types/node@^20.11.20", "@types/node@>= 14":
+ version "20.16.11"
+ resolved "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz"
+ integrity sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==
+ dependencies:
+ undici-types "~6.19.2"
+
+"@types/prop-types@*":
+ version "15.7.13"
+ resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz"
+ integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
+
+"@types/react-dom@*", "@types/react-dom@^18.0.6":
+ version "18.3.1"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz"
+ integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==
+ dependencies:
+ "@types/react" "*"
+
+"@types/react@*", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^18.0.17":
+ version "18.3.11"
+ resolved "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz"
+ integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==
+ dependencies:
+ "@types/prop-types" "*"
+ csstype "^3.0.2"
+
+"@vitejs/plugin-react@^2.0.1":
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz"
+ integrity sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==
+ dependencies:
+ "@babel/core" "^7.19.6"
+ "@babel/plugin-transform-react-jsx" "^7.19.0"
+ "@babel/plugin-transform-react-jsx-development" "^7.18.6"
+ "@babel/plugin-transform-react-jsx-self" "^7.18.6"
+ "@babel/plugin-transform-react-jsx-source" "^7.19.6"
+ magic-string "^0.26.7"
+ react-refresh "^0.14.0"
+
+"@wailsapp/runtime@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@wailsapp/runtime/-/runtime-1.1.1.tgz"
+ integrity sha512-KhDNlUr5gS3OgFf/YULjTxNUj02w11AHbNkXiuQyCmND43vMdFpLyko43M1s3npUE+hMMdWoZ9wXBI+ltSKiiw==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz"
+ integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+any-promise@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz"
+ integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz"
+ integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
+
+aria-hidden@^1.1.1:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz"
+ integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==
+ dependencies:
+ tslib "^2.0.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.3, braces@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+browserslist@^4.24.0, "browserslist@>= 4.21.0":
+ version "4.24.0"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz"
+ integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==
+ dependencies:
+ caniuse-lite "^1.0.30001663"
+ electron-to-chromium "^1.5.28"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
+
+busboy@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz"
+ integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
+ dependencies:
+ streamsearch "^1.1.0"
+
+camelcase-css@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz"
+ integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+
+caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001663:
+ version "1.0.30001668"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz"
+ integrity sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^3.5.3:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+class-variance-authority@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.0.tgz"
+ integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==
+ dependencies:
+ clsx "2.0.0"
+
+classnames@^2.3.2:
+ version "2.5.1"
+ resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz"
+ integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
+
+client-only@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz"
+ integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
+
+clsx@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"
+ integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
+
+clsx@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz"
+ integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==
+
+cmdk@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/cmdk/-/cmdk-0.2.1.tgz"
+ integrity sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==
+ dependencies:
+ "@radix-ui/react-dialog" "1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+commander@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cross-spawn@^7.0.0:
+ version "7.0.3"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+csstype@^3.0.2:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+"date-fns@^2.28.0 || ^3.0.0", date-fns@^3.3.1:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz"
+ integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==
+
+debug@^4.1.0, debug@^4.3.1:
+ version "4.3.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+detect-node-es@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz"
+ integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
+
+didyoumean@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz"
+ integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
+
+dlv@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz"
+ integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
+
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
+electron-to-chromium@^1.5.28:
+ version "1.5.36"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz"
+ integrity sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==
+
+embla-carousel-react@^8.0.0:
+ version "8.3.0"
+ resolved "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.3.0.tgz"
+ integrity sha512-P1FlinFDcIvggcErRjNuVqnUR8anyo8vLMIH8Rthgofw7Nj8qTguCa2QjFAbzxAUTQTPNNjNL7yt0BGGinVdFw==
+ dependencies:
+ embla-carousel "8.3.0"
+ embla-carousel-reactive-utils "8.3.0"
+
+embla-carousel-reactive-utils@8.3.0:
+ version "8.3.0"
+ resolved "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.3.0.tgz"
+ integrity sha512-EYdhhJ302SC4Lmkx8GRsp0sjUhEN4WyFXPOk0kGu9OXZSRMmcBlRgTvHcq8eKJE1bXWBsOi1T83B+BSSVZSmwQ==
+
+embla-carousel@8.3.0:
+ version "8.3.0"
+ resolved "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.3.0.tgz"
+ integrity sha512-Ve8dhI4w28qBqR8J+aMtv7rLK89r1ZA5HocwFz6uMB/i5EiC7bGI7y+AM80yAVUJw3qqaZYK7clmZMUR8kM3UA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+esbuild-linux-64@0.15.18:
+ version "0.15.18"
+ resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz"
+ integrity sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==
+
+esbuild@^0.15.9:
+ version "0.15.18"
+ resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz"
+ integrity sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.15.18"
+ "@esbuild/linux-loong64" "0.15.18"
+ esbuild-android-64 "0.15.18"
+ esbuild-android-arm64 "0.15.18"
+ esbuild-darwin-64 "0.15.18"
+ esbuild-darwin-arm64 "0.15.18"
+ esbuild-freebsd-64 "0.15.18"
+ esbuild-freebsd-arm64 "0.15.18"
+ esbuild-linux-32 "0.15.18"
+ esbuild-linux-64 "0.15.18"
+ esbuild-linux-arm "0.15.18"
+ esbuild-linux-arm64 "0.15.18"
+ esbuild-linux-mips64le "0.15.18"
+ esbuild-linux-ppc64le "0.15.18"
+ esbuild-linux-riscv64 "0.15.18"
+ esbuild-linux-s390x "0.15.18"
+ esbuild-netbsd-64 "0.15.18"
+ esbuild-openbsd-64 "0.15.18"
+ esbuild-sunos-64 "0.15.18"
+ esbuild-windows-32 "0.15.18"
+ esbuild-windows-64 "0.15.18"
+ esbuild-windows-arm64 "0.15.18"
+
+escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+fast-glob@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+foreground-child@^3.1.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz"
+ integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^4.0.1"
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-nonce@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz"
+ integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@^10.3.10:
+ version "10.4.5"
+ resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz"
+ integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^3.1.2"
+ minimatch "^9.0.4"
+ minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
+ path-scurry "^1.11.1"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+graceful-fs@^4.2.11:
+ version "4.2.11"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+invariant@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-core-module@^2.13.0:
+ version "2.15.1"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz"
+ integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
+ dependencies:
+ hasown "^2.0.2"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+jackspeak@^3.1.2:
+ version "3.4.3"
+ resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz"
+ integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
+jiti@^1.21.0:
+ version "1.21.6"
+ resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz"
+ integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+jsesc@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+lilconfig@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz"
+ integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==
+
+lilconfig@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz"
+ integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^10.2.0:
+ version "10.4.3"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lucide-react@^0.338.0:
+ version "0.338.0"
+ resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.338.0.tgz"
+ integrity sha512-Uq+vcn/gp6l01GpDH8SxY6eAvO6Ur2bSU39NxEEJt35OotnVCH5q26TZEVPtJf23gTAncXd3DJQqcezIm6HA7w==
+
+magic-string@^0.26.7:
+ version "0.26.7"
+ resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz"
+ integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==
+ dependencies:
+ sourcemap-codec "^1.4.8"
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4, micromatch@^4.0.5:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz"
+ integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mz@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz"
+ integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+ dependencies:
+ any-promise "^1.0.0"
+ object-assign "^4.0.1"
+ thenify-all "^1.0.0"
+
+nanoid@^3.3.6, nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+next-themes@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz"
+ integrity sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==
+
+next@*:
+ version "14.2.15"
+ resolved "https://registry.npmjs.org/next/-/next-14.2.15.tgz"
+ integrity sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==
+ dependencies:
+ "@next/env" "14.2.15"
+ "@swc/helpers" "0.5.5"
+ busboy "1.6.0"
+ caniuse-lite "^1.0.30001579"
+ graceful-fs "^4.2.11"
+ postcss "8.4.31"
+ styled-jsx "5.1.1"
+ optionalDependencies:
+ "@next/swc-darwin-arm64" "14.2.15"
+ "@next/swc-darwin-x64" "14.2.15"
+ "@next/swc-linux-arm64-gnu" "14.2.15"
+ "@next/swc-linux-arm64-musl" "14.2.15"
+ "@next/swc-linux-x64-gnu" "14.2.15"
+ "@next/swc-linux-x64-musl" "14.2.15"
+ "@next/swc-win32-arm64-msvc" "14.2.15"
+ "@next/swc-win32-ia32-msvc" "14.2.15"
+ "@next/swc-win32-x64-msvc" "14.2.15"
+
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+object-assign@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-hash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz"
+ integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
+
+package-json-from-dist@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz"
+ integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-scurry@^1.11.1:
+ version "1.11.1"
+ resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+picocolors@^1.0.0, picocolors@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz"
+ integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+ integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
+pirates@^4.0.1:
+ version "4.0.6"
+ resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz"
+ integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
+
+postcss-import@^15.1.0:
+ version "15.1.0"
+ resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz"
+ integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==
+ dependencies:
+ postcss-value-parser "^4.0.0"
+ read-cache "^1.0.0"
+ resolve "^1.1.7"
+
+postcss-js@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz"
+ integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==
+ dependencies:
+ camelcase-css "^2.0.1"
+
+postcss-load-config@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz"
+ integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==
+ dependencies:
+ lilconfig "^3.0.0"
+ yaml "^2.3.4"
+
+postcss-nested@^6.0.1:
+ version "6.2.0"
+ resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz"
+ integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==
+ dependencies:
+ postcss-selector-parser "^6.1.1"
+
+postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.1.1:
+ version "6.1.2"
+ resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"
+ integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-value-parser@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@^8.0.0, postcss@^8.2.14, postcss@^8.4.18, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9:
+ version "8.4.47"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz"
+ integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.1.0"
+ source-map-js "^1.2.1"
+
+postcss@8.4.31:
+ version "8.4.31"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz"
+ integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
+ dependencies:
+ nanoid "^3.3.6"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-day-picker@^8.10.0:
+ version "8.10.1"
+ resolved "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz"
+ integrity sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==
+
+react-dom@*, "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", react-dom@^18.0.0, react-dom@^18.2.0, react-dom@>=16.8.0:
+ version "18.3.1"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz"
+ integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
+ dependencies:
+ loose-envify "^1.1.0"
+ scheduler "^0.23.2"
+
+react-hook-form@^7.0.0, react-hook-form@^7.50.1:
+ version "7.53.0"
+ resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz"
+ integrity sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==
+
+react-refresh@^0.14.0:
+ version "0.14.2"
+ resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz"
+ integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==
+
+react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz"
+ integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==
+ dependencies:
+ react-style-singleton "^2.2.1"
+ tslib "^2.0.0"
+
+react-remove-scroll@2.5.4:
+ version "2.5.4"
+ resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz"
+ integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==
+ dependencies:
+ react-remove-scroll-bar "^2.3.3"
+ react-style-singleton "^2.2.1"
+ tslib "^2.1.0"
+ use-callback-ref "^1.3.0"
+ use-sidecar "^1.1.2"
+
+react-remove-scroll@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz"
+ integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==
+ dependencies:
+ react-remove-scroll-bar "^2.3.6"
+ react-style-singleton "^2.2.1"
+ tslib "^2.1.0"
+ use-callback-ref "^1.3.0"
+ use-sidecar "^1.1.2"
+
+react-resizable-panels@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.4.tgz"
+ integrity sha512-kzue8lsoSBdyyd2IfXLQMMhNujOxRoGVus+63K95fQqleGxTfvgYLTzbwYMOODeAHqnkjb3WV/Ks7f5+gDYZuQ==
+
+react-style-singleton@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz"
+ integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==
+ dependencies:
+ get-nonce "^1.0.0"
+ invariant "^2.2.4"
+ tslib "^2.0.0"
+
+react@*, "react@^16.14.0 || ^17.0.0 || ^18.0.0", "react@^16.5.1 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.1 || ^18.0.0", "react@^16.x || ^17.x || ^18.x", react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.8.0:
+ version "18.3.1"
+ resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz"
+ integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+read-cache@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz"
+ integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
+ dependencies:
+ pify "^2.3.0"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+resolve@^1.1.7, resolve@^1.22.1, resolve@^1.22.2:
+ version "1.22.8"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rollup@^2.79.1:
+ version "2.79.2"
+ resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz"
+ integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+scheduler@^0.23.2:
+ version "0.23.2"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz"
+ integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+signal-exit@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+sonner@^1.4.1:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz"
+ integrity sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==
+
+source-map-js@^1.0.2, source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+sourcemap-codec@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+streamsearch@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz"
+ integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
+
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^4.1.0:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+styled-jsx@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz"
+ integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
+ dependencies:
+ client-only "0.0.1"
+
+sucrase@^3.32.0:
+ version "3.35.0"
+ resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz"
+ integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.2"
+ commander "^4.0.0"
+ glob "^10.3.10"
+ lines-and-columns "^1.1.6"
+ mz "^2.7.0"
+ pirates "^4.0.1"
+ ts-interface-checker "^0.1.9"
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+tailwind-merge@^2.5.4:
+ version "2.5.4"
+ resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.4.tgz"
+ integrity sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==
+
+tailwindcss-animate@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz"
+ integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==
+
+tailwindcss@^3.4.1, "tailwindcss@>=3.0.0 || insiders":
+ version "3.4.13"
+ resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz"
+ integrity sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==
+ dependencies:
+ "@alloc/quick-lru" "^5.2.0"
+ arg "^5.0.2"
+ chokidar "^3.5.3"
+ didyoumean "^1.2.2"
+ dlv "^1.1.3"
+ fast-glob "^3.3.0"
+ glob-parent "^6.0.2"
+ is-glob "^4.0.3"
+ jiti "^1.21.0"
+ lilconfig "^2.1.0"
+ micromatch "^4.0.5"
+ normalize-path "^3.0.0"
+ object-hash "^3.0.0"
+ picocolors "^1.0.0"
+ postcss "^8.4.23"
+ postcss-import "^15.1.0"
+ postcss-js "^4.0.1"
+ postcss-load-config "^4.0.1"
+ postcss-nested "^6.0.1"
+ postcss-selector-parser "^6.0.11"
+ resolve "^1.22.2"
+ sucrase "^3.32.0"
+
+thenify-all@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz"
+ integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
+ dependencies:
+ thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz"
+ integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+ dependencies:
+ any-promise "^1.0.0"
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+ts-interface-checker@^0.1.9:
+ version "0.1.13"
+ resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz"
+ integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
+
+tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz"
+ integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
+
+typescript@^4.6.4:
+ version "4.9.5"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
+ integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
+
+undici-types@~6.19.2:
+ version "6.19.8"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
+update-browserslist-db@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
+
+use-callback-ref@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz"
+ integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==
+ dependencies:
+ tslib "^2.0.0"
+
+use-sidecar@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz"
+ integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==
+ dependencies:
+ detect-node-es "^1.1.0"
+ tslib "^2.0.0"
+
+util-deprecate@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+vaul@^0.9.0:
+ version "0.9.9"
+ resolved "https://registry.npmjs.org/vaul/-/vaul-0.9.9.tgz"
+ integrity sha512-7afKg48srluhZwIkaU+lgGtFCUsYBSGOl8vcc8N/M3YQlZFlynHD15AE+pwrYdc826o7nrIND4lL9Y6b9WWZZQ==
+ dependencies:
+ "@radix-ui/react-dialog" "^1.1.1"
+
+vite@^3.0.0, vite@^3.0.7:
+ version "3.2.11"
+ resolved "https://registry.npmjs.org/vite/-/vite-3.2.11.tgz"
+ integrity sha512-K/jGKL/PgbIgKCiJo5QbASQhFiV02X9Jh+Qq0AKCRCRKZtOTVi4t6wh75FDpGf2N9rYOnzH87OEFQNaFy6pdxQ==
+ dependencies:
+ esbuild "^0.15.9"
+ postcss "^8.4.18"
+ resolve "^1.22.1"
+ rollup "^2.79.1"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yaml@^2.3.4:
+ version "2.5.1"
+ resolved "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz"
+ integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==
+
+zod@^3.22.4:
+ version "3.23.8"
+ resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz"
+ integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==
diff --git a/app/spilotui/main.go b/app/spilotui/main.go
new file mode 100644
index 0000000..65a6edb
--- /dev/null
+++ b/app/spilotui/main.go
@@ -0,0 +1,44 @@
+package main
+
+import (
+ "context"
+ "embed"
+
+ driver "github.com/aforamitdev/server-pilot/api/spilot/driver/grpc"
+ "github.com/wailsapp/wails/v2"
+ "github.com/wailsapp/wails/v2/pkg/options"
+ "github.com/wailsapp/wails/v2/pkg/options/assetserver"
+)
+
+//go:embed all:frontend/dist
+var assets embed.FS
+
+func main() {
+ // Create an instance of the app structure
+ app := NewApp()
+ grpc_driver := driver.NewGrpcDriver()
+
+ // Create application with options
+ err := wails.Run(&options.App{
+ Title: "Server Pilot",
+ Width: 1024,
+ Height: 768,
+ AssetServer: &assetserver.Options{
+ Assets: assets,
+ },
+ BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
+ OnStartup: func(ctx context.Context) {
+ app.startup(ctx)
+ grpc_driver.Startup(ctx)
+
+ },
+ Bind: []interface{}{
+ app,
+ grpc_driver,
+ },
+ })
+
+ if err != nil {
+ println("Error:", err.Error())
+ }
+}
diff --git a/app/spilotui/wails.json b/app/spilotui/wails.json
new file mode 100644
index 0000000..cafec10
--- /dev/null
+++ b/app/spilotui/wails.json
@@ -0,0 +1,13 @@
+{
+ "$schema": "https://wails.io/schemas/config.v2.json",
+ "name": "spilotui",
+ "outputfilename": "spilotui",
+ "frontend:install": "npm install",
+ "frontend:build": "npm run build",
+ "frontend:dev:watcher": "npm run dev",
+ "frontend:dev:serverUrl": "auto",
+ "author": {
+ "name": "aforamitdev",
+ "email": "aforamitrai@gmail.com"
+ }
+}
diff --git a/go.mod b/go.mod
index 0113691..0e8219c 100644
--- a/go.mod
+++ b/go.mod
@@ -3,20 +3,44 @@ module github.com/aforamitdev/server-pilot
go 1.22.3
require (
- github.com/google/s2a-go v0.1.8
- github.com/labstack/echo/v4 v4.12.0
+ github.com/pkg/errors v0.9.1
+ github.com/shirou/gopsutil/v3 v3.24.5
+ github.com/wailsapp/wails/v2 v2.7.1
google.golang.org/grpc v1.64.0
google.golang.org/protobuf v1.34.2
+
)
require (
+ github.com/bep/debounce v1.2.1 // indirect
+ github.com/go-ole/go-ole v1.2.6 // indirect
+ github.com/godbus/dbus/v5 v5.1.0 // indirect
+ github.com/google/uuid v1.6.0 // indirect
+ github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
+ github.com/labstack/echo/v4 v4.12.0 // indirect
github.com/labstack/gommon v0.4.2 // indirect
+ github.com/leaanthony/go-ansi-parser v1.6.0 // indirect
+ github.com/leaanthony/gosod v1.0.3 // indirect
+ github.com/leaanthony/slicer v1.6.0 // indirect
+ github.com/leaanthony/u v1.1.0 // indirect
+ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
- github.com/pkg/errors v0.9.1 // indirect
+ github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
+ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
+ github.com/rivo/uniseg v0.4.4 // indirect
+ github.com/samber/lo v1.38.1 // indirect
+ github.com/shoenig/go-m1cpu v0.1.6 // indirect
+ github.com/tklauser/go-sysconf v0.3.12 // indirect
+ github.com/tklauser/numcpus v0.6.1 // indirect
+ github.com/tkrajina/go-reflector v0.5.6 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
+ github.com/wailsapp/go-webview2 v1.0.10 // indirect
+ github.com/wailsapp/mimetype v1.4.1 // indirect
+ github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/crypto v0.22.0 // indirect
+ golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect
golang.org/x/net v0.24.0 // indirect
golang.org/x/sys v0.21.0 // indirect
golang.org/x/text v0.16.0 // indirect
diff --git a/go.sum b/go.sum
index 9509d4e..3a2c1f2 100644
--- a/go.sum
+++ b/go.sum
@@ -1,38 +1,106 @@
+github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=
+github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
+github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
+github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
+github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
-github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck=
+github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=
github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0=
github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM=
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
+github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc=
+github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA=
+github.com/leaanthony/go-ansi-parser v1.6.0 h1:T8TuMhFB6TUMIUm0oRrSbgJudTFw9csT3ZK09w0t4Pg=
+github.com/leaanthony/go-ansi-parser v1.6.0/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU=
+github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ=
+github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4=
+github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=
+github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js=
+github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8=
+github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI=
+github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=
+github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
+github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
+github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
+github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
+github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
+github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=
+github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=
+github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=
+github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
+github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk=
+github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
+github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
+github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
+github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
+github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
+github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
+github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
+github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE=
+github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
+github.com/wailsapp/go-webview2 v1.0.10 h1:PP5Hug6pnQEAhfRzLCoOh2jJaPdrqeRgJKZhyYyDV/w=
+github.com/wailsapp/go-webview2 v1.0.10/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo=
+github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=
+github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=
+github.com/wailsapp/wails/v2 v2.7.1 h1:HAzp2c5ODOzsLC6ZMDVtNOB72ozM7/SJecJPB2Ur+UU=
+github.com/wailsapp/wails/v2 v2.7.1/go.mod h1:oIJVwwso5fdOgprBYWXBBqtx6PaSvxg8/KTQHNGkadc=
+github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
+github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
+golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=
+golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
+golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
+golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
diff --git a/internal/metrics/mem_linux.go b/internal/metrics/mem_linux.go
new file mode 100644
index 0000000..aa4abd3
--- /dev/null
+++ b/internal/metrics/mem_linux.go
@@ -0,0 +1,35 @@
+package metrics
+
+import (
+ "fmt"
+ "os"
+)
+
+type Memory struct {
+ MemTotal uint64 "mem:MemTotal"
+ MemFree uint64 "mem:MemFree"
+ MemAvailable uint64 "mem:MemAvailable"
+ Buffers uint64 "mem:Buffers"
+ Cached uint64 "mem:Cached"
+ SwapCached uint64 "mem:SwapCached"
+ Active uint64 "mem:Active"
+ Inactive uint64 "mem:Inactive"
+ Unevictable uint64 "mem:Unevictable"
+ Mlocked uint64 "mem:Mlocked"
+ SwapTotal uint64 "mem:SwapTotal"
+ SwapFree uint64 "mem:SwapFree"
+ Zswap uint64 "mem:Zswap"
+ Zswapped uint64 "mem:Zswapped"
+ Dirty uint64 "mem:Dirty"
+}
+
+func NewMemory() *Memory {
+ buf, err := os.ReadFile("/proc/meminfo")
+ fmt.Println(buf)
+ if err != nil {
+ return &Memory{}
+ }
+ mem := &Memory{}
+ return mem
+
+}
diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go
new file mode 100644
index 0000000..8668ac4
--- /dev/null
+++ b/internal/metrics/metrics.go
@@ -0,0 +1,12 @@
+package metrics
+
+type Matrices struct {
+}
+
+func NewMatrices() *Matrices {
+
+ m := &Matrices{}
+
+ return m
+
+}
diff --git a/internal/proto/status.proto b/internal/proto/status.proto
deleted file mode 100644
index 4284c0c..0000000
--- a/internal/proto/status.proto
+++ /dev/null
@@ -1,18 +0,0 @@
-syntax = "proto3";
-
-option go_package = "protogen/";
-
-
-message StatusRequest {
-
-}
-
-message StatusResponse {
- string name = 1;
-}
-
-
-
-service StatusService {
- rpc GetStatus(StatusRequest) returns (StatusResponse);
-}
\ No newline at end of file
diff --git a/internal/proto/system.proto b/internal/proto/system.proto
deleted file mode 100644
index e772385..0000000
--- a/internal/proto/system.proto
+++ /dev/null
@@ -1,17 +0,0 @@
-syntax = "proto3";
-
-option go_package = "protogen/";
-
-message SystemRequest {
-
-}
-
-message SystemResponse {
- string name = 1;
-}
-
-
-
-service SystemService {
- rpc GetSystem(SystemRequest) returns (SystemResponse);
-}
\ No newline at end of file
diff --git a/internal/proto/user.proto b/internal/proto/user.proto
deleted file mode 100644
index ba6669f..0000000
--- a/internal/proto/user.proto
+++ /dev/null
@@ -1,17 +0,0 @@
-syntax = "proto3";
-
-option go_package = "protogen/";
-
-message UserRequest {
-
-}
-
-message UserResponse {
- string name = 1;
-}
-
-
-
-service UserService {
- rpc GetUsers(UserRequest) returns (UserResponse);
-}
\ No newline at end of file
diff --git a/internal/protogen/status.pb.go b/internal/protogen/status.pb.go
deleted file mode 100644
index df002d2..0000000
--- a/internal/protogen/status.pb.go
+++ /dev/null
@@ -1,200 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// protoc-gen-go v1.28.1
-// protoc v3.12.4
-// source: internal/proto/status.proto
-
-package protogen
-
-import (
- 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)
-)
-
-type StatusRequest struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-}
-
-func (x *StatusRequest) Reset() {
- *x = StatusRequest{}
- if protoimpl.UnsafeEnabled {
- mi := &file_internal_proto_status_proto_msgTypes[0]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *StatusRequest) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*StatusRequest) ProtoMessage() {}
-
-func (x *StatusRequest) ProtoReflect() protoreflect.Message {
- mi := &file_internal_proto_status_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 StatusRequest.ProtoReflect.Descriptor instead.
-func (*StatusRequest) Descriptor() ([]byte, []int) {
- return file_internal_proto_status_proto_rawDescGZIP(), []int{0}
-}
-
-type StatusResponse struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *StatusResponse) Reset() {
- *x = StatusResponse{}
- if protoimpl.UnsafeEnabled {
- mi := &file_internal_proto_status_proto_msgTypes[1]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *StatusResponse) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*StatusResponse) ProtoMessage() {}
-
-func (x *StatusResponse) ProtoReflect() protoreflect.Message {
- mi := &file_internal_proto_status_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 StatusResponse.ProtoReflect.Descriptor instead.
-func (*StatusResponse) Descriptor() ([]byte, []int) {
- return file_internal_proto_status_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *StatusResponse) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-var File_internal_proto_status_proto protoreflect.FileDescriptor
-
-var file_internal_proto_status_proto_rawDesc = []byte{
- 0x0a, 0x1b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0f, 0x0a,
- 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x24,
- 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x3d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x65,
- 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74,
- 0x75, 0x73, 0x12, 0x0e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x42, 0x0b, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f,
- 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
- file_internal_proto_status_proto_rawDescOnce sync.Once
- file_internal_proto_status_proto_rawDescData = file_internal_proto_status_proto_rawDesc
-)
-
-func file_internal_proto_status_proto_rawDescGZIP() []byte {
- file_internal_proto_status_proto_rawDescOnce.Do(func() {
- file_internal_proto_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_proto_status_proto_rawDescData)
- })
- return file_internal_proto_status_proto_rawDescData
-}
-
-var file_internal_proto_status_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
-var file_internal_proto_status_proto_goTypes = []interface{}{
- (*StatusRequest)(nil), // 0: StatusRequest
- (*StatusResponse)(nil), // 1: StatusResponse
-}
-var file_internal_proto_status_proto_depIdxs = []int32{
- 0, // 0: StatusService.GetStatus:input_type -> StatusRequest
- 1, // 1: StatusService.GetStatus:output_type -> StatusResponse
- 1, // [1:2] is the sub-list for method output_type
- 0, // [0:1] is the sub-list for method input_type
- 0, // [0:0] is the sub-list for extension type_name
- 0, // [0:0] is the sub-list for extension extendee
- 0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_internal_proto_status_proto_init() }
-func file_internal_proto_status_proto_init() {
- if File_internal_proto_status_proto != nil {
- return
- }
- if !protoimpl.UnsafeEnabled {
- file_internal_proto_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*StatusRequest); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_internal_proto_status_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*StatusResponse); 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_internal_proto_status_proto_rawDesc,
- NumEnums: 0,
- NumMessages: 2,
- NumExtensions: 0,
- NumServices: 1,
- },
- GoTypes: file_internal_proto_status_proto_goTypes,
- DependencyIndexes: file_internal_proto_status_proto_depIdxs,
- MessageInfos: file_internal_proto_status_proto_msgTypes,
- }.Build()
- File_internal_proto_status_proto = out.File
- file_internal_proto_status_proto_rawDesc = nil
- file_internal_proto_status_proto_goTypes = nil
- file_internal_proto_status_proto_depIdxs = nil
-}
diff --git a/internal/protogen/status_grpc.pb.go b/internal/protogen/status_grpc.pb.go
deleted file mode 100644
index 2e461cc..0000000
--- a/internal/protogen/status_grpc.pb.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
-// versions:
-// - protoc-gen-go-grpc v1.4.0
-// - protoc v3.12.4
-// source: internal/proto/status.proto
-
-package protogen
-
-import (
- context "context"
- grpc "google.golang.org/grpc"
- codes "google.golang.org/grpc/codes"
- status "google.golang.org/grpc/status"
-)
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-// Requires gRPC-Go v1.62.0 or later.
-const _ = grpc.SupportPackageIsVersion8
-
-const (
- StatusService_GetStatus_FullMethodName = "/StatusService/GetStatus"
-)
-
-// StatusServiceClient is the client API for StatusService service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type StatusServiceClient interface {
- GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error)
-}
-
-type statusServiceClient struct {
- cc grpc.ClientConnInterface
-}
-
-func NewStatusServiceClient(cc grpc.ClientConnInterface) StatusServiceClient {
- return &statusServiceClient{cc}
-}
-
-func (c *statusServiceClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusResponse, error) {
- cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
- out := new(StatusResponse)
- err := c.cc.Invoke(ctx, StatusService_GetStatus_FullMethodName, in, out, cOpts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-// StatusServiceServer is the server API for StatusService service.
-// All implementations must embed UnimplementedStatusServiceServer
-// for forward compatibility
-type StatusServiceServer interface {
- GetStatus(context.Context, *StatusRequest) (*StatusResponse, error)
- mustEmbedUnimplementedStatusServiceServer()
-}
-
-// UnimplementedStatusServiceServer must be embedded to have forward compatible implementations.
-type UnimplementedStatusServiceServer struct {
-}
-
-func (UnimplementedStatusServiceServer) GetStatus(context.Context, *StatusRequest) (*StatusResponse, error) {
- return nil, status.Errorf(codes.Unimplemented, "method GetStatus not implemented")
-}
-func (UnimplementedStatusServiceServer) mustEmbedUnimplementedStatusServiceServer() {}
-
-// UnsafeStatusServiceServer may be embedded to opt out of forward compatibility for this service.
-// Use of this interface is not recommended, as added methods to StatusServiceServer will
-// result in compilation errors.
-type UnsafeStatusServiceServer interface {
- mustEmbedUnimplementedStatusServiceServer()
-}
-
-func RegisterStatusServiceServer(s grpc.ServiceRegistrar, srv StatusServiceServer) {
- s.RegisterService(&StatusService_ServiceDesc, srv)
-}
-
-func _StatusService_GetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(StatusRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(StatusServiceServer).GetStatus(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: StatusService_GetStatus_FullMethodName,
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(StatusServiceServer).GetStatus(ctx, req.(*StatusRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-// StatusService_ServiceDesc is the grpc.ServiceDesc for StatusService service.
-// It's only intended for direct use with grpc.RegisterService,
-// and not to be introspected or modified (even as a copy)
-var StatusService_ServiceDesc = grpc.ServiceDesc{
- ServiceName: "StatusService",
- HandlerType: (*StatusServiceServer)(nil),
- Methods: []grpc.MethodDesc{
- {
- MethodName: "GetStatus",
- Handler: _StatusService_GetStatus_Handler,
- },
- },
- Streams: []grpc.StreamDesc{},
- Metadata: "internal/proto/status.proto",
-}
diff --git a/internal/protogen/system.pb.go b/internal/protogen/system.pb.go
deleted file mode 100644
index 7952ee3..0000000
--- a/internal/protogen/system.pb.go
+++ /dev/null
@@ -1,200 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// protoc-gen-go v1.28.1
-// protoc v3.12.4
-// source: internal/proto/system.proto
-
-package protogen
-
-import (
- 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)
-)
-
-type SystemRequest struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-}
-
-func (x *SystemRequest) Reset() {
- *x = SystemRequest{}
- if protoimpl.UnsafeEnabled {
- mi := &file_internal_proto_system_proto_msgTypes[0]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *SystemRequest) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*SystemRequest) ProtoMessage() {}
-
-func (x *SystemRequest) ProtoReflect() protoreflect.Message {
- mi := &file_internal_proto_system_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 SystemRequest.ProtoReflect.Descriptor instead.
-func (*SystemRequest) Descriptor() ([]byte, []int) {
- return file_internal_proto_system_proto_rawDescGZIP(), []int{0}
-}
-
-type SystemResponse struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *SystemResponse) Reset() {
- *x = SystemResponse{}
- if protoimpl.UnsafeEnabled {
- mi := &file_internal_proto_system_proto_msgTypes[1]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *SystemResponse) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*SystemResponse) ProtoMessage() {}
-
-func (x *SystemResponse) ProtoReflect() protoreflect.Message {
- mi := &file_internal_proto_system_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 SystemResponse.ProtoReflect.Descriptor instead.
-func (*SystemResponse) Descriptor() ([]byte, []int) {
- return file_internal_proto_system_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *SystemResponse) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-var File_internal_proto_system_proto protoreflect.FileDescriptor
-
-var file_internal_proto_system_proto_rawDesc = []byte{
- 0x0a, 0x1b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0f, 0x0a,
- 0x0d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x24,
- 0x0a, 0x0e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
- 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
- 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x3d, 0x0a, 0x0d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65,
- 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74,
- 0x65, 0x6d, 0x12, 0x0e, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65,
- 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x42, 0x0b, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f,
- 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
- file_internal_proto_system_proto_rawDescOnce sync.Once
- file_internal_proto_system_proto_rawDescData = file_internal_proto_system_proto_rawDesc
-)
-
-func file_internal_proto_system_proto_rawDescGZIP() []byte {
- file_internal_proto_system_proto_rawDescOnce.Do(func() {
- file_internal_proto_system_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_proto_system_proto_rawDescData)
- })
- return file_internal_proto_system_proto_rawDescData
-}
-
-var file_internal_proto_system_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
-var file_internal_proto_system_proto_goTypes = []interface{}{
- (*SystemRequest)(nil), // 0: SystemRequest
- (*SystemResponse)(nil), // 1: SystemResponse
-}
-var file_internal_proto_system_proto_depIdxs = []int32{
- 0, // 0: SystemService.GetSystem:input_type -> SystemRequest
- 1, // 1: SystemService.GetSystem:output_type -> SystemResponse
- 1, // [1:2] is the sub-list for method output_type
- 0, // [0:1] is the sub-list for method input_type
- 0, // [0:0] is the sub-list for extension type_name
- 0, // [0:0] is the sub-list for extension extendee
- 0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_internal_proto_system_proto_init() }
-func file_internal_proto_system_proto_init() {
- if File_internal_proto_system_proto != nil {
- return
- }
- if !protoimpl.UnsafeEnabled {
- file_internal_proto_system_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*SystemRequest); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_internal_proto_system_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*SystemResponse); 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_internal_proto_system_proto_rawDesc,
- NumEnums: 0,
- NumMessages: 2,
- NumExtensions: 0,
- NumServices: 1,
- },
- GoTypes: file_internal_proto_system_proto_goTypes,
- DependencyIndexes: file_internal_proto_system_proto_depIdxs,
- MessageInfos: file_internal_proto_system_proto_msgTypes,
- }.Build()
- File_internal_proto_system_proto = out.File
- file_internal_proto_system_proto_rawDesc = nil
- file_internal_proto_system_proto_goTypes = nil
- file_internal_proto_system_proto_depIdxs = nil
-}
diff --git a/internal/protogen/system_grpc.pb.go b/internal/protogen/system_grpc.pb.go
deleted file mode 100644
index 6343ef7..0000000
--- a/internal/protogen/system_grpc.pb.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
-// versions:
-// - protoc-gen-go-grpc v1.4.0
-// - protoc v3.12.4
-// source: internal/proto/system.proto
-
-package protogen
-
-import (
- context "context"
- grpc "google.golang.org/grpc"
- codes "google.golang.org/grpc/codes"
- status "google.golang.org/grpc/status"
-)
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-// Requires gRPC-Go v1.62.0 or later.
-const _ = grpc.SupportPackageIsVersion8
-
-const (
- SystemService_GetSystem_FullMethodName = "/SystemService/GetSystem"
-)
-
-// SystemServiceClient is the client API for SystemService service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type SystemServiceClient interface {
- GetSystem(ctx context.Context, in *SystemRequest, opts ...grpc.CallOption) (*SystemResponse, error)
-}
-
-type systemServiceClient struct {
- cc grpc.ClientConnInterface
-}
-
-func NewSystemServiceClient(cc grpc.ClientConnInterface) SystemServiceClient {
- return &systemServiceClient{cc}
-}
-
-func (c *systemServiceClient) GetSystem(ctx context.Context, in *SystemRequest, opts ...grpc.CallOption) (*SystemResponse, error) {
- cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
- out := new(SystemResponse)
- err := c.cc.Invoke(ctx, SystemService_GetSystem_FullMethodName, in, out, cOpts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-// SystemServiceServer is the server API for SystemService service.
-// All implementations must embed UnimplementedSystemServiceServer
-// for forward compatibility
-type SystemServiceServer interface {
- GetSystem(context.Context, *SystemRequest) (*SystemResponse, error)
- mustEmbedUnimplementedSystemServiceServer()
-}
-
-// UnimplementedSystemServiceServer must be embedded to have forward compatible implementations.
-type UnimplementedSystemServiceServer struct {
-}
-
-func (UnimplementedSystemServiceServer) GetSystem(context.Context, *SystemRequest) (*SystemResponse, error) {
- return nil, status.Errorf(codes.Unimplemented, "method GetSystem not implemented")
-}
-func (UnimplementedSystemServiceServer) mustEmbedUnimplementedSystemServiceServer() {}
-
-// UnsafeSystemServiceServer may be embedded to opt out of forward compatibility for this service.
-// Use of this interface is not recommended, as added methods to SystemServiceServer will
-// result in compilation errors.
-type UnsafeSystemServiceServer interface {
- mustEmbedUnimplementedSystemServiceServer()
-}
-
-func RegisterSystemServiceServer(s grpc.ServiceRegistrar, srv SystemServiceServer) {
- s.RegisterService(&SystemService_ServiceDesc, srv)
-}
-
-func _SystemService_GetSystem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(SystemRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(SystemServiceServer).GetSystem(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: SystemService_GetSystem_FullMethodName,
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(SystemServiceServer).GetSystem(ctx, req.(*SystemRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-// SystemService_ServiceDesc is the grpc.ServiceDesc for SystemService service.
-// It's only intended for direct use with grpc.RegisterService,
-// and not to be introspected or modified (even as a copy)
-var SystemService_ServiceDesc = grpc.ServiceDesc{
- ServiceName: "SystemService",
- HandlerType: (*SystemServiceServer)(nil),
- Methods: []grpc.MethodDesc{
- {
- MethodName: "GetSystem",
- Handler: _SystemService_GetSystem_Handler,
- },
- },
- Streams: []grpc.StreamDesc{},
- Metadata: "internal/proto/system.proto",
-}
diff --git a/internal/protogen/user.pb.go b/internal/protogen/user.pb.go
deleted file mode 100644
index 6d51ead..0000000
--- a/internal/protogen/user.pb.go
+++ /dev/null
@@ -1,199 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// versions:
-// protoc-gen-go v1.28.1
-// protoc v3.12.4
-// source: internal/proto/user.proto
-
-package protogen
-
-import (
- 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)
-)
-
-type UserRequest struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-}
-
-func (x *UserRequest) Reset() {
- *x = UserRequest{}
- if protoimpl.UnsafeEnabled {
- mi := &file_internal_proto_user_proto_msgTypes[0]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *UserRequest) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*UserRequest) ProtoMessage() {}
-
-func (x *UserRequest) ProtoReflect() protoreflect.Message {
- mi := &file_internal_proto_user_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 UserRequest.ProtoReflect.Descriptor instead.
-func (*UserRequest) Descriptor() ([]byte, []int) {
- return file_internal_proto_user_proto_rawDescGZIP(), []int{0}
-}
-
-type UserResponse struct {
- state protoimpl.MessageState
- sizeCache protoimpl.SizeCache
- unknownFields protoimpl.UnknownFields
-
- Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-}
-
-func (x *UserResponse) Reset() {
- *x = UserResponse{}
- if protoimpl.UnsafeEnabled {
- mi := &file_internal_proto_user_proto_msgTypes[1]
- ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
- ms.StoreMessageInfo(mi)
- }
-}
-
-func (x *UserResponse) String() string {
- return protoimpl.X.MessageStringOf(x)
-}
-
-func (*UserResponse) ProtoMessage() {}
-
-func (x *UserResponse) ProtoReflect() protoreflect.Message {
- mi := &file_internal_proto_user_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 UserResponse.ProtoReflect.Descriptor instead.
-func (*UserResponse) Descriptor() ([]byte, []int) {
- return file_internal_proto_user_proto_rawDescGZIP(), []int{1}
-}
-
-func (x *UserResponse) GetName() string {
- if x != nil {
- return x.Name
- }
- return ""
-}
-
-var File_internal_proto_user_proto protoreflect.FileDescriptor
-
-var file_internal_proto_user_proto_rawDesc = []byte{
- 0x0a, 0x19, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
- 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x0d, 0x0a, 0x0b, 0x55,
- 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x0c, 0x55, 0x73,
- 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
- 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x32, 0x36,
- 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x27, 0x0a,
- 0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0c, 0x2e, 0x55, 0x73, 0x65, 0x72,
- 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0b, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67,
- 0x65, 0x6e, 0x2f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
-}
-
-var (
- file_internal_proto_user_proto_rawDescOnce sync.Once
- file_internal_proto_user_proto_rawDescData = file_internal_proto_user_proto_rawDesc
-)
-
-func file_internal_proto_user_proto_rawDescGZIP() []byte {
- file_internal_proto_user_proto_rawDescOnce.Do(func() {
- file_internal_proto_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_internal_proto_user_proto_rawDescData)
- })
- return file_internal_proto_user_proto_rawDescData
-}
-
-var file_internal_proto_user_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
-var file_internal_proto_user_proto_goTypes = []interface{}{
- (*UserRequest)(nil), // 0: UserRequest
- (*UserResponse)(nil), // 1: UserResponse
-}
-var file_internal_proto_user_proto_depIdxs = []int32{
- 0, // 0: UserService.GetUsers:input_type -> UserRequest
- 1, // 1: UserService.GetUsers:output_type -> UserResponse
- 1, // [1:2] is the sub-list for method output_type
- 0, // [0:1] is the sub-list for method input_type
- 0, // [0:0] is the sub-list for extension type_name
- 0, // [0:0] is the sub-list for extension extendee
- 0, // [0:0] is the sub-list for field type_name
-}
-
-func init() { file_internal_proto_user_proto_init() }
-func file_internal_proto_user_proto_init() {
- if File_internal_proto_user_proto != nil {
- return
- }
- if !protoimpl.UnsafeEnabled {
- file_internal_proto_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*UserRequest); i {
- case 0:
- return &v.state
- case 1:
- return &v.sizeCache
- case 2:
- return &v.unknownFields
- default:
- return nil
- }
- }
- file_internal_proto_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
- switch v := v.(*UserResponse); 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_internal_proto_user_proto_rawDesc,
- NumEnums: 0,
- NumMessages: 2,
- NumExtensions: 0,
- NumServices: 1,
- },
- GoTypes: file_internal_proto_user_proto_goTypes,
- DependencyIndexes: file_internal_proto_user_proto_depIdxs,
- MessageInfos: file_internal_proto_user_proto_msgTypes,
- }.Build()
- File_internal_proto_user_proto = out.File
- file_internal_proto_user_proto_rawDesc = nil
- file_internal_proto_user_proto_goTypes = nil
- file_internal_proto_user_proto_depIdxs = nil
-}
diff --git a/internal/protogen/user_grpc.pb.go b/internal/protogen/user_grpc.pb.go
deleted file mode 100644
index b645489..0000000
--- a/internal/protogen/user_grpc.pb.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
-// versions:
-// - protoc-gen-go-grpc v1.4.0
-// - protoc v3.12.4
-// source: internal/proto/user.proto
-
-package protogen
-
-import (
- context "context"
- grpc "google.golang.org/grpc"
- codes "google.golang.org/grpc/codes"
- status "google.golang.org/grpc/status"
-)
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-// Requires gRPC-Go v1.62.0 or later.
-const _ = grpc.SupportPackageIsVersion8
-
-const (
- UserService_GetUsers_FullMethodName = "/UserService/GetUsers"
-)
-
-// UserServiceClient is the client API for UserService service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
-type UserServiceClient interface {
- GetUsers(ctx context.Context, in *UserRequest, opts ...grpc.CallOption) (*UserResponse, error)
-}
-
-type userServiceClient struct {
- cc grpc.ClientConnInterface
-}
-
-func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {
- return &userServiceClient{cc}
-}
-
-func (c *userServiceClient) GetUsers(ctx context.Context, in *UserRequest, opts ...grpc.CallOption) (*UserResponse, error) {
- cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
- out := new(UserResponse)
- err := c.cc.Invoke(ctx, UserService_GetUsers_FullMethodName, in, out, cOpts...)
- if err != nil {
- return nil, err
- }
- return out, nil
-}
-
-// UserServiceServer is the server API for UserService service.
-// All implementations must embed UnimplementedUserServiceServer
-// for forward compatibility
-type UserServiceServer interface {
- GetUsers(context.Context, *UserRequest) (*UserResponse, error)
- mustEmbedUnimplementedUserServiceServer()
-}
-
-// UnimplementedUserServiceServer must be embedded to have forward compatible implementations.
-type UnimplementedUserServiceServer struct {
-}
-
-func (UnimplementedUserServiceServer) GetUsers(context.Context, *UserRequest) (*UserResponse, error) {
- return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented")
-}
-func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {}
-
-// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service.
-// Use of this interface is not recommended, as added methods to UserServiceServer will
-// result in compilation errors.
-type UnsafeUserServiceServer interface {
- mustEmbedUnimplementedUserServiceServer()
-}
-
-func RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) {
- s.RegisterService(&UserService_ServiceDesc, srv)
-}
-
-func _UserService_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
- in := new(UserRequest)
- if err := dec(in); err != nil {
- return nil, err
- }
- if interceptor == nil {
- return srv.(UserServiceServer).GetUsers(ctx, in)
- }
- info := &grpc.UnaryServerInfo{
- Server: srv,
- FullMethod: UserService_GetUsers_FullMethodName,
- }
- handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(UserServiceServer).GetUsers(ctx, req.(*UserRequest))
- }
- return interceptor(ctx, in, info, handler)
-}
-
-// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.
-// It's only intended for direct use with grpc.RegisterService,
-// and not to be introspected or modified (even as a copy)
-var UserService_ServiceDesc = grpc.ServiceDesc{
- ServiceName: "UserService",
- HandlerType: (*UserServiceServer)(nil),
- Methods: []grpc.MethodDesc{
- {
- MethodName: "GetUsers",
- Handler: _UserService_GetUsers_Handler,
- },
- },
- Streams: []grpc.StreamDesc{},
- Metadata: "internal/proto/user.proto",
-}
diff --git a/internal/rsyslog/rlog.go b/internal/rsyslog/rlog.go
index 79a8f21..57a6f97 100644
--- a/internal/rsyslog/rlog.go
+++ b/internal/rsyslog/rlog.go
@@ -1,21 +1,61 @@
package rsyslog
import (
+ "context"
+ "fmt"
"net"
+ apiv1 "github.com/aforamitdev/server-pilot/app/spilothq/gen/proto/api/v1"
"github.com/pkg/errors"
)
type RLog struct {
// packet listener
+ apiv1.UnimplementedLogServiceServer
+ // protogen.ServerPilotServer
+
PC net.PacketConn
}
func NewLogListener(port string) (*RLog, error) {
-
+ fmt.Println(port)
pc, err := net.ListenPacket("udp", port)
if err != nil {
return nil, errors.Wrap(err, "fail to start UDP listeners, rsyslog")
}
return &RLog{PC: pc}, nil
}
+
+func (log *RLog) GetLogs(req *apiv1.LogRequest, srv apiv1.LogService_GetLogsServer) error {
+ fmt.Println("get logs ")
+ ctx := context.Background()
+
+ data := make([]byte, 1024)
+
+ for {
+ select {
+ case <-ctx.Done():
+ fmt.Println("CANCEL")
+ return ctx.Err()
+ default:
+ }
+
+ n, remoteAddr, err := log.PC.ReadFrom(data)
+ if err != nil {
+ fmt.Printf("error reading log")
+ }
+ fmt.Println(string(data))
+ prt := &apiv1.LogResponse{
+ Log: string(data),
+ }
+ fmt.Println(remoteAddr)
+ fmt.Println(n)
+
+ err = srv.Send(prt)
+ if err != nil {
+ fmt.Println(err)
+ }
+
+ }
+
+}
diff --git a/internal/system/models.go b/internal/system/models.go
index 9b140a3..302b82d 100644
--- a/internal/system/models.go
+++ b/internal/system/models.go
@@ -1 +1,4 @@
package system
+
+type SystemInformation struct {
+}
diff --git a/internal/system/system.go b/internal/system/system.go
index d6792a9..5a4227d 100644
--- a/internal/system/system.go
+++ b/internal/system/system.go
@@ -1,12 +1,16 @@
package system
import (
- "github.com/aforamitdev/server-pilot/internal/protogen"
+ "context"
+ "encoding/json"
+
+ apiv1 "github.com/aforamitdev/server-pilot/app/spilothq/gen/proto/api/v1"
"github.com/aforamitdev/server-pilot/pkg/logger"
+ "github.com/shirou/gopsutil/v3/host"
)
type SystemInformer struct {
- protogen.UnimplementedStatusServiceServer
+ apiv1.UnimplementedSystemServicesServer
log *logger.Logger
}
@@ -15,3 +19,22 @@ func NewSystemInformer(log *logger.Logger) *SystemInformer {
log: log,
}
}
+
+func (s *SystemInformer) GetStatus(ctx context.Context, req *apiv1.GetStatusRequest) (*apiv1.GetStatusResponse, error) {
+
+ host, err := host.Info()
+
+ if err != nil {
+ return nil, err
+ }
+
+ resp, err := json.Marshal(host)
+
+ if err != nil {
+ return nil, err
+ }
+
+ rsp := apiv1.GetStatusResponse{System: string(resp)}
+ return &rsp, nil
+
+}
diff --git a/pkg/log_collector/collector.go b/pkg/log_collector/collector.go
deleted file mode 100644
index 79ec3d4..0000000
--- a/pkg/log_collector/collector.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package log_collector
-
-import (
- "errors"
- "fmt"
- "net"
-)
-
-type LogCollector struct {
- addr net.UDPAddr
- conn *net.UDPConn
-}
-
-func NewLogCollector() *LogCollector {
- return &LogCollector{}
-}
-
-func (l *LogCollector) SetUpLog(port int, addressIP net.IP) {
- l.addr = net.UDPAddr{Port: port, IP: addressIP}
-}
-
-func (l *LogCollector) StartLogCollector(port int, address net.IP) (*net.UDPConn, error) {
- addr := net.UDPAddr{
- Port: port,
- IP: address,
- }
- conn, err := net.ListenUDP("udp", &addr)
- if err != nil {
- return nil, errors.New("fail to start log listener server")
- }
-
- l.conn = conn
- return conn, nil
-}
-
-func (l *LogCollector) StreamLogs(logStream chan string) {
- // logStream := make(chan string)
-
- buf := make([]byte, 1024)
-
- rlan, remote, err := l.conn.ReadFrom(buf)
- if err != nil {
- fmt.Println("error listening to log tst")
- }
- fmt.Println(remote)
- for {
-
- logStream <- string(buf[:rlan])
- }
-
-}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..4d053b5
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,35 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+class-variance-authority@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522"
+ integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==
+ dependencies:
+ clsx "2.0.0"
+
+clsx@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b"
+ integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==
+
+clsx@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999"
+ integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
+
+lucide-react@^0.453.0:
+ version "0.453.0"
+ resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.453.0.tgz#d37909a45a29d89680383a202ee861224b05ba6a"
+ integrity sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==
+
+tailwind-merge@^2.5.4:
+ version "2.5.4"
+ resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.4.tgz#4bf574e81fa061adeceba099ae4df56edcee78d1"
+ integrity sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==
+
+tailwindcss-animate@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4"
+ integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==