]> git.feebdaed.xyz Git - 0xmirror/containerd.git/commitdiff
go.{mod,sum}: bump NRI deps to v0.11.0, re-vendor.
authorKrisztian Litkey <krisztian.litkey@intel.com>
Wed, 17 Dec 2025 13:25:33 +0000 (15:25 +0200)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Wed, 17 Dec 2025 13:26:02 +0000 (15:26 +0200)
Signed-off-by: Krisztian Litkey <krisztian.litkey@intel.com>
74 files changed:
go.mod
go.sum
vendor/github.com/containerd/nri/Makefile
vendor/github.com/containerd/nri/README.md
vendor/github.com/containerd/nri/pkg/adaptation/adaptation.go
vendor/github.com/containerd/nri/pkg/adaptation/api.go
vendor/github.com/containerd/nri/pkg/adaptation/plugin.go
vendor/github.com/containerd/nri/pkg/adaptation/result.go
vendor/github.com/containerd/nri/pkg/adaptation/wasm-disabled.go [new file with mode: 0644]
vendor/github.com/containerd/nri/pkg/adaptation/wasm-enabled.go [new file with mode: 0644]
vendor/github.com/containerd/nri/pkg/api/adjustment.go
vendor/github.com/containerd/nri/pkg/api/api.pb.go
vendor/github.com/containerd/nri/pkg/api/api.proto
vendor/github.com/containerd/nri/pkg/api/api_vtproto.pb.go
vendor/github.com/containerd/nri/pkg/api/linux-scheduler.go [new file with mode: 0644]
vendor/github.com/containerd/nri/pkg/api/net-device.go [new file with mode: 0644]
vendor/github.com/containerd/nri/pkg/api/optional.go
vendor/github.com/containerd/nri/pkg/api/owners.go
vendor/github.com/containerd/nri/pkg/api/resources.go
vendor/github.com/containerd/nri/pkg/api/strip.go
vendor/github.com/containerd/nri/pkg/api/update.go
vendor/github.com/containerd/nri/pkg/runtime-tools/generate/generate.go
vendor/github.com/containerd/nri/pkg/stub/stub.go
vendor/github.com/containerd/nri/plugins/default-validator/default-validator.go
vendor/github.com/tetratelabs/wazero/Makefile
vendor/github.com/tetratelabs/wazero/RATIONALE.md
vendor/github.com/tetratelabs/wazero/README.md
vendor/github.com/tetratelabs/wazero/experimental/compilationworkers.go [new file with mode: 0644]
vendor/github.com/tetratelabs/wazero/experimental/features.go
vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/compiler.go
vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go
vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/operations.go
vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/signature.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/compiler.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/instr.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/instr_encoding.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/machine.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/machine_pro_epi_logue.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr_encoding.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_instr.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_pro_epi_logue.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_relocation.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/engine.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/engine_cache.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/frontend/frontend.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/frontend/lower.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/module_engine.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/instructions.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/wazevoapi/debug_options.go
vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/wazevoapi/pool.go
vendor/github.com/tetratelabs/wazero/internal/expctxkeys/compilationworkers.go [new file with mode: 0644]
vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_amd64.go
vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_arm64.go
vendor/github.com/tetratelabs/wazero/internal/platform/cpuid_unsupported.go
vendor/github.com/tetratelabs/wazero/internal/platform/mmap_linux.go
vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go
vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unix.go
vendor/github.com/tetratelabs/wazero/internal/platform/mmap_unsupported.go
vendor/github.com/tetratelabs/wazero/internal/platform/mmap_windows.go
vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_bsd.go
vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_syscall.go
vendor/github.com/tetratelabs/wazero/internal/platform/mprotect_unsupported.go
vendor/github.com/tetratelabs/wazero/internal/platform/platform.go
vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go
vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go
vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go
vendor/github.com/tetratelabs/wazero/internal/wasm/func_validation.go
vendor/github.com/tetratelabs/wazero/internal/wasm/instruction.go
vendor/github.com/tetratelabs/wazero/internal/wasm/table.go
vendor/github.com/tetratelabs/wazero/sys/stat_linux.go
vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go
vendor/modules.txt

diff --git a/go.mod b/go.mod
index cda6f0150bb544355147d12de0040f4aa4a4a381..c52d560719f29170668d098ece09356a668ba3f7 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -21,7 +21,7 @@ require (
        github.com/containerd/go-runc v1.1.0
        github.com/containerd/imgcrypt/v2 v2.0.2
        github.com/containerd/log v0.1.0
-       github.com/containerd/nri v0.10.1-0.20251117084425-3827d9da021a
+       github.com/containerd/nri v0.11.0
        github.com/containerd/otelttrpc v0.1.0
        github.com/containerd/platforms v1.0.0-rc.2
        github.com/containerd/plugin v1.0.0
@@ -135,7 +135,7 @@ require (
        github.com/sasha-s/go-deadlock v0.3.5 // indirect
        github.com/smallstep/pkcs7 v0.1.1 // indirect
        github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 // indirect
-       github.com/tetratelabs/wazero v1.9.0 // indirect
+       github.com/tetratelabs/wazero v1.10.1 // indirect
        github.com/x448/float16 v0.8.4 // indirect
        github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
        go.opencensus.io v0.24.0 // indirect
diff --git a/go.sum b/go.sum
index c9f25d91cb50a67453b04d8a5c65de9e1831a8d0..ef1130e14fc695a07e41094e1002d47eccb0a8b4 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -59,8 +59,8 @@ github.com/containerd/imgcrypt/v2 v2.0.2 h1:WOEaE33CaSxzuRF8YLfAjHWuu1Xh27aPPQtq
 github.com/containerd/imgcrypt/v2 v2.0.2/go.mod h1:8r4JW1b83jkDhaioOUZ7idxIYp+Wn1k4E4KXwy2oSNI=
 github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I=
 github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo=
-github.com/containerd/nri v0.10.1-0.20251117084425-3827d9da021a h1:UTRRQZPhk3LromQOSSv1T638gVbmPyHvIWXbdSw4ato=
-github.com/containerd/nri v0.10.1-0.20251117084425-3827d9da021a/go.mod h1:E3g/ifmXr7HQxKSkc4RETsp4z5YjUe2AVqGPIAL1Y2E=
+github.com/containerd/nri v0.11.0 h1:26mcQwNG58AZn0YkOrlJQ0yxQVmyZooflnVWJTqQrqQ=
+github.com/containerd/nri v0.11.0/go.mod h1:bjGTLdUA58WgghKHg8azFMGXr05n1wDHrt3NSVBHiGI=
 github.com/containerd/otelttrpc v0.1.0 h1:UOX68eVTE8H/T45JveIg+I22Ev2aFj4qPITCmXsskjw=
 github.com/containerd/otelttrpc v0.1.0/go.mod h1:XhoA2VvaGPW1clB2ULwrBZfXVuEWuyOd2NUD1IM0yTg=
 github.com/containerd/platforms v1.0.0-rc.2 h1:0SPgaNZPVWGEi4grZdV8VRYQn78y+nm6acgLGv/QzE4=
@@ -331,8 +331,8 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu
 github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
 github.com/tchap/go-patricia/v2 v2.3.3 h1:xfNEsODumaEcCcY3gI0hYPZ/PcpVv5ju6RMAhgwZDDc=
 github.com/tchap/go-patricia/v2 v2.3.3/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k=
-github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I=
-github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM=
+github.com/tetratelabs/wazero v1.10.1 h1:2DugeJf6VVk58KTPszlNfeeN8AhhpwcZqkJj2wwFuH8=
+github.com/tetratelabs/wazero v1.10.1/go.mod h1:DRm5twOQ5Gr1AoEdSi0CLjDQF1J9ZAuyqFIjl1KKfQU=
 github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU=
 github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4=
 github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0=
index a7ce65c1c9276f71ab6afd2d4480cb3d5cfe1ff0..2cd90aa4598592d811bdc27347f567a01a546af8 100644 (file)
@@ -53,7 +53,8 @@ PLUGINS := \
        $(BIN_PATH)/template \
        $(BIN_PATH)/wasm \
        $(BIN_PATH)/network-device-injector \
-       $(BIN_PATH)/network-logger
+       $(BIN_PATH)/network-logger \
+       $(BIN_PATH)/rdt
 
 ifneq ($(V),1)
   Q := @
@@ -128,9 +129,9 @@ $(BIN_PATH)/wasm build/bin/wasm: FORCE
 # test targets
 #
 
-test-gopkgs: ginkgo-tests test-ulimits
+test-gopkgs: ginkgo-tests test-ulimits test-rdt
 
-SKIPPED_PKGS="ulimit-adjuster,device-injector"
+SKIPPED_PKGS="ulimit-adjuster,device-injector,rdt"
 
 ginkgo-tests:
        $(Q)$(GINKGO) run \
@@ -152,6 +153,9 @@ test-ulimits:
 test-device-injector:
        $(Q)cd ./plugins/device-injector && $(GO_TEST) -v
 
+test-rdt:
+       $(Q)cd ./plugins/rdt && $(GO_TEST) -v
+
 codecov: SHELL := $(shell which bash)
 codecov:
        bash <(curl -s https://codecov.io/bash) -f $(COVERAGE_PATH)/coverprofile
index c1c0dc71bdd80a8363f572771656886afa1d9184..5eb388f3aea46cfea382e1a673fd93a0c485d1a0 100644 (file)
@@ -209,6 +209,8 @@ The following pieces of container metadata are available to plugins in NRI:
       - RDT class
       - Unified cgroup v2 parameter map
     - Linux seccomp profile and policy
+    - Linux network devices
+    - scheduling policy parameters
   - container (init) process ID
   - container (init process) exit status
   - timestamp of container creation
@@ -257,7 +259,9 @@ container parameters:
       - RDT class
       - Unified cgroup v2 parameter map
       - Linux seccomp policy
+      - Linux network devices
     - Linux namespaces
+    - scheduling policy parameters
 
 ### Container Updates
 
@@ -420,6 +424,7 @@ The following sample plugins exist for NRI:
   - [ulimit adjuster](plugins/ulimit-adjuster)
   - [NRI v0.1.0 plugin adapter](plugins/v010-adapter)
   - [WebAssembly plugin](plugins/wasm)
+  - [RDT](plugins/rdt)
   - [template](plugins/template)
 
 Please see the documentation of these plugins for further details
@@ -450,6 +455,9 @@ the WebAssembly plugin is required, then the NRI provides a host function helper
 [`Log`](https://github.com/containerd/nri/blob/8ebdb076ea6aa524094a7f1c2c9ca31c30852328/plugins/wasm/plugin.go#L31-L36)
 for that.
 
+WebAssembly support is enabled by default. It can be disabled at compile
+time using the `nri_no_wasm` build tag.
+
 ## Security Considerations
 
 From a security perspective NRI plugins should be considered part of the
index 367c04e31bd2df00b642ba9fc388d31a8ca03a8c..54518e114dc994e1b68741e1d8385bde0c1d5bfa 100644 (file)
@@ -32,8 +32,6 @@ import (
        "github.com/containerd/nri/pkg/log"
        validator "github.com/containerd/nri/plugins/default-validator/builtin"
        "github.com/containerd/ttrpc"
-       "github.com/tetratelabs/wazero"
-       "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
 
        "google.golang.org/protobuf/proto"
 )
@@ -80,6 +78,9 @@ type Adaptation struct {
 var (
        // Used instead of nil Context in logging.
        noCtx = context.TODO()
+
+       // ErrWasmDisabled is returned for WASM initialization if WASM support is disabled.
+       ErrWasmDisabled = errors.New("WASM support is disabled (at build time)")
 )
 
 // Option to apply to the NRI runtime.
@@ -155,23 +156,12 @@ func New(name, version string, syncFn SyncFn, updateFn UpdateFn, opts ...Option)
                return nil, fmt.Errorf("failed to create NRI adaptation, nil UpdateFn")
        }
 
-       wasmWithCloseOnContextDone := func(ctx context.Context) (wazero.Runtime, error) {
-               var (
-                       cfg = wazero.NewRuntimeConfig().WithCloseOnContextDone(true)
-                       r   = wazero.NewRuntimeWithConfig(ctx, cfg)
-               )
-               if _, err := wasi_snapshot_preview1.Instantiate(ctx, r); err != nil {
+       wasmService, err := getWasmService()
+       if err != nil {
+               log.Errorf(noCtx, "failed to initialize WASM support: %v", err)
+               if !errors.Is(err, ErrWasmDisabled) {
                        return nil, err
                }
-               return r, nil
-       }
-
-       wasmPlugins, err := api.NewPluginPlugin(
-               context.Background(),
-               api.WazeroRuntime(wasmWithCloseOnContextDone),
-       )
-       if err != nil {
-               return nil, fmt.Errorf("unable to initialize WASM service: %w", err)
        }
 
        r := &Adaptation{
@@ -183,7 +173,7 @@ func New(name, version string, syncFn SyncFn, updateFn UpdateFn, opts ...Option)
                dropinPath:  DefaultPluginConfigPath,
                socketPath:  DefaultSocketPath,
                syncLock:    sync.RWMutex{},
-               wasmService: wasmPlugins,
+               wasmService: wasmService,
        }
 
        for _, o := range opts {
index 1ffd11eb4eeb5d59a7707131651bf6d7b682f4bd..d0df9d033315bcfe5595762448b8c1b73e3c8328 100644 (file)
@@ -92,6 +92,11 @@ type (
        LinuxDeviceCgroup        = api.LinuxDeviceCgroup
        LinuxIOPriority          = api.LinuxIOPriority
        LinuxSeccomp             = api.LinuxSeccomp
+       LinuxNetDevice           = api.LinuxNetDevice
+       LinuxScheduler           = api.LinuxScheduler
+       LinuxSchedulerPolicy     = api.LinuxSchedulerPolicy
+       LinuxSchedulerFlag       = api.LinuxSchedulerFlag
+       LinuxRdt                 = api.LinuxRdt
        CDIDevice                = api.CDIDevice
        HugepageLimit            = api.HugepageLimit
        Hooks                    = api.Hooks
@@ -152,14 +157,15 @@ type (
 
 // Aliased functions for api/optional.go.
 var (
-       String   = api.String
-       Int      = api.Int
-       Int32    = api.Int32
-       UInt32   = api.UInt32
-       Int64    = api.Int64
-       UInt64   = api.UInt64
-       Bool     = api.Bool
-       FileMode = api.FileMode
+       String         = api.String
+       RepeatedString = api.RepeatedString
+       Int            = api.Int
+       Int32          = api.Int32
+       UInt32         = api.UInt32
+       Int64          = api.Int64
+       UInt64         = api.UInt64
+       Bool           = api.Bool
+       FileMode       = api.FileMode
 )
 
 // Aliased functions for api/types.go.
index 80e5555bfb0a9332711d4cc27032fc913b6e77a3..50fbebfea93d4cb5ced638cf796d238de3bcf042 100644 (file)
@@ -104,6 +104,10 @@ func (r *Adaptation) newLaunchedPlugin(dir, idx, base, cfg string) (p *plugin, r
        fullPath := filepath.Join(dir, name)
 
        if isWasm(fullPath) {
+               if r.wasmService == nil {
+                       return nil, fmt.Errorf("can't load WASM plugin %s: no WASM support", fullPath)
+               }
+
                log.Infof(noCtx, "Found WASM plugin: %s", fullPath)
                wasm, err := r.wasmService.Load(context.Background(), fullPath, wasmHostFunctions{})
                if err != nil {
index 845a2ee42f98349236b30bed50d02093a392ad5b..34eec0dcd3d1d67353db155c6649a34f596a9dc9 100644 (file)
@@ -82,6 +82,9 @@ func collectCreateContainerResult(request *CreateContainerRequest) *result {
        if request.Container.Linux.Namespaces == nil {
                request.Container.Linux.Namespaces = []*LinuxNamespace{}
        }
+       if request.Container.Linux.NetDevices == nil {
+               request.Container.Linux.NetDevices = map[string]*LinuxNetDevice{}
+       }
 
        return &result{
                request: resultRequest{
@@ -104,6 +107,7 @@ func collectCreateContainerResult(request *CreateContainerRequest) *result {
                                                Unified:        map[string]string{},
                                        },
                                        Namespaces: []*LinuxNamespace{},
+                                       NetDevices: map[string]*LinuxNetDevice{},
                                },
                        },
                },
@@ -235,7 +239,20 @@ func (r *result) adjust(rpl *ContainerAdjustment, plugin string) error {
                if err := r.adjustNamespaces(rpl.Linux.Namespaces, plugin); err != nil {
                        return err
                }
+               if err := r.adjustSysctl(rpl.Linux.Sysctl, plugin); err != nil {
+                       return err
+               }
+               if err := r.adjustLinuxNetDevices(rpl.Linux.NetDevices, plugin); err != nil {
+                       return err
+               }
+               if err := r.adjustLinuxScheduler(rpl.Linux.Scheduler, plugin); err != nil {
+                       return err
+               }
+               if err := r.adjustRdt(rpl.Linux.Rdt, plugin); err != nil {
+                       return err
+               }
        }
+
        if err := r.adjustRlimits(rpl.Rlimits, plugin); err != nil {
                return err
        }
@@ -451,6 +468,83 @@ func (r *result) adjustNamespaces(namespaces []*LinuxNamespace, plugin string) e
        return nil
 }
 
+func (r *result) adjustSysctl(sysctl map[string]string, plugin string) error {
+       if len(sysctl) == 0 {
+               return nil
+       }
+
+       create, id := r.request.create, r.request.create.Container.Id
+       del := map[string]struct{}{}
+       for k := range sysctl {
+               if key, marked := IsMarkedForRemoval(k); marked {
+                       del[key] = struct{}{}
+                       delete(sysctl, k)
+               }
+       }
+
+       for k, v := range sysctl {
+               if _, ok := del[k]; ok {
+                       r.owners.ClearSysctl(id, k, plugin)
+                       delete(create.Container.Linux.Sysctl, k)
+                       r.reply.adjust.Linux.Sysctl[MarkForRemoval(k)] = ""
+               }
+               if err := r.owners.ClaimSysctl(id, k, plugin); err != nil {
+                       return err
+               }
+               create.Container.Linux.Sysctl[k] = v
+               r.reply.adjust.Linux.Sysctl[k] = v
+               delete(del, k)
+       }
+
+       for k := range del {
+               r.reply.adjust.Annotations[MarkForRemoval(k)] = ""
+       }
+
+       return nil
+}
+
+func (r *result) adjustRdt(rdt *LinuxRdt, plugin string) error {
+       if r == nil {
+               return nil
+       }
+
+       r.initAdjustRdt()
+
+       id := r.request.create.Container.Id
+
+       if rdt.GetRemove() {
+               r.owners.ClearRdt(id, plugin)
+               r.reply.adjust.Linux.Rdt = &LinuxRdt{
+                       // Propagate the remove request (if not overridden below).
+                       Remove: true,
+               }
+       }
+
+       if v := rdt.GetClosId(); v != nil {
+               if err := r.owners.ClaimRdtClosID(id, plugin); err != nil {
+                       return err
+               }
+               r.reply.adjust.Linux.Rdt.ClosId = String(v.GetValue())
+               r.reply.adjust.Linux.Rdt.Remove = false
+       }
+       if v := rdt.GetSchemata(); v != nil {
+               if err := r.owners.ClaimRdtSchemata(id, plugin); err != nil {
+                       return err
+               }
+               r.reply.adjust.Linux.Rdt.Schemata = RepeatedString(v.GetValue())
+               r.reply.adjust.Linux.Rdt.Remove = false
+       }
+       if v := rdt.GetEnableMonitoring(); v != nil {
+               if err := r.owners.ClaimRdtEnableMonitoring(id, plugin); err != nil {
+                       return err
+               }
+               r.reply.adjust.Linux.Rdt.EnableMonitoring = Bool(v.GetValue())
+               r.reply.adjust.Linux.Rdt.Remove = false
+       }
+
+       return nil
+}
+
 func (r *result) adjustCDIDevices(devices []*CDIDevice, plugin string) error {
        if len(devices) == 0 {
                return nil
@@ -909,6 +1003,23 @@ func (r *result) adjustSeccompPolicy(adjustment *LinuxSeccomp, plugin string) er
        return nil
 }
 
+func (r *result) adjustLinuxScheduler(sch *LinuxScheduler, plugin string) error {
+       if sch == nil {
+               return nil
+       }
+
+       create, id := r.request.create, r.request.create.Container.Id
+
+       if err := r.owners.ClaimLinuxScheduler(id, plugin); err != nil {
+               return err
+       }
+
+       create.Container.Linux.Scheduler = sch
+       r.reply.adjust.Linux.Scheduler = sch
+
+       return nil
+}
+
 func (r *result) adjustRlimits(rlimits []*POSIXRlimit, plugin string) error {
        create, id, adjust := r.request.create, r.request.create.Container.Id, r.reply.adjust
        for _, l := range rlimits {
@@ -922,6 +1033,41 @@ func (r *result) adjustRlimits(rlimits []*POSIXRlimit, plugin string) error {
        return nil
 }
 
+func (r *result) adjustLinuxNetDevices(devices map[string]*LinuxNetDevice, plugin string) error {
+       if len(devices) == 0 {
+               return nil
+       }
+
+       create, id := r.request.create, r.request.create.Container.Id
+       del := map[string]struct{}{}
+       for k := range devices {
+               if key, marked := IsMarkedForRemoval(k); marked {
+                       del[key] = struct{}{}
+                       delete(devices, k)
+               }
+       }
+
+       for k, v := range devices {
+               if _, ok := del[k]; ok {
+                       r.owners.ClearLinuxNetDevice(id, k, plugin)
+                       delete(create.Container.Linux.NetDevices, k)
+                       r.reply.adjust.Linux.NetDevices[MarkForRemoval(k)] = nil
+               }
+               if err := r.owners.ClaimLinuxNetDevice(id, k, plugin); err != nil {
+                       return err
+               }
+               create.Container.Linux.NetDevices[k] = v
+               r.reply.adjust.Linux.NetDevices[k] = v
+               delete(del, k)
+       }
+
+       for k := range del {
+               r.reply.adjust.Linux.NetDevices[MarkForRemoval(k)] = nil
+       }
+
+       return nil
+}
+
 func (r *result) updateResources(reply, u *ContainerUpdate, plugin string) error {
        if u.Linux == nil || u.Linux.Resources == nil {
                return nil
@@ -1031,3 +1177,23 @@ func (r *result) getContainerUpdate(u *ContainerUpdate, plugin string) (*Contain
 
        return update, nil
 }
+
+func (r *result) initAdjust() {
+       if r.reply.adjust == nil {
+               r.reply.adjust = &ContainerAdjustment{}
+       }
+}
+
+func (r *result) initAdjustLinux() {
+       r.initAdjust()
+       if r.reply.adjust.Linux == nil {
+               r.reply.adjust.Linux = &LinuxContainerAdjustment{}
+       }
+}
+
+func (r *result) initAdjustRdt() {
+       r.initAdjustLinux()
+       if r.reply.adjust.Linux.Rdt == nil {
+               r.reply.adjust.Linux.Rdt = &LinuxRdt{}
+       }
+}
diff --git a/vendor/github.com/containerd/nri/pkg/adaptation/wasm-disabled.go b/vendor/github.com/containerd/nri/pkg/adaptation/wasm-disabled.go
new file mode 100644 (file)
index 0000000..7779008
--- /dev/null
@@ -0,0 +1,27 @@
+//go:build nri_no_wasm
+
+/*
+   Copyright The containerd Authors.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+package adaptation
+
+import (
+       "github.com/containerd/nri/pkg/api"
+)
+
+func getWasmService() (*api.PluginPlugin, error) {
+       return nil, ErrWasmDisabled
+}
diff --git a/vendor/github.com/containerd/nri/pkg/adaptation/wasm-enabled.go b/vendor/github.com/containerd/nri/pkg/adaptation/wasm-enabled.go
new file mode 100644 (file)
index 0000000..ada58a3
--- /dev/null
@@ -0,0 +1,51 @@
+//go:build !nri_no_wasm
+
+/*
+   Copyright The containerd Authors.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+package adaptation
+
+import (
+       "context"
+       "fmt"
+
+       "github.com/containerd/nri/pkg/api"
+       "github.com/tetratelabs/wazero"
+       "github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1"
+)
+
+func getWasmService() (*api.PluginPlugin, error) {
+       wasmWithCloseOnContextDone := func(ctx context.Context) (wazero.Runtime, error) {
+               var (
+                       cfg = wazero.NewRuntimeConfig().WithCloseOnContextDone(true)
+                       r   = wazero.NewRuntimeWithConfig(ctx, cfg)
+               )
+               if _, err := wasi_snapshot_preview1.Instantiate(ctx, r); err != nil {
+                       return nil, err
+               }
+               return r, nil
+       }
+
+       wasmPlugins, err := api.NewPluginPlugin(
+               context.Background(),
+               api.WazeroRuntime(wasmWithCloseOnContextDone),
+       )
+       if err != nil {
+               return nil, fmt.Errorf("unable to initialize WASM service: %w", err)
+       }
+
+       return wasmPlugins, nil
+}
index 3dfdbaacd353f6e686cc06309ae5542cd58be288..fdde8d2c2e8627b66213ec03137f154b91c3af54 100644 (file)
@@ -162,6 +162,24 @@ func (a *ContainerAdjustment) RemoveNamespace(n *LinuxNamespace) {
        })
 }
 
+// AddLinuxNetDevice records the addition of the given network device to a container.
+func (a *ContainerAdjustment) AddLinuxNetDevice(hostDev string, d *LinuxNetDevice) {
+       if d == nil {
+               return
+       }
+       a.initLinuxNetDevices()
+       a.Linux.NetDevices[hostDev] = d
+}
+
+// RemoveLinuxNetDevice records the removal of a network device from a container.
+// Normally it is an error for a plugin to try and alter a network device
+// touched by another container. However, this is not an error if
+// the plugin removes that device prior to touching it.
+func (a *ContainerAdjustment) RemoveLinuxNetDevice(hostDev string) {
+       a.initLinuxNetDevices()
+       a.Linux.NetDevices[MarkForRemoval(hostDev)] = nil
+}
+
 // SetLinuxMemoryLimit records setting the memory limit for a container.
 func (a *ContainerAdjustment) SetLinuxMemoryLimit(value int64) {
        a.initLinuxResourcesMemory()
@@ -280,6 +298,30 @@ func (a *ContainerAdjustment) SetLinuxRDTClass(value string) {
        a.Linux.Resources.RdtClass = String(value)
 }
 
+// SetLinuxRDTClosID records setting the RDT CLOS id for a container.
+func (a *ContainerAdjustment) SetLinuxRDTClosID(value string) {
+       a.initLinuxRdt()
+       a.Linux.Rdt.ClosId = String(value)
+}
+
+// SetLinuxRDTSchemata records setting the RDT schemata for a container.
+func (a *ContainerAdjustment) SetLinuxRDTSchemata(value []string) {
+       a.initLinuxRdt()
+       a.Linux.Rdt.Schemata = RepeatedString(value)
+}
+
+// SetLinuxRDTEnableMonitoring records enabling RDT monitoring for a container.
+func (a *ContainerAdjustment) SetLinuxRDTEnableMonitoring(value bool) {
+       a.initLinuxRdt()
+       a.Linux.Rdt.EnableMonitoring = Bool(value)
+}
+
+// RemoveLinuxRDT records the removal of the RDT configuration.
+func (a *ContainerAdjustment) RemoveLinuxRDT() {
+       a.initLinuxRdt()
+       a.Linux.Rdt.Remove = true
+}
+
 // AddLinuxUnified sets a cgroupv2 unified resource.
 func (a *ContainerAdjustment) AddLinuxUnified(key, value string) {
        a.initLinuxResourcesUnified()
@@ -310,6 +352,21 @@ func (a *ContainerAdjustment) SetLinuxSeccompPolicy(seccomp *LinuxSeccomp) {
        a.Linux.SeccompPolicy = seccomp
 }
 
+// SetLinuxSysctl records setting a sysctl for a container.
+func (a *ContainerAdjustment) SetLinuxSysctl(key, value string) {
+       a.initLinux()
+       if a.Linux.Sysctl == nil {
+               a.Linux.Sysctl = make(map[string]string)
+       }
+       a.Linux.Sysctl[key] = value
+}
+
+// SetLinuxScheduler records setting the Linux scheduler attributes for a container.
+func (a *ContainerAdjustment) SetLinuxScheduler(sch *LinuxScheduler) {
+       a.initLinux()
+       a.Linux.Scheduler = sch
+}
+
 //
 // Initializing a container adjustment and container update.
 //
@@ -379,3 +436,17 @@ func (a *ContainerAdjustment) initLinuxResourcesUnified() {
                a.Linux.Resources.Unified = make(map[string]string)
        }
 }
+
+func (a *ContainerAdjustment) initLinuxNetDevices() {
+       a.initLinux()
+       if a.Linux.NetDevices == nil {
+               a.Linux.NetDevices = make(map[string]*LinuxNetDevice)
+       }
+}
+
+func (a *ContainerAdjustment) initLinuxRdt() {
+       a.initLinux()
+       if a.Linux.Rdt == nil {
+               a.Linux.Rdt = &LinuxRdt{}
+       }
+}
index d5df16e29d663bdd09e1e5cba7707f336ba70494..11e4904cc551e64a9c29ec2757ac281c2a4f092f 100644 (file)
@@ -232,6 +232,132 @@ func (IOPrioClass) EnumDescriptor() ([]byte, []int) {
        return file_pkg_api_api_proto_rawDescGZIP(), []int{2}
 }
 
+// Linux scheduling policies.
+type LinuxSchedulerPolicy int32
+
+const (
+       LinuxSchedulerPolicy_SCHED_NONE     LinuxSchedulerPolicy = 0
+       LinuxSchedulerPolicy_SCHED_OTHER    LinuxSchedulerPolicy = 1
+       LinuxSchedulerPolicy_SCHED_FIFO     LinuxSchedulerPolicy = 2
+       LinuxSchedulerPolicy_SCHED_RR       LinuxSchedulerPolicy = 3
+       LinuxSchedulerPolicy_SCHED_BATCH    LinuxSchedulerPolicy = 4
+       LinuxSchedulerPolicy_SCHED_ISO      LinuxSchedulerPolicy = 5
+       LinuxSchedulerPolicy_SCHED_IDLE     LinuxSchedulerPolicy = 6
+       LinuxSchedulerPolicy_SCHED_DEADLINE LinuxSchedulerPolicy = 7
+)
+
+// Enum value maps for LinuxSchedulerPolicy.
+var (
+       LinuxSchedulerPolicy_name = map[int32]string{
+               0: "SCHED_NONE",
+               1: "SCHED_OTHER",
+               2: "SCHED_FIFO",
+               3: "SCHED_RR",
+               4: "SCHED_BATCH",
+               5: "SCHED_ISO",
+               6: "SCHED_IDLE",
+               7: "SCHED_DEADLINE",
+       }
+       LinuxSchedulerPolicy_value = map[string]int32{
+               "SCHED_NONE":     0,
+               "SCHED_OTHER":    1,
+               "SCHED_FIFO":     2,
+               "SCHED_RR":       3,
+               "SCHED_BATCH":    4,
+               "SCHED_ISO":      5,
+               "SCHED_IDLE":     6,
+               "SCHED_DEADLINE": 7,
+       }
+)
+
+func (x LinuxSchedulerPolicy) Enum() *LinuxSchedulerPolicy {
+       p := new(LinuxSchedulerPolicy)
+       *p = x
+       return p
+}
+
+func (x LinuxSchedulerPolicy) String() string {
+       return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (LinuxSchedulerPolicy) Descriptor() protoreflect.EnumDescriptor {
+       return file_pkg_api_api_proto_enumTypes[3].Descriptor()
+}
+
+func (LinuxSchedulerPolicy) Type() protoreflect.EnumType {
+       return &file_pkg_api_api_proto_enumTypes[3]
+}
+
+func (x LinuxSchedulerPolicy) Number() protoreflect.EnumNumber {
+       return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use LinuxSchedulerPolicy.Descriptor instead.
+func (LinuxSchedulerPolicy) EnumDescriptor() ([]byte, []int) {
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{3}
+}
+
+type LinuxSchedulerFlag int32
+
+const (
+       LinuxSchedulerFlag_SCHED_FLAG_RESET_ON_FORK  LinuxSchedulerFlag = 0
+       LinuxSchedulerFlag_SCHED_FLAG_RECLAIM        LinuxSchedulerFlag = 1
+       LinuxSchedulerFlag_SCHED_FLAG_DL_OVERRUN     LinuxSchedulerFlag = 2
+       LinuxSchedulerFlag_SCHED_FLAG_KEEP_POLICY    LinuxSchedulerFlag = 3
+       LinuxSchedulerFlag_SCHED_FLAG_KEEP_PARAMS    LinuxSchedulerFlag = 4
+       LinuxSchedulerFlag_SCHED_FLAG_UTIL_CLAMP_MIN LinuxSchedulerFlag = 5
+       LinuxSchedulerFlag_SCHED_FLAG_UTIL_CLAMP_MAX LinuxSchedulerFlag = 6
+)
+
+// Enum value maps for LinuxSchedulerFlag.
+var (
+       LinuxSchedulerFlag_name = map[int32]string{
+               0: "SCHED_FLAG_RESET_ON_FORK",
+               1: "SCHED_FLAG_RECLAIM",
+               2: "SCHED_FLAG_DL_OVERRUN",
+               3: "SCHED_FLAG_KEEP_POLICY",
+               4: "SCHED_FLAG_KEEP_PARAMS",
+               5: "SCHED_FLAG_UTIL_CLAMP_MIN",
+               6: "SCHED_FLAG_UTIL_CLAMP_MAX",
+       }
+       LinuxSchedulerFlag_value = map[string]int32{
+               "SCHED_FLAG_RESET_ON_FORK":  0,
+               "SCHED_FLAG_RECLAIM":        1,
+               "SCHED_FLAG_DL_OVERRUN":     2,
+               "SCHED_FLAG_KEEP_POLICY":    3,
+               "SCHED_FLAG_KEEP_PARAMS":    4,
+               "SCHED_FLAG_UTIL_CLAMP_MIN": 5,
+               "SCHED_FLAG_UTIL_CLAMP_MAX": 6,
+       }
+)
+
+func (x LinuxSchedulerFlag) Enum() *LinuxSchedulerFlag {
+       p := new(LinuxSchedulerFlag)
+       *p = x
+       return p
+}
+
+func (x LinuxSchedulerFlag) String() string {
+       return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (LinuxSchedulerFlag) Descriptor() protoreflect.EnumDescriptor {
+       return file_pkg_api_api_proto_enumTypes[4].Descriptor()
+}
+
+func (LinuxSchedulerFlag) Type() protoreflect.EnumType {
+       return &file_pkg_api_api_proto_enumTypes[4]
+}
+
+func (x LinuxSchedulerFlag) Number() protoreflect.EnumNumber {
+       return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Use LinuxSchedulerFlag.Descriptor instead.
+func (LinuxSchedulerFlag) EnumDescriptor() ([]byte, []int) {
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{4}
+}
+
 // Field enumerates all fields that can be adjusted by plugins.
 type Field int32
 
@@ -270,6 +396,13 @@ const (
        Field_IoPriority          Field = 31
        Field_SeccompPolicy       Field = 32
        Field_Namespace           Field = 33
+       Field_Sysctl              Field = 34
+       Field_LinuxNetDevices     Field = 35
+       // protoc scoping rules: calling this LinuxScheduler would conflict with message.
+       Field_LinuxSched          Field = 36
+       Field_RdtClosID           Field = 37
+       Field_RdtSchemata         Field = 38
+       Field_RdtEnableMonitoring Field = 39
 )
 
 // Enum value maps for Field.
@@ -309,6 +442,12 @@ var (
                31: "IoPriority",
                32: "SeccompPolicy",
                33: "Namespace",
+               34: "Sysctl",
+               35: "LinuxNetDevices",
+               36: "LinuxSched",
+               37: "RdtClosID",
+               38: "RdtSchemata",
+               39: "RdtEnableMonitoring",
        }
        Field_value = map[string]int32{
                "None":                0,
@@ -345,6 +484,12 @@ var (
                "IoPriority":          31,
                "SeccompPolicy":       32,
                "Namespace":           33,
+               "Sysctl":              34,
+               "LinuxNetDevices":     35,
+               "LinuxSched":          36,
+               "RdtClosID":           37,
+               "RdtSchemata":         38,
+               "RdtEnableMonitoring": 39,
        }
 )
 
@@ -359,11 +504,11 @@ func (x Field) String() string {
 }
 
 func (Field) Descriptor() protoreflect.EnumDescriptor {
-       return file_pkg_api_api_proto_enumTypes[3].Descriptor()
+       return file_pkg_api_api_proto_enumTypes[5].Descriptor()
 }
 
 func (Field) Type() protoreflect.EnumType {
-       return &file_pkg_api_api_proto_enumTypes[3]
+       return &file_pkg_api_api_proto_enumTypes[5]
 }
 
 func (x Field) Number() protoreflect.EnumNumber {
@@ -372,7 +517,7 @@ func (x Field) Number() protoreflect.EnumNumber {
 
 // Deprecated: Use Field.Descriptor instead.
 func (Field) EnumDescriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{3}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{5}
 }
 
 type LogRequest_Level int32
@@ -414,11 +559,11 @@ func (x LogRequest_Level) String() string {
 }
 
 func (LogRequest_Level) Descriptor() protoreflect.EnumDescriptor {
-       return file_pkg_api_api_proto_enumTypes[4].Descriptor()
+       return file_pkg_api_api_proto_enumTypes[6].Descriptor()
 }
 
 func (LogRequest_Level) Type() protoreflect.EnumType {
-       return &file_pkg_api_api_proto_enumTypes[4]
+       return &file_pkg_api_api_proto_enumTypes[6]
 }
 
 func (x LogRequest_Level) Number() protoreflect.EnumNumber {
@@ -463,11 +608,11 @@ func (x SecurityProfile_ProfileType) String() string {
 }
 
 func (SecurityProfile_ProfileType) Descriptor() protoreflect.EnumDescriptor {
-       return file_pkg_api_api_proto_enumTypes[5].Descriptor()
+       return file_pkg_api_api_proto_enumTypes[7].Descriptor()
 }
 
 func (SecurityProfile_ProfileType) Type() protoreflect.EnumType {
-       return &file_pkg_api_api_proto_enumTypes[5]
+       return &file_pkg_api_api_proto_enumTypes[7]
 }
 
 func (x SecurityProfile_ProfileType) Number() protoreflect.EnumNumber {
@@ -2371,14 +2516,18 @@ type LinuxContainer struct {
        sizeCache     protoimpl.SizeCache
        unknownFields protoimpl.UnknownFields
 
-       Namespaces     []*LinuxNamespace `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"`
-       Devices        []*LinuxDevice    `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"`
-       Resources      *LinuxResources   `protobuf:"bytes,3,opt,name=resources,proto3" json:"resources,omitempty"`
-       OomScoreAdj    *OptionalInt      `protobuf:"bytes,4,opt,name=oom_score_adj,json=oomScoreAdj,proto3" json:"oom_score_adj,omitempty"`
-       CgroupsPath    string            `protobuf:"bytes,5,opt,name=cgroups_path,json=cgroupsPath,proto3" json:"cgroups_path,omitempty"`
-       IoPriority     *LinuxIOPriority  `protobuf:"bytes,6,opt,name=io_priority,json=ioPriority,proto3" json:"io_priority,omitempty"`
-       SeccompProfile *SecurityProfile  `protobuf:"bytes,7,opt,name=seccomp_profile,json=seccompProfile,proto3" json:"seccomp_profile,omitempty"`
-       SeccompPolicy  *LinuxSeccomp     `protobuf:"bytes,8,opt,name=seccomp_policy,json=seccompPolicy,proto3" json:"seccomp_policy,omitempty"`
+       Namespaces     []*LinuxNamespace          `protobuf:"bytes,1,rep,name=namespaces,proto3" json:"namespaces,omitempty"`
+       Devices        []*LinuxDevice             `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"`
+       Resources      *LinuxResources            `protobuf:"bytes,3,opt,name=resources,proto3" json:"resources,omitempty"`
+       OomScoreAdj    *OptionalInt               `protobuf:"bytes,4,opt,name=oom_score_adj,json=oomScoreAdj,proto3" json:"oom_score_adj,omitempty"`
+       CgroupsPath    string                     `protobuf:"bytes,5,opt,name=cgroups_path,json=cgroupsPath,proto3" json:"cgroups_path,omitempty"`
+       IoPriority     *LinuxIOPriority           `protobuf:"bytes,6,opt,name=io_priority,json=ioPriority,proto3" json:"io_priority,omitempty"`
+       SeccompProfile *SecurityProfile           `protobuf:"bytes,7,opt,name=seccomp_profile,json=seccompProfile,proto3" json:"seccomp_profile,omitempty"`
+       SeccompPolicy  *LinuxSeccomp              `protobuf:"bytes,8,opt,name=seccomp_policy,json=seccompPolicy,proto3" json:"seccomp_policy,omitempty"`
+       Sysctl         map[string]string          `protobuf:"bytes,9,rep,name=sysctl,proto3" json:"sysctl,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+       NetDevices     map[string]*LinuxNetDevice `protobuf:"bytes,10,rep,name=net_devices,json=netDevices,proto3" json:"net_devices,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+       Scheduler      *LinuxScheduler            `protobuf:"bytes,11,opt,name=scheduler,proto3" json:"scheduler,omitempty"`
+       Rdt            *LinuxRdt                  `protobuf:"bytes,12,opt,name=rdt,proto3" json:"rdt,omitempty"`
 }
 
 func (x *LinuxContainer) Reset() {
@@ -2469,6 +2618,34 @@ func (x *LinuxContainer) GetSeccompPolicy() *LinuxSeccomp {
        return nil
 }
 
+func (x *LinuxContainer) GetSysctl() map[string]string {
+       if x != nil {
+               return x.Sysctl
+       }
+       return nil
+}
+
+func (x *LinuxContainer) GetNetDevices() map[string]*LinuxNetDevice {
+       if x != nil {
+               return x.NetDevices
+       }
+       return nil
+}
+
+func (x *LinuxContainer) GetScheduler() *LinuxScheduler {
+       if x != nil {
+               return x.Scheduler
+       }
+       return nil
+}
+
+func (x *LinuxContainer) GetRdt() *LinuxRdt {
+       if x != nil {
+               return x.Rdt
+       }
+       return nil
+}
+
 // A linux namespace.
 type LinuxNamespace struct {
        state         protoimpl.MessageState
@@ -3398,6 +3575,150 @@ func (x *LinuxIOPriority) GetPriority() int32 {
        return 0
 }
 
+// A linux network device.
+type LinuxNetDevice struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+}
+
+func (x *LinuxNetDevice) Reset() {
+       *x = LinuxNetDevice{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_pkg_api_api_proto_msgTypes[41]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *LinuxNetDevice) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LinuxNetDevice) ProtoMessage() {}
+
+func (x *LinuxNetDevice) ProtoReflect() protoreflect.Message {
+       mi := &file_pkg_api_api_proto_msgTypes[41]
+       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 LinuxNetDevice.ProtoReflect.Descriptor instead.
+func (*LinuxNetDevice) Descriptor() ([]byte, []int) {
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *LinuxNetDevice) GetName() string {
+       if x != nil {
+               return x.Name
+       }
+       return ""
+}
+
+// Linux process scheduling attributes.
+type LinuxScheduler struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Policy   LinuxSchedulerPolicy `protobuf:"varint,1,opt,name=policy,proto3,enum=nri.pkg.api.v1alpha1.LinuxSchedulerPolicy" json:"policy,omitempty"`
+       Nice     int32                `protobuf:"varint,2,opt,name=nice,proto3" json:"nice,omitempty"`
+       Priority int32                `protobuf:"varint,3,opt,name=priority,proto3" json:"priority,omitempty"`
+       Flags    []LinuxSchedulerFlag `protobuf:"varint,4,rep,packed,name=flags,proto3,enum=nri.pkg.api.v1alpha1.LinuxSchedulerFlag" json:"flags,omitempty"`
+       Runtime  uint64               `protobuf:"varint,5,opt,name=runtime,proto3" json:"runtime,omitempty"`
+       Deadline uint64               `protobuf:"varint,6,opt,name=deadline,proto3" json:"deadline,omitempty"`
+       Period   uint64               `protobuf:"varint,7,opt,name=period,proto3" json:"period,omitempty"`
+}
+
+func (x *LinuxScheduler) Reset() {
+       *x = LinuxScheduler{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_pkg_api_api_proto_msgTypes[42]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *LinuxScheduler) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LinuxScheduler) ProtoMessage() {}
+
+func (x *LinuxScheduler) ProtoReflect() protoreflect.Message {
+       mi := &file_pkg_api_api_proto_msgTypes[42]
+       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 LinuxScheduler.ProtoReflect.Descriptor instead.
+func (*LinuxScheduler) Descriptor() ([]byte, []int) {
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{42}
+}
+
+func (x *LinuxScheduler) GetPolicy() LinuxSchedulerPolicy {
+       if x != nil {
+               return x.Policy
+       }
+       return LinuxSchedulerPolicy_SCHED_NONE
+}
+
+func (x *LinuxScheduler) GetNice() int32 {
+       if x != nil {
+               return x.Nice
+       }
+       return 0
+}
+
+func (x *LinuxScheduler) GetPriority() int32 {
+       if x != nil {
+               return x.Priority
+       }
+       return 0
+}
+
+func (x *LinuxScheduler) GetFlags() []LinuxSchedulerFlag {
+       if x != nil {
+               return x.Flags
+       }
+       return nil
+}
+
+func (x *LinuxScheduler) GetRuntime() uint64 {
+       if x != nil {
+               return x.Runtime
+       }
+       return 0
+}
+
+func (x *LinuxScheduler) GetDeadline() uint64 {
+       if x != nil {
+               return x.Deadline
+       }
+       return 0
+}
+
+func (x *LinuxScheduler) GetPeriod() uint64 {
+       if x != nil {
+               return x.Period
+       }
+       return 0
+}
+
 // Requested adjustments to a container being created.
 type ContainerAdjustment struct {
        state         protoimpl.MessageState
@@ -3417,7 +3738,7 @@ type ContainerAdjustment struct {
 func (x *ContainerAdjustment) Reset() {
        *x = ContainerAdjustment{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[41]
+               mi := &file_pkg_api_api_proto_msgTypes[43]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3430,7 +3751,7 @@ func (x *ContainerAdjustment) String() string {
 func (*ContainerAdjustment) ProtoMessage() {}
 
 func (x *ContainerAdjustment) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[41]
+       mi := &file_pkg_api_api_proto_msgTypes[43]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3443,7 +3764,7 @@ func (x *ContainerAdjustment) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ContainerAdjustment.ProtoReflect.Descriptor instead.
 func (*ContainerAdjustment) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{41}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{43}
 }
 
 func (x *ContainerAdjustment) GetAnnotations() map[string]string {
@@ -3508,19 +3829,23 @@ type LinuxContainerAdjustment struct {
        sizeCache     protoimpl.SizeCache
        unknownFields protoimpl.UnknownFields
 
-       Devices       []*LinuxDevice    `protobuf:"bytes,1,rep,name=devices,proto3" json:"devices,omitempty"`
-       Resources     *LinuxResources   `protobuf:"bytes,2,opt,name=resources,proto3" json:"resources,omitempty"`
-       CgroupsPath   string            `protobuf:"bytes,3,opt,name=cgroups_path,json=cgroupsPath,proto3" json:"cgroups_path,omitempty"`
-       OomScoreAdj   *OptionalInt      `protobuf:"bytes,4,opt,name=oom_score_adj,json=oomScoreAdj,proto3" json:"oom_score_adj,omitempty"`
-       IoPriority    *LinuxIOPriority  `protobuf:"bytes,5,opt,name=io_priority,json=ioPriority,proto3" json:"io_priority,omitempty"`
-       SeccompPolicy *LinuxSeccomp     `protobuf:"bytes,6,opt,name=seccomp_policy,json=seccompPolicy,proto3" json:"seccomp_policy,omitempty"`
-       Namespaces    []*LinuxNamespace `protobuf:"bytes,7,rep,name=namespaces,proto3" json:"namespaces,omitempty"`
+       Devices       []*LinuxDevice             `protobuf:"bytes,1,rep,name=devices,proto3" json:"devices,omitempty"`
+       Resources     *LinuxResources            `protobuf:"bytes,2,opt,name=resources,proto3" json:"resources,omitempty"`
+       CgroupsPath   string                     `protobuf:"bytes,3,opt,name=cgroups_path,json=cgroupsPath,proto3" json:"cgroups_path,omitempty"`
+       OomScoreAdj   *OptionalInt               `protobuf:"bytes,4,opt,name=oom_score_adj,json=oomScoreAdj,proto3" json:"oom_score_adj,omitempty"`
+       IoPriority    *LinuxIOPriority           `protobuf:"bytes,5,opt,name=io_priority,json=ioPriority,proto3" json:"io_priority,omitempty"`
+       SeccompPolicy *LinuxSeccomp              `protobuf:"bytes,6,opt,name=seccomp_policy,json=seccompPolicy,proto3" json:"seccomp_policy,omitempty"`
+       Namespaces    []*LinuxNamespace          `protobuf:"bytes,7,rep,name=namespaces,proto3" json:"namespaces,omitempty"`
+       Sysctl        map[string]string          `protobuf:"bytes,8,rep,name=sysctl,proto3" json:"sysctl,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+       NetDevices    map[string]*LinuxNetDevice `protobuf:"bytes,9,rep,name=net_devices,json=netDevices,proto3" json:"net_devices,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+       Scheduler     *LinuxScheduler            `protobuf:"bytes,10,opt,name=scheduler,proto3" json:"scheduler,omitempty"`
+       Rdt           *LinuxRdt                  `protobuf:"bytes,11,opt,name=rdt,proto3" json:"rdt,omitempty"`
 }
 
 func (x *LinuxContainerAdjustment) Reset() {
        *x = LinuxContainerAdjustment{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[42]
+               mi := &file_pkg_api_api_proto_msgTypes[44]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3533,7 +3858,7 @@ func (x *LinuxContainerAdjustment) String() string {
 func (*LinuxContainerAdjustment) ProtoMessage() {}
 
 func (x *LinuxContainerAdjustment) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[42]
+       mi := &file_pkg_api_api_proto_msgTypes[44]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3546,7 +3871,7 @@ func (x *LinuxContainerAdjustment) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LinuxContainerAdjustment.ProtoReflect.Descriptor instead.
 func (*LinuxContainerAdjustment) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{42}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{44}
 }
 
 func (x *LinuxContainerAdjustment) GetDevices() []*LinuxDevice {
@@ -3598,6 +3923,34 @@ func (x *LinuxContainerAdjustment) GetNamespaces() []*LinuxNamespace {
        return nil
 }
 
+func (x *LinuxContainerAdjustment) GetSysctl() map[string]string {
+       if x != nil {
+               return x.Sysctl
+       }
+       return nil
+}
+
+func (x *LinuxContainerAdjustment) GetNetDevices() map[string]*LinuxNetDevice {
+       if x != nil {
+               return x.NetDevices
+       }
+       return nil
+}
+
+func (x *LinuxContainerAdjustment) GetScheduler() *LinuxScheduler {
+       if x != nil {
+               return x.Scheduler
+       }
+       return nil
+}
+
+func (x *LinuxContainerAdjustment) GetRdt() *LinuxRdt {
+       if x != nil {
+               return x.Rdt
+       }
+       return nil
+}
+
 type LinuxSeccomp struct {
        state         protoimpl.MessageState
        sizeCache     protoimpl.SizeCache
@@ -3615,7 +3968,7 @@ type LinuxSeccomp struct {
 func (x *LinuxSeccomp) Reset() {
        *x = LinuxSeccomp{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[43]
+               mi := &file_pkg_api_api_proto_msgTypes[45]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3628,7 +3981,7 @@ func (x *LinuxSeccomp) String() string {
 func (*LinuxSeccomp) ProtoMessage() {}
 
 func (x *LinuxSeccomp) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[43]
+       mi := &file_pkg_api_api_proto_msgTypes[45]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3641,7 +3994,7 @@ func (x *LinuxSeccomp) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LinuxSeccomp.ProtoReflect.Descriptor instead.
 func (*LinuxSeccomp) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{43}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{45}
 }
 
 func (x *LinuxSeccomp) GetDefaultAction() string {
@@ -3707,7 +4060,7 @@ type LinuxSyscall struct {
 func (x *LinuxSyscall) Reset() {
        *x = LinuxSyscall{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[44]
+               mi := &file_pkg_api_api_proto_msgTypes[46]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3720,7 +4073,7 @@ func (x *LinuxSyscall) String() string {
 func (*LinuxSyscall) ProtoMessage() {}
 
 func (x *LinuxSyscall) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[44]
+       mi := &file_pkg_api_api_proto_msgTypes[46]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3733,7 +4086,7 @@ func (x *LinuxSyscall) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LinuxSyscall.ProtoReflect.Descriptor instead.
 func (*LinuxSyscall) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{44}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{46}
 }
 
 func (x *LinuxSyscall) GetNames() []string {
@@ -3778,7 +4131,7 @@ type LinuxSeccompArg struct {
 func (x *LinuxSeccompArg) Reset() {
        *x = LinuxSeccompArg{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[45]
+               mi := &file_pkg_api_api_proto_msgTypes[47]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3791,7 +4144,7 @@ func (x *LinuxSeccompArg) String() string {
 func (*LinuxSeccompArg) ProtoMessage() {}
 
 func (x *LinuxSeccompArg) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[45]
+       mi := &file_pkg_api_api_proto_msgTypes[47]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3804,7 +4157,7 @@ func (x *LinuxSeccompArg) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LinuxSeccompArg.ProtoReflect.Descriptor instead.
 func (*LinuxSeccompArg) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{45}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{47}
 }
 
 func (x *LinuxSeccompArg) GetIndex() uint32 {
@@ -3849,7 +4202,7 @@ type ContainerUpdate struct {
 func (x *ContainerUpdate) Reset() {
        *x = ContainerUpdate{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[46]
+               mi := &file_pkg_api_api_proto_msgTypes[48]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3862,7 +4215,7 @@ func (x *ContainerUpdate) String() string {
 func (*ContainerUpdate) ProtoMessage() {}
 
 func (x *ContainerUpdate) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[46]
+       mi := &file_pkg_api_api_proto_msgTypes[48]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3875,7 +4228,7 @@ func (x *ContainerUpdate) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ContainerUpdate.ProtoReflect.Descriptor instead.
 func (*ContainerUpdate) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{46}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{48}
 }
 
 func (x *ContainerUpdate) GetContainerId() string {
@@ -3911,7 +4264,7 @@ type LinuxContainerUpdate struct {
 func (x *LinuxContainerUpdate) Reset() {
        *x = LinuxContainerUpdate{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[47]
+               mi := &file_pkg_api_api_proto_msgTypes[49]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3924,7 +4277,7 @@ func (x *LinuxContainerUpdate) String() string {
 func (*LinuxContainerUpdate) ProtoMessage() {}
 
 func (x *LinuxContainerUpdate) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[47]
+       mi := &file_pkg_api_api_proto_msgTypes[49]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3937,7 +4290,7 @@ func (x *LinuxContainerUpdate) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LinuxContainerUpdate.ProtoReflect.Descriptor instead.
 func (*LinuxContainerUpdate) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{47}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{49}
 }
 
 func (x *LinuxContainerUpdate) GetResources() *LinuxResources {
@@ -3962,7 +4315,7 @@ type ContainerEviction struct {
 func (x *ContainerEviction) Reset() {
        *x = ContainerEviction{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[48]
+               mi := &file_pkg_api_api_proto_msgTypes[50]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -3975,7 +4328,7 @@ func (x *ContainerEviction) String() string {
 func (*ContainerEviction) ProtoMessage() {}
 
 func (x *ContainerEviction) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[48]
+       mi := &file_pkg_api_api_proto_msgTypes[50]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -3988,7 +4341,7 @@ func (x *ContainerEviction) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ContainerEviction.ProtoReflect.Descriptor instead.
 func (*ContainerEviction) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{48}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{50}
 }
 
 func (x *ContainerEviction) GetContainerId() string {
@@ -4005,6 +4358,78 @@ func (x *ContainerEviction) GetReason() string {
        return ""
 }
 
+type LinuxRdt struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       ClosId           *OptionalString         `protobuf:"bytes,1,opt,name=clos_id,json=closId,proto3" json:"clos_id,omitempty"`
+       Schemata         *OptionalRepeatedString `protobuf:"bytes,2,opt,name=schemata,proto3" json:"schemata,omitempty"`
+       EnableMonitoring *OptionalBool           `protobuf:"bytes,3,opt,name=enable_monitoring,json=enableMonitoring,proto3" json:"enable_monitoring,omitempty"`
+       // NRI specific field to mark the RDT config for removal.
+       Remove bool `protobuf:"varint,4,opt,name=remove,proto3" json:"remove,omitempty"`
+}
+
+func (x *LinuxRdt) Reset() {
+       *x = LinuxRdt{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_pkg_api_api_proto_msgTypes[51]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *LinuxRdt) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LinuxRdt) ProtoMessage() {}
+
+func (x *LinuxRdt) ProtoReflect() protoreflect.Message {
+       mi := &file_pkg_api_api_proto_msgTypes[51]
+       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 LinuxRdt.ProtoReflect.Descriptor instead.
+func (*LinuxRdt) Descriptor() ([]byte, []int) {
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{51}
+}
+
+func (x *LinuxRdt) GetClosId() *OptionalString {
+       if x != nil {
+               return x.ClosId
+       }
+       return nil
+}
+
+func (x *LinuxRdt) GetSchemata() *OptionalRepeatedString {
+       if x != nil {
+               return x.Schemata
+       }
+       return nil
+}
+
+func (x *LinuxRdt) GetEnableMonitoring() *OptionalBool {
+       if x != nil {
+               return x.EnableMonitoring
+       }
+       return nil
+}
+
+func (x *LinuxRdt) GetRemove() bool {
+       if x != nil {
+               return x.Remove
+       }
+       return false
+}
+
 // KeyValue represents an environment variable.
 type KeyValue struct {
        state         protoimpl.MessageState
@@ -4018,7 +4443,7 @@ type KeyValue struct {
 func (x *KeyValue) Reset() {
        *x = KeyValue{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[49]
+               mi := &file_pkg_api_api_proto_msgTypes[52]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4031,7 +4456,7 @@ func (x *KeyValue) String() string {
 func (*KeyValue) ProtoMessage() {}
 
 func (x *KeyValue) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[49]
+       mi := &file_pkg_api_api_proto_msgTypes[52]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4044,7 +4469,7 @@ func (x *KeyValue) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use KeyValue.ProtoReflect.Descriptor instead.
 func (*KeyValue) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{49}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{52}
 }
 
 func (x *KeyValue) GetKey() string {
@@ -4073,7 +4498,7 @@ type OptionalString struct {
 func (x *OptionalString) Reset() {
        *x = OptionalString{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[50]
+               mi := &file_pkg_api_api_proto_msgTypes[53]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4086,7 +4511,7 @@ func (x *OptionalString) String() string {
 func (*OptionalString) ProtoMessage() {}
 
 func (x *OptionalString) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[50]
+       mi := &file_pkg_api_api_proto_msgTypes[53]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4099,7 +4524,7 @@ func (x *OptionalString) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalString.ProtoReflect.Descriptor instead.
 func (*OptionalString) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{50}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{53}
 }
 
 func (x *OptionalString) GetValue() string {
@@ -4109,6 +4534,54 @@ func (x *OptionalString) GetValue() string {
        return ""
 }
 
+// An optional collection of strings.
+type OptionalRepeatedString struct {
+       state         protoimpl.MessageState
+       sizeCache     protoimpl.SizeCache
+       unknownFields protoimpl.UnknownFields
+
+       Value []string `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
+}
+
+func (x *OptionalRepeatedString) Reset() {
+       *x = OptionalRepeatedString{}
+       if protoimpl.UnsafeEnabled {
+               mi := &file_pkg_api_api_proto_msgTypes[54]
+               ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+               ms.StoreMessageInfo(mi)
+       }
+}
+
+func (x *OptionalRepeatedString) String() string {
+       return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OptionalRepeatedString) ProtoMessage() {}
+
+func (x *OptionalRepeatedString) ProtoReflect() protoreflect.Message {
+       mi := &file_pkg_api_api_proto_msgTypes[54]
+       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 OptionalRepeatedString.ProtoReflect.Descriptor instead.
+func (*OptionalRepeatedString) Descriptor() ([]byte, []int) {
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{54}
+}
+
+func (x *OptionalRepeatedString) GetValue() []string {
+       if x != nil {
+               return x.Value
+       }
+       return nil
+}
+
 // An optional signed integer value.
 type OptionalInt struct {
        state         protoimpl.MessageState
@@ -4121,7 +4594,7 @@ type OptionalInt struct {
 func (x *OptionalInt) Reset() {
        *x = OptionalInt{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[51]
+               mi := &file_pkg_api_api_proto_msgTypes[55]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4134,7 +4607,7 @@ func (x *OptionalInt) String() string {
 func (*OptionalInt) ProtoMessage() {}
 
 func (x *OptionalInt) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[51]
+       mi := &file_pkg_api_api_proto_msgTypes[55]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4147,7 +4620,7 @@ func (x *OptionalInt) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalInt.ProtoReflect.Descriptor instead.
 func (*OptionalInt) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{51}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{55}
 }
 
 func (x *OptionalInt) GetValue() int64 {
@@ -4169,7 +4642,7 @@ type OptionalInt32 struct {
 func (x *OptionalInt32) Reset() {
        *x = OptionalInt32{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[52]
+               mi := &file_pkg_api_api_proto_msgTypes[56]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4182,7 +4655,7 @@ func (x *OptionalInt32) String() string {
 func (*OptionalInt32) ProtoMessage() {}
 
 func (x *OptionalInt32) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[52]
+       mi := &file_pkg_api_api_proto_msgTypes[56]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4195,7 +4668,7 @@ func (x *OptionalInt32) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalInt32.ProtoReflect.Descriptor instead.
 func (*OptionalInt32) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{52}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{56}
 }
 
 func (x *OptionalInt32) GetValue() int32 {
@@ -4217,7 +4690,7 @@ type OptionalUInt32 struct {
 func (x *OptionalUInt32) Reset() {
        *x = OptionalUInt32{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[53]
+               mi := &file_pkg_api_api_proto_msgTypes[57]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4230,7 +4703,7 @@ func (x *OptionalUInt32) String() string {
 func (*OptionalUInt32) ProtoMessage() {}
 
 func (x *OptionalUInt32) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[53]
+       mi := &file_pkg_api_api_proto_msgTypes[57]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4243,7 +4716,7 @@ func (x *OptionalUInt32) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalUInt32.ProtoReflect.Descriptor instead.
 func (*OptionalUInt32) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{53}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{57}
 }
 
 func (x *OptionalUInt32) GetValue() uint32 {
@@ -4265,7 +4738,7 @@ type OptionalInt64 struct {
 func (x *OptionalInt64) Reset() {
        *x = OptionalInt64{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[54]
+               mi := &file_pkg_api_api_proto_msgTypes[58]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4278,7 +4751,7 @@ func (x *OptionalInt64) String() string {
 func (*OptionalInt64) ProtoMessage() {}
 
 func (x *OptionalInt64) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[54]
+       mi := &file_pkg_api_api_proto_msgTypes[58]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4291,7 +4764,7 @@ func (x *OptionalInt64) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalInt64.ProtoReflect.Descriptor instead.
 func (*OptionalInt64) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{54}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{58}
 }
 
 func (x *OptionalInt64) GetValue() int64 {
@@ -4313,7 +4786,7 @@ type OptionalUInt64 struct {
 func (x *OptionalUInt64) Reset() {
        *x = OptionalUInt64{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[55]
+               mi := &file_pkg_api_api_proto_msgTypes[59]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4326,7 +4799,7 @@ func (x *OptionalUInt64) String() string {
 func (*OptionalUInt64) ProtoMessage() {}
 
 func (x *OptionalUInt64) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[55]
+       mi := &file_pkg_api_api_proto_msgTypes[59]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4339,7 +4812,7 @@ func (x *OptionalUInt64) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalUInt64.ProtoReflect.Descriptor instead.
 func (*OptionalUInt64) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{55}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{59}
 }
 
 func (x *OptionalUInt64) GetValue() uint64 {
@@ -4361,7 +4834,7 @@ type OptionalBool struct {
 func (x *OptionalBool) Reset() {
        *x = OptionalBool{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[56]
+               mi := &file_pkg_api_api_proto_msgTypes[60]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4374,7 +4847,7 @@ func (x *OptionalBool) String() string {
 func (*OptionalBool) ProtoMessage() {}
 
 func (x *OptionalBool) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[56]
+       mi := &file_pkg_api_api_proto_msgTypes[60]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4387,7 +4860,7 @@ func (x *OptionalBool) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalBool.ProtoReflect.Descriptor instead.
 func (*OptionalBool) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{56}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{60}
 }
 
 func (x *OptionalBool) GetValue() bool {
@@ -4409,7 +4882,7 @@ type OptionalFileMode struct {
 func (x *OptionalFileMode) Reset() {
        *x = OptionalFileMode{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[57]
+               mi := &file_pkg_api_api_proto_msgTypes[61]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4422,7 +4895,7 @@ func (x *OptionalFileMode) String() string {
 func (*OptionalFileMode) ProtoMessage() {}
 
 func (x *OptionalFileMode) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[57]
+       mi := &file_pkg_api_api_proto_msgTypes[61]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4435,7 +4908,7 @@ func (x *OptionalFileMode) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OptionalFileMode.ProtoReflect.Descriptor instead.
 func (*OptionalFileMode) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{57}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{61}
 }
 
 func (x *OptionalFileMode) GetValue() uint32 {
@@ -4462,7 +4935,7 @@ type CompoundFieldOwners struct {
 func (x *CompoundFieldOwners) Reset() {
        *x = CompoundFieldOwners{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[58]
+               mi := &file_pkg_api_api_proto_msgTypes[62]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4475,7 +4948,7 @@ func (x *CompoundFieldOwners) String() string {
 func (*CompoundFieldOwners) ProtoMessage() {}
 
 func (x *CompoundFieldOwners) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[58]
+       mi := &file_pkg_api_api_proto_msgTypes[62]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4488,7 +4961,7 @@ func (x *CompoundFieldOwners) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CompoundFieldOwners.ProtoReflect.Descriptor instead.
 func (*CompoundFieldOwners) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{58}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{62}
 }
 
 func (x *CompoundFieldOwners) GetOwners() map[string]string {
@@ -4517,7 +4990,7 @@ type FieldOwners struct {
 func (x *FieldOwners) Reset() {
        *x = FieldOwners{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[59]
+               mi := &file_pkg_api_api_proto_msgTypes[63]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4530,7 +5003,7 @@ func (x *FieldOwners) String() string {
 func (*FieldOwners) ProtoMessage() {}
 
 func (x *FieldOwners) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[59]
+       mi := &file_pkg_api_api_proto_msgTypes[63]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4543,7 +5016,7 @@ func (x *FieldOwners) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use FieldOwners.ProtoReflect.Descriptor instead.
 func (*FieldOwners) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{59}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{63}
 }
 
 func (x *FieldOwners) GetSimple() map[int32]string {
@@ -4574,7 +5047,7 @@ type OwningPlugins struct {
 func (x *OwningPlugins) Reset() {
        *x = OwningPlugins{}
        if protoimpl.UnsafeEnabled {
-               mi := &file_pkg_api_api_proto_msgTypes[60]
+               mi := &file_pkg_api_api_proto_msgTypes[64]
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                ms.StoreMessageInfo(mi)
        }
@@ -4587,7 +5060,7 @@ func (x *OwningPlugins) String() string {
 func (*OwningPlugins) ProtoMessage() {}
 
 func (x *OwningPlugins) ProtoReflect() protoreflect.Message {
-       mi := &file_pkg_api_api_proto_msgTypes[60]
+       mi := &file_pkg_api_api_proto_msgTypes[64]
        if protoimpl.UnsafeEnabled && x != nil {
                ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
                if ms.LoadMessageInfo() == nil {
@@ -4600,7 +5073,7 @@ func (x *OwningPlugins) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use OwningPlugins.ProtoReflect.Descriptor instead.
 func (*OwningPlugins) Descriptor() ([]byte, []int) {
-       return file_pkg_api_api_proto_rawDescGZIP(), []int{60}
+       return file_pkg_api_api_proto_rawDescGZIP(), []int{64}
 }
 
 func (x *OwningPlugins) GetOwners() map[string]*FieldOwners {
@@ -4965,7 +5438,7 @@ var file_pkg_api_api_proto_rawDesc = []byte{
        0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67,
        0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70,
        0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f,
-       0x75, 0x74, 0x22, 0xa4, 0x04, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74,
+       0x75, 0x74, 0x22, 0xdb, 0x07, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74,
        0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
        0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
        0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
@@ -4999,441 +5472,566 @@ var file_pkg_api_api_proto_rawDesc = []byte{
        0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67,
        0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69,
        0x6e, 0x75, 0x78, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x63,
-       0x6f, 0x6d, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x38, 0x0a, 0x0e, 0x4c, 0x69, 0x6e,
-       0x75, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74,
-       0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12,
-       0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70,
-       0x61, 0x74, 0x68, 0x22, 0x96, 0x02, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x65, 0x76,
-       0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28,
-       0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
-       0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d,
-       0x61, 0x6a, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f,
-       0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
-       0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f,
-       0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x72, 0x69,
-       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-       0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f,
-       0x64, 0x65, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x03,
-       0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
-       0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-       0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52,
-       0x03, 0x75, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28,
-       0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e,
-       0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61,
-       0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x03, 0x67, 0x69, 0x64, 0x22, 0xcb, 0x01, 0x0a,
-       0x11, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x67, 0x72, 0x6f,
-       0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28,
-       0x08, 0x52, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65,
-       0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x05,
-       0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72,
-       0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-       0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34,
-       0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72,
-       0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67,
-       0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70,
-       0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x05, 0x6d, 0x69, 0x6e,
-       0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01,
-       0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x43, 0x44,
-       0x49, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18,
-       0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x04, 0x55,
-       0x73, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
-       0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01,
-       0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74,
-       0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d,
-       0x52, 0x0e, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x47, 0x69, 0x64, 0x73,
-       0x22, 0xda, 0x04, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
-       0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20,
-       0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70,
-       0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78,
-       0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x30,
-       0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x72,
-       0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-       0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x50, 0x55, 0x52, 0x03, 0x63, 0x70, 0x75,
-       0x12, 0x4c, 0x0a, 0x0f, 0x68, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x6d,
-       0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
+       0x6f, 0x6d, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x48, 0x0a, 0x06, 0x73, 0x79, 0x73,
+       0x63, 0x74, 0x6c, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
        0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-       0x2e, 0x48, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0e,
-       0x68, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x49,
-       0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6f, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18,
-       0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e,
-       0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74,
-       0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x62, 0x6c, 0x6f,
-       0x63, 0x6b, 0x69, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x64, 0x74,
-       0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e,
-       0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-       0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x72, 0x69,
-       0x6e, 0x67, 0x52, 0x08, 0x72, 0x64, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x4b, 0x0a, 0x07,
-       0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e,
-       0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
-       0x63, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79,
-       0x52, 0x07, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x07, 0x64, 0x65, 0x76,
-       0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6e, 0x72, 0x69,
-       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-       0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x67, 0x72,
-       0x6f, 0x75, 0x70, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x04,
-       0x70, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6e, 0x72, 0x69,
-       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-       0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x50, 0x69, 0x64, 0x73, 0x52, 0x04, 0x70, 0x69, 0x64,
-       0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72,
-       0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
-       0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
-       0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x04,
-       0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x39, 0x0a,
-       0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e,
-       0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-       0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36,
-       0x34, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x45, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65,
-       0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
-       0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74,
-       0x36, 0x34, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
-       0x37, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
-       0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74,
-       0x36, 0x34, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x12, 0x3b, 0x0a, 0x06, 0x6b, 0x65, 0x72, 0x6e,
-       0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
+       0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e,
+       0x53, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x79, 0x73,
+       0x63, 0x74, 0x6c, 0x12, 0x55, 0x0a, 0x0b, 0x6e, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63,
+       0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
        0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-       0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x06, 0x6b,
-       0x65, 0x72, 0x6e, 0x65, 0x6c, 0x12, 0x42, 0x0a, 0x0a, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f,
-       0x74, 0x63, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
-       0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-       0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x09,
-       0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x63, 0x70, 0x12, 0x44, 0x0a, 0x0a, 0x73, 0x77, 0x61,
-       0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
+       0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x4e,
+       0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a,
+       0x6e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x09, 0x73, 0x63,
+       0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
        0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e,
-       0x74, 0x36, 0x34, 0x52, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12,
-       0x50, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x6f, 0x6d, 0x5f, 0x6b,
-       0x69, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x72,
+       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75,
+       0x6c, 0x65, 0x72, 0x52, 0x09, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x30,
+       0x0a, 0x03, 0x72, 0x64, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x72,
        0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-       0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x6f, 0x6f, 0x6c, 0x52,
-       0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x6f, 0x6d, 0x4b, 0x69, 0x6c, 0x6c, 0x65,
-       0x72, 0x12, 0x47, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x5f, 0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63,
-       0x68, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
+       0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x52, 0x64, 0x74, 0x52, 0x03, 0x72, 0x64, 0x74,
+       0x1a, 0x39, 0x0a, 0x0b, 0x53, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+       0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+       0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+       0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x63, 0x0a, 0x0f, 0x4e,
+       0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
+       0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
+       0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+       0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4e, 0x65, 0x74, 0x44,
+       0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
+       0x22, 0x38, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
+       0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+       0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02,
+       0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x96, 0x02, 0x0a, 0x0b, 0x4c,
+       0x69, 0x6e, 0x75, 0x78, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61,
+       0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12,
+       0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79,
+       0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28,
+       0x03, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f,
+       0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x43,
+       0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28,
+       0x0b, 0x32, 0x26, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+       0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+       0x6c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4d,
+       0x6f, 0x64, 0x65, 0x12, 0x36, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
+       0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
+       0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+       0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x03, 0x67,
+       0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
        0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-       0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x0c, 0x75, 0x73,
-       0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x22, 0x88, 0x03, 0x0a, 0x08, 0x4c,
-       0x69, 0x6e, 0x75, 0x78, 0x43, 0x50, 0x55, 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65,
-       0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
-       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f,
-       0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x06, 0x73,
-       0x68, 0x61, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x18, 0x02,
+       0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x03,
+       0x67, 0x69, 0x64, 0x22, 0xcb, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x65, 0x76,
+       0x69, 0x63, 0x65, 0x43, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x6c,
+       0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x12,
+       0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74,
+       0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01,
+       0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
+       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+       0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x39,
+       0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
+       0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74,
+       0x36, 0x34, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x63,
+       0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73,
+       0x73, 0x22, 0x1f, 0x0a, 0x09, 0x43, 0x44, 0x49, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12,
+       0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
+       0x6d, 0x65, 0x22, 0x53, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69,
+       0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03,
+       0x67, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x27,
+       0x0a, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x69, 0x64,
+       0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f,
+       0x6e, 0x61, 0x6c, 0x47, 0x69, 0x64, 0x73, 0x22, 0xda, 0x04, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x75,
+       0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6d, 0x65,
+       0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69,
+       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+       0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x52, 0x06, 0x6d,
+       0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x30, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x02, 0x20, 0x01,
+       0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
+       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43,
+       0x50, 0x55, 0x52, 0x03, 0x63, 0x70, 0x75, 0x12, 0x4c, 0x0a, 0x0f, 0x68, 0x75, 0x67, 0x65, 0x70,
+       0x61, 0x67, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
+       0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
+       0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x48, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67, 0x65,
+       0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0e, 0x68, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67, 0x65, 0x4c,
+       0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6f,
+       0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e,
+       0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+       0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x72, 0x69,
+       0x6e, 0x67, 0x52, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73,
+       0x12, 0x41, 0x0a, 0x09, 0x72, 0x64, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20,
+       0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70,
+       0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+       0x6e, 0x61, 0x6c, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x72, 0x64, 0x74, 0x43, 0x6c,
+       0x61, 0x73, 0x73, 0x12, 0x4b, 0x0a, 0x07, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x06,
+       0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
+       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75,
+       0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x69, 0x66, 0x69,
+       0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64,
+       0x12, 0x41, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28,
+       0x0b, 0x32, 0x27, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+       0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x65,
+       0x76, 0x69, 0x63, 0x65, 0x43, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69,
+       0x63, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x04, 0x70, 0x69, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28,
+       0x0b, 0x32, 0x1f, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+       0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x50, 0x69,
+       0x64, 0x73, 0x52, 0x04, 0x70, 0x69, 0x64, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x66,
+       0x69, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
+       0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
+       0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+       0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x04, 0x0a, 0x0b, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4d, 0x65,
+       0x6d, 0x6f, 0x72, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20,
+       0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70,
+       0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+       0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12,
+       0x45, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02,
        0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
        0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69,
-       0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x05, 0x71, 0x75, 0x6f, 0x74, 0x61,
-       0x12, 0x3c, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
-       0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
+       0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x0b, 0x72, 0x65, 0x73, 0x65, 0x72,
+       0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x04, 0x73, 0x77, 0x61, 0x70, 0x18, 0x03,
+       0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
+       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69,
+       0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x04, 0x73, 0x77, 0x61, 0x70, 0x12,
+       0x3b, 0x0a, 0x06, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+       0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49,
+       0x6e, 0x74, 0x36, 0x34, 0x52, 0x06, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x12, 0x42, 0x0a, 0x0a,
+       0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x74, 0x63, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b,
+       0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
        0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
-       0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x4e,
-       0x0a, 0x10, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69,
-       0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
-       0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-       0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x0f, 0x72,
-       0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x4d,
-       0x0a, 0x0f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f,
-       0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
-       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f,
-       0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x0e, 0x72,
-       0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x12, 0x0a,
-       0x04, 0x63, 0x70, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x70, 0x75,
-       0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
-       0x04, 0x6d, 0x65, 0x6d, 0x73, 0x22, 0x42, 0x0a, 0x0d, 0x48, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67,
-       0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73,
-       0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53,
-       0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01,
-       0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xcf, 0x01, 0x0a, 0x0f, 0x53, 0x65,
-       0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x54, 0x0a,
-       0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
-       0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70,
-       0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72,
-       0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69,
-       0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54,
-       0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74,
-       0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61,
-       0x6c, 0x68, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x66, 0x22, 0x41, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66,
-       0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x54, 0x49,
-       0x4d, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a,
-       0x55, 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09,
-       0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x22, 0x49, 0x0a, 0x0b, 0x50,
-       0x4f, 0x53, 0x49, 0x58, 0x52, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79,
-       0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12,
-       0x0a, 0x04, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x61,
-       0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x66, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04,
-       0x52, 0x04, 0x73, 0x6f, 0x66, 0x74, 0x22, 0x21, 0x0a, 0x09, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x50,
-       0x69, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01,
-       0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x66, 0x0a, 0x0f, 0x4c, 0x69, 0x6e,
-       0x75, 0x78, 0x49, 0x4f, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x05,
-       0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6e, 0x72,
+       0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x09, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x63, 0x70,
+       0x12, 0x44, 0x0a, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x06,
+       0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
+       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69,
+       0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x0a, 0x73, 0x77, 0x61, 0x70,
+       0x70, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x50, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c,
+       0x65, 0x5f, 0x6f, 0x6f, 0x6d, 0x5f, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01,
+       0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
+       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+       0x61, 0x6c, 0x42, 0x6f, 0x6f, 0x6c, 0x52, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f,
+       0x6f, 0x6d, 0x4b, 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x5f,
+       0x68, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x22, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+       0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42,
+       0x6f, 0x6f, 0x6c, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68,
+       0x79, 0x22, 0x88, 0x03, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x50, 0x55, 0x12, 0x3c,
+       0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24,
+       0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61,
+       0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49,
+       0x6e, 0x74, 0x36, 0x34, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x05,
+       0x71, 0x75, 0x6f, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6e, 0x72,
        0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-       0x61, 0x31, 0x2e, 0x49, 0x4f, 0x50, 0x72, 0x69, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05,
-       0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74,
-       0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74,
-       0x79, 0x22, 0xa6, 0x04, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41,
-       0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x0b, 0x61, 0x6e, 0x6e,
-       0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a,
+       0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34,
+       0x52, 0x05, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x12, 0x3c, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x69, 0x6f,
+       0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
+       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f,
+       0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x52, 0x06, 0x70,
+       0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x4e, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d,
+       0x65, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x23, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+       0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49,
+       0x6e, 0x74, 0x36, 0x34, 0x52, 0x0f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x75,
+       0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d,
+       0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24,
        0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61,
-       0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41,
-       0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f,
-       0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74,
-       0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
-       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4d,
-       0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x03,
-       0x65, 0x6e, 0x76, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
+       0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49,
+       0x6e, 0x74, 0x36, 0x34, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x65,
+       0x72, 0x69, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x70, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01,
+       0x28, 0x09, 0x52, 0x04, 0x63, 0x70, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x6d, 0x73,
+       0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x6d, 0x73, 0x22, 0x42, 0x0a, 0x0d,
+       0x48, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x0a,
+       0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
+       0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69,
+       0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74,
+       0x22, 0xcf, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f,
+       0x66, 0x69, 0x6c, 0x65, 0x12, 0x54, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f,
+       0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x6e, 0x72, 0x69,
+       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+       0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,
+       0x65, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x70,
+       0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x6f,
+       0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x0c, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x66, 0x22,
+       0x41, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13,
+       0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c,
+       0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x4e, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x4e, 0x45,
+       0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x48, 0x4f, 0x53, 0x54,
+       0x10, 0x02, 0x22, 0x49, 0x0a, 0x0b, 0x50, 0x4f, 0x53, 0x49, 0x58, 0x52, 0x6c, 0x69, 0x6d, 0x69,
+       0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+       0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20,
+       0x01, 0x28, 0x04, 0x52, 0x04, 0x68, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6f, 0x66,
+       0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x6f, 0x66, 0x74, 0x22, 0x21, 0x0a,
+       0x09, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x50, 0x69, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69,
+       0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74,
+       0x22, 0x66, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x49, 0x4f, 0x50, 0x72, 0x69, 0x6f, 0x72,
+       0x69, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01,
+       0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
+       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x49, 0x4f, 0x50, 0x72, 0x69, 0x6f,
+       0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08,
+       0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08,
+       0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x24, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x75,
+       0x78, 0x4e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
+       0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x92,
+       0x02, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65,
+       0x72, 0x12, 0x42, 0x0a, 0x06, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
+       0x0e, 0x32, 0x2a, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e,
+       0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x63,
+       0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x06, 0x70,
+       0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20,
+       0x01, 0x28, 0x05, 0x52, 0x04, 0x6e, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69,
+       0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x72, 0x69,
+       0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x04,
+       0x20, 0x03, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
+       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75,
+       0x78, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x05,
+       0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65,
+       0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12,
+       0x1a, 0x0a, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28,
+       0x04, 0x52, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70,
+       0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x65, 0x72,
+       0x69, 0x6f, 0x64, 0x22, 0xa6, 0x04, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+       0x72, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x0b, 0x61,
+       0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
+       0x32, 0x3a, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
+       0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
+       0x72, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x6e, 0x6e, 0x6f,
+       0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x61, 0x6e,
+       0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x06, 0x6d, 0x6f, 0x75,
+       0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
        0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-       0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x31,
-       0x0a, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e,
-       0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
-       0x70, 0x68, 0x61, 0x31, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x05, 0x68, 0x6f, 0x6f, 0x6b,
-       0x73, 0x12, 0x44, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
-       0x32, 0x2e, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
-       0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e,
-       0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74,
-       0x52, 0x05, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x12, 0x3b, 0x0a, 0x07, 0x72, 0x6c, 0x69, 0x6d, 0x69,
-       0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
-       0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-       0x50, 0x4f, 0x53, 0x49, 0x58, 0x52, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x07, 0x72, 0x6c, 0x69,
-       0x6d, 0x69, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x43, 0x44, 0x49, 0x5f, 0x64, 0x65, 0x76, 0x69,
-       0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
+       0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x30,
+       0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x72,
+       0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+       0x61, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x03, 0x65, 0x6e, 0x76,
+       0x12, 0x31, 0x0a, 0x05, 0x68, 0x6f, 0x6f, 0x6b, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x1b, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+       0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x52, 0x05, 0x68, 0x6f,
+       0x6f, 0x6b, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x18, 0x06, 0x20, 0x01,
+       0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
+       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43,
+       0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65,
+       0x6e, 0x74, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x12, 0x3b, 0x0a, 0x07, 0x72, 0x6c, 0x69,
+       0x6d, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69,
+       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+       0x31, 0x2e, 0x50, 0x4f, 0x53, 0x49, 0x58, 0x52, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x07, 0x72,
+       0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x43, 0x44, 0x49, 0x5f, 0x64, 0x65,
+       0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6e, 0x72,
+       0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
+       0x61, 0x31, 0x2e, 0x43, 0x44, 0x49, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x43, 0x44,
+       0x49, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73,
+       0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x3e, 0x0a, 0x10,
+       0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+       0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b,
+       0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa9, 0x07, 0x0a,
+       0x18, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41,
+       0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x64, 0x65, 0x76,
+       0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69,
+       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
+       0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64,
+       0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+       0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
        0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-       0x2e, 0x43, 0x44, 0x49, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x43, 0x44, 0x49, 0x44,
-       0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x09,
-       0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x1a, 0x3e, 0x0a, 0x10, 0x41, 0x6e,
-       0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
-       0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
-       0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-       0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xde, 0x03, 0x0a, 0x18, 0x4c,
-       0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x6a,
-       0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63,
-       0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
-       0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-       0x4c, 0x69, 0x6e, 0x75, 0x78, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76,
-       0x69, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
-       0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
-       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c,
-       0x69, 0x6e, 0x75, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x09, 0x72,
-       0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x67, 0x72, 0x6f,
-       0x75, 0x70, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
-       0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a, 0x0d, 0x6f,
-       0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x6a, 0x18, 0x04, 0x20, 0x01,
-       0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
-       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-       0x61, 0x6c, 0x49, 0x6e, 0x74, 0x52, 0x0b, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x41,
-       0x64, 0x6a, 0x12, 0x46, 0x0a, 0x0b, 0x69, 0x6f, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74,
-       0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
-       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c,
-       0x69, 0x6e, 0x75, 0x78, 0x49, 0x4f, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x0a,
-       0x69, 0x6f, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x49, 0x0a, 0x0e, 0x73, 0x65,
-       0x63, 0x63, 0x6f, 0x6d, 0x70, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06, 0x20, 0x01,
-       0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
-       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53,
-       0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x50,
-       0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x44, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61,
-       0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
+       0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52,
+       0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x67,
+       0x72, 0x6f, 0x75, 0x70, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+       0x52, 0x0b, 0x63, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x45, 0x0a,
+       0x0d, 0x6f, 0x6f, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x64, 0x6a, 0x18, 0x04,
+       0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
+       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69,
+       0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x52, 0x0b, 0x6f, 0x6f, 0x6d, 0x53, 0x63, 0x6f, 0x72,
+       0x65, 0x41, 0x64, 0x6a, 0x12, 0x46, 0x0a, 0x0b, 0x69, 0x6f, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72,
+       0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
        0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
-       0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52,
-       0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0xce, 0x02, 0x0a, 0x0c,
-       0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e,
-       0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01,
-       0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x63, 0x74,
-       0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65,
-       0x72, 0x72, 0x6e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69,
-       0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
-       0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32,
-       0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x72, 0x72, 0x6e, 0x6f, 0x12, 0x24,
-       0x0a, 0x0d, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18,
-       0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74,
-       0x75, 0x72, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20,
-       0x03, 0x28, 0x09, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x69,
-       0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28,
-       0x09, 0x52, 0x0c, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x12,
-       0x2b, 0x0a, 0x11, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61,
-       0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x73, 0x74,
-       0x65, 0x6e, 0x65, 0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x08,
-       0x73, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22,
-       0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61,
-       0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x79, 0x73, 0x63, 0x61,
-       0x6c, 0x6c, 0x52, 0x08, 0x73, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0xba, 0x01, 0x0a,
-       0x0c, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a,
-       0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61,
-       0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
-       0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x09, 0x65,
-       0x72, 0x72, 0x6e, 0x6f, 0x5f, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24,
-       0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61,
-       0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49,
-       0x6e, 0x74, 0x33, 0x32, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x52, 0x65, 0x74, 0x12, 0x39,
-       0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e,
-       0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
-       0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70,
-       0x41, 0x72, 0x67, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x6a, 0x0a, 0x0f, 0x4c, 0x69, 0x6e,
-       0x75, 0x78, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x41, 0x72, 0x67, 0x12, 0x14, 0x0a, 0x05,
-       0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64,
-       0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
-       0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75,
-       0x65, 0x5f, 0x74, 0x77, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x76, 0x61, 0x6c,
-       0x75, 0x65, 0x54, 0x77, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28,
-       0x09, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x9d, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
-       0x6e, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e,
-       0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
-       0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x05,
-       0x6c, 0x69, 0x6e, 0x75, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6e, 0x72,
+       0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x49, 0x4f, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79,
+       0x52, 0x0a, 0x69, 0x6f, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x49, 0x0a, 0x0e,
+       0x73, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x06,
+       0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
+       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75,
+       0x78, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x63, 0x6f, 0x6d,
+       0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x44, 0x0a, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+       0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72,
        0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-       0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
-       0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x12, 0x25,
-       0x0a, 0x0e, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65,
-       0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x46, 0x61,
-       0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0x5a, 0x0a, 0x14, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f,
-       0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a,
-       0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
-       0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
-       0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x52, 0x65, 0x73,
-       0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
-       0x73, 0x22, 0x4e, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76,
-       0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
-       0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
-       0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61,
-       0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f,
-       0x6e, 0x22, 0x32, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a,
-       0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
-       0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
-       0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61,
-       0x6c, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-       0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a,
-       0x0b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
-       0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c,
-       0x75, 0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e,
-       0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,
-       0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x70, 0x74,
-       0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76,
-       0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
-       0x65, 0x22, 0x25, 0x0a, 0x0d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74,
-       0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
-       0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x70, 0x74, 0x69,
-       0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
-       0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-       0x22, 0x24, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x6f, 0x6f, 0x6c,
-       0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
-       0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x28, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
-       0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
-       0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-       0x22, 0x9f, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x69, 0x65,
-       0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x6f, 0x77, 0x6e, 0x65,
-       0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
-       0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
-       0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e,
-       0x65, 0x72, 0x73, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
-       0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4f, 0x77, 0x6e, 0x65, 0x72,
+       0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63,
+       0x65, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x52, 0x0a,
+       0x06, 0x73, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e,
+       0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+       0x6e, 0x65, 0x72, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x79,
+       0x73, 0x63, 0x74, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, 0x79, 0x73, 0x63, 0x74,
+       0x6c, 0x12, 0x5f, 0x0a, 0x0b, 0x6e, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73,
+       0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67,
+       0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69,
+       0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x6a, 0x75,
+       0x73, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
+       0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63,
+       0x65, 0x73, 0x12, 0x42, 0x0a, 0x09, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x18,
+       0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e,
+       0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e,
+       0x75, 0x78, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x52, 0x09, 0x73, 0x63, 0x68,
+       0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x03, 0x72, 0x64, 0x74, 0x18, 0x0b, 0x20,
+       0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70,
+       0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78,
+       0x52, 0x64, 0x74, 0x52, 0x03, 0x72, 0x64, 0x74, 0x1a, 0x39, 0x0a, 0x0b, 0x53, 0x79, 0x73, 0x63,
+       0x74, 0x6c, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
+       0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+       0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a,
+       0x02, 0x38, 0x01, 0x1a, 0x63, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
        0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
-       0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
-       0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
-       0x38, 0x01, 0x22, 0xc4, 0x02, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65,
-       0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03,
-       0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69,
-       0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f,
-       0x77, 0x6e, 0x65, 0x72, 0x73, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72,
-       0x79, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x08, 0x63, 0x6f, 0x6d,
-       0x70, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6e, 0x72,
+       0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+       0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
+       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c,
+       0x69, 0x6e, 0x75, 0x78, 0x4e, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x76,
+       0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xce, 0x02, 0x0a, 0x0c, 0x4c, 0x69, 0x6e,
+       0x75, 0x78, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x66,
+       0x61, 0x75, 0x6c, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
+       0x09, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+       0x12, 0x49, 0x0a, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x65, 0x72, 0x72, 0x6e,
+       0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
+       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f,
+       0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x52, 0x0c, 0x64,
+       0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x45, 0x72, 0x72, 0x6e, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x61,
+       0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03,
+       0x28, 0x09, 0x52, 0x0d, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65,
+       0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09,
+       0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x69, 0x73, 0x74, 0x65,
+       0x6e, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
+       0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x68, 0x12, 0x2b, 0x0a, 0x11,
+       0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
+       0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65,
+       0x72, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x08, 0x73, 0x79, 0x73,
+       0x63, 0x61, 0x6c, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6e, 0x72,
        0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-       0x61, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x2e, 0x43,
-       0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6f,
-       0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x39, 0x0a, 0x0b, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65,
-       0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
-       0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-       0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
-       0x01, 0x1a, 0x66, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74,
-       0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
-       0x03, 0x6b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
-       0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70,
-       0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f,
-       0x75, 0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x05,
-       0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x01, 0x0a, 0x0d, 0x4f, 0x77,
-       0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x6f,
-       0x77, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6e, 0x72,
+       0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x52,
+       0x08, 0x73, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x0c, 0x4c, 0x69,
+       0x6e, 0x75, 0x78, 0x53, 0x79, 0x73, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61,
+       0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73,
+       0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+       0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6e,
+       0x6f, 0x5f, 0x72, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e, 0x72,
        0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
-       0x61, 0x31, 0x2e, 0x4f, 0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73,
-       0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6f, 0x77,
-       0x6e, 0x65, 0x72, 0x73, 0x1a, 0x5c, 0x0a, 0x0b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e,
-       0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-       0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
-       0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
-       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c,
-       0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
-       0x38, 0x01, 0x2a, 0xf4, 0x02, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x0a, 0x07,
-       0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e,
-       0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x01, 0x12, 0x14,
-       0x0a, 0x10, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42,
-       0x4f, 0x58, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x50,
-       0x4f, 0x44, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10,
-       0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
-       0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54,
-       0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x05, 0x12, 0x13, 0x0a,
-       0x0f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
-       0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54,
-       0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x07, 0x12, 0x14, 0x0a, 0x10,
-       0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
-       0x10, 0x08, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54,
-       0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x09, 0x12, 0x12, 0x0a,
-       0x0e, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10,
-       0x0a, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54,
-       0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x50, 0x44, 0x41, 0x54,
-       0x45, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x0c, 0x12,
-       0x1b, 0x0a, 0x17, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x50,
-       0x4f, 0x44, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x0d, 0x12, 0x21, 0x0a, 0x1d,
-       0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e,
-       0x45, 0x52, 0x5f, 0x41, 0x44, 0x4a, 0x55, 0x53, 0x54, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x0e, 0x12,
-       0x08, 0x0a, 0x04, 0x4c, 0x41, 0x53, 0x54, 0x10, 0x0f, 0x2a, 0x82, 0x01, 0x0a, 0x0e, 0x43, 0x6f,
-       0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11,
-       0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57,
-       0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
-       0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f,
-       0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x55, 0x53, 0x45, 0x44, 0x10, 0x02,
-       0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x55,
-       0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x54, 0x41,
-       0x49, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x65,
-       0x0a, 0x0b, 0x49, 0x4f, 0x50, 0x72, 0x69, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x15, 0x0a,
-       0x11, 0x49, 0x4f, 0x50, 0x52, 0x49, 0x4f, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x4e, 0x4f,
-       0x4e, 0x45, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4f, 0x50, 0x52, 0x49, 0x4f, 0x5f, 0x43,
-       0x4c, 0x41, 0x53, 0x53, 0x5f, 0x52, 0x54, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4f, 0x50,
-       0x52, 0x49, 0x4f, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x42, 0x45, 0x10, 0x02, 0x12, 0x15,
-       0x0a, 0x11, 0x49, 0x4f, 0x50, 0x52, 0x49, 0x4f, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x49,
-       0x44, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0xb9, 0x04, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12,
-       0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x6e, 0x6e,
-       0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x6f,
-       0x75, 0x6e, 0x74, 0x73, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x63, 0x69, 0x48, 0x6f, 0x6f,
-       0x6b, 0x73, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x10,
-       0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x64, 0x69, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x10,
-       0x05, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x72,
-       0x67, 0x73, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x65, 0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74,
-       0x10, 0x08, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61,
-       0x74, 0x69, 0x6f, 0x6e, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x53, 0x77, 0x61,
-       0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0x0a, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x65, 0x6d, 0x4b,
-       0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0x0b, 0x12, 0x0f, 0x0a, 0x0b,
-       0x4d, 0x65, 0x6d, 0x54, 0x43, 0x50, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0x0c, 0x12, 0x11, 0x0a,
-       0x0d, 0x4d, 0x65, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x10, 0x0d,
-       0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x6d, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x6f,
-       0x6d, 0x4b, 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x10, 0x0e, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x65, 0x6d,
-       0x55, 0x73, 0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x10, 0x0f, 0x12, 0x0d,
-       0x0a, 0x09, 0x43, 0x50, 0x55, 0x53, 0x68, 0x61, 0x72, 0x65, 0x73, 0x10, 0x10, 0x12, 0x0c, 0x0a,
-       0x08, 0x43, 0x50, 0x55, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x10, 0x11, 0x12, 0x0d, 0x0a, 0x09, 0x43,
-       0x50, 0x55, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x10, 0x12, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x50,
-       0x55, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65,
-       0x10, 0x13, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x50, 0x55, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d,
-       0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x10, 0x14, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x50, 0x55,
-       0x53, 0x65, 0x74, 0x43, 0x50, 0x55, 0x73, 0x10, 0x15, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x50, 0x55,
-       0x53, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x73, 0x10, 0x16, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x69, 0x64,
-       0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0x17, 0x12, 0x12, 0x0a, 0x0e, 0x48, 0x75, 0x67, 0x65,
-       0x70, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x10, 0x18, 0x12, 0x10, 0x0a, 0x0c,
-       0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x10, 0x19, 0x12, 0x0c,
-       0x0a, 0x08, 0x52, 0x64, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x10, 0x1a, 0x12, 0x12, 0x0a, 0x0e,
-       0x43, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x10, 0x1b,
-       0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x50, 0x61, 0x74, 0x68, 0x10,
-       0x1c, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x6f, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x41, 0x64, 0x6a,
-       0x10, 0x1d, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x10, 0x1e, 0x12,
-       0x0e, 0x0a, 0x0a, 0x49, 0x6f, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x10, 0x1f, 0x12,
-       0x11, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
-       0x10, 0x20, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x10,
-       0x21, 0x32, 0xd8, 0x01, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x5a, 0x0a,
+       0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33,
+       0x32, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x52, 0x65, 0x74, 0x12, 0x39, 0x0a, 0x04, 0x61,
+       0x72, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6e, 0x72, 0x69, 0x2e,
+       0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31,
+       0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x41, 0x72, 0x67,
+       0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x22, 0x6a, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53,
+       0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x41, 0x72, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64,
+       0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12,
+       0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05,
+       0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74,
+       0x77, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54,
+       0x77, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
+       0x6f, 0x70, 0x22, 0x9d, 0x01, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+       0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+       0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
+       0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x05, 0x6c, 0x69, 0x6e,
+       0x75, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70,
+       0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e,
+       0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x55, 0x70,
+       0x64, 0x61, 0x74, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x12, 0x25, 0x0a, 0x0e, 0x69,
+       0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20,
+       0x01, 0x28, 0x08, 0x52, 0x0d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75,
+       0x72, 0x65, 0x22, 0x5a, 0x0a, 0x14, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61,
+       0x69, 0x6e, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65,
+       0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
+       0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c,
+       0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
+       0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4e,
+       0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x69, 0x63, 0x74,
+       0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
+       0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61,
+       0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e,
+       0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xfc,
+       0x01, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x52, 0x64, 0x74, 0x12, 0x3d, 0x0a, 0x07, 0x63,
+       0x6c, 0x6f, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6e,
+       0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+       0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x72, 0x69,
+       0x6e, 0x67, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x49, 0x64, 0x12, 0x48, 0x0a, 0x08, 0x73, 0x63,
+       0x68, 0x65, 0x6d, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6e,
+       0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
+       0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x65,
+       0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65,
+       0x6d, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d,
+       0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x22, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+       0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42,
+       0x6f, 0x6f, 0x6c, 0x52, 0x10, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74,
+       0x6f, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18,
+       0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0x32, 0x0a,
+       0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+       0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
+       0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+       0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x72,
+       0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,
+       0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x2e, 0x0a, 0x16, 0x4f, 0x70, 0x74,
+       0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x65, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72,
+       0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03,
+       0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x4f, 0x70, 0x74,
+       0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
+       0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25,
+       0x0a, 0x0d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12,
+       0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05,
+       0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+       0x6c, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+       0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x25, 0x0a,
+       0x0d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14,
+       0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76,
+       0x61, 0x6c, 0x75, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c,
+       0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+       0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x24, 0x0a, 0x0c,
+       0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x42, 0x6f, 0x6f, 0x6c, 0x12, 0x14, 0x0a, 0x05,
+       0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c,
+       0x75, 0x65, 0x22, 0x28, 0x0a, 0x10, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x46, 0x69,
+       0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
+       0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9f, 0x01, 0x0a,
+       0x13, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77,
+       0x6e, 0x65, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01,
+       0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61,
+       0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70,
+       0x6f, 0x75, 0x6e, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x2e,
+       0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6f, 0x77, 0x6e,
+       0x65, 0x72, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74,
+       0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+       0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
+       0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc4,
+       0x02, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x45,
+       0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d,
+       0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61,
+       0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72,
+       0x73, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73,
+       0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x4b, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e,
+       0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
+       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46,
+       0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f,
+       0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x75,
+       0x6e, 0x64, 0x1a, 0x39, 0x0a, 0x0b, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x6e, 0x74, 0x72,
+       0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03,
+       0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
+       0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x66, 0x0a,
+       0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
+       0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79,
+       0x12, 0x3f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+       0x29, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
+       0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x75, 0x6e, 0x64, 0x46,
+       0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+       0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x01, 0x0a, 0x0d, 0x4f, 0x77, 0x6e, 0x69, 0x6e, 0x67,
+       0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72,
+       0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b,
+       0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4f,
+       0x77, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x73, 0x2e, 0x4f, 0x77, 0x6e,
+       0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73,
+       0x1a, 0x5c, 0x0a, 0x0b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+       0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+       0x79, 0x12, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+       0x32, 0x21, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
+       0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4f, 0x77, 0x6e,
+       0x65, 0x72, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0xf4,
+       0x02, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e,
+       0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x50, 0x4f, 0x44,
+       0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54,
+       0x4f, 0x50, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02,
+       0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x53,
+       0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x52, 0x45, 0x41,
+       0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x04, 0x12, 0x19,
+       0x0a, 0x15, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f,
+       0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41,
+       0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x06, 0x12, 0x18,
+       0x0a, 0x14, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e,
+       0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x07, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x50, 0x44, 0x41,
+       0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x08, 0x12, 0x19,
+       0x0a, 0x15, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f,
+       0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x4f,
+       0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x0a, 0x12, 0x14, 0x0a,
+       0x10, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45,
+       0x52, 0x10, 0x0b, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x4f,
+       0x44, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x50,
+       0x4f, 0x53, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x4f, 0x44, 0x5f, 0x53,
+       0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x0d, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x41, 0x4c, 0x49,
+       0x44, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x41,
+       0x44, 0x4a, 0x55, 0x53, 0x54, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x0e, 0x12, 0x08, 0x0a, 0x04, 0x4c,
+       0x41, 0x53, 0x54, 0x10, 0x0f, 0x2a, 0x82, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
+       0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x54,
+       0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
+       0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x43, 0x52, 0x45,
+       0x41, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49,
+       0x4e, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x55, 0x53, 0x45, 0x44, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11,
+       0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e,
+       0x47, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52,
+       0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x65, 0x0a, 0x0b, 0x49, 0x4f,
+       0x50, 0x72, 0x69, 0x6f, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x4f, 0x50,
+       0x52, 0x49, 0x4f, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00,
+       0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4f, 0x50, 0x52, 0x49, 0x4f, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53,
+       0x5f, 0x52, 0x54, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4f, 0x50, 0x52, 0x49, 0x4f, 0x5f,
+       0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x42, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x4f,
+       0x50, 0x52, 0x49, 0x4f, 0x5f, 0x43, 0x4c, 0x41, 0x53, 0x53, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x10,
+       0x03, 0x2a, 0x99, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x63, 0x68, 0x65, 0x64,
+       0x75, 0x6c, 0x65, 0x72, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x43,
+       0x48, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x43,
+       0x48, 0x45, 0x44, 0x5f, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53,
+       0x43, 0x48, 0x45, 0x44, 0x5f, 0x46, 0x49, 0x46, 0x4f, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x53,
+       0x43, 0x48, 0x45, 0x44, 0x5f, 0x52, 0x52, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x43, 0x48,
+       0x45, 0x44, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x43,
+       0x48, 0x45, 0x44, 0x5f, 0x49, 0x53, 0x4f, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x43, 0x48,
+       0x45, 0x44, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x43, 0x48,
+       0x45, 0x44, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x07, 0x2a, 0xdb, 0x01,
+       0x0a, 0x12, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72,
+       0x46, 0x6c, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x46, 0x4c,
+       0x41, 0x47, 0x5f, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4f, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x4b,
+       0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47,
+       0x5f, 0x52, 0x45, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x43,
+       0x48, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x5f, 0x44, 0x4c, 0x5f, 0x4f, 0x56, 0x45, 0x52,
+       0x52, 0x55, 0x4e, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x46,
+       0x4c, 0x41, 0x47, 0x5f, 0x4b, 0x45, 0x45, 0x50, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x10,
+       0x03, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x5f,
+       0x4b, 0x45, 0x45, 0x50, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x04, 0x12, 0x1d, 0x0a,
+       0x19, 0x53, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x5f, 0x55, 0x54, 0x49, 0x4c,
+       0x5f, 0x43, 0x4c, 0x41, 0x4d, 0x50, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x05, 0x12, 0x1d, 0x0a, 0x19,
+       0x53, 0x43, 0x48, 0x45, 0x44, 0x5f, 0x46, 0x4c, 0x41, 0x47, 0x5f, 0x55, 0x54, 0x49, 0x4c, 0x5f,
+       0x43, 0x4c, 0x41, 0x4d, 0x50, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x06, 0x2a, 0xa3, 0x05, 0x0a, 0x05,
+       0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12,
+       0x0f, 0x0a, 0x0b, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x10, 0x01,
+       0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08,
+       0x4f, 0x63, 0x69, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65,
+       0x76, 0x69, 0x63, 0x65, 0x73, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x64, 0x69, 0x44, 0x65,
+       0x76, 0x69, 0x63, 0x65, 0x73, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x6e, 0x76, 0x10, 0x06,
+       0x12, 0x08, 0x0a, 0x04, 0x41, 0x72, 0x67, 0x73, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x65,
+       0x6d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0x08, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x65, 0x6d, 0x52,
+       0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c,
+       0x4d, 0x65, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0x0a, 0x12, 0x12,
+       0x0a, 0x0e, 0x4d, 0x65, 0x6d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x69, 0x6d, 0x69, 0x74,
+       0x10, 0x0b, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x54, 0x43, 0x50, 0x4c, 0x69, 0x6d, 0x69,
+       0x74, 0x10, 0x0c, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x65, 0x6d, 0x53, 0x77, 0x61, 0x70, 0x70, 0x69,
+       0x6e, 0x65, 0x73, 0x73, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x65, 0x6d, 0x44, 0x69, 0x73,
+       0x61, 0x62, 0x6c, 0x65, 0x4f, 0x6f, 0x6d, 0x4b, 0x69, 0x6c, 0x6c, 0x65, 0x72, 0x10, 0x0e, 0x12,
+       0x13, 0x0a, 0x0f, 0x4d, 0x65, 0x6d, 0x55, 0x73, 0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63,
+       0x68, 0x79, 0x10, 0x0f, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x50, 0x55, 0x53, 0x68, 0x61, 0x72, 0x65,
+       0x73, 0x10, 0x10, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x50, 0x55, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x10,
+       0x11, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x50, 0x55, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x10, 0x12,
+       0x12, 0x16, 0x0a, 0x12, 0x43, 0x50, 0x55, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x52,
+       0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x10, 0x13, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x50, 0x55, 0x52,
+       0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x10, 0x14, 0x12,
+       0x0e, 0x0a, 0x0a, 0x43, 0x50, 0x55, 0x53, 0x65, 0x74, 0x43, 0x50, 0x55, 0x73, 0x10, 0x15, 0x12,
+       0x0e, 0x0a, 0x0a, 0x43, 0x50, 0x55, 0x53, 0x65, 0x74, 0x4d, 0x65, 0x6d, 0x73, 0x10, 0x16, 0x12,
+       0x0d, 0x0a, 0x09, 0x50, 0x69, 0x64, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x10, 0x17, 0x12, 0x12,
+       0x0a, 0x0e, 0x48, 0x75, 0x67, 0x65, 0x70, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73,
+       0x10, 0x18, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6f, 0x43, 0x6c, 0x61,
+       0x73, 0x73, 0x10, 0x19, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x64, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73,
+       0x10, 0x1a, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x55, 0x6e, 0x69,
+       0x66, 0x69, 0x65, 0x64, 0x10, 0x1b, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x67, 0x72, 0x6f, 0x75, 0x70,
+       0x73, 0x50, 0x61, 0x74, 0x68, 0x10, 0x1c, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x6f, 0x6d, 0x53, 0x63,
+       0x6f, 0x72, 0x65, 0x41, 0x64, 0x6a, 0x10, 0x1d, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x6c, 0x69, 0x6d,
+       0x69, 0x74, 0x73, 0x10, 0x1e, 0x12, 0x0e, 0x0a, 0x0a, 0x49, 0x6f, 0x50, 0x72, 0x69, 0x6f, 0x72,
+       0x69, 0x74, 0x79, 0x10, 0x1f, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x63, 0x6f, 0x6d, 0x70,
+       0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x10, 0x20, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65,
+       0x73, 0x70, 0x61, 0x63, 0x65, 0x10, 0x21, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x79, 0x73, 0x63, 0x74,
+       0x6c, 0x10, 0x22, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x75, 0x78, 0x4e, 0x65, 0x74, 0x44,
+       0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x10, 0x23, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x69, 0x6e, 0x75,
+       0x78, 0x53, 0x63, 0x68, 0x65, 0x64, 0x10, 0x24, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x64, 0x74, 0x43,
+       0x6c, 0x6f, 0x73, 0x49, 0x44, 0x10, 0x25, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x64, 0x74, 0x53, 0x63,
+       0x68, 0x65, 0x6d, 0x61, 0x74, 0x61, 0x10, 0x26, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x64, 0x74, 0x45,
+       0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x10,
+       0x27, 0x32, 0xd8, 0x01, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x5a, 0x0a,
        0x0e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12,
        0x2b, 0x2e, 0x6e, 0x72, 0x69, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31,
        0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50,
@@ -5529,232 +6127,257 @@ func file_pkg_api_api_proto_rawDescGZIP() []byte {
        return file_pkg_api_api_proto_rawDescData
 }
 
-var file_pkg_api_api_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
-var file_pkg_api_api_proto_msgTypes = make([]protoimpl.MessageInfo, 71)
+var file_pkg_api_api_proto_enumTypes = make([]protoimpl.EnumInfo, 8)
+var file_pkg_api_api_proto_msgTypes = make([]protoimpl.MessageInfo, 79)
 var file_pkg_api_api_proto_goTypes = []interface{}{
        (Event)(0),                                  // 0: nri.pkg.api.v1alpha1.Event
        (ContainerState)(0),                         // 1: nri.pkg.api.v1alpha1.ContainerState
        (IOPrioClass)(0),                            // 2: nri.pkg.api.v1alpha1.IOPrioClass
-       (Field)(0),                                  // 3: nri.pkg.api.v1alpha1.Field
-       (LogRequest_Level)(0),                       // 4: nri.pkg.api.v1alpha1.LogRequest.Level
-       (SecurityProfile_ProfileType)(0),            // 5: nri.pkg.api.v1alpha1.SecurityProfile.ProfileType
-       (*RegisterPluginRequest)(nil),               // 6: nri.pkg.api.v1alpha1.RegisterPluginRequest
-       (*UpdateContainersRequest)(nil),             // 7: nri.pkg.api.v1alpha1.UpdateContainersRequest
-       (*UpdateContainersResponse)(nil),            // 8: nri.pkg.api.v1alpha1.UpdateContainersResponse
-       (*LogRequest)(nil),                          // 9: nri.pkg.api.v1alpha1.LogRequest
-       (*ConfigureRequest)(nil),                    // 10: nri.pkg.api.v1alpha1.ConfigureRequest
-       (*ConfigureResponse)(nil),                   // 11: nri.pkg.api.v1alpha1.ConfigureResponse
-       (*SynchronizeRequest)(nil),                  // 12: nri.pkg.api.v1alpha1.SynchronizeRequest
-       (*SynchronizeResponse)(nil),                 // 13: nri.pkg.api.v1alpha1.SynchronizeResponse
-       (*CreateContainerRequest)(nil),              // 14: nri.pkg.api.v1alpha1.CreateContainerRequest
-       (*CreateContainerResponse)(nil),             // 15: nri.pkg.api.v1alpha1.CreateContainerResponse
-       (*UpdateContainerRequest)(nil),              // 16: nri.pkg.api.v1alpha1.UpdateContainerRequest
-       (*UpdateContainerResponse)(nil),             // 17: nri.pkg.api.v1alpha1.UpdateContainerResponse
-       (*StopContainerRequest)(nil),                // 18: nri.pkg.api.v1alpha1.StopContainerRequest
-       (*StopContainerResponse)(nil),               // 19: nri.pkg.api.v1alpha1.StopContainerResponse
-       (*UpdatePodSandboxRequest)(nil),             // 20: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest
-       (*UpdatePodSandboxResponse)(nil),            // 21: nri.pkg.api.v1alpha1.UpdatePodSandboxResponse
-       (*StateChangeEvent)(nil),                    // 22: nri.pkg.api.v1alpha1.StateChangeEvent
-       (*ValidateContainerAdjustmentRequest)(nil),  // 23: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest
-       (*PluginInstance)(nil),                      // 24: nri.pkg.api.v1alpha1.PluginInstance
-       (*ValidateContainerAdjustmentResponse)(nil), // 25: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentResponse
-       (*Empty)(nil),                               // 26: nri.pkg.api.v1alpha1.Empty
-       (*PodSandbox)(nil),                          // 27: nri.pkg.api.v1alpha1.PodSandbox
-       (*LinuxPodSandbox)(nil),                     // 28: nri.pkg.api.v1alpha1.LinuxPodSandbox
-       (*Container)(nil),                           // 29: nri.pkg.api.v1alpha1.Container
-       (*Mount)(nil),                               // 30: nri.pkg.api.v1alpha1.Mount
-       (*Hooks)(nil),                               // 31: nri.pkg.api.v1alpha1.Hooks
-       (*Hook)(nil),                                // 32: nri.pkg.api.v1alpha1.Hook
-       (*LinuxContainer)(nil),                      // 33: nri.pkg.api.v1alpha1.LinuxContainer
-       (*LinuxNamespace)(nil),                      // 34: nri.pkg.api.v1alpha1.LinuxNamespace
-       (*LinuxDevice)(nil),                         // 35: nri.pkg.api.v1alpha1.LinuxDevice
-       (*LinuxDeviceCgroup)(nil),                   // 36: nri.pkg.api.v1alpha1.LinuxDeviceCgroup
-       (*CDIDevice)(nil),                           // 37: nri.pkg.api.v1alpha1.CDIDevice
-       (*User)(nil),                                // 38: nri.pkg.api.v1alpha1.User
-       (*LinuxResources)(nil),                      // 39: nri.pkg.api.v1alpha1.LinuxResources
-       (*LinuxMemory)(nil),                         // 40: nri.pkg.api.v1alpha1.LinuxMemory
-       (*LinuxCPU)(nil),                            // 41: nri.pkg.api.v1alpha1.LinuxCPU
-       (*HugepageLimit)(nil),                       // 42: nri.pkg.api.v1alpha1.HugepageLimit
-       (*SecurityProfile)(nil),                     // 43: nri.pkg.api.v1alpha1.SecurityProfile
-       (*POSIXRlimit)(nil),                         // 44: nri.pkg.api.v1alpha1.POSIXRlimit
-       (*LinuxPids)(nil),                           // 45: nri.pkg.api.v1alpha1.LinuxPids
-       (*LinuxIOPriority)(nil),                     // 46: nri.pkg.api.v1alpha1.LinuxIOPriority
-       (*ContainerAdjustment)(nil),                 // 47: nri.pkg.api.v1alpha1.ContainerAdjustment
-       (*LinuxContainerAdjustment)(nil),            // 48: nri.pkg.api.v1alpha1.LinuxContainerAdjustment
-       (*LinuxSeccomp)(nil),                        // 49: nri.pkg.api.v1alpha1.LinuxSeccomp
-       (*LinuxSyscall)(nil),                        // 50: nri.pkg.api.v1alpha1.LinuxSyscall
-       (*LinuxSeccompArg)(nil),                     // 51: nri.pkg.api.v1alpha1.LinuxSeccompArg
-       (*ContainerUpdate)(nil),                     // 52: nri.pkg.api.v1alpha1.ContainerUpdate
-       (*LinuxContainerUpdate)(nil),                // 53: nri.pkg.api.v1alpha1.LinuxContainerUpdate
-       (*ContainerEviction)(nil),                   // 54: nri.pkg.api.v1alpha1.ContainerEviction
-       (*KeyValue)(nil),                            // 55: nri.pkg.api.v1alpha1.KeyValue
-       (*OptionalString)(nil),                      // 56: nri.pkg.api.v1alpha1.OptionalString
-       (*OptionalInt)(nil),                         // 57: nri.pkg.api.v1alpha1.OptionalInt
-       (*OptionalInt32)(nil),                       // 58: nri.pkg.api.v1alpha1.OptionalInt32
-       (*OptionalUInt32)(nil),                      // 59: nri.pkg.api.v1alpha1.OptionalUInt32
-       (*OptionalInt64)(nil),                       // 60: nri.pkg.api.v1alpha1.OptionalInt64
-       (*OptionalUInt64)(nil),                      // 61: nri.pkg.api.v1alpha1.OptionalUInt64
-       (*OptionalBool)(nil),                        // 62: nri.pkg.api.v1alpha1.OptionalBool
-       (*OptionalFileMode)(nil),                    // 63: nri.pkg.api.v1alpha1.OptionalFileMode
-       (*CompoundFieldOwners)(nil),                 // 64: nri.pkg.api.v1alpha1.CompoundFieldOwners
-       (*FieldOwners)(nil),                         // 65: nri.pkg.api.v1alpha1.FieldOwners
-       (*OwningPlugins)(nil),                       // 66: nri.pkg.api.v1alpha1.OwningPlugins
-       nil,                                         // 67: nri.pkg.api.v1alpha1.PodSandbox.LabelsEntry
-       nil,                                         // 68: nri.pkg.api.v1alpha1.PodSandbox.AnnotationsEntry
-       nil,                                         // 69: nri.pkg.api.v1alpha1.Container.LabelsEntry
-       nil,                                         // 70: nri.pkg.api.v1alpha1.Container.AnnotationsEntry
-       nil,                                         // 71: nri.pkg.api.v1alpha1.LinuxResources.UnifiedEntry
-       nil,                                         // 72: nri.pkg.api.v1alpha1.ContainerAdjustment.AnnotationsEntry
-       nil,                                         // 73: nri.pkg.api.v1alpha1.CompoundFieldOwners.OwnersEntry
-       nil,                                         // 74: nri.pkg.api.v1alpha1.FieldOwners.SimpleEntry
-       nil,                                         // 75: nri.pkg.api.v1alpha1.FieldOwners.CompoundEntry
-       nil,                                         // 76: nri.pkg.api.v1alpha1.OwningPlugins.OwnersEntry
+       (LinuxSchedulerPolicy)(0),                   // 3: nri.pkg.api.v1alpha1.LinuxSchedulerPolicy
+       (LinuxSchedulerFlag)(0),                     // 4: nri.pkg.api.v1alpha1.LinuxSchedulerFlag
+       (Field)(0),                                  // 5: nri.pkg.api.v1alpha1.Field
+       (LogRequest_Level)(0),                       // 6: nri.pkg.api.v1alpha1.LogRequest.Level
+       (SecurityProfile_ProfileType)(0),            // 7: nri.pkg.api.v1alpha1.SecurityProfile.ProfileType
+       (*RegisterPluginRequest)(nil),               // 8: nri.pkg.api.v1alpha1.RegisterPluginRequest
+       (*UpdateContainersRequest)(nil),             // 9: nri.pkg.api.v1alpha1.UpdateContainersRequest
+       (*UpdateContainersResponse)(nil),            // 10: nri.pkg.api.v1alpha1.UpdateContainersResponse
+       (*LogRequest)(nil),                          // 11: nri.pkg.api.v1alpha1.LogRequest
+       (*ConfigureRequest)(nil),                    // 12: nri.pkg.api.v1alpha1.ConfigureRequest
+       (*ConfigureResponse)(nil),                   // 13: nri.pkg.api.v1alpha1.ConfigureResponse
+       (*SynchronizeRequest)(nil),                  // 14: nri.pkg.api.v1alpha1.SynchronizeRequest
+       (*SynchronizeResponse)(nil),                 // 15: nri.pkg.api.v1alpha1.SynchronizeResponse
+       (*CreateContainerRequest)(nil),              // 16: nri.pkg.api.v1alpha1.CreateContainerRequest
+       (*CreateContainerResponse)(nil),             // 17: nri.pkg.api.v1alpha1.CreateContainerResponse
+       (*UpdateContainerRequest)(nil),              // 18: nri.pkg.api.v1alpha1.UpdateContainerRequest
+       (*UpdateContainerResponse)(nil),             // 19: nri.pkg.api.v1alpha1.UpdateContainerResponse
+       (*StopContainerRequest)(nil),                // 20: nri.pkg.api.v1alpha1.StopContainerRequest
+       (*StopContainerResponse)(nil),               // 21: nri.pkg.api.v1alpha1.StopContainerResponse
+       (*UpdatePodSandboxRequest)(nil),             // 22: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest
+       (*UpdatePodSandboxResponse)(nil),            // 23: nri.pkg.api.v1alpha1.UpdatePodSandboxResponse
+       (*StateChangeEvent)(nil),                    // 24: nri.pkg.api.v1alpha1.StateChangeEvent
+       (*ValidateContainerAdjustmentRequest)(nil),  // 25: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest
+       (*PluginInstance)(nil),                      // 26: nri.pkg.api.v1alpha1.PluginInstance
+       (*ValidateContainerAdjustmentResponse)(nil), // 27: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentResponse
+       (*Empty)(nil),                               // 28: nri.pkg.api.v1alpha1.Empty
+       (*PodSandbox)(nil),                          // 29: nri.pkg.api.v1alpha1.PodSandbox
+       (*LinuxPodSandbox)(nil),                     // 30: nri.pkg.api.v1alpha1.LinuxPodSandbox
+       (*Container)(nil),                           // 31: nri.pkg.api.v1alpha1.Container
+       (*Mount)(nil),                               // 32: nri.pkg.api.v1alpha1.Mount
+       (*Hooks)(nil),                               // 33: nri.pkg.api.v1alpha1.Hooks
+       (*Hook)(nil),                                // 34: nri.pkg.api.v1alpha1.Hook
+       (*LinuxContainer)(nil),                      // 35: nri.pkg.api.v1alpha1.LinuxContainer
+       (*LinuxNamespace)(nil),                      // 36: nri.pkg.api.v1alpha1.LinuxNamespace
+       (*LinuxDevice)(nil),                         // 37: nri.pkg.api.v1alpha1.LinuxDevice
+       (*LinuxDeviceCgroup)(nil),                   // 38: nri.pkg.api.v1alpha1.LinuxDeviceCgroup
+       (*CDIDevice)(nil),                           // 39: nri.pkg.api.v1alpha1.CDIDevice
+       (*User)(nil),                                // 40: nri.pkg.api.v1alpha1.User
+       (*LinuxResources)(nil),                      // 41: nri.pkg.api.v1alpha1.LinuxResources
+       (*LinuxMemory)(nil),                         // 42: nri.pkg.api.v1alpha1.LinuxMemory
+       (*LinuxCPU)(nil),                            // 43: nri.pkg.api.v1alpha1.LinuxCPU
+       (*HugepageLimit)(nil),                       // 44: nri.pkg.api.v1alpha1.HugepageLimit
+       (*SecurityProfile)(nil),                     // 45: nri.pkg.api.v1alpha1.SecurityProfile
+       (*POSIXRlimit)(nil),                         // 46: nri.pkg.api.v1alpha1.POSIXRlimit
+       (*LinuxPids)(nil),                           // 47: nri.pkg.api.v1alpha1.LinuxPids
+       (*LinuxIOPriority)(nil),                     // 48: nri.pkg.api.v1alpha1.LinuxIOPriority
+       (*LinuxNetDevice)(nil),                      // 49: nri.pkg.api.v1alpha1.LinuxNetDevice
+       (*LinuxScheduler)(nil),                      // 50: nri.pkg.api.v1alpha1.LinuxScheduler
+       (*ContainerAdjustment)(nil),                 // 51: nri.pkg.api.v1alpha1.ContainerAdjustment
+       (*LinuxContainerAdjustment)(nil),            // 52: nri.pkg.api.v1alpha1.LinuxContainerAdjustment
+       (*LinuxSeccomp)(nil),                        // 53: nri.pkg.api.v1alpha1.LinuxSeccomp
+       (*LinuxSyscall)(nil),                        // 54: nri.pkg.api.v1alpha1.LinuxSyscall
+       (*LinuxSeccompArg)(nil),                     // 55: nri.pkg.api.v1alpha1.LinuxSeccompArg
+       (*ContainerUpdate)(nil),                     // 56: nri.pkg.api.v1alpha1.ContainerUpdate
+       (*LinuxContainerUpdate)(nil),                // 57: nri.pkg.api.v1alpha1.LinuxContainerUpdate
+       (*ContainerEviction)(nil),                   // 58: nri.pkg.api.v1alpha1.ContainerEviction
+       (*LinuxRdt)(nil),                            // 59: nri.pkg.api.v1alpha1.LinuxRdt
+       (*KeyValue)(nil),                            // 60: nri.pkg.api.v1alpha1.KeyValue
+       (*OptionalString)(nil),                      // 61: nri.pkg.api.v1alpha1.OptionalString
+       (*OptionalRepeatedString)(nil),              // 62: nri.pkg.api.v1alpha1.OptionalRepeatedString
+       (*OptionalInt)(nil),                         // 63: nri.pkg.api.v1alpha1.OptionalInt
+       (*OptionalInt32)(nil),                       // 64: nri.pkg.api.v1alpha1.OptionalInt32
+       (*OptionalUInt32)(nil),                      // 65: nri.pkg.api.v1alpha1.OptionalUInt32
+       (*OptionalInt64)(nil),                       // 66: nri.pkg.api.v1alpha1.OptionalInt64
+       (*OptionalUInt64)(nil),                      // 67: nri.pkg.api.v1alpha1.OptionalUInt64
+       (*OptionalBool)(nil),                        // 68: nri.pkg.api.v1alpha1.OptionalBool
+       (*OptionalFileMode)(nil),                    // 69: nri.pkg.api.v1alpha1.OptionalFileMode
+       (*CompoundFieldOwners)(nil),                 // 70: nri.pkg.api.v1alpha1.CompoundFieldOwners
+       (*FieldOwners)(nil),                         // 71: nri.pkg.api.v1alpha1.FieldOwners
+       (*OwningPlugins)(nil),                       // 72: nri.pkg.api.v1alpha1.OwningPlugins
+       nil,                                         // 73: nri.pkg.api.v1alpha1.PodSandbox.LabelsEntry
+       nil,                                         // 74: nri.pkg.api.v1alpha1.PodSandbox.AnnotationsEntry
+       nil,                                         // 75: nri.pkg.api.v1alpha1.Container.LabelsEntry
+       nil,                                         // 76: nri.pkg.api.v1alpha1.Container.AnnotationsEntry
+       nil,                                         // 77: nri.pkg.api.v1alpha1.LinuxContainer.SysctlEntry
+       nil,                                         // 78: nri.pkg.api.v1alpha1.LinuxContainer.NetDevicesEntry
+       nil,                                         // 79: nri.pkg.api.v1alpha1.LinuxResources.UnifiedEntry
+       nil,                                         // 80: nri.pkg.api.v1alpha1.ContainerAdjustment.AnnotationsEntry
+       nil,                                         // 81: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.SysctlEntry
+       nil,                                         // 82: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.NetDevicesEntry
+       nil,                                         // 83: nri.pkg.api.v1alpha1.CompoundFieldOwners.OwnersEntry
+       nil,                                         // 84: nri.pkg.api.v1alpha1.FieldOwners.SimpleEntry
+       nil,                                         // 85: nri.pkg.api.v1alpha1.FieldOwners.CompoundEntry
+       nil,                                         // 86: nri.pkg.api.v1alpha1.OwningPlugins.OwnersEntry
 }
 var file_pkg_api_api_proto_depIdxs = []int32{
-       52,  // 0: nri.pkg.api.v1alpha1.UpdateContainersRequest.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
-       54,  // 1: nri.pkg.api.v1alpha1.UpdateContainersRequest.evict:type_name -> nri.pkg.api.v1alpha1.ContainerEviction
-       52,  // 2: nri.pkg.api.v1alpha1.UpdateContainersResponse.failed:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
-       4,   // 3: nri.pkg.api.v1alpha1.LogRequest.level:type_name -> nri.pkg.api.v1alpha1.LogRequest.Level
-       27,  // 4: nri.pkg.api.v1alpha1.SynchronizeRequest.pods:type_name -> nri.pkg.api.v1alpha1.PodSandbox
-       29,  // 5: nri.pkg.api.v1alpha1.SynchronizeRequest.containers:type_name -> nri.pkg.api.v1alpha1.Container
-       52,  // 6: nri.pkg.api.v1alpha1.SynchronizeResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
-       27,  // 7: nri.pkg.api.v1alpha1.CreateContainerRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
-       29,  // 8: nri.pkg.api.v1alpha1.CreateContainerRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
-       47,  // 9: nri.pkg.api.v1alpha1.CreateContainerResponse.adjust:type_name -> nri.pkg.api.v1alpha1.ContainerAdjustment
-       52,  // 10: nri.pkg.api.v1alpha1.CreateContainerResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
-       54,  // 11: nri.pkg.api.v1alpha1.CreateContainerResponse.evict:type_name -> nri.pkg.api.v1alpha1.ContainerEviction
-       27,  // 12: nri.pkg.api.v1alpha1.UpdateContainerRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
-       29,  // 13: nri.pkg.api.v1alpha1.UpdateContainerRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
-       39,  // 14: nri.pkg.api.v1alpha1.UpdateContainerRequest.linux_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
-       52,  // 15: nri.pkg.api.v1alpha1.UpdateContainerResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
-       54,  // 16: nri.pkg.api.v1alpha1.UpdateContainerResponse.evict:type_name -> nri.pkg.api.v1alpha1.ContainerEviction
-       27,  // 17: nri.pkg.api.v1alpha1.StopContainerRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
-       29,  // 18: nri.pkg.api.v1alpha1.StopContainerRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
-       52,  // 19: nri.pkg.api.v1alpha1.StopContainerResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
-       27,  // 20: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
-       39,  // 21: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest.overhead_linux_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
-       39,  // 22: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest.linux_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       56,  // 0: nri.pkg.api.v1alpha1.UpdateContainersRequest.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
+       58,  // 1: nri.pkg.api.v1alpha1.UpdateContainersRequest.evict:type_name -> nri.pkg.api.v1alpha1.ContainerEviction
+       56,  // 2: nri.pkg.api.v1alpha1.UpdateContainersResponse.failed:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
+       6,   // 3: nri.pkg.api.v1alpha1.LogRequest.level:type_name -> nri.pkg.api.v1alpha1.LogRequest.Level
+       29,  // 4: nri.pkg.api.v1alpha1.SynchronizeRequest.pods:type_name -> nri.pkg.api.v1alpha1.PodSandbox
+       31,  // 5: nri.pkg.api.v1alpha1.SynchronizeRequest.containers:type_name -> nri.pkg.api.v1alpha1.Container
+       56,  // 6: nri.pkg.api.v1alpha1.SynchronizeResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
+       29,  // 7: nri.pkg.api.v1alpha1.CreateContainerRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
+       31,  // 8: nri.pkg.api.v1alpha1.CreateContainerRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
+       51,  // 9: nri.pkg.api.v1alpha1.CreateContainerResponse.adjust:type_name -> nri.pkg.api.v1alpha1.ContainerAdjustment
+       56,  // 10: nri.pkg.api.v1alpha1.CreateContainerResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
+       58,  // 11: nri.pkg.api.v1alpha1.CreateContainerResponse.evict:type_name -> nri.pkg.api.v1alpha1.ContainerEviction
+       29,  // 12: nri.pkg.api.v1alpha1.UpdateContainerRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
+       31,  // 13: nri.pkg.api.v1alpha1.UpdateContainerRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
+       41,  // 14: nri.pkg.api.v1alpha1.UpdateContainerRequest.linux_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       56,  // 15: nri.pkg.api.v1alpha1.UpdateContainerResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
+       58,  // 16: nri.pkg.api.v1alpha1.UpdateContainerResponse.evict:type_name -> nri.pkg.api.v1alpha1.ContainerEviction
+       29,  // 17: nri.pkg.api.v1alpha1.StopContainerRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
+       31,  // 18: nri.pkg.api.v1alpha1.StopContainerRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
+       56,  // 19: nri.pkg.api.v1alpha1.StopContainerResponse.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
+       29,  // 20: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
+       41,  // 21: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest.overhead_linux_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       41,  // 22: nri.pkg.api.v1alpha1.UpdatePodSandboxRequest.linux_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
        0,   // 23: nri.pkg.api.v1alpha1.StateChangeEvent.event:type_name -> nri.pkg.api.v1alpha1.Event
-       27,  // 24: nri.pkg.api.v1alpha1.StateChangeEvent.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
-       29,  // 25: nri.pkg.api.v1alpha1.StateChangeEvent.container:type_name -> nri.pkg.api.v1alpha1.Container
-       27,  // 26: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
-       29,  // 27: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
-       47,  // 28: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.adjust:type_name -> nri.pkg.api.v1alpha1.ContainerAdjustment
-       52,  // 29: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
-       66,  // 30: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.owners:type_name -> nri.pkg.api.v1alpha1.OwningPlugins
-       24,  // 31: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.plugins:type_name -> nri.pkg.api.v1alpha1.PluginInstance
-       67,  // 32: nri.pkg.api.v1alpha1.PodSandbox.labels:type_name -> nri.pkg.api.v1alpha1.PodSandbox.LabelsEntry
-       68,  // 33: nri.pkg.api.v1alpha1.PodSandbox.annotations:type_name -> nri.pkg.api.v1alpha1.PodSandbox.AnnotationsEntry
-       28,  // 34: nri.pkg.api.v1alpha1.PodSandbox.linux:type_name -> nri.pkg.api.v1alpha1.LinuxPodSandbox
-       39,  // 35: nri.pkg.api.v1alpha1.LinuxPodSandbox.pod_overhead:type_name -> nri.pkg.api.v1alpha1.LinuxResources
-       39,  // 36: nri.pkg.api.v1alpha1.LinuxPodSandbox.pod_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
-       34,  // 37: nri.pkg.api.v1alpha1.LinuxPodSandbox.namespaces:type_name -> nri.pkg.api.v1alpha1.LinuxNamespace
-       39,  // 38: nri.pkg.api.v1alpha1.LinuxPodSandbox.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       29,  // 24: nri.pkg.api.v1alpha1.StateChangeEvent.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
+       31,  // 25: nri.pkg.api.v1alpha1.StateChangeEvent.container:type_name -> nri.pkg.api.v1alpha1.Container
+       29,  // 26: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.pod:type_name -> nri.pkg.api.v1alpha1.PodSandbox
+       31,  // 27: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.container:type_name -> nri.pkg.api.v1alpha1.Container
+       51,  // 28: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.adjust:type_name -> nri.pkg.api.v1alpha1.ContainerAdjustment
+       56,  // 29: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.update:type_name -> nri.pkg.api.v1alpha1.ContainerUpdate
+       72,  // 30: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.owners:type_name -> nri.pkg.api.v1alpha1.OwningPlugins
+       26,  // 31: nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest.plugins:type_name -> nri.pkg.api.v1alpha1.PluginInstance
+       73,  // 32: nri.pkg.api.v1alpha1.PodSandbox.labels:type_name -> nri.pkg.api.v1alpha1.PodSandbox.LabelsEntry
+       74,  // 33: nri.pkg.api.v1alpha1.PodSandbox.annotations:type_name -> nri.pkg.api.v1alpha1.PodSandbox.AnnotationsEntry
+       30,  // 34: nri.pkg.api.v1alpha1.PodSandbox.linux:type_name -> nri.pkg.api.v1alpha1.LinuxPodSandbox
+       41,  // 35: nri.pkg.api.v1alpha1.LinuxPodSandbox.pod_overhead:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       41,  // 36: nri.pkg.api.v1alpha1.LinuxPodSandbox.pod_resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       36,  // 37: nri.pkg.api.v1alpha1.LinuxPodSandbox.namespaces:type_name -> nri.pkg.api.v1alpha1.LinuxNamespace
+       41,  // 38: nri.pkg.api.v1alpha1.LinuxPodSandbox.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
        1,   // 39: nri.pkg.api.v1alpha1.Container.state:type_name -> nri.pkg.api.v1alpha1.ContainerState
-       69,  // 40: nri.pkg.api.v1alpha1.Container.labels:type_name -> nri.pkg.api.v1alpha1.Container.LabelsEntry
-       70,  // 41: nri.pkg.api.v1alpha1.Container.annotations:type_name -> nri.pkg.api.v1alpha1.Container.AnnotationsEntry
-       30,  // 42: nri.pkg.api.v1alpha1.Container.mounts:type_name -> nri.pkg.api.v1alpha1.Mount
-       31,  // 43: nri.pkg.api.v1alpha1.Container.hooks:type_name -> nri.pkg.api.v1alpha1.Hooks
-       33,  // 44: nri.pkg.api.v1alpha1.Container.linux:type_name -> nri.pkg.api.v1alpha1.LinuxContainer
-       44,  // 45: nri.pkg.api.v1alpha1.Container.rlimits:type_name -> nri.pkg.api.v1alpha1.POSIXRlimit
-       37,  // 46: nri.pkg.api.v1alpha1.Container.CDI_devices:type_name -> nri.pkg.api.v1alpha1.CDIDevice
-       38,  // 47: nri.pkg.api.v1alpha1.Container.user:type_name -> nri.pkg.api.v1alpha1.User
-       32,  // 48: nri.pkg.api.v1alpha1.Hooks.prestart:type_name -> nri.pkg.api.v1alpha1.Hook
-       32,  // 49: nri.pkg.api.v1alpha1.Hooks.create_runtime:type_name -> nri.pkg.api.v1alpha1.Hook
-       32,  // 50: nri.pkg.api.v1alpha1.Hooks.create_container:type_name -> nri.pkg.api.v1alpha1.Hook
-       32,  // 51: nri.pkg.api.v1alpha1.Hooks.start_container:type_name -> nri.pkg.api.v1alpha1.Hook
-       32,  // 52: nri.pkg.api.v1alpha1.Hooks.poststart:type_name -> nri.pkg.api.v1alpha1.Hook
-       32,  // 53: nri.pkg.api.v1alpha1.Hooks.poststop:type_name -> nri.pkg.api.v1alpha1.Hook
-       57,  // 54: nri.pkg.api.v1alpha1.Hook.timeout:type_name -> nri.pkg.api.v1alpha1.OptionalInt
-       34,  // 55: nri.pkg.api.v1alpha1.LinuxContainer.namespaces:type_name -> nri.pkg.api.v1alpha1.LinuxNamespace
-       35,  // 56: nri.pkg.api.v1alpha1.LinuxContainer.devices:type_name -> nri.pkg.api.v1alpha1.LinuxDevice
-       39,  // 57: nri.pkg.api.v1alpha1.LinuxContainer.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
-       57,  // 58: nri.pkg.api.v1alpha1.LinuxContainer.oom_score_adj:type_name -> nri.pkg.api.v1alpha1.OptionalInt
-       46,  // 59: nri.pkg.api.v1alpha1.LinuxContainer.io_priority:type_name -> nri.pkg.api.v1alpha1.LinuxIOPriority
-       43,  // 60: nri.pkg.api.v1alpha1.LinuxContainer.seccomp_profile:type_name -> nri.pkg.api.v1alpha1.SecurityProfile
-       49,  // 61: nri.pkg.api.v1alpha1.LinuxContainer.seccomp_policy:type_name -> nri.pkg.api.v1alpha1.LinuxSeccomp
-       63,  // 62: nri.pkg.api.v1alpha1.LinuxDevice.file_mode:type_name -> nri.pkg.api.v1alpha1.OptionalFileMode
-       59,  // 63: nri.pkg.api.v1alpha1.LinuxDevice.uid:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
-       59,  // 64: nri.pkg.api.v1alpha1.LinuxDevice.gid:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
-       60,  // 65: nri.pkg.api.v1alpha1.LinuxDeviceCgroup.major:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       60,  // 66: nri.pkg.api.v1alpha1.LinuxDeviceCgroup.minor:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       40,  // 67: nri.pkg.api.v1alpha1.LinuxResources.memory:type_name -> nri.pkg.api.v1alpha1.LinuxMemory
-       41,  // 68: nri.pkg.api.v1alpha1.LinuxResources.cpu:type_name -> nri.pkg.api.v1alpha1.LinuxCPU
-       42,  // 69: nri.pkg.api.v1alpha1.LinuxResources.hugepage_limits:type_name -> nri.pkg.api.v1alpha1.HugepageLimit
-       56,  // 70: nri.pkg.api.v1alpha1.LinuxResources.blockio_class:type_name -> nri.pkg.api.v1alpha1.OptionalString
-       56,  // 71: nri.pkg.api.v1alpha1.LinuxResources.rdt_class:type_name -> nri.pkg.api.v1alpha1.OptionalString
-       71,  // 72: nri.pkg.api.v1alpha1.LinuxResources.unified:type_name -> nri.pkg.api.v1alpha1.LinuxResources.UnifiedEntry
-       36,  // 73: nri.pkg.api.v1alpha1.LinuxResources.devices:type_name -> nri.pkg.api.v1alpha1.LinuxDeviceCgroup
-       45,  // 74: nri.pkg.api.v1alpha1.LinuxResources.pids:type_name -> nri.pkg.api.v1alpha1.LinuxPids
-       60,  // 75: nri.pkg.api.v1alpha1.LinuxMemory.limit:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       60,  // 76: nri.pkg.api.v1alpha1.LinuxMemory.reservation:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       60,  // 77: nri.pkg.api.v1alpha1.LinuxMemory.swap:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       60,  // 78: nri.pkg.api.v1alpha1.LinuxMemory.kernel:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       60,  // 79: nri.pkg.api.v1alpha1.LinuxMemory.kernel_tcp:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       61,  // 80: nri.pkg.api.v1alpha1.LinuxMemory.swappiness:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
-       62,  // 81: nri.pkg.api.v1alpha1.LinuxMemory.disable_oom_killer:type_name -> nri.pkg.api.v1alpha1.OptionalBool
-       62,  // 82: nri.pkg.api.v1alpha1.LinuxMemory.use_hierarchy:type_name -> nri.pkg.api.v1alpha1.OptionalBool
-       61,  // 83: nri.pkg.api.v1alpha1.LinuxCPU.shares:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
-       60,  // 84: nri.pkg.api.v1alpha1.LinuxCPU.quota:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       61,  // 85: nri.pkg.api.v1alpha1.LinuxCPU.period:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
-       60,  // 86: nri.pkg.api.v1alpha1.LinuxCPU.realtime_runtime:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
-       61,  // 87: nri.pkg.api.v1alpha1.LinuxCPU.realtime_period:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
-       5,   // 88: nri.pkg.api.v1alpha1.SecurityProfile.profile_type:type_name -> nri.pkg.api.v1alpha1.SecurityProfile.ProfileType
-       2,   // 89: nri.pkg.api.v1alpha1.LinuxIOPriority.class:type_name -> nri.pkg.api.v1alpha1.IOPrioClass
-       72,  // 90: nri.pkg.api.v1alpha1.ContainerAdjustment.annotations:type_name -> nri.pkg.api.v1alpha1.ContainerAdjustment.AnnotationsEntry
-       30,  // 91: nri.pkg.api.v1alpha1.ContainerAdjustment.mounts:type_name -> nri.pkg.api.v1alpha1.Mount
-       55,  // 92: nri.pkg.api.v1alpha1.ContainerAdjustment.env:type_name -> nri.pkg.api.v1alpha1.KeyValue
-       31,  // 93: nri.pkg.api.v1alpha1.ContainerAdjustment.hooks:type_name -> nri.pkg.api.v1alpha1.Hooks
-       48,  // 94: nri.pkg.api.v1alpha1.ContainerAdjustment.linux:type_name -> nri.pkg.api.v1alpha1.LinuxContainerAdjustment
-       44,  // 95: nri.pkg.api.v1alpha1.ContainerAdjustment.rlimits:type_name -> nri.pkg.api.v1alpha1.POSIXRlimit
-       37,  // 96: nri.pkg.api.v1alpha1.ContainerAdjustment.CDI_devices:type_name -> nri.pkg.api.v1alpha1.CDIDevice
-       35,  // 97: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.devices:type_name -> nri.pkg.api.v1alpha1.LinuxDevice
-       39,  // 98: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
-       57,  // 99: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.oom_score_adj:type_name -> nri.pkg.api.v1alpha1.OptionalInt
-       46,  // 100: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.io_priority:type_name -> nri.pkg.api.v1alpha1.LinuxIOPriority
-       49,  // 101: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.seccomp_policy:type_name -> nri.pkg.api.v1alpha1.LinuxSeccomp
-       34,  // 102: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.namespaces:type_name -> nri.pkg.api.v1alpha1.LinuxNamespace
-       59,  // 103: nri.pkg.api.v1alpha1.LinuxSeccomp.default_errno:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
-       50,  // 104: nri.pkg.api.v1alpha1.LinuxSeccomp.syscalls:type_name -> nri.pkg.api.v1alpha1.LinuxSyscall
-       59,  // 105: nri.pkg.api.v1alpha1.LinuxSyscall.errno_ret:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
-       51,  // 106: nri.pkg.api.v1alpha1.LinuxSyscall.args:type_name -> nri.pkg.api.v1alpha1.LinuxSeccompArg
-       53,  // 107: nri.pkg.api.v1alpha1.ContainerUpdate.linux:type_name -> nri.pkg.api.v1alpha1.LinuxContainerUpdate
-       39,  // 108: nri.pkg.api.v1alpha1.LinuxContainerUpdate.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
-       73,  // 109: nri.pkg.api.v1alpha1.CompoundFieldOwners.owners:type_name -> nri.pkg.api.v1alpha1.CompoundFieldOwners.OwnersEntry
-       74,  // 110: nri.pkg.api.v1alpha1.FieldOwners.simple:type_name -> nri.pkg.api.v1alpha1.FieldOwners.SimpleEntry
-       75,  // 111: nri.pkg.api.v1alpha1.FieldOwners.compound:type_name -> nri.pkg.api.v1alpha1.FieldOwners.CompoundEntry
-       76,  // 112: nri.pkg.api.v1alpha1.OwningPlugins.owners:type_name -> nri.pkg.api.v1alpha1.OwningPlugins.OwnersEntry
-       64,  // 113: nri.pkg.api.v1alpha1.FieldOwners.CompoundEntry.value:type_name -> nri.pkg.api.v1alpha1.CompoundFieldOwners
-       65,  // 114: nri.pkg.api.v1alpha1.OwningPlugins.OwnersEntry.value:type_name -> nri.pkg.api.v1alpha1.FieldOwners
-       6,   // 115: nri.pkg.api.v1alpha1.Runtime.RegisterPlugin:input_type -> nri.pkg.api.v1alpha1.RegisterPluginRequest
-       7,   // 116: nri.pkg.api.v1alpha1.Runtime.UpdateContainers:input_type -> nri.pkg.api.v1alpha1.UpdateContainersRequest
-       10,  // 117: nri.pkg.api.v1alpha1.Plugin.Configure:input_type -> nri.pkg.api.v1alpha1.ConfigureRequest
-       12,  // 118: nri.pkg.api.v1alpha1.Plugin.Synchronize:input_type -> nri.pkg.api.v1alpha1.SynchronizeRequest
-       26,  // 119: nri.pkg.api.v1alpha1.Plugin.Shutdown:input_type -> nri.pkg.api.v1alpha1.Empty
-       14,  // 120: nri.pkg.api.v1alpha1.Plugin.CreateContainer:input_type -> nri.pkg.api.v1alpha1.CreateContainerRequest
-       16,  // 121: nri.pkg.api.v1alpha1.Plugin.UpdateContainer:input_type -> nri.pkg.api.v1alpha1.UpdateContainerRequest
-       18,  // 122: nri.pkg.api.v1alpha1.Plugin.StopContainer:input_type -> nri.pkg.api.v1alpha1.StopContainerRequest
-       20,  // 123: nri.pkg.api.v1alpha1.Plugin.UpdatePodSandbox:input_type -> nri.pkg.api.v1alpha1.UpdatePodSandboxRequest
-       22,  // 124: nri.pkg.api.v1alpha1.Plugin.StateChange:input_type -> nri.pkg.api.v1alpha1.StateChangeEvent
-       23,  // 125: nri.pkg.api.v1alpha1.Plugin.ValidateContainerAdjustment:input_type -> nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest
-       9,   // 126: nri.pkg.api.v1alpha1.HostFunctions.Log:input_type -> nri.pkg.api.v1alpha1.LogRequest
-       26,  // 127: nri.pkg.api.v1alpha1.Runtime.RegisterPlugin:output_type -> nri.pkg.api.v1alpha1.Empty
-       8,   // 128: nri.pkg.api.v1alpha1.Runtime.UpdateContainers:output_type -> nri.pkg.api.v1alpha1.UpdateContainersResponse
-       11,  // 129: nri.pkg.api.v1alpha1.Plugin.Configure:output_type -> nri.pkg.api.v1alpha1.ConfigureResponse
-       13,  // 130: nri.pkg.api.v1alpha1.Plugin.Synchronize:output_type -> nri.pkg.api.v1alpha1.SynchronizeResponse
-       26,  // 131: nri.pkg.api.v1alpha1.Plugin.Shutdown:output_type -> nri.pkg.api.v1alpha1.Empty
-       15,  // 132: nri.pkg.api.v1alpha1.Plugin.CreateContainer:output_type -> nri.pkg.api.v1alpha1.CreateContainerResponse
-       17,  // 133: nri.pkg.api.v1alpha1.Plugin.UpdateContainer:output_type -> nri.pkg.api.v1alpha1.UpdateContainerResponse
-       19,  // 134: nri.pkg.api.v1alpha1.Plugin.StopContainer:output_type -> nri.pkg.api.v1alpha1.StopContainerResponse
-       21,  // 135: nri.pkg.api.v1alpha1.Plugin.UpdatePodSandbox:output_type -> nri.pkg.api.v1alpha1.UpdatePodSandboxResponse
-       26,  // 136: nri.pkg.api.v1alpha1.Plugin.StateChange:output_type -> nri.pkg.api.v1alpha1.Empty
-       25,  // 137: nri.pkg.api.v1alpha1.Plugin.ValidateContainerAdjustment:output_type -> nri.pkg.api.v1alpha1.ValidateContainerAdjustmentResponse
-       26,  // 138: nri.pkg.api.v1alpha1.HostFunctions.Log:output_type -> nri.pkg.api.v1alpha1.Empty
-       127, // [127:139] is the sub-list for method output_type
-       115, // [115:127] is the sub-list for method input_type
-       115, // [115:115] is the sub-list for extension type_name
-       115, // [115:115] is the sub-list for extension extendee
-       0,   // [0:115] is the sub-list for field type_name
+       75,  // 40: nri.pkg.api.v1alpha1.Container.labels:type_name -> nri.pkg.api.v1alpha1.Container.LabelsEntry
+       76,  // 41: nri.pkg.api.v1alpha1.Container.annotations:type_name -> nri.pkg.api.v1alpha1.Container.AnnotationsEntry
+       32,  // 42: nri.pkg.api.v1alpha1.Container.mounts:type_name -> nri.pkg.api.v1alpha1.Mount
+       33,  // 43: nri.pkg.api.v1alpha1.Container.hooks:type_name -> nri.pkg.api.v1alpha1.Hooks
+       35,  // 44: nri.pkg.api.v1alpha1.Container.linux:type_name -> nri.pkg.api.v1alpha1.LinuxContainer
+       46,  // 45: nri.pkg.api.v1alpha1.Container.rlimits:type_name -> nri.pkg.api.v1alpha1.POSIXRlimit
+       39,  // 46: nri.pkg.api.v1alpha1.Container.CDI_devices:type_name -> nri.pkg.api.v1alpha1.CDIDevice
+       40,  // 47: nri.pkg.api.v1alpha1.Container.user:type_name -> nri.pkg.api.v1alpha1.User
+       34,  // 48: nri.pkg.api.v1alpha1.Hooks.prestart:type_name -> nri.pkg.api.v1alpha1.Hook
+       34,  // 49: nri.pkg.api.v1alpha1.Hooks.create_runtime:type_name -> nri.pkg.api.v1alpha1.Hook
+       34,  // 50: nri.pkg.api.v1alpha1.Hooks.create_container:type_name -> nri.pkg.api.v1alpha1.Hook
+       34,  // 51: nri.pkg.api.v1alpha1.Hooks.start_container:type_name -> nri.pkg.api.v1alpha1.Hook
+       34,  // 52: nri.pkg.api.v1alpha1.Hooks.poststart:type_name -> nri.pkg.api.v1alpha1.Hook
+       34,  // 53: nri.pkg.api.v1alpha1.Hooks.poststop:type_name -> nri.pkg.api.v1alpha1.Hook
+       63,  // 54: nri.pkg.api.v1alpha1.Hook.timeout:type_name -> nri.pkg.api.v1alpha1.OptionalInt
+       36,  // 55: nri.pkg.api.v1alpha1.LinuxContainer.namespaces:type_name -> nri.pkg.api.v1alpha1.LinuxNamespace
+       37,  // 56: nri.pkg.api.v1alpha1.LinuxContainer.devices:type_name -> nri.pkg.api.v1alpha1.LinuxDevice
+       41,  // 57: nri.pkg.api.v1alpha1.LinuxContainer.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       63,  // 58: nri.pkg.api.v1alpha1.LinuxContainer.oom_score_adj:type_name -> nri.pkg.api.v1alpha1.OptionalInt
+       48,  // 59: nri.pkg.api.v1alpha1.LinuxContainer.io_priority:type_name -> nri.pkg.api.v1alpha1.LinuxIOPriority
+       45,  // 60: nri.pkg.api.v1alpha1.LinuxContainer.seccomp_profile:type_name -> nri.pkg.api.v1alpha1.SecurityProfile
+       53,  // 61: nri.pkg.api.v1alpha1.LinuxContainer.seccomp_policy:type_name -> nri.pkg.api.v1alpha1.LinuxSeccomp
+       77,  // 62: nri.pkg.api.v1alpha1.LinuxContainer.sysctl:type_name -> nri.pkg.api.v1alpha1.LinuxContainer.SysctlEntry
+       78,  // 63: nri.pkg.api.v1alpha1.LinuxContainer.net_devices:type_name -> nri.pkg.api.v1alpha1.LinuxContainer.NetDevicesEntry
+       50,  // 64: nri.pkg.api.v1alpha1.LinuxContainer.scheduler:type_name -> nri.pkg.api.v1alpha1.LinuxScheduler
+       59,  // 65: nri.pkg.api.v1alpha1.LinuxContainer.rdt:type_name -> nri.pkg.api.v1alpha1.LinuxRdt
+       69,  // 66: nri.pkg.api.v1alpha1.LinuxDevice.file_mode:type_name -> nri.pkg.api.v1alpha1.OptionalFileMode
+       65,  // 67: nri.pkg.api.v1alpha1.LinuxDevice.uid:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
+       65,  // 68: nri.pkg.api.v1alpha1.LinuxDevice.gid:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
+       66,  // 69: nri.pkg.api.v1alpha1.LinuxDeviceCgroup.major:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       66,  // 70: nri.pkg.api.v1alpha1.LinuxDeviceCgroup.minor:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       42,  // 71: nri.pkg.api.v1alpha1.LinuxResources.memory:type_name -> nri.pkg.api.v1alpha1.LinuxMemory
+       43,  // 72: nri.pkg.api.v1alpha1.LinuxResources.cpu:type_name -> nri.pkg.api.v1alpha1.LinuxCPU
+       44,  // 73: nri.pkg.api.v1alpha1.LinuxResources.hugepage_limits:type_name -> nri.pkg.api.v1alpha1.HugepageLimit
+       61,  // 74: nri.pkg.api.v1alpha1.LinuxResources.blockio_class:type_name -> nri.pkg.api.v1alpha1.OptionalString
+       61,  // 75: nri.pkg.api.v1alpha1.LinuxResources.rdt_class:type_name -> nri.pkg.api.v1alpha1.OptionalString
+       79,  // 76: nri.pkg.api.v1alpha1.LinuxResources.unified:type_name -> nri.pkg.api.v1alpha1.LinuxResources.UnifiedEntry
+       38,  // 77: nri.pkg.api.v1alpha1.LinuxResources.devices:type_name -> nri.pkg.api.v1alpha1.LinuxDeviceCgroup
+       47,  // 78: nri.pkg.api.v1alpha1.LinuxResources.pids:type_name -> nri.pkg.api.v1alpha1.LinuxPids
+       66,  // 79: nri.pkg.api.v1alpha1.LinuxMemory.limit:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       66,  // 80: nri.pkg.api.v1alpha1.LinuxMemory.reservation:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       66,  // 81: nri.pkg.api.v1alpha1.LinuxMemory.swap:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       66,  // 82: nri.pkg.api.v1alpha1.LinuxMemory.kernel:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       66,  // 83: nri.pkg.api.v1alpha1.LinuxMemory.kernel_tcp:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       67,  // 84: nri.pkg.api.v1alpha1.LinuxMemory.swappiness:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
+       68,  // 85: nri.pkg.api.v1alpha1.LinuxMemory.disable_oom_killer:type_name -> nri.pkg.api.v1alpha1.OptionalBool
+       68,  // 86: nri.pkg.api.v1alpha1.LinuxMemory.use_hierarchy:type_name -> nri.pkg.api.v1alpha1.OptionalBool
+       67,  // 87: nri.pkg.api.v1alpha1.LinuxCPU.shares:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
+       66,  // 88: nri.pkg.api.v1alpha1.LinuxCPU.quota:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       67,  // 89: nri.pkg.api.v1alpha1.LinuxCPU.period:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
+       66,  // 90: nri.pkg.api.v1alpha1.LinuxCPU.realtime_runtime:type_name -> nri.pkg.api.v1alpha1.OptionalInt64
+       67,  // 91: nri.pkg.api.v1alpha1.LinuxCPU.realtime_period:type_name -> nri.pkg.api.v1alpha1.OptionalUInt64
+       7,   // 92: nri.pkg.api.v1alpha1.SecurityProfile.profile_type:type_name -> nri.pkg.api.v1alpha1.SecurityProfile.ProfileType
+       2,   // 93: nri.pkg.api.v1alpha1.LinuxIOPriority.class:type_name -> nri.pkg.api.v1alpha1.IOPrioClass
+       3,   // 94: nri.pkg.api.v1alpha1.LinuxScheduler.policy:type_name -> nri.pkg.api.v1alpha1.LinuxSchedulerPolicy
+       4,   // 95: nri.pkg.api.v1alpha1.LinuxScheduler.flags:type_name -> nri.pkg.api.v1alpha1.LinuxSchedulerFlag
+       80,  // 96: nri.pkg.api.v1alpha1.ContainerAdjustment.annotations:type_name -> nri.pkg.api.v1alpha1.ContainerAdjustment.AnnotationsEntry
+       32,  // 97: nri.pkg.api.v1alpha1.ContainerAdjustment.mounts:type_name -> nri.pkg.api.v1alpha1.Mount
+       60,  // 98: nri.pkg.api.v1alpha1.ContainerAdjustment.env:type_name -> nri.pkg.api.v1alpha1.KeyValue
+       33,  // 99: nri.pkg.api.v1alpha1.ContainerAdjustment.hooks:type_name -> nri.pkg.api.v1alpha1.Hooks
+       52,  // 100: nri.pkg.api.v1alpha1.ContainerAdjustment.linux:type_name -> nri.pkg.api.v1alpha1.LinuxContainerAdjustment
+       46,  // 101: nri.pkg.api.v1alpha1.ContainerAdjustment.rlimits:type_name -> nri.pkg.api.v1alpha1.POSIXRlimit
+       39,  // 102: nri.pkg.api.v1alpha1.ContainerAdjustment.CDI_devices:type_name -> nri.pkg.api.v1alpha1.CDIDevice
+       37,  // 103: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.devices:type_name -> nri.pkg.api.v1alpha1.LinuxDevice
+       41,  // 104: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       63,  // 105: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.oom_score_adj:type_name -> nri.pkg.api.v1alpha1.OptionalInt
+       48,  // 106: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.io_priority:type_name -> nri.pkg.api.v1alpha1.LinuxIOPriority
+       53,  // 107: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.seccomp_policy:type_name -> nri.pkg.api.v1alpha1.LinuxSeccomp
+       36,  // 108: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.namespaces:type_name -> nri.pkg.api.v1alpha1.LinuxNamespace
+       81,  // 109: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.sysctl:type_name -> nri.pkg.api.v1alpha1.LinuxContainerAdjustment.SysctlEntry
+       82,  // 110: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.net_devices:type_name -> nri.pkg.api.v1alpha1.LinuxContainerAdjustment.NetDevicesEntry
+       50,  // 111: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.scheduler:type_name -> nri.pkg.api.v1alpha1.LinuxScheduler
+       59,  // 112: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.rdt:type_name -> nri.pkg.api.v1alpha1.LinuxRdt
+       65,  // 113: nri.pkg.api.v1alpha1.LinuxSeccomp.default_errno:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
+       54,  // 114: nri.pkg.api.v1alpha1.LinuxSeccomp.syscalls:type_name -> nri.pkg.api.v1alpha1.LinuxSyscall
+       65,  // 115: nri.pkg.api.v1alpha1.LinuxSyscall.errno_ret:type_name -> nri.pkg.api.v1alpha1.OptionalUInt32
+       55,  // 116: nri.pkg.api.v1alpha1.LinuxSyscall.args:type_name -> nri.pkg.api.v1alpha1.LinuxSeccompArg
+       57,  // 117: nri.pkg.api.v1alpha1.ContainerUpdate.linux:type_name -> nri.pkg.api.v1alpha1.LinuxContainerUpdate
+       41,  // 118: nri.pkg.api.v1alpha1.LinuxContainerUpdate.resources:type_name -> nri.pkg.api.v1alpha1.LinuxResources
+       61,  // 119: nri.pkg.api.v1alpha1.LinuxRdt.clos_id:type_name -> nri.pkg.api.v1alpha1.OptionalString
+       62,  // 120: nri.pkg.api.v1alpha1.LinuxRdt.schemata:type_name -> nri.pkg.api.v1alpha1.OptionalRepeatedString
+       68,  // 121: nri.pkg.api.v1alpha1.LinuxRdt.enable_monitoring:type_name -> nri.pkg.api.v1alpha1.OptionalBool
+       83,  // 122: nri.pkg.api.v1alpha1.CompoundFieldOwners.owners:type_name -> nri.pkg.api.v1alpha1.CompoundFieldOwners.OwnersEntry
+       84,  // 123: nri.pkg.api.v1alpha1.FieldOwners.simple:type_name -> nri.pkg.api.v1alpha1.FieldOwners.SimpleEntry
+       85,  // 124: nri.pkg.api.v1alpha1.FieldOwners.compound:type_name -> nri.pkg.api.v1alpha1.FieldOwners.CompoundEntry
+       86,  // 125: nri.pkg.api.v1alpha1.OwningPlugins.owners:type_name -> nri.pkg.api.v1alpha1.OwningPlugins.OwnersEntry
+       49,  // 126: nri.pkg.api.v1alpha1.LinuxContainer.NetDevicesEntry.value:type_name -> nri.pkg.api.v1alpha1.LinuxNetDevice
+       49,  // 127: nri.pkg.api.v1alpha1.LinuxContainerAdjustment.NetDevicesEntry.value:type_name -> nri.pkg.api.v1alpha1.LinuxNetDevice
+       70,  // 128: nri.pkg.api.v1alpha1.FieldOwners.CompoundEntry.value:type_name -> nri.pkg.api.v1alpha1.CompoundFieldOwners
+       71,  // 129: nri.pkg.api.v1alpha1.OwningPlugins.OwnersEntry.value:type_name -> nri.pkg.api.v1alpha1.FieldOwners
+       8,   // 130: nri.pkg.api.v1alpha1.Runtime.RegisterPlugin:input_type -> nri.pkg.api.v1alpha1.RegisterPluginRequest
+       9,   // 131: nri.pkg.api.v1alpha1.Runtime.UpdateContainers:input_type -> nri.pkg.api.v1alpha1.UpdateContainersRequest
+       12,  // 132: nri.pkg.api.v1alpha1.Plugin.Configure:input_type -> nri.pkg.api.v1alpha1.ConfigureRequest
+       14,  // 133: nri.pkg.api.v1alpha1.Plugin.Synchronize:input_type -> nri.pkg.api.v1alpha1.SynchronizeRequest
+       28,  // 134: nri.pkg.api.v1alpha1.Plugin.Shutdown:input_type -> nri.pkg.api.v1alpha1.Empty
+       16,  // 135: nri.pkg.api.v1alpha1.Plugin.CreateContainer:input_type -> nri.pkg.api.v1alpha1.CreateContainerRequest
+       18,  // 136: nri.pkg.api.v1alpha1.Plugin.UpdateContainer:input_type -> nri.pkg.api.v1alpha1.UpdateContainerRequest
+       20,  // 137: nri.pkg.api.v1alpha1.Plugin.StopContainer:input_type -> nri.pkg.api.v1alpha1.StopContainerRequest
+       22,  // 138: nri.pkg.api.v1alpha1.Plugin.UpdatePodSandbox:input_type -> nri.pkg.api.v1alpha1.UpdatePodSandboxRequest
+       24,  // 139: nri.pkg.api.v1alpha1.Plugin.StateChange:input_type -> nri.pkg.api.v1alpha1.StateChangeEvent
+       25,  // 140: nri.pkg.api.v1alpha1.Plugin.ValidateContainerAdjustment:input_type -> nri.pkg.api.v1alpha1.ValidateContainerAdjustmentRequest
+       11,  // 141: nri.pkg.api.v1alpha1.HostFunctions.Log:input_type -> nri.pkg.api.v1alpha1.LogRequest
+       28,  // 142: nri.pkg.api.v1alpha1.Runtime.RegisterPlugin:output_type -> nri.pkg.api.v1alpha1.Empty
+       10,  // 143: nri.pkg.api.v1alpha1.Runtime.UpdateContainers:output_type -> nri.pkg.api.v1alpha1.UpdateContainersResponse
+       13,  // 144: nri.pkg.api.v1alpha1.Plugin.Configure:output_type -> nri.pkg.api.v1alpha1.ConfigureResponse
+       15,  // 145: nri.pkg.api.v1alpha1.Plugin.Synchronize:output_type -> nri.pkg.api.v1alpha1.SynchronizeResponse
+       28,  // 146: nri.pkg.api.v1alpha1.Plugin.Shutdown:output_type -> nri.pkg.api.v1alpha1.Empty
+       17,  // 147: nri.pkg.api.v1alpha1.Plugin.CreateContainer:output_type -> nri.pkg.api.v1alpha1.CreateContainerResponse
+       19,  // 148: nri.pkg.api.v1alpha1.Plugin.UpdateContainer:output_type -> nri.pkg.api.v1alpha1.UpdateContainerResponse
+       21,  // 149: nri.pkg.api.v1alpha1.Plugin.StopContainer:output_type -> nri.pkg.api.v1alpha1.StopContainerResponse
+       23,  // 150: nri.pkg.api.v1alpha1.Plugin.UpdatePodSandbox:output_type -> nri.pkg.api.v1alpha1.UpdatePodSandboxResponse
+       28,  // 151: nri.pkg.api.v1alpha1.Plugin.StateChange:output_type -> nri.pkg.api.v1alpha1.Empty
+       27,  // 152: nri.pkg.api.v1alpha1.Plugin.ValidateContainerAdjustment:output_type -> nri.pkg.api.v1alpha1.ValidateContainerAdjustmentResponse
+       28,  // 153: nri.pkg.api.v1alpha1.HostFunctions.Log:output_type -> nri.pkg.api.v1alpha1.Empty
+       142, // [142:154] is the sub-list for method output_type
+       130, // [130:142] is the sub-list for method input_type
+       130, // [130:130] is the sub-list for extension type_name
+       130, // [130:130] is the sub-list for extension extendee
+       0,   // [0:130] is the sub-list for field type_name
 }
 
 func init() { file_pkg_api_api_proto_init() }
@@ -6256,7 +6879,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*ContainerAdjustment); i {
+                       switch v := v.(*LinuxNetDevice); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6268,7 +6891,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*LinuxContainerAdjustment); i {
+                       switch v := v.(*LinuxScheduler); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6280,7 +6903,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*LinuxSeccomp); i {
+                       switch v := v.(*ContainerAdjustment); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6292,7 +6915,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*LinuxSyscall); i {
+                       switch v := v.(*LinuxContainerAdjustment); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6304,7 +6927,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*LinuxSeccompArg); i {
+                       switch v := v.(*LinuxSeccomp); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6316,7 +6939,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*ContainerUpdate); i {
+                       switch v := v.(*LinuxSyscall); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6328,7 +6951,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*LinuxContainerUpdate); i {
+                       switch v := v.(*LinuxSeccompArg); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6340,7 +6963,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*ContainerEviction); i {
+                       switch v := v.(*ContainerUpdate); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6352,7 +6975,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*KeyValue); i {
+                       switch v := v.(*LinuxContainerUpdate); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6364,7 +6987,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalString); i {
+                       switch v := v.(*ContainerEviction); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6376,7 +6999,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalInt); i {
+                       switch v := v.(*LinuxRdt); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6388,7 +7011,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalInt32); i {
+                       switch v := v.(*KeyValue); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6400,7 +7023,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalUInt32); i {
+                       switch v := v.(*OptionalString); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6412,7 +7035,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalInt64); i {
+                       switch v := v.(*OptionalRepeatedString); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6424,7 +7047,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalUInt64); i {
+                       switch v := v.(*OptionalInt); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6436,7 +7059,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalBool); i {
+                       switch v := v.(*OptionalInt32); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6448,7 +7071,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*OptionalFileMode); i {
+                       switch v := v.(*OptionalUInt32); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6460,7 +7083,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*CompoundFieldOwners); i {
+                       switch v := v.(*OptionalInt64); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6472,7 +7095,7 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} {
-                       switch v := v.(*FieldOwners); i {
+                       switch v := v.(*OptionalUInt64); i {
                        case 0:
                                return &v.state
                        case 1:
@@ -6484,6 +7107,54 @@ func file_pkg_api_api_proto_init() {
                        }
                }
                file_pkg_api_api_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*OptionalBool); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_pkg_api_api_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*OptionalFileMode); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_pkg_api_api_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*CompoundFieldOwners); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_pkg_api_api_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} {
+                       switch v := v.(*FieldOwners); i {
+                       case 0:
+                               return &v.state
+                       case 1:
+                               return &v.sizeCache
+                       case 2:
+                               return &v.unknownFields
+                       default:
+                               return nil
+                       }
+               }
+               file_pkg_api_api_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} {
                        switch v := v.(*OwningPlugins); i {
                        case 0:
                                return &v.state
@@ -6501,8 +7172,8 @@ func file_pkg_api_api_proto_init() {
                File: protoimpl.DescBuilder{
                        GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
                        RawDescriptor: file_pkg_api_api_proto_rawDesc,
-                       NumEnums:      6,
-                       NumMessages:   71,
+                       NumEnums:      8,
+                       NumMessages:   79,
                        NumExtensions: 0,
                        NumServices:   3,
                },
index 211db7cca1aab945b539bc9263fb4e1cbb7a3e3d..d5c584fe99de764cf3538fb4c39cadb9b93ff7c2 100644 (file)
@@ -377,6 +377,10 @@ message LinuxContainer {
   LinuxIOPriority io_priority = 6;
   SecurityProfile seccomp_profile = 7;
   LinuxSeccomp seccomp_policy = 8;
+  map<string, string> sysctl = 9;
+  map<string, LinuxNetDevice> net_devices = 10;
+  LinuxScheduler scheduler = 11;
+  LinuxRdt rdt = 12;
 }
 
 // A linux namespace.
@@ -495,6 +499,44 @@ enum IOPrioClass {
   IOPRIO_CLASS_IDLE = 3;
 }
 
+// A linux network device.
+message LinuxNetDevice {
+  string name = 1;
+}
+
+// Linux process scheduling attributes.
+message LinuxScheduler {
+  LinuxSchedulerPolicy policy = 1;
+  int32 nice = 2;
+  int32 priority = 3;
+  repeated LinuxSchedulerFlag flags = 4;
+  uint64 runtime = 5;
+  uint64 deadline = 6;
+  uint64 period = 7;
+}
+
+// Linux scheduling policies.
+enum LinuxSchedulerPolicy {
+  SCHED_NONE = 0;
+  SCHED_OTHER = 1;
+  SCHED_FIFO = 2;
+  SCHED_RR = 3;
+  SCHED_BATCH = 4;
+  SCHED_ISO = 5;
+  SCHED_IDLE = 6;
+  SCHED_DEADLINE = 7;
+}
+
+enum LinuxSchedulerFlag {
+  SCHED_FLAG_RESET_ON_FORK = 0;
+  SCHED_FLAG_RECLAIM = 1;
+  SCHED_FLAG_DL_OVERRUN = 2;
+  SCHED_FLAG_KEEP_POLICY = 3;
+  SCHED_FLAG_KEEP_PARAMS = 4;
+  SCHED_FLAG_UTIL_CLAMP_MIN = 5;
+  SCHED_FLAG_UTIL_CLAMP_MAX = 6;
+}
+
 // Requested adjustments to a container being created.
 message ContainerAdjustment {
   map<string, string> annotations = 2;
@@ -516,6 +558,10 @@ message LinuxContainerAdjustment {
   LinuxIOPriority io_priority = 5;
   LinuxSeccomp seccomp_policy = 6;
   repeated LinuxNamespace namespaces = 7;
+  map<string, string> sysctl = 8;
+  map<string,LinuxNetDevice> net_devices = 9;
+  LinuxScheduler scheduler = 10;
+  LinuxRdt rdt = 11;
 }
 
 message LinuxSeccomp {
@@ -562,6 +608,14 @@ message ContainerEviction {
   string reason = 2;
 }
 
+message LinuxRdt {
+  OptionalString clos_id = 1;
+  OptionalRepeatedString schemata = 2;
+  OptionalBool enable_monitoring = 3;
+  // NRI specific field to mark the RDT config for removal.
+  bool remove = 4;
+}
+
 // KeyValue represents an environment variable.
 message KeyValue {
   string key = 1;
@@ -573,6 +627,11 @@ message OptionalString {
   string value = 1;
 }
 
+// An optional collection of strings.
+message OptionalRepeatedString {
+  repeated string value = 1;
+}
+
 // An optional signed integer value.
 message OptionalInt {
   int64 value = 1;
@@ -673,4 +732,11 @@ enum Field {
     IoPriority = 31;
     SeccompPolicy = 32;
     Namespace = 33;
+    Sysctl = 34;
+    LinuxNetDevices = 35;
+    // protoc scoping rules: calling this LinuxScheduler would conflict with message.
+    LinuxSched = 36;
+    RdtClosID = 37;
+    RdtSchemata = 38;
+    RdtEnableMonitoring = 39;
 }
index 125f1a80826ab8ff5d634981b3cf329046b52862..869096b232482fc12c9e59fbc2bf11f01ea7a75e 100644 (file)
@@ -1889,6 +1889,67 @@ func (m *LinuxContainer) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
                i -= len(m.unknownFields)
                copy(dAtA[i:], m.unknownFields)
        }
+       if m.Rdt != nil {
+               size, err := m.Rdt.MarshalToSizedBufferVT(dAtA[:i])
+               if err != nil {
+                       return 0, err
+               }
+               i -= size
+               i = encodeVarint(dAtA, i, uint64(size))
+               i--
+               dAtA[i] = 0x62
+       }
+       if m.Scheduler != nil {
+               size, err := m.Scheduler.MarshalToSizedBufferVT(dAtA[:i])
+               if err != nil {
+                       return 0, err
+               }
+               i -= size
+               i = encodeVarint(dAtA, i, uint64(size))
+               i--
+               dAtA[i] = 0x5a
+       }
+       if len(m.NetDevices) > 0 {
+               for k := range m.NetDevices {
+                       v := m.NetDevices[k]
+                       baseI := i
+                       size, err := v.MarshalToSizedBufferVT(dAtA[:i])
+                       if err != nil {
+                               return 0, err
+                       }
+                       i -= size
+                       i = encodeVarint(dAtA, i, uint64(size))
+                       i--
+                       dAtA[i] = 0x12
+                       i -= len(k)
+                       copy(dAtA[i:], k)
+                       i = encodeVarint(dAtA, i, uint64(len(k)))
+                       i--
+                       dAtA[i] = 0xa
+                       i = encodeVarint(dAtA, i, uint64(baseI-i))
+                       i--
+                       dAtA[i] = 0x52
+               }
+       }
+       if len(m.Sysctl) > 0 {
+               for k := range m.Sysctl {
+                       v := m.Sysctl[k]
+                       baseI := i
+                       i -= len(v)
+                       copy(dAtA[i:], v)
+                       i = encodeVarint(dAtA, i, uint64(len(v)))
+                       i--
+                       dAtA[i] = 0x12
+                       i -= len(k)
+                       copy(dAtA[i:], k)
+                       i = encodeVarint(dAtA, i, uint64(len(k)))
+                       i--
+                       dAtA[i] = 0xa
+                       i = encodeVarint(dAtA, i, uint64(baseI-i))
+                       i--
+                       dAtA[i] = 0x4a
+               }
+       }
        if m.SeccompPolicy != nil {
                size, err := m.SeccompPolicy.MarshalToSizedBufferVT(dAtA[:i])
                if err != nil {
@@ -2844,6 +2905,130 @@ func (m *LinuxIOPriority) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
        return len(dAtA) - i, nil
 }
 
+func (m *LinuxNetDevice) MarshalVT() (dAtA []byte, err error) {
+       if m == nil {
+               return nil, nil
+       }
+       size := m.SizeVT()
+       dAtA = make([]byte, size)
+       n, err := m.MarshalToSizedBufferVT(dAtA[:size])
+       if err != nil {
+               return nil, err
+       }
+       return dAtA[:n], nil
+}
+
+func (m *LinuxNetDevice) MarshalToVT(dAtA []byte) (int, error) {
+       size := m.SizeVT()
+       return m.MarshalToSizedBufferVT(dAtA[:size])
+}
+
+func (m *LinuxNetDevice) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+       if m == nil {
+               return 0, nil
+       }
+       i := len(dAtA)
+       _ = i
+       var l int
+       _ = l
+       if m.unknownFields != nil {
+               i -= len(m.unknownFields)
+               copy(dAtA[i:], m.unknownFields)
+       }
+       if len(m.Name) > 0 {
+               i -= len(m.Name)
+               copy(dAtA[i:], m.Name)
+               i = encodeVarint(dAtA, i, uint64(len(m.Name)))
+               i--
+               dAtA[i] = 0xa
+       }
+       return len(dAtA) - i, nil
+}
+
+func (m *LinuxScheduler) MarshalVT() (dAtA []byte, err error) {
+       if m == nil {
+               return nil, nil
+       }
+       size := m.SizeVT()
+       dAtA = make([]byte, size)
+       n, err := m.MarshalToSizedBufferVT(dAtA[:size])
+       if err != nil {
+               return nil, err
+       }
+       return dAtA[:n], nil
+}
+
+func (m *LinuxScheduler) MarshalToVT(dAtA []byte) (int, error) {
+       size := m.SizeVT()
+       return m.MarshalToSizedBufferVT(dAtA[:size])
+}
+
+func (m *LinuxScheduler) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+       if m == nil {
+               return 0, nil
+       }
+       i := len(dAtA)
+       _ = i
+       var l int
+       _ = l
+       if m.unknownFields != nil {
+               i -= len(m.unknownFields)
+               copy(dAtA[i:], m.unknownFields)
+       }
+       if m.Period != 0 {
+               i = encodeVarint(dAtA, i, uint64(m.Period))
+               i--
+               dAtA[i] = 0x38
+       }
+       if m.Deadline != 0 {
+               i = encodeVarint(dAtA, i, uint64(m.Deadline))
+               i--
+               dAtA[i] = 0x30
+       }
+       if m.Runtime != 0 {
+               i = encodeVarint(dAtA, i, uint64(m.Runtime))
+               i--
+               dAtA[i] = 0x28
+       }
+       if len(m.Flags) > 0 {
+               var pksize2 int
+               for _, num := range m.Flags {
+                       pksize2 += sov(uint64(num))
+               }
+               i -= pksize2
+               j1 := i
+               for _, num1 := range m.Flags {
+                       num := uint64(num1)
+                       for num >= 1<<7 {
+                               dAtA[j1] = uint8(uint64(num)&0x7f | 0x80)
+                               num >>= 7
+                               j1++
+                       }
+                       dAtA[j1] = uint8(num)
+                       j1++
+               }
+               i = encodeVarint(dAtA, i, uint64(pksize2))
+               i--
+               dAtA[i] = 0x22
+       }
+       if m.Priority != 0 {
+               i = encodeVarint(dAtA, i, uint64(m.Priority))
+               i--
+               dAtA[i] = 0x18
+       }
+       if m.Nice != 0 {
+               i = encodeVarint(dAtA, i, uint64(m.Nice))
+               i--
+               dAtA[i] = 0x10
+       }
+       if m.Policy != 0 {
+               i = encodeVarint(dAtA, i, uint64(m.Policy))
+               i--
+               dAtA[i] = 0x8
+       }
+       return len(dAtA) - i, nil
+}
+
 func (m *ContainerAdjustment) MarshalVT() (dAtA []byte, err error) {
        if m == nil {
                return nil, nil
@@ -3003,6 +3188,67 @@ func (m *LinuxContainerAdjustment) MarshalToSizedBufferVT(dAtA []byte) (int, err
                i -= len(m.unknownFields)
                copy(dAtA[i:], m.unknownFields)
        }
+       if m.Rdt != nil {
+               size, err := m.Rdt.MarshalToSizedBufferVT(dAtA[:i])
+               if err != nil {
+                       return 0, err
+               }
+               i -= size
+               i = encodeVarint(dAtA, i, uint64(size))
+               i--
+               dAtA[i] = 0x5a
+       }
+       if m.Scheduler != nil {
+               size, err := m.Scheduler.MarshalToSizedBufferVT(dAtA[:i])
+               if err != nil {
+                       return 0, err
+               }
+               i -= size
+               i = encodeVarint(dAtA, i, uint64(size))
+               i--
+               dAtA[i] = 0x52
+       }
+       if len(m.NetDevices) > 0 {
+               for k := range m.NetDevices {
+                       v := m.NetDevices[k]
+                       baseI := i
+                       size, err := v.MarshalToSizedBufferVT(dAtA[:i])
+                       if err != nil {
+                               return 0, err
+                       }
+                       i -= size
+                       i = encodeVarint(dAtA, i, uint64(size))
+                       i--
+                       dAtA[i] = 0x12
+                       i -= len(k)
+                       copy(dAtA[i:], k)
+                       i = encodeVarint(dAtA, i, uint64(len(k)))
+                       i--
+                       dAtA[i] = 0xa
+                       i = encodeVarint(dAtA, i, uint64(baseI-i))
+                       i--
+                       dAtA[i] = 0x4a
+               }
+       }
+       if len(m.Sysctl) > 0 {
+               for k := range m.Sysctl {
+                       v := m.Sysctl[k]
+                       baseI := i
+                       i -= len(v)
+                       copy(dAtA[i:], v)
+                       i = encodeVarint(dAtA, i, uint64(len(v)))
+                       i--
+                       dAtA[i] = 0x12
+                       i -= len(k)
+                       copy(dAtA[i:], k)
+                       i = encodeVarint(dAtA, i, uint64(len(k)))
+                       i--
+                       dAtA[i] = 0xa
+                       i = encodeVarint(dAtA, i, uint64(baseI-i))
+                       i--
+                       dAtA[i] = 0x42
+               }
+       }
        if len(m.Namespaces) > 0 {
                for iNdEx := len(m.Namespaces) - 1; iNdEx >= 0; iNdEx-- {
                        size, err := m.Namespaces[iNdEx].MarshalToSizedBufferVT(dAtA[:i])
@@ -3447,7 +3693,7 @@ func (m *ContainerEviction) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
        return len(dAtA) - i, nil
 }
 
-func (m *KeyValue) MarshalVT() (dAtA []byte, err error) {
+func (m *LinuxRdt) MarshalVT() (dAtA []byte, err error) {
        if m == nil {
                return nil, nil
        }
@@ -3460,12 +3706,12 @@ func (m *KeyValue) MarshalVT() (dAtA []byte, err error) {
        return dAtA[:n], nil
 }
 
-func (m *KeyValue) MarshalToVT(dAtA []byte) (int, error) {
+func (m *LinuxRdt) MarshalToVT(dAtA []byte) (int, error) {
        size := m.SizeVT()
        return m.MarshalToSizedBufferVT(dAtA[:size])
 }
 
-func (m *KeyValue) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+func (m *LinuxRdt) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
        if m == nil {
                return 0, nil
        }
@@ -3477,24 +3723,50 @@ func (m *KeyValue) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
                i -= len(m.unknownFields)
                copy(dAtA[i:], m.unknownFields)
        }
-       if len(m.Value) > 0 {
-               i -= len(m.Value)
-               copy(dAtA[i:], m.Value)
-               i = encodeVarint(dAtA, i, uint64(len(m.Value)))
+       if m.Remove {
+               i--
+               if m.Remove {
+                       dAtA[i] = 1
+               } else {
+                       dAtA[i] = 0
+               }
+               i--
+               dAtA[i] = 0x20
+       }
+       if m.EnableMonitoring != nil {
+               size, err := m.EnableMonitoring.MarshalToSizedBufferVT(dAtA[:i])
+               if err != nil {
+                       return 0, err
+               }
+               i -= size
+               i = encodeVarint(dAtA, i, uint64(size))
+               i--
+               dAtA[i] = 0x1a
+       }
+       if m.Schemata != nil {
+               size, err := m.Schemata.MarshalToSizedBufferVT(dAtA[:i])
+               if err != nil {
+                       return 0, err
+               }
+               i -= size
+               i = encodeVarint(dAtA, i, uint64(size))
                i--
                dAtA[i] = 0x12
        }
-       if len(m.Key) > 0 {
-               i -= len(m.Key)
-               copy(dAtA[i:], m.Key)
-               i = encodeVarint(dAtA, i, uint64(len(m.Key)))
+       if m.ClosId != nil {
+               size, err := m.ClosId.MarshalToSizedBufferVT(dAtA[:i])
+               if err != nil {
+                       return 0, err
+               }
+               i -= size
+               i = encodeVarint(dAtA, i, uint64(size))
                i--
                dAtA[i] = 0xa
        }
        return len(dAtA) - i, nil
 }
 
-func (m *OptionalString) MarshalVT() (dAtA []byte, err error) {
+func (m *KeyValue) MarshalVT() (dAtA []byte, err error) {
        if m == nil {
                return nil, nil
        }
@@ -3507,12 +3779,12 @@ func (m *OptionalString) MarshalVT() (dAtA []byte, err error) {
        return dAtA[:n], nil
 }
 
-func (m *OptionalString) MarshalToVT(dAtA []byte) (int, error) {
+func (m *KeyValue) MarshalToVT(dAtA []byte) (int, error) {
        size := m.SizeVT()
        return m.MarshalToSizedBufferVT(dAtA[:size])
 }
 
-func (m *OptionalString) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+func (m *KeyValue) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
        if m == nil {
                return 0, nil
        }
@@ -3529,12 +3801,101 @@ func (m *OptionalString) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
                copy(dAtA[i:], m.Value)
                i = encodeVarint(dAtA, i, uint64(len(m.Value)))
                i--
+               dAtA[i] = 0x12
+       }
+       if len(m.Key) > 0 {
+               i -= len(m.Key)
+               copy(dAtA[i:], m.Key)
+               i = encodeVarint(dAtA, i, uint64(len(m.Key)))
+               i--
                dAtA[i] = 0xa
        }
        return len(dAtA) - i, nil
 }
 
-func (m *OptionalInt) MarshalVT() (dAtA []byte, err error) {
+func (m *OptionalString) MarshalVT() (dAtA []byte, err error) {
+       if m == nil {
+               return nil, nil
+       }
+       size := m.SizeVT()
+       dAtA = make([]byte, size)
+       n, err := m.MarshalToSizedBufferVT(dAtA[:size])
+       if err != nil {
+               return nil, err
+       }
+       return dAtA[:n], nil
+}
+
+func (m *OptionalString) MarshalToVT(dAtA []byte) (int, error) {
+       size := m.SizeVT()
+       return m.MarshalToSizedBufferVT(dAtA[:size])
+}
+
+func (m *OptionalString) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+       if m == nil {
+               return 0, nil
+       }
+       i := len(dAtA)
+       _ = i
+       var l int
+       _ = l
+       if m.unknownFields != nil {
+               i -= len(m.unknownFields)
+               copy(dAtA[i:], m.unknownFields)
+       }
+       if len(m.Value) > 0 {
+               i -= len(m.Value)
+               copy(dAtA[i:], m.Value)
+               i = encodeVarint(dAtA, i, uint64(len(m.Value)))
+               i--
+               dAtA[i] = 0xa
+       }
+       return len(dAtA) - i, nil
+}
+
+func (m *OptionalRepeatedString) MarshalVT() (dAtA []byte, err error) {
+       if m == nil {
+               return nil, nil
+       }
+       size := m.SizeVT()
+       dAtA = make([]byte, size)
+       n, err := m.MarshalToSizedBufferVT(dAtA[:size])
+       if err != nil {
+               return nil, err
+       }
+       return dAtA[:n], nil
+}
+
+func (m *OptionalRepeatedString) MarshalToVT(dAtA []byte) (int, error) {
+       size := m.SizeVT()
+       return m.MarshalToSizedBufferVT(dAtA[:size])
+}
+
+func (m *OptionalRepeatedString) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
+       if m == nil {
+               return 0, nil
+       }
+       i := len(dAtA)
+       _ = i
+       var l int
+       _ = l
+       if m.unknownFields != nil {
+               i -= len(m.unknownFields)
+               copy(dAtA[i:], m.unknownFields)
+       }
+       if len(m.Value) > 0 {
+               for iNdEx := len(m.Value) - 1; iNdEx >= 0; iNdEx-- {
+                       i -= len(m.Value[iNdEx])
+                       copy(dAtA[i:], m.Value[iNdEx])
+                       i = encodeVarint(dAtA, i, uint64(len(m.Value[iNdEx])))
+                       i--
+                       dAtA[i] = 0xa
+               }
+       }
+       return len(dAtA) - i, nil
+}
+
+func (m *OptionalInt) MarshalVT() (dAtA []byte, err error) {
        if m == nil {
                return nil, nil
        }
@@ -4756,6 +5117,35 @@ func (m *LinuxContainer) SizeVT() (n int) {
                l = m.SeccompPolicy.SizeVT()
                n += 1 + l + sov(uint64(l))
        }
+       if len(m.Sysctl) > 0 {
+               for k, v := range m.Sysctl {
+                       _ = k
+                       _ = v
+                       mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v)))
+                       n += mapEntrySize + 1 + sov(uint64(mapEntrySize))
+               }
+       }
+       if len(m.NetDevices) > 0 {
+               for k, v := range m.NetDevices {
+                       _ = k
+                       _ = v
+                       l = 0
+                       if v != nil {
+                               l = v.SizeVT()
+                       }
+                       l += 1 + sov(uint64(l))
+                       mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l
+                       n += mapEntrySize + 1 + sov(uint64(mapEntrySize))
+               }
+       }
+       if m.Scheduler != nil {
+               l = m.Scheduler.SizeVT()
+               n += 1 + l + sov(uint64(l))
+       }
+       if m.Rdt != nil {
+               l = m.Rdt.SizeVT()
+               n += 1 + l + sov(uint64(l))
+       }
        n += len(m.unknownFields)
        return n
 }
@@ -5093,6 +5483,55 @@ func (m *LinuxIOPriority) SizeVT() (n int) {
        return n
 }
 
+func (m *LinuxNetDevice) SizeVT() (n int) {
+       if m == nil {
+               return 0
+       }
+       var l int
+       _ = l
+       l = len(m.Name)
+       if l > 0 {
+               n += 1 + l + sov(uint64(l))
+       }
+       n += len(m.unknownFields)
+       return n
+}
+
+func (m *LinuxScheduler) SizeVT() (n int) {
+       if m == nil {
+               return 0
+       }
+       var l int
+       _ = l
+       if m.Policy != 0 {
+               n += 1 + sov(uint64(m.Policy))
+       }
+       if m.Nice != 0 {
+               n += 1 + sov(uint64(m.Nice))
+       }
+       if m.Priority != 0 {
+               n += 1 + sov(uint64(m.Priority))
+       }
+       if len(m.Flags) > 0 {
+               l = 0
+               for _, e := range m.Flags {
+                       l += sov(uint64(e))
+               }
+               n += 1 + sov(uint64(l)) + l
+       }
+       if m.Runtime != 0 {
+               n += 1 + sov(uint64(m.Runtime))
+       }
+       if m.Deadline != 0 {
+               n += 1 + sov(uint64(m.Deadline))
+       }
+       if m.Period != 0 {
+               n += 1 + sov(uint64(m.Period))
+       }
+       n += len(m.unknownFields)
+       return n
+}
+
 func (m *ContainerAdjustment) SizeVT() (n int) {
        if m == nil {
                return 0
@@ -5187,6 +5626,35 @@ func (m *LinuxContainerAdjustment) SizeVT() (n int) {
                        n += 1 + l + sov(uint64(l))
                }
        }
+       if len(m.Sysctl) > 0 {
+               for k, v := range m.Sysctl {
+                       _ = k
+                       _ = v
+                       mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + 1 + len(v) + sov(uint64(len(v)))
+                       n += mapEntrySize + 1 + sov(uint64(mapEntrySize))
+               }
+       }
+       if len(m.NetDevices) > 0 {
+               for k, v := range m.NetDevices {
+                       _ = k
+                       _ = v
+                       l = 0
+                       if v != nil {
+                               l = v.SizeVT()
+                       }
+                       l += 1 + sov(uint64(l))
+                       mapEntrySize := 1 + len(k) + sov(uint64(len(k))) + l
+                       n += mapEntrySize + 1 + sov(uint64(mapEntrySize))
+               }
+       }
+       if m.Scheduler != nil {
+               l = m.Scheduler.SizeVT()
+               n += 1 + l + sov(uint64(l))
+       }
+       if m.Rdt != nil {
+               l = m.Rdt.SizeVT()
+               n += 1 + l + sov(uint64(l))
+       }
        n += len(m.unknownFields)
        return n
 }
@@ -5341,6 +5809,31 @@ func (m *ContainerEviction) SizeVT() (n int) {
        return n
 }
 
+func (m *LinuxRdt) SizeVT() (n int) {
+       if m == nil {
+               return 0
+       }
+       var l int
+       _ = l
+       if m.ClosId != nil {
+               l = m.ClosId.SizeVT()
+               n += 1 + l + sov(uint64(l))
+       }
+       if m.Schemata != nil {
+               l = m.Schemata.SizeVT()
+               n += 1 + l + sov(uint64(l))
+       }
+       if m.EnableMonitoring != nil {
+               l = m.EnableMonitoring.SizeVT()
+               n += 1 + l + sov(uint64(l))
+       }
+       if m.Remove {
+               n += 2
+       }
+       n += len(m.unknownFields)
+       return n
+}
+
 func (m *KeyValue) SizeVT() (n int) {
        if m == nil {
                return 0
@@ -5373,6 +5866,22 @@ func (m *OptionalString) SizeVT() (n int) {
        return n
 }
 
+func (m *OptionalRepeatedString) SizeVT() (n int) {
+       if m == nil {
+               return 0
+       }
+       var l int
+       _ = l
+       if len(m.Value) > 0 {
+               for _, s := range m.Value {
+                       l = len(s)
+                       n += 1 + l + sov(uint64(l))
+               }
+       }
+       n += len(m.unknownFields)
+       return n
+}
+
 func (m *OptionalInt) SizeVT() (n int) {
        if m == nil {
                return 0
@@ -10698,62 +11207,11 @@ func (m *LinuxContainer) UnmarshalVT(dAtA []byte) error {
                                return err
                        }
                        iNdEx = postIndex
-               default:
-                       iNdEx = preIndex
-                       skippy, err := skip(dAtA[iNdEx:])
-                       if err != nil {
-                               return err
-                       }
-                       if (skippy < 0) || (iNdEx+skippy) < 0 {
-                               return ErrInvalidLength
-                       }
-                       if (iNdEx + skippy) > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
-                       iNdEx += skippy
-               }
-       }
-
-       if iNdEx > l {
-               return io.ErrUnexpectedEOF
-       }
-       return nil
-}
-func (m *LinuxNamespace) UnmarshalVT(dAtA []byte) error {
-       l := len(dAtA)
-       iNdEx := 0
-       for iNdEx < l {
-               preIndex := iNdEx
-               var wire uint64
-               for shift := uint(0); ; shift += 7 {
-                       if shift >= 64 {
-                               return ErrIntOverflow
-                       }
-                       if iNdEx >= l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       b := dAtA[iNdEx]
-                       iNdEx++
-                       wire |= uint64(b&0x7F) << shift
-                       if b < 0x80 {
-                               break
-                       }
-               }
-               fieldNum := int32(wire >> 3)
-               wireType := int(wire & 0x7)
-               if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxNamespace: wiretype end group for non-group")
-               }
-               if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxNamespace: illegal tag %d (wire type %d)", fieldNum, wire)
-               }
-               switch fieldNum {
-               case 1:
+               case 9:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Sysctl", wireType)
                        }
-                       var stringLen uint64
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -10763,55 +11221,695 @@ func (m *LinuxNamespace) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
+                       if msglen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + intStringLen
+                       postIndex := iNdEx + msglen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Type = string(dAtA[iNdEx:postIndex])
-                       iNdEx = postIndex
-               case 2:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType)
+                       if m.Sysctl == nil {
+                               m.Sysctl = make(map[string]string)
                        }
-                       var stringLen uint64
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
+                       var mapkey string
+                       var mapvalue string
+                       for iNdEx < postIndex {
+                               entryPreIndex := iNdEx
+                               var wire uint64
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       wire |= uint64(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               fieldNum := int32(wire >> 3)
+                               if fieldNum == 1 {
+                                       var stringLenmapkey uint64
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               stringLenmapkey |= uint64(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       intStringLenmapkey := int(stringLenmapkey)
+                                       if intStringLenmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postStringIndexmapkey := iNdEx + intStringLenmapkey
+                                       if postStringIndexmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postStringIndexmapkey > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+                                       iNdEx = postStringIndexmapkey
+                               } else if fieldNum == 2 {
+                                       var stringLenmapvalue uint64
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               stringLenmapvalue |= uint64(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       intStringLenmapvalue := int(stringLenmapvalue)
+                                       if intStringLenmapvalue < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postStringIndexmapvalue := iNdEx + intStringLenmapvalue
+                                       if postStringIndexmapvalue < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postStringIndexmapvalue > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
+                                       iNdEx = postStringIndexmapvalue
+                               } else {
+                                       iNdEx = entryPreIndex
+                                       skippy, err := skip(dAtA[iNdEx:])
+                                       if err != nil {
+                                               return err
+                                       }
+                                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if (iNdEx + skippy) > postIndex {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       iNdEx += skippy
+                               }
+                       }
+                       m.Sysctl[mapkey] = mapvalue
+                       iNdEx = postIndex
+               case 10:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field NetDevices", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.NetDevices == nil {
+                               m.NetDevices = make(map[string]*LinuxNetDevice)
+                       }
+                       var mapkey string
+                       var mapvalue *LinuxNetDevice
+                       for iNdEx < postIndex {
+                               entryPreIndex := iNdEx
+                               var wire uint64
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       wire |= uint64(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               fieldNum := int32(wire >> 3)
+                               if fieldNum == 1 {
+                                       var stringLenmapkey uint64
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               stringLenmapkey |= uint64(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       intStringLenmapkey := int(stringLenmapkey)
+                                       if intStringLenmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postStringIndexmapkey := iNdEx + intStringLenmapkey
+                                       if postStringIndexmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postStringIndexmapkey > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+                                       iNdEx = postStringIndexmapkey
+                               } else if fieldNum == 2 {
+                                       var mapmsglen int
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               mapmsglen |= int(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       if mapmsglen < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postmsgIndex := iNdEx + mapmsglen
+                                       if postmsgIndex < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postmsgIndex > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapvalue = &LinuxNetDevice{}
+                                       if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil {
+                                               return err
+                                       }
+                                       iNdEx = postmsgIndex
+                               } else {
+                                       iNdEx = entryPreIndex
+                                       skippy, err := skip(dAtA[iNdEx:])
+                                       if err != nil {
+                                               return err
+                                       }
+                                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if (iNdEx + skippy) > postIndex {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       iNdEx += skippy
+                               }
+                       }
+                       m.NetDevices[mapkey] = mapvalue
+                       iNdEx = postIndex
+               case 11:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Scheduler", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Scheduler == nil {
+                               m.Scheduler = &LinuxScheduler{}
+                       }
+                       if err := m.Scheduler.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 12:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Rdt", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Rdt == nil {
+                               m.Rdt = &LinuxRdt{}
+                       }
+                       if err := m.Rdt.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
+                               return err
+                       }
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                               return ErrInvalidLength
+                       }
+                       if (iNdEx + skippy) > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
+func (m *LinuxNamespace) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
+                       }
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: LinuxNamespace: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: LinuxNamespace: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
+                       }
+                       var stringLen uint64
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               stringLen |= uint64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + intStringLen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Type = string(dAtA[iNdEx:postIndex])
+                       iNdEx = postIndex
+               case 2:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType)
+                       }
+                       var stringLen uint64
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               stringLen |= uint64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + intStringLen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Path = string(dAtA[iNdEx:postIndex])
+                       iNdEx = postIndex
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
+                               return err
+                       }
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                               return ErrInvalidLength
+                       }
+                       if (iNdEx + skippy) > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
+func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
+                       }
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: LinuxDevice: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: LinuxDevice: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType)
+                       }
+                       var stringLen uint64
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               stringLen |= uint64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + intStringLen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Path = string(dAtA[iNdEx:postIndex])
+                       iNdEx = postIndex
+               case 2:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
+                       }
+                       var stringLen uint64
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               stringLen |= uint64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + intStringLen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Type = string(dAtA[iNdEx:postIndex])
+                       iNdEx = postIndex
+               case 3:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType)
+                       }
+                       m.Major = 0
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               m.Major |= int64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+               case 4:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType)
+                       }
+                       m.Minor = 0
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               m.Minor |= int64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+               case 5:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field FileMode", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.FileMode == nil {
+                               m.FileMode = &OptionalFileMode{}
+                       }
+                       if err := m.FileMode.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 6:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Uid == nil {
+                               m.Uid = &OptionalUInt32{}
+                       }
+                       if err := m.Uid.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 7:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Gid", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
                                }
                                if iNdEx >= l {
                                        return io.ErrUnexpectedEOF
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
+                       if msglen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + intStringLen
+                       postIndex := iNdEx + msglen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Path = string(dAtA[iNdEx:postIndex])
+                       if m.Gid == nil {
+                               m.Gid = &OptionalUInt32{}
+                       }
+                       if err := m.Gid.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
                        iNdEx = postIndex
                default:
                        iNdEx = preIndex
@@ -10835,7 +11933,7 @@ func (m *LinuxNamespace) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxDeviceCgroup) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -10858,15 +11956,35 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxDevice: wiretype end group for non-group")
+                       return fmt.Errorf("proto: LinuxDeviceCgroup: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxDevice: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: LinuxDeviceCgroup: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Allow", wireType)
+                       }
+                       var v int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               v |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       m.Allow = bool(v != 0)
+               case 2:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
                        }
                        var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
@@ -10894,13 +12012,13 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Path = string(dAtA[iNdEx:postIndex])
+                       m.Type = string(dAtA[iNdEx:postIndex])
                        iNdEx = postIndex
-               case 2:
+               case 3:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType)
                        }
-                       var stringLen uint64
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -10910,29 +12028,33 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
+                       if msglen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + intStringLen
+                       postIndex := iNdEx + msglen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Type = string(dAtA[iNdEx:postIndex])
+                       if m.Major == nil {
+                               m.Major = &OptionalInt64{}
+                       }
+                       if err := m.Major.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
                        iNdEx = postIndex
-               case 3:
-                       if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType)
+               case 4:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType)
                        }
-                       m.Major = 0
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -10942,16 +12064,33 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.Major |= int64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-               case 4:
-                       if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType)
+                       if msglen < 0 {
+                               return ErrInvalidLength
                        }
-                       m.Minor = 0
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Minor == nil {
+                               m.Minor = &OptionalInt64{}
+                       }
+                       if err := m.Minor.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 5:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Access", wireType)
+                       }
+                       var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -10961,16 +12100,80 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.Minor |= int64(b&0x7F) << shift
+                               stringLen |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-               case 5:
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + intStringLen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Access = string(dAtA[iNdEx:postIndex])
+                       iNdEx = postIndex
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
+                               return err
+                       }
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                               return ErrInvalidLength
+                       }
+                       if (iNdEx + skippy) > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
+func (m *CDIDevice) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
+                       }
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: CDIDevice: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: CDIDevice: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field FileMode", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
                        }
-                       var msglen int
+                       var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -10980,33 +12183,80 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               stringLen |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + msglen
+                       postIndex := iNdEx + intStringLen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.FileMode == nil {
-                               m.FileMode = &OptionalFileMode{}
-                       }
-                       if err := m.FileMode.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       m.Name = string(dAtA[iNdEx:postIndex])
+                       iNdEx = postIndex
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
                                return err
                        }
-                       iNdEx = postIndex
-               case 6:
-                       if wireType != 2 {
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                               return ErrInvalidLength
+                       }
+                       if (iNdEx + skippy) > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
+func (m *User) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
+                       }
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: User: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: User: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 0 {
                                return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType)
                        }
-                       var msglen int
+                       m.Uid = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -11016,33 +12266,16 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               m.Uid |= uint32(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
-                               return ErrInvalidLength
-                       }
-                       postIndex := iNdEx + msglen
-                       if postIndex < 0 {
-                               return ErrInvalidLength
-                       }
-                       if postIndex > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       if m.Uid == nil {
-                               m.Uid = &OptionalUInt32{}
-                       }
-                       if err := m.Uid.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
-                       }
-                       iNdEx = postIndex
-               case 7:
-                       if wireType != 2 {
+               case 2:
+                       if wireType != 0 {
                                return fmt.Errorf("proto: wrong wireType = %d for field Gid", wireType)
                        }
-                       var msglen int
+                       m.Gid = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -11052,28 +12285,87 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               m.Gid |= uint32(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
-                               return ErrInvalidLength
-                       }
-                       postIndex := iNdEx + msglen
-                       if postIndex < 0 {
-                               return ErrInvalidLength
-                       }
-                       if postIndex > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       if m.Gid == nil {
-                               m.Gid = &OptionalUInt32{}
-                       }
-                       if err := m.Gid.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
+               case 3:
+                       if wireType == 0 {
+                               var v uint32
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       v |= uint32(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               m.AdditionalGids = append(m.AdditionalGids, v)
+                       } else if wireType == 2 {
+                               var packedLen int
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       packedLen |= int(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               if packedLen < 0 {
+                                       return ErrInvalidLength
+                               }
+                               postIndex := iNdEx + packedLen
+                               if postIndex < 0 {
+                                       return ErrInvalidLength
+                               }
+                               if postIndex > l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               var elementCount int
+                               var count int
+                               for _, integer := range dAtA[iNdEx:postIndex] {
+                                       if integer < 128 {
+                                               count++
+                                       }
+                               }
+                               elementCount = count
+                               if elementCount != 0 && len(m.AdditionalGids) == 0 {
+                                       m.AdditionalGids = make([]uint32, 0, elementCount)
+                               }
+                               for iNdEx < postIndex {
+                                       var v uint32
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               v |= uint32(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       m.AdditionalGids = append(m.AdditionalGids, v)
+                               }
+                       } else {
+                               return fmt.Errorf("proto: wrong wireType = %d for field AdditionalGids", wireType)
                        }
-                       iNdEx = postIndex
                default:
                        iNdEx = preIndex
                        skippy, err := skip(dAtA[iNdEx:])
@@ -11096,7 +12388,7 @@ func (m *LinuxDevice) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *LinuxDeviceCgroup) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -11119,37 +12411,17 @@ func (m *LinuxDeviceCgroup) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxDeviceCgroup: wiretype end group for non-group")
+                       return fmt.Errorf("proto: LinuxResources: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxDeviceCgroup: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: LinuxResources: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
-                       if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Allow", wireType)
-                       }
-                       var v int
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
-                               }
-                               if iNdEx >= l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               b := dAtA[iNdEx]
-                               iNdEx++
-                               v |= int(b&0x7F) << shift
-                               if b < 0x80 {
-                                       break
-                               }
-                       }
-                       m.Allow = bool(v != 0)
-               case 2:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Memory", wireType)
                        }
-                       var stringLen uint64
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -11159,27 +12431,31 @@ func (m *LinuxDeviceCgroup) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
+                       if msglen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + intStringLen
+                       postIndex := iNdEx + msglen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Type = string(dAtA[iNdEx:postIndex])
+                       if m.Memory == nil {
+                               m.Memory = &LinuxMemory{}
+                       }
+                       if err := m.Memory.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
                        iNdEx = postIndex
-               case 3:
+               case 2:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Cpu", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11206,16 +12482,16 @@ func (m *LinuxDeviceCgroup) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Major == nil {
-                               m.Major = &OptionalInt64{}
+                       if m.Cpu == nil {
+                               m.Cpu = &LinuxCPU{}
                        }
-                       if err := m.Major.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Cpu.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
-               case 4:
+               case 3:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field HugepageLimits", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11242,18 +12518,16 @@ func (m *LinuxDeviceCgroup) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Minor == nil {
-                               m.Minor = &OptionalInt64{}
-                       }
-                       if err := m.Minor.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       m.HugepageLimits = append(m.HugepageLimits, &HugepageLimit{})
+                       if err := m.HugepageLimits[len(m.HugepageLimits)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
-               case 5:
+               case 4:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Access", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field BlockioClass", wireType)
                        }
-                       var stringLen uint64
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -11263,80 +12537,33 @@ func (m *LinuxDeviceCgroup) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
+                       if msglen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + intStringLen
+                       postIndex := iNdEx + msglen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Access = string(dAtA[iNdEx:postIndex])
-                       iNdEx = postIndex
-               default:
-                       iNdEx = preIndex
-                       skippy, err := skip(dAtA[iNdEx:])
-                       if err != nil {
-                               return err
-                       }
-                       if (skippy < 0) || (iNdEx+skippy) < 0 {
-                               return ErrInvalidLength
-                       }
-                       if (iNdEx + skippy) > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
-                       iNdEx += skippy
-               }
-       }
-
-       if iNdEx > l {
-               return io.ErrUnexpectedEOF
-       }
-       return nil
-}
-func (m *CDIDevice) UnmarshalVT(dAtA []byte) error {
-       l := len(dAtA)
-       iNdEx := 0
-       for iNdEx < l {
-               preIndex := iNdEx
-               var wire uint64
-               for shift := uint(0); ; shift += 7 {
-                       if shift >= 64 {
-                               return ErrIntOverflow
-                       }
-                       if iNdEx >= l {
-                               return io.ErrUnexpectedEOF
+                       if m.BlockioClass == nil {
+                               m.BlockioClass = &OptionalString{}
                        }
-                       b := dAtA[iNdEx]
-                       iNdEx++
-                       wire |= uint64(b&0x7F) << shift
-                       if b < 0x80 {
-                               break
+                       if err := m.BlockioClass.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
                        }
-               }
-               fieldNum := int32(wire >> 3)
-               wireType := int(wire & 0x7)
-               if wireType == 4 {
-                       return fmt.Errorf("proto: CDIDevice: wiretype end group for non-group")
-               }
-               if fieldNum <= 0 {
-                       return fmt.Errorf("proto: CDIDevice: illegal tag %d (wire type %d)", fieldNum, wire)
-               }
-               switch fieldNum {
-               case 1:
+                       iNdEx = postIndex
+               case 5:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field RdtClass", wireType)
                        }
-                       var stringLen uint64
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -11346,80 +12573,33 @@ func (m *CDIDevice) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
+                       if msglen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + intStringLen
+                       postIndex := iNdEx + msglen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Name = string(dAtA[iNdEx:postIndex])
-                       iNdEx = postIndex
-               default:
-                       iNdEx = preIndex
-                       skippy, err := skip(dAtA[iNdEx:])
-                       if err != nil {
-                               return err
-                       }
-                       if (skippy < 0) || (iNdEx+skippy) < 0 {
-                               return ErrInvalidLength
-                       }
-                       if (iNdEx + skippy) > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
-                       iNdEx += skippy
-               }
-       }
-
-       if iNdEx > l {
-               return io.ErrUnexpectedEOF
-       }
-       return nil
-}
-func (m *User) UnmarshalVT(dAtA []byte) error {
-       l := len(dAtA)
-       iNdEx := 0
-       for iNdEx < l {
-               preIndex := iNdEx
-               var wire uint64
-               for shift := uint(0); ; shift += 7 {
-                       if shift >= 64 {
-                               return ErrIntOverflow
-                       }
-                       if iNdEx >= l {
-                               return io.ErrUnexpectedEOF
+                       if m.RdtClass == nil {
+                               m.RdtClass = &OptionalString{}
                        }
-                       b := dAtA[iNdEx]
-                       iNdEx++
-                       wire |= uint64(b&0x7F) << shift
-                       if b < 0x80 {
-                               break
+                       if err := m.RdtClass.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
                        }
-               }
-               fieldNum := int32(wire >> 3)
-               wireType := int(wire & 0x7)
-               if wireType == 4 {
-                       return fmt.Errorf("proto: User: wiretype end group for non-group")
-               }
-               if fieldNum <= 0 {
-                       return fmt.Errorf("proto: User: illegal tag %d (wire type %d)", fieldNum, wire)
-               }
-               switch fieldNum {
-               case 1:
-                       if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType)
+                       iNdEx = postIndex
+               case 6:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Unified", wireType)
                        }
-                       m.Uid = 0
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -11429,33 +12609,29 @@ func (m *User) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.Uid |= uint32(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-               case 2:
-                       if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Gid", wireType)
+                       if msglen < 0 {
+                               return ErrInvalidLength
                        }
-                       m.Gid = 0
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
-                               }
-                               if iNdEx >= l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               b := dAtA[iNdEx]
-                               iNdEx++
-                               m.Gid |= uint32(b&0x7F) << shift
-                               if b < 0x80 {
-                                       break
-                               }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
                        }
-               case 3:
-                       if wireType == 0 {
-                               var v uint32
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Unified == nil {
+                               m.Unified = make(map[string]string)
+                       }
+                       var mapkey string
+                       var mapvalue string
+                       for iNdEx < postIndex {
+                               entryPreIndex := iNdEx
+                               var wire uint64
                                for shift := uint(0); ; shift += 7 {
                                        if shift >= 64 {
                                                return ErrIntOverflow
@@ -11465,51 +12641,43 @@ func (m *User) UnmarshalVT(dAtA []byte) error {
                                        }
                                        b := dAtA[iNdEx]
                                        iNdEx++
-                                       v |= uint32(b&0x7F) << shift
+                                       wire |= uint64(b&0x7F) << shift
                                        if b < 0x80 {
                                                break
                                        }
                                }
-                               m.AdditionalGids = append(m.AdditionalGids, v)
-                       } else if wireType == 2 {
-                               var packedLen int
-                               for shift := uint(0); ; shift += 7 {
-                                       if shift >= 64 {
-                                               return ErrIntOverflow
+                               fieldNum := int32(wire >> 3)
+                               if fieldNum == 1 {
+                                       var stringLenmapkey uint64
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               stringLenmapkey |= uint64(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
                                        }
-                                       if iNdEx >= l {
-                                               return io.ErrUnexpectedEOF
+                                       intStringLenmapkey := int(stringLenmapkey)
+                                       if intStringLenmapkey < 0 {
+                                               return ErrInvalidLength
                                        }
-                                       b := dAtA[iNdEx]
-                                       iNdEx++
-                                       packedLen |= int(b&0x7F) << shift
-                                       if b < 0x80 {
-                                               break
+                                       postStringIndexmapkey := iNdEx + intStringLenmapkey
+                                       if postStringIndexmapkey < 0 {
+                                               return ErrInvalidLength
                                        }
-                               }
-                               if packedLen < 0 {
-                                       return ErrInvalidLength
-                               }
-                               postIndex := iNdEx + packedLen
-                               if postIndex < 0 {
-                                       return ErrInvalidLength
-                               }
-                               if postIndex > l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               var elementCount int
-                               var count int
-                               for _, integer := range dAtA[iNdEx:postIndex] {
-                                       if integer < 128 {
-                                               count++
+                                       if postStringIndexmapkey > l {
+                                               return io.ErrUnexpectedEOF
                                        }
-                               }
-                               elementCount = count
-                               if elementCount != 0 && len(m.AdditionalGids) == 0 {
-                                       m.AdditionalGids = make([]uint32, 0, elementCount)
-                               }
-                               for iNdEx < postIndex {
-                                       var v uint32
+                                       mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+                                       iNdEx = postStringIndexmapkey
+                               } else if fieldNum == 2 {
+                                       var stringLenmapvalue uint64
                                        for shift := uint(0); ; shift += 7 {
                                                if shift >= 64 {
                                                        return ErrIntOverflow
@@ -11519,16 +12687,111 @@ func (m *User) UnmarshalVT(dAtA []byte) error {
                                                }
                                                b := dAtA[iNdEx]
                                                iNdEx++
-                                               v |= uint32(b&0x7F) << shift
+                                               stringLenmapvalue |= uint64(b&0x7F) << shift
                                                if b < 0x80 {
                                                        break
                                                }
                                        }
-                                       m.AdditionalGids = append(m.AdditionalGids, v)
+                                       intStringLenmapvalue := int(stringLenmapvalue)
+                                       if intStringLenmapvalue < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postStringIndexmapvalue := iNdEx + intStringLenmapvalue
+                                       if postStringIndexmapvalue < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postStringIndexmapvalue > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
+                                       iNdEx = postStringIndexmapvalue
+                               } else {
+                                       iNdEx = entryPreIndex
+                                       skippy, err := skip(dAtA[iNdEx:])
+                                       if err != nil {
+                                               return err
+                                       }
+                                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if (iNdEx + skippy) > postIndex {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       iNdEx += skippy
+                               }
+                       }
+                       m.Unified[mapkey] = mapvalue
+                       iNdEx = postIndex
+               case 7:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Devices = append(m.Devices, &LinuxDeviceCgroup{})
+                       if err := m.Devices[len(m.Devices)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 8:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Pids", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
                                }
-                       } else {
-                               return fmt.Errorf("proto: wrong wireType = %d for field AdditionalGids", wireType)
                        }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Pids == nil {
+                               m.Pids = &LinuxPids{}
+                       }
+                       if err := m.Pids.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
                default:
                        iNdEx = preIndex
                        skippy, err := skip(dAtA[iNdEx:])
@@ -11551,7 +12814,7 @@ func (m *User) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -11574,15 +12837,15 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxResources: wiretype end group for non-group")
+                       return fmt.Errorf("proto: LinuxMemory: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxResources: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: LinuxMemory: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Memory", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11609,16 +12872,16 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Memory == nil {
-                               m.Memory = &LinuxMemory{}
+                       if m.Limit == nil {
+                               m.Limit = &OptionalInt64{}
                        }
-                       if err := m.Memory.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Limit.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 2:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Cpu", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Reservation", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11645,16 +12908,16 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Cpu == nil {
-                               m.Cpu = &LinuxCPU{}
+                       if m.Reservation == nil {
+                               m.Reservation = &OptionalInt64{}
                        }
-                       if err := m.Cpu.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Reservation.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 3:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field HugepageLimits", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Swap", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11681,14 +12944,16 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.HugepageLimits = append(m.HugepageLimits, &HugepageLimit{})
-                       if err := m.HugepageLimits[len(m.HugepageLimits)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if m.Swap == nil {
+                               m.Swap = &OptionalInt64{}
+                       }
+                       if err := m.Swap.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 4:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field BlockioClass", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Kernel", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11715,16 +12980,16 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.BlockioClass == nil {
-                               m.BlockioClass = &OptionalString{}
+                       if m.Kernel == nil {
+                               m.Kernel = &OptionalInt64{}
                        }
-                       if err := m.BlockioClass.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Kernel.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 5:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field RdtClass", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field KernelTcp", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11751,16 +13016,16 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.RdtClass == nil {
-                               m.RdtClass = &OptionalString{}
+                       if m.KernelTcp == nil {
+                               m.KernelTcp = &OptionalInt64{}
                        }
-                       if err := m.RdtClass.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.KernelTcp.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 6:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Unified", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Swappiness", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11787,107 +13052,16 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Unified == nil {
-                               m.Unified = make(map[string]string)
+                       if m.Swappiness == nil {
+                               m.Swappiness = &OptionalUInt64{}
                        }
-                       var mapkey string
-                       var mapvalue string
-                       for iNdEx < postIndex {
-                               entryPreIndex := iNdEx
-                               var wire uint64
-                               for shift := uint(0); ; shift += 7 {
-                                       if shift >= 64 {
-                                               return ErrIntOverflow
-                                       }
-                                       if iNdEx >= l {
-                                               return io.ErrUnexpectedEOF
-                                       }
-                                       b := dAtA[iNdEx]
-                                       iNdEx++
-                                       wire |= uint64(b&0x7F) << shift
-                                       if b < 0x80 {
-                                               break
-                                       }
-                               }
-                               fieldNum := int32(wire >> 3)
-                               if fieldNum == 1 {
-                                       var stringLenmapkey uint64
-                                       for shift := uint(0); ; shift += 7 {
-                                               if shift >= 64 {
-                                                       return ErrIntOverflow
-                                               }
-                                               if iNdEx >= l {
-                                                       return io.ErrUnexpectedEOF
-                                               }
-                                               b := dAtA[iNdEx]
-                                               iNdEx++
-                                               stringLenmapkey |= uint64(b&0x7F) << shift
-                                               if b < 0x80 {
-                                                       break
-                                               }
-                                       }
-                                       intStringLenmapkey := int(stringLenmapkey)
-                                       if intStringLenmapkey < 0 {
-                                               return ErrInvalidLength
-                                       }
-                                       postStringIndexmapkey := iNdEx + intStringLenmapkey
-                                       if postStringIndexmapkey < 0 {
-                                               return ErrInvalidLength
-                                       }
-                                       if postStringIndexmapkey > l {
-                                               return io.ErrUnexpectedEOF
-                                       }
-                                       mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
-                                       iNdEx = postStringIndexmapkey
-                               } else if fieldNum == 2 {
-                                       var stringLenmapvalue uint64
-                                       for shift := uint(0); ; shift += 7 {
-                                               if shift >= 64 {
-                                                       return ErrIntOverflow
-                                               }
-                                               if iNdEx >= l {
-                                                       return io.ErrUnexpectedEOF
-                                               }
-                                               b := dAtA[iNdEx]
-                                               iNdEx++
-                                               stringLenmapvalue |= uint64(b&0x7F) << shift
-                                               if b < 0x80 {
-                                                       break
-                                               }
-                                       }
-                                       intStringLenmapvalue := int(stringLenmapvalue)
-                                       if intStringLenmapvalue < 0 {
-                                               return ErrInvalidLength
-                                       }
-                                       postStringIndexmapvalue := iNdEx + intStringLenmapvalue
-                                       if postStringIndexmapvalue < 0 {
-                                               return ErrInvalidLength
-                                       }
-                                       if postStringIndexmapvalue > l {
-                                               return io.ErrUnexpectedEOF
-                                       }
-                                       mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
-                                       iNdEx = postStringIndexmapvalue
-                               } else {
-                                       iNdEx = entryPreIndex
-                                       skippy, err := skip(dAtA[iNdEx:])
-                                       if err != nil {
-                                               return err
-                                       }
-                                       if (skippy < 0) || (iNdEx+skippy) < 0 {
-                                               return ErrInvalidLength
-                                       }
-                                       if (iNdEx + skippy) > postIndex {
-                                               return io.ErrUnexpectedEOF
-                                       }
-                                       iNdEx += skippy
-                               }
+                       if err := m.Swappiness.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
                        }
-                       m.Unified[mapkey] = mapvalue
                        iNdEx = postIndex
                case 7:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field DisableOomKiller", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11914,14 +13088,16 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Devices = append(m.Devices, &LinuxDeviceCgroup{})
-                       if err := m.Devices[len(m.Devices)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if m.DisableOomKiller == nil {
+                               m.DisableOomKiller = &OptionalBool{}
+                       }
+                       if err := m.DisableOomKiller.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 8:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Pids", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field UseHierarchy", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -11948,10 +13124,10 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Pids == nil {
-                               m.Pids = &LinuxPids{}
+                       if m.UseHierarchy == nil {
+                               m.UseHierarchy = &OptionalBool{}
                        }
-                       if err := m.Pids.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.UseHierarchy.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
@@ -11977,7 +13153,7 @@ func (m *LinuxResources) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -12000,15 +13176,15 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxMemory: wiretype end group for non-group")
+                       return fmt.Errorf("proto: LinuxCPU: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxMemory: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: LinuxCPU: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Shares", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -12035,16 +13211,16 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Limit == nil {
-                               m.Limit = &OptionalInt64{}
+                       if m.Shares == nil {
+                               m.Shares = &OptionalUInt64{}
                        }
-                       if err := m.Limit.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Shares.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 2:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Reservation", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Quota", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -12071,16 +13247,16 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Reservation == nil {
-                               m.Reservation = &OptionalInt64{}
+                       if m.Quota == nil {
+                               m.Quota = &OptionalInt64{}
                        }
-                       if err := m.Reservation.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Quota.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 3:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Swap", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -12107,52 +13283,16 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Swap == nil {
-                               m.Swap = &OptionalInt64{}
+                       if m.Period == nil {
+                               m.Period = &OptionalUInt64{}
                        }
-                       if err := m.Swap.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Period.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
                case 4:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Kernel", wireType)
-                       }
-                       var msglen int
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
-                               }
-                               if iNdEx >= l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               b := dAtA[iNdEx]
-                               iNdEx++
-                               msglen |= int(b&0x7F) << shift
-                               if b < 0x80 {
-                                       break
-                               }
-                       }
-                       if msglen < 0 {
-                               return ErrInvalidLength
-                       }
-                       postIndex := iNdEx + msglen
-                       if postIndex < 0 {
-                               return ErrInvalidLength
-                       }
-                       if postIndex > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       if m.Kernel == nil {
-                               m.Kernel = &OptionalInt64{}
-                       }
-                       if err := m.Kernel.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
-                       }
-                       iNdEx = postIndex
-               case 5:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field KernelTcp", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field RealtimeRuntime", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -12179,16 +13319,16 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.KernelTcp == nil {
-                               m.KernelTcp = &OptionalInt64{}
-                       }
-                       if err := m.KernelTcp.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if m.RealtimeRuntime == nil {
+                               m.RealtimeRuntime = &OptionalInt64{}
+                       }
+                       if err := m.RealtimeRuntime.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
-               case 6:
+               case 5:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Swappiness", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field RealtimePeriod", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -12215,18 +13355,18 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Swappiness == nil {
-                               m.Swappiness = &OptionalUInt64{}
+                       if m.RealtimePeriod == nil {
+                               m.RealtimePeriod = &OptionalUInt64{}
                        }
-                       if err := m.Swappiness.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.RealtimePeriod.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
-               case 7:
+               case 6:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field DisableOomKiller", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Cpus", wireType)
                        }
-                       var msglen int
+                       var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12236,33 +13376,29 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               stringLen |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + msglen
+                       postIndex := iNdEx + intStringLen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.DisableOomKiller == nil {
-                               m.DisableOomKiller = &OptionalBool{}
-                       }
-                       if err := m.DisableOomKiller.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
-                       }
+                       m.Cpus = string(dAtA[iNdEx:postIndex])
                        iNdEx = postIndex
-               case 8:
+               case 7:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field UseHierarchy", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Mems", wireType)
                        }
-                       var msglen int
+                       var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12272,27 +13408,23 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               stringLen |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + msglen
+                       postIndex := iNdEx + intStringLen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.UseHierarchy == nil {
-                               m.UseHierarchy = &OptionalBool{}
-                       }
-                       if err := m.UseHierarchy.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
-                       }
+                       m.Mems = string(dAtA[iNdEx:postIndex])
                        iNdEx = postIndex
                default:
                        iNdEx = preIndex
@@ -12316,7 +13448,7 @@ func (m *LinuxMemory) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
+func (m *HugepageLimit) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -12339,17 +13471,17 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxCPU: wiretype end group for non-group")
+                       return fmt.Errorf("proto: HugepageLimit: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxCPU: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: HugepageLimit: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Shares", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field PageSize", wireType)
                        }
-                       var msglen int
+                       var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12359,33 +13491,29 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               stringLen |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + msglen
+                       postIndex := iNdEx + intStringLen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Shares == nil {
-                               m.Shares = &OptionalUInt64{}
-                       }
-                       if err := m.Shares.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
-                       }
+                       m.PageSize = string(dAtA[iNdEx:postIndex])
                        iNdEx = postIndex
                case 2:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Quota", wireType)
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType)
                        }
-                       var msglen int
+                       m.Limit = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12395,33 +13523,67 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               m.Limit |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
-                               return ErrInvalidLength
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
+                               return err
                        }
-                       postIndex := iNdEx + msglen
-                       if postIndex < 0 {
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
                                return ErrInvalidLength
                        }
-                       if postIndex > l {
+                       if (iNdEx + skippy) > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Quota == nil {
-                               m.Quota = &OptionalInt64{}
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
+func (m *SecurityProfile) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
                        }
-                       if err := m.Quota.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
                        }
-                       iNdEx = postIndex
-               case 3:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType)
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
                        }
-                       var msglen int
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: SecurityProfile: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: SecurityProfile: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field ProfileType", wireType)
+                       }
+                       m.ProfileType = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12431,33 +13593,16 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               m.ProfileType |= SecurityProfile_ProfileType(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
-                               return ErrInvalidLength
-                       }
-                       postIndex := iNdEx + msglen
-                       if postIndex < 0 {
-                               return ErrInvalidLength
-                       }
-                       if postIndex > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       if m.Period == nil {
-                               m.Period = &OptionalUInt64{}
-                       }
-                       if err := m.Period.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
-                       }
-                       iNdEx = postIndex
-               case 4:
+               case 2:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field RealtimeRuntime", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field LocalhostRef", wireType)
                        }
-                       var msglen int
+                       var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12467,67 +13612,78 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               msglen |= int(b&0x7F) << shift
+                               stringLen |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       if msglen < 0 {
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + msglen
+                       postIndex := iNdEx + intStringLen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.RealtimeRuntime == nil {
-                               m.RealtimeRuntime = &OptionalInt64{}
-                       }
-                       if err := m.RealtimeRuntime.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
-                       }
+                       m.LocalhostRef = string(dAtA[iNdEx:postIndex])
                        iNdEx = postIndex
-               case 5:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field RealtimePeriod", wireType)
-                       }
-                       var msglen int
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
-                               }
-                               if iNdEx >= l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               b := dAtA[iNdEx]
-                               iNdEx++
-                               msglen |= int(b&0x7F) << shift
-                               if b < 0x80 {
-                                       break
-                               }
-                       }
-                       if msglen < 0 {
-                               return ErrInvalidLength
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
+                               return err
                        }
-                       postIndex := iNdEx + msglen
-                       if postIndex < 0 {
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
                                return ErrInvalidLength
                        }
-                       if postIndex > l {
+                       if (iNdEx + skippy) > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.RealtimePeriod == nil {
-                               m.RealtimePeriod = &OptionalUInt64{}
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
+func (m *POSIXRlimit) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
                        }
-                       if err := m.RealtimePeriod.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
                        }
-                       iNdEx = postIndex
-               case 6:
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: POSIXRlimit: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: POSIXRlimit: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Cpus", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
                        }
                        var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
@@ -12555,13 +13711,13 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Cpus = string(dAtA[iNdEx:postIndex])
+                       m.Type = string(dAtA[iNdEx:postIndex])
                        iNdEx = postIndex
-               case 7:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Mems", wireType)
+               case 2:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Hard", wireType)
                        }
-                       var stringLen uint64
+                       m.Hard = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12571,24 +13727,30 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               m.Hard |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
-                               return ErrInvalidLength
-                       }
-                       postIndex := iNdEx + intStringLen
-                       if postIndex < 0 {
-                               return ErrInvalidLength
+               case 3:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Soft", wireType)
                        }
-                       if postIndex > l {
-                               return io.ErrUnexpectedEOF
+                       m.Soft = 0
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               m.Soft |= uint64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
                        }
-                       m.Mems = string(dAtA[iNdEx:postIndex])
-                       iNdEx = postIndex
                default:
                        iNdEx = preIndex
                        skippy, err := skip(dAtA[iNdEx:])
@@ -12611,7 +13773,7 @@ func (m *LinuxCPU) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *HugepageLimit) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxPids) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -12634,45 +13796,13 @@ func (m *HugepageLimit) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: HugepageLimit: wiretype end group for non-group")
+                       return fmt.Errorf("proto: LinuxPids: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: HugepageLimit: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: LinuxPids: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field PageSize", wireType)
-                       }
-                       var stringLen uint64
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
-                               }
-                               if iNdEx >= l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               b := dAtA[iNdEx]
-                               iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
-                               if b < 0x80 {
-                                       break
-                               }
-                       }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
-                               return ErrInvalidLength
-                       }
-                       postIndex := iNdEx + intStringLen
-                       if postIndex < 0 {
-                               return ErrInvalidLength
-                       }
-                       if postIndex > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       m.PageSize = string(dAtA[iNdEx:postIndex])
-                       iNdEx = postIndex
-               case 2:
                        if wireType != 0 {
                                return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType)
                        }
@@ -12686,7 +13816,7 @@ func (m *HugepageLimit) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.Limit |= uint64(b&0x7F) << shift
+                               m.Limit |= int64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
@@ -12713,7 +13843,7 @@ func (m *HugepageLimit) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *SecurityProfile) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxIOPriority) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -12736,17 +13866,17 @@ func (m *SecurityProfile) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: SecurityProfile: wiretype end group for non-group")
+                       return fmt.Errorf("proto: LinuxIOPriority: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: SecurityProfile: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: LinuxIOPriority: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
                        if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field ProfileType", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Class", wireType)
                        }
-                       m.ProfileType = 0
+                       m.Class = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12756,16 +13886,16 @@ func (m *SecurityProfile) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.ProfileType |= SecurityProfile_ProfileType(b&0x7F) << shift
+                               m.Class |= IOPrioClass(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
                case 2:
-                       if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field LocalhostRef", wireType)
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType)
                        }
-                       var stringLen uint64
+                       m.Priority = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12775,24 +13905,11 @@ func (m *SecurityProfile) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               m.Priority |= int32(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
-                               return ErrInvalidLength
-                       }
-                       postIndex := iNdEx + intStringLen
-                       if postIndex < 0 {
-                               return ErrInvalidLength
-                       }
-                       if postIndex > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       m.LocalhostRef = string(dAtA[iNdEx:postIndex])
-                       iNdEx = postIndex
                default:
                        iNdEx = preIndex
                        skippy, err := skip(dAtA[iNdEx:])
@@ -12815,7 +13932,7 @@ func (m *SecurityProfile) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *POSIXRlimit) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxNetDevice) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -12838,15 +13955,15 @@ func (m *POSIXRlimit) UnmarshalVT(dAtA []byte) error {
                fieldNum := int32(wire >> 3)
                wireType := int(wire & 0x7)
                if wireType == 4 {
-                       return fmt.Errorf("proto: POSIXRlimit: wiretype end group for non-group")
+                       return fmt.Errorf("proto: LinuxNetDevice: wiretype end group for non-group")
                }
                if fieldNum <= 0 {
-                       return fmt.Errorf("proto: POSIXRlimit: illegal tag %d (wire type %d)", fieldNum, wire)
+                       return fmt.Errorf("proto: LinuxNetDevice: illegal tag %d (wire type %d)", fieldNum, wire)
                }
                switch fieldNum {
                case 1:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType)
                        }
                        var stringLen uint64
                        for shift := uint(0); ; shift += 7 {
@@ -12874,46 +13991,8 @@ func (m *POSIXRlimit) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Type = string(dAtA[iNdEx:postIndex])
+                       m.Name = string(dAtA[iNdEx:postIndex])
                        iNdEx = postIndex
-               case 2:
-                       if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Hard", wireType)
-                       }
-                       m.Hard = 0
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
-                               }
-                               if iNdEx >= l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               b := dAtA[iNdEx]
-                               iNdEx++
-                               m.Hard |= uint64(b&0x7F) << shift
-                               if b < 0x80 {
-                                       break
-                               }
-                       }
-               case 3:
-                       if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Soft", wireType)
-                       }
-                       m.Soft = 0
-                       for shift := uint(0); ; shift += 7 {
-                               if shift >= 64 {
-                                       return ErrIntOverflow
-                               }
-                               if iNdEx >= l {
-                                       return io.ErrUnexpectedEOF
-                               }
-                               b := dAtA[iNdEx]
-                               iNdEx++
-                               m.Soft |= uint64(b&0x7F) << shift
-                               if b < 0x80 {
-                                       break
-                               }
-                       }
                default:
                        iNdEx = preIndex
                        skippy, err := skip(dAtA[iNdEx:])
@@ -12936,7 +14015,7 @@ func (m *POSIXRlimit) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
-func (m *LinuxPids) UnmarshalVT(dAtA []byte) error {
+func (m *LinuxScheduler) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
        for iNdEx < l {
@@ -12955,21 +14034,147 @@ func (m *LinuxPids) UnmarshalVT(dAtA []byte) error {
                        if b < 0x80 {
                                break
                        }
-               }
-               fieldNum := int32(wire >> 3)
-               wireType := int(wire & 0x7)
-               if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxPids: wiretype end group for non-group")
-               }
-               if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxPids: illegal tag %d (wire type %d)", fieldNum, wire)
-               }
-               switch fieldNum {
-               case 1:
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: LinuxScheduler: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: LinuxScheduler: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Policy", wireType)
+                       }
+                       m.Policy = 0
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               m.Policy |= LinuxSchedulerPolicy(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+               case 2:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Nice", wireType)
+                       }
+                       m.Nice = 0
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               m.Nice |= int32(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+               case 3:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType)
+                       }
+                       m.Priority = 0
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               m.Priority |= int32(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+               case 4:
+                       if wireType == 0 {
+                               var v LinuxSchedulerFlag
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       v |= LinuxSchedulerFlag(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               m.Flags = append(m.Flags, v)
+                       } else if wireType == 2 {
+                               var packedLen int
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       packedLen |= int(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               if packedLen < 0 {
+                                       return ErrInvalidLength
+                               }
+                               postIndex := iNdEx + packedLen
+                               if postIndex < 0 {
+                                       return ErrInvalidLength
+                               }
+                               if postIndex > l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               var elementCount int
+                               if elementCount != 0 && len(m.Flags) == 0 {
+                                       m.Flags = make([]LinuxSchedulerFlag, 0, elementCount)
+                               }
+                               for iNdEx < postIndex {
+                                       var v LinuxSchedulerFlag
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               v |= LinuxSchedulerFlag(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       m.Flags = append(m.Flags, v)
+                               }
+                       } else {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Flags", wireType)
+                       }
+               case 5:
                        if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Limit", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Runtime", wireType)
                        }
-                       m.Limit = 0
+                       m.Runtime = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -12979,67 +14184,16 @@ func (m *LinuxPids) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.Limit |= int64(b&0x7F) << shift
+                               m.Runtime |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-               default:
-                       iNdEx = preIndex
-                       skippy, err := skip(dAtA[iNdEx:])
-                       if err != nil {
-                               return err
-                       }
-                       if (skippy < 0) || (iNdEx+skippy) < 0 {
-                               return ErrInvalidLength
-                       }
-                       if (iNdEx + skippy) > l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
-                       iNdEx += skippy
-               }
-       }
-
-       if iNdEx > l {
-               return io.ErrUnexpectedEOF
-       }
-       return nil
-}
-func (m *LinuxIOPriority) UnmarshalVT(dAtA []byte) error {
-       l := len(dAtA)
-       iNdEx := 0
-       for iNdEx < l {
-               preIndex := iNdEx
-               var wire uint64
-               for shift := uint(0); ; shift += 7 {
-                       if shift >= 64 {
-                               return ErrIntOverflow
-                       }
-                       if iNdEx >= l {
-                               return io.ErrUnexpectedEOF
-                       }
-                       b := dAtA[iNdEx]
-                       iNdEx++
-                       wire |= uint64(b&0x7F) << shift
-                       if b < 0x80 {
-                               break
-                       }
-               }
-               fieldNum := int32(wire >> 3)
-               wireType := int(wire & 0x7)
-               if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxIOPriority: wiretype end group for non-group")
-               }
-               if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxIOPriority: illegal tag %d (wire type %d)", fieldNum, wire)
-               }
-               switch fieldNum {
-               case 1:
+               case 6:
                        if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Class", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Deadline", wireType)
                        }
-                       m.Class = 0
+                       m.Deadline = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -13049,16 +14203,16 @@ func (m *LinuxIOPriority) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.Class |= IOPrioClass(b&0x7F) << shift
+                               m.Deadline |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-               case 2:
+               case 7:
                        if wireType != 0 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Period", wireType)
                        }
-                       m.Priority = 0
+                       m.Period = 0
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -13068,7 +14222,7 @@ func (m *LinuxIOPriority) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               m.Priority |= int32(b&0x7F) << shift
+                               m.Period |= uint64(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
@@ -13523,28 +14677,166 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                        if shift >= 64 {
                                return ErrIntOverflow
                        }
-                       if iNdEx >= l {
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: LinuxContainerAdjustment: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: LinuxContainerAdjustment: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Devices = append(m.Devices, &LinuxDevice{})
+                       if err := m.Devices[len(m.Devices)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 2:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Resources == nil {
+                               m.Resources = &LinuxResources{}
+                       }
+                       if err := m.Resources.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 3:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field CgroupsPath", wireType)
+                       }
+                       var stringLen uint64
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               stringLen |= uint64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + intStringLen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.CgroupsPath = string(dAtA[iNdEx:postIndex])
+                       iNdEx = postIndex
+               case 4:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field OomScoreAdj", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       b := dAtA[iNdEx]
-                       iNdEx++
-                       wire |= uint64(b&0x7F) << shift
-                       if b < 0x80 {
-                               break
+                       if m.OomScoreAdj == nil {
+                               m.OomScoreAdj = &OptionalInt{}
                        }
-               }
-               fieldNum := int32(wire >> 3)
-               wireType := int(wire & 0x7)
-               if wireType == 4 {
-                       return fmt.Errorf("proto: LinuxContainerAdjustment: wiretype end group for non-group")
-               }
-               if fieldNum <= 0 {
-                       return fmt.Errorf("proto: LinuxContainerAdjustment: illegal tag %d (wire type %d)", fieldNum, wire)
-               }
-               switch fieldNum {
-               case 1:
+                       if err := m.OomScoreAdj.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 5:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field IoPriority", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -13571,14 +14863,16 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Devices = append(m.Devices, &LinuxDevice{})
-                       if err := m.Devices[len(m.Devices)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if m.IoPriority == nil {
+                               m.IoPriority = &LinuxIOPriority{}
+                       }
+                       if err := m.IoPriority.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
-               case 2:
+               case 6:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Resources", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field SeccompPolicy", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -13605,18 +14899,18 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.Resources == nil {
-                               m.Resources = &LinuxResources{}
+                       if m.SeccompPolicy == nil {
+                               m.SeccompPolicy = &LinuxSeccomp{}
                        }
-                       if err := m.Resources.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.SeccompPolicy.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
-               case 3:
+               case 7:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field CgroupsPath", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Namespaces", wireType)
                        }
-                       var stringLen uint64
+                       var msglen int
                        for shift := uint(0); ; shift += 7 {
                                if shift >= 64 {
                                        return ErrIntOverflow
@@ -13626,27 +14920,29 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                                }
                                b := dAtA[iNdEx]
                                iNdEx++
-                               stringLen |= uint64(b&0x7F) << shift
+                               msglen |= int(b&0x7F) << shift
                                if b < 0x80 {
                                        break
                                }
                        }
-                       intStringLen := int(stringLen)
-                       if intStringLen < 0 {
+                       if msglen < 0 {
                                return ErrInvalidLength
                        }
-                       postIndex := iNdEx + intStringLen
+                       postIndex := iNdEx + msglen
                        if postIndex < 0 {
                                return ErrInvalidLength
                        }
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.CgroupsPath = string(dAtA[iNdEx:postIndex])
+                       m.Namespaces = append(m.Namespaces, &LinuxNamespace{})
+                       if err := m.Namespaces[len(m.Namespaces)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
                        iNdEx = postIndex
-               case 4:
+               case 8:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field OomScoreAdj", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Sysctl", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -13673,16 +14969,107 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.OomScoreAdj == nil {
-                               m.OomScoreAdj = &OptionalInt{}
+                       if m.Sysctl == nil {
+                               m.Sysctl = make(map[string]string)
                        }
-                       if err := m.OomScoreAdj.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
+                       var mapkey string
+                       var mapvalue string
+                       for iNdEx < postIndex {
+                               entryPreIndex := iNdEx
+                               var wire uint64
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       wire |= uint64(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               fieldNum := int32(wire >> 3)
+                               if fieldNum == 1 {
+                                       var stringLenmapkey uint64
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               stringLenmapkey |= uint64(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       intStringLenmapkey := int(stringLenmapkey)
+                                       if intStringLenmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postStringIndexmapkey := iNdEx + intStringLenmapkey
+                                       if postStringIndexmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postStringIndexmapkey > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+                                       iNdEx = postStringIndexmapkey
+                               } else if fieldNum == 2 {
+                                       var stringLenmapvalue uint64
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               stringLenmapvalue |= uint64(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       intStringLenmapvalue := int(stringLenmapvalue)
+                                       if intStringLenmapvalue < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postStringIndexmapvalue := iNdEx + intStringLenmapvalue
+                                       if postStringIndexmapvalue < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postStringIndexmapvalue > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue])
+                                       iNdEx = postStringIndexmapvalue
+                               } else {
+                                       iNdEx = entryPreIndex
+                                       skippy, err := skip(dAtA[iNdEx:])
+                                       if err != nil {
+                                               return err
+                                       }
+                                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if (iNdEx + skippy) > postIndex {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       iNdEx += skippy
+                               }
                        }
+                       m.Sysctl[mapkey] = mapvalue
                        iNdEx = postIndex
-               case 5:
+               case 9:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field IoPriority", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field NetDevices", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -13709,16 +15096,109 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.IoPriority == nil {
-                               m.IoPriority = &LinuxIOPriority{}
+                       if m.NetDevices == nil {
+                               m.NetDevices = make(map[string]*LinuxNetDevice)
                        }
-                       if err := m.IoPriority.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
-                               return err
+                       var mapkey string
+                       var mapvalue *LinuxNetDevice
+                       for iNdEx < postIndex {
+                               entryPreIndex := iNdEx
+                               var wire uint64
+                               for shift := uint(0); ; shift += 7 {
+                                       if shift >= 64 {
+                                               return ErrIntOverflow
+                                       }
+                                       if iNdEx >= l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       b := dAtA[iNdEx]
+                                       iNdEx++
+                                       wire |= uint64(b&0x7F) << shift
+                                       if b < 0x80 {
+                                               break
+                                       }
+                               }
+                               fieldNum := int32(wire >> 3)
+                               if fieldNum == 1 {
+                                       var stringLenmapkey uint64
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               stringLenmapkey |= uint64(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       intStringLenmapkey := int(stringLenmapkey)
+                                       if intStringLenmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postStringIndexmapkey := iNdEx + intStringLenmapkey
+                                       if postStringIndexmapkey < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postStringIndexmapkey > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapkey = string(dAtA[iNdEx:postStringIndexmapkey])
+                                       iNdEx = postStringIndexmapkey
+                               } else if fieldNum == 2 {
+                                       var mapmsglen int
+                                       for shift := uint(0); ; shift += 7 {
+                                               if shift >= 64 {
+                                                       return ErrIntOverflow
+                                               }
+                                               if iNdEx >= l {
+                                                       return io.ErrUnexpectedEOF
+                                               }
+                                               b := dAtA[iNdEx]
+                                               iNdEx++
+                                               mapmsglen |= int(b&0x7F) << shift
+                                               if b < 0x80 {
+                                                       break
+                                               }
+                                       }
+                                       if mapmsglen < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       postmsgIndex := iNdEx + mapmsglen
+                                       if postmsgIndex < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if postmsgIndex > l {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       mapvalue = &LinuxNetDevice{}
+                                       if err := mapvalue.UnmarshalVT(dAtA[iNdEx:postmsgIndex]); err != nil {
+                                               return err
+                                       }
+                                       iNdEx = postmsgIndex
+                               } else {
+                                       iNdEx = entryPreIndex
+                                       skippy, err := skip(dAtA[iNdEx:])
+                                       if err != nil {
+                                               return err
+                                       }
+                                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                                               return ErrInvalidLength
+                                       }
+                                       if (iNdEx + skippy) > postIndex {
+                                               return io.ErrUnexpectedEOF
+                                       }
+                                       iNdEx += skippy
+                               }
                        }
+                       m.NetDevices[mapkey] = mapvalue
                        iNdEx = postIndex
-               case 6:
+               case 10:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field SeccompPolicy", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Scheduler", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -13745,16 +15225,16 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       if m.SeccompPolicy == nil {
-                               m.SeccompPolicy = &LinuxSeccomp{}
+                       if m.Scheduler == nil {
+                               m.Scheduler = &LinuxScheduler{}
                        }
-                       if err := m.SeccompPolicy.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if err := m.Scheduler.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
-               case 7:
+               case 11:
                        if wireType != 2 {
-                               return fmt.Errorf("proto: wrong wireType = %d for field Namespaces", wireType)
+                               return fmt.Errorf("proto: wrong wireType = %d for field Rdt", wireType)
                        }
                        var msglen int
                        for shift := uint(0); ; shift += 7 {
@@ -13781,8 +15261,10 @@ func (m *LinuxContainerAdjustment) UnmarshalVT(dAtA []byte) error {
                        if postIndex > l {
                                return io.ErrUnexpectedEOF
                        }
-                       m.Namespaces = append(m.Namespaces, &LinuxNamespace{})
-                       if err := m.Namespaces[len(m.Namespaces)-1].UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                       if m.Rdt == nil {
+                               m.Rdt = &LinuxRdt{}
+                       }
+                       if err := m.Rdt.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
                                return err
                        }
                        iNdEx = postIndex
@@ -14755,6 +16237,185 @@ func (m *ContainerEviction) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
+func (m *LinuxRdt) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
+                       }
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: LinuxRdt: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: LinuxRdt: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field ClosId", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.ClosId == nil {
+                               m.ClosId = &OptionalString{}
+                       }
+                       if err := m.ClosId.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 2:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Schemata", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.Schemata == nil {
+                               m.Schemata = &OptionalRepeatedString{}
+                       }
+                       if err := m.Schemata.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 3:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field EnableMonitoring", wireType)
+                       }
+                       var msglen int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               msglen |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       if msglen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + msglen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       if m.EnableMonitoring == nil {
+                               m.EnableMonitoring = &OptionalBool{}
+                       }
+                       if err := m.EnableMonitoring.UnmarshalVT(dAtA[iNdEx:postIndex]); err != nil {
+                               return err
+                       }
+                       iNdEx = postIndex
+               case 4:
+                       if wireType != 0 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Remove", wireType)
+                       }
+                       var v int
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               v |= int(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       m.Remove = bool(v != 0)
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
+                               return err
+                       }
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                               return ErrInvalidLength
+                       }
+                       if (iNdEx + skippy) > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
 func (m *KeyValue) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
@@ -14953,6 +16614,89 @@ func (m *OptionalString) UnmarshalVT(dAtA []byte) error {
        }
        return nil
 }
+func (m *OptionalRepeatedString) UnmarshalVT(dAtA []byte) error {
+       l := len(dAtA)
+       iNdEx := 0
+       for iNdEx < l {
+               preIndex := iNdEx
+               var wire uint64
+               for shift := uint(0); ; shift += 7 {
+                       if shift >= 64 {
+                               return ErrIntOverflow
+                       }
+                       if iNdEx >= l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       b := dAtA[iNdEx]
+                       iNdEx++
+                       wire |= uint64(b&0x7F) << shift
+                       if b < 0x80 {
+                               break
+                       }
+               }
+               fieldNum := int32(wire >> 3)
+               wireType := int(wire & 0x7)
+               if wireType == 4 {
+                       return fmt.Errorf("proto: OptionalRepeatedString: wiretype end group for non-group")
+               }
+               if fieldNum <= 0 {
+                       return fmt.Errorf("proto: OptionalRepeatedString: illegal tag %d (wire type %d)", fieldNum, wire)
+               }
+               switch fieldNum {
+               case 1:
+                       if wireType != 2 {
+                               return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType)
+                       }
+                       var stringLen uint64
+                       for shift := uint(0); ; shift += 7 {
+                               if shift >= 64 {
+                                       return ErrIntOverflow
+                               }
+                               if iNdEx >= l {
+                                       return io.ErrUnexpectedEOF
+                               }
+                               b := dAtA[iNdEx]
+                               iNdEx++
+                               stringLen |= uint64(b&0x7F) << shift
+                               if b < 0x80 {
+                                       break
+                               }
+                       }
+                       intStringLen := int(stringLen)
+                       if intStringLen < 0 {
+                               return ErrInvalidLength
+                       }
+                       postIndex := iNdEx + intStringLen
+                       if postIndex < 0 {
+                               return ErrInvalidLength
+                       }
+                       if postIndex > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.Value = append(m.Value, string(dAtA[iNdEx:postIndex]))
+                       iNdEx = postIndex
+               default:
+                       iNdEx = preIndex
+                       skippy, err := skip(dAtA[iNdEx:])
+                       if err != nil {
+                               return err
+                       }
+                       if (skippy < 0) || (iNdEx+skippy) < 0 {
+                               return ErrInvalidLength
+                       }
+                       if (iNdEx + skippy) > l {
+                               return io.ErrUnexpectedEOF
+                       }
+                       m.unknownFields = append(m.unknownFields, dAtA[iNdEx:iNdEx+skippy]...)
+                       iNdEx += skippy
+               }
+       }
+
+       if iNdEx > l {
+               return io.ErrUnexpectedEOF
+       }
+       return nil
+}
 func (m *OptionalInt) UnmarshalVT(dAtA []byte) error {
        l := len(dAtA)
        iNdEx := 0
diff --git a/vendor/github.com/containerd/nri/pkg/api/linux-scheduler.go b/vendor/github.com/containerd/nri/pkg/api/linux-scheduler.go
new file mode 100644 (file)
index 0000000..2a13a91
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+   Copyright The containerd Authors.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+package api
+
+import (
+       rspec "github.com/opencontainers/runtime-spec/specs-go"
+)
+
+// FromOCILinuxScheduler returns a LinuxScheduler corresponding to the OCI
+// Scheduler.
+func FromOCILinuxScheduler(o *rspec.Scheduler) *LinuxScheduler {
+       if o == nil {
+               return nil
+       }
+
+       sch := &LinuxScheduler{
+               Policy:   FromOCISchedulerPolicy(o.Policy),
+               Nice:     o.Nice,
+               Priority: o.Priority,
+               Flags:    FromOCILinuxSchedulerFlags(o.Flags),
+               Runtime:  o.Runtime,
+               Deadline: o.Deadline,
+               Period:   o.Period,
+       }
+
+       return sch
+}
+
+// ToOCI returns the OCI Scheduler corresponding to the LinuxScheduler.
+func (sch *LinuxScheduler) ToOCI() *rspec.Scheduler {
+       if sch == nil {
+               return nil
+       }
+
+       if sch.Policy == LinuxSchedulerPolicy_SCHED_NONE {
+               return nil
+       }
+
+       return &rspec.Scheduler{
+               Policy:   sch.Policy.ToOCI(),
+               Nice:     sch.Nice,
+               Priority: sch.Priority,
+               Flags:    ToOCILinuxSchedulerFlags(sch.Flags),
+               Runtime:  sch.Runtime,
+               Deadline: sch.Deadline,
+               Period:   sch.Period,
+       }
+}
+
+// FromOCISchedulerPolicy returns the SchedulerPolicy corresponding to the
+// given OCI SchedulerPolicy.
+func FromOCISchedulerPolicy(o rspec.LinuxSchedulerPolicy) LinuxSchedulerPolicy {
+       return LinuxSchedulerPolicy(LinuxSchedulerPolicy_value[string(o)])
+}
+
+// ToOCI returns the OCI SchedulerPolicy corresponding to the given
+// SchedulerPolicy.
+func (p LinuxSchedulerPolicy) ToOCI() rspec.LinuxSchedulerPolicy {
+       if p == LinuxSchedulerPolicy_SCHED_NONE {
+               return rspec.LinuxSchedulerPolicy("")
+       }
+       return rspec.LinuxSchedulerPolicy(LinuxSchedulerPolicy_name[int32(p)])
+}
+
+// FromOCILinuxSchedulerFlags returns the LinuxSchedulerFlags corresponding to
+// the given OCI LinuxSchedulerFlags.
+func FromOCILinuxSchedulerFlags(o []rspec.LinuxSchedulerFlag) []LinuxSchedulerFlag {
+       if o == nil {
+               return nil
+       }
+
+       flags := make([]LinuxSchedulerFlag, len(o))
+       for i, f := range o {
+               flags[i] = LinuxSchedulerFlag(LinuxSchedulerFlag_value[string(f)])
+       }
+
+       return flags
+}
+
+// ToOCILinuxSchedulerFlags returns the OCI LinuxSchedulerFlags corresponding
+// to the LinuxSchedulerFlags.
+func ToOCILinuxSchedulerFlags(f []LinuxSchedulerFlag) []rspec.LinuxSchedulerFlag {
+       if f == nil {
+               return nil
+       }
+
+       flags := make([]rspec.LinuxSchedulerFlag, len(f))
+       for i, f := range f {
+               flags[i] = rspec.LinuxSchedulerFlag(LinuxSchedulerFlag_name[int32(f)])
+       }
+
+       return flags
+}
diff --git a/vendor/github.com/containerd/nri/pkg/api/net-device.go b/vendor/github.com/containerd/nri/pkg/api/net-device.go
new file mode 100644 (file)
index 0000000..83260ad
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+   Copyright The containerd Authors.
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+*/
+
+package api
+
+import (
+       rspec "github.com/opencontainers/runtime-spec/specs-go"
+)
+
+// FromOCILinuxNetDevice returns a LinuxNetDevice for the given OCI LinuxNetDevice.
+func FromOCILinuxNetDevice(o rspec.LinuxNetDevice) *LinuxNetDevice {
+       return &LinuxNetDevice{
+               Name: o.Name,
+       }
+}
+
+// FromOCILinuxNetDevices returns LinuxNetDevice's for the given OCI LinuxNetDevice's.
+func FromOCILinuxNetDevices(o map[string]rspec.LinuxNetDevice) map[string]*LinuxNetDevice {
+       if len(o) == 0 {
+               return nil
+       }
+
+       devices := make(map[string]*LinuxNetDevice, len(o))
+       for host, dev := range o {
+               devices[host] = FromOCILinuxNetDevice(dev)
+       }
+
+       return devices
+}
+
+// ToOCI returns the OCI LinuxNetDevice corresponding to the LinuxNetDevice.
+func (d *LinuxNetDevice) ToOCI() rspec.LinuxNetDevice {
+       if d == nil {
+               return rspec.LinuxNetDevice{}
+       }
+
+       return rspec.LinuxNetDevice{
+               Name: d.Name,
+       }
+}
+
+// ToOCILinuxNetDevices returns the OCI LinuxNetDevice's corresponding to the LinuxNetDevice's.
+func ToOCILinuxNetDevices(devices map[string]*LinuxNetDevice) map[string]rspec.LinuxNetDevice {
+       if devices == nil {
+               return nil
+       }
+
+       o := make(map[string]rspec.LinuxNetDevice, len(devices))
+       for host, dev := range devices {
+               o[host] = dev.ToOCI()
+       }
+
+       return o
+}
index c8020f45f8a35a1677a9c2db4ee2b3220962044c..16eb91d3ecff7cc7b5d76d34d0acd2e6aad5e5ef 100644 (file)
@@ -18,6 +18,7 @@ package api
 
 import (
        "os"
+       "slices"
 )
 
 //
@@ -71,6 +72,41 @@ func (o *OptionalString) Get() *string {
        return &v
 }
 
+// RepeatedString creates an Optional wrapper from its argument.
+func RepeatedString(v interface{}) *OptionalRepeatedString {
+       var value []string
+
+       switch o := v.(type) {
+       case []string:
+               value = o
+       case *[]string:
+               if o == nil {
+                       return nil
+               }
+               value = *o
+       case *OptionalRepeatedString:
+               if o == nil {
+                       return nil
+               }
+               value = o.Value
+       default:
+               return nil
+       }
+
+       return &OptionalRepeatedString{
+               Value: slices.Clone(value),
+       }
+}
+
+// Get returns nil if its value is unset or a pointer to a copy of the value.
+func (o *OptionalRepeatedString) Get() *[]string {
+       if o == nil {
+               return nil
+       }
+       v := slices.Clone(o.Value)
+       return &v
+}
+
 // Int creates an Optional wrapper from its argument.
 func Int(v interface{}) *OptionalInt {
        var value int64
index 63f2d9b1e362cf847fc49a4c1e009effc2345859..05c1e7c97a6fe295ac6e22e07f73b00452bbb6e6 100644 (file)
@@ -148,6 +148,18 @@ func (o *OwningPlugins) ClaimRdtClass(id, plugin string) error {
        return o.mustOwnersFor(id).ClaimRdtClass(plugin)
 }
 
+func (o *OwningPlugins) ClaimRdtClosID(id, plugin string) error {
+       return o.mustOwnersFor(id).ClaimRdtClosID(plugin)
+}
+
+func (o *OwningPlugins) ClaimRdtSchemata(id, plugin string) error {
+       return o.mustOwnersFor(id).ClaimRdtSchemata(plugin)
+}
+
+func (o *OwningPlugins) ClaimRdtEnableMonitoring(id, plugin string) error {
+       return o.mustOwnersFor(id).ClaimRdtEnableMonitoring(plugin)
+}
+
 func (o *OwningPlugins) ClaimCgroupsUnified(id, key, plugin string) error {
        return o.mustOwnersFor(id).ClaimCgroupsUnified(key, plugin)
 }
@@ -160,6 +172,10 @@ func (o *OwningPlugins) ClaimOomScoreAdj(id, plugin string) error {
        return o.mustOwnersFor(id).ClaimOomScoreAdj(plugin)
 }
 
+func (o *OwningPlugins) ClaimLinuxScheduler(id, plugin string) error {
+       return o.mustOwnersFor(id).ClaimLinuxScheduler(plugin)
+}
+
 func (o *OwningPlugins) ClaimRlimit(id, typ, plugin string) error {
        return o.mustOwnersFor(id).ClaimRlimit(typ, plugin)
 }
@@ -172,6 +188,14 @@ func (o *OwningPlugins) ClaimSeccompPolicy(id, plugin string) error {
        return o.mustOwnersFor(id).ClaimSeccompPolicy(plugin)
 }
 
+func (o *OwningPlugins) ClaimSysctl(id, key, plugin string) error {
+       return o.mustOwnersFor(id).ClaimSysctl(key, plugin)
+}
+
+func (o *OwningPlugins) ClaimLinuxNetDevice(id, path, plugin string) error {
+       return o.mustOwnersFor(id).ClaimLinuxNetDevice(path, plugin)
+}
+
 func (o *OwningPlugins) ClearAnnotation(id, key, plugin string) {
        o.mustOwnersFor(id).ClearAnnotation(key, plugin)
 }
@@ -192,6 +216,18 @@ func (o *OwningPlugins) ClearArgs(id, plugin string) {
        o.mustOwnersFor(id).ClearArgs(plugin)
 }
 
+func (o *OwningPlugins) ClearSysctl(id, key, plugin string) {
+       o.mustOwnersFor(id).ClearSysctl(key, plugin)
+}
+
+func (o *OwningPlugins) ClearLinuxNetDevice(id, path, plugin string) {
+       o.mustOwnersFor(id).ClearLinuxNetDevice(path, plugin)
+}
+
+func (o *OwningPlugins) ClearRdt(id, plugin string) {
+       o.mustOwnersFor(id).ClearRdt(plugin)
+}
+
 func (o *OwningPlugins) AnnotationOwner(id, key string) (string, bool) {
        return o.ownersFor(id).compoundOwner(Field_Annotations.Key(), key)
 }
@@ -300,6 +336,18 @@ func (o *OwningPlugins) RdtClassOwner(id string) (string, bool) {
        return o.ownersFor(id).simpleOwner(Field_RdtClass.Key())
 }
 
+func (o *OwningPlugins) RdtClosIDOwner(id string) (string, bool) {
+       return o.ownersFor(id).simpleOwner(Field_RdtClosID.Key())
+}
+
+func (o *OwningPlugins) RdtSchemataOwner(id string) (string, bool) {
+       return o.ownersFor(id).simpleOwner(Field_RdtSchemata.Key())
+}
+
+func (o *OwningPlugins) RdtEnableMonitoringOwner(id string) (string, bool) {
+       return o.ownersFor(id).simpleOwner(Field_RdtEnableMonitoring.Key())
+}
+
 func (o *OwningPlugins) CgroupsUnifiedOwner(id, key string) (string, bool) {
        return o.ownersFor(id).compoundOwner(Field_CgroupsUnified.Key(), key)
 }
@@ -312,6 +360,10 @@ func (o *OwningPlugins) OomScoreAdjOwner(id string) (string, bool) {
        return o.ownersFor(id).simpleOwner(Field_OomScoreAdj.Key())
 }
 
+func (o *OwningPlugins) LinuxScheduler(id string) (string, bool) {
+       return o.ownersFor(id).simpleOwner(Field_LinuxSched.Key())
+}
+
 func (o *OwningPlugins) RlimitOwner(id, typ string) (string, bool) {
        return o.ownersFor(id).compoundOwner(Field_Rlimits.Key(), typ)
 }
@@ -324,6 +376,14 @@ func (o *OwningPlugins) SeccompPolicyOwner(id string) (string, bool) {
        return o.ownersFor(id).simpleOwner(Field_SeccompPolicy.Key())
 }
 
+func (o *OwningPlugins) SysctlOwner(id, key string) (string, bool) {
+       return o.ownersFor(id).compoundOwner(Field_Sysctl.Key(), key)
+}
+
+func (o *OwningPlugins) LinuxNetDeviceOwner(id, path string) (string, bool) {
+       return o.ownersFor(id).compoundOwner(Field_LinuxNetDevices.Key(), path)
+}
+
 func (o *OwningPlugins) mustOwnersFor(id string) *FieldOwners {
        f, ok := o.Owners[id]
        if !ok {
@@ -522,6 +582,18 @@ func (f *FieldOwners) ClaimRdtClass(plugin string) error {
        return f.claimSimple(Field_RdtClass.Key(), plugin)
 }
 
+func (f *FieldOwners) ClaimRdtClosID(plugin string) error {
+       return f.claimSimple(Field_RdtClosID.Key(), plugin)
+}
+
+func (f *FieldOwners) ClaimRdtSchemata(plugin string) error {
+       return f.claimSimple(Field_RdtSchemata.Key(), plugin)
+}
+
+func (f *FieldOwners) ClaimRdtEnableMonitoring(plugin string) error {
+       return f.claimSimple(Field_RdtEnableMonitoring.Key(), plugin)
+}
+
 func (f *FieldOwners) ClaimCgroupsUnified(key, plugin string) error {
        return f.claimCompound(Field_CgroupsUnified.Key(), key, plugin)
 }
@@ -534,6 +606,10 @@ func (f *FieldOwners) ClaimOomScoreAdj(plugin string) error {
        return f.claimSimple(Field_OomScoreAdj.Key(), plugin)
 }
 
+func (f *FieldOwners) ClaimLinuxScheduler(plugin string) error {
+       return f.claimSimple(Field_LinuxSched.Key(), plugin)
+}
+
 func (f *FieldOwners) ClaimRlimit(typ, plugin string) error {
        return f.claimCompound(Field_Rlimits.Key(), typ, plugin)
 }
@@ -546,6 +622,14 @@ func (f *FieldOwners) ClaimSeccompPolicy(plugin string) error {
        return f.claimSimple(Field_SeccompPolicy.Key(), plugin)
 }
 
+func (f *FieldOwners) ClaimSysctl(key, plugin string) error {
+       return f.claimCompound(Field_Sysctl.Key(), key, plugin)
+}
+
+func (f *FieldOwners) ClaimLinuxNetDevice(path, plugin string) error {
+       return f.claimCompound(Field_LinuxNetDevices.Key(), path, plugin)
+}
+
 func (f *FieldOwners) clearCompound(field int32, key, plugin string) {
        m, ok := f.Compound[field]
        if !ok {
@@ -580,6 +664,20 @@ func (f *FieldOwners) ClearArgs(plugin string) {
        f.clearSimple(Field_Args.Key(), plugin)
 }
 
+func (f *FieldOwners) ClearSysctl(key, plugin string) {
+       f.clearCompound(Field_Sysctl.Key(), key, plugin)
+}
+
+func (f *FieldOwners) ClearLinuxNetDevice(key, plugin string) {
+       f.clearCompound(Field_LinuxNetDevices.Key(), key, plugin)
+}
+
+func (f *FieldOwners) ClearRdt(plugin string) {
+       f.clearSimple(Field_RdtClosID.Key(), plugin)
+       f.clearSimple(Field_RdtSchemata.Key(), plugin)
+       f.clearSimple(Field_RdtEnableMonitoring.Key(), plugin)
+}
+
 func (f *FieldOwners) Conflict(field int32, plugin, other string, qualifiers ...string) error {
        return fmt.Errorf("plugins %q and %q both tried to set %s",
                plugin, other, qualify(field, qualifiers...))
@@ -721,6 +819,14 @@ func (f *FieldOwners) RdtClassOwner() (string, bool) {
        return f.simpleOwner(Field_RdtClass.Key())
 }
 
+func (f *FieldOwners) RdtSchemataOwner() (string, bool) {
+       return f.simpleOwner(Field_RdtSchemata.Key())
+}
+
+func (f *FieldOwners) RdtEnableMonitoringOwner() (string, bool) {
+       return f.simpleOwner(Field_RdtEnableMonitoring.Key())
+}
+
 func (f *FieldOwners) CgroupsUnifiedOwner(key string) (string, bool) {
        return f.compoundOwner(Field_CgroupsUnified.Key(), key)
 }
index 47feecd88fd17d3944224ad00d08ea1fbf27c6e6..b6a9ae1b154d44fc7dbc560fc7161f92a98751b7 100644 (file)
@@ -197,6 +197,7 @@ func (r *LinuxResources) Copy() *LinuxResources {
        }
        o.BlockioClass = String(r.BlockioClass)
        o.RdtClass = String(r.RdtClass)
+
        for _, d := range r.Devices {
                o.Devices = append(o.Devices, &LinuxDeviceCgroup{
                        Allow:  d.Allow,
@@ -209,3 +210,15 @@ func (r *LinuxResources) Copy() *LinuxResources {
 
        return o
 }
+
+// Copy creates a copy of the RDT configuration.
+func (r *LinuxRdt) Copy() *LinuxRdt {
+       if r == nil {
+               return nil
+       }
+       return &LinuxRdt{
+               ClosId:           String(r.ClosId),
+               Schemata:         RepeatedString(r.Schemata),
+               EnableMonitoring: Bool(r.EnableMonitoring),
+       }
+}
index 116a468771d724fb6e233cf32d78dfc0158b41a7..1291c8eb2b64853a36d4457f5a0de6a0ee0953d9 100644 (file)
@@ -112,6 +112,10 @@ func (l *LinuxContainerAdjustment) Strip() *LinuxContainerAdjustment {
                empty = false
        }
 
+       if l.Rdt = l.Rdt.Strip(); l.Rdt != nil {
+               empty = false
+       }
+
        if empty {
                return nil
        }
@@ -296,6 +300,23 @@ func (m *LinuxMemory) Strip() *LinuxMemory {
        return m
 }
 
+// Strip empty fields from a linux RDT configuration, reducing a fully empty one
+// to nil. Strip allows comparison of two sets of resources for semantic
+// equality using go-cmp.
+func (r *LinuxRdt) Strip() *LinuxRdt {
+       if r == nil {
+               return nil
+       }
+
+       switch {
+       case r.ClosId != nil, r.Schemata != nil, r.EnableMonitoring != nil:
+               // non-empty
+               return r
+       }
+
+       return nil
+}
+
 // Strip empty fields from a container update, reducing a fully empty one
 // to nil. Strip allows comparison of two updates for semantic equality
 // using go-cmp.
index 04ac3925d5934a6906511528dfced30a0c31dda2..08e512cb655badee1f282d7f840a80a6a6d3ade7 100644 (file)
@@ -16,8 +16,9 @@
 
 package api
 
-//nolint
 // SetContainerId sets the id of the container to update.
+//
+//nolint:revive
 func (u *ContainerUpdate) SetContainerId(id string) {
        u.ContainerId = id
 }
index 1c7ce246382c23949f6459517f05f33767a06436..801aa8fff658be8017deadaca844ab20bc6b22f3 100644 (file)
@@ -20,11 +20,11 @@ import (
        "fmt"
        "os"
        "path/filepath"
+       "slices"
        "sort"
        "strings"
 
        rspec "github.com/opencontainers/runtime-spec/specs-go"
-       "github.com/opencontainers/runtime-tools/generate"
 
        nri "github.com/containerd/nri/pkg/api"
 )
@@ -34,15 +34,56 @@ const (
        UnlimitedPidsLimit = -1
 )
 
+// UnderlyingGenerator is the interface for
+// [github.com/opencontainers/runtime-tools/generate.Generator].
+type UnderlyingGenerator interface {
+       AddAnnotation(key, value string)
+       AddDevice(device rspec.LinuxDevice)
+       AddOrReplaceLinuxNamespace(ns string, path string) error
+       AddPostStartHook(postStartHook rspec.Hook)
+       AddPostStopHook(postStopHook rspec.Hook)
+       AddPreStartHook(preStartHook rspec.Hook)
+       AddProcessEnv(name, value string)
+       AddLinuxResourcesDevice(allow bool, devType string, major, minor *int64, access string)
+       AddLinuxResourcesHugepageLimit(pageSize string, limit uint64)
+       AddLinuxResourcesUnified(key, val string)
+       AddMount(mnt rspec.Mount)
+       AddLinuxSysctl(key, value string)
+       ClearMounts()
+       ClearProcessEnv()
+       Mounts() []rspec.Mount
+       RemoveAnnotation(key string)
+       RemoveDevice(path string)
+       RemoveLinuxNamespace(ns string) error
+       RemoveMount(dest string)
+       RemoveLinuxSysctl(key string)
+       SetProcessArgs(args []string)
+       SetLinuxCgroupsPath(path string)
+       SetLinuxResourcesCPUCpus(cpus string)
+       SetLinuxResourcesCPUMems(mems string)
+       SetLinuxResourcesCPUPeriod(period uint64)
+       SetLinuxResourcesCPUQuota(quota int64)
+       SetLinuxResourcesCPURealtimePeriod(period uint64)
+       SetLinuxResourcesCPURealtimeRuntime(time int64)
+       SetLinuxResourcesCPUShares(shares uint64)
+       SetLinuxResourcesMemoryLimit(limit int64)
+       SetLinuxResourcesMemorySwap(swap int64)
+       SetLinuxRootPropagation(rp string) error
+       SetProcessOOMScoreAdj(adj int)
+       Spec() *rspec.Spec
+}
+
 // GeneratorOption is an option for Generator().
 type GeneratorOption func(*Generator)
 
 // Generator extends a stock runtime-tools Generator and extends it with
 // a few functions for handling NRI container adjustment.
 type Generator struct {
-       *generate.Generator
+       UnderlyingGenerator
+       Config            *rspec.Spec
        filterLabels      func(map[string]string) (map[string]string, error)
        filterAnnotations func(map[string]string) (map[string]string, error)
+       filterSysctl      func(map[string]string) (map[string]string, error)
        resolveBlockIO    func(string) (*rspec.LinuxBlockIO, error)
        resolveRdt        func(string) (*rspec.LinuxIntelRdt, error)
        injectCDIDevices  func(*rspec.Spec, []string) error
@@ -50,12 +91,14 @@ type Generator struct {
 }
 
 // SpecGenerator returns a wrapped OCI Spec Generator.
-func SpecGenerator(gg *generate.Generator, opts ...GeneratorOption) *Generator {
+func SpecGenerator(gg UnderlyingGenerator, opts ...GeneratorOption) *Generator {
        g := &Generator{
-               Generator: gg,
+               UnderlyingGenerator: gg,
+               Config:              gg.Spec(),
        }
        g.filterLabels = nopFilter
        g.filterAnnotations = nopFilter
+       g.filterSysctl = nopFilter
        for _, o := range opts {
                o(g)
        }
@@ -124,6 +167,7 @@ func (g *Generator) Adjust(adjust *nri.ContainerAdjustment) error {
        g.AdjustCgroupsPath(adjust.GetLinux().GetCgroupsPath())
        g.AdjustOomScoreAdj(adjust.GetLinux().GetOomScoreAdj())
        g.AdjustIOPriority(adjust.GetLinux().GetIoPriority())
+       g.AdjustLinuxScheduler(adjust.GetLinux().GetScheduler())
 
        if err := g.AdjustSeccompPolicy(adjust.GetLinux().GetSeccompPolicy()); err != nil {
                return err
@@ -131,6 +175,10 @@ func (g *Generator) Adjust(adjust *nri.ContainerAdjustment) error {
        if err := g.AdjustNamespaces(adjust.GetLinux().GetNamespaces()); err != nil {
                return err
        }
+       if err := g.AdjustSysctl(adjust.GetLinux().GetSysctl()); err != nil {
+               return err
+       }
+       g.AdjustLinuxNetDevices(adjust.GetLinux().GetNetDevices())
 
        resources := adjust.GetLinux().GetResources()
        if err := g.AdjustResources(resources); err != nil {
@@ -142,6 +190,7 @@ func (g *Generator) Adjust(adjust *nri.ContainerAdjustment) error {
        if err := g.AdjustRdtClass(resources.GetRdtClass().Get()); err != nil {
                return err
        }
+       g.AdjustRdt(adjust.GetLinux().GetRdt())
 
        if err := g.AdjustMounts(adjust.GetMounts()); err != nil {
                return err
@@ -341,6 +390,42 @@ func (g *Generator) AdjustRdtClass(rdtClass *string) error {
        return nil
 }
 
+// AdjustRdt adjusts the intelRdt object in the OCI Spec.
+func (g *Generator) AdjustRdt(r *nri.LinuxRdt) {
+       if r == nil {
+               return
+       }
+
+       if r.Remove {
+               g.ClearLinuxIntelRdt()
+       }
+
+       g.AdjustRdtClosID(r.ClosId.Get())
+       g.AdjustRdtSchemata(r.Schemata.Get())
+       g.AdjustRdtEnableMonitoring(r.EnableMonitoring.Get())
+}
+
+// AdjustRdtClosID adjusts the RDT CLOS id in the OCI Spec.
+func (g *Generator) AdjustRdtClosID(value *string) {
+       if value != nil {
+               g.SetLinuxIntelRdtClosID(*value)
+       }
+}
+
+// AdjustRdtSchemata adjusts the RDT schemata in the OCI Spec.
+func (g *Generator) AdjustRdtSchemata(value *[]string) {
+       if value != nil {
+               g.SetLinuxIntelRdtSchemata(*value)
+       }
+}
+
+// AdjustRdtEnableMonitoring adjusts the RDT monitoring in the OCI Spec.
+func (g *Generator) AdjustRdtEnableMonitoring(value *bool) {
+       if value != nil {
+               g.SetLinuxIntelRdtEnableMonitoring(*value)
+       }
+}
+
 // AdjustCgroupsPath adjusts the cgroup pseudofs path in the OCI Spec.
 func (g *Generator) AdjustCgroupsPath(path string) {
        if path != "" {
@@ -419,6 +504,33 @@ func (g *Generator) AdjustNamespaces(namespaces []*nri.LinuxNamespace) error {
        return nil
 }
 
+// AdjustSysctl adds, replaces, or removes the sysctl settings in the OCI Spec.
+func (g *Generator) AdjustSysctl(sysctl map[string]string) error {
+       var err error
+
+       if sysctl, err = g.filterSysctl(sysctl); err != nil {
+               return err
+       }
+       for k, v := range sysctl {
+               if key, marked := nri.IsMarkedForRemoval(k); marked {
+                       g.RemoveLinuxSysctl(key)
+               } else {
+                       g.AddLinuxSysctl(k, v)
+               }
+       }
+
+       return nil
+}
+
+// AdjustLinuxScheduler adjusts linux scheduling policy parameters.
+func (g *Generator) AdjustLinuxScheduler(sch *nri.LinuxScheduler) {
+       if sch == nil {
+               return
+       }
+       g.initConfigProcess()
+       g.Config.Process.Scheduler = sch.ToOCI()
+}
+
 // AdjustDevices adjusts the (Linux) devices in the OCI Spec.
 func (g *Generator) AdjustDevices(devices []*nri.LinuxDevice) {
        for _, d := range devices {
@@ -433,6 +545,19 @@ func (g *Generator) AdjustDevices(devices []*nri.LinuxDevice) {
        }
 }
 
+// AdjustLinuxNetDevices adjusts the linux net devices in the OCI Spec.
+func (g *Generator) AdjustLinuxNetDevices(devices map[string]*nri.LinuxNetDevice) error {
+       for k, v := range devices {
+               if key, marked := nri.IsMarkedForRemoval(k); marked {
+                       g.RemoveLinuxNetDevice(key)
+               } else {
+                       g.AddLinuxNetDevice(k, v)
+               }
+       }
+
+       return nil
+}
+
 // InjectCDIDevices injects the requested CDI devices into the OCI Spec.
 // Devices are given by their fully qualified CDI device names. The
 // actual device injection is done using a runtime-specific CDI
@@ -595,6 +720,24 @@ func (g *Generator) SetLinuxIntelRdt(rdt *rspec.LinuxIntelRdt) {
        g.Config.Linux.IntelRdt = rdt
 }
 
+// SetLinuxIntelRdtClosID sets g.Config.Linux.IntelRdt.ClosID
+func (g *Generator) SetLinuxIntelRdtClosID(closID string) {
+       g.initConfigLinuxIntelRdt()
+       g.Config.Linux.IntelRdt.ClosID = closID
+}
+
+// SetLinuxIntelRdtEnableMonitoring sets g.Config.Linux.IntelRdt.EnableMonitoring
+func (g *Generator) SetLinuxIntelRdtEnableMonitoring(value bool) {
+       g.initConfigLinuxIntelRdt()
+       g.Config.Linux.IntelRdt.EnableMonitoring = value
+}
+
+// SetLinuxIntelRdtSchemata sets g.Config.Linux.IntelRdt.Schemata
+func (g *Generator) SetLinuxIntelRdtSchemata(schemata []string) {
+       g.initConfigLinuxIntelRdt()
+       g.Config.Linux.IntelRdt.Schemata = slices.Clone(schemata)
+}
+
 // ClearLinuxResourcesBlockIO clears Block I/O settings.
 func (g *Generator) ClearLinuxResourcesBlockIO() {
        g.initConfigLinuxResources()
@@ -631,6 +774,21 @@ func (g *Generator) SetLinuxResourcesPidsLimit(limit int64) {
        }
 }
 
+// AddLinuxNetDevice adds a new Linux net device.
+func (g *Generator) AddLinuxNetDevice(hostDev string, device *nri.LinuxNetDevice) {
+       if device == nil {
+               return
+       }
+       g.initConfigLinuxNetDevices()
+       g.Config.Linux.NetDevices[hostDev] = device.ToOCI()
+}
+
+// RemoveLinuxNetDevice removes a Linux net device.
+func (g *Generator) RemoveLinuxNetDevice(hostDev string) {
+       g.initConfigLinuxNetDevices()
+       delete(g.Config.Linux.NetDevices, hostDev)
+}
+
 func (g *Generator) initConfig() {
        if g.Config == nil {
                g.Config = &rspec.Spec{}
@@ -664,3 +822,17 @@ func (g *Generator) initConfigLinuxResources() {
                g.Config.Linux.Resources = &rspec.LinuxResources{}
        }
 }
+
+func (g *Generator) initConfigLinuxNetDevices() {
+       g.initConfigLinux()
+       if g.Config.Linux.NetDevices == nil {
+               g.Config.Linux.NetDevices = map[string]rspec.LinuxNetDevice{}
+       }
+}
+
+func (g *Generator) initConfigLinuxIntelRdt() {
+       g.initConfigLinux()
+       if g.Config.Linux.IntelRdt == nil {
+               g.Config.Linux.IntelRdt = &rspec.LinuxIntelRdt{}
+       }
+}
index 4dc7fbb28b46d7494ef0981fc2ecbcc1626d93aa..b964c4e6c5328d9db5b8c011876056a9d4adbd2b 100644 (file)
@@ -178,6 +178,9 @@ type Stub interface {
        // This is the default timeout if the plugin has not been started or
        // the timeout received in the Configure request otherwise.
        RequestTimeout() time.Duration
+
+       // Logger returns the logger used by the stub.
+       Logger() nrilog.Logger
 }
 
 const (
@@ -188,9 +191,6 @@ const (
 )
 
 var (
-       // Logger for messages generated internally by the stub itself.
-       log = nrilog.Get()
-
        // Used instead of a nil Context in logging.
        noCtx = context.TODO()
 
@@ -268,6 +268,14 @@ func WithTTRPCOptions(clientOpts []ttrpc.ClientOpts, serverOpts []ttrpc.ServerOp
        }
 }
 
+// WithLogger sets the logger to be used by the stub.
+func WithLogger(logger nrilog.Logger) Option {
+       return func(s *stub) error {
+               s.logger = logger
+               return nil
+       }
+}
+
 // stub implements Stub.
 type stub struct {
        sync.Mutex
@@ -295,6 +303,7 @@ type stub struct {
 
        registrationTimeout time.Duration
        requestTimeout      time.Duration
+       logger              nrilog.Logger
 }
 
 // Handlers for NRI plugin event and request.
@@ -329,6 +338,7 @@ func New(p interface{}, opts ...Option) (Stub, error) {
 
                registrationTimeout: DefaultRegistrationTimeout,
                requestTimeout:      DefaultRequestTimeout,
+               logger:              nrilog.Get(),
        }
 
        for _, o := range opts {
@@ -345,7 +355,7 @@ func New(p interface{}, opts ...Option) (Stub, error) {
                return nil, err
        }
 
-       log.Infof(noCtx, "Created plugin %s (%s, handles %s)", stub.Name(),
+       stub.logger.Infof(noCtx, "Created plugin %s (%s, handles %s)", stub.Name(),
                filepath.Base(os.Args[0]), stub.events.PrettyString())
 
        return stub, nil
@@ -440,7 +450,7 @@ func (stub *stub) Start(ctx context.Context) (retErr error) {
                return err
        }
 
-       log.Infof(ctx, "Started plugin %s...", stub.Name())
+       stub.logger.Infof(ctx, "Started plugin %s...", stub.Name())
 
        stub.started = true
        return nil
@@ -448,7 +458,7 @@ func (stub *stub) Start(ctx context.Context) (retErr error) {
 
 // Stop the plugin.
 func (stub *stub) Stop() {
-       log.Infof(noCtx, "Stopping plugin %s...", stub.Name())
+       stub.logger.Infof(noCtx, "Stopping plugin %s...", stub.Name())
 
        stub.Lock()
        defer stub.Unlock()
@@ -504,7 +514,7 @@ func (stub *stub) Run(ctx context.Context) error {
 
        err = <-stub.srvErrC
        if err == ttrpc.ErrServerClosed {
-               log.Infof(noCtx, "ttrpc server closed %s : %v", stub.Name(), err)
+               stub.logger.Infof(noCtx, "ttrpc server closed %s : %v", stub.Name(), err)
        }
 
        return err
@@ -522,6 +532,10 @@ func (stub *stub) Name() string {
        return stub.idx + "-" + stub.name
 }
 
+func (stub *stub) Logger() nrilog.Logger {
+       return stub.logger
+}
+
 func (stub *stub) RegistrationTimeout() time.Duration {
        return stub.registrationTimeout
 }
@@ -533,12 +547,12 @@ func (stub *stub) RequestTimeout() time.Duration {
 // Connect the plugin to NRI.
 func (stub *stub) connect() error {
        if stub.conn != nil {
-               log.Infof(noCtx, "Using given plugin connection...")
+               stub.logger.Infof(noCtx, "Using given plugin connection...")
                return nil
        }
 
        if env := os.Getenv(api.PluginSocketEnvVar); env != "" {
-               log.Infof(noCtx, "Using connection %q from environment...", env)
+               stub.logger.Infof(noCtx, "Using connection %q from environment...", env)
 
                fd, err := strconv.Atoi(env)
                if err != nil {
@@ -566,7 +580,7 @@ func (stub *stub) connect() error {
 
 // Register the plugin with NRI.
 func (stub *stub) register(ctx context.Context) error {
-       log.Infof(ctx, "Registering plugin %s...", stub.Name())
+       stub.logger.Infof(ctx, "Registering plugin %s...", stub.Name())
 
        ctx, cancel := context.WithTimeout(ctx, stub.registrationTimeout)
        defer cancel()
@@ -621,7 +635,7 @@ func (stub *stub) Configure(ctx context.Context, req *api.ConfigureRequest) (rpl
                err    error
        )
 
-       log.Infof(ctx, "Configuring plugin %s for runtime %s/%s...", stub.Name(),
+       stub.logger.Infof(ctx, "Configuring plugin %s for runtime %s/%s...", stub.Name(),
                req.RuntimeName, req.RuntimeVersion)
 
        stub.registrationTimeout = time.Duration(req.RegistrationTimeout * int64(time.Millisecond))
@@ -636,7 +650,7 @@ func (stub *stub) Configure(ctx context.Context, req *api.ConfigureRequest) (rpl
        } else {
                events, err = handler(ctx, req.Config, req.RuntimeName, req.RuntimeVersion)
                if err != nil {
-                       log.Errorf(ctx, "Plugin configuration failed: %v", err)
+                       stub.logger.Errorf(ctx, "Plugin configuration failed: %v", err)
                        return nil, err
                }
 
@@ -646,13 +660,13 @@ func (stub *stub) Configure(ctx context.Context, req *api.ConfigureRequest) (rpl
 
                // Only allow plugins to subscribe to events they can handle.
                if extra := events & ^stub.events; extra != 0 {
-                       log.Errorf(ctx, "Plugin subscribed for unhandled events %s (0x%x)",
+                       stub.logger.Errorf(ctx, "Plugin subscribed for unhandled events %s (0x%x)",
                                extra.PrettyString(), extra)
                        return nil, fmt.Errorf("internal error: unhandled events %s (0x%x)",
                                extra.PrettyString(), extra)
                }
 
-               log.Infof(ctx, "Subscribing plugin %s (%s) for events %s", stub.Name(),
+               stub.logger.Infof(ctx, "Subscribing plugin %s (%s) for events %s", stub.Name(),
                        filepath.Base(os.Args[0]), events.PrettyString())
        }
 
@@ -679,7 +693,7 @@ func (stub *stub) collectSync(req *api.SynchronizeRequest) (*api.SynchronizeResp
        stub.Lock()
        defer stub.Unlock()
 
-       log.Debugf(noCtx, "collecting sync req with %d pods, %d containers...",
+       stub.logger.Debugf(noCtx, "collecting sync req with %d pods, %d containers...",
                len(req.Pods), len(req.Containers))
 
        if stub.syncReq == nil {
index f17689d187be64a55d2d0d116e413844b43c3e2a..fd4d7024b7e13e58ce18512a4d22a507cd1713e9 100644 (file)
@@ -24,10 +24,11 @@ import (
        "strconv"
        "strings"
 
+       yaml "gopkg.in/yaml.v3"
+
        "github.com/containerd/nri/pkg/api"
        "github.com/containerd/nri/pkg/log"
        "github.com/containerd/nri/pkg/plugin"
-       yaml "gopkg.in/yaml.v3"
 )
 
 // DefaultValidatorConfig is the configuration for the default validator plugin.
@@ -47,6 +48,8 @@ type DefaultValidatorConfig struct {
        RejectCustomSeccompAdjustment bool `yaml:"rejectCustomSeccompAdjustment" toml:"reject_custom_seccomp_adjustment"`
        // RejectNamespaceAdjustment fails validation if any plugin adjusts Linux namespaces.
        RejectNamespaceAdjustment bool `yaml:"rejectNamespaceAdjustment" toml:"reject_namespace_adjustment"`
+       // RejectSysctlAdjustment fails validation if any plugin adjusts sysctls
+       RejectSysctlAdjustment bool `yaml:"rejectSysctlAdjustment" toml:"reject_sysctl_adjustment"`
        // RequiredPlugins list globally required plugins. These must be present
        // or otherwise validation will fail.
        // WARNING: This is a global setting and will affect all containers. In
@@ -115,6 +118,11 @@ func (v *DefaultValidator) ValidateContainerAdjustment(ctx context.Context, req
                return err
        }
 
+       if err := v.validateSysctl(req); err != nil {
+               log.Errorf(ctx, "rejecting adjustment: %v", err)
+               return err
+       }
+
        return nil
 }
 
@@ -203,6 +211,31 @@ func (v *DefaultValidator) validateNamespaces(req *api.ValidateContainerAdjustme
                ErrValidation, offenders)
 }
 
+func (v *DefaultValidator) validateSysctl(req *api.ValidateContainerAdjustmentRequest) error {
+       if req.Adjust == nil || req.Adjust.Linux == nil {
+               return nil
+       }
+
+       if !v.cfg.RejectSysctlAdjustment {
+               return nil
+       }
+
+       var owners []string
+       for key := range req.Adjust.Linux.Sysctl {
+               owner, claimed := req.Owners.SysctlOwner(req.Container.Id, key)
+               if !claimed {
+                       continue
+               }
+               owners = append(owners, owner)
+       }
+
+       if len(owners) == 0 {
+               return nil
+       }
+
+       return fmt.Errorf("%w: attempted restricted sysctl adjustment by plugin(s) %s", ErrValidation, strings.Join(owners, ", "))
+}
+
 func (v *DefaultValidator) validateRequiredPlugins(req *api.ValidateContainerAdjustmentRequest) error {
        var (
                container = req.GetContainer().GetName()
index b33fdd4ed0267de897166aaebf9d508ef3ff9bed..0dd37bb2a69e73a6361f63235881808c9852bdd6 100644 (file)
@@ -113,6 +113,7 @@ spectest_v1_testdata_dir := $(spectest_v1_dir)/testdata
 spec_version_v1 := wg-1.0
 spectest_v2_dir := $(spectest_base_dir)/v2
 spectest_v2_testdata_dir := $(spectest_v2_dir)/testdata
+
 # Latest draft state as of March 12, 2024.
 spec_version_v2 := 1c5e5d178bd75c79b7a12881c529098beaee2a05
 spectest_threads_dir := $(spectest_base_dir)/threads
@@ -121,6 +122,10 @@ spectest_threads_testdata_dir := $(spectest_threads_dir)/testdata
 # It will likely be renamed to main in the future - https://github.com/WebAssembly/threads/issues/216.
 spec_version_threads := 3635ca51a17e57e106988846c5b0e0cc48ac04fc
 
+spectest_tail_call_dir := $(spectest_base_dir)/tail-call
+spectest_tail_call_testdata_dir := $(spectest_tail_call_dir)/testdata
+spec_version_tail_call := 4fd2339b5e9709e74b326797f69a88b13eac4d47
+
 .PHONY: build.spectest
 build.spectest:
        @$(MAKE) build.spectest.v1
@@ -175,6 +180,15 @@ build.spectest.threads:
                wast2json --enable-threads --debug-names $$f; \
        done
 
+.PHONY: build.spectest.tail_call
+build.spectest.tail_call:
+       mkdir -p $(spectest_tail_call_testdata_dir)
+       cd $(spectest_tail_call_testdata_dir) \
+               && curl -sSL 'https://api.github.com/repos/WebAssembly/testsuite/contents/proposals/tail-call?ref=$(spec_version_tail_call)' | jq -r '.[]| .download_url' | grep -E ".wast" | xargs -Iurl curl -sJL url -O
+       cd $(spectest_tail_call_testdata_dir) && for f in `find . -name '*.wast'`; do \
+               wast2json --enable-tail-call --debug-names $$f; \
+       done
+
 .PHONY: test
 test:
        @go test $(go_test_options) ./...
@@ -220,13 +234,10 @@ check:
        @GOARCH=wasm GOOS=wasip1 go build ./...
 # Ensure we build on aix. See #1723
        @GOARCH=ppc64 GOOS=aix go build ./...
-# Ensure we build on windows:
-       @GOARCH=amd64 GOOS=windows go build ./...
-# Ensure we build on an arbitrary operating system:
-       @GOARCH=amd64 GOOS=dragonfly go build ./...
-# Ensure we build on solaris/illumos:
-       @GOARCH=amd64 GOOS=illumos go build ./...
-       @GOARCH=amd64 GOOS=solaris go build ./...
+# Ensure we build on linux s390x. See #2412
+       @GOARCH=s390x GOOS=linux go build ./...
+# Ensure we build on linux ppc64le. See #2412
+       @GOARCH=ppc64le GOOS=linux go build ./...
 # Ensure we build on linux arm for Dapr:
 #      gh release view -R dapr/dapr --json assets --jq 'first(.assets[] | select(.name = "daprd_linux_arm.tar.gz") | {url, downloadCount})'
        @GOARCH=arm GOOS=linux go build ./...
@@ -274,22 +285,15 @@ libsodium:
 #### CLI release related ####
 
 VERSION ?= dev
-# Default to a dummy version 0.0.1.1, which is always lower than a real release.
-# Legal version values should look like 'x.x.x.x' where x is an integer from 0 to 65534.
-# https://learn.microsoft.com/en-us/windows/win32/msi/productversion?redirectedfrom=MSDN
-# https://stackoverflow.com/questions/9312221/msi-version-numbers
-MSI_VERSION ?= 0.0.1.1
 non_windows_platforms := darwin_amd64 darwin_arm64 linux_amd64 linux_arm64
 non_windows_archives  := $(non_windows_platforms:%=dist/wazero_$(VERSION)_%.tar.gz)
 windows_platforms     := windows_amd64 # TODO: add arm64 windows once we start testing on it.
-windows_archives      := $(windows_platforms:%=dist/wazero_$(VERSION)_%.zip) $(windows_platforms:%=dist/wazero_$(VERSION)_%.msi)
+windows_archives      := $(windows_platforms:%=dist/wazero_$(VERSION)_%.zip)
 checksum_txt          := dist/wazero_$(VERSION)_checksums.txt
 
 # define macros for multi-platform builds. these parse the filename being built
 go-arch = $(if $(findstring amd64,$1),amd64,arm64)
 go-os   = $(if $(findstring .exe,$1),windows,$(if $(findstring linux,$1),linux,darwin))
-# msi-arch is a macro so we can detect it based on the file naming convention
-msi-arch     = $(if $(findstring amd64,$1),x64,arm64)
 
 build/wazero_%/wazero:
        $(call go-build,$@,$<)
@@ -314,51 +318,15 @@ define go-build
        @echo build "ok"
 endef
 
-# this makes a marker file ending in .signed to avoid repeatedly calling codesign
-%.signed: %
-       $(call codesign,$<)
-       @touch $@
-
-# This requires osslsigncode package (apt or brew) or latest windows release from mtrojnar/osslsigncode
-#
-# Default is self-signed while production should be a Digicert signing key
-#
-# Ex.
-# ```bash
-# keytool -genkey -alias wazero -storetype PKCS12 -keyalg RSA -keysize 2048 -storepass wazero-bunch \
-# -keystore wazero.p12 -dname "O=wazero,CN=wazero.io" -validity 3650
-# ```
-WINDOWS_CODESIGN_P12      ?= packaging/msi/wazero.p12
-WINDOWS_CODESIGN_PASSWORD ?= wazero-bunch
-define codesign
-       @printf "$(ansi_format_dark)" codesign "signing $1"
-       @osslsigncode sign -h sha256 -pkcs12 ${WINDOWS_CODESIGN_P12} -pass "${WINDOWS_CODESIGN_PASSWORD}" \
-       -n "wazero is the zero dependency WebAssembly runtime for Go developers" -i https://wazero.io -t http://timestamp.digicert.com \
-       $(if $(findstring msi,$(1)),-add-msi-dse) -in $1 -out $1-signed
-       @mv $1-signed $1
-       @printf "$(ansi_format_bright)" codesign "ok"
-endef
-
-# This task is only supported on Windows, where we use candle.exe (compile wxs to wixobj) and light.exe (link to msi)
-dist/wazero_$(VERSION)_%.msi: build/wazero_%/wazero.exe.signed
-ifeq ($(OS),Windows_NT)
-       @echo msi "building $@"
-       @mkdir -p $(@D)
-       @candle -nologo -arch $(call msi-arch,$@) -dVersion=$(MSI_VERSION) -dBin=$(<:.signed=) -o build/wazero.wixobj packaging/msi/wazero.wxs
-       @light -nologo -o $@ build/wazero.wixobj -spdb
-       $(call codesign,$@)
-       @echo msi "ok"
-endif
-
-dist/wazero_$(VERSION)_%.zip: build/wazero_%/wazero.exe.signed
+dist/wazero_$(VERSION)_%.zip: build/wazero_%/wazero.exe
        @echo zip "zipping $@"
        @mkdir -p $(@D)
-       @zip -qj $@ $(<:.signed=)
+       @zip -qj $@ $<
        @echo zip "ok"
 
 # Darwin doesn't have sha256sum. See https://github.com/actions/virtual-environments/issues/90
 sha256sum := $(if $(findstring darwin,$(shell go env GOOS)),shasum -a 256,sha256sum)
-$(checksum_txt):
-       @cd $(@D); touch $(@F); $(sha256sum) * >> $(@F)
+$(checksum_txt): $(non_windows_archives) $(windows_archives)
+       @cd $(@D); touch $(@F); $(sha256sum) * > $(@F)
 
-dist: $(non_windows_archives) $(if $(findstring Windows_NT,$(OS)),$(windows_archives),) $(checksum_txt)
+dist: $(non_windows_archives) $(windows_archives) $(checksum_txt)
index 8d783cb4483c8ca8757054f72674f50512df7b2f..ffb1a299ef71525c84b1ccb5c6bfbc85a5b0d041 100644 (file)
@@ -507,7 +507,7 @@ inserted after exit: https://github.com/emscripten-core/emscripten/issues/12322
 
 ## WASI
 
-Unfortunately, (WASI Snapshot Preview 1)[https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md] is not formally defined enough, and has APIs with ambiguous semantics.
+Unfortunately, [WASI Snapshot Preview 1](https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md) is not formally defined enough, and has APIs with ambiguous semantics.
 This section describes how Wazero interprets and implements the semantics of several WASI APIs that may be interpreted differently by different wasm runtimes.
 Those APIs may affect the portability of a WASI application.
 
index e49fcb8a8ed1de010dc78cc6a94b7e03b99886df..5cd933d37e4472433e1c0c9dec700cc9b9764cc5 100644 (file)
@@ -43,7 +43,7 @@ magnitude (10x) or more. This is done without host-specific dependencies.
 
 ### Conformance
 
-Both runtimes pass WebAssembly Core [1.0][7] and [2.0][14] specification tests
+Both runtimes pass WebAssembly Core [1.0][3] and [2.0][4] specification tests
 on supported platforms:
 
 |   Runtime   |                 Usage                  | amd64 | arm64 | others |
@@ -58,7 +58,7 @@ wazero into their Go applications.
 
 ### wazero
 
-wazero's [1.0 release][15] happened in March 2023, and is [in use][16] by many
+wazero's [1.0 release][8] happened in March 2023, and is [in use][9] by many
 projects and production sites.
 
 We offer an API stability promise with semantic versioning. In other words, we
@@ -72,14 +72,14 @@ You can get the latest version of wazero like this.
 go get github.com/tetratelabs/wazero@latest
 ```
 
-Please give us a [star][17] if you end up using wazero!
+Please give us a [star][10] if you end up using wazero!
 
 ### Go
 
 wazero has no dependencies except Go, so the only source of conflict in your
 project's use of wazero is the Go version.
 
-wazero follows the same version policy as Go's [Release Policy][10]: two
+wazero follows the same version policy as Go's [Release Policy][5]: two
 versions. wazero will ensure these versions work and bugs are valid if there's
 an issue with a current Go version.
 
@@ -96,18 +96,18 @@ systems are ones we test, but that doesn't necessarily mean other operating
 system versions won't work.
 
 We currently test Linux (Ubuntu and scratch), MacOS and Windows as packaged by
-[GitHub Actions][11], as well as nested VMs running on Linux for FreeBSD, NetBSD,
+[GitHub Actions][6], as well as nested VMs running on Linux for FreeBSD, NetBSD,
 OpenBSD, DragonFly BSD, illumos and Solaris.
 
 We also test cross compilation for many `GOOS` and `GOARCH` combinations.
 
 * Interpreter
-  * Linux is tested on amd64 (native) as well arm64 and riscv64 via emulation.
+  * Linux is tested on amd64 and arm64 (native) as well as riscv64 via emulation.
   * Windows, FreeBSD, NetBSD, OpenBSD, DragonFly BSD, illumos and Solaris are
     tested only on amd64.
   * macOS is tested only on arm64.
 * Compiler
-  * Linux is tested on amd64 (native) as well arm64 via emulation.
+  * Linux is tested on amd64 and arm64.
   * Windows, FreeBSD, NetBSD, DragonFly BSD, illumos and Solaris are
     tested only on amd64.
   * macOS is tested only on arm64.
@@ -116,24 +116,25 @@ wazero has no dependencies and doesn't require CGO. This means it can also be
 embedded in an application that doesn't use an operating system. This is a main
 differentiator between wazero and alternatives.
 
-We verify zero dependencies by running tests in Docker's [scratch image][12].
+We verify zero dependencies by running tests in Docker's [scratch image][7].
 This approach ensures compatibility with any parent image.
 
+### macOS code-signing entitlements
+
+If you're developing for macOS and need to code-sign your application,
+please read issue [#2393][11].
+
 -----
 wazero is a registered trademark of Tetrate.io, Inc. in the United States and/or other countries
 
 [1]: https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/
 [2]: https://www.w3.org/TR/2022/WD-wasm-core-2-20220419/
-[4]: https://github.com/WebAssembly/meetings/blob/main/process/subgroups.md
-[5]: https://github.com/WebAssembly/WASI
-[6]: https://pkg.go.dev/golang.org/x/sys/unix
-[7]: https://github.com/WebAssembly/spec/tree/wg-1.0/test/core
-[9]: https://github.com/tetratelabs/wazero/issues/506
-[10]: https://go.dev/doc/devel/release
-[11]: https://github.com/actions/virtual-environments
-[12]: https://docs.docker.com/develop/develop-images/baseimages/#create-a-simple-parent-image-using-scratch
-[13]: https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md
-[14]: https://github.com/WebAssembly/spec/tree/d39195773112a22b245ffbe864bab6d1182ccb06/test/core
-[15]: https://tetrate.io/blog/introducing-wazero-from-tetrate/
-[16]: https://wazero.io/community/users/
-[17]: https://github.com/tetratelabs/wazero/stargazers
+[3]: https://github.com/WebAssembly/spec/tree/wg-1.0/test/core
+[4]: https://github.com/WebAssembly/spec/tree/d39195773112a22b245ffbe864bab6d1182ccb06/test/core
+[5]: https://go.dev/doc/devel/release
+[6]: https://github.com/actions/virtual-environments
+[7]: https://docs.docker.com/develop/develop-images/baseimages/#create-a-simple-parent-image-using-scratch
+[8]: https://tetrate.io/blog/introducing-wazero-from-tetrate/
+[9]: https://wazero.io/community/users/
+[10]: https://github.com/wazero/wazero/stargazers
+[11]: https://github.com/wazero/wazero/issues/2393
diff --git a/vendor/github.com/tetratelabs/wazero/experimental/compilationworkers.go b/vendor/github.com/tetratelabs/wazero/experimental/compilationworkers.go
new file mode 100644 (file)
index 0000000..bb76e01
--- /dev/null
@@ -0,0 +1,19 @@
+package experimental
+
+import (
+       "context"
+
+       "github.com/tetratelabs/wazero/internal/expctxkeys"
+)
+
+// WithCompilationWorkers sets the desired number of compilation workers.
+func WithCompilationWorkers(ctx context.Context, workers int) context.Context {
+       return context.WithValue(ctx, expctxkeys.CompilationWorkers{}, workers)
+}
+
+// GetCompilationWorkers returns the desired number of compilation workers.
+// The minimum value returned is 1.
+func GetCompilationWorkers(ctx context.Context) int {
+       workers, _ := ctx.Value(expctxkeys.CompilationWorkers{}).(int)
+       return max(workers, 1)
+}
index b2a5b9069e6f06626b01333428cd9422ad4a2104..a695f149f4fb288295f70f7f85f0af094ba08c2a 100644 (file)
@@ -13,3 +13,6 @@ import "github.com/tetratelabs/wazero/api"
 //     binaries will use a theroetical maximum like 4GB, so if using such a binary on a system
 //     without mmap, consider editing the binary to reduce the max size setting of memory.
 const CoreFeaturesThreads = api.CoreFeatureSIMD << 1
+
+// CoreFeaturesThreads enables tail call instructions ("tail-call").
+const CoreFeaturesTailCall = api.CoreFeatureSIMD << 2
index 4e20e4b2cb9717096bd3365bdb3a179d4c2640d8..4269d237b70e61ee13b886c5a1d6789f32c315c2 100644 (file)
@@ -814,6 +814,7 @@ operatorSwitch:
                c.emit(
                        newOperationCallIndirect(typeIndex, tableIndex),
                )
+
        case wasm.OpcodeDrop:
                r := inclusiveRange{Start: 0, End: 0}
                if peekValueType == unsignedTypeV128 {
@@ -3423,6 +3424,45 @@ operatorSwitch:
                default:
                        return fmt.Errorf("unsupported atomic instruction in interpreterir: %s", wasm.AtomicInstructionName(atomicOp))
                }
+
+       case wasm.OpcodeTailCallReturnCall:
+               fdef := c.module.FunctionDefinition(index)
+               functionFrame := c.controlFrames.functionFrame()
+               // Currently we do not support imported functions, we treat them as regular calls.
+               // For details, see internal/engine/RATIONALE.md
+               if _, _, isImport := fdef.Import(); isImport {
+                       c.emit(newOperationCall(index))
+                       dropOp := newOperationDrop(c.getFrameDropRange(functionFrame, false))
+
+                       // Cleanup the stack and then jmp to function frame's continuation (meaning return).
+                       c.emit(dropOp)
+                       c.emit(newOperationBr(functionFrame.asLabel()))
+               } else {
+                       c.emit(newOperationTailCallReturnCall(index))
+               }
+
+               // Return operation is stack-polymorphic, and mark the state as unreachable.
+               // That means subsequent instructions in the current control frame are "unreachable"
+               // and can be safely removed.
+               c.markUnreachable()
+
+       case wasm.OpcodeTailCallReturnCallIndirect:
+               typeIndex := index
+               tableIndex, n, err := leb128.LoadUint32(c.body[c.pc+1:])
+               if err != nil {
+                       return fmt.Errorf("read target for br_table: %w", err)
+               }
+               c.pc += n
+
+               functionFrame := c.controlFrames.functionFrame()
+               dropRange := c.getFrameDropRange(functionFrame, false)
+               c.emit(newOperationTailCallReturnCallIndirect(typeIndex, tableIndex, dropRange, functionFrame.asLabel()))
+
+               // Return operation is stack-polymorphic, and mark the state as unreachable.
+               // That means subsequent instructions in the current control frame are "unreachable"
+               // and can be safely removed.
+               c.markUnreachable()
+
        default:
                return fmt.Errorf("unsupported instruction in interpreterir: 0x%x", op)
        }
@@ -3449,7 +3489,10 @@ func (c *compiler) applyToStack(opcode wasm.Opcode) (index uint32, err error) {
                wasm.OpcodeLocalSet,
                wasm.OpcodeLocalTee,
                wasm.OpcodeGlobalGet,
-               wasm.OpcodeGlobalSet:
+               wasm.OpcodeGlobalSet,
+               // tail-call proposal
+               wasm.OpcodeTailCallReturnCall,
+               wasm.OpcodeTailCallReturnCallIndirect:
                // Assumes that we are at the opcode now so skip it before read immediates.
                v, num, err := leb128.LoadUint32(c.body[c.pc+1:])
                if err != nil {
index 5b5e6e9d08a9aa5465eee62075890fb10cd6f8e7..6f2fa949aa80c4168ba24e8d2e4ab120f3a93310 100644 (file)
@@ -7,6 +7,7 @@ import (
        "fmt"
        "math"
        "math/bits"
+       "slices"
        "sync"
        "unsafe"
 
@@ -27,27 +28,37 @@ import (
 // The default value should suffice for most use cases. Those wishing to change this can via `go build -ldflags`.
 var callStackCeiling = 2000
 
+type compiledFunctionWithCount struct {
+       funcs    []compiledFunction
+       refCount int
+}
+
 // engine is an interpreter implementation of wasm.Engine
 type engine struct {
        enabledFeatures   api.CoreFeatures
-       compiledFunctions map[wasm.ModuleID][]compiledFunction // guarded by mutex.
-       mux               sync.RWMutex
+       compiledFunctions map[wasm.ModuleID]*compiledFunctionWithCount // guarded by mutex.
+       mux               sync.Mutex
 }
 
 func NewEngine(_ context.Context, enabledFeatures api.CoreFeatures, _ filecache.Cache) wasm.Engine {
        return &engine{
                enabledFeatures:   enabledFeatures,
-               compiledFunctions: map[wasm.ModuleID][]compiledFunction{},
+               compiledFunctions: map[wasm.ModuleID]*compiledFunctionWithCount{},
        }
 }
 
 // Close implements the same method as documented on wasm.Engine.
 func (e *engine) Close() (err error) {
+       e.mux.Lock()
+       defer e.mux.Unlock()
+       clear(e.compiledFunctions)
        return
 }
 
 // CompiledModuleCount implements the same method as documented on wasm.Engine.
 func (e *engine) CompiledModuleCount() uint32 {
+       e.mux.Lock()
+       defer e.mux.Unlock()
        return uint32(len(e.compiledFunctions))
 }
 
@@ -59,19 +70,33 @@ func (e *engine) DeleteCompiledModule(m *wasm.Module) {
 func (e *engine) deleteCompiledFunctions(module *wasm.Module) {
        e.mux.Lock()
        defer e.mux.Unlock()
+       cf, ok := e.compiledFunctions[module.ID]
+       if !ok {
+               return
+       }
+       cf.refCount--
+       if cf.refCount > 0 {
+               return
+       }
        delete(e.compiledFunctions, module.ID)
 }
 
 func (e *engine) addCompiledFunctions(module *wasm.Module, fs []compiledFunction) {
        e.mux.Lock()
        defer e.mux.Unlock()
-       e.compiledFunctions[module.ID] = fs
+       e.compiledFunctions[module.ID] = &compiledFunctionWithCount{funcs: fs, refCount: 1}
 }
 
-func (e *engine) getCompiledFunctions(module *wasm.Module) (fs []compiledFunction, ok bool) {
-       e.mux.RLock()
-       defer e.mux.RUnlock()
-       fs, ok = e.compiledFunctions[module.ID]
+func (e *engine) getCompiledFunctions(module *wasm.Module, increaseRefCount bool) (fs []compiledFunction, ok bool) {
+       e.mux.Lock()
+       defer e.mux.Unlock()
+       cf, ok := e.compiledFunctions[module.ID]
+       if ok {
+               fs = cf.funcs
+               if increaseRefCount {
+                       cf.refCount++
+               }
+       }
        return
 }
 
@@ -242,15 +267,9 @@ type snapshot struct {
 
 // Snapshot implements the same method as documented on experimental.Snapshotter.
 func (ce *callEngine) Snapshot() experimental.Snapshot {
-       stack := make([]uint64, len(ce.stack))
-       copy(stack, ce.stack)
-
-       frames := make([]*callFrame, len(ce.frames))
-       copy(frames, ce.frames)
-
        return &snapshot{
-               stack:  stack,
-               frames: frames,
+               stack:  slices.Clone(ce.stack),
+               frames: slices.Clone(ce.frames),
                ce:     ce,
        }
 }
@@ -356,7 +375,7 @@ const callFrameStackSize = 0
 
 // CompileModule implements the same method as documented on wasm.Engine.
 func (e *engine) CompileModule(_ context.Context, module *wasm.Module, listeners []experimental.FunctionListener, ensureTermination bool) error {
-       if _, ok := e.getCompiledFunctions(module); ok { // cache hit!
+       if _, ok := e.getCompiledFunctions(module, true); ok { // cache hit!
                return nil
        }
 
@@ -405,7 +424,7 @@ func (e *engine) NewModuleEngine(module *wasm.Module, instance *wasm.ModuleInsta
                functions:    make([]function, len(module.FunctionSection)+int(module.ImportFunctionCount)),
        }
 
-       codes, ok := e.getCompiledFunctions(module)
+       codes, ok := e.getCompiledFunctions(module, false)
        if !ok {
                return nil, errors.New("source module must be compiled before instantiation")
        }
@@ -427,12 +446,10 @@ func (e *engine) NewModuleEngine(module *wasm.Module, instance *wasm.ModuleInsta
 // lowerIR lowers the interpreterir operations to engine friendly struct.
 func (e *engine) lowerIR(ir *compilationResult, ret *compiledFunction) error {
        // Copy the body from the result.
-       ret.body = make([]unionOperation, len(ir.Operations))
-       copy(ret.body, ir.Operations)
+       ret.body = slices.Clone(ir.Operations)
        // Also copy the offsets if necessary.
        if offsets := ir.IROperationSourceOffsetsInWasmBinary; len(offsets) > 0 {
-               ret.offsetsInWasmBinary = make([]uint64, len(offsets))
-               copy(ret.offsetsInWasmBinary, offsets)
+               ret.offsetsInWasmBinary = slices.Clone(offsets)
        }
 
        labelAddressResolutions := [labelKindNum][]uint64{}
@@ -449,9 +466,7 @@ func (e *engine) lowerIR(ir *compilationResult, ret *compiledFunction) error {
                        frameToAddresses := labelAddressResolutions[label.Kind()]
                        // Expand the slice if necessary.
                        if diff := fid - len(frameToAddresses) + 1; diff > 0 {
-                               for j := 0; j < diff; j++ {
-                                       frameToAddresses = append(frameToAddresses, 0)
-                               }
+                               frameToAddresses = append(frameToAddresses, make([]uint64, diff)...)
                        }
                        frameToAddresses[fid] = address
                        labelAddressResolutions[kind] = frameToAddresses
@@ -472,6 +487,8 @@ func (e *engine) lowerIR(ir *compilationResult, ret *compiledFunction) error {
                                target := op.Us[j]
                                e.setLabelAddress(&op.Us[j], label(target), labelAddressResolutions)
                        }
+               case operationKindTailCallReturnCallIndirect:
+                       e.setLabelAddress(&op.Us[1], label(op.Us[1]), labelAddressResolutions)
                }
        }
        return nil
@@ -761,18 +778,7 @@ func (ce *callEngine) callNativeFunc(ctx context.Context, m *wasm.ModuleInstance
                case operationKindCallIndirect:
                        offset := ce.popValue()
                        table := tables[op.U2]
-                       if offset >= uint64(len(table.References)) {
-                               panic(wasmruntime.ErrRuntimeInvalidTableAccess)
-                       }
-                       rawPtr := table.References[offset]
-                       if rawPtr == 0 {
-                               panic(wasmruntime.ErrRuntimeInvalidTableAccess)
-                       }
-
-                       tf := functionFromUintptr(rawPtr)
-                       if tf.typeID != typeIDs[op.U1] {
-                               panic(wasmruntime.ErrRuntimeIndirectCallTypeMismatch)
-                       }
+                       tf := ce.functionForOffset(table, offset, typeIDs[op.U1])
 
                        ce.callFunction(ctx, f.moduleInstance, tf)
                        frame.pc++
@@ -1725,12 +1731,17 @@ func (ce *callEngine) callNativeFunc(ctx context.Context, m *wasm.ModuleInstance
                        if fillSize+offset > uint64(len(memoryInst.Buffer)) {
                                panic(wasmruntime.ErrRuntimeOutOfBoundsMemoryAccess)
                        } else if fillSize != 0 {
-                               // Uses the copy trick for faster filling buffer.
-                               // https://gist.github.com/taylorza/df2f89d5f9ab3ffd06865062a4cf015d
+                               // Uses the copy trick for faster filling the buffer with the value.
+                               // https://github.com/golang/go/blob/go1.24.0/src/bytes/bytes.go#L664-L673
                                buf := memoryInst.Buffer[offset : offset+fillSize]
-                               buf[0] = value
-                               for i := 1; i < len(buf); i *= 2 {
-                                       copy(buf[i:], buf[:i])
+                               if value == 0 {
+                                       clear(buf)
+                               } else {
+                                       buf[0] = value
+                                       for i := 1; i < len(buf); {
+                                               chunk := min(i, 8192)
+                                               i += copy(buf[i:], buf[:chunk])
+                                       }
                                }
                        }
                        frame.pc++
@@ -1804,7 +1815,7 @@ func (ce *callEngine) callNativeFunc(ctx context.Context, m *wasm.ModuleInstance
                                panic(wasmruntime.ErrRuntimeInvalidTableAccess)
                        } else if num > 0 {
                                // Uses the copy trick for faster filling the region with the value.
-                               // https://gist.github.com/taylorza/df2f89d5f9ab3ffd06865062a4cf015d
+                               // https://github.com/golang/go/blob/go1.24.0/src/slices/slices.go#L514-L517
                                targetRegion := table.References[offset : offset+num]
                                targetRegion[0] = ref
                                for i := 1; i < len(targetRegion); i *= 2 {
@@ -4331,6 +4342,32 @@ func (ce *callEngine) callNativeFunc(ctx context.Context, m *wasm.ModuleInstance
                        memoryInst.Mux.Unlock()
                        ce.pushValue(uint64(old))
                        frame.pc++
+               case operationKindTailCallReturnCall:
+                       f := &functions[op.U1]
+                       ce.dropForTailCall(frame, f)
+                       body, bodyLen = ce.resetPc(frame, f)
+
+               case operationKindTailCallReturnCallIndirect:
+                       offset := ce.popValue()
+                       table := tables[op.U2]
+                       tf := ce.functionForOffset(table, offset, typeIDs[op.U1])
+
+                       // We are allowing proper tail calls only across functions that belong to the same
+                       // module; for indirect calls, we have to enforce it at run-time.
+                       // For details, see internal/engine/RATIONALE.md
+                       if tf.moduleInstance != f.moduleInstance {
+                               // Revert to a normal call.
+                               ce.callFunction(ctx, f.moduleInstance, tf)
+                               // Return
+                               ce.drop(op.Us[0])
+                               // Jump to the function frame (return)
+                               frame.pc = op.Us[1]
+                               continue
+                       }
+
+                       ce.dropForTailCall(frame, tf)
+                       body, bodyLen = ce.resetPc(frame, tf)
+
                default:
                        frame.pc++
                }
@@ -4338,6 +4375,40 @@ func (ce *callEngine) callNativeFunc(ctx context.Context, m *wasm.ModuleInstance
        ce.popFrame()
 }
 
+func (ce *callEngine) dropForTailCall(frame *callFrame, f *function) {
+       base := frame.base - frame.f.funcType.ParamNumInUint64
+       paramCount := f.funcType.ParamNumInUint64
+       ce.stack = append(ce.stack[:base], ce.stack[len(ce.stack)-paramCount:]...)
+}
+
+func (ce *callEngine) resetPc(frame *callFrame, f *function) (body []unionOperation, bodyLen uint64) {
+       // The compiler is currently allowing proper tail call only across functions
+       // that belong to the same module; thus, we can overwrite the frame in-place.
+       // For details, see internal/engine/RATIONALE.md
+       frame.f = f
+       frame.base = len(ce.stack)
+       frame.pc = 0
+       body = frame.f.parent.body
+       bodyLen = uint64(len(body))
+       return body, bodyLen
+}
+
+func (ce *callEngine) functionForOffset(table *wasm.TableInstance, offset uint64, expectedTypeID wasm.FunctionTypeID) *function {
+       if offset >= uint64(len(table.References)) {
+               panic(wasmruntime.ErrRuntimeInvalidTableAccess)
+       }
+       rawPtr := table.References[offset]
+       if rawPtr == 0 {
+               panic(wasmruntime.ErrRuntimeInvalidTableAccess)
+       }
+
+       tf := functionFromUintptr(rawPtr)
+       if tf.typeID != expectedTypeID {
+               panic(wasmruntime.ErrRuntimeIndirectCallTypeMismatch)
+       }
+       return tf
+}
+
 func wasmCompatMax32bits(v1, v2 uint32) uint64 {
        return uint64(math.Float32bits(moremath.WasmCompatMax32(
                math.Float32frombits(v1),
@@ -4564,9 +4635,7 @@ func (ce *callEngine) callGoFuncWithStack(ctx context.Context, m *wasm.ModuleIns
        // In the interpreter engine, ce.stack may only have capacity to store
        // parameters. Grow when there are more results than parameters.
        if growLen := resultLen - paramLen; growLen > 0 {
-               for i := 0; i < growLen; i++ {
-                       ce.stack = append(ce.stack, 0)
-               }
+               ce.stack = append(ce.stack, make([]uint64, growLen)...)
                stackLen += growLen
        }
 
index 3087a718ff044de1f63f35468775a5186f5896d3..db3cfa250f6909376ef680e89213285de275c441 100644 (file)
@@ -445,6 +445,10 @@ func (o operationKind) String() (ret string) {
                ret = "operationKindAtomicRMW8Cmpxchg"
        case operationKindAtomicRMW16Cmpxchg:
                ret = "operationKindAtomicRMW16Cmpxchg"
+       case operationKindTailCallReturnCall:
+               ret = "operationKindTailCallReturnCall"
+       case operationKindTailCallReturnCallIndirect:
+               ret = "operationKindTailCallReturnCallIndirect"
        default:
                panic(fmt.Errorf("unknown operation %d", o))
        }
@@ -768,6 +772,11 @@ const (
        // operationKindAtomicRMW16Cmpxchg is the kind for NewOperationAtomicRMW16Cmpxchg.
        operationKindAtomicRMW16Cmpxchg
 
+       // operationKindTailCallReturnCall is the Kind for newOperationTailCallReturnCall.
+       operationKindTailCallReturnCall
+       // operationKindTailCallReturnCallIndirect is the Kind for newOperationKindTailCallReturnCallIndirect.
+       operationKindTailCallReturnCallIndirect
+
        // operationKindEnd is always placed at the bottom of this iota definition to be used in the test.
        operationKindEnd
 )
@@ -1097,6 +1106,12 @@ func (o unionOperation) String() string {
                operationKindAtomicRMW16Cmpxchg:
                return o.Kind.String()
 
+       case operationKindTailCallReturnCall:
+               return fmt.Sprintf("%s %d %s", o.Kind, o.U1, label(o.U2).String())
+
+       case operationKindTailCallReturnCallIndirect:
+               return fmt.Sprintf("%s %d %d", o.Kind, o.U1, o.U2)
+
        default:
                panic(fmt.Sprintf("TODO: %v", o.Kind))
        }
@@ -2810,3 +2825,21 @@ func newOperationAtomicRMW8Cmpxchg(unsignedType unsignedType, arg memoryArg) uni
 func newOperationAtomicRMW16Cmpxchg(unsignedType unsignedType, arg memoryArg) unionOperation {
        return unionOperation{Kind: operationKindAtomicRMW16Cmpxchg, B1: byte(unsignedType), U1: uint64(arg.Alignment), U2: uint64(arg.Offset)}
 }
+
+// newOperationTailCallReturnCall is a constructor for unionOperation with operationKindTailCallReturnCall.
+//
+// This corresponds to
+//
+//     wasm.OpcodeTailCallReturnCall.
+func newOperationTailCallReturnCall(functionIndex uint32) unionOperation {
+       return unionOperation{Kind: operationKindTailCallReturnCall, U1: uint64(functionIndex)}
+}
+
+// NewOperationCallIndirect is a constructor for unionOperation with operationKindTailCallReturnCallIndirect.
+//
+// This corresponds to
+//
+//     wasm.OpcodeTailCallReturnCallIndirect.
+func newOperationTailCallReturnCallIndirect(typeIndex, tableIndex uint32, dropDepth inclusiveRange, l label) unionOperation {
+       return unionOperation{Kind: operationKindTailCallReturnCallIndirect, U1: uint64(typeIndex), U2: uint64(tableIndex), Us: []uint64{dropDepth.AsU64(), uint64(l)}}
+}
index 7b9d5602da59d5e16cb0c5cddff6104179be75eb..da5ca3c15b9d24a571915f44b661b678fc7830ac 100644 (file)
@@ -272,9 +272,9 @@ func (c *compiler) wasmOpcodeSignature(op wasm.Opcode, index uint32) (*signature
                return signature_I32_None, nil
        case wasm.OpcodeReturn:
                return signature_None_None, nil
-       case wasm.OpcodeCall:
+       case wasm.OpcodeCall, wasm.OpcodeTailCallReturnCall:
                return c.funcTypeToSigs.get(c.funcs[index], false /* direct */), nil
-       case wasm.OpcodeCallIndirect:
+       case wasm.OpcodeCallIndirect, wasm.OpcodeTailCallReturnCallIndirect:
                return c.funcTypeToSigs.get(index, true /* call_indirect */), nil
        case wasm.OpcodeDrop:
                return signature_Unknown_None, nil
index 62d365015260142e7a0e28d8370397ebb5e443cf..8e3f08efcd4312977ec97d1ff465be19bd6a75cf 100644 (file)
@@ -88,7 +88,7 @@ type Compiler interface {
        MatchInstrOneOf(def SSAValueDefinition, opcodes []ssa.Opcode) ssa.Opcode
 
        // AddRelocationInfo appends the relocation information for the function reference at the current buffer offset.
-       AddRelocationInfo(funcRef ssa.FuncRef)
+       AddRelocationInfo(funcRef ssa.FuncRef, isTailCall bool)
 
        // AddSourceOffsetInfo appends the source offset information for the given offset.
        AddSourceOffsetInfo(executableOffset int64, sourceOffset ssa.SourceOffset)
@@ -115,6 +115,8 @@ type RelocationInfo struct {
        Offset int64
        // Target is the target function of the call instruction.
        FuncRef ssa.FuncRef
+       // IsTailCall indicates whether the call instruction is a tail call.
+       IsTailCall bool
 }
 
 // compiler implements Compiler.
@@ -352,10 +354,11 @@ func (c *compiler) SourceOffsetInfo() []SourceOffsetInfo {
 }
 
 // AddRelocationInfo implements Compiler.AddRelocationInfo.
-func (c *compiler) AddRelocationInfo(funcRef ssa.FuncRef) {
+func (c *compiler) AddRelocationInfo(funcRef ssa.FuncRef, isTailCall bool) {
        c.relocations = append(c.relocations, RelocationInfo{
-               Offset:  int64(len(c.buf)),
-               FuncRef: funcRef,
+               Offset:     int64(len(c.buf)),
+               FuncRef:    funcRef,
+               IsTailCall: isTailCall,
        })
 }
 
index 6a3e58f51f1a294b2653916faf236d7880b75463..901c87aafcc86c6ce0bffe294831fccda7f4b554 100644 (file)
@@ -21,7 +21,9 @@ type instruction struct {
 func (i *instruction) IsCall() bool { return i.kind == call }
 
 // IsIndirectCall implements regalloc.Instr.
-func (i *instruction) IsIndirectCall() bool { return i.kind == callIndirect }
+func (i *instruction) IsIndirectCall() bool {
+       return i.kind == callIndirect
+}
 
 // IsReturn implements regalloc.Instr.
 func (i *instruction) IsReturn() bool { return i.kind == ret }
@@ -288,6 +290,11 @@ func (i *instruction) String() string {
        case nopUseReg:
                return fmt.Sprintf("nop_use_reg %s", i.op1.format(true))
 
+       case tailCall:
+               return fmt.Sprintf("tailCall %s", ssa.FuncRef(i.u1))
+       case tailCallIndirect:
+               return fmt.Sprintf("tailCallIndirect %s", i.op1.format(true))
+
        default:
                panic(fmt.Sprintf("BUG: %d", int(i.kind)))
        }
@@ -357,7 +364,7 @@ func (i *instruction) Uses(regs *[]regalloc.VReg) []regalloc.VReg {
                default:
                        panic(fmt.Sprintf("BUG: invalid operand: %s", i))
                }
-       case useKindCallInd:
+       case useKindCallInd, useKindTailCallInd:
                op := i.op1
                switch op.kind {
                case operandKindReg:
@@ -428,13 +435,16 @@ func (i *instruction) Uses(regs *[]regalloc.VReg) []regalloc.VReg {
 func (i *instruction) AssignUse(index int, v regalloc.VReg) {
        switch uk := useKinds[i.kind]; uk {
        case useKindNone:
-       case useKindCallInd:
+       case useKindCallInd, useKindTailCallInd:
                if index != 0 {
                        panic("BUG")
                }
                op := &i.op1
                switch op.kind {
                case operandKindReg:
+                       if uk == useKindTailCallInd && v != r11VReg {
+                               panic("BUG")
+                       }
                        op.setReg(v)
                case operandKindMem:
                        op.addressMode().assignUses(index, v)
@@ -838,6 +848,12 @@ const (
        // nopUseReg is a meta instruction that uses one register and does nothing.
        nopUseReg
 
+       // tailCall is a meta instruction that emits a tail call.
+       tailCall
+
+       // tailCallIndirect is a meta instruction that emits a tail call with an indirect call.
+       tailCallIndirect
+
        instrMax
 )
 
@@ -1079,6 +1095,10 @@ func (k instructionKind) String() string {
                return "lockcmpxchg"
        case lockxadd:
                return "lockxadd"
+       case tailCall:
+               return "tailCall"
+       case tailCallIndirect:
+               return "tailCallIndirect"
        default:
                panic("BUG")
        }
@@ -1173,6 +1193,27 @@ func (i *instruction) asCallIndirect(ptr operand, abi *backend.FunctionABI) *ins
        return i
 }
 
+func (i *instruction) asTailCallReturnCall(ref ssa.FuncRef, abi *backend.FunctionABI) *instruction {
+       i.kind = tailCall
+       i.u1 = uint64(ref)
+       if abi != nil {
+               i.u2 = abi.ABIInfoAsUint64()
+       }
+       return i
+}
+
+func (i *instruction) asTailCallReturnCallIndirect(ptr operand, abi *backend.FunctionABI) *instruction {
+       if ptr.kind != operandKindReg && ptr.kind != operandKindMem {
+               panic("BUG")
+       }
+       i.kind = tailCallIndirect
+       i.op1 = ptr
+       if abi != nil {
+               i.u2 = abi.ABIInfoAsUint64()
+       }
+       return i
+}
+
 func (i *instruction) asRet() *instruction {
        i.kind = ret
        return i
@@ -2342,6 +2383,8 @@ var defKinds = [instrMax]defKind{
        lockxadd:               defKindNone,
        neg:                    defKindNone,
        nopUseReg:              defKindNone,
+       tailCall:               defKindCall,
+       tailCallIndirect:       defKindCall,
 }
 
 // String implements fmt.Stringer.
@@ -2375,6 +2418,7 @@ const (
        useKindBlendvpd
        useKindCall
        useKindCallInd
+       useKindTailCallInd
        useKindFcvtToSintSequence
        useKindFcvtToUintSequence
 )
@@ -2425,6 +2469,8 @@ var useKinds = [instrMax]useKind{
        lockxadd:               useKindOp1RegOp2,
        neg:                    useKindOp1,
        nopUseReg:              useKindOp1,
+       tailCall:               useKindCall,
+       tailCallIndirect:       useKindTailCallInd,
 }
 
 func (u useKind) String() string {
@@ -2441,6 +2487,8 @@ func (u useKind) String() string {
                return "call"
        case useKindCallInd:
                return "callInd"
+       case useKindTailCallInd:
+               return "tailCallInd"
        default:
                return "invalid"
        }
index 6637b428c1dd5e6df4148ef80e5137e4891bdb8f..d1eefbdb58c00afc67daf07e3a3837b1f619cb48 100644 (file)
@@ -1211,7 +1211,7 @@ func (i *instruction) encode(c backend.Compiler) (needsLabelResolution bool) {
        case call:
                c.EmitByte(0xe8)
                // Meaning that the call target is a function value, and requires relocation.
-               c.AddRelocationInfo(ssa.FuncRef(i.u1))
+               c.AddRelocationInfo(ssa.FuncRef(i.u1), false)
                // Note that this is zero as a placeholder for the call target if it's a function value.
                c.Emit4Bytes(uint32(i.u2))
 
@@ -1244,6 +1244,37 @@ func (i *instruction) encode(c backend.Compiler) (needsLabelResolution bool) {
                        panic("BUG: invalid operand kind")
                }
 
+       case tailCall:
+               // Encode as jmp.
+               c.EmitByte(0xe9)
+               // Meaning that the call target is a function value, and requires relocation.
+               c.AddRelocationInfo(ssa.FuncRef(i.u1), true)
+               // Note that this is zero as a placeholder for the call target if it's a function value.
+               c.Emit4Bytes(uint32(i.u2))
+
+       case tailCallIndirect:
+               op := i.op1
+
+               const opcodeNum = 1
+               const opcode = 0xff
+               const regMemSubOpcode = 4
+               rex := rexInfo(0).clearW()
+               switch op.kind {
+               // Indirect tail calls always take a register as the target.
+               // Note: the register should be a callee-saved register (usually r11).
+               case operandKindReg:
+                       dst := regEncodings[op.reg().RealReg()]
+                       encodeRegReg(c,
+                               legacyPrefixesNone,
+                               opcode, opcodeNum,
+                               regMemSubOpcode,
+                               dst,
+                               rex,
+                       )
+               default:
+                       panic("BUG: invalid operand kind")
+               }
+
        case xchg:
                src, dst := regEncodings[i.op1.reg().RealReg()], i.op2
                size := i.u1
index fd0d69ca93fc11297d0ffc3d03b3e21f30097e9a..57d9bb731774e3ee0bf8c7f1c8ba7358c350a9e1 100644 (file)
@@ -17,7 +17,7 @@ import (
 // NewBackend returns a new backend for arm64.
 func NewBackend() backend.Machine {
        m := &machine{
-               cpuFeatures:                         platform.CpuFeatures,
+               cpuFeatures:                         platform.CpuFeatures(),
                regAlloc:                            regalloc.NewAllocator[*instruction, *labelPosition, *regAllocFn](regInfo),
                spillSlots:                          map[regalloc.VRegID]int64{},
                amodePool:                           wazevoapi.NewPool[amode](nil),
@@ -1109,6 +1109,9 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) {
                atomicOp, size := instr.AtomicRmwData()
                m.lowerAtomicRmw(atomicOp, addr, val, size, instr.Return())
 
+       case ssa.OpcodeTailCallReturnCall, ssa.OpcodeTailCallReturnCallIndirect:
+               m.lowerTailCall(instr)
+
        default:
                panic("TODO: lowering " + op.String())
        }
@@ -1885,31 +1888,7 @@ func (m *machine) lowerStore(si *ssa.Instruction) {
 
 func (m *machine) lowerCall(si *ssa.Instruction) {
        isDirectCall := si.Opcode() == ssa.OpcodeCall
-       var indirectCalleePtr ssa.Value
-       var directCallee ssa.FuncRef
-       var sigID ssa.SignatureID
-       var args []ssa.Value
-       var isMemmove bool
-       if isDirectCall {
-               directCallee, sigID, args = si.CallData()
-       } else {
-               indirectCalleePtr, sigID, args, isMemmove = si.CallIndirectData()
-       }
-       calleeABI := m.c.GetFunctionABI(m.c.SSABuilder().ResolveSignature(sigID))
-
-       stackSlotSize := int64(calleeABI.AlignedArgResultStackSlotSize())
-       if m.maxRequiredStackSizeForCalls < stackSlotSize+16 {
-               m.maxRequiredStackSizeForCalls = stackSlotSize + 16 // 16 == return address + RBP.
-       }
-
-       // Note: See machine.SetupPrologue for the stack layout.
-       // The stack pointer decrease/increase will be inserted later in the compilation.
-
-       for i, arg := range args {
-               reg := m.c.VRegOf(arg)
-               def := m.c.ValueDefinition(arg)
-               m.callerGenVRegToFunctionArg(calleeABI, i, reg, def, stackSlotSize)
-       }
+       indirectCalleePtr, directCallee, isMemmove, calleeABI, stackSlotSize := m.prepareCall(si, isDirectCall)
 
        if isMemmove {
                // Go's memmove *might* use all xmm0-xmm15, so we need to release them.
@@ -1939,6 +1918,39 @@ func (m *machine) lowerCall(si *ssa.Instruction) {
                m.insert(m.allocateInstr().asNopUseReg(regInfo.RealRegToVReg[rdx]))
        }
 
+       m.insertReturns(si, calleeABI, stackSlotSize)
+}
+
+func (m *machine) prepareCall(si *ssa.Instruction, isDirectCall bool) (ssa.Value, ssa.FuncRef, bool, *backend.FunctionABI, int64) {
+       var indirectCalleePtr ssa.Value
+       var directCallee ssa.FuncRef
+       var sigID ssa.SignatureID
+       var args []ssa.Value
+       var isMemmove bool
+       if isDirectCall {
+               directCallee, sigID, args = si.CallData()
+       } else {
+               indirectCalleePtr, sigID, args, isMemmove = si.CallIndirectData()
+       }
+       calleeABI := m.c.GetFunctionABI(m.c.SSABuilder().ResolveSignature(sigID))
+
+       stackSlotSize := int64(calleeABI.AlignedArgResultStackSlotSize())
+       if m.maxRequiredStackSizeForCalls < stackSlotSize+16 {
+               m.maxRequiredStackSizeForCalls = stackSlotSize + 16 // 16 == return address + RBP.
+       }
+
+       // Note: See machine.SetupPrologue for the stack layout.
+       // The stack pointer decrease/increase will be inserted later in the compilation.
+
+       for i, arg := range args {
+               reg := m.c.VRegOf(arg)
+               def := m.c.ValueDefinition(arg)
+               m.callerGenVRegToFunctionArg(calleeABI, i, reg, def, stackSlotSize)
+       }
+       return indirectCalleePtr, directCallee, isMemmove, calleeABI, stackSlotSize
+}
+
+func (m *machine) insertReturns(si *ssa.Instruction, calleeABI *backend.FunctionABI, stackSlotSize int64) {
        var index int
        r1, rs := si.Returns()
        if r1.Valid() {
@@ -1952,6 +1964,43 @@ func (m *machine) lowerCall(si *ssa.Instruction) {
        }
 }
 
+func (m *machine) lowerTailCall(si *ssa.Instruction) {
+       isDirectCall := si.Opcode() == ssa.OpcodeTailCallReturnCall
+       indirectCalleePtr, directCallee, isMemmove, calleeABI, stackSlotSize := m.prepareCall(si, isDirectCall)
+       if isMemmove {
+               panic("memmove not supported in tail calls")
+       }
+
+       isAllRegs := stackSlotSize == 0
+
+       switch {
+       case isDirectCall && isAllRegs:
+               call := m.allocateInstr().asTailCallReturnCall(directCallee, calleeABI)
+               m.insert(call)
+       case !isDirectCall && isAllRegs:
+               // In a tail call we insert the epilogue before the jump instruction,
+               // so an arbitrary register might be overwritten while restoring the stack.
+               // So, as compared to a regular indirect call, we ensure the pointer is stored
+               // in a caller-saved register (r11).
+               // For details, see internal/engine/RATIONALE.md
+               ptrOp := m.getOperand_Reg(m.c.ValueDefinition(indirectCalleePtr))
+               tmpJmp := r11VReg
+               m.InsertMove(tmpJmp, ptrOp.reg(), ssa.TypeI64)
+               callInd := m.allocateInstr().asTailCallReturnCallIndirect(newOperandReg(tmpJmp), calleeABI)
+               m.insert(callInd)
+       case isDirectCall && !isAllRegs:
+               call := m.allocateInstr().asCall(directCallee, calleeABI)
+               m.insert(call)
+       case !isDirectCall && !isAllRegs:
+               ptrOp := m.getOperand_Mem_Reg(m.c.ValueDefinition(indirectCalleePtr))
+               callInd := m.allocateInstr().asCallIndirect(ptrOp, calleeABI)
+               m.insert(callInd)
+       }
+
+       // If this is a proper tail call, returns will be cleared in the postRegAlloc phase.
+       m.insertReturns(si, calleeABI, stackSlotSize)
+}
+
 // callerGenVRegToFunctionArg is the opposite of GenFunctionArgToVReg, which is used to generate the
 // caller side of the function call.
 func (m *machine) callerGenVRegToFunctionArg(a *backend.FunctionABI, argIndex int, reg regalloc.VReg, def backend.SSAValueDefinition, stackSlotSize int64) {
index e53729860d0ca9683b3a83f3c495c2b25ebfa4dd..fa3ca58a6a30b933c992aa9dd20e683c21522f80 100644 (file)
@@ -188,6 +188,23 @@ func (m *machine) postRegAlloc() {
                                linkInstr(inc, next)
                        }
                        continue
+               case tailCall, tailCallIndirect:
+                       // At this point, reg alloc is done, therefore we can safely insert dec RPS instruction
+                       // right before the tail call (jump) instruction. If this is done before reg alloc, the stack slot
+                       // can point to the wrong location and therefore results in a wrong value.
+                       tailCall := cur
+                       _, _, _, _, size := backend.ABIInfoFromUint64(tailCall.u2)
+                       if size > 0 {
+                               dec := m.allocateInstr().asAluRmiR(aluRmiROpcodeSub, newOperandImm32(size), rspVReg, true)
+                               linkInstr(tailCall.prev, dec)
+                               linkInstr(dec, tailCall)
+                       }
+                       // In a tail call, we insert the epilogue before the jump instruction.
+                       m.setupEpilogueAfter(tailCall.prev)
+                       // If this has been encoded as a proper tail call, we can remove the trailing instructions
+                       // For details, see internal/engine/RATIONALE.md
+                       m.removeUntilRet(cur.next)
+                       continue
                }
 
                // Removes the redundant copy instruction.
@@ -278,6 +295,20 @@ func (m *machine) setupEpilogueAfter(cur *instruction) {
        linkInstr(cur, prevNext)
 }
 
+// removeUntilRet removes the instructions starting from `cur` until the first `ret` instruction.
+func (m *machine) removeUntilRet(cur *instruction) {
+       for ; cur != nil; cur = cur.next {
+               prev, next := cur.prev, cur.next
+               prev.next = next
+               if next != nil {
+                       next.prev = prev
+               }
+               if cur.kind == ret {
+                       return
+               }
+       }
+}
+
 func (m *machine) addRSP(offset int32, cur *instruction) *instruction {
        if offset == 0 {
                return cur
index d1eaa7cd4f3907e1ea62dc21d936af9e3e25560f..c300c3d61745742f89d30de3b5a117d1e37f0c55 100644 (file)
@@ -261,6 +261,23 @@ func (m *machine) resolveAddressModeForOffset(offset int64, dstBits byte, rn reg
 
 func (m *machine) lowerCall(si *ssa.Instruction) {
        isDirectCall := si.Opcode() == ssa.OpcodeCall
+       indirectCalleePtr, directCallee, calleeABI, stackSlotSize := m.prepareCall(si, isDirectCall)
+
+       if isDirectCall {
+               call := m.allocateInstr()
+               call.asCall(directCallee, calleeABI)
+               m.insert(call)
+       } else {
+               ptr := m.compiler.VRegOf(indirectCalleePtr)
+               callInd := m.allocateInstr()
+               callInd.asCallIndirect(ptr, calleeABI)
+               m.insert(callInd)
+       }
+
+       m.insertReturns(si, calleeABI, stackSlotSize)
+}
+
+func (m *machine) prepareCall(si *ssa.Instruction, isDirectCall bool) (ssa.Value, ssa.FuncRef, *backend.FunctionABI, int64) {
        var indirectCalleePtr ssa.Value
        var directCallee ssa.FuncRef
        var sigID ssa.SignatureID
@@ -282,18 +299,10 @@ func (m *machine) lowerCall(si *ssa.Instruction) {
                def := m.compiler.ValueDefinition(arg)
                m.callerGenVRegToFunctionArg(calleeABI, i, reg, def, stackSlotSize)
        }
+       return indirectCalleePtr, directCallee, calleeABI, stackSlotSize
+}
 
-       if isDirectCall {
-               call := m.allocateInstr()
-               call.asCall(directCallee, calleeABI)
-               m.insert(call)
-       } else {
-               ptr := m.compiler.VRegOf(indirectCalleePtr)
-               callInd := m.allocateInstr()
-               callInd.asCallIndirect(ptr, calleeABI)
-               m.insert(callInd)
-       }
-
+func (m *machine) insertReturns(si *ssa.Instruction, calleeABI *backend.FunctionABI, stackSlotSize int64) {
        var index int
        r1, rs := si.Returns()
        if r1.Valid() {
@@ -307,6 +316,40 @@ func (m *machine) lowerCall(si *ssa.Instruction) {
        }
 }
 
+func (m *machine) lowerTailCall(si *ssa.Instruction) {
+       isDirectCall := si.Opcode() == ssa.OpcodeTailCallReturnCall
+       indirectCalleePtr, directCallee, calleeABI, stackSlotSize := m.prepareCall(si, isDirectCall)
+
+       // We currently support tail calls only when the args are passed via registers
+       // otherwise we fall back to a plain call.
+       // For details, see internal/engine/RATIONALE.md
+       isAllRegs := stackSlotSize == 0
+
+       switch {
+       case isDirectCall && isAllRegs:
+               tailJump := m.allocateInstr()
+               tailJump.asTailCall(directCallee, calleeABI)
+               m.insert(tailJump)
+       case !isDirectCall && isAllRegs:
+               ptr := m.compiler.VRegOf(indirectCalleePtr)
+               callInd := m.allocateInstr()
+               callInd.asTailCallIndirect(ptr, calleeABI)
+               m.insert(callInd)
+       case isDirectCall && !isAllRegs:
+               tailJump := m.allocateInstr()
+               tailJump.asCall(directCallee, calleeABI)
+               m.insert(tailJump)
+       case !isDirectCall && !isAllRegs:
+               ptr := m.compiler.VRegOf(indirectCalleePtr)
+               callInd := m.allocateInstr()
+               callInd.asCallIndirect(ptr, calleeABI)
+               m.insert(callInd)
+       }
+
+       // If this is a proper tail call, returns will be cleared in the postRegAlloc phase.
+       m.insertReturns(si, calleeABI, stackSlotSize)
+}
+
 func (m *machine) insertAddOrSubStackPointer(rd regalloc.VReg, diff int64, add bool) {
        if imm12Operand, ok := asImm12Operand(uint64(diff)); ok {
                alu := m.allocateInstr()
index 1f563428aa11e2550ce044feabd88d8decf663f5..560044673f35cac24f62886a6424ee1f7e19b55a 100644 (file)
@@ -140,6 +140,8 @@ var defKinds = [numInstructionKinds]defKind{
        atomicStore:          defKindNone,
        dmb:                  defKindNone,
        loadConstBlockArg:    defKindRD,
+       tailCall:             defKindCall,
+       tailCallInd:          defKindCall,
 }
 
 // Defs returns the list of regalloc.VReg that are defined by the instruction.
@@ -278,6 +280,8 @@ var useKinds = [numInstructionKinds]useKind{
        atomicStore:          useKindRNRM,
        loadConstBlockArg:    useKindNone,
        dmb:                  useKindNone,
+       tailCall:             useKindCall,
+       tailCallInd:          useKindCallInd,
 }
 
 // Uses returns the list of regalloc.VReg that are used by the instruction.
@@ -1501,6 +1505,10 @@ func (i *instruction) String() (str string) {
                str = fmt.Sprintf("%s %s, %s", m, formatVRegSized(i.rm.nr(), size), formatVRegSized(i.rn.nr(), 64))
        case dmb:
                str = "dmb"
+       case tailCall:
+               str = fmt.Sprintf("b %s", ssa.FuncRef(i.u1))
+       case tailCallInd:
+               str = fmt.Sprintf("b %s", formatVRegSized(i.rn.nr(), 64))
        case udf:
                str = "udf"
        case emitSourceOffsetInfo:
@@ -1550,6 +1558,22 @@ func (i *instruction) asDMB() {
        i.kind = dmb
 }
 
+func (i *instruction) asTailCall(ref ssa.FuncRef, abi *backend.FunctionABI) {
+       i.kind = tailCall
+       i.u1 = uint64(ref)
+       if abi != nil {
+               i.u2 = abi.ABIInfoAsUint64()
+       }
+}
+
+func (i *instruction) asTailCallIndirect(ptr regalloc.VReg, abi *backend.FunctionABI) {
+       i.kind = tailCallInd
+       i.rn = operandNR(ptr)
+       if abi != nil {
+               i.u2 = abi.ABIInfoAsUint64()
+       }
+}
+
 // TODO: delete unnecessary things.
 const (
        // nop0 represents a no-op of zero size.
@@ -1727,6 +1751,10 @@ const (
        atomicStore
        // dmb represents the data memory barrier instruction in inner-shareable (ish) mode.
        dmb
+       // tailCall represents a tail call instruction.
+       tailCall
+       // tailCallInd represents a tail call indirect instruction.
+       tailCallInd
        // UDF is the undefined instruction. For debugging only.
        udf
        // loadConstBlockArg represents a load of a constant block argument.
index 21be9b71e752484caac0db5d39d4a8b8568e18f3..5326a5e2821898cee0fa4643371d778583f80869 100644 (file)
@@ -39,7 +39,7 @@ func (i *instruction) encode(m *machine) {
                c.Emit4Bytes(encodeUnconditionalBranch(false, imm))
        case call:
                // We still don't know the exact address of the function to call, so we emit a placeholder.
-               c.AddRelocationInfo(i.callFuncRef())
+               c.AddRelocationInfo(i.callFuncRef(), false)
                c.Emit4Bytes(encodeUnconditionalBranch(true, 0)) // 0 = placeholder
        case callInd:
                c.Emit4Bytes(encodeUnconditionalBranchReg(regNumberInEncoding[i.rn.realReg()], true))
@@ -417,6 +417,12 @@ func (i *instruction) encode(m *machine) {
                ))
        case dmb:
                c.Emit4Bytes(encodeDMB())
+       case tailCall:
+               // We still don't know the exact address of the function to call, so we emit a placeholder.
+               c.AddRelocationInfo(i.callFuncRef(), true)        // true = IsTailCall
+               c.Emit4Bytes(encodeUnconditionalBranch(false, 0)) // 0 = placeholder
+       case tailCallInd:
+               c.Emit4Bytes(encodeUnconditionalBranchReg(regNumberInEncoding[i.rn.realReg()], false))
        default:
                panic(i.String())
        }
index f9df356c0e211519a2e5f9247b5373298644222f..190bc601496361d43330399ed6601191eadd1cf1 100644 (file)
@@ -788,6 +788,9 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) {
                instr.asDMB()
                m.insert(instr)
 
+       case ssa.OpcodeTailCallReturnCall, ssa.OpcodeTailCallReturnCallIndirect:
+               m.lowerTailCall(instr)
+
        default:
                panic("TODO: lowering " + op.String())
        }
index c646a8fab054ece8fe72b7c6d0b5118a6eb49f36..16d0746e5813a4d595fe8ecc12a4138e3712e1a2 100644 (file)
@@ -198,6 +198,11 @@ func (m *machine) postRegAlloc() {
                switch cur.kind {
                case ret:
                        m.setupEpilogueAfter(cur.prev)
+               case tailCall, tailCallInd:
+                       m.setupEpilogueAfter(cur.prev)
+                       // If this has been encoded as a proper tail call, we can remove the trailing instructions.
+                       // For details, see internal/engine/RATIONALE.md
+                       m.removeUntilRet(cur.next)
                case loadConstBlockArg:
                        lc := cur
                        next := lc.next
@@ -325,6 +330,20 @@ func (m *machine) setupEpilogueAfter(cur *instruction) {
        linkInstr(cur, prevNext)
 }
 
+// removeUntilRet removes the instructions starting from `cur` until the first `ret` instruction.
+func (m *machine) removeUntilRet(cur *instruction) {
+       for ; cur != nil; cur = cur.next {
+               prev, next := cur.prev, cur.next
+               prev.next = next
+               if next != nil {
+                       next.prev = prev
+               }
+               if cur.kind == ret {
+                       return
+               }
+       }
+}
+
 // saveRequiredRegs is the set of registers that must be saved/restored during growing stack when there's insufficient
 // stack space left. Basically this is the combination of CalleeSavedRegisters plus argument registers execpt for x0,
 // which always points to the execution context whenever the native code is entered from Go.
index 932fe842bfd640f39697a62f37ab2669cdc3f22b..9bb4dee15ce816eece06caa690ffb07b62e04ffb 100644 (file)
@@ -59,13 +59,19 @@ func (m *machine) ResolveRelocations(
                if diff < minUnconditionalBranchOffset || diff > maxUnconditionalBranchOffset {
                        // Find the near trampoline island from callTrampolineIslandOffsets.
                        islandOffset := searchTrampolineIsland(callTrampolineIslandOffsets, int(instrOffset))
-                       islandTargetOffset := islandOffset + trampolineCallSize*int(r.FuncRef)
+                       // Imported functions don't need trampolines, so we ignore them when we compute the offset
+                       // (see also encodeCallTrampolineIsland)
+                       funcOffset := int(r.FuncRef) - importedFns
+                       islandTargetOffset := islandOffset + trampolineCallSize*funcOffset
                        diff = int64(islandTargetOffset) - (instrOffset)
                        if diff < minUnconditionalBranchOffset || diff > maxUnconditionalBranchOffset {
                                panic("BUG in trampoline placement")
                        }
                }
-               binary.LittleEndian.PutUint32(executable[instrOffset:instrOffset+4], encodeUnconditionalBranch(true, diff))
+               // The unconditional branch instruction is usually encoded as a branch-and-link (BL),
+               // because it is a function call. However, if the instruction is a tail call,
+               // we encode it as a plain unconditional branch (B), so we won't overwrite the link register.
+               binary.LittleEndian.PutUint32(executable[instrOffset:instrOffset+4], encodeUnconditionalBranch(!r.IsTailCall, diff))
        }
 }
 
index a6df3e7e798f71228d6d3e61381b8ad17d99dcea..a603dbdd7f5eaf5c779748b4562eec908bceecfc 100644 (file)
@@ -6,8 +6,10 @@ import (
        "errors"
        "fmt"
        "runtime"
+       "slices"
        "sort"
        "sync"
+       "sync/atomic"
        "unsafe"
 
        "github.com/tetratelabs/wazero/api"
@@ -23,11 +25,15 @@ import (
 )
 
 type (
+       compiledModuleWithCount struct {
+               *compiledModule
+               refCount int
+       }
        // engine implements wasm.Engine.
        engine struct {
                wazeroVersion   string
                fileCache       filecache.Cache
-               compiledModules map[wasm.ModuleID]*compiledModule
+               compiledModules map[wasm.ModuleID]*compiledModuleWithCount
                // sortedCompiledModules is a list of compiled modules sorted by the initial address of the executable.
                sortedCompiledModules []*compiledModule
                mux                   sync.RWMutex
@@ -42,25 +48,32 @@ type (
        }
 
        sharedFunctions struct {
-               // memoryGrowExecutable is a compiled trampoline executable for memory.grow builtin function.
-               memoryGrowExecutable []byte
-               // checkModuleExitCode is a compiled trampoline executable for checking module instance exit code. This
-               // is used when ensureTermination is true.
-               checkModuleExitCode []byte
-               // stackGrowExecutable is a compiled executable for growing stack builtin function.
-               stackGrowExecutable []byte
-               // tableGrowExecutable is a compiled trampoline executable for table.grow builtin function.
-               tableGrowExecutable []byte
-               // refFuncExecutable is a compiled trampoline executable for ref.func builtin function.
-               refFuncExecutable []byte
-               // memoryWait32Executable is a compiled trampoline executable for memory.wait32 builtin function
-               memoryWait32Executable []byte
-               // memoryWait64Executable is a compiled trampoline executable for memory.wait64 builtin function
-               memoryWait64Executable []byte
-               // memoryNotifyExecutable is a compiled trampoline executable for memory.notify builtin function
-               memoryNotifyExecutable    []byte
-               listenerBeforeTrampolines map[*wasm.FunctionType][]byte
-               listenerAfterTrampolines  map[*wasm.FunctionType][]byte
+               // The compiled trampolines executable.
+               executable []byte
+               // memoryGrowAddress is the address of memory.grow builtin function.
+               memoryGrowAddress *byte
+               // checkModuleExitCodeAddress is the address of checking module instance exit code.
+               // This is used when ensureTermination is true.
+               checkModuleExitCodeAddress *byte
+               // stackGrowAddress is the address of growing stack builtin function.
+               stackGrowAddress *byte
+               // tableGrowAddress is the address of table.grow builtin function.
+               tableGrowAddress *byte
+               // refFuncAddress is the address of ref.func builtin function.
+               refFuncAddress *byte
+               // memoryWait32Address is the address of memory.wait32 builtin function
+               memoryWait32Address *byte
+               // memoryWait64Address is the address of memory.wait64 builtin function
+               memoryWait64Address *byte
+               // memoryNotifyAddress is the address of memory.notify builtin function
+               memoryNotifyAddress *byte
+               listenerTrampolines listenerTrampolines
+       }
+
+       listenerTrampolines = map[*wasm.FunctionType]struct {
+               executable []byte
+               before     *byte
+               after      *byte
        }
 
        // compiledModule is a compiled variant of a wasm.Module and ready to be used for instantiation.
@@ -83,8 +96,9 @@ type (
        }
 
        executables struct {
-               executable     []byte
-               entryPreambles [][]byte
+               executable         []byte
+               entryPreambles     []byte
+               entryPreamblesPtrs []*byte
        }
 )
 
@@ -105,7 +119,7 @@ func NewEngine(ctx context.Context, _ api.CoreFeatures, fc filecache.Cache) wasm
        machine := newMachine()
        be := backend.NewCompiler(ctx, machine, ssa.NewBuilder())
        e := &engine{
-               compiledModules: make(map[wasm.ModuleID]*compiledModule),
+               compiledModules: make(map[wasm.ModuleID]*compiledModuleWithCount),
                setFinalizer:    runtime.SetFinalizer,
                machine:         machine,
                be:              be,
@@ -164,23 +178,46 @@ func (e *engine) CompileModule(ctx context.Context, module *wasm.Module, listene
 }
 
 func (exec *executables) compileEntryPreambles(m *wasm.Module, machine backend.Machine, be backend.Compiler) {
-       exec.entryPreambles = make([][]byte, len(m.TypeSection))
-       for i := range m.TypeSection {
+       if len(m.TypeSection) == 0 {
+               return
+       }
+
+       var preambles []byte
+       sizes := make([]int, len(m.TypeSection))
+
+       for i := range sizes {
                typ := &m.TypeSection[i]
                sig := frontend.SignatureForWasmFunctionType(typ)
                be.Init()
                buf := machine.CompileEntryPreamble(&sig)
-               executable := mmapExecutable(buf)
-               exec.entryPreambles[i] = executable
+               preambles = append(preambles, buf...)
+               align := 15 & -len(preambles) // Align 16-bytes boundary.
+               preambles = append(preambles, make([]byte, align)...)
+               sizes[i] = len(buf) + align
+       }
+
+       exec.entryPreambles = mmapExecutable(preambles)
+       exec.entryPreamblesPtrs = make([]*byte, len(sizes))
+
+       offset := 0
+       for i, size := range sizes {
+               ptr := &exec.entryPreambles[offset]
+               exec.entryPreamblesPtrs[i] = ptr
+               offset += size
 
                if wazevoapi.PerfMapEnabled {
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&executable[0])),
-                               uint64(len(executable)), fmt.Sprintf("entry_preamble::type=%s", typ.String()))
+                       typ := &m.TypeSection[i]
+                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(ptr)),
+                               uint64(size), fmt.Sprintf("entry_preamble::type=%s", typ.String()))
                }
        }
 }
 
 func (e *engine) compileModule(ctx context.Context, module *wasm.Module, listeners []experimental.FunctionListener, ensureTermination bool) (*compiledModule, error) {
+       if module.IsHostModule {
+               return e.compileHostModule(ctx, module, listeners)
+       }
+
        withListener := len(listeners) > 0
        cm := &compiledModule{
                offsets: wazevoapi.NewModuleContextOffsetData(module, withListener), parent: e, module: module,
@@ -188,116 +225,137 @@ func (e *engine) compileModule(ctx context.Context, module *wasm.Module, listene
                executables:       &executables{},
        }
 
-       if module.IsHostModule {
-               return e.compileHostModule(ctx, module, listeners)
-       }
-
        importedFns, localFns := int(module.ImportFunctionCount), len(module.FunctionSection)
        if localFns == 0 {
                return cm, nil
        }
 
-       rels := make([]backend.RelocationInfo, 0)
-       refToBinaryOffset := make([]int, importedFns+localFns)
-
-       if wazevoapi.DeterministicCompilationVerifierEnabled {
-               // The compilation must be deterministic regardless of the order of functions being compiled.
-               wazevoapi.DeterministicCompilationVerifierRandomizeIndexes(ctx)
+       machine := newMachine()
+       relocator, err := newEngineRelocator(machine, importedFns, localFns)
+       if err != nil {
+               return nil, err
        }
 
        needSourceInfo := module.DWARFLines != nil
 
-       // Creates new compiler instances which are reused for each function.
        ssaBuilder := ssa.NewBuilder()
-       fe := frontend.NewFrontendCompiler(module, ssaBuilder, &cm.offsets, ensureTermination, withListener, needSourceInfo)
-       machine := newMachine()
        be := backend.NewCompiler(ctx, machine, ssaBuilder)
-
        cm.executables.compileEntryPreambles(module, machine, be)
-
-       totalSize := 0 // Total binary size of the executable.
        cm.functionOffsets = make([]int, localFns)
-       bodies := make([][]byte, localFns)
 
-       // Trampoline relocation related variables.
-       trampolineInterval, callTrampolineIslandSize, err := machine.CallTrampolineIslandInfo(localFns)
-       if err != nil {
-               return nil, err
+       var indexes []int
+       if wazevoapi.DeterministicCompilationVerifierEnabled {
+               // The compilation must be deterministic regardless of the order of functions being compiled.
+               indexes = wazevoapi.DeterministicCompilationVerifierRandomizeIndexes(ctx)
        }
-       needCallTrampoline := callTrampolineIslandSize > 0
-       var callTrampolineIslandOffsets []int // Holds the offsets of trampoline islands.
 
-       for i := range module.CodeSection {
-               if wazevoapi.DeterministicCompilationVerifierEnabled {
-                       i = wazevoapi.DeterministicCompilationVerifierGetRandomizedLocalFunctionIndex(ctx, i)
-               }
+       if workers := experimental.GetCompilationWorkers(ctx); workers <= 1 {
+               // Compile with a single goroutine.
+               fe := frontend.NewFrontendCompiler(module, ssaBuilder, &cm.offsets, ensureTermination, withListener, needSourceInfo)
 
-               fidx := wasm.Index(i + importedFns)
-
-               if wazevoapi.NeedFunctionNameInContext {
-                       def := module.FunctionDefinition(fidx)
-                       name := def.DebugName()
-                       if len(def.ExportNames()) > 0 {
-                               name = def.ExportNames()[0]
+               for i := range module.CodeSection {
+                       if wazevoapi.DeterministicCompilationVerifierEnabled {
+                               i = indexes[i]
                        }
-                       ctx = wazevoapi.SetCurrentFunctionName(ctx, i, fmt.Sprintf("[%d/%d]%s", i, len(module.CodeSection)-1, name))
-               }
-
-               needListener := len(listeners) > 0 && listeners[i] != nil
-               body, relsPerFunc, err := e.compileLocalWasmFunction(ctx, module, wasm.Index(i), fe, ssaBuilder, be, needListener)
-               if err != nil {
-                       return nil, fmt.Errorf("compile function %d/%d: %v", i, len(module.CodeSection)-1, err)
-               }
 
-               // Align 16-bytes boundary.
-               totalSize = (totalSize + 15) &^ 15
-               cm.functionOffsets[i] = totalSize
-
-               if needSourceInfo {
-                       // At the beginning of the function, we add the offset of the function body so that
-                       // we can resolve the source location of the call site of before listener call.
-                       cm.sourceMap.executableOffsets = append(cm.sourceMap.executableOffsets, uintptr(totalSize))
-                       cm.sourceMap.wasmBinaryOffsets = append(cm.sourceMap.wasmBinaryOffsets, module.CodeSection[i].BodyOffsetInCodeSection)
+                       fidx := wasm.Index(i + importedFns)
+                       fctx := functionContext(ctx, module, i, fidx)
 
-                       for _, info := range be.SourceOffsetInfo() {
-                               cm.sourceMap.executableOffsets = append(cm.sourceMap.executableOffsets, uintptr(totalSize)+uintptr(info.ExecutableOffset))
-                               cm.sourceMap.wasmBinaryOffsets = append(cm.sourceMap.wasmBinaryOffsets, uint64(info.SourceOffset))
+                       needListener := len(listeners) > i && listeners[i] != nil
+                       body, relsPerFunc, err := e.compileLocalWasmFunction(fctx, module, wasm.Index(i), fe, ssaBuilder, be, needListener)
+                       if err != nil {
+                               return nil, fmt.Errorf("compile function %d/%d: %v", i, len(module.CodeSection)-1, err)
                        }
-               }
 
-               fref := frontend.FunctionIndexToFuncRef(fidx)
-               refToBinaryOffset[fref] = totalSize
-
-               // At this point, relocation offsets are relative to the start of the function body,
-               // so we adjust it to the start of the executable.
-               for _, r := range relsPerFunc {
-                       r.Offset += int64(totalSize)
-                       rels = append(rels, r)
+                       relocator.appendFunction(fctx, module, cm, i, fidx, body, relsPerFunc, be.SourceOffsetInfo())
                }
-
-               bodies[i] = body
-               totalSize += len(body)
-               if wazevoapi.PrintMachineCodeHexPerFunction {
-                       fmt.Printf("[[[machine code for %s]]]\n%s\n\n", wazevoapi.GetCurrentFunctionName(ctx), hex.EncodeToString(body))
+       } else {
+               // Compile with N worker goroutines.
+               // Collect compiled functions across workers in a slice,
+               // to be added to the relocator in-order and resolved serially at the end.
+               // This uses more memory and CPU (across cores), but can be significantly faster.
+               type compiledFunc struct {
+                       fctx        context.Context
+                       fnum        int
+                       fidx        wasm.Index
+                       body        []byte
+                       relsPerFunc []backend.RelocationInfo
+                       offsPerFunc []backend.SourceOffsetInfo
+               }
+
+               compiledFuncs := make([]compiledFunc, len(module.CodeSection))
+               ctx, cancel := context.WithCancelCause(ctx)
+               defer cancel(nil)
+
+               var count atomic.Uint32
+               var wg sync.WaitGroup
+               wg.Add(workers)
+
+               for range workers {
+                       go func() {
+                               defer wg.Done()
+
+                               // Creates new compiler instances which are reused for each function.
+                               machine := newMachine()
+                               ssaBuilder := ssa.NewBuilder()
+                               be := backend.NewCompiler(ctx, machine, ssaBuilder)
+                               fe := frontend.NewFrontendCompiler(module, ssaBuilder, &cm.offsets, ensureTermination, withListener, needSourceInfo)
+
+                               for {
+                                       if err := ctx.Err(); err != nil {
+                                               // Compilation canceled!
+                                               return
+                                       }
+
+                                       i := int(count.Add(1)) - 1
+                                       if i >= len(module.CodeSection) {
+                                               return
+                                       }
+
+                                       if wazevoapi.DeterministicCompilationVerifierEnabled {
+                                               i = indexes[i]
+                                       }
+
+                                       fidx := wasm.Index(i + importedFns)
+                                       fctx := functionContext(ctx, module, i, fidx)
+
+                                       needListener := len(listeners) > i && listeners[i] != nil
+                                       body, relsPerFunc, err := e.compileLocalWasmFunction(fctx, module, wasm.Index(i), fe, ssaBuilder, be, needListener)
+                                       if err != nil {
+                                               cancel(fmt.Errorf("compile function %d/%d: %v", i, len(module.CodeSection)-1, err))
+                                               return
+                                       }
+
+                                       compiledFuncs[i] = compiledFunc{
+                                               fctx, i, fidx, body,
+                                               // These slices are internal to the backend compiler and since we are going to buffer them instead
+                                               // of process them immediately we need to copy the memory.
+                                               slices.Clone(relsPerFunc),
+                                               slices.Clone(be.SourceOffsetInfo()),
+                                       }
+                               }
+                       }()
+               }
+
+               wg.Wait()
+               if err := context.Cause(ctx); err != nil {
+                       return nil, err
                }
 
-               if needCallTrampoline {
-                       // If the total size exceeds the trampoline interval, we need to add a trampoline island.
-                       if totalSize/trampolineInterval > len(callTrampolineIslandOffsets) {
-                               callTrampolineIslandOffsets = append(callTrampolineIslandOffsets, totalSize)
-                               totalSize += callTrampolineIslandSize
-                       }
+               for i := range compiledFuncs {
+                       fn := &compiledFuncs[i]
+                       relocator.appendFunction(fn.fctx, module, cm, fn.fnum, fn.fidx, fn.body, fn.relsPerFunc, fn.offsPerFunc)
                }
        }
 
        // Allocate executable memory and then copy the generated machine code.
-       executable, err := platform.MmapCodeSegment(totalSize)
+       executable, err := platform.MmapCodeSegment(relocator.totalSize)
        if err != nil {
                panic(err)
        }
        cm.executable = executable
 
-       for i, b := range bodies {
+       for i, b := range relocator.bodies {
                offset := cm.functionOffsets[i]
                copy(executable[offset:], b)
        }
@@ -312,22 +370,108 @@ func (e *engine) compileModule(ctx context.Context, module *wasm.Module, listene
                }
        }
 
-       // Resolve relocations for local function calls.
-       if len(rels) > 0 {
-               machine.ResolveRelocations(refToBinaryOffset, importedFns, executable, rels, callTrampolineIslandOffsets)
-       }
+       relocator.resolveRelocations(machine, executable, importedFns)
 
-       if runtime.GOARCH == "arm64" {
-               // On arm64, we cannot give all of rwx at the same time, so we change it to exec.
-               if err = platform.MprotectRX(executable); err != nil {
-                       return nil, err
-               }
+       if err = platform.MprotectRX(executable); err != nil {
+               return nil, err
        }
        cm.sharedFunctions = e.sharedFunctions
        e.setFinalizer(cm.executables, executablesFinalizer)
        return cm, nil
 }
 
+func functionContext(ctx context.Context, module *wasm.Module, fnum int, fidx wasm.Index) context.Context {
+       if wazevoapi.NeedFunctionNameInContext {
+               def := module.FunctionDefinition(fidx)
+               name := def.DebugName()
+               if len(def.ExportNames()) > 0 {
+                       name = def.ExportNames()[0]
+               }
+               ctx = wazevoapi.SetCurrentFunctionName(ctx, fnum, fmt.Sprintf("[%d/%d]%s", fnum, len(module.CodeSection)-1, name))
+       }
+       return ctx
+}
+
+type engineRelocator struct {
+       bodies                      [][]byte
+       refToBinaryOffset           []int
+       rels                        []backend.RelocationInfo
+       totalSize                   int // Total binary size of the executable.
+       trampolineInterval          int
+       callTrampolineIslandSize    int
+       callTrampolineIslandOffsets []int // Holds the offsets of trampoline islands.
+}
+
+func newEngineRelocator(
+       machine backend.Machine,
+       importedFns, localFns int,
+) (r engineRelocator, err error) {
+       // Trampoline relocation related variables.
+       r.trampolineInterval, r.callTrampolineIslandSize, err = machine.CallTrampolineIslandInfo(localFns)
+       r.refToBinaryOffset = make([]int, importedFns+localFns)
+       r.bodies = make([][]byte, 0, localFns)
+       return
+}
+
+func (r *engineRelocator) resolveRelocations(machine backend.Machine, executable []byte, importedFns int) {
+       // Resolve relocations for local function calls.
+       if len(r.rels) > 0 {
+               machine.ResolveRelocations(r.refToBinaryOffset, importedFns, executable, r.rels, r.callTrampolineIslandOffsets)
+       }
+}
+
+func (r *engineRelocator) appendFunction(
+       ctx context.Context,
+       module *wasm.Module,
+       cm *compiledModule,
+       fnum int, fidx wasm.Index,
+       body []byte,
+       relsPerFunc []backend.RelocationInfo,
+       offsPerFunc []backend.SourceOffsetInfo,
+) {
+       // Align 16-bytes boundary.
+       r.totalSize = (r.totalSize + 15) &^ 15
+       cm.functionOffsets[fnum] = r.totalSize
+
+       needSourceInfo := module.DWARFLines != nil
+       if needSourceInfo {
+               // At the beginning of the function, we add the offset of the function body so that
+               // we can resolve the source location of the call site of before listener call.
+               cm.sourceMap.executableOffsets = append(cm.sourceMap.executableOffsets, uintptr(r.totalSize))
+               cm.sourceMap.wasmBinaryOffsets = append(cm.sourceMap.wasmBinaryOffsets, module.CodeSection[fnum].BodyOffsetInCodeSection)
+
+               for _, info := range offsPerFunc {
+                       cm.sourceMap.executableOffsets = append(cm.sourceMap.executableOffsets, uintptr(r.totalSize)+uintptr(info.ExecutableOffset))
+                       cm.sourceMap.wasmBinaryOffsets = append(cm.sourceMap.wasmBinaryOffsets, uint64(info.SourceOffset))
+               }
+       }
+
+       fref := frontend.FunctionIndexToFuncRef(fidx)
+       r.refToBinaryOffset[fref] = r.totalSize
+
+       // At this point, relocation offsets are relative to the start of the function body,
+       // so we adjust it to the start of the executable.
+       r.rels = slices.Grow(r.rels, len(relsPerFunc))
+       for _, rel := range relsPerFunc {
+               rel.Offset += int64(r.totalSize)
+               r.rels = append(r.rels, rel)
+       }
+
+       r.totalSize += len(body)
+       r.bodies = append(r.bodies, body)
+       if wazevoapi.PrintMachineCodeHexPerFunction {
+               fmt.Printf("[[[machine code for %s]]]\n%s\n\n", wazevoapi.GetCurrentFunctionName(ctx), hex.EncodeToString(body))
+       }
+
+       if r.callTrampolineIslandSize > 0 {
+               // If the total size exceeds the trampoline interval, we need to add a trampoline island.
+               if r.totalSize/r.trampolineInterval > len(r.callTrampolineIslandOffsets) {
+                       r.callTrampolineIslandOffsets = append(r.callTrampolineIslandOffsets, r.totalSize)
+                       r.totalSize += r.callTrampolineIslandSize
+               }
+       }
+}
+
 func (e *engine) compileLocalWasmFunction(
        ctx context.Context,
        module *wasm.Module,
@@ -374,9 +518,7 @@ func (e *engine) compileLocalWasmFunction(
        }
 
        // TODO: optimize as zero copy.
-       copied := make([]byte, len(original))
-       copy(copied, original)
-       return copied, rels, nil
+       return slices.Clone(original), rels, nil
 }
 
 func (e *engine) compileHostModule(ctx context.Context, module *wasm.Module, listeners []experimental.FunctionListener) (*compiledModule, error) {
@@ -448,9 +590,7 @@ func (e *engine) compileHostModule(ctx context.Context, module *wasm.Module, lis
                }
 
                // TODO: optimize as zero copy.
-               copied := make([]byte, len(body))
-               copy(copied, body)
-               bodies[i] = copied
+               bodies[i] = slices.Clone(body)
                totalSize += len(body)
        }
 
@@ -475,11 +615,8 @@ func (e *engine) compileHostModule(ctx context.Context, module *wasm.Module, lis
                wazevoapi.PerfMap.Flush(uintptr(unsafe.Pointer(&executable[0])), cm.functionOffsets)
        }
 
-       if runtime.GOARCH == "arm64" {
-               // On arm64, we cannot give all of rwx at the same time, so we change it to exec.
-               if err = platform.MprotectRX(executable); err != nil {
-                       return nil, err
-               }
+       if err = platform.MprotectRX(executable); err != nil {
+               return nil, err
        }
        e.setFinalizer(cm.executables, executablesFinalizer)
        return cm, nil
@@ -507,12 +644,17 @@ func (e *engine) DeleteCompiledModule(m *wasm.Module) {
        e.mux.Lock()
        defer e.mux.Unlock()
        cm, ok := e.compiledModules[m.ID]
-       if ok {
-               if len(cm.executable) > 0 {
-                       e.deleteCompiledModuleFromSortedList(cm)
-               }
-               delete(e.compiledModules, m.ID)
+       if !ok {
+               return
        }
+       cm.refCount--
+       if cm.refCount > 0 {
+               return
+       }
+       if len(cm.executable) > 0 {
+               e.deleteCompiledModuleFromSortedList(cm.compiledModule)
+       }
+       delete(e.compiledModules, m.ID)
 }
 
 func (e *engine) addCompiledModuleToSortedList(cm *compiledModule) {
@@ -569,7 +711,7 @@ func (e *engine) NewModuleEngine(m *wasm.Module, mi *wasm.ModuleInstance) (wasm.
        // Note: imported functions are resolved in moduleEngine.ResolveImportedFunction.
        me.importedFunctions = make([]importedFunction, m.ImportFunctionCount)
 
-       compiled, ok := e.getCompiledModuleFromMemory(m)
+       compiled, ok := e.getCompiledModuleFromMemory(m, false)
        if !ok {
                return nil, errors.New("source module must be compiled before instantiation")
        }
@@ -591,167 +733,123 @@ func (e *engine) NewModuleEngine(m *wasm.Module, mi *wasm.ModuleInstance) (wasm.
 }
 
 func (e *engine) compileSharedFunctions() {
-       e.sharedFunctions = &sharedFunctions{
-               listenerBeforeTrampolines: make(map[*wasm.FunctionType][]byte),
-               listenerAfterTrampolines:  make(map[*wasm.FunctionType][]byte),
+       var sizes [8]int
+       var trampolines []byte
+
+       addTrampoline := func(i int, buf []byte) {
+               trampolines = append(trampolines, buf...)
+               align := 15 & -len(trampolines) // Align 16-bytes boundary.
+               trampolines = append(trampolines, make([]byte, align)...)
+               sizes[i] = len(buf) + align
        }
 
        e.be.Init()
-       {
-               src := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeGrowMemory, &ssa.Signature{
+       addTrampoline(0,
+               e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeGrowMemory, &ssa.Signature{
                        Params:  []ssa.Type{ssa.TypeI64 /* exec context */, ssa.TypeI32},
                        Results: []ssa.Type{ssa.TypeI32},
-               }, false)
-               e.sharedFunctions.memoryGrowExecutable = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.memoryGrowExecutable
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "memory_grow_trampoline")
-               }
-       }
+               }, false))
 
        e.be.Init()
-       {
-               src := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeTableGrow, &ssa.Signature{
+       addTrampoline(1,
+               e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeTableGrow, &ssa.Signature{
                        Params:  []ssa.Type{ssa.TypeI64 /* exec context */, ssa.TypeI32 /* table index */, ssa.TypeI32 /* num */, ssa.TypeI64 /* ref */},
                        Results: []ssa.Type{ssa.TypeI32},
-               }, false)
-               e.sharedFunctions.tableGrowExecutable = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.tableGrowExecutable
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "table_grow_trampoline")
-               }
-       }
+               }, false))
 
        e.be.Init()
-       {
-               src := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeCheckModuleExitCode, &ssa.Signature{
+       addTrampoline(2,
+               e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeCheckModuleExitCode, &ssa.Signature{
                        Params:  []ssa.Type{ssa.TypeI32 /* exec context */},
                        Results: []ssa.Type{ssa.TypeI32},
-               }, false)
-               e.sharedFunctions.checkModuleExitCode = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.checkModuleExitCode
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "check_module_exit_code_trampoline")
-               }
-       }
+               }, false))
 
        e.be.Init()
-       {
-               src := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeRefFunc, &ssa.Signature{
+       addTrampoline(3,
+               e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeRefFunc, &ssa.Signature{
                        Params:  []ssa.Type{ssa.TypeI64 /* exec context */, ssa.TypeI32 /* function index */},
                        Results: []ssa.Type{ssa.TypeI64}, // returns the function reference.
-               }, false)
-               e.sharedFunctions.refFuncExecutable = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.refFuncExecutable
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "ref_func_trampoline")
-               }
-       }
+               }, false))
 
        e.be.Init()
-       {
-               src := e.machine.CompileStackGrowCallSequence()
-               e.sharedFunctions.stackGrowExecutable = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.stackGrowExecutable
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "stack_grow_trampoline")
-               }
-       }
+       addTrampoline(4, e.machine.CompileStackGrowCallSequence())
 
        e.be.Init()
-       {
-               src := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeMemoryWait32, &ssa.Signature{
+       addTrampoline(5,
+               e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeMemoryWait32, &ssa.Signature{
                        // exec context, timeout, expected, addr
                        Params: []ssa.Type{ssa.TypeI64, ssa.TypeI64, ssa.TypeI32, ssa.TypeI64},
                        // Returns the status.
                        Results: []ssa.Type{ssa.TypeI32},
-               }, false)
-               e.sharedFunctions.memoryWait32Executable = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.memoryWait32Executable
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "memory_wait32_trampoline")
-               }
-       }
+               }, false))
 
        e.be.Init()
-       {
-               src := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeMemoryWait64, &ssa.Signature{
+       addTrampoline(6,
+               e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeMemoryWait64, &ssa.Signature{
                        // exec context, timeout, expected, addr
                        Params: []ssa.Type{ssa.TypeI64, ssa.TypeI64, ssa.TypeI64, ssa.TypeI64},
                        // Returns the status.
                        Results: []ssa.Type{ssa.TypeI32},
-               }, false)
-               e.sharedFunctions.memoryWait64Executable = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.memoryWait64Executable
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "memory_wait64_trampoline")
-               }
-       }
+               }, false))
 
        e.be.Init()
-       {
-               src := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeMemoryNotify, &ssa.Signature{
+       addTrampoline(7,
+               e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeMemoryNotify, &ssa.Signature{
                        // exec context, count, addr
                        Params: []ssa.Type{ssa.TypeI64, ssa.TypeI32, ssa.TypeI64},
                        // Returns the number notified.
                        Results: []ssa.Type{ssa.TypeI32},
-               }, false)
-               e.sharedFunctions.memoryNotifyExecutable = mmapExecutable(src)
-               if wazevoapi.PerfMapEnabled {
-                       exe := e.sharedFunctions.memoryNotifyExecutable
-                       wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(&exe[0])), uint64(len(exe)), "memory_notify_trampoline")
-               }
+               }, false))
+
+       fns := &sharedFunctions{
+               executable:          mmapExecutable(trampolines),
+               listenerTrampolines: make(listenerTrampolines),
+       }
+       e.setFinalizer(fns, sharedFunctionsFinalizer)
+
+       offset := 0
+       fns.memoryGrowAddress = &fns.executable[offset]
+       offset += sizes[0]
+       fns.tableGrowAddress = &fns.executable[offset]
+       offset += sizes[1]
+       fns.checkModuleExitCodeAddress = &fns.executable[offset]
+       offset += sizes[2]
+       fns.refFuncAddress = &fns.executable[offset]
+       offset += sizes[3]
+       fns.stackGrowAddress = &fns.executable[offset]
+       offset += sizes[4]
+       fns.memoryWait32Address = &fns.executable[offset]
+       offset += sizes[5]
+       fns.memoryWait64Address = &fns.executable[offset]
+       offset += sizes[6]
+       fns.memoryNotifyAddress = &fns.executable[offset]
+
+       if wazevoapi.PerfMapEnabled {
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.memoryGrowAddress)), uint64(sizes[0]), "memory_grow_trampoline")
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.tableGrowAddress)), uint64(sizes[1]), "table_grow_trampoline")
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.checkModuleExitCodeAddress)), uint64(sizes[2]), "check_module_exit_code_trampoline")
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.refFuncAddress)), uint64(sizes[3]), "ref_func_trampoline")
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.stackGrowAddress)), uint64(sizes[4]), "stack_grow_trampoline")
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.memoryWait32Address)), uint64(sizes[5]), "memory_wait32_trampoline")
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.memoryWait64Address)), uint64(sizes[6]), "memory_wait64_trampoline")
+               wazevoapi.PerfMap.AddEntry(uintptr(unsafe.Pointer(fns.memoryNotifyAddress)), uint64(sizes[7]), "memory_notify_trampoline")
        }
 
-       e.setFinalizer(e.sharedFunctions, sharedFunctionsFinalizer)
+       e.sharedFunctions = fns
 }
 
 func sharedFunctionsFinalizer(sf *sharedFunctions) {
-       if err := platform.MunmapCodeSegment(sf.memoryGrowExecutable); err != nil {
-               panic(err)
-       }
-       if err := platform.MunmapCodeSegment(sf.checkModuleExitCode); err != nil {
-               panic(err)
-       }
-       if err := platform.MunmapCodeSegment(sf.stackGrowExecutable); err != nil {
-               panic(err)
-       }
-       if err := platform.MunmapCodeSegment(sf.tableGrowExecutable); err != nil {
-               panic(err)
-       }
-       if err := platform.MunmapCodeSegment(sf.refFuncExecutable); err != nil {
+       if err := platform.MunmapCodeSegment(sf.executable); err != nil {
                panic(err)
        }
-       if err := platform.MunmapCodeSegment(sf.memoryWait32Executable); err != nil {
-               panic(err)
-       }
-       if err := platform.MunmapCodeSegment(sf.memoryWait64Executable); err != nil {
-               panic(err)
-       }
-       if err := platform.MunmapCodeSegment(sf.memoryNotifyExecutable); err != nil {
-               panic(err)
-       }
-       for _, f := range sf.listenerBeforeTrampolines {
-               if err := platform.MunmapCodeSegment(f); err != nil {
-                       panic(err)
-               }
-       }
-       for _, f := range sf.listenerAfterTrampolines {
-               if err := platform.MunmapCodeSegment(f); err != nil {
+       for _, f := range sf.listenerTrampolines {
+               if err := platform.MunmapCodeSegment(f.executable); err != nil {
                        panic(err)
                }
        }
 
-       sf.memoryGrowExecutable = nil
-       sf.checkModuleExitCode = nil
-       sf.stackGrowExecutable = nil
-       sf.tableGrowExecutable = nil
-       sf.refFuncExecutable = nil
-       sf.memoryWait32Executable = nil
-       sf.memoryWait64Executable = nil
-       sf.memoryNotifyExecutable = nil
-       sf.listenerBeforeTrampolines = nil
-       sf.listenerAfterTrampolines = nil
+       sf.executable = nil
+       sf.listenerTrampolines = nil
 }
 
 func executablesFinalizer(exec *executables) {
@@ -762,12 +860,13 @@ func executablesFinalizer(exec *executables) {
        }
        exec.executable = nil
 
-       for _, f := range exec.entryPreambles {
-               if err := platform.MunmapCodeSegment(f); err != nil {
+       if len(exec.entryPreambles) > 0 {
+               if err := platform.MunmapCodeSegment(exec.entryPreambles); err != nil {
                        panic(err)
                }
        }
        exec.entryPreambles = nil
+       exec.entryPreamblesPtrs = nil
 }
 
 func mmapExecutable(src []byte) []byte {
@@ -778,11 +877,8 @@ func mmapExecutable(src []byte) []byte {
 
        copy(executable, src)
 
-       if runtime.GOARCH == "arm64" {
-               // On arm64, we cannot give all of rwx at the same time, so we change it to exec.
-               if err = platform.MprotectRX(executable); err != nil {
-                       panic(err)
-               }
+       if err = platform.MprotectRX(executable); err != nil {
+               panic(err)
        }
        return executable
 }
@@ -804,25 +900,30 @@ func (e *engine) getListenerTrampolineForType(functionType *wasm.FunctionType) (
        e.mux.Lock()
        defer e.mux.Unlock()
 
-       beforeBuf, ok := e.sharedFunctions.listenerBeforeTrampolines[functionType]
-       afterBuf := e.sharedFunctions.listenerAfterTrampolines[functionType]
-       if ok {
-               return &beforeBuf[0], &afterBuf[0]
-       }
+       trampoline, ok := e.sharedFunctions.listenerTrampolines[functionType]
+       if !ok {
+               var executable []byte
+               beforeSig, afterSig := frontend.SignatureForListener(functionType)
 
-       beforeSig, afterSig := frontend.SignatureForListener(functionType)
+               e.be.Init()
+               buf := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeCallListenerBefore, beforeSig, false)
+               executable = append(executable, buf...)
 
-       e.be.Init()
-       buf := e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeCallListenerBefore, beforeSig, false)
-       beforeBuf = mmapExecutable(buf)
+               align := 15 & -len(executable) // Align 16-bytes boundary.
+               executable = append(executable, make([]byte, align)...)
+               offset := len(executable)
 
-       e.be.Init()
-       buf = e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeCallListenerAfter, afterSig, false)
-       afterBuf = mmapExecutable(buf)
+               e.be.Init()
+               buf = e.machine.CompileGoFunctionTrampoline(wazevoapi.ExitCodeCallListenerAfter, afterSig, false)
+               executable = append(executable, buf...)
 
-       e.sharedFunctions.listenerBeforeTrampolines[functionType] = beforeBuf
-       e.sharedFunctions.listenerAfterTrampolines[functionType] = afterBuf
-       return &beforeBuf[0], &afterBuf[0]
+               trampoline.executable = mmapExecutable(executable)
+               trampoline.before = &trampoline.executable[0]
+               trampoline.after = &trampoline.executable[offset]
+
+               e.sharedFunctions.listenerTrampolines[functionType] = trampoline
+       }
+       return trampoline.before, trampoline.after
 }
 
 func (cm *compiledModule) getSourceOffset(pc uintptr) uint64 {
index e49353dc8e987a7df4f4546262ee22f0237a027d..e0446e08a69eb2cf4160bcc68d9e697e25854309 100644 (file)
@@ -8,7 +8,6 @@ import (
        "fmt"
        "hash/crc32"
        "io"
-       "runtime"
        "unsafe"
 
        "github.com/tetratelabs/wazero/experimental"
@@ -33,7 +32,7 @@ func fileCacheKey(m *wasm.Module) (ret filecache.Key) {
        s.Write(magic)
        // Write the CPU features so that we can cache the compiled module for the same CPU.
        // This prevents the incompatible CPU features from being used.
-       cpu := platform.CpuFeatures.Raw()
+       cpu := platform.CpuFeatures().Raw()
        // Reuse the `ret` buffer to write the first 8 bytes of the CPU features so that we can avoid the allocation.
        binary.LittleEndian.PutUint64(ret[:8], cpu)
        s.Write(ret[:8])
@@ -51,7 +50,7 @@ func (e *engine) addCompiledModule(module *wasm.Module, cm *compiledModule) (err
 }
 
 func (e *engine) getCompiledModule(module *wasm.Module, listeners []experimental.FunctionListener, ensureTermination bool) (cm *compiledModule, ok bool, err error) {
-       cm, ok = e.getCompiledModuleFromMemory(module)
+       cm, ok = e.getCompiledModuleFromMemory(module, true)
        if ok {
                return
        }
@@ -88,16 +87,23 @@ func (e *engine) getCompiledModule(module *wasm.Module, listeners []experimental
 func (e *engine) addCompiledModuleToMemory(m *wasm.Module, cm *compiledModule) {
        e.mux.Lock()
        defer e.mux.Unlock()
-       e.compiledModules[m.ID] = cm
+       e.compiledModules[m.ID] = &compiledModuleWithCount{compiledModule: cm, refCount: 1}
        if len(cm.executable) > 0 {
                e.addCompiledModuleToSortedList(cm)
        }
 }
 
-func (e *engine) getCompiledModuleFromMemory(module *wasm.Module) (cm *compiledModule, ok bool) {
-       e.mux.RLock()
-       defer e.mux.RUnlock()
-       cm, ok = e.compiledModules[module.ID]
+func (e *engine) getCompiledModuleFromMemory(module *wasm.Module, increaseRefCount bool) (cm *compiledModule, ok bool) {
+       e.mux.Lock()
+       defer e.mux.Unlock()
+
+       cmWithCount, ok := e.compiledModules[module.ID]
+       if ok {
+               cm = cmWithCount.compiledModule
+               if increaseRefCount {
+                       cmWithCount.refCount++
+               }
+       }
        return
 }
 
@@ -246,11 +252,8 @@ func deserializeCompiledModule(wazeroVersion string, reader io.ReadCloser) (cm *
                        return nil, false, fmt.Errorf("compilationcache: checksum mismatch (expected %d, got %d)", expected, checksum)
                }
 
-               if runtime.GOARCH == "arm64" {
-                       // On arm64, we cannot give all of rwx at the same time, so we change it to exec.
-                       if err = platform.MprotectRX(executable); err != nil {
-                               return nil, false, err
-                       }
+               if err = platform.MprotectRX(executable); err != nil {
+                       return nil, false, err
                }
                cm.executable = executable
        }
index eebdba034691b1f4022cc0e71ff51f42527439fc..5749e03c70cbbb4436ac1a419ce11bc980d18246 100644 (file)
@@ -469,7 +469,7 @@ func (c *Compiler) allocateVarLengthValues(_cap int, vs ...ssa.Value) ssa.Values
        builder := c.ssaBuilder
        pool := builder.VarLengthPool()
        args := pool.Allocate(_cap)
-       args = args.Append(builder.VarLengthPool(), vs...)
+       args = args.Append(pool, vs...)
        return args
 }
 
index e73debbd1abde7812c93358a784757be7cbbfbd6..1277db0bfeaeb3c37c02a75c71c411ff721613f7 100644 (file)
@@ -123,8 +123,7 @@ func (c *Compiler) nPeekDup(n int) ssa.Values {
        l := c.state()
        tail := len(l.values)
 
-       args := c.allocateVarLengthValues(n)
-       args = args.Append(c.ssaBuilder.VarLengthPool(), l.values[tail-n:tail]...)
+       args := c.allocateVarLengthValues(n, l.values[tail-n:tail]...)
        return args
 }
 
@@ -665,19 +664,22 @@ func (c *Compiler) lowerCurrentOpcode() {
                        tableBaseAddr := c.loadTableBaseAddr(tableInstancePtr)
                        addr := builder.AllocateInstruction().AsIadd(tableBaseAddr, offsetInBytes).Insert(builder).Return()
 
-                       // Prepare the loop and following block.
-                       beforeLoop := builder.AllocateBasicBlock()
-                       loopBlk := builder.AllocateBasicBlock()
-                       loopVar := loopBlk.AddParam(builder, ssa.TypeI64)
-                       followingBlk := builder.AllocateBasicBlock()
-
                        // Uses the copy trick for faster filling buffer like memory.fill, but in this case we copy 8 bytes at a time.
+                       // Tables are rarely huge, so ignore the 8KB maximum.
+                       // https://github.com/golang/go/blob/go1.24.0/src/slices/slices.go#L514-L517
+                       //
                        //      buf := memoryInst.Buffer[offset : offset+fillSize]
                        //      buf[0:8] = value
                        //      for i := 8; i < fillSize; i *= 2 { Begin with 8 bytes.
                        //              copy(buf[i:], buf[:i])
                        //      }
 
+                       // Prepare the loop and following block.
+                       beforeLoop := builder.AllocateBasicBlock()
+                       loopBlk := builder.AllocateBasicBlock()
+                       loopVar := loopBlk.AddParam(builder, ssa.TypeI64)
+                       followingBlk := builder.AllocateBasicBlock()
+
                        // Insert the jump to the beforeLoop block; If the fillSize is zero, then jump to the following block to skip entire logics.
                        zero := builder.AllocateInstruction().AsIconst64(0).Insert(builder).Return()
                        ifFillSizeZero := builder.AllocateInstruction().AsIcmp(fillSizeExt, zero, ssa.IntegerCmpCondEqual).
@@ -688,32 +690,24 @@ func (c *Compiler) lowerCurrentOpcode() {
                        // buf[0:8] = value
                        builder.SetCurrentBlock(beforeLoop)
                        builder.AllocateInstruction().AsStore(ssa.OpcodeStore, value, addr, 0).Insert(builder)
-                       initValue := builder.AllocateInstruction().AsIconst64(8).Insert(builder).Return()
-                       c.insertJumpToBlock(c.allocateVarLengthValues(1, initValue), loopBlk)
+                       eight := builder.AllocateInstruction().AsIconst64(8).Insert(builder).Return()
+                       c.insertJumpToBlock(c.allocateVarLengthValues(1, eight), loopBlk)
 
                        builder.SetCurrentBlock(loopBlk)
                        dstAddr := builder.AllocateInstruction().AsIadd(addr, loopVar).Insert(builder).Return()
 
-                       // If loopVar*2 > fillSizeInBytes, then count must be fillSizeInBytes-loopVar.
-                       var count ssa.Value
-                       {
-                               loopVarDoubled := builder.AllocateInstruction().AsIadd(loopVar, loopVar).Insert(builder).Return()
-                               loopVarDoubledLargerThanFillSize := builder.
-                                       AllocateInstruction().AsIcmp(loopVarDoubled, fillSizeInBytes, ssa.IntegerCmpCondUnsignedGreaterThanOrEqual).
-                                       Insert(builder).Return()
-                               diff := builder.AllocateInstruction().AsIsub(fillSizeInBytes, loopVar).Insert(builder).Return()
-                               count = builder.AllocateInstruction().AsSelect(loopVarDoubledLargerThanFillSize, diff, loopVar).Insert(builder).Return()
-                       }
+                       newLoopVar := builder.AllocateInstruction().AsIadd(loopVar, loopVar).Insert(builder).Return()
+                       newLoopVarLessThanFillSize := builder.AllocateInstruction().
+                               AsIcmp(newLoopVar, fillSizeInBytes, ssa.IntegerCmpCondUnsignedLessThan).Insert(builder).Return()
 
-                       c.callMemmove(dstAddr, addr, count)
+                       // On the last iteration, count must be fillSizeInBytes-loopVar.
+                       diff := builder.AllocateInstruction().AsIsub(fillSizeInBytes, loopVar).Insert(builder).Return()
+                       count := builder.AllocateInstruction().AsSelect(newLoopVarLessThanFillSize, loopVar, diff).Insert(builder).Return()
 
-                       shiftAmount := builder.AllocateInstruction().AsIconst64(1).Insert(builder).Return()
-                       newLoopVar := builder.AllocateInstruction().AsIshl(loopVar, shiftAmount).Insert(builder).Return()
-                       loopVarLessThanFillSize := builder.AllocateInstruction().
-                               AsIcmp(newLoopVar, fillSizeInBytes, ssa.IntegerCmpCondUnsignedLessThan).Insert(builder).Return()
+                       c.callMemmove(dstAddr, addr, count)
 
                        builder.AllocateInstruction().
-                               AsBrnz(loopVarLessThanFillSize, c.allocateVarLengthValues(1, newLoopVar), loopBlk).
+                               AsBrnz(newLoopVarLessThanFillSize, c.allocateVarLengthValues(1, newLoopVar), loopBlk).
                                Insert(builder)
 
                        c.insertJumpToBlock(ssa.ValuesNil, followingBlk)
@@ -741,11 +735,15 @@ func (c *Compiler) lowerCurrentOpcode() {
                        // Calculate the base address:
                        addr := builder.AllocateInstruction().AsIadd(c.getMemoryBaseValue(false), offset).Insert(builder).Return()
 
-                       // Uses the copy trick for faster filling buffer: https://gist.github.com/taylorza/df2f89d5f9ab3ffd06865062a4cf015d
+                       // Uses the copy trick for faster filling buffer, with a maximum chunk size of 8KB.
+                       // https://github.com/golang/go/blob/go1.24.0/src/bytes/bytes.go#L664-L673
+                       //
                        //      buf := memoryInst.Buffer[offset : offset+fillSize]
                        //      buf[0] = value
-                       //      for i := 1; i < fillSize; i *= 2 {
-                       //              copy(buf[i:], buf[:i])
+                       //      for i := 1; i < fillSize; {
+                       //              chunk := ((i - 1) & 8191) + 1
+                       //              copy(buf[i:], buf[:chunk])
+                       //              i += chunk
                        //      }
 
                        // Prepare the loop and following block.
@@ -764,32 +762,31 @@ func (c *Compiler) lowerCurrentOpcode() {
                        // buf[0] = value
                        builder.SetCurrentBlock(beforeLoop)
                        builder.AllocateInstruction().AsStore(ssa.OpcodeIstore8, value, addr, 0).Insert(builder)
-                       initValue := builder.AllocateInstruction().AsIconst64(1).Insert(builder).Return()
-                       c.insertJumpToBlock(c.allocateVarLengthValues(1, initValue), loopBlk)
+                       one := builder.AllocateInstruction().AsIconst64(1).Insert(builder).Return()
+                       c.insertJumpToBlock(c.allocateVarLengthValues(1, one), loopBlk)
 
                        builder.SetCurrentBlock(loopBlk)
                        dstAddr := builder.AllocateInstruction().AsIadd(addr, loopVar).Insert(builder).Return()
 
-                       // If loopVar*2 > fillSizeExt, then count must be fillSizeExt-loopVar.
-                       var count ssa.Value
-                       {
-                               loopVarDoubled := builder.AllocateInstruction().AsIadd(loopVar, loopVar).Insert(builder).Return()
-                               loopVarDoubledLargerThanFillSize := builder.
-                                       AllocateInstruction().AsIcmp(loopVarDoubled, fillSize, ssa.IntegerCmpCondUnsignedGreaterThanOrEqual).
-                                       Insert(builder).Return()
-                               diff := builder.AllocateInstruction().AsIsub(fillSize, loopVar).Insert(builder).Return()
-                               count = builder.AllocateInstruction().AsSelect(loopVarDoubledLargerThanFillSize, diff, loopVar).Insert(builder).Return()
-                       }
-
-                       c.callMemmove(dstAddr, addr, count)
+                       // chunk := ((i - 1) & 8191) + 1
+                       mask := builder.AllocateInstruction().AsIconst64(8191).Insert(builder).Return()
+                       tmp1 := builder.AllocateInstruction().AsIsub(loopVar, one).Insert(builder).Return()
+                       tmp2 := builder.AllocateInstruction().AsBand(tmp1, mask).Insert(builder).Return()
+                       chunk := builder.AllocateInstruction().AsIadd(tmp2, one).Insert(builder).Return()
 
-                       shiftAmount := builder.AllocateInstruction().AsIconst64(1).Insert(builder).Return()
-                       newLoopVar := builder.AllocateInstruction().AsIshl(loopVar, shiftAmount).Insert(builder).Return()
-                       loopVarLessThanFillSize := builder.AllocateInstruction().
+                       // i += chunk
+                       newLoopVar := builder.AllocateInstruction().AsIadd(loopVar, chunk).Insert(builder).Return()
+                       newLoopVarLessThanFillSize := builder.AllocateInstruction().
                                AsIcmp(newLoopVar, fillSize, ssa.IntegerCmpCondUnsignedLessThan).Insert(builder).Return()
 
+                       // count = min(chunk, fillSize-loopVar)
+                       diff := builder.AllocateInstruction().AsIsub(fillSize, loopVar).Insert(builder).Return()
+                       count := builder.AllocateInstruction().AsSelect(newLoopVarLessThanFillSize, chunk, diff).Insert(builder).Return()
+
+                       c.callMemmove(dstAddr, addr, count)
+
                        builder.AllocateInstruction().
-                               AsBrnz(loopVarLessThanFillSize, c.allocateVarLengthValues(1, newLoopVar), loopBlk).
+                               AsBrnz(newLoopVarLessThanFillSize, c.allocateVarLengthValues(1, newLoopVar), loopBlk).
                                Insert(builder)
 
                        c.insertJumpToBlock(ssa.ValuesNil, followingBlk)
@@ -1173,7 +1170,7 @@ func (c *Compiler) lowerCurrentOpcode() {
                                ssa.TypeI64,
                        ).Insert(builder).Return()
 
-               args := c.allocateVarLengthValues(1, c.execCtxPtrValue, pages)
+               args := c.allocateVarLengthValues(2, c.execCtxPtrValue, pages)
                callGrowRet := builder.
                        AllocateInstruction().
                        AsCallIndirect(memoryGrowPtr, &c.memoryGrowSig, args).
@@ -1343,8 +1340,7 @@ func (c *Compiler) lowerCurrentOpcode() {
                        blockType:                    bt,
                })
 
-               args := c.allocateVarLengthValues(originalLen)
-               args = args.Append(builder.VarLengthPool(), state.values[originalLen:]...)
+               args := c.allocateVarLengthValues(len(bt.Params), state.values[originalLen:]...)
 
                // Insert the jump to the header of loop.
                br := builder.AllocateInstruction()
@@ -1383,8 +1379,7 @@ func (c *Compiler) lowerCurrentOpcode() {
                // multiple definitions (one in Then and another in Else blocks).
                c.addBlockParamsFromWasmTypes(bt.Results, followingBlk)
 
-               args := c.allocateVarLengthValues(len(bt.Params))
-               args = args.Append(builder.VarLengthPool(), state.values[len(state.values)-len(bt.Params):]...)
+               args := c.allocateVarLengthValues(len(bt.Params), state.values[len(state.values)-len(bt.Params):]...)
 
                // Insert the conditional jump to the Else block.
                brz := builder.AllocateInstruction()
@@ -1568,11 +1563,7 @@ func (c *Compiler) lowerCurrentOpcode() {
                        c.callListenerAfter()
                }
 
-               results := c.nPeekDup(c.results())
-               instr := builder.AllocateInstruction()
-
-               instr.AsReturn(results)
-               builder.InsertInstruction(instr)
+               c.lowerReturn(builder)
                state.unreachable = true
 
        case wasm.OpcodeUnreachable:
@@ -1597,66 +1588,7 @@ func (c *Compiler) lowerCurrentOpcode() {
                if state.unreachable {
                        break
                }
-
-               var typIndex wasm.Index
-               if fnIndex < c.m.ImportFunctionCount {
-                       // Before transfer the control to the callee, we have to store the current module's moduleContextPtr
-                       // into execContext.callerModuleContextPtr in case when the callee is a Go function.
-                       c.storeCallerModuleContext()
-                       var fi int
-                       for i := range c.m.ImportSection {
-                               imp := &c.m.ImportSection[i]
-                               if imp.Type == wasm.ExternTypeFunc {
-                                       if fi == int(fnIndex) {
-                                               typIndex = imp.DescFunc
-                                               break
-                                       }
-                                       fi++
-                               }
-                       }
-               } else {
-                       typIndex = c.m.FunctionSection[fnIndex-c.m.ImportFunctionCount]
-               }
-               typ := &c.m.TypeSection[typIndex]
-
-               argN := len(typ.Params)
-               tail := len(state.values) - argN
-               vs := state.values[tail:]
-               state.values = state.values[:tail]
-               args := c.allocateVarLengthValues(2+len(vs), c.execCtxPtrValue)
-
-               sig := c.signatures[typ]
-               call := builder.AllocateInstruction()
-               if fnIndex >= c.m.ImportFunctionCount {
-                       args = args.Append(builder.VarLengthPool(), c.moduleCtxPtrValue) // This case the callee module is itself.
-                       args = args.Append(builder.VarLengthPool(), vs...)
-                       call.AsCall(FunctionIndexToFuncRef(fnIndex), sig, args)
-                       builder.InsertInstruction(call)
-               } else {
-                       // This case we have to read the address of the imported function from the module context.
-                       moduleCtx := c.moduleCtxPtrValue
-                       loadFuncPtr, loadModuleCtxPtr := builder.AllocateInstruction(), builder.AllocateInstruction()
-                       funcPtrOffset, moduleCtxPtrOffset, _ := c.offset.ImportedFunctionOffset(fnIndex)
-                       loadFuncPtr.AsLoad(moduleCtx, funcPtrOffset.U32(), ssa.TypeI64)
-                       loadModuleCtxPtr.AsLoad(moduleCtx, moduleCtxPtrOffset.U32(), ssa.TypeI64)
-                       builder.InsertInstruction(loadFuncPtr)
-                       builder.InsertInstruction(loadModuleCtxPtr)
-
-                       args = args.Append(builder.VarLengthPool(), loadModuleCtxPtr.Return())
-                       args = args.Append(builder.VarLengthPool(), vs...)
-                       call.AsCallIndirect(loadFuncPtr.Return(), sig, args)
-                       builder.InsertInstruction(call)
-               }
-
-               first, rest := call.Returns()
-               if first.Valid() {
-                       state.push(first)
-               }
-               for _, v := range rest {
-                       state.push(v)
-               }
-
-               c.reloadAfterCall()
+               c.lowerCall(fnIndex)
 
        case wasm.OpcodeDrop:
                if state.unreachable {
@@ -3190,7 +3122,7 @@ func (c *Compiler) lowerCurrentOpcode() {
                                        ssa.TypeI64,
                                ).Insert(builder).Return()
 
-                       args := c.allocateVarLengthValues(3, c.execCtxPtrValue, timeout, exp, addr)
+                       args := c.allocateVarLengthValues(4, c.execCtxPtrValue, timeout, exp, addr)
                        memoryWaitRet := builder.AllocateInstruction().
                                AsCallIndirect(memoryWaitPtr, sig, args).
                                Insert(builder).Return()
@@ -3211,7 +3143,7 @@ func (c *Compiler) lowerCurrentOpcode() {
                                        wazevoapi.ExecutionContextOffsetMemoryNotifyTrampolineAddress.U32(),
                                        ssa.TypeI64,
                                ).Insert(builder).Return()
-                       args := c.allocateVarLengthValues(2, c.execCtxPtrValue, count, addr)
+                       args := c.allocateVarLengthValues(3, c.execCtxPtrValue, count, addr)
                        memoryNotifyRet := builder.AllocateInstruction().
                                AsCallIndirect(memoryNotifyPtr, &c.memoryNotifySig, args).
                                Insert(builder).Return()
@@ -3460,6 +3392,25 @@ func (c *Compiler) lowerCurrentOpcode() {
                elementAddr := c.lowerAccessTableWithBoundsCheck(tableIndex, targetOffsetInTable)
                loaded := builder.AllocateInstruction().AsLoad(elementAddr, 0, ssa.TypeI64).Insert(builder).Return()
                state.push(loaded)
+
+       case wasm.OpcodeTailCallReturnCallIndirect:
+               typeIndex := c.readI32u()
+               tableIndex := c.readI32u()
+               if state.unreachable {
+                       break
+               }
+               _, _ = typeIndex, tableIndex
+               c.lowerTailCallReturnCallIndirect(typeIndex, tableIndex)
+               state.unreachable = true
+
+       case wasm.OpcodeTailCallReturnCall:
+               fnIndex := c.readI32u()
+               if state.unreachable {
+                       break
+               }
+               c.lowerTailCallReturnCall(fnIndex)
+               state.unreachable = true
+
        default:
                panic("TODO: unsupported in wazevo yet: " + wasm.InstructionName(op))
        }
@@ -3473,6 +3424,14 @@ func (c *Compiler) lowerCurrentOpcode() {
        c.loweringState.pc++
 }
 
+func (c *Compiler) lowerReturn(builder ssa.Builder) {
+       results := c.nPeekDup(c.results())
+       instr := builder.AllocateInstruction()
+
+       instr.AsReturn(results)
+       builder.InsertInstruction(instr)
+}
+
 func (c *Compiler) lowerExtMul(v1, v2 ssa.Value, from, to ssa.VecLane, signed, low bool) ssa.Value {
        // TODO: The sequence `Widen; Widen; VIMul` can be substituted for a single instruction on some ISAs.
        builder := c.ssaBuilder
@@ -3533,7 +3492,83 @@ func (c *Compiler) lowerAccessTableWithBoundsCheck(tableIndex uint32, elementOff
        return calcElementAddressInTable.Return()
 }
 
-func (c *Compiler) lowerCallIndirect(typeIndex, tableIndex uint32) {
+func (c *Compiler) prepareCall(fnIndex uint32) (isIndirect bool, sig *ssa.Signature, args ssa.Values, funcRefOrPtrValue uint64) {
+       builder := c.ssaBuilder
+       state := c.state()
+       var typIndex wasm.Index
+       if fnIndex < c.m.ImportFunctionCount {
+               // Before transfer the control to the callee, we have to store the current module's moduleContextPtr
+               // into execContext.callerModuleContextPtr in case when the callee is a Go function.
+               c.storeCallerModuleContext()
+               var fi int
+               for i := range c.m.ImportSection {
+                       imp := &c.m.ImportSection[i]
+                       if imp.Type == wasm.ExternTypeFunc {
+                               if fi == int(fnIndex) {
+                                       typIndex = imp.DescFunc
+                                       break
+                               }
+                               fi++
+                       }
+               }
+       } else {
+               typIndex = c.m.FunctionSection[fnIndex-c.m.ImportFunctionCount]
+       }
+       typ := &c.m.TypeSection[typIndex]
+
+       argN := len(typ.Params)
+       tail := len(state.values) - argN
+       vs := state.values[tail:]
+       state.values = state.values[:tail]
+       args = c.allocateVarLengthValues(2+len(vs), c.execCtxPtrValue)
+
+       sig = c.signatures[typ]
+       if fnIndex >= c.m.ImportFunctionCount {
+               args = args.Append(builder.VarLengthPool(), c.moduleCtxPtrValue) // This case the callee module is itself.
+               args = args.Append(builder.VarLengthPool(), vs...)
+               return false, sig, args, uint64(FunctionIndexToFuncRef(fnIndex))
+       } else {
+               // This case we have to read the address of the imported function from the module context.
+               moduleCtx := c.moduleCtxPtrValue
+               loadFuncPtr, loadModuleCtxPtr := builder.AllocateInstruction(), builder.AllocateInstruction()
+               funcPtrOffset, moduleCtxPtrOffset, _ := c.offset.ImportedFunctionOffset(fnIndex)
+               loadFuncPtr.AsLoad(moduleCtx, funcPtrOffset.U32(), ssa.TypeI64)
+               loadModuleCtxPtr.AsLoad(moduleCtx, moduleCtxPtrOffset.U32(), ssa.TypeI64)
+               builder.InsertInstruction(loadFuncPtr)
+               builder.InsertInstruction(loadModuleCtxPtr)
+
+               args = args.Append(builder.VarLengthPool(), loadModuleCtxPtr.Return())
+               args = args.Append(builder.VarLengthPool(), vs...)
+
+               return true, sig, args, uint64(loadFuncPtr.Return())
+       }
+}
+
+func (c *Compiler) lowerCall(fnIndex uint32) {
+       builder := c.ssaBuilder
+       state := c.state()
+       isIndirect, sig, args, funcRefOrPtrValue := c.prepareCall(fnIndex)
+
+       call := builder.AllocateInstruction()
+       if isIndirect {
+               call.AsCallIndirect(ssa.Value(funcRefOrPtrValue), sig, args)
+       } else {
+               call.AsCall(ssa.FuncRef(funcRefOrPtrValue), sig, args)
+       }
+       builder.InsertInstruction(call)
+
+       first, rest := call.Returns()
+       if first.Valid() {
+               state.push(first)
+       }
+       for _, v := range rest {
+               state.push(v)
+       }
+
+       c.reloadAfterCall()
+}
+
+func (c *Compiler) prepareCallIndirect(typeIndex, tableIndex uint32) (ssa.Value, *wasm.FunctionType, ssa.Values) {
        builder := c.ssaBuilder
        state := c.state()
 
@@ -3601,6 +3636,14 @@ func (c *Compiler) lowerCallIndirect(typeIndex, tableIndex uint32) {
        // into execContext.callerModuleContextPtr in case when the callee is a Go function.
        c.storeCallerModuleContext()
 
+       return executablePtr, typ, args
+}
+
+func (c *Compiler) lowerCallIndirect(typeIndex, tableIndex uint32) {
+       builder := c.ssaBuilder
+       state := c.state()
+       executablePtr, typ, args := c.prepareCallIndirect(typeIndex, tableIndex)
+
        call := builder.AllocateInstruction()
        call.AsCallIndirect(executablePtr, c.signatures[typ], args)
        builder.InsertInstruction(call)
@@ -3616,6 +3659,62 @@ func (c *Compiler) lowerCallIndirect(typeIndex, tableIndex uint32) {
        c.reloadAfterCall()
 }
 
+func (c *Compiler) lowerTailCallReturnCall(fnIndex uint32) {
+       isIndirect, sig, args, funcRefOrPtrValue := c.prepareCall(fnIndex)
+       builder := c.ssaBuilder
+       state := c.state()
+
+       call := builder.AllocateInstruction()
+       if isIndirect {
+               call.AsTailCallReturnCallIndirect(ssa.Value(funcRefOrPtrValue), sig, args)
+       } else {
+               call.AsTailCallReturnCall(ssa.FuncRef(funcRefOrPtrValue), sig, args)
+       }
+       builder.InsertInstruction(call)
+
+       // In a proper tail call, the following code is unreachable since execution
+       // transfers to the callee. However, sometimes the backend might need to fall back to
+       // a regular call, so we include return handling and let the backend delete it
+       // when redundant.
+       // For details, see internal/engine/RATIONALE.md
+       first, rest := call.Returns()
+       if first.Valid() {
+               state.push(first)
+       }
+       for _, v := range rest {
+               state.push(v)
+       }
+
+       c.reloadAfterCall()
+       c.lowerReturn(builder)
+}
+
+func (c *Compiler) lowerTailCallReturnCallIndirect(typeIndex, tableIndex uint32) {
+       builder := c.ssaBuilder
+       state := c.state()
+       executablePtr, typ, args := c.prepareCallIndirect(typeIndex, tableIndex)
+
+       call := builder.AllocateInstruction()
+       call.AsTailCallReturnCallIndirect(executablePtr, c.signatures[typ], args)
+       builder.InsertInstruction(call)
+
+       // In a proper tail call, the following code is unreachable since execution
+       // transfers to the callee. However, sometimes the backend might need to fall back to
+       // a regular call, so we include return handling and let the backend delete it
+       // when redundant.
+       // For details, see internal/engine/RATIONALE.md
+       first, rest := call.Returns()
+       if first.Valid() {
+               state.push(first)
+       }
+       for _, v := range rest {
+               state.push(v)
+       }
+
+       c.reloadAfterCall()
+       c.lowerReturn(builder)
+}
+
 // memOpSetup inserts the bounds check and calculates the address of the memory operation (loads/stores).
 func (c *Compiler) memOpSetup(baseAddr ssa.Value, constOffset, operationSizeInBytes uint64) (address ssa.Value) {
        address = ssa.ValueInvalid
index 8811feed71814cc1bb3661b1c9d13e294ae58d62..53206f1cccb4c02bcf9be59256f7bcfb9020f0b7 100644 (file)
@@ -174,20 +174,21 @@ func (m *moduleEngine) NewFunction(index wasm.Index) api.Function {
                indexInModule:          index,
                executable:             &p.executable[offset],
                parent:                 m,
-               preambleExecutable:     &m.parent.entryPreambles[typIndex][0],
+               preambleExecutable:     p.entryPreamblesPtrs[typIndex],
                sizeOfParamResultSlice: sizeOfParamResultSlice,
                requiredParams:         typ.ParamNumInUint64,
                numberOfResults:        typ.ResultNumInUint64,
        }
 
-       ce.execCtx.memoryGrowTrampolineAddress = &m.parent.sharedFunctions.memoryGrowExecutable[0]
-       ce.execCtx.stackGrowCallTrampolineAddress = &m.parent.sharedFunctions.stackGrowExecutable[0]
-       ce.execCtx.checkModuleExitCodeTrampolineAddress = &m.parent.sharedFunctions.checkModuleExitCode[0]
-       ce.execCtx.tableGrowTrampolineAddress = &m.parent.sharedFunctions.tableGrowExecutable[0]
-       ce.execCtx.refFuncTrampolineAddress = &m.parent.sharedFunctions.refFuncExecutable[0]
-       ce.execCtx.memoryWait32TrampolineAddress = &m.parent.sharedFunctions.memoryWait32Executable[0]
-       ce.execCtx.memoryWait64TrampolineAddress = &m.parent.sharedFunctions.memoryWait64Executable[0]
-       ce.execCtx.memoryNotifyTrampolineAddress = &m.parent.sharedFunctions.memoryNotifyExecutable[0]
+       sharedFunctions := p.sharedFunctions
+       ce.execCtx.memoryGrowTrampolineAddress = sharedFunctions.memoryGrowAddress
+       ce.execCtx.stackGrowCallTrampolineAddress = sharedFunctions.stackGrowAddress
+       ce.execCtx.checkModuleExitCodeTrampolineAddress = sharedFunctions.checkModuleExitCodeAddress
+       ce.execCtx.tableGrowTrampolineAddress = sharedFunctions.tableGrowAddress
+       ce.execCtx.refFuncTrampolineAddress = sharedFunctions.refFuncAddress
+       ce.execCtx.memoryWait32TrampolineAddress = sharedFunctions.memoryWait32Address
+       ce.execCtx.memoryWait64TrampolineAddress = sharedFunctions.memoryWait64Address
+       ce.execCtx.memoryNotifyTrampolineAddress = sharedFunctions.memoryNotifyAddress
        ce.execCtx.memmoveAddress = memmovPtr
        ce.init()
        return ce
index 9a3d1da6e983ad31b2800888463f8f92dc940a00..7b37a8afe04fd77bfc2714d1e6ff6b1e5a2aad5e 100644 (file)
@@ -633,6 +633,14 @@ const (
        // OpcodeFence is a memory fence operation.
        OpcodeFence
 
+       // OpcodeTailCallReturnCall is the equivalent of OpcodeCall (a "near" call)
+       // for tail calls. Semantically, it combines Call + Return into a single operation.
+       OpcodeTailCallReturnCall
+
+       // OpcodeTailCallReturnCallIndirect is the equivalent of OpcodeCallIndirect (a call to a function address)
+       // for tail calls. Semantically, it combines CallIndirect + Return into a single operation.
+       OpcodeTailCallReturnCallIndirect
+
        // opcodeEnd marks the end of the opcode list.
        opcodeEnd
 )
@@ -679,12 +687,44 @@ func (op AtomicRmwOp) String() string {
 type returnTypesFn func(b *builder, instr *Instruction) (t1 Type, ts []Type)
 
 var (
-       returnTypesFnNoReturns returnTypesFn = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return typeInvalid, nil }
-       returnTypesFnSingle                  = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return instr.typ, nil }
-       returnTypesFnI32                     = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeI32, nil }
-       returnTypesFnF32                     = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeF32, nil }
-       returnTypesFnF64                     = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeF64, nil }
-       returnTypesFnV128                    = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeV128, nil }
+       returnTypesFnNoReturns    returnTypesFn = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return typeInvalid, nil }
+       returnTypesFnSingle                     = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return instr.typ, nil }
+       returnTypesFnI32                        = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeI32, nil }
+       returnTypesFnF32                        = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeF32, nil }
+       returnTypesFnF64                        = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeF64, nil }
+       returnTypesFnV128                       = func(b *builder, instr *Instruction) (t1 Type, ts []Type) { return TypeV128, nil }
+       returnTypesFnCallIndirect               = func(b *builder, instr *Instruction) (t1 Type, ts []Type) {
+               sigID := SignatureID(instr.u1)
+               sig, ok := b.signatures[sigID]
+               if !ok {
+                       panic("BUG")
+               }
+               switch len(sig.Results) {
+               case 0:
+                       t1 = typeInvalid
+               case 1:
+                       t1 = sig.Results[0]
+               default:
+                       t1, ts = sig.Results[0], sig.Results[1:]
+               }
+               return
+       }
+       returnTypesFnCall = func(b *builder, instr *Instruction) (t1 Type, ts []Type) {
+               sigID := SignatureID(instr.u2)
+               sig, ok := b.signatures[sigID]
+               if !ok {
+                       panic("BUG")
+               }
+               switch len(sig.Results) {
+               case 0:
+                       t1 = typeInvalid
+               case 1:
+                       t1 = sig.Results[0]
+               default:
+                       t1, ts = sig.Results[0], sig.Results[1:]
+               }
+               return
+       }
 )
 
 // sideEffect provides the info to determine if an instruction has side effects which
@@ -846,6 +886,8 @@ var instructionSideEffects = [opcodeEnd]sideEffect{
        OpcodeAtomicStore:                 sideEffectStrict,
        OpcodeAtomicCas:                   sideEffectStrict,
        OpcodeFence:                       sideEffectStrict,
+       OpcodeTailCallReturnCall:          sideEffectStrict,
+       OpcodeTailCallReturnCallIndirect:  sideEffectStrict,
        OpcodeWideningPairwiseDotProductS: sideEffectNone,
 }
 
@@ -860,105 +902,75 @@ func (i *Instruction) sideEffect() sideEffect {
 
 // instructionReturnTypes provides the function to determine the return types of an instruction.
 var instructionReturnTypes = [opcodeEnd]returnTypesFn{
-       OpcodeExtIaddPairwise: returnTypesFnV128,
-       OpcodeVbor:            returnTypesFnV128,
-       OpcodeVbxor:           returnTypesFnV128,
-       OpcodeVband:           returnTypesFnV128,
-       OpcodeVbnot:           returnTypesFnV128,
-       OpcodeVbandnot:        returnTypesFnV128,
-       OpcodeVbitselect:      returnTypesFnV128,
-       OpcodeVanyTrue:        returnTypesFnI32,
-       OpcodeVallTrue:        returnTypesFnI32,
-       OpcodeVhighBits:       returnTypesFnI32,
-       OpcodeVIadd:           returnTypesFnV128,
-       OpcodeVSaddSat:        returnTypesFnV128,
-       OpcodeVUaddSat:        returnTypesFnV128,
-       OpcodeVIsub:           returnTypesFnV128,
-       OpcodeVSsubSat:        returnTypesFnV128,
-       OpcodeVUsubSat:        returnTypesFnV128,
-       OpcodeVIcmp:           returnTypesFnV128,
-       OpcodeVImin:           returnTypesFnV128,
-       OpcodeVUmin:           returnTypesFnV128,
-       OpcodeVImax:           returnTypesFnV128,
-       OpcodeVUmax:           returnTypesFnV128,
-       OpcodeVImul:           returnTypesFnV128,
-       OpcodeVAvgRound:       returnTypesFnV128,
-       OpcodeVIabs:           returnTypesFnV128,
-       OpcodeVIneg:           returnTypesFnV128,
-       OpcodeVIpopcnt:        returnTypesFnV128,
-       OpcodeVIshl:           returnTypesFnV128,
-       OpcodeVSshr:           returnTypesFnV128,
-       OpcodeVUshr:           returnTypesFnV128,
-       OpcodeExtractlane:     returnTypesFnSingle,
-       OpcodeInsertlane:      returnTypesFnV128,
-       OpcodeBand:            returnTypesFnSingle,
-       OpcodeFcopysign:       returnTypesFnSingle,
-       OpcodeBitcast:         returnTypesFnSingle,
-       OpcodeBor:             returnTypesFnSingle,
-       OpcodeBxor:            returnTypesFnSingle,
-       OpcodeRotl:            returnTypesFnSingle,
-       OpcodeRotr:            returnTypesFnSingle,
-       OpcodeIshl:            returnTypesFnSingle,
-       OpcodeSshr:            returnTypesFnSingle,
-       OpcodeSdiv:            returnTypesFnSingle,
-       OpcodeSrem:            returnTypesFnSingle,
-       OpcodeUdiv:            returnTypesFnSingle,
-       OpcodeUrem:            returnTypesFnSingle,
-       OpcodeUshr:            returnTypesFnSingle,
-       OpcodeJump:            returnTypesFnNoReturns,
-       OpcodeUndefined:       returnTypesFnNoReturns,
-       OpcodeIconst:          returnTypesFnSingle,
-       OpcodeSelect:          returnTypesFnSingle,
-       OpcodeSExtend:         returnTypesFnSingle,
-       OpcodeUExtend:         returnTypesFnSingle,
-       OpcodeSwidenLow:       returnTypesFnV128,
-       OpcodeUwidenLow:       returnTypesFnV128,
-       OpcodeSwidenHigh:      returnTypesFnV128,
-       OpcodeUwidenHigh:      returnTypesFnV128,
-       OpcodeSnarrow:         returnTypesFnV128,
-       OpcodeUnarrow:         returnTypesFnV128,
-       OpcodeSwizzle:         returnTypesFnSingle,
-       OpcodeShuffle:         returnTypesFnV128,
-       OpcodeSplat:           returnTypesFnV128,
-       OpcodeIreduce:         returnTypesFnSingle,
-       OpcodeFabs:            returnTypesFnSingle,
-       OpcodeSqrt:            returnTypesFnSingle,
-       OpcodeCeil:            returnTypesFnSingle,
-       OpcodeFloor:           returnTypesFnSingle,
-       OpcodeTrunc:           returnTypesFnSingle,
-       OpcodeNearest:         returnTypesFnSingle,
-       OpcodeCallIndirect: func(b *builder, instr *Instruction) (t1 Type, ts []Type) {
-               sigID := SignatureID(instr.u1)
-               sig, ok := b.signatures[sigID]
-               if !ok {
-                       panic("BUG")
-               }
-               switch len(sig.Results) {
-               case 0:
-                       t1 = typeInvalid
-               case 1:
-                       t1 = sig.Results[0]
-               default:
-                       t1, ts = sig.Results[0], sig.Results[1:]
-               }
-               return
-       },
-       OpcodeCall: func(b *builder, instr *Instruction) (t1 Type, ts []Type) {
-               sigID := SignatureID(instr.u2)
-               sig, ok := b.signatures[sigID]
-               if !ok {
-                       panic("BUG")
-               }
-               switch len(sig.Results) {
-               case 0:
-                       t1 = typeInvalid
-               case 1:
-                       t1 = sig.Results[0]
-               default:
-                       t1, ts = sig.Results[0], sig.Results[1:]
-               }
-               return
-       },
+       OpcodeExtIaddPairwise:             returnTypesFnV128,
+       OpcodeVbor:                        returnTypesFnV128,
+       OpcodeVbxor:                       returnTypesFnV128,
+       OpcodeVband:                       returnTypesFnV128,
+       OpcodeVbnot:                       returnTypesFnV128,
+       OpcodeVbandnot:                    returnTypesFnV128,
+       OpcodeVbitselect:                  returnTypesFnV128,
+       OpcodeVanyTrue:                    returnTypesFnI32,
+       OpcodeVallTrue:                    returnTypesFnI32,
+       OpcodeVhighBits:                   returnTypesFnI32,
+       OpcodeVIadd:                       returnTypesFnV128,
+       OpcodeVSaddSat:                    returnTypesFnV128,
+       OpcodeVUaddSat:                    returnTypesFnV128,
+       OpcodeVIsub:                       returnTypesFnV128,
+       OpcodeVSsubSat:                    returnTypesFnV128,
+       OpcodeVUsubSat:                    returnTypesFnV128,
+       OpcodeVIcmp:                       returnTypesFnV128,
+       OpcodeVImin:                       returnTypesFnV128,
+       OpcodeVUmin:                       returnTypesFnV128,
+       OpcodeVImax:                       returnTypesFnV128,
+       OpcodeVUmax:                       returnTypesFnV128,
+       OpcodeVImul:                       returnTypesFnV128,
+       OpcodeVAvgRound:                   returnTypesFnV128,
+       OpcodeVIabs:                       returnTypesFnV128,
+       OpcodeVIneg:                       returnTypesFnV128,
+       OpcodeVIpopcnt:                    returnTypesFnV128,
+       OpcodeVIshl:                       returnTypesFnV128,
+       OpcodeVSshr:                       returnTypesFnV128,
+       OpcodeVUshr:                       returnTypesFnV128,
+       OpcodeExtractlane:                 returnTypesFnSingle,
+       OpcodeInsertlane:                  returnTypesFnV128,
+       OpcodeBand:                        returnTypesFnSingle,
+       OpcodeFcopysign:                   returnTypesFnSingle,
+       OpcodeBitcast:                     returnTypesFnSingle,
+       OpcodeBor:                         returnTypesFnSingle,
+       OpcodeBxor:                        returnTypesFnSingle,
+       OpcodeRotl:                        returnTypesFnSingle,
+       OpcodeRotr:                        returnTypesFnSingle,
+       OpcodeIshl:                        returnTypesFnSingle,
+       OpcodeSshr:                        returnTypesFnSingle,
+       OpcodeSdiv:                        returnTypesFnSingle,
+       OpcodeSrem:                        returnTypesFnSingle,
+       OpcodeUdiv:                        returnTypesFnSingle,
+       OpcodeUrem:                        returnTypesFnSingle,
+       OpcodeUshr:                        returnTypesFnSingle,
+       OpcodeJump:                        returnTypesFnNoReturns,
+       OpcodeUndefined:                   returnTypesFnNoReturns,
+       OpcodeIconst:                      returnTypesFnSingle,
+       OpcodeSelect:                      returnTypesFnSingle,
+       OpcodeSExtend:                     returnTypesFnSingle,
+       OpcodeUExtend:                     returnTypesFnSingle,
+       OpcodeSwidenLow:                   returnTypesFnV128,
+       OpcodeUwidenLow:                   returnTypesFnV128,
+       OpcodeSwidenHigh:                  returnTypesFnV128,
+       OpcodeUwidenHigh:                  returnTypesFnV128,
+       OpcodeSnarrow:                     returnTypesFnV128,
+       OpcodeUnarrow:                     returnTypesFnV128,
+       OpcodeSwizzle:                     returnTypesFnSingle,
+       OpcodeShuffle:                     returnTypesFnV128,
+       OpcodeSplat:                       returnTypesFnV128,
+       OpcodeIreduce:                     returnTypesFnSingle,
+       OpcodeFabs:                        returnTypesFnSingle,
+       OpcodeSqrt:                        returnTypesFnSingle,
+       OpcodeCeil:                        returnTypesFnSingle,
+       OpcodeFloor:                       returnTypesFnSingle,
+       OpcodeTrunc:                       returnTypesFnSingle,
+       OpcodeNearest:                     returnTypesFnSingle,
+       OpcodeCallIndirect:                returnTypesFnCallIndirect,
+       OpcodeCall:                        returnTypesFnCall,
        OpcodeLoad:                        returnTypesFnSingle,
        OpcodeVZeroExtLoad:                returnTypesFnV128,
        OpcodeLoadSplat:                   returnTypesFnV128,
@@ -1032,6 +1044,8 @@ var instructionReturnTypes = [opcodeEnd]returnTypesFn{
        OpcodeAtomicStore:                 returnTypesFnNoReturns,
        OpcodeAtomicCas:                   returnTypesFnSingle,
        OpcodeFence:                       returnTypesFnNoReturns,
+       OpcodeTailCallReturnCallIndirect:  returnTypesFnCallIndirect,
+       OpcodeTailCallReturnCall:          returnTypesFnCall,
        OpcodeWideningPairwiseDotProductS: returnTypesFnV128,
 }
 
@@ -2038,6 +2052,25 @@ func (i *Instruction) AtomicTargetSize() (size uint64) {
        return i.u1
 }
 
+// AsTailCallReturnCall initializes this instruction as a call instruction with OpcodeTailCallReturnCall.
+func (i *Instruction) AsTailCallReturnCall(ref FuncRef, sig *Signature, args Values) {
+       i.opcode = OpcodeTailCallReturnCall
+       i.u1 = uint64(ref)
+       i.vs = args
+       i.u2 = uint64(sig.ID)
+       sig.used = true
+}
+
+// AsTailCallReturnCallIndirect initializes this instruction as a call-indirect instruction with OpcodeTailCallReturnCallIndirect.
+func (i *Instruction) AsTailCallReturnCallIndirect(funcPtr Value, sig *Signature, args Values) *Instruction {
+       i.opcode = OpcodeTailCallReturnCallIndirect
+       i.vs = args
+       i.v = funcPtr
+       i.u1 = uint64(sig.ID)
+       sig.used = true
+       return i
+}
+
 // ReturnVals returns the return values of OpcodeReturn.
 func (i *Instruction) ReturnVals() []Value {
        return i.vs.View()
@@ -2166,7 +2199,7 @@ func (i *Instruction) AsCall(ref FuncRef, sig *Signature, args Values) {
 
 // CallData returns the call data for this instruction necessary for backends.
 func (i *Instruction) CallData() (ref FuncRef, sigID SignatureID, args []Value) {
-       if i.opcode != OpcodeCall {
+       if i.opcode != OpcodeCall && i.opcode != OpcodeTailCallReturnCall {
                panic("BUG: CallData only available for OpcodeCall")
        }
        ref = FuncRef(i.u1)
@@ -2195,8 +2228,8 @@ func (i *Instruction) AsCallGoRuntimeMemmove(funcPtr Value, sig *Signature, args
 
 // CallIndirectData returns the call indirect data for this instruction necessary for backends.
 func (i *Instruction) CallIndirectData() (funcPtr Value, sigID SignatureID, args []Value, isGoMemmove bool) {
-       if i.opcode != OpcodeCallIndirect {
-               panic("BUG: CallIndirectData only available for OpcodeCallIndirect")
+       if i.opcode != OpcodeCallIndirect && i.opcode != OpcodeTailCallReturnCallIndirect {
+               panic("BUG: CallIndirectData only available for OpcodeCallIndirect and OpcodeTailCallReturnCallIndirect")
        }
        funcPtr = i.v
        sigID = SignatureID(i.u1)
@@ -2620,6 +2653,17 @@ func (i *Instruction) Format(b Builder) string {
                instSuffix = fmt.Sprintf("_%d, %s, %s, %s", 8*i.u1, i.v.Format(b), i.v2.Format(b), i.v3.Format(b))
        case OpcodeFence:
                instSuffix = fmt.Sprintf(" %d", i.u1)
+       case OpcodeTailCallReturnCall, OpcodeTailCallReturnCallIndirect:
+               view := i.vs.View()
+               vs := make([]string, len(view))
+               for idx := range vs {
+                       vs[idx] = view[idx].Format(b)
+               }
+               if i.opcode == OpcodeCallIndirect {
+                       instSuffix = fmt.Sprintf(" %s:%s, %s", i.v.Format(b), SignatureID(i.u1), strings.Join(vs, ", "))
+               } else {
+                       instSuffix = fmt.Sprintf(" %s:%s, %s", FuncRef(i.u1), SignatureID(i.u2), strings.Join(vs, ", "))
+               }
        case OpcodeWideningPairwiseDotProductS:
                instSuffix = fmt.Sprintf(" %s, %s", i.v.Format(b), i.v2.Format(b))
        default:
@@ -2879,6 +2923,10 @@ func (o Opcode) String() (ret string) {
                return "AtomicStore"
        case OpcodeFence:
                return "Fence"
+       case OpcodeTailCallReturnCall:
+               return "ReturnCall"
+       case OpcodeTailCallReturnCallIndirect:
+               return "ReturnCallIndirect"
        case OpcodeVbor:
                return "Vbor"
        case OpcodeVbxor:
index 2db61e2193cd9772bdd94e1b18c35b5aa68e7595..783ab122a658f988b094c17c49220d7a296a6158 100644 (file)
@@ -6,6 +6,7 @@ import (
        "fmt"
        "math/rand"
        "os"
+       "sync"
        "time"
 )
 
@@ -91,7 +92,7 @@ type (
                initialCompilationDone bool
                maybeRandomizedIndexes []int
                r                      *rand.Rand
-               values                 map[string]string
+               values                 sync.Map
        }
        verifierStateContextKey struct{}
        currentFunctionNameKey  struct{}
@@ -106,31 +107,24 @@ func NewDeterministicCompilationVerifierContext(ctx context.Context, localFuncti
        }
        r := rand.New(rand.NewSource(time.Now().UnixNano()))
        return context.WithValue(ctx, verifierStateContextKey{}, &verifierState{
-               r: r, maybeRandomizedIndexes: maybeRandomizedIndexes, values: map[string]string{},
+               r: r, maybeRandomizedIndexes: maybeRandomizedIndexes, values: sync.Map{},
        })
 }
 
 // DeterministicCompilationVerifierRandomizeIndexes randomizes the indexes for the deterministic compilation verifier.
-// To get the randomized index, use DeterministicCompilationVerifierGetRandomizedLocalFunctionIndex.
-func DeterministicCompilationVerifierRandomizeIndexes(ctx context.Context) {
+// Returns a slice that maps an index to the randomized index.
+func DeterministicCompilationVerifierRandomizeIndexes(ctx context.Context) []int {
        state := ctx.Value(verifierStateContextKey{}).(*verifierState)
        if !state.initialCompilationDone {
                // If this is the first attempt, we use the index as-is order.
                state.initialCompilationDone = true
-               return
+               return state.maybeRandomizedIndexes
        }
        r := state.r
        r.Shuffle(len(state.maybeRandomizedIndexes), func(i, j int) {
                state.maybeRandomizedIndexes[i], state.maybeRandomizedIndexes[j] = state.maybeRandomizedIndexes[j], state.maybeRandomizedIndexes[i]
        })
-}
-
-// DeterministicCompilationVerifierGetRandomizedLocalFunctionIndex returns the randomized index for the given `index`
-// which is assigned by DeterministicCompilationVerifierRandomizeIndexes.
-func DeterministicCompilationVerifierGetRandomizedLocalFunctionIndex(ctx context.Context, index int) int {
-       state := ctx.Value(verifierStateContextKey{}).(*verifierState)
-       ret := state.maybeRandomizedIndexes[index]
-       return ret
+       return state.maybeRandomizedIndexes
 }
 
 // VerifyOrSetDeterministicCompilationContextValue verifies that the `newValue` is the same as the previous value for the given `scope`
@@ -141,9 +135,8 @@ func VerifyOrSetDeterministicCompilationContextValue(ctx context.Context, scope
        fn := ctx.Value(currentFunctionNameKey{}).(string)
        key := fn + ": " + scope
        verifierCtx := ctx.Value(verifierStateContextKey{}).(*verifierState)
-       oldValue, ok := verifierCtx.values[key]
-       if !ok {
-               verifierCtx.values[key] = newValue
+       oldValue, loaded := verifierCtx.values.LoadOrStore(key, newValue)
+       if !loaded {
                return
        }
        if oldValue != newValue {
index 313e34f9aec2b86fcfaa5741583a43f8b2993d76..d67a3262d038349217fef0bc60d06a5ddc489664 100644 (file)
@@ -69,7 +69,7 @@ type IDedPool[T any] struct {
 
 // NewIDedPool returns a new IDedPool.
 func NewIDedPool[T any](resetFn func(*T)) IDedPool[T] {
-       return IDedPool[T]{pool: NewPool[T](resetFn), maxIDEncountered: -1}
+       return IDedPool[T]{pool: NewPool(resetFn), maxIDEncountered: -1}
 }
 
 // GetOrAllocate returns the T with the given id.
@@ -134,10 +134,10 @@ type VarLength[T any] struct {
 // NewVarLengthPool returns a new VarLengthPool.
 func NewVarLengthPool[T any]() VarLengthPool[T] {
        return VarLengthPool[T]{
-               arrayPool: NewPool[varLengthPoolArray[T]](func(v *varLengthPoolArray[T]) {
+               arrayPool: NewPool(func(v *varLengthPoolArray[T]) {
                        v.next = 0
                }),
-               slicePool: NewPool[[]T](func(i *[]T) {
+               slicePool: NewPool(func(i *[]T) {
                        *i = (*i)[:0]
                }),
        }
@@ -155,6 +155,9 @@ func (p *VarLengthPool[T]) Allocate(knownMin int) VarLength[T] {
                return VarLength[T]{arr: arr}
        }
        slc := p.slicePool.Allocate()
+       if cap(*slc) < knownMin {
+               *slc = make([]T, 0, knownMin)
+       }
        return VarLength[T]{slc: slc}
 }
 
@@ -166,39 +169,36 @@ func (p *VarLengthPool[T]) Reset() {
 
 // Append appends items to the backing slice just like the `append` builtin function in Go.
 func (i VarLength[T]) Append(p *VarLengthPool[T], items ...T) VarLength[T] {
-       if i.slc != nil {
-               *i.slc = append(*i.slc, items...)
+       slc := i.slc
+       if slc != nil {
+               *slc = append(*slc, items...)
                return i
        }
 
-       if i.arr == nil {
-               i.arr = p.arrayPool.Allocate()
+       arr := i.arr
+       if arr == nil {
+               arr = p.arrayPool.Allocate()
+               i.arr = arr
        }
 
-       arr := i.arr
        if arr.next+len(items) <= arraySize {
-               for _, item := range items {
-                       arr.arr[arr.next] = item
-                       arr.next++
-               }
+               arr.next += copy(arr.arr[arr.next:], items)
        } else {
-               slc := p.slicePool.Allocate()
+               slc = p.slicePool.Allocate()
                // Copy the array to the slice.
-               for ptr := 0; ptr < arr.next; ptr++ {
-                       *slc = append(*slc, arr.arr[ptr])
-               }
+               *slc = append(*slc, arr.arr[:arr.next]...)
+               *slc = append(*slc, items...)
                i.slc = slc
-               *i.slc = append(*i.slc, items...)
        }
        return i
 }
 
 // View returns the backing slice.
 func (i VarLength[T]) View() []T {
-       if i.slc != nil {
+       if slc := i.slc; slc != nil {
                return *i.slc
-       } else if i.arr != nil {
-               arr := i.arr
+       }
+       if arr := i.arr; arr != nil {
                return arr.arr[:arr.next]
        }
        return nil
@@ -207,9 +207,9 @@ func (i VarLength[T]) View() []T {
 // Cut cuts the backing slice to the given length.
 // Precondition: n <= len(i.backing).
 func (i VarLength[T]) Cut(n int) {
-       if i.slc != nil {
-               *i.slc = (*i.slc)[:n]
-       } else if i.arr != nil {
-               i.arr.next = n
+       if slc := i.slc; slc != nil {
+               *slc = (*slc)[:n]
+       } else if arr := i.arr; arr != nil {
+               arr.next = n
        }
 }
diff --git a/vendor/github.com/tetratelabs/wazero/internal/expctxkeys/compilationworkers.go b/vendor/github.com/tetratelabs/wazero/internal/expctxkeys/compilationworkers.go
new file mode 100644 (file)
index 0000000..a79c488
--- /dev/null
@@ -0,0 +1,6 @@
+package expctxkeys
+
+// CompilationWorkers is a context.Context Value key.
+// Its associated value should be an int representing the number of workers
+// we want to spawn to compile a given wasm input.
+type CompilationWorkers struct{}
index a0c7734a0a8a89b473073f7763f7927cf1987593..3619eecd42faca7acd0ab574afca80bea0f38a0b 100644 (file)
@@ -2,8 +2,10 @@
 
 package platform
 
+import "sync"
+
 // CpuFeatures exposes the capabilities for this CPU, queried via the Has, HasExtra methods.
-var CpuFeatures = loadCpuFeatureFlags()
+var CpuFeatures = sync.OnceValue(loadCpuFeatureFlags)
 
 // cpuFeatureFlags implements CpuFeatureFlags interface.
 type cpuFeatureFlags struct {
index 5430353fdbfec3de54ca62a4128dd267188d0bcf..583b2941e494c28fe4d341c6c51b80741d8bd105 100644 (file)
@@ -2,10 +2,13 @@
 
 package platform
 
-import "runtime"
+import (
+       "runtime"
+       "sync"
+)
 
 // CpuFeatures exposes the capabilities for this CPU, queried via the Has, HasExtra methods.
-var CpuFeatures = loadCpuFeatureFlags()
+var CpuFeatures = sync.OnceValue(loadCpuFeatureFlags)
 
 // cpuFeatureFlags implements CpuFeatureFlags interface.
 type cpuFeatureFlags struct {
index 50a178f52b1e03ddfb1ab3476deaecae6272c754..5f900945384555a4bc4313ec544122d7fa466092 100644 (file)
@@ -2,7 +2,7 @@
 
 package platform
 
-var CpuFeatures CpuFeatureFlags = &cpuFeatureFlags{}
+var CpuFeatures = func() CpuFeatureFlags { return &cpuFeatureFlags{} }
 
 // cpuFeatureFlags implements CpuFeatureFlags for unsupported platforms.
 type cpuFeatureFlags struct{}
index 55906e827e8bec23905fbfd2c220677c3f325a4e..3e2f435dc78fe1f260c36665c83d2211bde41b3d 100644 (file)
@@ -59,12 +59,16 @@ func init() {
        })
 }
 
-func mmapCodeSegment(size, prot int) ([]byte, error) {
-       flags := syscall.MAP_ANON | syscall.MAP_PRIVATE
+func mmapCodeSegment(size int) ([]byte, error) {
+       flag := syscall.MAP_ANON | syscall.MAP_PRIVATE
+       prot := syscall.PROT_READ | syscall.PROT_WRITE
+       if noopMprotectRX {
+               prot = syscall.PROT_READ | syscall.PROT_WRITE | syscall.PROT_EXEC
+       }
 
        for _, hugePagesConfig := range hugePagesConfigs {
                if hugePagesConfig.match(size) {
-                       b, err := syscall.Mmap(-1, 0, size, prot, flags|hugePagesConfig.flag)
+                       b, err := syscall.Mmap(-1, 0, size, prot, flag|hugePagesConfig.flag)
                        if err != nil {
                                continue
                        }
@@ -72,5 +76,5 @@ func mmapCodeSegment(size, prot int) ([]byte, error) {
                }
        }
 
-       return syscall.Mmap(-1, 0, size, prot, flags)
+       return syscall.Mmap(-1, 0, size, prot, flag)
 }
index 9f0610f27b31e37b1159da3687b20bc43b91976b..ee2d8702266496630a0c272b8a882f9eaf0c7d34 100644 (file)
@@ -5,7 +5,11 @@ package platform
 
 import "syscall"
 
-func mmapCodeSegment(size, prot int) ([]byte, error) {
+func mmapCodeSegment(size int) ([]byte, error) {
+       prot := syscall.PROT_READ | syscall.PROT_WRITE
+       if noopMprotectRX {
+               prot = syscall.PROT_READ | syscall.PROT_WRITE | syscall.PROT_EXEC
+       }
        return syscall.Mmap(
                -1,
                0,
index 8d0baa712cf0733bb975633b4fb33cb2de7443f3..6b7c617b24a210f9632e05d710ed66c2892b80f4 100644 (file)
@@ -2,31 +2,8 @@
 
 package platform
 
-import (
-       "syscall"
-)
-
-const (
-       mmapProtAMD64 = syscall.PROT_READ | syscall.PROT_WRITE | syscall.PROT_EXEC
-       mmapProtARM64 = syscall.PROT_READ | syscall.PROT_WRITE
-)
+import "syscall"
 
 func munmapCodeSegment(code []byte) error {
        return syscall.Munmap(code)
 }
-
-// mmapCodeSegmentAMD64 gives all read-write-exec permission to the mmap region
-// to enter the function. Otherwise, segmentation fault exception is raised.
-func mmapCodeSegmentAMD64(size int) ([]byte, error) {
-       // The region must be RWX: RW for writing native codes, X for executing the region.
-       return mmapCodeSegment(size, mmapProtAMD64)
-}
-
-// mmapCodeSegmentARM64 cannot give all read-write-exec permission to the mmap region.
-// Otherwise, the mmap systemcall would raise an error. Here we give read-write
-// to the region so that we can write contents at call-sites. Callers are responsible to
-// execute MprotectRX on the returned buffer.
-func mmapCodeSegmentARM64(size int) ([]byte, error) {
-       // The region must be RW: RW for writing native codes.
-       return mmapCodeSegment(size, mmapProtARM64)
-}
index f3fa0911a401eef0a92ac71069330aa9594f09a7..06517b7b6c71e936a2100af26fbc4a2bc3d25892 100644 (file)
@@ -13,11 +13,7 @@ func munmapCodeSegment(code []byte) error {
        panic(errUnsupported)
 }
 
-func mmapCodeSegmentAMD64(size int) ([]byte, error) {
-       panic(errUnsupported)
-}
-
-func mmapCodeSegmentARM64(size int) ([]byte, error) {
+func mmapCodeSegment(size int) ([]byte, error) {
        panic(errUnsupported)
 }
 
index 03a254d4a693f0524546a86e9f80ba25a5f188c1..68b11ad38e263360caeb8006601f7a57552ea622 100644 (file)
@@ -56,16 +56,7 @@ func virtualProtect(address, size, newprotect uintptr, oldprotect *uint32) error
        return nil
 }
 
-func mmapCodeSegmentAMD64(size int) ([]byte, error) {
-       p, err := allocateMemory(uintptr(size), windows_PAGE_EXECUTE_READWRITE)
-       if err != nil {
-               return nil, err
-       }
-
-       return unsafe.Slice((*byte)(unsafe.Pointer(p)), size), nil
-}
-
-func mmapCodeSegmentARM64(size int) ([]byte, error) {
+func mmapCodeSegment(size int) ([]byte, error) {
        p, err := allocateMemory(uintptr(size), windows_PAGE_READWRITE)
        if err != nil {
                return nil, err
index f8f40cabe890bb5dae815acec34db15ffc8d9dfc..d9b264863cd0ea0bd2cd9768e7dcec933422125e 100644 (file)
@@ -7,6 +7,8 @@ import (
        "unsafe"
 )
 
+const noopMprotectRX = false
+
 // MprotectRX is like syscall.Mprotect with RX permission, defined locally so that BSD compiles.
 func MprotectRX(b []byte) (err error) {
        var _p0 unsafe.Pointer
index 6fe96d6f6f18f76745f43cbdc9791f3127414a57..71baabb44ef99d49ee3cd2f087614fc53ebcb099 100644 (file)
@@ -4,6 +4,8 @@ package platform
 
 import "syscall"
 
+const noopMprotectRX = false
+
 // MprotectRX is like syscall.Mprotect with RX permission.
 func MprotectRX(b []byte) (err error) {
        return syscall.Mprotect(b, syscall.PROT_READ|syscall.PROT_EXEC)
index 84719ab08c9a27422634fecc7f76436a0fe143a9..e367b2030892d6e83522c175e21c9af1d670a1e1 100644 (file)
@@ -2,8 +2,9 @@
 
 package platform
 
-import "syscall"
+const noopMprotectRX = true
 
 func MprotectRX(b []byte) error {
-       return syscall.ENOTSUP
+       // Assume we already called mmap with at least RX.
+       return nil
 }
index 532cc7b8c5989d1cf3a1962a2317bcf71ecfb47a..35806f6e40f3699c2d2d2d4d60f1238a7df79176 100644 (file)
@@ -21,13 +21,13 @@ func CompilerSupports(features api.CoreFeatures) bool {
        case "linux", "darwin", "freebsd", "netbsd", "dragonfly", "windows":
                if runtime.GOARCH == "arm64" {
                        if features.IsEnabled(experimental.CoreFeaturesThreads) {
-                               return CpuFeatures.Has(CpuFeatureArm64Atomic)
+                               return CpuFeatures().Has(CpuFeatureArm64Atomic)
                        }
                        return true
                }
                fallthrough
        case "solaris", "illumos":
-               return runtime.GOARCH == "amd64" && CpuFeatures.Has(CpuFeatureAmd64SSE4_1)
+               return runtime.GOARCH == "amd64" && CpuFeatures().Has(CpuFeatureAmd64SSE4_1)
        default:
                return false
        }
@@ -40,11 +40,7 @@ func MmapCodeSegment(size int) ([]byte, error) {
        if size == 0 {
                panic("BUG: MmapCodeSegment with zero length")
        }
-       if runtime.GOARCH == "amd64" {
-               return mmapCodeSegmentAMD64(size)
-       } else {
-               return mmapCodeSegmentARM64(size)
-       }
+       return mmapCodeSegment(size)
 }
 
 // MunmapCodeSegment unmaps the given memory region.
index 717f8598afbe9ceea4bf24b5a13d521d112a8d9c..47885172970b821163bd467ebe9007af52e64aed 100644 (file)
@@ -36,7 +36,9 @@ func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Err
        // To match expectations of WASI, e.g. TinyGo TestStatBadDir, return
        // ENOENT, not ENOTDIR.
        case sys.ENOTDIR:
-               errno = sys.ENOENT
+               if !strings.HasSuffix(path, "/") {
+                       errno = sys.ENOENT
+               }
        case sys.ENOENT:
                if isSymlink(path) {
                        // Either symlink or hard link not found. We change the returned
index fd289756de97a572ede8c788f32c45b62ee4618d..4ca5c3b865228a1699c1596b1eb94cecf3aea497 100644 (file)
@@ -1,4 +1,4 @@
-//go:build (amd64 || arm64 || riscv64) && linux
+//go:build (amd64 || arm64 || ppc64le || riscv64 || s390x) && linux
 
 // Note: This expression is not the same as compiler support, even if it looks
 // similar. Platform functions here are used in interpreter mode as well.
index 4b05a8977211b971cf2a7c133ed84b345756d0d7..b966c4333053bc411b04ef077e6607db96b492f2 100644 (file)
@@ -1,4 +1,4 @@
-//go:build (!((amd64 || arm64 || riscv64) && linux) && !((amd64 || arm64) && (darwin || freebsd)) && !((amd64 || arm64) && windows)) || js
+//go:build (!((amd64 || arm64 || ppc64le || riscv64 || s390x) && linux) && !((amd64 || arm64) && (darwin || freebsd)) && !((amd64 || arm64) && windows)) || js
 
 package sysfs
 
index 6044892289f27a89922835d9d44d87c1cff51a39..96d061a7bc9c3e4a5377f7ebee0c5fd1391341a0 100644 (file)
@@ -4,6 +4,7 @@ import (
        "bytes"
        "errors"
        "fmt"
+       "slices"
        "strconv"
        "strings"
 
@@ -480,11 +481,9 @@ func (m *Module) validateFunctionWithMaxStackValues(
                        // function type might result in invalid value types if the block is the outermost label
                        // which equals the function's type.
                        if lnLabel.op != OpcodeLoop { // Loop operation doesn't require results since the continuation is the beginning of the loop.
-                               defaultLabelType = make([]ValueType, len(lnLabel.blockType.Results))
-                               copy(defaultLabelType, lnLabel.blockType.Results)
+                               defaultLabelType = slices.Clone(lnLabel.blockType.Results)
                        } else {
-                               defaultLabelType = make([]ValueType, len(lnLabel.blockType.Params))
-                               copy(defaultLabelType, lnLabel.blockType.Params)
+                               defaultLabelType = slices.Clone(lnLabel.blockType.Params)
                        }
 
                        if enabledFeatures.IsEnabled(api.CoreFeatureReferenceTypes) {
@@ -534,7 +533,7 @@ func (m *Module) validateFunctionWithMaxStackValues(
 
                        // br_table instruction is stack-polymorphic.
                        valueTypeStack.unreachable()
-               } else if op == OpcodeCall {
+               } else if op == OpcodeCall || op == OpcodeTailCallReturnCall {
                        pc++
                        index, num, err := leb128.LoadUint32(body[pc:])
                        if err != nil {
@@ -544,16 +543,35 @@ func (m *Module) validateFunctionWithMaxStackValues(
                        if int(index) >= len(functions) {
                                return fmt.Errorf("invalid function index")
                        }
+
+                       var opcodeName string
+                       if op == OpcodeCall {
+                               opcodeName = OpcodeCallName
+                       } else {
+                               opcodeName = OpcodeTailCallReturnCallName
+                       }
+
                        funcType := &m.TypeSection[functions[index]]
                        for i := 0; i < len(funcType.Params); i++ {
                                if err := valueTypeStack.popAndVerifyType(funcType.Params[len(funcType.Params)-1-i]); err != nil {
-                                       return fmt.Errorf("type mismatch on %s operation param type: %v", OpcodeCallName, err)
+                                       return fmt.Errorf("type mismatch on %s operation param type: %v", opcodeName, err)
                                }
                        }
                        for _, exp := range funcType.Results {
                                valueTypeStack.push(exp)
                        }
-               } else if op == OpcodeCallIndirect {
+                       if op == OpcodeTailCallReturnCall {
+                               if err := enabledFeatures.RequireEnabled(experimental.CoreFeaturesTailCall); err != nil {
+                                       return fmt.Errorf("%s invalid as %v", OpcodeTailCallReturnCallName, err)
+                               }
+                               // Same formatting as OpcodeEnd on the outer-most block
+                               if err := valueTypeStack.requireStackValues(false, "", functionType.Results, false); err != nil {
+                                       return err
+                               }
+                               // behaves as a jump.
+                               valueTypeStack.unreachable()
+                       }
+               } else if op == OpcodeCallIndirect || op == OpcodeTailCallReturnCallIndirect {
                        pc++
                        typeIndex, num, err := leb128.LoadUint32(body[pc:])
                        if err != nil {
@@ -561,8 +579,15 @@ func (m *Module) validateFunctionWithMaxStackValues(
                        }
                        pc += num
 
+                       var opcodeName string
+                       if op == OpcodeCallIndirect {
+                               opcodeName = OpcodeCallIndirectName
+                       } else {
+                               opcodeName = OpcodeTailCallReturnCallIndirectName
+                       }
+
                        if int(typeIndex) >= len(m.TypeSection) {
-                               return fmt.Errorf("invalid type index at %s: %d", OpcodeCallIndirectName, typeIndex)
+                               return fmt.Errorf("invalid type index at %s: %d", opcodeName, typeIndex)
                        }
 
                        tableIndex, num, err := leb128.LoadUint32(body[pc:])
@@ -582,21 +607,33 @@ func (m *Module) validateFunctionWithMaxStackValues(
 
                        table := tables[tableIndex]
                        if table.Type != RefTypeFuncref {
-                               return fmt.Errorf("table is not funcref type but was %s for %s", RefTypeName(table.Type), OpcodeCallIndirectName)
+                               return fmt.Errorf("table is not funcref type but was %s for %s", RefTypeName(table.Type), opcodeName)
                        }
 
                        if err = valueTypeStack.popAndVerifyType(ValueTypeI32); err != nil {
-                               return fmt.Errorf("cannot pop the offset in table for %s", OpcodeCallIndirectName)
+                               return fmt.Errorf("cannot pop the offset in table for %s", opcodeName)
                        }
                        funcType := &m.TypeSection[typeIndex]
                        for i := 0; i < len(funcType.Params); i++ {
                                if err = valueTypeStack.popAndVerifyType(funcType.Params[len(funcType.Params)-1-i]); err != nil {
-                                       return fmt.Errorf("type mismatch on %s operation input type", OpcodeCallIndirectName)
+                                       return fmt.Errorf("type mismatch on %s operation input type", opcodeName)
                                }
                        }
                        for _, exp := range funcType.Results {
                                valueTypeStack.push(exp)
                        }
+
+                       if op == OpcodeTailCallReturnCallIndirect {
+                               if err := enabledFeatures.RequireEnabled(experimental.CoreFeaturesTailCall); err != nil {
+                                       return fmt.Errorf("%s invalid as %v", OpcodeTailCallReturnCallIndirectName, err)
+                               }
+                               // Same formatting as OpcodeEnd on the outer-most block
+                               if err := valueTypeStack.requireStackValues(false, "", functionType.Results, false); err != nil {
+                                       return err
+                               }
+                               // behaves as a jump.
+                               valueTypeStack.unreachable()
+                       }
                } else if OpcodeI32Eqz <= op && op <= OpcodeI64Extend32S {
                        switch op {
                        case OpcodeI32Eqz:
index 67f196b8b3fe0289d9ce885d83c322904316cff6..7f76b1e526721b176a838bb77821744db468eff4 100644 (file)
@@ -777,6 +777,16 @@ const (
        OpcodeAtomicI64Rmw32CmpxchgU OpcodeAtomic = 0x4e
 )
 
+// OpcodeTailCall represents an opcode of a tail call instructions.
+//
+// These opcodes are toggled with CoreFeaturesTailCall.
+type OpcodeTailCall = byte
+
+const (
+       OpcodeTailCallReturnCall         OpcodeTailCall = 0x12
+       OpcodeTailCallReturnCallIndirect OpcodeTailCall = 0x13
+)
+
 const (
        OpcodeUnreachableName       = "unreachable"
        OpcodeNopName               = "nop"
@@ -1864,3 +1874,18 @@ var atomicInstructionName = map[OpcodeAtomic]string{
 func AtomicInstructionName(oc OpcodeAtomic) (ret string) {
        return atomicInstructionName[oc]
 }
+
+const (
+       OpcodeTailCallReturnCallName         = "return_call"
+       OpcodeTailCallReturnCallIndirectName = "return_call_indirect"
+)
+
+var tailCallInstructionName = map[OpcodeTailCall]string{
+       OpcodeTailCallReturnCall:         OpcodeTailCallReturnCallName,
+       OpcodeTailCallReturnCallIndirect: OpcodeTailCallReturnCallIndirectName,
+}
+
+// TailCallInstructionName returns the instruction name corresponding to the tail call Opcode.
+func TailCallInstructionName(oc OpcodeTailCall) (ret string) {
+       return tailCallInstructionName[oc]
+}
index 2123693c6b66f4253684a88355f0d7c3c0da2b58..1df1764df4f9a082a0734934e973564a998d7038 100644 (file)
@@ -326,10 +326,14 @@ func (t *TableInstance) Grow(delta uint32, initialRef Reference) (currentLen uin
        newLen >= math.MaxUint32 || (t.Max != nil && newLen > int64(*t.Max)) {
                return 0xffffffff // = -1 in signed 32-bit integer.
        }
+
        t.References = append(t.References, make([]uintptr, delta)...)
+       if initialRef == 0 {
+               return
+       }
 
        // Uses the copy trick for faster filling the new region with the initial value.
-       // https://gist.github.com/taylorza/df2f89d5f9ab3ffd06865062a4cf015d
+       // https://github.com/golang/go/blob/go1.24.0/src/slices/slices.go#L514-L517
        newRegion := t.References[currentLen:]
        newRegion[0] = initialRef
        for i := 1; i < len(newRegion); i *= 2 {
index 9b5e20e8d29b0c24aeada123fc9dbddc210ac01f..dded3634706b6df16f725f48a3c1585076d97a49 100644 (file)
@@ -1,4 +1,4 @@
-//go:build (amd64 || arm64 || riscv64) && linux
+//go:build (amd64 || arm64 || ppc64le || riscv64 || s390x) && linux
 
 // Note: This expression is not the same as compiler support, even if it looks
 // similar. Platform functions here are used in interpreter mode as well.
index cc37012cff632e730ffac0af760caeecff09c97d..cc800b2e3de1772b4e3091b9bd5fab1dd78452dc 100644 (file)
@@ -1,4 +1,4 @@
-//go:build (!((amd64 || arm64 || riscv64) && linux) && !((amd64 || arm64) && (darwin || freebsd)) && !((amd64 || arm64) && windows)) || js
+//go:build (!((amd64 || arm64 || ppc64le || riscv64 || s390x) && linux) && !((amd64 || arm64) && (darwin || freebsd)) && !((amd64 || arm64) && windows)) || js
 
 package sys
 
index 2207475b7926b0cd7dc592893e0f8e422a4b0c76..8d77fc98f73b05dd37fdfb729f4a6fe7d275f074 100644 (file)
@@ -172,7 +172,7 @@ github.com/containerd/imgcrypt/v2/images/encryption
 ## explicit; go 1.20
 github.com/containerd/log
 github.com/containerd/log/logtest
-# github.com/containerd/nri v0.10.1-0.20251117084425-3827d9da021a
+# github.com/containerd/nri v0.11.0
 ## explicit; go 1.24.0
 github.com/containerd/nri
 github.com/containerd/nri/pkg/adaptation
@@ -508,8 +508,8 @@ github.com/stretchr/testify/require
 # github.com/tchap/go-patricia/v2 v2.3.3
 ## explicit; go 1.16
 github.com/tchap/go-patricia/v2/patricia
-# github.com/tetratelabs/wazero v1.9.0
-## explicit; go 1.22.0
+# github.com/tetratelabs/wazero v1.10.1
+## explicit; go 1.23.0
 github.com/tetratelabs/wazero
 github.com/tetratelabs/wazero/api
 github.com/tetratelabs/wazero/experimental