internal/runtimeconfig: initial prototype

Adding initial prototype of runtimeconfig package which provides ability
to be notified of runtime config changes from Cloud Runtime Configurator
service.

Change-Id: Id5765e15bc960fd001286ee14678c5ff8e2ec168
Reviewed-on: https://go-review.googlesource.com/69297
Reviewed-by: Ross Light <light@google.com>
diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
index 8d184c8..e532843 100644
--- a/Godeps/Godeps.json
+++ b/Godeps/Godeps.json
@@ -497,6 +497,10 @@
 			"Rev": "1e559d0a00eef8a9a43151db4665280bd8dd5886"
 		},
 		{
+			"ImportPath": "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1",
+			"Rev": "1e559d0a00eef8a9a43151db4665280bd8dd5886"
+		},
+		{
 			"ImportPath": "google.golang.org/genproto/googleapis/logging/type",
 			"Rev": "1e559d0a00eef8a9a43151db4665280bd8dd5886"
 		},
@@ -505,6 +509,10 @@
 			"Rev": "1e559d0a00eef8a9a43151db4665280bd8dd5886"
 		},
 		{
+			"ImportPath": "google.golang.org/genproto/googleapis/longrunning",
+			"Rev": "1e559d0a00eef8a9a43151db4665280bd8dd5886"
+		},
+		{
 			"ImportPath": "google.golang.org/genproto/googleapis/rpc/status",
 			"Rev": "1e559d0a00eef8a9a43151db4665280bd8dd5886"
 		},
diff --git a/internal/runtimeconfig/_demo/demo.go b/internal/runtimeconfig/_demo/demo.go
new file mode 100644
index 0000000..82f29ad
--- /dev/null
+++ b/internal/runtimeconfig/_demo/demo.go
@@ -0,0 +1,90 @@
+/*
+This binary demonstrates watching over a Runtime Configurator variable using the runtimeconfig
+package.  To cancel the Watcher.Watch call, enter 'x' and '<enter>' keys on the terminal.
+*/
+package main
+
+import (
+	"context"
+	"fmt"
+	"log"
+	"os"
+	"path"
+	"time"
+
+	"github.com/golang/gddo/internal/runtimeconfig"
+)
+
+func main() {
+	if len(os.Args) != 4 {
+		fmt.Fprintf(os.Stderr,
+			"Usage: %s <project-id> <config-name> <var-name>\n\n",
+			path.Base(os.Args[0]))
+		os.Exit(1)
+	}
+
+	projectID := os.Args[1]
+	configName := os.Args[2]
+	varName := os.Args[3]
+
+	ctx := context.Background()
+	client, err := runtimeconfig.NewClient(ctx)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer client.Close()
+
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+
+	w, err := client.NewWatcher(ctx, projectID, configName, varName,
+		&runtimeconfig.WatchOptions{WaitTime: 10 * time.Second})
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	go func() {
+		key := make([]byte, 1)
+		for {
+			n, err := os.Stdin.Read(key)
+			if err != nil {
+				log.Printf("stdin error: %v\n", err)
+			}
+			if n == 1 && key[0] == 'x' {
+				log.Println("quiting demo")
+				cancel()
+				time.Sleep(1 * time.Second)
+				os.Exit(0)
+			}
+		}
+	}()
+
+	vrbl := w.Variable()
+	log.Printf("watching variable %v\n", variableString(&vrbl))
+
+	isWatching := true
+	for isWatching {
+		log.Println("waiting for update...")
+		select {
+		case <-ctx.Done():
+			log.Println("done watching")
+			isWatching = false
+		default:
+			err := w.Watch(ctx)
+			vrbl = w.Variable()
+			if err == nil {
+				log.Printf("Updated: %s\n", variableString(&vrbl))
+			} else {
+				log.Println(err)
+				if runtimeconfig.IsDeleted(err) {
+					log.Printf("Deleted: %s\n", variableString(&vrbl))
+				}
+			}
+		}
+	}
+}
+
+func variableString(v *runtimeconfig.Variable) string {
+	return fmt.Sprintf("<name: %q, value: %q, isDeleted: %t, updateTime: %v>",
+		v.Name, string(v.Value), v.IsDeleted, v.UpdateTime)
+}
diff --git a/internal/runtimeconfig/runtimeconfig.go b/internal/runtimeconfig/runtimeconfig.go
new file mode 100644
index 0000000..a29d1f6
--- /dev/null
+++ b/internal/runtimeconfig/runtimeconfig.go
@@ -0,0 +1,239 @@
+// Package runtimeconfig provides a limited set of client-side APIs for the Cloud Runtime
+// Configurator. The Cloud Runtime Configurator service allows projects to store runtime
+// configurations in the cloud and have clients fetch and get notified of changes to configuration
+// values during runtime.
+//
+// This package provides a Client that sets up a Watcher for detecting updates on a Runtime
+// Configurator variable.
+package runtimeconfig
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"sync"
+	"time"
+
+	"github.com/golang/protobuf/ptypes"
+	"google.golang.org/api/option"
+	transport "google.golang.org/api/transport/grpc"
+	pb "google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/status"
+)
+
+// endpoint is the address of the GCP Runtime Configurator API.
+const endPoint = "runtimeconfig.googleapis.com:443"
+
+// List of authentication scopes required for using the Runtime Configurator API.
+var authScopes = []string{
+	"https://www.googleapis.com/auth/cloud-platform",
+	"https://www.googleapis.com/auth/cloudruntimeconfig",
+}
+
+const (
+	defaultWaitTimeout = 10 * time.Minute
+	minWaitTimeout     = 10 * time.Second
+)
+
+// Client is a RuntimeConfigManager client.  It wraps the gRPC client stub and currently exposes
+// only a few APIs primarily for fetching and watching over configuration variables.
+type Client struct {
+	conn *grpc.ClientConn
+	// The gRPC API client.
+	client pb.RuntimeConfigManagerClient
+}
+
+// NewClient constructs a Client instance from given gRPC connection.
+func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
+	opts = append(opts, option.WithEndpoint(endPoint), option.WithScopes(authScopes...))
+	conn, err := transport.Dial(ctx, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return &Client{
+		conn:   conn,
+		client: pb.NewRuntimeConfigManagerClient(conn),
+	}, nil
+}
+
+// Close tears down the gRPC connection used by this Client.
+func (c *Client) Close() error {
+	return c.conn.Close()
+}
+
+// NewWatcher will fetch variable for given projectID, configName and varName, then constructs a
+// Watcher object containing the fetched variable.  Users can then use the Watcher to retrieve the
+// variable as well as wait for changes.
+func (c *Client) NewWatcher(ctx context.Context, projectID, configName, varName string,
+	opts *WatchOptions) (*Watcher, error) {
+
+	name := fmt.Sprintf("projects/%s/configs/%s/variables/%s", projectID, configName, varName)
+	vpb, err := c.client.GetVariable(ctx, &pb.GetVariableRequest{Name: name})
+	if err != nil {
+		return nil, err
+	}
+
+	if opts == nil {
+		opts = &WatchOptions{}
+	}
+	waitTime := opts.WaitTime
+	switch {
+	case waitTime == 0:
+		waitTime = defaultWaitTimeout
+	case waitTime < minWaitTimeout:
+		waitTime = minWaitTimeout
+	}
+
+	// Make sure update time is valid before copying.
+	updateTime, err := parseUpdateTime(vpb)
+	if err != nil {
+		return nil, err
+	}
+
+	w := &Watcher{
+		client:      c.client,
+		waitTime:    waitTime,
+		lastRPCTime: time.Now(),
+	}
+	copyFromProto(vpb, &w.vrbl, updateTime)
+	return w, nil
+}
+
+// WatchOptions provide optional configurations to the Watcher.
+type WatchOptions struct {
+	// WaitTime controls the frequency of making RPC and checking for updates by the Watch method.
+	// A Watcher keeps track of the last time it made an RPC, when Watch is called, it waits for
+	// configured WaitTime from the last RPC before making another RPC.
+	//
+	// If this option is not set, it defaults to defaultWaitTimeout.  If option is set to a value
+	// smaller than minWaitTimeout, it uses minWaitTimeout value instead.
+	WaitTime time.Duration
+}
+
+// Watcher caches a variable in memory and listens for updates from the Runtime Configurator
+// service.
+type Watcher struct {
+	client      pb.RuntimeConfigManagerClient
+	waitTime    time.Duration
+	lastRPCTime time.Time
+
+	mu   sync.Mutex
+	vrbl Variable
+}
+
+// Variable returns a shallow copy of the associated variable of this Watcher object.  It is safe to
+// use from multiple goroutines.
+func (w *Watcher) Variable() Variable {
+	w.mu.Lock()
+	defer w.mu.Unlock()
+	return w.vrbl
+}
+
+var errDeleted = errors.New("deleted variable")
+
+// IsDeleted returns true if variable has been deleted.
+func IsDeleted(err error) bool {
+	return err == errDeleted
+}
+
+// Watch blocks until the variable changes, the Context's Done channel closes, or an RPC
+// error occurs.
+//
+// If the variable has a new value, then method returns nil and the value can be retrieved by
+// calling Variable.
+//
+// If the variable is deleted, then method returns an error that will be matched by IsDeleted.
+// Subsequent calls to this method will block until the variable is restored or another error
+// occurs.
+//
+// It is NOT safe to call this method from multiple goroutines.
+//
+// To stop this function from blocking, caller can passed in Context object constructed via
+// WithCancel and call the cancel function.
+func (w *Watcher) Watch(ctx context.Context) error {
+	// Loop to check for changes or continue waiting.
+	for {
+		// Block until waitTime or context cancelled/timed out.
+		waitTime := w.waitTime - time.Now().Sub(w.lastRPCTime)
+		select {
+		case <-time.After(waitTime):
+		case <-ctx.Done():
+			return ctx.Err()
+		}
+
+		// Use GetVariables RPC and check for deltas based on the response. May consider using
+		// ListVariables RPC with Filter=<key> and ReturnValues=false to identify deltas before
+		// doing a GetVariable to potentially save on response size. However, even with
+		// Filter=<key>, the response on ListVariables may return more than one matching variable
+		// and this code will need to iterate through calling more ListVariables RPCs.
+		vpb, err := w.client.GetVariable(ctx, &pb.GetVariableRequest{Name: w.vrbl.Name})
+		w.lastRPCTime = time.Now()
+		if err == nil {
+			updateTime, err := parseUpdateTime(vpb)
+			if err != nil {
+				return err
+			}
+
+			// Determine if there are any changes based on update_time field. If there are, update
+			// cache and return nil, else continue on.
+			// TODO(herbie): It is currently possible to have update_time changed but without any
+			// changes in the content. Need to re-evaluate if this should instead check for actual
+			// content changes.
+			w.mu.Lock()
+			if !w.vrbl.UpdateTime.Equal(updateTime) {
+				copyFromProto(vpb, &w.vrbl, updateTime)
+				w.mu.Unlock()
+				return nil
+			}
+			w.mu.Unlock()
+
+		} else {
+			if st, ok := status.FromError(err); !ok || st.Code() != codes.NotFound {
+				return err
+			}
+			// For RPC not found error, if last known state is not deleted, update and return
+			// errDeleted, else treat as no change has occurred.
+			w.mu.Lock()
+			if !w.vrbl.IsDeleted {
+				w.vrbl.IsDeleted = true
+				w.vrbl.UpdateTime = time.Now().UTC()
+				w.mu.Unlock()
+				return errDeleted
+			}
+			w.mu.Unlock()
+		}
+	}
+}
+
+// Variable contains the runtime configuration data.
+// Treat Value field as read-only.  Writes to it may affect other Variable objects containing
+// reference to the same backing array.
+type Variable struct {
+	Name       string
+	Value      []byte
+	IsDeleted  bool
+	UpdateTime time.Time
+}
+
+func copyFromProto(vpb *pb.Variable, vrbl *Variable, updateTime time.Time) {
+	vrbl.Name = vpb.Name
+	vrbl.UpdateTime = updateTime
+	vrbl.IsDeleted = false
+	vrbl.Value = vpb.GetValue()
+	// We currently only expose content in []byte. If proto contains text content, convert that to
+	// []byte.
+	if _, isText := vpb.GetContents().(*pb.Variable_Text); isText {
+		vrbl.Value = []byte(vpb.GetText())
+	}
+}
+
+func parseUpdateTime(vpb *pb.Variable) (time.Time, error) {
+	updateTime, err := ptypes.Timestamp(vpb.GetUpdateTime())
+	if err != nil {
+		return time.Time{}, fmt.Errorf(
+			"variable message for name=%q contains invalid timestamp: %v", vpb.Name, err)
+	}
+	return updateTime, nil
+}
diff --git a/internal/runtimeconfig/runtimeconfig_test.go b/internal/runtimeconfig/runtimeconfig_test.go
new file mode 100644
index 0000000..ee8178e
--- /dev/null
+++ b/internal/runtimeconfig/runtimeconfig_test.go
@@ -0,0 +1,43 @@
+package runtimeconfig
+
+import (
+	"context"
+	"log"
+)
+
+func Example() {
+	// Create a Client object.
+	ctx := context.Background()
+	client, err := NewClient(ctx)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer client.Close()
+
+	// Create a Watcher object.
+	w, err := client.NewWatcher(ctx, "project", "config-name", "food", nil)
+	// Use retrieved Variable and apply to configurations accordingly.
+	log.Printf("value: %s\n", string(w.Variable().Value))
+
+	// Optionally, get a Context with cancel func to stop the Watch call.
+	ctx, cancel := context.WithCancel(ctx)
+	defer cancel()
+
+	// Have a separate goroutine that waits for changes.
+	go func() {
+		for {
+			select {
+			case <-ctx.Done():
+				// Cancelled or timed out.
+				return
+			default:
+				if err := w.Watch(ctx); err != nil {
+					// Log or handle other errors
+					continue
+				}
+				// Use updated variable accordingly.
+				log.Printf("value: %s\n", string(w.Variable().Value))
+			}
+		}
+	}()
+}
diff --git a/vendor/google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1/resources.pb.go b/vendor/google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1/resources.pb.go
new file mode 100644
index 0000000..74e09fa
--- /dev/null
+++ b/vendor/google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1/resources.pb.go
@@ -0,0 +1,590 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/runtimeconfig/v1beta1/resources.proto
+
+/*
+Package runtimeconfig is a generated protocol buffer package.
+
+It is generated from these files:
+	google/cloud/runtimeconfig/v1beta1/resources.proto
+	google/cloud/runtimeconfig/v1beta1/runtimeconfig.proto
+
+It has these top-level messages:
+	RuntimeConfig
+	Variable
+	EndCondition
+	Waiter
+	ListConfigsRequest
+	ListConfigsResponse
+	GetConfigRequest
+	CreateConfigRequest
+	UpdateConfigRequest
+	DeleteConfigRequest
+	ListVariablesRequest
+	ListVariablesResponse
+	WatchVariableRequest
+	GetVariableRequest
+	CreateVariableRequest
+	UpdateVariableRequest
+	DeleteVariableRequest
+	ListWaitersRequest
+	ListWaitersResponse
+	GetWaiterRequest
+	CreateWaiterRequest
+	DeleteWaiterRequest
+*/
+package runtimeconfig
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import _ "google.golang.org/genproto/googleapis/api/annotations"
+import google_protobuf1 "github.com/golang/protobuf/ptypes/duration"
+import google_protobuf2 "github.com/golang/protobuf/ptypes/timestamp"
+import google_rpc "google.golang.org/genproto/googleapis/rpc/status"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// The `VariableState` describes the last known state of the variable and is
+// used during a `variables().watch` call to distinguish the state of the
+// variable.
+type VariableState int32
+
+const (
+	// Default variable state.
+	VariableState_VARIABLE_STATE_UNSPECIFIED VariableState = 0
+	// The variable was updated, while `variables().watch` was executing.
+	VariableState_UPDATED VariableState = 1
+	// The variable was deleted, while `variables().watch` was executing.
+	VariableState_DELETED VariableState = 2
+)
+
+var VariableState_name = map[int32]string{
+	0: "VARIABLE_STATE_UNSPECIFIED",
+	1: "UPDATED",
+	2: "DELETED",
+}
+var VariableState_value = map[string]int32{
+	"VARIABLE_STATE_UNSPECIFIED": 0,
+	"UPDATED":                    1,
+	"DELETED":                    2,
+}
+
+func (x VariableState) String() string {
+	return proto.EnumName(VariableState_name, int32(x))
+}
+func (VariableState) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+// A RuntimeConfig resource is the primary resource in the Cloud RuntimeConfig
+// service. A RuntimeConfig resource consists of metadata and a hierarchy of
+// variables.
+type RuntimeConfig struct {
+	// The resource name of a runtime config. The name must have the format:
+	//
+	//     projects/[PROJECT_ID]/configs/[CONFIG_NAME]
+	//
+	// The `[PROJECT_ID]` must be a valid project ID, and `[CONFIG_NAME]` is an
+	// arbitrary name that matches RFC 1035 segment specification. The length of
+	// `[CONFIG_NAME]` must be less than 64 bytes.
+	//
+	// You pick the RuntimeConfig resource name, but the server will validate that
+	// the name adheres to this format. After you create the resource, you cannot
+	// change the resource's name.
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// An optional description of the RuntimeConfig object.
+	Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"`
+}
+
+func (m *RuntimeConfig) Reset()                    { *m = RuntimeConfig{} }
+func (m *RuntimeConfig) String() string            { return proto.CompactTextString(m) }
+func (*RuntimeConfig) ProtoMessage()               {}
+func (*RuntimeConfig) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+func (m *RuntimeConfig) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *RuntimeConfig) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+// Describes a single variable within a RuntimeConfig resource.
+// The name denotes the hierarchical variable name. For example,
+// `ports/serving_port` is a valid variable name. The variable value is an
+// opaque string and only leaf variables can have values (that is, variables
+// that do not have any child variables).
+type Variable struct {
+	// The name of the variable resource, in the format:
+	//
+	//     projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]
+	//
+	// The `[PROJECT_ID]` must be a valid project ID, `[CONFIG_NAME]` must be a
+	// valid RuntimeConfig reource and `[VARIABLE_NAME]` follows Unix file system
+	// file path naming.
+	//
+	// The `[VARIABLE_NAME]` can contain ASCII letters, numbers, slashes and
+	// dashes. Slashes are used as path element separators and are not part of the
+	// `[VARIABLE_NAME]` itself, so `[VARIABLE_NAME]` must contain at least one
+	// non-slash character. Multiple slashes are coalesced into single slash
+	// character. Each path segment should follow RFC 1035 segment specification.
+	// The length of a `[VARIABLE_NAME]` must be less than 256 bytes.
+	//
+	// Once you create a variable, you cannot change the variable name.
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// The the value of the variable. It can be either a binary or a string
+	// value. You must specify one of either `value` or `text`. Specifying both
+	// will cause the server to return an error.
+	//
+	// Types that are valid to be assigned to Contents:
+	//	*Variable_Value
+	//	*Variable_Text
+	Contents isVariable_Contents `protobuf_oneof:"contents"`
+	// [Output Only] The time of the last variable update.
+	UpdateTime *google_protobuf2.Timestamp `protobuf:"bytes,3,opt,name=update_time,json=updateTime" json:"update_time,omitempty"`
+	// [Ouput only] The current state of the variable. The variable state indicates
+	// the outcome of the `variables().watch` call and is visible through the
+	// `get` and `list` calls.
+	State VariableState `protobuf:"varint,4,opt,name=state,enum=google.cloud.runtimeconfig.v1beta1.VariableState" json:"state,omitempty"`
+}
+
+func (m *Variable) Reset()                    { *m = Variable{} }
+func (m *Variable) String() string            { return proto.CompactTextString(m) }
+func (*Variable) ProtoMessage()               {}
+func (*Variable) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+type isVariable_Contents interface {
+	isVariable_Contents()
+}
+
+type Variable_Value struct {
+	Value []byte `protobuf:"bytes,2,opt,name=value,proto3,oneof"`
+}
+type Variable_Text struct {
+	Text string `protobuf:"bytes,5,opt,name=text,oneof"`
+}
+
+func (*Variable_Value) isVariable_Contents() {}
+func (*Variable_Text) isVariable_Contents()  {}
+
+func (m *Variable) GetContents() isVariable_Contents {
+	if m != nil {
+		return m.Contents
+	}
+	return nil
+}
+
+func (m *Variable) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Variable) GetValue() []byte {
+	if x, ok := m.GetContents().(*Variable_Value); ok {
+		return x.Value
+	}
+	return nil
+}
+
+func (m *Variable) GetText() string {
+	if x, ok := m.GetContents().(*Variable_Text); ok {
+		return x.Text
+	}
+	return ""
+}
+
+func (m *Variable) GetUpdateTime() *google_protobuf2.Timestamp {
+	if m != nil {
+		return m.UpdateTime
+	}
+	return nil
+}
+
+func (m *Variable) GetState() VariableState {
+	if m != nil {
+		return m.State
+	}
+	return VariableState_VARIABLE_STATE_UNSPECIFIED
+}
+
+// XXX_OneofFuncs is for the internal use of the proto package.
+func (*Variable) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
+	return _Variable_OneofMarshaler, _Variable_OneofUnmarshaler, _Variable_OneofSizer, []interface{}{
+		(*Variable_Value)(nil),
+		(*Variable_Text)(nil),
+	}
+}
+
+func _Variable_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
+	m := msg.(*Variable)
+	// contents
+	switch x := m.Contents.(type) {
+	case *Variable_Value:
+		b.EncodeVarint(2<<3 | proto.WireBytes)
+		b.EncodeRawBytes(x.Value)
+	case *Variable_Text:
+		b.EncodeVarint(5<<3 | proto.WireBytes)
+		b.EncodeStringBytes(x.Text)
+	case nil:
+	default:
+		return fmt.Errorf("Variable.Contents has unexpected type %T", x)
+	}
+	return nil
+}
+
+func _Variable_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
+	m := msg.(*Variable)
+	switch tag {
+	case 2: // contents.value
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeRawBytes(true)
+		m.Contents = &Variable_Value{x}
+		return true, err
+	case 5: // contents.text
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		x, err := b.DecodeStringBytes()
+		m.Contents = &Variable_Text{x}
+		return true, err
+	default:
+		return false, nil
+	}
+}
+
+func _Variable_OneofSizer(msg proto.Message) (n int) {
+	m := msg.(*Variable)
+	// contents
+	switch x := m.Contents.(type) {
+	case *Variable_Value:
+		n += proto.SizeVarint(2<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(len(x.Value)))
+		n += len(x.Value)
+	case *Variable_Text:
+		n += proto.SizeVarint(5<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(len(x.Text)))
+		n += len(x.Text)
+	case nil:
+	default:
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
+	}
+	return n
+}
+
+// The condition that a Waiter resource is waiting for.
+type EndCondition struct {
+	// The condition oneof holds the available condition types for this
+	// EndCondition. Currently, the only available type is Cardinality.
+	//
+	// Types that are valid to be assigned to Condition:
+	//	*EndCondition_Cardinality_
+	Condition isEndCondition_Condition `protobuf_oneof:"condition"`
+}
+
+func (m *EndCondition) Reset()                    { *m = EndCondition{} }
+func (m *EndCondition) String() string            { return proto.CompactTextString(m) }
+func (*EndCondition) ProtoMessage()               {}
+func (*EndCondition) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+
+type isEndCondition_Condition interface {
+	isEndCondition_Condition()
+}
+
+type EndCondition_Cardinality_ struct {
+	Cardinality *EndCondition_Cardinality `protobuf:"bytes,1,opt,name=cardinality,oneof"`
+}
+
+func (*EndCondition_Cardinality_) isEndCondition_Condition() {}
+
+func (m *EndCondition) GetCondition() isEndCondition_Condition {
+	if m != nil {
+		return m.Condition
+	}
+	return nil
+}
+
+func (m *EndCondition) GetCardinality() *EndCondition_Cardinality {
+	if x, ok := m.GetCondition().(*EndCondition_Cardinality_); ok {
+		return x.Cardinality
+	}
+	return nil
+}
+
+// XXX_OneofFuncs is for the internal use of the proto package.
+func (*EndCondition) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
+	return _EndCondition_OneofMarshaler, _EndCondition_OneofUnmarshaler, _EndCondition_OneofSizer, []interface{}{
+		(*EndCondition_Cardinality_)(nil),
+	}
+}
+
+func _EndCondition_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
+	m := msg.(*EndCondition)
+	// condition
+	switch x := m.Condition.(type) {
+	case *EndCondition_Cardinality_:
+		b.EncodeVarint(1<<3 | proto.WireBytes)
+		if err := b.EncodeMessage(x.Cardinality); err != nil {
+			return err
+		}
+	case nil:
+	default:
+		return fmt.Errorf("EndCondition.Condition has unexpected type %T", x)
+	}
+	return nil
+}
+
+func _EndCondition_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
+	m := msg.(*EndCondition)
+	switch tag {
+	case 1: // condition.cardinality
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		msg := new(EndCondition_Cardinality)
+		err := b.DecodeMessage(msg)
+		m.Condition = &EndCondition_Cardinality_{msg}
+		return true, err
+	default:
+		return false, nil
+	}
+}
+
+func _EndCondition_OneofSizer(msg proto.Message) (n int) {
+	m := msg.(*EndCondition)
+	// condition
+	switch x := m.Condition.(type) {
+	case *EndCondition_Cardinality_:
+		s := proto.Size(x.Cardinality)
+		n += proto.SizeVarint(1<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(s))
+		n += s
+	case nil:
+	default:
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
+	}
+	return n
+}
+
+// A Cardinality condition for the Waiter resource. A cardinality condition is
+// met when the number of variables under a specified path prefix reaches a
+// predefined number. For example, if you set a Cardinality condition where
+// the `path` is set to `/foo` and the number of paths is set to 2, the
+// following variables would meet the condition in a RuntimeConfig resource:
+//
+// + `/foo/variable1 = "value1"`
+// + `/foo/variable2 = "value2"`
+// + `/bar/variable3 = "value3"`
+//
+// It would not would not satisify the same condition with the `number` set to
+// 3, however, because there is only 2 paths that start with `/foo`.
+// Cardinality conditions are recursive; all subtrees under the specific
+// path prefix are counted.
+type EndCondition_Cardinality struct {
+	// The root of the variable subtree to monitor. For example, `/foo`.
+	Path string `protobuf:"bytes,1,opt,name=path" json:"path,omitempty"`
+	// The number variables under the `path` that must exist to meet this
+	// condition. Defaults to 1 if not specified.
+	Number int32 `protobuf:"varint,2,opt,name=number" json:"number,omitempty"`
+}
+
+func (m *EndCondition_Cardinality) Reset()                    { *m = EndCondition_Cardinality{} }
+func (m *EndCondition_Cardinality) String() string            { return proto.CompactTextString(m) }
+func (*EndCondition_Cardinality) ProtoMessage()               {}
+func (*EndCondition_Cardinality) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2, 0} }
+
+func (m *EndCondition_Cardinality) GetPath() string {
+	if m != nil {
+		return m.Path
+	}
+	return ""
+}
+
+func (m *EndCondition_Cardinality) GetNumber() int32 {
+	if m != nil {
+		return m.Number
+	}
+	return 0
+}
+
+// A Waiter resource waits for some end condition within a RuntimeConfig resource
+// to be met before it returns. For example, assume you have a distributed
+// system where each node writes to a Variable resource indidicating the node's
+// readiness as part of the startup process.
+//
+// You then configure a Waiter resource with the success condition set to wait
+// until some number of nodes have checked in. Afterwards, your application
+// runs some arbitrary code after the condition has been met and the waiter
+// returns successfully.
+//
+// Once created, a Waiter resource is immutable.
+//
+// To learn more about using waiters, read the
+// [Creating a Waiter](/deployment-manager/runtime-configurator/creating-a-waiter)
+// documentation.
+type Waiter struct {
+	// The name of the Waiter resource, in the format:
+	//
+	//     projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]
+	//
+	// The `[PROJECT_ID]` must be a valid Google Cloud project ID,
+	// the `[CONFIG_NAME]` must be a valid RuntimeConfig resource, the
+	// `[WAITER_NAME]` must match RFC 1035 segment specification, and the length
+	// of `[WAITER_NAME]` must be less than 64 bytes.
+	//
+	// After you create a Waiter resource, you cannot change the resource name.
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// [Required] Specifies the timeout of the waiter in seconds, beginning from
+	// the instant that `waiters().create` method is called. If this time elapses
+	// before the success or failure conditions are met, the waiter fails and sets
+	// the `error` code to `DEADLINE_EXCEEDED`.
+	Timeout *google_protobuf1.Duration `protobuf:"bytes,2,opt,name=timeout" json:"timeout,omitempty"`
+	// [Optional] The failure condition of this waiter. If this condition is met,
+	// `done` will be set to `true` and the `error` code will be set to `ABORTED`.
+	// The failure condition takes precedence over the success condition. If both
+	// conditions are met, a failure will be indicated. This value is optional; if
+	// no failure condition is set, the only failure scenario will be a timeout.
+	Failure *EndCondition `protobuf:"bytes,3,opt,name=failure" json:"failure,omitempty"`
+	// [Required] The success condition. If this condition is met, `done` will be
+	// set to `true` and the `error` value will remain unset. The failure condition
+	// takes precedence over the success condition. If both conditions are met, a
+	// failure will be indicated.
+	Success *EndCondition `protobuf:"bytes,4,opt,name=success" json:"success,omitempty"`
+	// [Output Only] The instant at which this Waiter resource was created. Adding
+	// the value of `timeout` to this instant yields the timeout deadline for the
+	// waiter.
+	CreateTime *google_protobuf2.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime" json:"create_time,omitempty"`
+	// [Output Only] If the value is `false`, it means the waiter is still waiting
+	// for one of its conditions to be met.
+	//
+	// If true, the waiter has finished. If the waiter finished due to a timeout
+	// or failure, `error` will be set.
+	Done bool `protobuf:"varint,6,opt,name=done" json:"done,omitempty"`
+	// [Output Only] If the waiter ended due to a failure or timeout, this value
+	// will be set.
+	Error *google_rpc.Status `protobuf:"bytes,7,opt,name=error" json:"error,omitempty"`
+}
+
+func (m *Waiter) Reset()                    { *m = Waiter{} }
+func (m *Waiter) String() string            { return proto.CompactTextString(m) }
+func (*Waiter) ProtoMessage()               {}
+func (*Waiter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
+
+func (m *Waiter) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Waiter) GetTimeout() *google_protobuf1.Duration {
+	if m != nil {
+		return m.Timeout
+	}
+	return nil
+}
+
+func (m *Waiter) GetFailure() *EndCondition {
+	if m != nil {
+		return m.Failure
+	}
+	return nil
+}
+
+func (m *Waiter) GetSuccess() *EndCondition {
+	if m != nil {
+		return m.Success
+	}
+	return nil
+}
+
+func (m *Waiter) GetCreateTime() *google_protobuf2.Timestamp {
+	if m != nil {
+		return m.CreateTime
+	}
+	return nil
+}
+
+func (m *Waiter) GetDone() bool {
+	if m != nil {
+		return m.Done
+	}
+	return false
+}
+
+func (m *Waiter) GetError() *google_rpc.Status {
+	if m != nil {
+		return m.Error
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*RuntimeConfig)(nil), "google.cloud.runtimeconfig.v1beta1.RuntimeConfig")
+	proto.RegisterType((*Variable)(nil), "google.cloud.runtimeconfig.v1beta1.Variable")
+	proto.RegisterType((*EndCondition)(nil), "google.cloud.runtimeconfig.v1beta1.EndCondition")
+	proto.RegisterType((*EndCondition_Cardinality)(nil), "google.cloud.runtimeconfig.v1beta1.EndCondition.Cardinality")
+	proto.RegisterType((*Waiter)(nil), "google.cloud.runtimeconfig.v1beta1.Waiter")
+	proto.RegisterEnum("google.cloud.runtimeconfig.v1beta1.VariableState", VariableState_name, VariableState_value)
+}
+
+func init() { proto.RegisterFile("google/cloud/runtimeconfig/v1beta1/resources.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 615 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x5d, 0x6f, 0xd3, 0x3c,
+	0x14, 0xc7, 0x9b, 0x3e, 0x7d, 0xd9, 0x4e, 0xb6, 0x47, 0x93, 0x85, 0x46, 0xa8, 0xd0, 0xa8, 0x7a,
+	0x81, 0x2a, 0x2e, 0x12, 0xda, 0x5d, 0xa1, 0x71, 0xd3, 0x97, 0xb0, 0x15, 0x4d, 0x30, 0xb9, 0xdd,
+	0x90, 0xb8, 0x19, 0xae, 0xe3, 0x85, 0x48, 0xa9, 0x1d, 0x39, 0xce, 0x04, 0xdf, 0x86, 0x6b, 0x3e,
+	0x01, 0x9f, 0x86, 0x2b, 0x3e, 0x08, 0xb2, 0xe3, 0x40, 0x0b, 0x13, 0x1b, 0xdc, 0xf9, 0xf8, 0xfc,
+	0xcf, 0xef, 0xbc, 0xf8, 0x24, 0x30, 0x8c, 0x85, 0x88, 0x53, 0x16, 0xd0, 0x54, 0x14, 0x51, 0x20,
+	0x0b, 0xae, 0x92, 0x15, 0xa3, 0x82, 0x5f, 0x25, 0x71, 0x70, 0x3d, 0x58, 0x32, 0x45, 0x06, 0x81,
+	0x64, 0xb9, 0x28, 0x24, 0x65, 0xb9, 0x9f, 0x49, 0xa1, 0x04, 0xea, 0x95, 0x31, 0xbe, 0x89, 0xf1,
+	0x37, 0x62, 0x7c, 0x1b, 0xd3, 0x79, 0x68, 0xb9, 0x24, 0x4b, 0x02, 0xc2, 0xb9, 0x50, 0x44, 0x25,
+	0x82, 0x5b, 0x42, 0xe7, 0xc0, 0x7a, 0x8d, 0xb5, 0x2c, 0xae, 0x82, 0xa8, 0x90, 0x46, 0x60, 0xfd,
+	0x8f, 0x7e, 0xf5, 0xeb, 0x0c, 0xb9, 0x22, 0xab, 0xcc, 0x0a, 0xee, 0x5b, 0x81, 0xcc, 0x68, 0x90,
+	0x2b, 0xa2, 0x0a, 0x4b, 0xee, 0x85, 0xb0, 0x8b, 0xcb, 0x82, 0x26, 0xa6, 0x20, 0x84, 0xa0, 0xc1,
+	0xc9, 0x8a, 0x79, 0x4e, 0xd7, 0xe9, 0x6f, 0x63, 0x73, 0x46, 0x5d, 0x70, 0x23, 0x96, 0x53, 0x99,
+	0x64, 0x3a, 0xa7, 0x57, 0x37, 0xae, 0xf5, 0xab, 0xde, 0x57, 0x07, 0xb6, 0x2e, 0x88, 0x4c, 0xc8,
+	0x32, 0x65, 0x37, 0x22, 0xf6, 0xa1, 0x79, 0x4d, 0xd2, 0x82, 0x99, 0xe0, 0x9d, 0x93, 0x1a, 0x2e,
+	0x4d, 0x74, 0x0f, 0x1a, 0x8a, 0x7d, 0x50, 0x5e, 0x53, 0x6b, 0x4f, 0x6a, 0xd8, 0x58, 0xe8, 0x08,
+	0xdc, 0x22, 0x8b, 0x88, 0x62, 0x97, 0xba, 0x32, 0xef, 0xbf, 0xae, 0xd3, 0x77, 0x87, 0x1d, 0xdf,
+	0xce, 0xb1, 0xea, 0xd2, 0x5f, 0x54, 0x5d, 0x62, 0x28, 0xe5, 0xfa, 0x02, 0x1d, 0x43, 0x53, 0xb7,
+	0xc8, 0xbc, 0x46, 0xd7, 0xe9, 0xff, 0x3f, 0x1c, 0xf8, 0xb7, 0x8f, 0xdf, 0xaf, 0x6a, 0x9f, 0xeb,
+	0x40, 0x5c, 0xc6, 0x8f, 0x01, 0xb6, 0xa8, 0xe0, 0x8a, 0x71, 0x95, 0xf7, 0xbe, 0x38, 0xb0, 0x13,
+	0xf2, 0x68, 0x22, 0x78, 0x94, 0xe8, 0x8e, 0xd1, 0x3b, 0x70, 0x29, 0x91, 0x51, 0xc2, 0x49, 0x9a,
+	0xa8, 0x8f, 0xa6, 0x57, 0x77, 0xf8, 0xfc, 0x2e, 0xb9, 0xd6, 0x31, 0xfe, 0xe4, 0x27, 0xe3, 0xa4,
+	0x86, 0xd7, 0x91, 0x9d, 0x67, 0xe0, 0xae, 0x79, 0xf5, 0x54, 0x33, 0xa2, 0xde, 0x57, 0x53, 0xd5,
+	0x67, 0xb4, 0x0f, 0x2d, 0x5e, 0xac, 0x96, 0x4c, 0x9a, 0xb1, 0x36, 0xb1, 0xb5, 0xc6, 0x2e, 0x6c,
+	0xd3, 0x2a, 0x45, 0xef, 0x5b, 0x1d, 0x5a, 0x6f, 0x48, 0xa2, 0x98, 0xbc, 0xf1, 0x65, 0x0e, 0xa1,
+	0xad, 0x8b, 0x14, 0x85, 0x32, 0x10, 0x77, 0xf8, 0xe0, 0xb7, 0x39, 0x4f, 0xed, 0xb6, 0xe1, 0x4a,
+	0x89, 0x5e, 0x42, 0xfb, 0x8a, 0x24, 0x69, 0x21, 0xab, 0xc7, 0x79, 0xfa, 0xb7, 0x9d, 0xe3, 0x0a,
+	0xa0, 0x59, 0x79, 0x41, 0x29, 0xcb, 0x73, 0xf3, 0x62, 0xff, 0xc4, 0xb2, 0x00, 0xbd, 0x38, 0x54,
+	0xb2, 0x1f, 0x8b, 0xd3, 0xbc, 0x7d, 0x71, 0x4a, 0xb9, 0x59, 0x1c, 0x04, 0x8d, 0x48, 0x70, 0xe6,
+	0xb5, 0xba, 0x4e, 0x7f, 0x0b, 0x9b, 0x33, 0xea, 0x43, 0x93, 0x49, 0x29, 0xa4, 0xd7, 0x36, 0x28,
+	0x54, 0xa1, 0x64, 0x46, 0xfd, 0xb9, 0xf9, 0x90, 0x70, 0x29, 0x78, 0x32, 0x83, 0xdd, 0x8d, 0x2d,
+	0x42, 0x07, 0xd0, 0xb9, 0x18, 0xe1, 0xd9, 0x68, 0x7c, 0x1a, 0x5e, 0xce, 0x17, 0xa3, 0x45, 0x78,
+	0x79, 0xfe, 0x6a, 0x7e, 0x16, 0x4e, 0x66, 0x2f, 0x66, 0xe1, 0x74, 0xaf, 0x86, 0x5c, 0x68, 0x9f,
+	0x9f, 0x4d, 0x47, 0x8b, 0x70, 0xba, 0xe7, 0x68, 0x63, 0x1a, 0x9e, 0x86, 0xda, 0xa8, 0x8f, 0x3f,
+	0x39, 0xf0, 0x98, 0x8a, 0xd5, 0x1d, 0xc6, 0x70, 0xe6, 0xbc, 0x7d, 0x6d, 0x55, 0xb1, 0x48, 0x09,
+	0x8f, 0x7d, 0x21, 0xe3, 0x20, 0x66, 0xdc, 0xb4, 0x1a, 0x94, 0x2e, 0x92, 0x25, 0xf9, 0x9f, 0x7e,
+	0x58, 0x47, 0x1b, 0xb7, 0x9f, 0xeb, 0xbd, 0xe3, 0x92, 0x38, 0x31, 0x79, 0x37, 0x7e, 0x0f, 0xfe,
+	0xc5, 0x60, 0xac, 0x43, 0x96, 0x2d, 0x93, 0xe0, 0xf0, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x61,
+	0xe4, 0x09, 0x63, 0x10, 0x05, 0x00, 0x00,
+}
diff --git a/vendor/google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1/runtimeconfig.pb.go b/vendor/google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1/runtimeconfig.pb.go
new file mode 100644
index 0000000..3597036
--- /dev/null
+++ b/vendor/google.golang.org/genproto/googleapis/cloud/runtimeconfig/v1beta1/runtimeconfig.pb.go
@@ -0,0 +1,1354 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/cloud/runtimeconfig/v1beta1/runtimeconfig.proto
+
+package runtimeconfig
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import _ "google.golang.org/genproto/googleapis/api/annotations"
+import google_longrunning "google.golang.org/genproto/googleapis/longrunning"
+import google_protobuf4 "github.com/golang/protobuf/ptypes/empty"
+import google_protobuf2 "github.com/golang/protobuf/ptypes/timestamp"
+
+import (
+	context "golang.org/x/net/context"
+	grpc "google.golang.org/grpc"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// Request for the `ListConfigs()` method.
+type ListConfigsRequest struct {
+	// The [project ID](https://support.google.com/cloud/answer/6158840?hl=en&ref_topic=6158848)
+	// for this request, in the format `projects/[PROJECT_ID]`.
+	Parent string `protobuf:"bytes,1,opt,name=parent" json:"parent,omitempty"`
+	// Specifies the number of results to return per page. If there are fewer
+	// elements than the specified number, returns all elements.
+	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize" json:"page_size,omitempty"`
+	// Specifies a page token to use. Set `pageToken` to a `nextPageToken`
+	// returned by a previous list request to get the next page of results.
+	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken" json:"page_token,omitempty"`
+}
+
+func (m *ListConfigsRequest) Reset()                    { *m = ListConfigsRequest{} }
+func (m *ListConfigsRequest) String() string            { return proto.CompactTextString(m) }
+func (*ListConfigsRequest) ProtoMessage()               {}
+func (*ListConfigsRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{0} }
+
+func (m *ListConfigsRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *ListConfigsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *ListConfigsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+// `ListConfigs()` returns the following response. The order of returned
+// objects is arbitrary; that is, it is not ordered in any particular way.
+type ListConfigsResponse struct {
+	// A list of the configurations in the project. The order of returned
+	// objects is arbitrary; that is, it is not ordered in any particular way.
+	Configs []*RuntimeConfig `protobuf:"bytes,1,rep,name=configs" json:"configs,omitempty"`
+	// This token allows you to get the next page of results for list requests.
+	// If the number of results is larger than `pageSize`, use the `nextPageToken`
+	// as a value for the query parameter `pageToken` in the next list request.
+	// Subsequent list requests will have their own `nextPageToken` to continue
+	// paging through the results
+	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken" json:"next_page_token,omitempty"`
+}
+
+func (m *ListConfigsResponse) Reset()                    { *m = ListConfigsResponse{} }
+func (m *ListConfigsResponse) String() string            { return proto.CompactTextString(m) }
+func (*ListConfigsResponse) ProtoMessage()               {}
+func (*ListConfigsResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{1} }
+
+func (m *ListConfigsResponse) GetConfigs() []*RuntimeConfig {
+	if m != nil {
+		return m.Configs
+	}
+	return nil
+}
+
+func (m *ListConfigsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// Gets a RuntimeConfig resource.
+type GetConfigRequest struct {
+	// The name of the RuntimeConfig resource to retrieve, in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`
+	Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *GetConfigRequest) Reset()                    { *m = GetConfigRequest{} }
+func (m *GetConfigRequest) String() string            { return proto.CompactTextString(m) }
+func (*GetConfigRequest) ProtoMessage()               {}
+func (*GetConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{2} }
+
+func (m *GetConfigRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// Creates a RuntimeConfig resource.
+type CreateConfigRequest struct {
+	// The [project ID](https://support.google.com/cloud/answer/6158840?hl=en&ref_topic=6158848)
+	// for this request, in the format `projects/[PROJECT_ID]`.
+	Parent string `protobuf:"bytes,1,opt,name=parent" json:"parent,omitempty"`
+	// The RuntimeConfig to create.
+	Config *RuntimeConfig `protobuf:"bytes,2,opt,name=config" json:"config,omitempty"`
+	// An optional but recommended unique `request_id`. If the server
+	// receives two `create()` requests  with the same
+	// `request_id`, then the second request will be ignored and the
+	// first resource created and stored in the backend is returned.
+	// Empty `request_id` fields are ignored.
+	//
+	// It is responsibility of the client to ensure uniqueness of the
+	// `request_id` strings.
+	//
+	// `request_id` strings are limited to 64 characters.
+	RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId" json:"request_id,omitempty"`
+}
+
+func (m *CreateConfigRequest) Reset()                    { *m = CreateConfigRequest{} }
+func (m *CreateConfigRequest) String() string            { return proto.CompactTextString(m) }
+func (*CreateConfigRequest) ProtoMessage()               {}
+func (*CreateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{3} }
+
+func (m *CreateConfigRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *CreateConfigRequest) GetConfig() *RuntimeConfig {
+	if m != nil {
+		return m.Config
+	}
+	return nil
+}
+
+func (m *CreateConfigRequest) GetRequestId() string {
+	if m != nil {
+		return m.RequestId
+	}
+	return ""
+}
+
+// Request message for `UpdateConfig()` method.
+type UpdateConfigRequest struct {
+	// The name of the RuntimeConfig resource to update, in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// The config resource to update.
+	Config *RuntimeConfig `protobuf:"bytes,2,opt,name=config" json:"config,omitempty"`
+}
+
+func (m *UpdateConfigRequest) Reset()                    { *m = UpdateConfigRequest{} }
+func (m *UpdateConfigRequest) String() string            { return proto.CompactTextString(m) }
+func (*UpdateConfigRequest) ProtoMessage()               {}
+func (*UpdateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{4} }
+
+func (m *UpdateConfigRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *UpdateConfigRequest) GetConfig() *RuntimeConfig {
+	if m != nil {
+		return m.Config
+	}
+	return nil
+}
+
+// Request for the `DeleteConfig()` method.
+type DeleteConfigRequest struct {
+	// The RuntimeConfig resource to delete, in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *DeleteConfigRequest) Reset()                    { *m = DeleteConfigRequest{} }
+func (m *DeleteConfigRequest) String() string            { return proto.CompactTextString(m) }
+func (*DeleteConfigRequest) ProtoMessage()               {}
+func (*DeleteConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{5} }
+
+func (m *DeleteConfigRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// Request for the `ListVariables()` method.
+type ListVariablesRequest struct {
+	// The path to the RuntimeConfig resource for which you want to list variables.
+	// The configuration must exist beforehand; the path must by in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`
+	Parent string `protobuf:"bytes,1,opt,name=parent" json:"parent,omitempty"`
+	// Filters variables by matching the specified filter. For example:
+	//
+	// `projects/example-project/config/[CONFIG_NAME]/variables/example-variable`.
+	Filter string `protobuf:"bytes,2,opt,name=filter" json:"filter,omitempty"`
+	// Specifies the number of results to return per page. If there are fewer
+	// elements than the specified number, returns all elements.
+	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize" json:"page_size,omitempty"`
+	// Specifies a page token to use. Set `pageToken` to a `nextPageToken`
+	// returned by a previous list request to get the next page of results.
+	PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken" json:"page_token,omitempty"`
+	// The flag indicates whether the user wants to return values of variables.
+	// If true, then only those variables that user has IAM GetVariable permission
+	// will be returned along with their values.
+	ReturnValues bool `protobuf:"varint,5,opt,name=return_values,json=returnValues" json:"return_values,omitempty"`
+}
+
+func (m *ListVariablesRequest) Reset()                    { *m = ListVariablesRequest{} }
+func (m *ListVariablesRequest) String() string            { return proto.CompactTextString(m) }
+func (*ListVariablesRequest) ProtoMessage()               {}
+func (*ListVariablesRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{6} }
+
+func (m *ListVariablesRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *ListVariablesRequest) GetFilter() string {
+	if m != nil {
+		return m.Filter
+	}
+	return ""
+}
+
+func (m *ListVariablesRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *ListVariablesRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+func (m *ListVariablesRequest) GetReturnValues() bool {
+	if m != nil {
+		return m.ReturnValues
+	}
+	return false
+}
+
+// Response for the `ListVariables()` method.
+type ListVariablesResponse struct {
+	// A list of variables and their values. The order of returned variable
+	// objects is arbitrary.
+	Variables []*Variable `protobuf:"bytes,1,rep,name=variables" json:"variables,omitempty"`
+	// This token allows you to get the next page of results for list requests.
+	// If the number of results is larger than `pageSize`, use the `nextPageToken`
+	// as a value for the query parameter `pageToken` in the next list request.
+	// Subsequent list requests will have their own `nextPageToken` to continue
+	// paging through the results
+	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken" json:"next_page_token,omitempty"`
+}
+
+func (m *ListVariablesResponse) Reset()                    { *m = ListVariablesResponse{} }
+func (m *ListVariablesResponse) String() string            { return proto.CompactTextString(m) }
+func (*ListVariablesResponse) ProtoMessage()               {}
+func (*ListVariablesResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} }
+
+func (m *ListVariablesResponse) GetVariables() []*Variable {
+	if m != nil {
+		return m.Variables
+	}
+	return nil
+}
+
+func (m *ListVariablesResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// Request for the `WatchVariable()` method.
+type WatchVariableRequest struct {
+	// The name of the variable to watch, in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// If specified, checks the current timestamp of the variable and if the
+	// current timestamp is newer than `newerThan` timestamp, the method returns
+	// immediately.
+	//
+	// If not specified or the variable has an older timestamp, the watcher waits
+	// for a the value to change before returning.
+	NewerThan *google_protobuf2.Timestamp `protobuf:"bytes,4,opt,name=newer_than,json=newerThan" json:"newer_than,omitempty"`
+}
+
+func (m *WatchVariableRequest) Reset()                    { *m = WatchVariableRequest{} }
+func (m *WatchVariableRequest) String() string            { return proto.CompactTextString(m) }
+func (*WatchVariableRequest) ProtoMessage()               {}
+func (*WatchVariableRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{8} }
+
+func (m *WatchVariableRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *WatchVariableRequest) GetNewerThan() *google_protobuf2.Timestamp {
+	if m != nil {
+		return m.NewerThan
+	}
+	return nil
+}
+
+// Request for the `GetVariable()` method.
+type GetVariableRequest struct {
+	// The name of the variable to return, in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIBLE_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *GetVariableRequest) Reset()                    { *m = GetVariableRequest{} }
+func (m *GetVariableRequest) String() string            { return proto.CompactTextString(m) }
+func (*GetVariableRequest) ProtoMessage()               {}
+func (*GetVariableRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{9} }
+
+func (m *GetVariableRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// Request for the `CreateVariable()` method.
+type CreateVariableRequest struct {
+	// The path to the RutimeConfig resource that this variable should belong to.
+	// The configuration must exist beforehand; the path must by in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`
+	Parent string `protobuf:"bytes,1,opt,name=parent" json:"parent,omitempty"`
+	// The variable to create.
+	Variable *Variable `protobuf:"bytes,2,opt,name=variable" json:"variable,omitempty"`
+	// An optional but recommended unique `request_id`. If the server
+	// receives two `create()` requests  with the same
+	// `request_id`, then the second request will be ignored and the
+	// first resource created and stored in the backend is returned.
+	// Empty `request_id` fields are ignored.
+	//
+	// It is responsibility of the client to ensure uniqueness of the
+	// `request_id` strings.
+	//
+	// `request_id` strings are limited to 64 characters.
+	RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId" json:"request_id,omitempty"`
+}
+
+func (m *CreateVariableRequest) Reset()                    { *m = CreateVariableRequest{} }
+func (m *CreateVariableRequest) String() string            { return proto.CompactTextString(m) }
+func (*CreateVariableRequest) ProtoMessage()               {}
+func (*CreateVariableRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{10} }
+
+func (m *CreateVariableRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *CreateVariableRequest) GetVariable() *Variable {
+	if m != nil {
+		return m.Variable
+	}
+	return nil
+}
+
+func (m *CreateVariableRequest) GetRequestId() string {
+	if m != nil {
+		return m.RequestId
+	}
+	return ""
+}
+
+// Request for the `UpdateVariable()` method.
+type UpdateVariableRequest struct {
+	// The name of the variable to update, in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// The variable to update.
+	Variable *Variable `protobuf:"bytes,2,opt,name=variable" json:"variable,omitempty"`
+}
+
+func (m *UpdateVariableRequest) Reset()                    { *m = UpdateVariableRequest{} }
+func (m *UpdateVariableRequest) String() string            { return proto.CompactTextString(m) }
+func (*UpdateVariableRequest) ProtoMessage()               {}
+func (*UpdateVariableRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{11} }
+
+func (m *UpdateVariableRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *UpdateVariableRequest) GetVariable() *Variable {
+	if m != nil {
+		return m.Variable
+	}
+	return nil
+}
+
+// Request for the `DeleteVariable()` method.
+type DeleteVariableRequest struct {
+	// The name of the variable to delete, in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]/variables/[VARIABLE_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// Set to `true` to recursively delete multiple variables with the same
+	// prefix.
+	Recursive bool `protobuf:"varint,2,opt,name=recursive" json:"recursive,omitempty"`
+}
+
+func (m *DeleteVariableRequest) Reset()                    { *m = DeleteVariableRequest{} }
+func (m *DeleteVariableRequest) String() string            { return proto.CompactTextString(m) }
+func (*DeleteVariableRequest) ProtoMessage()               {}
+func (*DeleteVariableRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{12} }
+
+func (m *DeleteVariableRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *DeleteVariableRequest) GetRecursive() bool {
+	if m != nil {
+		return m.Recursive
+	}
+	return false
+}
+
+// Request for the `ListWaiters()` method.
+type ListWaitersRequest struct {
+	// The path to the configuration for which you want to get a list of waiters.
+	// The configuration must exist beforehand; the path must by in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`
+	Parent string `protobuf:"bytes,1,opt,name=parent" json:"parent,omitempty"`
+	// Specifies the number of results to return per page. If there are fewer
+	// elements than the specified number, returns all elements.
+	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize" json:"page_size,omitempty"`
+	// Specifies a page token to use. Set `pageToken` to a `nextPageToken`
+	// returned by a previous list request to get the next page of results.
+	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken" json:"page_token,omitempty"`
+}
+
+func (m *ListWaitersRequest) Reset()                    { *m = ListWaitersRequest{} }
+func (m *ListWaitersRequest) String() string            { return proto.CompactTextString(m) }
+func (*ListWaitersRequest) ProtoMessage()               {}
+func (*ListWaitersRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{13} }
+
+func (m *ListWaitersRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *ListWaitersRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *ListWaitersRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+// Response for the `ListWaiters()` method.
+// Order of returned waiter objects is arbitrary.
+type ListWaitersResponse struct {
+	// Found waiters in the project.
+	Waiters []*Waiter `protobuf:"bytes,1,rep,name=waiters" json:"waiters,omitempty"`
+	// This token allows you to get the next page of results for list requests.
+	// If the number of results is larger than `pageSize`, use the `nextPageToken`
+	// as a value for the query parameter `pageToken` in the next list request.
+	// Subsequent list requests will have their own `nextPageToken` to continue
+	// paging through the results
+	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken" json:"next_page_token,omitempty"`
+}
+
+func (m *ListWaitersResponse) Reset()                    { *m = ListWaitersResponse{} }
+func (m *ListWaitersResponse) String() string            { return proto.CompactTextString(m) }
+func (*ListWaitersResponse) ProtoMessage()               {}
+func (*ListWaitersResponse) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{14} }
+
+func (m *ListWaitersResponse) GetWaiters() []*Waiter {
+	if m != nil {
+		return m.Waiters
+	}
+	return nil
+}
+
+func (m *ListWaitersResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// Request for the `GetWaiter()` method.
+type GetWaiterRequest struct {
+	// The fully-qualified name of the Waiter resource object to retrieve, in the
+	// format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *GetWaiterRequest) Reset()                    { *m = GetWaiterRequest{} }
+func (m *GetWaiterRequest) String() string            { return proto.CompactTextString(m) }
+func (*GetWaiterRequest) ProtoMessage()               {}
+func (*GetWaiterRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{15} }
+
+func (m *GetWaiterRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// Request message for `CreateWaiter()` method.
+type CreateWaiterRequest struct {
+	// The path to the configuration that will own the waiter.
+	// The configuration must exist beforehand; the path must by in the format:
+	//
+	// `projects/[PROJECT_ID]/configs/[CONFIG_NAME]`.
+	Parent string `protobuf:"bytes,1,opt,name=parent" json:"parent,omitempty"`
+	// The Waiter resource to create.
+	Waiter *Waiter `protobuf:"bytes,2,opt,name=waiter" json:"waiter,omitempty"`
+	// An optional but recommended unique `request_id`. If the server
+	// receives two `create()` requests  with the same
+	// `request_id`, then the second request will be ignored and the
+	// first resource created and stored in the backend is returned.
+	// Empty `request_id` fields are ignored.
+	//
+	// It is responsibility of the client to ensure uniqueness of the
+	// `request_id` strings.
+	//
+	// `request_id` strings are limited to 64 characters.
+	RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId" json:"request_id,omitempty"`
+}
+
+func (m *CreateWaiterRequest) Reset()                    { *m = CreateWaiterRequest{} }
+func (m *CreateWaiterRequest) String() string            { return proto.CompactTextString(m) }
+func (*CreateWaiterRequest) ProtoMessage()               {}
+func (*CreateWaiterRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{16} }
+
+func (m *CreateWaiterRequest) GetParent() string {
+	if m != nil {
+		return m.Parent
+	}
+	return ""
+}
+
+func (m *CreateWaiterRequest) GetWaiter() *Waiter {
+	if m != nil {
+		return m.Waiter
+	}
+	return nil
+}
+
+func (m *CreateWaiterRequest) GetRequestId() string {
+	if m != nil {
+		return m.RequestId
+	}
+	return ""
+}
+
+// Request for the `DeleteWaiter()` method.
+type DeleteWaiterRequest struct {
+	// The Waiter resource to delete, in the format:
+	//
+	//  `projects/[PROJECT_ID]/configs/[CONFIG_NAME]/waiters/[WAITER_NAME]`
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *DeleteWaiterRequest) Reset()                    { *m = DeleteWaiterRequest{} }
+func (m *DeleteWaiterRequest) String() string            { return proto.CompactTextString(m) }
+func (*DeleteWaiterRequest) ProtoMessage()               {}
+func (*DeleteWaiterRequest) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{17} }
+
+func (m *DeleteWaiterRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*ListConfigsRequest)(nil), "google.cloud.runtimeconfig.v1beta1.ListConfigsRequest")
+	proto.RegisterType((*ListConfigsResponse)(nil), "google.cloud.runtimeconfig.v1beta1.ListConfigsResponse")
+	proto.RegisterType((*GetConfigRequest)(nil), "google.cloud.runtimeconfig.v1beta1.GetConfigRequest")
+	proto.RegisterType((*CreateConfigRequest)(nil), "google.cloud.runtimeconfig.v1beta1.CreateConfigRequest")
+	proto.RegisterType((*UpdateConfigRequest)(nil), "google.cloud.runtimeconfig.v1beta1.UpdateConfigRequest")
+	proto.RegisterType((*DeleteConfigRequest)(nil), "google.cloud.runtimeconfig.v1beta1.DeleteConfigRequest")
+	proto.RegisterType((*ListVariablesRequest)(nil), "google.cloud.runtimeconfig.v1beta1.ListVariablesRequest")
+	proto.RegisterType((*ListVariablesResponse)(nil), "google.cloud.runtimeconfig.v1beta1.ListVariablesResponse")
+	proto.RegisterType((*WatchVariableRequest)(nil), "google.cloud.runtimeconfig.v1beta1.WatchVariableRequest")
+	proto.RegisterType((*GetVariableRequest)(nil), "google.cloud.runtimeconfig.v1beta1.GetVariableRequest")
+	proto.RegisterType((*CreateVariableRequest)(nil), "google.cloud.runtimeconfig.v1beta1.CreateVariableRequest")
+	proto.RegisterType((*UpdateVariableRequest)(nil), "google.cloud.runtimeconfig.v1beta1.UpdateVariableRequest")
+	proto.RegisterType((*DeleteVariableRequest)(nil), "google.cloud.runtimeconfig.v1beta1.DeleteVariableRequest")
+	proto.RegisterType((*ListWaitersRequest)(nil), "google.cloud.runtimeconfig.v1beta1.ListWaitersRequest")
+	proto.RegisterType((*ListWaitersResponse)(nil), "google.cloud.runtimeconfig.v1beta1.ListWaitersResponse")
+	proto.RegisterType((*GetWaiterRequest)(nil), "google.cloud.runtimeconfig.v1beta1.GetWaiterRequest")
+	proto.RegisterType((*CreateWaiterRequest)(nil), "google.cloud.runtimeconfig.v1beta1.CreateWaiterRequest")
+	proto.RegisterType((*DeleteWaiterRequest)(nil), "google.cloud.runtimeconfig.v1beta1.DeleteWaiterRequest")
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// Client API for RuntimeConfigManager service
+
+type RuntimeConfigManagerClient interface {
+	// Lists all the RuntimeConfig resources within project.
+	ListConfigs(ctx context.Context, in *ListConfigsRequest, opts ...grpc.CallOption) (*ListConfigsResponse, error)
+	// Gets information about a RuntimeConfig resource.
+	GetConfig(ctx context.Context, in *GetConfigRequest, opts ...grpc.CallOption) (*RuntimeConfig, error)
+	// Creates a new RuntimeConfig resource. The configuration name must be
+	// unique within project.
+	CreateConfig(ctx context.Context, in *CreateConfigRequest, opts ...grpc.CallOption) (*RuntimeConfig, error)
+	// Updates a RuntimeConfig resource. The configuration must exist beforehand.
+	UpdateConfig(ctx context.Context, in *UpdateConfigRequest, opts ...grpc.CallOption) (*RuntimeConfig, error)
+	// Deletes a RuntimeConfig resource.
+	DeleteConfig(ctx context.Context, in *DeleteConfigRequest, opts ...grpc.CallOption) (*google_protobuf4.Empty, error)
+	// Lists variables within given a configuration, matching any provided filters.
+	// This only lists variable names, not the values, unless `return_values` is
+	// true, in which case only variables that user has IAM permission to
+	// GetVariable will be returned.
+	ListVariables(ctx context.Context, in *ListVariablesRequest, opts ...grpc.CallOption) (*ListVariablesResponse, error)
+	// Gets information about a single variable.
+	GetVariable(ctx context.Context, in *GetVariableRequest, opts ...grpc.CallOption) (*Variable, error)
+	// Watches a specific variable and waits for a change in the variable's value.
+	// When there is a change, this method returns the new value or times out.
+	//
+	// If a variable is deleted while being watched, the `variableState` state is
+	// set to `DELETED` and the method returns the last known variable `value`.
+	//
+	// If you set the deadline for watching to a larger value than internal timeout
+	// (60 seconds), the current variable value is returned and the `variableState`
+	// will be `VARIABLE_STATE_UNSPECIFIED`.
+	//
+	// To learn more about creating a watcher, read the
+	// [Watching a Variable for Changes](/deployment-manager/runtime-configurator/watching-a-variable)
+	// documentation.
+	WatchVariable(ctx context.Context, in *WatchVariableRequest, opts ...grpc.CallOption) (*Variable, error)
+	// Creates a variable within the given configuration. You cannot create
+	// a variable with a name that is a prefix of an existing variable name, or a
+	// name that has an existing variable name as a prefix.
+	//
+	// To learn more about creating a variable, read the
+	// [Setting and Getting Data](/deployment-manager/runtime-configurator/set-and-get-variables)
+	// documentation.
+	CreateVariable(ctx context.Context, in *CreateVariableRequest, opts ...grpc.CallOption) (*Variable, error)
+	// Updates an existing variable with a new value.
+	UpdateVariable(ctx context.Context, in *UpdateVariableRequest, opts ...grpc.CallOption) (*Variable, error)
+	// Deletes a variable or multiple variables.
+	//
+	// If you specify a variable name, then that variable is deleted. If you
+	// specify a prefix and `recursive` is true, then all variables with that
+	// prefix are deleted. You must set a `recursive` to true if you delete
+	// variables by prefix.
+	DeleteVariable(ctx context.Context, in *DeleteVariableRequest, opts ...grpc.CallOption) (*google_protobuf4.Empty, error)
+	// List waiters within the given configuration.
+	ListWaiters(ctx context.Context, in *ListWaitersRequest, opts ...grpc.CallOption) (*ListWaitersResponse, error)
+	// Gets information about a single waiter.
+	GetWaiter(ctx context.Context, in *GetWaiterRequest, opts ...grpc.CallOption) (*Waiter, error)
+	// Creates a Waiter resource. This operation returns a long-running Operation
+	// resource which can be polled for completion. However, a waiter with the
+	// given name will exist (and can be retrieved) prior to the operation
+	// completing. If the operation fails, the failed Waiter resource will
+	// still exist and must be deleted prior to subsequent creation attempts.
+	CreateWaiter(ctx context.Context, in *CreateWaiterRequest, opts ...grpc.CallOption) (*google_longrunning.Operation, error)
+	// Deletes the waiter with the specified name.
+	DeleteWaiter(ctx context.Context, in *DeleteWaiterRequest, opts ...grpc.CallOption) (*google_protobuf4.Empty, error)
+}
+
+type runtimeConfigManagerClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewRuntimeConfigManagerClient(cc *grpc.ClientConn) RuntimeConfigManagerClient {
+	return &runtimeConfigManagerClient{cc}
+}
+
+func (c *runtimeConfigManagerClient) ListConfigs(ctx context.Context, in *ListConfigsRequest, opts ...grpc.CallOption) (*ListConfigsResponse, error) {
+	out := new(ListConfigsResponse)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/ListConfigs", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) GetConfig(ctx context.Context, in *GetConfigRequest, opts ...grpc.CallOption) (*RuntimeConfig, error) {
+	out := new(RuntimeConfig)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/GetConfig", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) CreateConfig(ctx context.Context, in *CreateConfigRequest, opts ...grpc.CallOption) (*RuntimeConfig, error) {
+	out := new(RuntimeConfig)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/CreateConfig", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) UpdateConfig(ctx context.Context, in *UpdateConfigRequest, opts ...grpc.CallOption) (*RuntimeConfig, error) {
+	out := new(RuntimeConfig)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/UpdateConfig", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) DeleteConfig(ctx context.Context, in *DeleteConfigRequest, opts ...grpc.CallOption) (*google_protobuf4.Empty, error) {
+	out := new(google_protobuf4.Empty)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/DeleteConfig", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) ListVariables(ctx context.Context, in *ListVariablesRequest, opts ...grpc.CallOption) (*ListVariablesResponse, error) {
+	out := new(ListVariablesResponse)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/ListVariables", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) GetVariable(ctx context.Context, in *GetVariableRequest, opts ...grpc.CallOption) (*Variable, error) {
+	out := new(Variable)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/GetVariable", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) WatchVariable(ctx context.Context, in *WatchVariableRequest, opts ...grpc.CallOption) (*Variable, error) {
+	out := new(Variable)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/WatchVariable", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) CreateVariable(ctx context.Context, in *CreateVariableRequest, opts ...grpc.CallOption) (*Variable, error) {
+	out := new(Variable)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/CreateVariable", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) UpdateVariable(ctx context.Context, in *UpdateVariableRequest, opts ...grpc.CallOption) (*Variable, error) {
+	out := new(Variable)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/UpdateVariable", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) DeleteVariable(ctx context.Context, in *DeleteVariableRequest, opts ...grpc.CallOption) (*google_protobuf4.Empty, error) {
+	out := new(google_protobuf4.Empty)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/DeleteVariable", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) ListWaiters(ctx context.Context, in *ListWaitersRequest, opts ...grpc.CallOption) (*ListWaitersResponse, error) {
+	out := new(ListWaitersResponse)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/ListWaiters", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) GetWaiter(ctx context.Context, in *GetWaiterRequest, opts ...grpc.CallOption) (*Waiter, error) {
+	out := new(Waiter)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/GetWaiter", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) CreateWaiter(ctx context.Context, in *CreateWaiterRequest, opts ...grpc.CallOption) (*google_longrunning.Operation, error) {
+	out := new(google_longrunning.Operation)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/CreateWaiter", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *runtimeConfigManagerClient) DeleteWaiter(ctx context.Context, in *DeleteWaiterRequest, opts ...grpc.CallOption) (*google_protobuf4.Empty, error) {
+	out := new(google_protobuf4.Empty)
+	err := grpc.Invoke(ctx, "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/DeleteWaiter", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Server API for RuntimeConfigManager service
+
+type RuntimeConfigManagerServer interface {
+	// Lists all the RuntimeConfig resources within project.
+	ListConfigs(context.Context, *ListConfigsRequest) (*ListConfigsResponse, error)
+	// Gets information about a RuntimeConfig resource.
+	GetConfig(context.Context, *GetConfigRequest) (*RuntimeConfig, error)
+	// Creates a new RuntimeConfig resource. The configuration name must be
+	// unique within project.
+	CreateConfig(context.Context, *CreateConfigRequest) (*RuntimeConfig, error)
+	// Updates a RuntimeConfig resource. The configuration must exist beforehand.
+	UpdateConfig(context.Context, *UpdateConfigRequest) (*RuntimeConfig, error)
+	// Deletes a RuntimeConfig resource.
+	DeleteConfig(context.Context, *DeleteConfigRequest) (*google_protobuf4.Empty, error)
+	// Lists variables within given a configuration, matching any provided filters.
+	// This only lists variable names, not the values, unless `return_values` is
+	// true, in which case only variables that user has IAM permission to
+	// GetVariable will be returned.
+	ListVariables(context.Context, *ListVariablesRequest) (*ListVariablesResponse, error)
+	// Gets information about a single variable.
+	GetVariable(context.Context, *GetVariableRequest) (*Variable, error)
+	// Watches a specific variable and waits for a change in the variable's value.
+	// When there is a change, this method returns the new value or times out.
+	//
+	// If a variable is deleted while being watched, the `variableState` state is
+	// set to `DELETED` and the method returns the last known variable `value`.
+	//
+	// If you set the deadline for watching to a larger value than internal timeout
+	// (60 seconds), the current variable value is returned and the `variableState`
+	// will be `VARIABLE_STATE_UNSPECIFIED`.
+	//
+	// To learn more about creating a watcher, read the
+	// [Watching a Variable for Changes](/deployment-manager/runtime-configurator/watching-a-variable)
+	// documentation.
+	WatchVariable(context.Context, *WatchVariableRequest) (*Variable, error)
+	// Creates a variable within the given configuration. You cannot create
+	// a variable with a name that is a prefix of an existing variable name, or a
+	// name that has an existing variable name as a prefix.
+	//
+	// To learn more about creating a variable, read the
+	// [Setting and Getting Data](/deployment-manager/runtime-configurator/set-and-get-variables)
+	// documentation.
+	CreateVariable(context.Context, *CreateVariableRequest) (*Variable, error)
+	// Updates an existing variable with a new value.
+	UpdateVariable(context.Context, *UpdateVariableRequest) (*Variable, error)
+	// Deletes a variable or multiple variables.
+	//
+	// If you specify a variable name, then that variable is deleted. If you
+	// specify a prefix and `recursive` is true, then all variables with that
+	// prefix are deleted. You must set a `recursive` to true if you delete
+	// variables by prefix.
+	DeleteVariable(context.Context, *DeleteVariableRequest) (*google_protobuf4.Empty, error)
+	// List waiters within the given configuration.
+	ListWaiters(context.Context, *ListWaitersRequest) (*ListWaitersResponse, error)
+	// Gets information about a single waiter.
+	GetWaiter(context.Context, *GetWaiterRequest) (*Waiter, error)
+	// Creates a Waiter resource. This operation returns a long-running Operation
+	// resource which can be polled for completion. However, a waiter with the
+	// given name will exist (and can be retrieved) prior to the operation
+	// completing. If the operation fails, the failed Waiter resource will
+	// still exist and must be deleted prior to subsequent creation attempts.
+	CreateWaiter(context.Context, *CreateWaiterRequest) (*google_longrunning.Operation, error)
+	// Deletes the waiter with the specified name.
+	DeleteWaiter(context.Context, *DeleteWaiterRequest) (*google_protobuf4.Empty, error)
+}
+
+func RegisterRuntimeConfigManagerServer(s *grpc.Server, srv RuntimeConfigManagerServer) {
+	s.RegisterService(&_RuntimeConfigManager_serviceDesc, srv)
+}
+
+func _RuntimeConfigManager_ListConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListConfigsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).ListConfigs(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/ListConfigs",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).ListConfigs(ctx, req.(*ListConfigsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_GetConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).GetConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/GetConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).GetConfig(ctx, req.(*GetConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_CreateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).CreateConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/CreateConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).CreateConfig(ctx, req.(*CreateConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_UpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UpdateConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).UpdateConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/UpdateConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).UpdateConfig(ctx, req.(*UpdateConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_DeleteConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteConfigRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).DeleteConfig(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/DeleteConfig",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).DeleteConfig(ctx, req.(*DeleteConfigRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_ListVariables_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListVariablesRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).ListVariables(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/ListVariables",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).ListVariables(ctx, req.(*ListVariablesRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_GetVariable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetVariableRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).GetVariable(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/GetVariable",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).GetVariable(ctx, req.(*GetVariableRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_WatchVariable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(WatchVariableRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).WatchVariable(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/WatchVariable",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).WatchVariable(ctx, req.(*WatchVariableRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_CreateVariable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateVariableRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).CreateVariable(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/CreateVariable",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).CreateVariable(ctx, req.(*CreateVariableRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_UpdateVariable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UpdateVariableRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).UpdateVariable(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/UpdateVariable",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).UpdateVariable(ctx, req.(*UpdateVariableRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_DeleteVariable_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteVariableRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).DeleteVariable(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/DeleteVariable",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).DeleteVariable(ctx, req.(*DeleteVariableRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_ListWaiters_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListWaitersRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).ListWaiters(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/ListWaiters",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).ListWaiters(ctx, req.(*ListWaitersRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_GetWaiter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetWaiterRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).GetWaiter(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/GetWaiter",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).GetWaiter(ctx, req.(*GetWaiterRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_CreateWaiter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CreateWaiterRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).CreateWaiter(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/CreateWaiter",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).CreateWaiter(ctx, req.(*CreateWaiterRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _RuntimeConfigManager_DeleteWaiter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteWaiterRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(RuntimeConfigManagerServer).DeleteWaiter(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager/DeleteWaiter",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(RuntimeConfigManagerServer).DeleteWaiter(ctx, req.(*DeleteWaiterRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _RuntimeConfigManager_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.cloud.runtimeconfig.v1beta1.RuntimeConfigManager",
+	HandlerType: (*RuntimeConfigManagerServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListConfigs",
+			Handler:    _RuntimeConfigManager_ListConfigs_Handler,
+		},
+		{
+			MethodName: "GetConfig",
+			Handler:    _RuntimeConfigManager_GetConfig_Handler,
+		},
+		{
+			MethodName: "CreateConfig",
+			Handler:    _RuntimeConfigManager_CreateConfig_Handler,
+		},
+		{
+			MethodName: "UpdateConfig",
+			Handler:    _RuntimeConfigManager_UpdateConfig_Handler,
+		},
+		{
+			MethodName: "DeleteConfig",
+			Handler:    _RuntimeConfigManager_DeleteConfig_Handler,
+		},
+		{
+			MethodName: "ListVariables",
+			Handler:    _RuntimeConfigManager_ListVariables_Handler,
+		},
+		{
+			MethodName: "GetVariable",
+			Handler:    _RuntimeConfigManager_GetVariable_Handler,
+		},
+		{
+			MethodName: "WatchVariable",
+			Handler:    _RuntimeConfigManager_WatchVariable_Handler,
+		},
+		{
+			MethodName: "CreateVariable",
+			Handler:    _RuntimeConfigManager_CreateVariable_Handler,
+		},
+		{
+			MethodName: "UpdateVariable",
+			Handler:    _RuntimeConfigManager_UpdateVariable_Handler,
+		},
+		{
+			MethodName: "DeleteVariable",
+			Handler:    _RuntimeConfigManager_DeleteVariable_Handler,
+		},
+		{
+			MethodName: "ListWaiters",
+			Handler:    _RuntimeConfigManager_ListWaiters_Handler,
+		},
+		{
+			MethodName: "GetWaiter",
+			Handler:    _RuntimeConfigManager_GetWaiter_Handler,
+		},
+		{
+			MethodName: "CreateWaiter",
+			Handler:    _RuntimeConfigManager_CreateWaiter_Handler,
+		},
+		{
+			MethodName: "DeleteWaiter",
+			Handler:    _RuntimeConfigManager_DeleteWaiter_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/cloud/runtimeconfig/v1beta1/runtimeconfig.proto",
+}
+
+func init() {
+	proto.RegisterFile("google/cloud/runtimeconfig/v1beta1/runtimeconfig.proto", fileDescriptor1)
+}
+
+var fileDescriptor1 = []byte{
+	// 1144 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x98, 0x5b, 0x6f, 0xdc, 0x44,
+	0x14, 0xc7, 0x35, 0x69, 0x9b, 0x66, 0x4f, 0x2e, 0xa0, 0xc9, 0x45, 0x91, 0xdb, 0x8a, 0xc8, 0x45,
+	0x51, 0x58, 0x55, 0x76, 0x93, 0x56, 0x69, 0x12, 0x28, 0x0f, 0x49, 0x51, 0x08, 0x17, 0xb5, 0x32,
+	0x21, 0x95, 0x78, 0x59, 0x4d, 0x36, 0x13, 0xc7, 0xb0, 0x3b, 0x36, 0xf6, 0x38, 0x81, 0xa2, 0xbc,
+	0xc0, 0x1b, 0x08, 0x09, 0x89, 0x87, 0xf2, 0x84, 0x10, 0x12, 0x20, 0x21, 0x84, 0x78, 0xe2, 0x05,
+	0xd1, 0x2f, 0x81, 0xc4, 0x27, 0xe0, 0x83, 0x20, 0xcf, 0xc5, 0x6b, 0x6f, 0xf6, 0x32, 0x0e, 0xe1,
+	0x2d, 0x39, 0x9e, 0x73, 0xce, 0x6f, 0xce, 0x9c, 0x99, 0xff, 0xd1, 0xc2, 0xaa, 0x1f, 0x86, 0x7e,
+	0x8b, 0xba, 0xcd, 0x56, 0x98, 0x1e, 0xb8, 0x71, 0xca, 0x78, 0xd0, 0xa6, 0xcd, 0x90, 0x1d, 0x06,
+	0xbe, 0x7b, 0xbc, 0xbc, 0x4f, 0x39, 0x59, 0x2e, 0x5b, 0x9d, 0x28, 0x0e, 0x79, 0x88, 0x6d, 0xe9,
+	0xe7, 0x08, 0x3f, 0xa7, 0xbc, 0x42, 0xf9, 0x59, 0xd7, 0x55, 0x6c, 0x12, 0x05, 0x2e, 0x61, 0x2c,
+	0xe4, 0x84, 0x07, 0x21, 0x4b, 0x64, 0x04, 0x6b, 0xc5, 0x24, 0x33, 0x4d, 0xc2, 0x34, 0x6e, 0x52,
+	0xed, 0x73, 0x53, 0xf9, 0xb4, 0x42, 0xe6, 0xc7, 0x29, 0x63, 0x01, 0xf3, 0xdd, 0x30, 0xa2, 0x71,
+	0x29, 0xf0, 0x35, 0xb5, 0x48, 0xfc, 0xb7, 0x9f, 0x1e, 0xba, 0xb4, 0x1d, 0xf1, 0x8f, 0xd5, 0xc7,
+	0x17, 0xba, 0x3f, 0x66, 0x59, 0x13, 0x4e, 0xda, 0x91, 0x5c, 0x60, 0x1f, 0x01, 0x7e, 0x2b, 0x48,
+	0xf8, 0x96, 0x00, 0x49, 0x3c, 0xfa, 0x61, 0x4a, 0x13, 0x8e, 0xe7, 0x60, 0x34, 0x22, 0x31, 0x65,
+	0x7c, 0x1e, 0x2d, 0xa0, 0xa5, 0x9a, 0xa7, 0xfe, 0xc3, 0xd7, 0xa0, 0x16, 0x11, 0x9f, 0x36, 0x92,
+	0xe0, 0x09, 0x9d, 0x1f, 0x59, 0x40, 0x4b, 0x57, 0xbc, 0xb1, 0xcc, 0xf0, 0x4e, 0xf0, 0x84, 0xe2,
+	0x1b, 0x00, 0xe2, 0x23, 0x0f, 0x3f, 0xa0, 0x6c, 0xfe, 0x92, 0x70, 0x14, 0xcb, 0x77, 0x33, 0x83,
+	0xfd, 0x39, 0x82, 0xe9, 0x52, 0xaa, 0x24, 0x0a, 0x59, 0x42, 0xf1, 0x9b, 0x70, 0x55, 0x96, 0x21,
+	0x99, 0x47, 0x0b, 0x97, 0x96, 0xc6, 0x57, 0x96, 0x9d, 0xe1, 0xc5, 0x76, 0x3c, 0x69, 0x95, 0xc1,
+	0x3c, 0x1d, 0x01, 0x2f, 0xc2, 0x73, 0x8c, 0x7e, 0xc4, 0x1b, 0x05, 0x90, 0x11, 0x01, 0x32, 0x99,
+	0x99, 0x1f, 0xe5, 0x30, 0x8b, 0xf0, 0xfc, 0x36, 0x55, 0x28, 0x7a, 0xd3, 0x18, 0x2e, 0x33, 0xd2,
+	0xa6, 0xca, 0x41, 0xfc, 0x6d, 0x3f, 0x45, 0x30, 0xbd, 0x15, 0x53, 0xc2, 0x69, 0x79, 0x6d, 0xbf,
+	0x02, 0xed, 0xc0, 0xa8, 0x44, 0x11, 0x51, 0xce, 0xb5, 0x17, 0x15, 0x20, 0x2b, 0x67, 0x2c, 0xb3,
+	0x35, 0x82, 0x03, 0x5d, 0x4e, 0x65, 0xd9, 0x39, 0xb0, 0x39, 0x4c, 0xbf, 0x1b, 0x1d, 0x9c, 0x01,
+	0xd3, 0x9b, 0x40, 0x9d, 0x4d, 0x5c, 0x20, 0x94, 0xfd, 0x12, 0x4c, 0x3f, 0xa0, 0x2d, 0x6a, 0x90,
+	0xd5, 0xfe, 0x09, 0xc1, 0x4c, 0x76, 0xde, 0x7b, 0x24, 0x0e, 0xc8, 0x7e, 0x8b, 0x0e, 0x6d, 0xae,
+	0x39, 0x18, 0x3d, 0x0c, 0x5a, 0x9c, 0xc6, 0xea, 0x04, 0xd4, 0x7f, 0xe5, 0xa6, 0xbb, 0x34, 0xb0,
+	0xe9, 0x2e, 0x77, 0x35, 0x1d, 0xbe, 0x09, 0x93, 0x31, 0xe5, 0x69, 0xcc, 0x1a, 0xc7, 0xa4, 0x95,
+	0xd2, 0x64, 0xfe, 0xca, 0x02, 0x5a, 0x1a, 0xf3, 0x26, 0xa4, 0x71, 0x4f, 0xd8, 0xec, 0x2f, 0x10,
+	0xcc, 0x76, 0x91, 0xaa, 0xde, 0x7c, 0x03, 0x6a, 0xc7, 0xda, 0xa8, 0xba, 0xf3, 0x96, 0x49, 0xf1,
+	0x74, 0x24, 0xaf, 0xe3, 0x6e, 0xdc, 0x9a, 0x14, 0x66, 0x1e, 0x13, 0xde, 0x3c, 0xca, 0x63, 0x0c,
+	0x38, 0xd9, 0x75, 0x00, 0x46, 0x4f, 0x68, 0xdc, 0xe0, 0x47, 0x44, 0xee, 0x7e, 0x7c, 0xc5, 0xd2,
+	0x80, 0xfa, 0xce, 0x3b, 0xbb, 0xfa, 0xce, 0x7b, 0x35, 0xb1, 0x7a, 0xf7, 0x88, 0x30, 0x7b, 0x09,
+	0xf0, 0x36, 0xe5, 0x06, 0x49, 0xec, 0x6f, 0x10, 0xcc, 0xca, 0x3b, 0xd0, 0xbd, 0xba, 0xdf, 0x49,
+	0xbe, 0x0e, 0x63, 0x7a, 0xdf, 0xaa, 0xe5, 0xaa, 0x55, 0x2d, 0xf7, 0x1e, 0x76, 0x09, 0x52, 0x98,
+	0x95, 0x97, 0xc0, 0xa4, 0x58, 0x17, 0x46, 0x65, 0xef, 0xc0, 0xac, 0xbc, 0x05, 0x26, 0x69, 0xaf,
+	0x43, 0x2d, 0xa6, 0xcd, 0x34, 0x4e, 0x82, 0x63, 0x99, 0x77, 0xcc, 0xeb, 0x18, 0xf4, 0xfb, 0xfb,
+	0x98, 0x04, 0x9c, 0xc6, 0xff, 0xeb, 0xfb, 0xfb, 0x99, 0x7a, 0x7f, 0xf3, 0x54, 0xaa, 0xc7, 0x1f,
+	0xc0, 0xd5, 0x13, 0x69, 0x52, 0x1d, 0x5e, 0x37, 0xa9, 0x8a, 0x8c, 0xe2, 0x69, 0xd7, 0x8a, 0x0f,
+	0xaf, 0xf2, 0x1e, 0xd0, 0x74, 0x5f, 0xe5, 0x0f, 0x6f, 0x79, 0x6d, 0xbf, 0xca, 0x6c, 0xc2, 0xa8,
+	0x44, 0x51, 0x47, 0x5b, 0x65, 0x13, 0xca, 0x73, 0x58, 0xb3, 0xe5, 0x6f, 0xdf, 0x50, 0xfa, 0x95,
+	0xbf, 0x67, 0x60, 0xa6, 0xf4, 0x80, 0xbe, 0x4d, 0x18, 0xf1, 0x69, 0x8c, 0x7f, 0x41, 0x30, 0x5e,
+	0x10, 0x41, 0xbc, 0x6a, 0x82, 0x79, 0x56, 0xa0, 0xad, 0x7b, 0x95, 0xfd, 0xe4, 0x69, 0xdb, 0xb7,
+	0x3e, 0xfd, 0xeb, 0x9f, 0xaf, 0x47, 0x16, 0xf1, 0x8b, 0xf9, 0xd0, 0xf1, 0x89, 0xac, 0xe0, 0xfd,
+	0x28, 0x0e, 0xdf, 0xa7, 0x4d, 0x9e, 0xb8, 0xf5, 0x53, 0x57, 0xcb, 0xe9, 0xf7, 0x08, 0x6a, 0xb9,
+	0x4e, 0xe2, 0xbb, 0x26, 0x49, 0xbb, 0x65, 0xd5, 0xaa, 0xae, 0x36, 0xbd, 0x20, 0xb3, 0xb2, 0x16,
+	0x10, 0x35, 0xa1, 0x5b, 0x3f, 0xc5, 0xbf, 0x21, 0x98, 0x28, 0x6a, 0x34, 0x36, 0x2a, 0x4e, 0x0f,
+	0x55, 0x3f, 0x0f, 0xea, 0x5d, 0x81, 0xea, 0xd8, 0x46, 0xf5, 0xdc, 0xd0, 0xda, 0x9e, 0x21, 0x17,
+	0xd5, 0xdb, 0x0c, 0xb9, 0x87, 0xde, 0xff, 0x07, 0x64, 0xcb, 0xa8, 0xba, 0x39, 0xf2, 0x97, 0x08,
+	0x26, 0x8a, 0xd2, 0x6f, 0x86, 0xdc, 0x63, 0x58, 0xb0, 0xe6, 0xce, 0x08, 0xd4, 0x6b, 0xd9, 0xc4,
+	0xaa, 0x4f, 0xbd, 0x6e, 0x76, 0xea, 0xcf, 0x10, 0x4c, 0x96, 0x44, 0x1b, 0xaf, 0x99, 0xde, 0x89,
+	0xee, 0x89, 0xc4, 0x5a, 0x3f, 0x87, 0xa7, 0xba, 0x4f, 0x6b, 0x02, 0x7a, 0x05, 0xdf, 0x1e, 0x70,
+	0xfe, 0x05, 0x6c, 0xb7, 0x33, 0x0f, 0xfc, 0x8a, 0x60, 0xbc, 0xa0, 0xc0, 0x66, 0x4f, 0xc1, 0x59,
+	0xc9, 0xb6, 0x2a, 0x89, 0x98, 0xbd, 0x2e, 0x78, 0xef, 0xe0, 0x65, 0x83, 0x22, 0x77, 0x60, 0xdd,
+	0x7a, 0xfd, 0x14, 0xff, 0x81, 0x60, 0xb2, 0x34, 0x99, 0x98, 0x55, 0xbc, 0xd7, 0x30, 0x53, 0x11,
+	0x7a, 0x53, 0x40, 0xbf, 0x62, 0xdf, 0xab, 0x0c, 0xbd, 0x71, 0x92, 0x65, 0xdf, 0x40, 0x75, 0xfc,
+	0x27, 0x82, 0xa9, 0xf2, 0x14, 0x83, 0xd7, 0xcd, 0xdf, 0x89, 0x8b, 0xe1, 0xaf, 0xdc, 0x24, 0x1b,
+	0x9d, 0x49, 0xe8, 0x19, 0x82, 0xa9, 0xf2, 0xac, 0x63, 0xc6, 0xdf, 0x73, 0x3e, 0xaa, 0xc8, 0xbf,
+	0x25, 0xf8, 0xef, 0x5b, 0xd5, 0x9b, 0xa6, 0xb0, 0x81, 0x6f, 0x11, 0x4c, 0x95, 0xa7, 0x26, 0xb3,
+	0x0d, 0xf4, 0x9c, 0xb4, 0xfa, 0x3e, 0x22, 0xaa, 0xbf, 0xeb, 0xe7, 0xe8, 0xef, 0xdf, 0x95, 0x36,
+	0xab, 0x01, 0xc9, 0x5c, 0x9b, 0xcb, 0xc3, 0x9b, 0xb9, 0x36, 0x77, 0x4d, 0x62, 0xf6, 0xaa, 0x60,
+	0xbf, 0x8d, 0x1d, 0xc3, 0x36, 0xd1, 0xb3, 0xd7, 0x0f, 0x52, 0xa5, 0x65, 0x38, 0x63, 0x95, 0x2e,
+	0x4d, 0x31, 0x56, 0x85, 0x79, 0xa9, 0x17, 0x67, 0xff, 0x1a, 0x2b, 0xc8, 0xec, 0xc9, 0xfe, 0x31,
+	0x17, 0x6a, 0x85, 0x5a, 0x41, 0xa8, 0xcb, 0xb4, 0x37, 0xb4, 0x63, 0xe1, 0x97, 0x11, 0xe7, 0xa1,
+	0xfe, 0x65, 0xc4, 0x7e, 0x55, 0x00, 0xae, 0xd9, 0x15, 0x0b, 0xb9, 0xa1, 0x07, 0xc1, 0xa7, 0xb9,
+	0xd6, 0x55, 0x01, 0xed, 0x31, 0x1c, 0xf6, 0x6d, 0x53, 0x55, 0xc2, 0x7a, 0xc5, 0x12, 0x6e, 0x7e,
+	0x87, 0x60, 0xb1, 0x19, 0xb6, 0x0d, 0x70, 0x1e, 0xa1, 0xf7, 0x1e, 0xaa, 0x55, 0x7e, 0xd8, 0x22,
+	0xcc, 0x77, 0xc2, 0xd8, 0x77, 0x7d, 0xca, 0x04, 0x89, 0x2b, 0x3f, 0x91, 0x28, 0x48, 0x06, 0xfd,
+	0x22, 0xf5, 0x72, 0xc9, 0xfa, 0xf3, 0x88, 0xbd, 0x2d, 0x23, 0x6e, 0x89, 0xbc, 0xa5, 0xb1, 0xc2,
+	0xd9, 0x5b, 0xde, 0xcc, 0x5c, 0xf6, 0x47, 0x45, 0x82, 0x3b, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff,
+	0xdb, 0xa7, 0xdc, 0xe8, 0x6b, 0x13, 0x00, 0x00,
+}
diff --git a/vendor/google.golang.org/genproto/googleapis/longrunning/operations.pb.go b/vendor/google.golang.org/genproto/googleapis/longrunning/operations.pb.go
new file mode 100644
index 0000000..4f947fe
--- /dev/null
+++ b/vendor/google.golang.org/genproto/googleapis/longrunning/operations.pb.go
@@ -0,0 +1,596 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: google/longrunning/operations.proto
+
+/*
+Package longrunning is a generated protocol buffer package.
+
+It is generated from these files:
+	google/longrunning/operations.proto
+
+It has these top-level messages:
+	Operation
+	GetOperationRequest
+	ListOperationsRequest
+	ListOperationsResponse
+	CancelOperationRequest
+	DeleteOperationRequest
+*/
+package longrunning
+
+import proto "github.com/golang/protobuf/proto"
+import fmt "fmt"
+import math "math"
+import _ "google.golang.org/genproto/googleapis/api/annotations"
+import google_protobuf1 "github.com/golang/protobuf/ptypes/any"
+import google_protobuf2 "github.com/golang/protobuf/ptypes/empty"
+import google_rpc "google.golang.org/genproto/googleapis/rpc/status"
+
+import (
+	context "golang.org/x/net/context"
+	grpc "google.golang.org/grpc"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
+
+// This resource represents a long-running operation that is the result of a
+// network API call.
+type Operation struct {
+	// The server-assigned name, which is only unique within the same service that
+	// originally returns it. If you use the default HTTP mapping, the
+	// `name` should have the format of `operations/some/unique/name`.
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+	// Service-specific metadata associated with the operation.  It typically
+	// contains progress information and common metadata such as create time.
+	// Some services might not provide such metadata.  Any method that returns a
+	// long-running operation should document the metadata type, if any.
+	Metadata *google_protobuf1.Any `protobuf:"bytes,2,opt,name=metadata" json:"metadata,omitempty"`
+	// If the value is `false`, it means the operation is still in progress.
+	// If true, the operation is completed, and either `error` or `response` is
+	// available.
+	Done bool `protobuf:"varint,3,opt,name=done" json:"done,omitempty"`
+	// The operation result, which can be either an `error` or a valid `response`.
+	// If `done` == `false`, neither `error` nor `response` is set.
+	// If `done` == `true`, exactly one of `error` or `response` is set.
+	//
+	// Types that are valid to be assigned to Result:
+	//	*Operation_Error
+	//	*Operation_Response
+	Result isOperation_Result `protobuf_oneof:"result"`
+}
+
+func (m *Operation) Reset()                    { *m = Operation{} }
+func (m *Operation) String() string            { return proto.CompactTextString(m) }
+func (*Operation) ProtoMessage()               {}
+func (*Operation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
+
+type isOperation_Result interface {
+	isOperation_Result()
+}
+
+type Operation_Error struct {
+	Error *google_rpc.Status `protobuf:"bytes,4,opt,name=error,oneof"`
+}
+type Operation_Response struct {
+	Response *google_protobuf1.Any `protobuf:"bytes,5,opt,name=response,oneof"`
+}
+
+func (*Operation_Error) isOperation_Result()    {}
+func (*Operation_Response) isOperation_Result() {}
+
+func (m *Operation) GetResult() isOperation_Result {
+	if m != nil {
+		return m.Result
+	}
+	return nil
+}
+
+func (m *Operation) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Operation) GetMetadata() *google_protobuf1.Any {
+	if m != nil {
+		return m.Metadata
+	}
+	return nil
+}
+
+func (m *Operation) GetDone() bool {
+	if m != nil {
+		return m.Done
+	}
+	return false
+}
+
+func (m *Operation) GetError() *google_rpc.Status {
+	if x, ok := m.GetResult().(*Operation_Error); ok {
+		return x.Error
+	}
+	return nil
+}
+
+func (m *Operation) GetResponse() *google_protobuf1.Any {
+	if x, ok := m.GetResult().(*Operation_Response); ok {
+		return x.Response
+	}
+	return nil
+}
+
+// XXX_OneofFuncs is for the internal use of the proto package.
+func (*Operation) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
+	return _Operation_OneofMarshaler, _Operation_OneofUnmarshaler, _Operation_OneofSizer, []interface{}{
+		(*Operation_Error)(nil),
+		(*Operation_Response)(nil),
+	}
+}
+
+func _Operation_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
+	m := msg.(*Operation)
+	// result
+	switch x := m.Result.(type) {
+	case *Operation_Error:
+		b.EncodeVarint(4<<3 | proto.WireBytes)
+		if err := b.EncodeMessage(x.Error); err != nil {
+			return err
+		}
+	case *Operation_Response:
+		b.EncodeVarint(5<<3 | proto.WireBytes)
+		if err := b.EncodeMessage(x.Response); err != nil {
+			return err
+		}
+	case nil:
+	default:
+		return fmt.Errorf("Operation.Result has unexpected type %T", x)
+	}
+	return nil
+}
+
+func _Operation_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
+	m := msg.(*Operation)
+	switch tag {
+	case 4: // result.error
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		msg := new(google_rpc.Status)
+		err := b.DecodeMessage(msg)
+		m.Result = &Operation_Error{msg}
+		return true, err
+	case 5: // result.response
+		if wire != proto.WireBytes {
+			return true, proto.ErrInternalBadWireType
+		}
+		msg := new(google_protobuf1.Any)
+		err := b.DecodeMessage(msg)
+		m.Result = &Operation_Response{msg}
+		return true, err
+	default:
+		return false, nil
+	}
+}
+
+func _Operation_OneofSizer(msg proto.Message) (n int) {
+	m := msg.(*Operation)
+	// result
+	switch x := m.Result.(type) {
+	case *Operation_Error:
+		s := proto.Size(x.Error)
+		n += proto.SizeVarint(4<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(s))
+		n += s
+	case *Operation_Response:
+		s := proto.Size(x.Response)
+		n += proto.SizeVarint(5<<3 | proto.WireBytes)
+		n += proto.SizeVarint(uint64(s))
+		n += s
+	case nil:
+	default:
+		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
+	}
+	return n
+}
+
+// The request message for [Operations.GetOperation][google.longrunning.Operations.GetOperation].
+type GetOperationRequest struct {
+	// The name of the operation resource.
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *GetOperationRequest) Reset()                    { *m = GetOperationRequest{} }
+func (m *GetOperationRequest) String() string            { return proto.CompactTextString(m) }
+func (*GetOperationRequest) ProtoMessage()               {}
+func (*GetOperationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
+
+func (m *GetOperationRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// The request message for [Operations.ListOperations][google.longrunning.Operations.ListOperations].
+type ListOperationsRequest struct {
+	// The name of the operation collection.
+	Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"`
+	// The standard list filter.
+	Filter string `protobuf:"bytes,1,opt,name=filter" json:"filter,omitempty"`
+	// The standard list page size.
+	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize" json:"page_size,omitempty"`
+	// The standard list page token.
+	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken" json:"page_token,omitempty"`
+}
+
+func (m *ListOperationsRequest) Reset()                    { *m = ListOperationsRequest{} }
+func (m *ListOperationsRequest) String() string            { return proto.CompactTextString(m) }
+func (*ListOperationsRequest) ProtoMessage()               {}
+func (*ListOperationsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
+
+func (m *ListOperationsRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *ListOperationsRequest) GetFilter() string {
+	if m != nil {
+		return m.Filter
+	}
+	return ""
+}
+
+func (m *ListOperationsRequest) GetPageSize() int32 {
+	if m != nil {
+		return m.PageSize
+	}
+	return 0
+}
+
+func (m *ListOperationsRequest) GetPageToken() string {
+	if m != nil {
+		return m.PageToken
+	}
+	return ""
+}
+
+// The response message for [Operations.ListOperations][google.longrunning.Operations.ListOperations].
+type ListOperationsResponse struct {
+	// A list of operations that matches the specified filter in the request.
+	Operations []*Operation `protobuf:"bytes,1,rep,name=operations" json:"operations,omitempty"`
+	// The standard List next-page token.
+	NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken" json:"next_page_token,omitempty"`
+}
+
+func (m *ListOperationsResponse) Reset()                    { *m = ListOperationsResponse{} }
+func (m *ListOperationsResponse) String() string            { return proto.CompactTextString(m) }
+func (*ListOperationsResponse) ProtoMessage()               {}
+func (*ListOperationsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
+
+func (m *ListOperationsResponse) GetOperations() []*Operation {
+	if m != nil {
+		return m.Operations
+	}
+	return nil
+}
+
+func (m *ListOperationsResponse) GetNextPageToken() string {
+	if m != nil {
+		return m.NextPageToken
+	}
+	return ""
+}
+
+// The request message for [Operations.CancelOperation][google.longrunning.Operations.CancelOperation].
+type CancelOperationRequest struct {
+	// The name of the operation resource to be cancelled.
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *CancelOperationRequest) Reset()                    { *m = CancelOperationRequest{} }
+func (m *CancelOperationRequest) String() string            { return proto.CompactTextString(m) }
+func (*CancelOperationRequest) ProtoMessage()               {}
+func (*CancelOperationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
+
+func (m *CancelOperationRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+// The request message for [Operations.DeleteOperation][google.longrunning.Operations.DeleteOperation].
+type DeleteOperationRequest struct {
+	// The name of the operation resource to be deleted.
+	Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
+}
+
+func (m *DeleteOperationRequest) Reset()                    { *m = DeleteOperationRequest{} }
+func (m *DeleteOperationRequest) String() string            { return proto.CompactTextString(m) }
+func (*DeleteOperationRequest) ProtoMessage()               {}
+func (*DeleteOperationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
+
+func (m *DeleteOperationRequest) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterType((*Operation)(nil), "google.longrunning.Operation")
+	proto.RegisterType((*GetOperationRequest)(nil), "google.longrunning.GetOperationRequest")
+	proto.RegisterType((*ListOperationsRequest)(nil), "google.longrunning.ListOperationsRequest")
+	proto.RegisterType((*ListOperationsResponse)(nil), "google.longrunning.ListOperationsResponse")
+	proto.RegisterType((*CancelOperationRequest)(nil), "google.longrunning.CancelOperationRequest")
+	proto.RegisterType((*DeleteOperationRequest)(nil), "google.longrunning.DeleteOperationRequest")
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// Client API for Operations service
+
+type OperationsClient interface {
+	// Lists operations that match the specified filter in the request. If the
+	// server doesn't support this method, it returns `UNIMPLEMENTED`.
+	//
+	// NOTE: the `name` binding below allows API services to override the binding
+	// to use different resource name schemes, such as `users/*/operations`.
+	ListOperations(ctx context.Context, in *ListOperationsRequest, opts ...grpc.CallOption) (*ListOperationsResponse, error)
+	// Gets the latest state of a long-running operation.  Clients can use this
+	// method to poll the operation result at intervals as recommended by the API
+	// service.
+	GetOperation(ctx context.Context, in *GetOperationRequest, opts ...grpc.CallOption) (*Operation, error)
+	// Deletes a long-running operation. This method indicates that the client is
+	// no longer interested in the operation result. It does not cancel the
+	// operation. If the server doesn't support this method, it returns
+	// `google.rpc.Code.UNIMPLEMENTED`.
+	DeleteOperation(ctx context.Context, in *DeleteOperationRequest, opts ...grpc.CallOption) (*google_protobuf2.Empty, error)
+	// Starts asynchronous cancellation on a long-running operation.  The server
+	// makes a best effort to cancel the operation, but success is not
+	// guaranteed.  If the server doesn't support this method, it returns
+	// `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
+	// [Operations.GetOperation][google.longrunning.Operations.GetOperation] or
+	// other methods to check whether the cancellation succeeded or whether the
+	// operation completed despite cancellation. On successful cancellation,
+	// the operation is not deleted; instead, it becomes an operation with
+	// an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1,
+	// corresponding to `Code.CANCELLED`.
+	CancelOperation(ctx context.Context, in *CancelOperationRequest, opts ...grpc.CallOption) (*google_protobuf2.Empty, error)
+}
+
+type operationsClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewOperationsClient(cc *grpc.ClientConn) OperationsClient {
+	return &operationsClient{cc}
+}
+
+func (c *operationsClient) ListOperations(ctx context.Context, in *ListOperationsRequest, opts ...grpc.CallOption) (*ListOperationsResponse, error) {
+	out := new(ListOperationsResponse)
+	err := grpc.Invoke(ctx, "/google.longrunning.Operations/ListOperations", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *operationsClient) GetOperation(ctx context.Context, in *GetOperationRequest, opts ...grpc.CallOption) (*Operation, error) {
+	out := new(Operation)
+	err := grpc.Invoke(ctx, "/google.longrunning.Operations/GetOperation", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *operationsClient) DeleteOperation(ctx context.Context, in *DeleteOperationRequest, opts ...grpc.CallOption) (*google_protobuf2.Empty, error) {
+	out := new(google_protobuf2.Empty)
+	err := grpc.Invoke(ctx, "/google.longrunning.Operations/DeleteOperation", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *operationsClient) CancelOperation(ctx context.Context, in *CancelOperationRequest, opts ...grpc.CallOption) (*google_protobuf2.Empty, error) {
+	out := new(google_protobuf2.Empty)
+	err := grpc.Invoke(ctx, "/google.longrunning.Operations/CancelOperation", in, out, c.cc, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// Server API for Operations service
+
+type OperationsServer interface {
+	// Lists operations that match the specified filter in the request. If the
+	// server doesn't support this method, it returns `UNIMPLEMENTED`.
+	//
+	// NOTE: the `name` binding below allows API services to override the binding
+	// to use different resource name schemes, such as `users/*/operations`.
+	ListOperations(context.Context, *ListOperationsRequest) (*ListOperationsResponse, error)
+	// Gets the latest state of a long-running operation.  Clients can use this
+	// method to poll the operation result at intervals as recommended by the API
+	// service.
+	GetOperation(context.Context, *GetOperationRequest) (*Operation, error)
+	// Deletes a long-running operation. This method indicates that the client is
+	// no longer interested in the operation result. It does not cancel the
+	// operation. If the server doesn't support this method, it returns
+	// `google.rpc.Code.UNIMPLEMENTED`.
+	DeleteOperation(context.Context, *DeleteOperationRequest) (*google_protobuf2.Empty, error)
+	// Starts asynchronous cancellation on a long-running operation.  The server
+	// makes a best effort to cancel the operation, but success is not
+	// guaranteed.  If the server doesn't support this method, it returns
+	// `google.rpc.Code.UNIMPLEMENTED`.  Clients can use
+	// [Operations.GetOperation][google.longrunning.Operations.GetOperation] or
+	// other methods to check whether the cancellation succeeded or whether the
+	// operation completed despite cancellation. On successful cancellation,
+	// the operation is not deleted; instead, it becomes an operation with
+	// an [Operation.error][google.longrunning.Operation.error] value with a [google.rpc.Status.code][google.rpc.Status.code] of 1,
+	// corresponding to `Code.CANCELLED`.
+	CancelOperation(context.Context, *CancelOperationRequest) (*google_protobuf2.Empty, error)
+}
+
+func RegisterOperationsServer(s *grpc.Server, srv OperationsServer) {
+	s.RegisterService(&_Operations_serviceDesc, srv)
+}
+
+func _Operations_ListOperations_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ListOperationsRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OperationsServer).ListOperations(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.longrunning.Operations/ListOperations",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OperationsServer).ListOperations(ctx, req.(*ListOperationsRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Operations_GetOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetOperationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OperationsServer).GetOperation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.longrunning.Operations/GetOperation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OperationsServer).GetOperation(ctx, req.(*GetOperationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Operations_DeleteOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DeleteOperationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OperationsServer).DeleteOperation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.longrunning.Operations/DeleteOperation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OperationsServer).DeleteOperation(ctx, req.(*DeleteOperationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Operations_CancelOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CancelOperationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(OperationsServer).CancelOperation(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/google.longrunning.Operations/CancelOperation",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(OperationsServer).CancelOperation(ctx, req.(*CancelOperationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _Operations_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "google.longrunning.Operations",
+	HandlerType: (*OperationsServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListOperations",
+			Handler:    _Operations_ListOperations_Handler,
+		},
+		{
+			MethodName: "GetOperation",
+			Handler:    _Operations_GetOperation_Handler,
+		},
+		{
+			MethodName: "DeleteOperation",
+			Handler:    _Operations_DeleteOperation_Handler,
+		},
+		{
+			MethodName: "CancelOperation",
+			Handler:    _Operations_CancelOperation_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "google/longrunning/operations.proto",
+}
+
+func init() { proto.RegisterFile("google/longrunning/operations.proto", fileDescriptor0) }
+
+var fileDescriptor0 = []byte{
+	// 586 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x54, 0xc1, 0x6e, 0xd3, 0x40,
+	0x10, 0xad, 0xd3, 0x24, 0x4a, 0xa6, 0x40, 0xa4, 0x85, 0xba, 0xc6, 0x25, 0x22, 0x32, 0x08, 0x52,
+	0xab, 0xb2, 0x21, 0xdc, 0x8a, 0x72, 0x20, 0x80, 0xda, 0x43, 0x25, 0x22, 0x97, 0x13, 0x97, 0x6a,
+	0x9b, 0x4e, 0x2d, 0x0b, 0x67, 0xd7, 0xac, 0x37, 0xd0, 0x16, 0x55, 0x11, 0x1c, 0x38, 0x71, 0xe3,
+	0x2f, 0xf8, 0x19, 0x0e, 0xfc, 0x02, 0x1f, 0x82, 0xbc, 0x76, 0x62, 0x93, 0x3a, 0x28, 0xb7, 0xf5,
+	0xcc, 0x9b, 0x79, 0xf3, 0xde, 0xce, 0x1a, 0x1e, 0xf8, 0x9c, 0xfb, 0x21, 0xba, 0x21, 0x67, 0xbe,
+	0x98, 0x30, 0x16, 0x30, 0xdf, 0xe5, 0x11, 0x0a, 0x2a, 0x03, 0xce, 0x62, 0x27, 0x12, 0x5c, 0x72,
+	0x42, 0x52, 0x90, 0x53, 0x00, 0x99, 0xf7, 0xb2, 0x42, 0x1a, 0x05, 0x2e, 0x65, 0x8c, 0xcb, 0x62,
+	0x85, 0x79, 0x37, 0xcb, 0xaa, 0xaf, 0x93, 0xc9, 0x99, 0x4b, 0xd9, 0x45, 0x96, 0xda, 0x5e, 0x4c,
+	0xe1, 0x38, 0x92, 0xb3, 0xe4, 0x56, 0x96, 0x14, 0xd1, 0xc8, 0x8d, 0x25, 0x95, 0x93, 0xac, 0xa1,
+	0xf5, 0x4b, 0x83, 0xe6, 0x9b, 0xd9, 0x5c, 0x84, 0x40, 0x95, 0xd1, 0x31, 0x1a, 0x5a, 0x47, 0xeb,
+	0x36, 0x3d, 0x75, 0x26, 0x4f, 0xa0, 0x31, 0x46, 0x49, 0x4f, 0xa9, 0xa4, 0x46, 0xa5, 0xa3, 0x75,
+	0x37, 0x7a, 0x77, 0x9c, 0x6c, 0xee, 0x19, 0x95, 0xf3, 0x82, 0x5d, 0x78, 0x73, 0x54, 0xd2, 0xe5,
+	0x94, 0x33, 0x34, 0xd6, 0x3b, 0x5a, 0xb7, 0xe1, 0xa9, 0x33, 0xb1, 0xa1, 0x86, 0x42, 0x70, 0x61,
+	0x54, 0x55, 0x0b, 0x32, 0x6b, 0x21, 0xa2, 0x91, 0x73, 0xa4, 0x06, 0x3a, 0x58, 0xf3, 0x52, 0x08,
+	0xe9, 0x41, 0x43, 0x60, 0x1c, 0x71, 0x16, 0xa3, 0x51, 0x5b, 0xce, 0x78, 0xb0, 0xe6, 0xcd, 0x71,
+	0x83, 0x06, 0xd4, 0x05, 0xc6, 0x93, 0x50, 0x5a, 0x3b, 0x70, 0x7b, 0x1f, 0xe5, 0x5c, 0x93, 0x87,
+	0x1f, 0x26, 0x18, 0xcb, 0x32, 0x69, 0xd6, 0x14, 0x36, 0x0f, 0x83, 0x38, 0xc7, 0xc6, 0x8b, 0xe0,
+	0x6a, 0xc1, 0x07, 0x1d, 0xea, 0x67, 0x41, 0x28, 0x51, 0x64, 0x2d, 0xb2, 0x2f, 0xb2, 0x0d, 0xcd,
+	0x88, 0xfa, 0x78, 0x1c, 0x07, 0x97, 0xa8, 0x0c, 0xaa, 0x79, 0x8d, 0x24, 0x70, 0x14, 0x5c, 0x22,
+	0x69, 0x03, 0xa8, 0xa4, 0xe4, 0xef, 0x91, 0x29, 0x43, 0x9a, 0x9e, 0x82, 0xbf, 0x4d, 0x02, 0xd6,
+	0x14, 0xf4, 0xc5, 0x01, 0x52, 0x3d, 0xa4, 0x0f, 0x90, 0xaf, 0x8b, 0xa1, 0x75, 0xd6, 0xbb, 0x1b,
+	0xbd, 0xb6, 0x73, 0x7d, 0x5f, 0x9c, 0x5c, 0x68, 0xa1, 0x80, 0x3c, 0x82, 0x16, 0xc3, 0x73, 0x79,
+	0x5c, 0x20, 0xaf, 0x28, 0xf2, 0x9b, 0x49, 0x78, 0x38, 0x1f, 0x60, 0x17, 0xf4, 0x97, 0x94, 0x8d,
+	0x30, 0x5c, 0xc9, 0xaf, 0x5d, 0xd0, 0x5f, 0x61, 0x88, 0x12, 0x57, 0x41, 0xf7, 0xbe, 0x57, 0x01,
+	0x72, 0x65, 0xe4, 0x9b, 0x06, 0xb7, 0xfe, 0x15, 0x4b, 0x76, 0xca, 0x04, 0x95, 0xde, 0x88, 0x69,
+	0xaf, 0x02, 0x4d, 0xbd, 0xb3, 0xda, 0x5f, 0x7f, 0xff, 0xf9, 0x51, 0xd9, 0x22, 0x9b, 0xee, 0xc7,
+	0xa7, 0xee, 0xe7, 0x64, 0x96, 0x7e, 0x6e, 0xcd, 0x15, 0x39, 0x87, 0x1b, 0xc5, 0x05, 0x21, 0x8f,
+	0xcb, 0x5a, 0x97, 0xac, 0x90, 0xf9, 0x7f, 0xff, 0xad, 0x8e, 0xa2, 0x35, 0x89, 0x51, 0x46, 0xeb,
+	0xda, 0xf6, 0x15, 0xf9, 0x04, 0xad, 0x05, 0xff, 0x48, 0xa9, 0xae, 0x72, 0x93, 0x4d, 0xfd, 0xda,
+	0x2b, 0x78, 0x9d, 0x3c, 0xf1, 0x19, 0xb1, 0xbd, 0x9c, 0xf8, 0x8b, 0x06, 0xad, 0x85, 0x7b, 0x2e,
+	0x67, 0x2e, 0x5f, 0x86, 0xa5, 0xcc, 0xb6, 0x62, 0x7e, 0x68, 0xdd, 0x5f, 0xc6, 0xbc, 0x37, 0x52,
+	0x0d, 0xf7, 0x34, 0x7b, 0x30, 0x05, 0x7d, 0xc4, 0xc7, 0x25, 0xa4, 0x83, 0x56, 0x7e, 0x87, 0xc3,
+	0xa4, 0xff, 0x50, 0x7b, 0xd7, 0xcf, 0x60, 0x3e, 0x0f, 0x29, 0xf3, 0x1d, 0x2e, 0x7c, 0xd7, 0x47,
+	0xa6, 0xd8, 0xdd, 0x34, 0x45, 0xa3, 0x20, 0x2e, 0xfe, 0x5d, 0x9f, 0x17, 0xce, 0x3f, 0x2b, 0x64,
+	0x3f, 0xad, 0x3f, 0xe4, 0xcc, 0xf7, 0xd2, 0xe0, 0x49, 0x5d, 0x95, 0x3f, 0xfb, 0x1b, 0x00, 0x00,
+	0xff, 0xff, 0x69, 0x4c, 0xa6, 0x3e, 0x9b, 0x05, 0x00, 0x00,
+}