diff --git a/CHANGELOG.md b/CHANGELOG.md index 271a382b77..a4601a77cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - [11644](https://github.com/vegaprotocol/vega/issues/11644) - `liveOnly` flag has been added to the `AMM` API to show only active `AMMs`. - [11519](https://github.com/vegaprotocol/vega/issues/11519) - Add fees to position API types. +- [11642](https://github.com/vegaprotocol/vega/issues/11642) - `AMMs` with empty price levels are now allowed. ### 🐛 Fixes diff --git a/core/execution/amm/engine.go b/core/execution/amm/engine.go index 8e3ec559c0..b258c382ad 100644 --- a/core/execution/amm/engine.go +++ b/core/execution/amm/engine.go @@ -142,8 +142,9 @@ type Engine struct { // a mapping of all amm-party-ids to the party owning them. ammParties map[string]string - minCommitmentQuantum *num.Uint - maxCalculationLevels *num.Uint + minCommitmentQuantum *num.Uint + maxCalculationLevels *num.Uint + allowedEmptyAMMLevels uint64 } func New( @@ -157,6 +158,7 @@ func New( positionFactor num.Decimal, marketActivityTracker *common.MarketActivityTracker, parties common.Parties, + allowedEmptyAMMLevels uint64, ) *Engine { oneTick, _ := num.UintFromDecimal(priceFactor) return &Engine{ @@ -176,6 +178,7 @@ func New( positionFactor: positionFactor, parties: parties, oneTick: num.Max(num.UintOne(), oneTick), + allowedEmptyAMMLevels: allowedEmptyAMMLevels, } } @@ -191,8 +194,9 @@ func NewFromProto( positionFactor num.Decimal, marketActivityTracker *common.MarketActivityTracker, parties common.Parties, + allowedEmptyAMMLevels uint64, ) (*Engine, error) { - e := New(log, broker, collateral, marketID, assetID, position, priceFactor, positionFactor, marketActivityTracker, parties) + e := New(log, broker, collateral, marketID, assetID, position, priceFactor, positionFactor, marketActivityTracker, parties, allowedEmptyAMMLevels) for _, v := range state.AmmPartyIds { e.ammParties[v.Key] = v.Value @@ -244,6 +248,10 @@ func (e *Engine) OnMaxCalculationLevelsUpdate(ctx context.Context, c *num.Uint) } } +func (e *Engine) UpdateAllowedEmptyLevels(allowedEmptyLevels uint64) { + e.allowedEmptyAMMLevels = allowedEmptyLevels +} + // OnMTM is called whenever core does an MTM and is a signal that any pool's that are closing and have 0 position can be fully removed. func (e *Engine) OnMTM(ctx context.Context) { rm := []string{} @@ -311,11 +319,20 @@ func (e *Engine) BestPricesAndVolumes() (*num.Uint, uint64, *num.Uint, uint64) { for _, pool := range e.poolsCpy { // get the pool's current price - fp := pool.BestPrice(nil) - - // get the volume on the buy side by simulating an incoming sell order - bid := num.Max(pool.lower.low, num.UintZero().Sub(fp, pool.oneTick)) - volume := pool.TradableVolumeInRange(types.SideSell, fp.Clone(), bid) + fp := pool.FairPrice() + + var volume uint64 + bid, ok := pool.BestPrice(types.SideBuy) + if ok { + volume = 1 + + // if the best price is + bidTick := num.Max(pool.lower.low, num.UintZero().Sub(fp, pool.oneTick)) + if bid.GTE(bidTick) { + bid = bidTick + volume = pool.TradableVolumeForPrice(types.SideSell, bid) + } + } if volume != 0 { if bestBid == nil || bid.GT(bestBid) { @@ -326,9 +343,17 @@ func (e *Engine) BestPricesAndVolumes() (*num.Uint, uint64, *num.Uint, uint64) { } } - // get the volume on the sell side by simulating an incoming buy order - ask := num.Min(pool.upper.high, num.UintZero().Add(fp, pool.oneTick)) - volume = pool.TradableVolumeInRange(types.SideBuy, fp.Clone(), ask) + volume = 0 + ask, ok := pool.BestPrice(types.SideSell) + if ok { + volume = 1 + askTick := num.Min(pool.upper.high, num.UintZero().Add(fp, pool.oneTick)) + if ask.LTE(askTick) { + ask = askTick + volume = pool.TradableVolumeForPrice(types.SideBuy, ask) + } + } + if volume != 0 { if bestAsk == nil || ask.LT(bestAsk) { bestAsk = ask @@ -347,7 +372,10 @@ func (e *Engine) GetVolumeAtPrice(price *num.Uint, side types.Side) uint64 { vol := uint64(0) for _, pool := range e.poolsCpy { // get the pool's current price - best := pool.BestPrice(&types.Order{Price: price, Side: side}) + best, ok := pool.BestPrice(types.OtherSide(side)) + if !ok { + continue + } // make sure price is in tradable range if side == types.SideBuy && best.GT(price) { @@ -377,10 +405,14 @@ func (e *Engine) submit(active []*Pool, agg *types.Order, inner, outer *num.Uint for _, p := range active { p.setEphemeralPosition() - price := p.BestPrice(agg) + price, ok := p.BestPrice(types.OtherSide(agg.Side)) + if !ok { + continue + } + if e.log.GetLevel() == logging.DebugLevel { e.log.Debug("best price for pool", - logging.String("id", p.ID), + logging.String("amm-party", p.AMMParty), logging.String("best-price", price.String()), ) } @@ -401,19 +433,15 @@ func (e *Engine) submit(active []*Pool, agg *types.Order, inner, outer *num.Uint useActive = append(useActive, p) } - if agg.Side == types.SideSell { - inner, outer = outer, inner - } - // calculate the volume each pool has var total uint64 volumes := []uint64{} for _, p := range useActive { - volume := p.TradableVolumeInRange(agg.Side, inner, outer) + volume := p.TradableVolumeForPrice(agg.Side, outer) if e.log.GetLevel() == logging.DebugLevel { e.log.Debug("volume available to trade", logging.Uint64("volume", volume), - logging.String("id", p.ID), + logging.String("amm-party", p.AMMParty), ) } @@ -676,6 +704,7 @@ func (e *Engine) Create( e.priceFactor, e.positionFactor, e.maxCalculationLevels, + e.allowedEmptyAMMLevels, ) if err != nil { return nil, err @@ -736,7 +765,7 @@ func (e *Engine) Amend( } } - updated, err := pool.Update(amend, riskFactors, scalingFactors, slippage) + updated, err := pool.Update(amend, riskFactors, scalingFactors, slippage, e.allowedEmptyAMMLevels) if err != nil { return nil, nil, err } diff --git a/core/execution/amm/engine_test.go b/core/execution/amm/engine_test.go index 1ac548f31b..6ceb5a52d7 100644 --- a/core/execution/amm/engine_test.go +++ b/core/execution/amm/engine_test.go @@ -45,6 +45,7 @@ var ( func TestSubmitAMM(t *testing.T) { t.Run("test one pool per party", testOnePoolPerParty) + t.Run("test creation of sparse AMM", testSparseAMMEngine) } func TestAMMTrading(t *testing.T) { @@ -154,7 +155,7 @@ func testAmendInsufficientCommitment(t *testing.T) { amend.Parameters.LowerBound.AddSum(num.UintOne()) _, _, err := tst.engine.Amend(ctx, amend, riskFactors, scalingFactors, slippage) - require.ErrorContains(t, err, "insufficient commitment") + require.ErrorContains(t, err, "commitment amount too low") // check that the original pool still exists assert.Equal(t, poolID, tst.engine.poolsCpy[0].ID) @@ -299,10 +300,10 @@ func testSubmitMarketOrder(t *testing.T) { } ensurePosition(t, tst.pos, 0, num.NewUint(0)) - orders := tst.engine.SubmitOrder(agg, num.NewUint(1980), num.NewUint(1990)) + orders := tst.engine.SubmitOrder(agg, num.NewUint(2000), num.NewUint(1980)) require.Len(t, orders, 1) - assert.Equal(t, "1994", orders[0].Price.String()) - assert.Equal(t, 126420, int(orders[0].Size)) + assert.Equal(t, "1989", orders[0].Price.String()) + assert.Equal(t, 251890, int(orders[0].Size)) } func testSubmitMarketOrderUnbounded(t *testing.T) { @@ -488,7 +489,7 @@ func testBestPricesAndVolume(t *testing.T) { } func TestBestPricesAndVolumeNearBound(t *testing.T) { - tst := getTestEngineWithFactors(t, num.DecimalFromInt64(100), num.DecimalFromFloat(10)) + tst := getTestEngineWithFactors(t, num.DecimalFromInt64(100), num.DecimalFromFloat(10), 0) // create three pools party, subAccount := getParty(t, tst) @@ -497,7 +498,7 @@ func TestBestPricesAndVolumeNearBound(t *testing.T) { expectSubaccountCreation(t, tst, party, subAccount) whenAMMIsSubmitted(t, tst, submit) - tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(3).Return( + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(7).Return( []events.MarketPosition{&marketPosition{size: 0, averageEntry: num.NewUint(0)}}, ) @@ -508,7 +509,7 @@ func TestBestPricesAndVolumeNearBound(t *testing.T) { assert.Equal(t, 1192, int(avolume)) // lets move its position so that the fair price is within one tick of the AMMs upper boundary - tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(3).Return( + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(7).Return( []events.MarketPosition{&marketPosition{size: -222000, averageEntry: num.NewUint(0)}}, ) @@ -516,17 +517,17 @@ func TestBestPricesAndVolumeNearBound(t *testing.T) { assert.Equal(t, "219890", bid.String()) assert.Equal(t, "220000", ask.String()) // make sure we are capped to the boundary and not 220090 assert.Equal(t, 1034, int(bvolume)) - assert.Equal(t, 103, int(avolume)) + assert.Equal(t, 104, int(avolume)) // lets move its position so that the fair price is within one tick of the AMMs upper boundary - tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(3).Return( + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).Times(7).Return( []events.MarketPosition{&marketPosition{size: 270400, averageEntry: num.NewUint(0)}}, ) bid, bvolume, ask, avolume = tst.engine.BestPricesAndVolumes() assert.Equal(t, "180000", bid.String()) // make sure we are capped to the boundary and not 179904 assert.Equal(t, "180104", ask.String()) - assert.Equal(t, 58, int(bvolume)) + assert.Equal(t, 62, int(bvolume)) assert.Equal(t, 1460, int(avolume)) } @@ -696,6 +697,26 @@ func testMarketClosure(t *testing.T) { require.Equal(t, 0, len(tst.engine.ammParties)) } +func testSparseAMMEngine(t *testing.T) { + tst := getTestEngineWithFactors(t, num.DecimalOne(), num.DecimalOne(), 10) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + submit.CommitmentAmount = num.NewUint(100000) + + expectSubaccountCreation(t, tst, party, subAccount) + whenAMMIsSubmitted(t, tst, submit) + + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).AnyTimes().Return( + []events.MarketPosition{&marketPosition{size: 0, averageEntry: nil}}, + ) + bb, bv, ba, av := tst.engine.BestPricesAndVolumes() + assert.Equal(t, "1992", bb.String()) + assert.Equal(t, 1, int(bv)) + assert.Equal(t, "2009", ba.String()) + assert.Equal(t, 1, int(av)) +} + func expectSubaccountCreation(t *testing.T, tst *tstEngine, party, subAccount string) { t.Helper() @@ -815,7 +836,7 @@ type tstEngine struct { assetID string } -func getTestEngineWithFactors(t *testing.T, priceFactor, positionFactor num.Decimal) *tstEngine { +func getTestEngineWithFactors(t *testing.T, priceFactor, positionFactor num.Decimal, allowedEmptyLevels uint64) *tstEngine { t.Helper() ctrl := gomock.NewController(t) col := mocks.NewMockCollateral(ctrl) @@ -836,7 +857,7 @@ func getTestEngineWithFactors(t *testing.T, priceFactor, positionFactor num.Deci parties := cmocks.NewMockParties(ctrl) parties.EXPECT().AssignDeriveKey(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - eng := New(logging.NewTestLogger(), broker, col, marketID, assetID, pos, priceFactor, positionFactor, mat, parties) + eng := New(logging.NewTestLogger(), broker, col, marketID, assetID, pos, priceFactor, positionFactor, mat, parties, allowedEmptyLevels) // do an ontick to initialise the idgen ctx := vgcontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) @@ -856,7 +877,7 @@ func getTestEngineWithFactors(t *testing.T, priceFactor, positionFactor num.Deci func getTestEngine(t *testing.T) *tstEngine { t.Helper() - return getTestEngineWithFactors(t, num.DecimalOne(), num.DecimalOne()) + return getTestEngineWithFactors(t, num.DecimalOne(), num.DecimalOne(), 0) } func getAccount(balance uint64) *types.Account { diff --git a/core/execution/amm/estimator.go b/core/execution/amm/estimator.go index 7c076c3368..18cf4db75c 100644 --- a/core/execution/amm/estimator.go +++ b/core/execution/amm/estimator.go @@ -39,6 +39,7 @@ func EstimateBounds( linearSlippageFactor, initialMargin, riskFactorShort, riskFactorLong, priceFactor, positionFactor num.Decimal, + allowedMaxEmptyLevels uint64, ) EstimatedBounds { r := EstimatedBounds{} @@ -70,8 +71,16 @@ func EstimateBounds( // now lets check that the lower bound is not too wide that the volume is spread too thin l := unitLower.Mul(boundPosLower).Abs() - pos := impliedPosition(sqrter.sqrt(num.UintZero().Sub(basePrice, oneTick)), sqrter.sqrt(basePrice), l) - if pos.LessThan(num.DecimalOne()) { + cu := &curve{ + l: l, + high: basePrice, + low: lowerPrice, + sqrtHigh: sqrter.sqrt(upperPrice), + isLower: true, + pv: r.PositionSizeAtLower, + } + + if err := cu.check(sqrter.sqrt, oneTick, allowedMaxEmptyLevels); err != nil { r.TooWideLower = true } } @@ -99,8 +108,14 @@ func EstimateBounds( // now lets check that the lower bound is not too wide that the volume is spread too thin l := unitUpper.Mul(boundPosUpper).Abs() - pos := impliedPosition(sqrter.sqrt(num.UintZero().Sub(upperPrice, oneTick)), sqrter.sqrt(upperPrice), l) - if pos.LessThan(num.DecimalOne()) { + cu := &curve{ + l: l, + high: upperPrice, + low: basePrice, + sqrtHigh: sqrter.sqrt(upperPrice), + pv: r.PositionSizeAtUpper.Neg(), + } + if err := cu.check(sqrter.sqrt, oneTick, allowedMaxEmptyLevels); err != nil { r.TooWideUpper = true } } diff --git a/core/execution/amm/estimator_test.go b/core/execution/amm/estimator_test.go index 07d6c6115e..0355b8c022 100644 --- a/core/execution/amm/estimator_test.go +++ b/core/execution/amm/estimator_test.go @@ -118,6 +118,7 @@ func TestEstimate(t *testing.T) { riskFactorLong, num.DecimalOne(), num.DecimalOne(), + 0, ) assert.Equal(t, expectedMetrics.PositionSizeAtUpper.String(), metrics.PositionSizeAtUpper.Round(3).String()) @@ -161,6 +162,7 @@ func TestEstimate(t *testing.T) { riskFactorLong, num.DecimalOne(), num.DecimalOne(), + 0, ) assert.Equal(t, expectedMetrics.PositionSizeAtUpper.String(), metrics.PositionSizeAtUpper.Round(3).String()) @@ -205,6 +207,7 @@ func TestEstimatePositionFactor(t *testing.T) { riskFactorLong, num.DecimalFromInt64(1000000000000000000), num.DecimalOne(), + 0, ) assert.Equal(t, expectedMetrics.PositionSizeAtUpper.String(), metrics.PositionSizeAtUpper.Round(3).String()) @@ -220,17 +223,18 @@ func TestEstimatePositionFactor(t *testing.T) { upperPrice, leverageLower, leverageUpper, - num.UintOne(), + num.MustUintFromString("390500000000000000000", 10), linearSlippageFactor, initialMargin, riskFactorShort, riskFactorLong, num.DecimalFromInt64(1000000000000000000), num.DecimalOne(), + 10, ) - assert.Equal(t, "0", metrics.PositionSizeAtUpper.Round(3).String()) - assert.Equal(t, "0", metrics.PositionSizeAtLower.Round(3).String()) - assert.True(t, metrics.TooWideLower) - assert.True(t, metrics.TooWideUpper) + assert.Equal(t, "-1.559", metrics.PositionSizeAtUpper.Round(3).String()) + assert.Equal(t, "2.305", metrics.PositionSizeAtLower.Round(3).String()) + assert.False(t, metrics.TooWideLower) // is valid as there are less than 10 empty price levels + assert.True(t, metrics.TooWideUpper) // isn't valid as there are more than 10 empty price levels } diff --git a/core/execution/amm/pool.go b/core/execution/amm/pool.go index ba10a3a1a7..7b25b87ace 100644 --- a/core/execution/amm/pool.go +++ b/core/execution/amm/pool.go @@ -47,26 +47,6 @@ type curve struct { sqrtHigh num.Decimal } -func (c *curve) volumeBetweenPrices(sqrt sqrtFn, st, nd *num.Uint) uint64 { - if c.l.IsZero() || c.empty { - return 0 - } - - st = num.Max(st, c.low) - nd = num.Min(nd, c.high) - - if st.GTE(nd) { - return 0 - } - - stP := impliedPosition(sqrt(st), c.sqrtHigh, c.l) - ndP := impliedPosition(sqrt(nd), c.sqrtHigh, c.l) - - // abs(P(st) - P(nd)) - volume := stP.Sub(ndP).Abs() - return uint64(volume.IntPart()) -} - // positionAtPrice returns the position of the AMM if its fair-price were the given price. This // will be signed for long/short as usual. func (c *curve) positionAtPrice(sqrt sqrtFn, price *num.Uint) int64 { @@ -80,6 +60,66 @@ func (c *curve) positionAtPrice(sqrt sqrtFn, price *num.Uint) int64 { return -c.pv.Sub(pos).IntPart() } +// singleVolumePrice returns the price that is 1 volume away from the given price in the given direction. +// If the AMM's commitment is low this may be more than one-tick away from `p`. +func (c *curve) singleVolumePrice(sqrt sqrtFn, p *num.Uint, side types.Side) *num.Uint { + if c.empty { + panic("should not be calculating single-volume step on empty curve") + } + + // for best buy: (L * sqrt(pu) / (L + sqrt(pu)))^2 + // for best sell: (L * sqrt(pu) / (L - sqrt(pu)))^2 + var denom num.Decimal + if side == types.SideBuy { + denom = c.l.Add(sqrt(p)) + } else { + denom = c.l.Sub(sqrt(p)) + } + + np := c.l.Mul(sqrt(p)).Div(denom) + np = np.Mul(np) + + if side == types.SideSell { + // have to make sure we round away `p` + np = np.Ceil() + } + + adj, _ := num.UintFromDecimal(np) + return adj +} + +// singleVolumeDelta returns the price interval between p and the price that represents 1 volume movement. +func (c *curve) singleVolumeDelta(sqrt sqrtFn, p *num.Uint, side types.Side) *num.Uint { + adj := c.singleVolumePrice(sqrt, p, side) + delta, _ := num.UintZero().Delta(p, adj) + return delta +} + +// check will return an error is the curve contains too many price-levels where there is 0 volume. +func (c *curve) check(sqrt sqrtFn, oneTick *num.Uint, allowedEmptyLevels uint64) error { + if c.empty { + return nil + } + + if c.pv.LessThan(num.DecimalOne()) { + return ErrCommitmentTooLow + } + + // curve is valid if + // n * oneTick > pu - (L * sqrt(pu) / (L + sqrt(pu)))^2 + adj := c.singleVolumePrice(sqrt, c.high, types.SideBuy) + delta := num.UintZero().Sub(c.high, adj) + + // the plus one is because if allowable empty levels is 0, then the biggest delta allowed is 1 + maxDelta := num.UintZero().Mul(oneTick, num.NewUint(allowedEmptyLevels+1)) + + // now this price delta must be less that the given maximum + if delta.GT(maxDelta) { + return ErrCommitmentTooLow + } + return nil +} + type Pool struct { log *logging.Logger ID string @@ -133,6 +173,7 @@ func NewPool( priceFactor num.Decimal, positionFactor num.Decimal, maxCalculationLevels *num.Uint, + allowedEmptyAMMLevels uint64, ) (*Pool, error) { oneTick, _ := num.UintFromDecimal(priceFactor) pool := &Pool{ @@ -155,7 +196,7 @@ func NewPool( maxCalculationLevels: maxCalculationLevels, fpCache: map[int64]*num.Uint{}, } - err := pool.setCurves(rf, sf, linearSlippage) + err := pool.setCurves(rf, sf, linearSlippage, allowedEmptyAMMLevels) if err != nil { return nil, err } @@ -337,6 +378,7 @@ func (p *Pool) Update( rf *types.RiskFactor, sf *types.ScalingFactors, linearSlippage num.Decimal, + allowedEmptyAMMLevels uint64, ) (*Pool, error) { commitment := p.Commitment.Clone() if amend.CommitmentAmount != nil { @@ -384,7 +426,7 @@ func (p *Pool) Update( maxCalculationLevels: p.maxCalculationLevels, fpCache: map[int64]*num.Uint{}, } - if err := updated.setCurves(rf, sf, linearSlippage); err != nil { + if err := updated.setCurves(rf, sf, linearSlippage, allowedEmptyAMMLevels); err != nil { return nil, err } @@ -497,6 +539,7 @@ func (p *Pool) setCurves( rfs *types.RiskFactor, sfs *types.ScalingFactors, linearSlippage num.Decimal, + allowedEmptyAMMLevels uint64, ) error { // convert the bounds into asset precision base, _ := num.UintFromDecimal(p.Parameters.Base.ToDecimal().Mul(p.priceFactor)) @@ -518,10 +561,8 @@ func (p *Pool) setCurves( true, ) - highPriceMinusOne := num.UintZero().Sub(p.lower.high, p.oneTick) - // verify that the lower curve maintains sufficient volume from highPrice - 1 to the end of the curve. - if p.lower.volumeBetweenPrices(p.sqrt, highPriceMinusOne, p.lower.high) < 1 { - return fmt.Errorf("insufficient commitment - less than one volume at price levels on lower curve") + if err := p.lower.check(p.sqrt, p.oneTick.Clone(), allowedEmptyAMMLevels); err != nil { + return err } } @@ -540,10 +581,9 @@ func (p *Pool) setCurves( false, ) - highPriceMinusOne := num.UintZero().Sub(p.upper.high, p.oneTick) - // verify that the upper curve maintains sufficient volume from highPrice - 1 to the end of the curve. - if p.upper.volumeBetweenPrices(p.sqrt, highPriceMinusOne, p.upper.high) < 1 { - return fmt.Errorf("insufficient commitment - less than one volume at price levels on upper curve") + // lets find an interval that represents one volume, it might be a sparse curve + if err := p.upper.check(p.sqrt, p.oneTick.Clone(), allowedEmptyAMMLevels); err != nil { + return err } } @@ -570,7 +610,7 @@ func (p *Pool) PriceForVolume(volume uint64, side types.Side) *num.Uint { volume, side, p.getPosition(), - p.fairPrice(), + p.FairPrice(), ) } @@ -608,6 +648,7 @@ func (p *Pool) TradableVolumeInRange(side types.Side, price1 *num.Uint, price2 * if !p.canTrade(side) { return 0 } + pos := p.getPosition() st, nd := price1, price2 @@ -758,7 +799,7 @@ func (p *Pool) getPosition() int64 { // // this transformation is needed since for each curve its virtual position is 0 at the lower bound which maps to the Vega position when the pool is // long, but when the pool is short Vega position == 0 at the upper bounds and -ve at the lower. -func (p *Pool) fairPrice() *num.Uint { +func (p *Pool) FairPrice() *num.Uint { pos := p.getPosition() if pos == 0 { // if no position fair price is base price @@ -880,19 +921,37 @@ func (p *Pool) virtualBalances(pos int64, fp *num.Uint, side types.Side) (num.De } } -// BestPrice returns the price that the pool is willing to trade for the given order side. -func (p *Pool) BestPrice(order *types.Order) *num.Uint { - fairPrice := p.fairPrice() - switch { - case order == nil: - // special case where we've been asked for a fair price - return fairPrice - case order.Side == types.SideBuy: - // incoming is a buy, so we +1 to the fair price - return fairPrice.AddSum(p.oneTick) - case order.Side == types.SideSell: - // incoming is a sell so we - 1 the fair price - return fairPrice.Sub(fairPrice, p.oneTick) +// BestPrice returns the AMM's quote price on the given side. If the AMM's position is fully at a boundary +// then there is no quote price on that side and false is returned. +func (p *Pool) BestPrice(side types.Side) (*num.Uint, bool) { + pos := p.getPosition() + fairPrice := p.FairPrice() + + switch side { + case types.SideSell: + cu := p.lower + if pos <= 0 { + cu = p.upper + // we're short, and want the sell quote price, if we're at the boundary there is not volume left + if p.closing() || num.AbsV(pos) >= cu.pv.IntPart() { + return nil, false + } + } + + np := cu.singleVolumePrice(p.sqrt, fairPrice, side) + return num.Min(p.upper.high, num.Max(np, fairPrice.AddSum(p.oneTick))), true + case types.SideBuy: + cu := p.upper + if pos >= 0 { + cu = p.lower + // we're long, and want the buy quote price, if we're at the boundary there is not volume left + if p.closing() || pos >= cu.pv.IntPart() { + return nil, false + } + } + + np := cu.singleVolumePrice(p.sqrt, fairPrice, side) + return num.Max(p.lower.low, num.Min(np, num.UintZero().Sub(fairPrice, p.oneTick))), true default: panic("should never reach here") } diff --git a/core/execution/amm/pool_test.go b/core/execution/amm/pool_test.go index e20f2c6e77..bd3db4c96d 100644 --- a/core/execution/amm/pool_test.go +++ b/core/execution/amm/pool_test.go @@ -41,6 +41,7 @@ func TestAMMPool(t *testing.T) { t.Run("test one sided pool", testOneSidedPool) t.Run("test near zero volume curve triggers and error", testNearZeroCurveErrors) t.Run("test volume between prices when closing", testTradeableVolumeInRangeClosing) + t.Run("test sparse AMM", testSparseAMM) } func testTradeableVolumeInRange(t *testing.T) { @@ -337,12 +338,13 @@ func TestTradeableVolumeWhenAtBoundary(t *testing.T) { num.DecimalFromInt64(1000), num.DecimalFromFloat(10000000000000000), submit, + 0, ) defer p.ctrl.Finish() // when position is zero fair-price should be the base ensurePositionN(t, p.pos, 0, num.UintZero(), 2) - fp := p.pool.BestPrice(nil) + fp := p.pool.FairPrice() assert.Equal(t, "6765400000000000000000", fp.String()) fullLong := 12546 @@ -353,7 +355,7 @@ func TestTradeableVolumeWhenAtBoundary(t *testing.T) { // now lets pretend the AMM has fully traded out in that direction, best price will be near but not quite the lower bound ensurePositionN(t, p.pos, int64(fullLong), num.UintZero(), 2) - fp = p.pool.BestPrice(nil) + fp = p.pool.FairPrice() assert.Equal(t, "6712721893865935337785", fp.String()) assert.True(t, fp.GTE(num.MustUintFromString("6712720000000000000000", 10))) @@ -378,7 +380,7 @@ func testPoolPositionFactor(t *testing.T) { ensurePositionN(t, p.pos, -1, num.NewUint(2000), 1) // now best price should be the same as if the factor were 1, since its a price and not a volume - fairPrice := p.pool.BestPrice(nil) + fairPrice := p.pool.FairPrice() assert.Equal(t, "2001", fairPrice.String()) } @@ -389,55 +391,45 @@ func testBestPrice(t *testing.T) { tests := []struct { name string position int64 - balance uint64 expectedPrice string - order *types.Order + side types.Side }{ { - name: "best price is base price when position is zero", + name: "best price sell", expectedPrice: "2000", + position: 1, + side: types.SideSell, }, { - name: "best price positive position", - expectedPrice: "1999", + name: "best price buy", + expectedPrice: "1998", position: 1, - balance: 100000, + side: types.SideBuy, }, - { - name: "fair price negative position", - expectedPrice: "2001", - position: -1, - balance: 100000, + name: "best price buy, amm fully long", + expectedPrice: "", + position: 702, + side: types.SideBuy, }, { - name: "best price incoming buy", - expectedPrice: "2000", - position: 1, - balance: 100000, - order: &types.Order{ - Side: types.SideBuy, - Size: 1, - }, - }, - { - name: "best price incoming buy", - expectedPrice: "1998", - position: 1, - balance: 100000, - order: &types.Order{ - Side: types.SideSell, - Size: 1, - }, + name: "best price sell, amm fully short", + expectedPrice: "", + position: -635, + side: types.SideSell, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - order := tt.order - ensurePosition(t, p.pos, tt.position, num.UintZero()) - fairPrice := p.pool.BestPrice(order) - assert.Equal(t, tt.expectedPrice, fairPrice.String()) + ensurePositionN(t, p.pos, tt.position, num.UintZero(), 2) + quote, ok := p.pool.BestPrice(tt.side) + if tt.expectedPrice == "" { + assert.False(t, ok) + } else { + assert.True(t, ok) + require.Equal(t, tt.expectedPrice, quote.String()) + } }) } } @@ -465,18 +457,18 @@ func testOneSidedPool(t *testing.T) { // fair price at 0 position is still ok ensurePosition(t, p.pos, 0, num.UintZero()) - price := p.pool.BestPrice(nil) + price := p.pool.FairPrice() assert.Equal(t, "2000", price.String()) // fair price at short position is still ok ensurePosition(t, p.pos, -10, num.UintZero()) - price = p.pool.BestPrice(nil) + price = p.pool.FairPrice() assert.Equal(t, "2003", price.String()) // fair price when long should panic since AMM should never be able to get into that state // fair price at short position is still ok ensurePosition(t, p.pos, 10, num.UintZero()) - assert.Panics(t, func() { p.pool.BestPrice(nil) }) + assert.Panics(t, func() { p.pool.FairPrice() }) } func testNearZeroCurveErrors(t *testing.T) { @@ -500,7 +492,7 @@ func testNearZeroCurveErrors(t *testing.T) { // test that creating a pool with a near zero volume curve will error pool, err := newBasicPoolWithSubmit(t, submit) assert.Nil(t, pool) - assert.ErrorContains(t, err, "insufficient commitment - less than one volume at price levels on lower curve") + assert.ErrorContains(t, err, "commitment amount too low") // test that a pool with higher commitment amount will not error submit.CommitmentAmount = num.NewUint(100000) @@ -518,20 +510,44 @@ func testNearZeroCurveErrors(t *testing.T) { amend, &types.RiskFactor{Short: num.DecimalFromFloat(0.02), Long: num.DecimalFromFloat(0.02)}, &types.ScalingFactors{InitialMargin: num.DecimalFromFloat(1.25)}, - num.DecimalZero(), + num.DecimalZero(), 0, ) - assert.ErrorContains(t, err, "insufficient commitment - less than one volume at price levels on lower curve") + assert.ErrorContains(t, err, "commitment amount too low") amend.CommitmentAmount = num.NewUint(1000000) _, err = pool.Update( amend, &types.RiskFactor{Short: num.DecimalFromFloat(0.02), Long: num.DecimalFromFloat(0.02)}, &types.ScalingFactors{InitialMargin: num.DecimalFromFloat(1.25)}, - num.DecimalZero(), + num.DecimalZero(), 0, ) assert.NoError(t, err) } +func testSparseAMM(t *testing.T) { + baseCmd := types.AMMBaseCommand{ + Party: vgcrypto.RandomHash(), + MarketID: vgcrypto.RandomHash(), + SlippageTolerance: num.DecimalFromFloat(0.1), + } + + submit := &types.SubmitAMM{ + AMMBaseCommand: baseCmd, + CommitmentAmount: num.NewUint(1000), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: num.NewUint(1900), + LowerBound: num.NewUint(1800), + UpperBound: num.NewUint(2000), + LeverageAtLowerBound: ptr.From(num.DecimalFromFloat(50)), + LeverageAtUpperBound: ptr.From(num.DecimalFromFloat(50)), + }, + } + // test that creating a pool with a near zero volume curve will error + pool, err := newBasicPoolWithSubmit(t, submit) + assert.Nil(t, pool) + assert.ErrorContains(t, err, "commitment amount too low") +} + func assertOrderPrices(t *testing.T, orders []*types.Order, side types.Side, st, nd int) { t.Helper() require.Equal(t, nd-st+1, len(orders)) @@ -574,6 +590,7 @@ func newBasicPoolWithSubmit(t *testing.T, submit *types.SubmitAMM) (*Pool, error num.DecimalOne(), num.DecimalOne(), num.NewUint(10000), + 0, ) } @@ -656,11 +673,11 @@ func TestNotebook(t *testing.T) { assert.Equal(t, int(306), int(volume)) ensurePosition(t, p.pos, -500, upmid.Clone()) - fairPrice := p.pool.BestPrice(nil) + fairPrice := p.pool.FairPrice() assert.Equal(t, "2155", fairPrice.String()) ensurePosition(t, p.pos, 500, lowmid.Clone()) - fairPrice = p.pool.BestPrice(nil) + fairPrice = p.pool.FairPrice() assert.Equal(t, "1854", fairPrice.String()) // fair price is 2000 and the AMM quotes a best-buy at 1999 so incoming SELL should have a price <= 1999 @@ -689,15 +706,15 @@ func newTestPool(t *testing.T) *tstPool { func newTestPoolWithRanges(t *testing.T, low, base, high *num.Uint) *tstPool { t.Helper() - return newTestPoolWithOpts(t, num.DecimalOne(), low, base, high) + return newTestPoolWithOpts(t, num.DecimalOne(), low, base, high, num.NewUint(100000), 0) } func newTestPoolWithPositionFactor(t *testing.T, positionFactor num.Decimal) *tstPool { t.Helper() - return newTestPoolWithOpts(t, positionFactor, num.NewUint(1800), num.NewUint(2000), num.NewUint(2200)) + return newTestPoolWithOpts(t, positionFactor, num.NewUint(1800), num.NewUint(2000), num.NewUint(2200), num.NewUint(100000), 0) } -func newTestPoolWithOpts(t *testing.T, positionFactor num.Decimal, low, base, high *num.Uint) *tstPool { +func newTestPoolWithOpts(t *testing.T, positionFactor num.Decimal, low, base, high *num.Uint, commitment *num.Uint, allowedEmptyAMMLevels uint64) *tstPool { t.Helper() ctrl := gomock.NewController(t) col := mocks.NewMockCollateral(ctrl) @@ -712,7 +729,7 @@ func newTestPoolWithOpts(t *testing.T, positionFactor num.Decimal, low, base, hi SlippageTolerance: num.DecimalFromFloat(0.1), }, // 0000000000000 - CommitmentAmount: num.NewUint(100000), + CommitmentAmount: commitment, Parameters: &types.ConcentratedLiquidityParameters{ Base: base, LowerBound: low, @@ -742,6 +759,7 @@ func newTestPoolWithOpts(t *testing.T, positionFactor num.Decimal, low, base, hi num.DecimalOne(), positionFactor, num.NewUint(100000), + allowedEmptyAMMLevels, ) assert.NoError(t, err) @@ -754,7 +772,7 @@ func newTestPoolWithOpts(t *testing.T, positionFactor num.Decimal, low, base, hi } } -func newTestPoolWithSubmission(t *testing.T, positionFactor, priceFactor num.Decimal, submit *types.SubmitAMM) *tstPool { +func newTestPoolWithSubmission(t *testing.T, positionFactor, priceFactor num.Decimal, submit *types.SubmitAMM, allowedEmptyAMMLevels uint64) *tstPool { t.Helper() ctrl := gomock.NewController(t) col := mocks.NewMockCollateral(ctrl) @@ -778,12 +796,13 @@ func newTestPoolWithSubmission(t *testing.T, positionFactor, priceFactor num.Dec &types.ScalingFactors{ InitialMargin: num.DecimalFromFloat(1.5), // this is 1/0.8 which is margin_usage_at_bound_above in the note-book }, - num.DecimalFromFloat(0.001), + num.DecimalFromFloat(0), priceFactor, positionFactor, num.NewUint(1000), + allowedEmptyAMMLevels, ) - assert.NoError(t, err) + require.NoError(t, err) return &tstPool{ submission: submit, diff --git a/core/execution/amm/shape.go b/core/execution/amm/shape.go index 837000785a..f27f5ca9ee 100644 --- a/core/execution/amm/shape.go +++ b/core/execution/amm/shape.go @@ -30,7 +30,9 @@ type shapeMaker struct { pos int64 // the AMM's current position fairPrice *num.Uint // the AMM's fair-price - step *num.Uint // price step we will be taking as we walk over the curves + stepLower *num.Uint // price step we will be taking as we walk over the lower curve + stepHigher *num.Uint // price step we will be taking as we walk over the upper curve + approx bool // whether we are taking approximate steps oneTick *num.Uint // one price level tick which may be bigger than one given the markets price factor @@ -40,6 +42,9 @@ type shapeMaker struct { from *num.Uint // the adjusted start region i.e the input region capped to the AMM's bounds to *num.Uint // the adjusted end region + + fromLower bool // whether the price at "from" evaluates on the lower or upper curve of the AMM + toLower bool // whether the price at "to" evaluates on the lower or upper curve of the AMM } func newShapeMaker(log *logging.Logger, p *Pool, from, to *num.Uint, idgen *idgeneration.IDGenerator) *shapeMaker { @@ -50,13 +55,13 @@ func newShapeMaker(log *logging.Logger, p *Pool, from, to *num.Uint, idgen *idge log: log, pool: p, pos: p.getPosition(), - fairPrice: p.fairPrice(), + fairPrice: p.FairPrice(), buys: buys, sells: sells, from: from.Clone(), to: to.Clone(), side: types.SideBuy, - oneTick: p.oneTick.Clone(), + oneTick: p.oneTick, idgen: idgen, } } @@ -86,11 +91,29 @@ func (sm *shapeMaker) appendOrder(o *types.Order) { // makeBoundaryOrder creates an accurrate order for the given one-tick interval which will exist at the edges // of the adjusted expansion region. -func (sm *shapeMaker) makeBoundaryOrder(st, nd *num.Uint) *types.Order { +func (sm *shapeMaker) makeBoundaryOrder(price *num.Uint, start bool) *types.Order { // lets do the starting boundary order - cu := sm.pool.lower - if st.GTE(sm.pool.lower.high) { - cu = sm.pool.upper + cu := sm.pool.upper + if start && sm.fromLower { + cu = sm.pool.lower + } + + if !start && sm.toLower { + cu = sm.pool.lower + } + + var st, nd *num.Uint + if start { + // step inwards + step := num.Max(sm.oneTick, cu.singleVolumeDelta(sm.pool.sqrt, price, types.SideSell)) + + sm.from.Add(price, step) + st, nd = price, sm.from + } else { + step := num.Max(sm.oneTick, cu.singleVolumeDelta(sm.pool.sqrt, price, types.SideBuy)) + + sm.to.Sub(price, step) + st, nd = sm.to, price } // if one of the boundaries it equal to the fair-price then the equivalent position @@ -105,15 +128,13 @@ func (sm *shapeMaker) makeBoundaryOrder(st, nd *num.Uint) *types.Order { ndPosition = cu.positionAtPrice(sm.pool.sqrt, nd) } - volume := num.DeltaV( - stPosition, - ndPosition, - ) + // for sparse AMM's there may be some precision loss in going from price -> position + // we by construction is should be at least one, we so make sure it is. + volume := num.MaxV(1, num.DeltaV(stPosition, ndPosition)) if st.GTE(sm.fairPrice) { return sm.pool.makeOrder(uint64(volume), nd, types.SideSell, sm.idgen) } - return sm.pool.makeOrder(uint64(volume), st, types.SideBuy, sm.idgen) } @@ -131,17 +152,7 @@ func (sm *shapeMaker) calculateBoundaryOrders() (*types.Order, *types.Order) { // - the expansion region is too large and we have to limit calculations and approximate orders // - the expansion region isn't divisible by `oneTick` and so we have to merge a sub-tick step in with the previous - st := sm.from.Clone() - nd := sm.to.Clone() - - sm.from.Add(st, sm.oneTick) - sm.to.Sub(nd, sm.oneTick) - - if sm.from.GTE(sm.fairPrice) { - sm.side = types.SideSell - } - - bnd1 := sm.makeBoundaryOrder(st, sm.from) + bnd1 := sm.makeBoundaryOrder(sm.from.Clone(), true) if sm.log.IsDebug() { sm.log.Debug("created boundary order", @@ -152,7 +163,7 @@ func (sm *shapeMaker) calculateBoundaryOrders() (*types.Order, *types.Order) { ) } - bnd2 := sm.makeBoundaryOrder(sm.to, nd) + bnd2 := sm.makeBoundaryOrder(sm.to.Clone(), false) if sm.log.IsDebug() { sm.log.Debug("created boundary order", @@ -163,29 +174,67 @@ func (sm *shapeMaker) calculateBoundaryOrders() (*types.Order, *types.Order) { ) } + if sm.from.GTE(sm.fairPrice) { + sm.side = types.SideSell + } + return bnd1, bnd2 } +func (sm *shapeMaker) calculateVolumeTick() *num.Uint { + lowerTick := num.UintZero() + upperTick := num.UintZero() + + pool := sm.pool + if !pool.lower.empty { + lowerTick = pool.lower.singleVolumeDelta(pool.sqrt, pool.lower.high, types.SideBuy) + sm.stepLower = num.Max(sm.oneTick, lowerTick) + } + + if !pool.upper.empty { + upperTick = pool.upper.singleVolumeDelta(pool.sqrt, pool.upper.high, types.SideBuy) + sm.stepHigher = num.Max(sm.oneTick, upperTick) + } + + volumeTick := num.Max(lowerTick, upperTick) + if volumeTick.GT(sm.oneTick) { + return volumeTick + } + + return sm.oneTick.Clone() +} + // calculateStepSize looks at the size of the expansion region and increases the step size if it is too large. func (sm *shapeMaker) calculateStepSize() { + // first we check if it is a sparse AMM, since if it is our accurate step size will be bigger than one tick + // work out the minimum price delta to cover one volume, and if thats bigger than oneTick + // set oneTick to that. This is for sparse AMM's where there might be less than one volume + // between price levels + + volumeTick := sm.calculateVolumeTick() delta, _ := num.UintZero().Delta(sm.from, sm.to) - delta.Div(delta, sm.oneTick) - sm.step = sm.oneTick.Clone() + + delta1 := num.UintOne().Div(delta, sm.oneTick) + deltav := num.UintOne().Div(delta, volumeTick) // if taking steps of one-tick doesn't breach the max-calculation levels then we can happily expand accurately - if delta.LTE(sm.pool.maxCalculationLevels) { + if deltav.LTE(sm.pool.maxCalculationLevels) { return } // if the expansion region is too wide, we need to approximate with bigger steps - sm.step.Div(delta, sm.pool.maxCalculationLevels) - sm.step.AddSum(num.UintOne()) // if delta / maxcals = 1.9 we're going to want steps of 2 - sm.step.Mul(sm.step, sm.oneTick) + + step := num.UintZero().Div(delta1, sm.pool.maxCalculationLevels) + step.AddSum(num.UintOne()) // if delta / maxcals = 1.9 we're going to want steps of 2 + step.Mul(step, sm.oneTick) + sm.approx = true + sm.stepLower = step + sm.stepHigher = step.Clone() if sm.log.IsDebug() { sm.log.Debug("approximating orderbook expansion", - logging.String("step", sm.step.String()), + logging.String("step", step.String()), logging.String("pool-party", sm.pool.AMMParty), ) } @@ -226,15 +275,19 @@ func (sm *shapeMaker) expandCurve(cu *curve, from, to *num.Uint) { from = num.Max(from, cu.low) to = num.Min(to, cu.high) + step := sm.stepHigher + if cu.isLower { + step = sm.stepLower + } + // the price we have currently stepped to and the position of the AMM at that price current := from position := cu.positionAtPrice(sm.pool.sqrt, current) - fairPrice := sm.fairPrice for current.LT(to) && current.LT(cu.high) { // take the next step - next := num.UintZero().AddSum(current, sm.step) + next := num.UintZero().AddSum(current, step) if sm.log.IsDebug() { sm.log.Debug("step taken", @@ -342,18 +395,49 @@ func (sm *shapeMaker) adjustRegion() bool { return false } + // work out which curve from/to will lie in + base := sm.pool.lower.high + + sm.fromLower = from.LT(base) + + if from.EQ(base) { + // if we're equal to base and equal to fair-price then we want the upper curve because + // we're matching forward so will want volume from base -> base +1 + sm.fromLower = sm.from.GT(sm.fairPrice) + } + sm.toLower = to.LT(base) + if to.EQ(base) { + // if we're equal to base and equal to fair-price then we want the lower curve because + // we're matching forward so will want to end at base - 1 -> base + sm.toLower = sm.to.GTE(sm.fairPrice) + } + switch { case sm.from.GT(sm.fairPrice): // if we are expanding entirely in the sell range to calculate the order at price `from` // we need to ask the AMM for volume in the range `from - 1 -> from` so we simply // sub one here to cover than. sm.side = types.SideSell - from.Sub(from, sm.oneTick) + + cu := sm.pool.upper + if sm.fromLower { + cu = sm.pool.lower + } + + step := num.Max(sm.oneTick, cu.singleVolumeDelta(sm.pool.sqrt, from, types.SideBuy)) + from.Sub(from, step) case to.LT(sm.fairPrice): // if we are expanding entirely in the buy range to calculate the order at price `to` // we need to ask the AMM for volume in the range `to -> to + 1` so we simply // add one here to cover than. - to.Add(to, sm.oneTick) + + cu := sm.pool.upper + if sm.toLower { + cu = sm.pool.lower + } + + step := num.Max(sm.oneTick, cu.singleVolumeDelta(sm.pool.sqrt, to, types.SideSell)) + to.Add(to, step) case from.EQ(sm.fairPrice): // if we are starting the expansion at the fair-price all orders will be sells sm.side = types.SideSell diff --git a/core/execution/amm/shape_test.go b/core/execution/amm/shape_test.go index 57e0916f74..d9b805fdcd 100644 --- a/core/execution/amm/shape_test.go +++ b/core/execution/amm/shape_test.go @@ -19,7 +19,9 @@ import ( "testing" "code.vegaprotocol.io/vega/core/types" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -109,7 +111,7 @@ func testOrderbookShapeLong(t *testing.T) { // AMM is long and will have a fair-price of 8 position := int64(17980) ensurePosition(t, p.pos, position, num.UintZero()) - require.Equal(t, "8", p.pool.BestPrice(nil).String()) + require.Equal(t, "8", p.pool.FairPrice().String()) // range [7, 10] with have buy order (7) and sell orders (9, 10) ensurePositionN(t, p.pos, position, num.UintZero(), 2) @@ -147,7 +149,7 @@ func testOrderbookShapeShort(t *testing.T) { // AMM is short and will have a fair-price of 12 position := int64(-20000) ensurePosition(t, p.pos, position, num.UintZero()) - require.Equal(t, "12", p.pool.BestPrice(nil).String()) + require.Equal(t, "12", p.pool.FairPrice().String()) // range [7, 10] with have buy order (7,8,9,10) ensurePositionN(t, p.pos, position, num.UintZero(), 2) @@ -217,7 +219,7 @@ func testOrderbookShapeStepOverFairPrice(t *testing.T) { position := int64(6000) p.pool.maxCalculationLevels = num.NewUint(10) ensurePosition(t, p.pos, position, num.UintZero()) - require.Equal(t, "26", p.pool.BestPrice(nil).String()) + require.Equal(t, "26", p.pool.FairPrice().String()) ensurePositionN(t, p.pos, position, num.UintZero(), 2) buys, sells := p.pool.OrderbookShape(low, base, nil) @@ -283,7 +285,7 @@ func testOrderbookShapeReduceOnly(t *testing.T) { // AMM is long and will have a fair-price of 8 and so will only have orders from 8 -> base position = int64(17980) ensurePosition(t, p.pos, position, num.UintZero()) - require.Equal(t, "8", p.pool.BestPrice(nil).String()) + require.Equal(t, "8", p.pool.FairPrice().String()) // range [7, 13] will have only sellf orders (9, 10) ensurePositionN(t, p.pos, position, num.UintZero(), 2) @@ -294,7 +296,7 @@ func testOrderbookShapeReduceOnly(t *testing.T) { // AMM is short and will have a fair-price of 12 position = int64(-20000) ensurePosition(t, p.pos, position, num.UintZero()) - require.Equal(t, "12", p.pool.BestPrice(nil).String()) + require.Equal(t, "12", p.pool.FairPrice().String()) // range [10, 13] with have buy orders (10, 11) ensurePositionN(t, p.pos, position, num.UintZero(), 2) @@ -336,6 +338,7 @@ func testOrderbookSubTick(t *testing.T) { UpperBound: num.NewUint(20), }, }, + 0, ) defer p.ctrl.Finish() @@ -344,10 +347,10 @@ func testOrderbookSubTick(t *testing.T) { p.pool.maxCalculationLevels = num.NewUint(1000) position := int64(1000) - ensurePositionN(t, p.pos, position, num.UintZero(), 3) + ensurePositionN(t, p.pos, position, num.UintZero(), 4) // fair-price should be 1483, and so best buy should be 1383 (fair-price minus one-tick) - bp := p.pool.BestPrice(&types.Order{Side: types.SideSell}) + bp, _ := p.pool.BestPrice(types.SideBuy) require.Equal(t, "1383", bp.String()) // now pretend we are in auction and we have a sell order at 1000, so we need to expand the crossed @@ -372,6 +375,7 @@ func testClosingCloseToBase(t *testing.T) { UpperBound: num.NewUint(20), }, }, + 0, ) defer p.ctrl.Finish() @@ -450,3 +454,97 @@ func testPointExpansionAtFairPrice(t *testing.T) { assert.Equal(t, 0, len(buys)) assert.Equal(t, 0, len(sells)) } + +func TestOrderbookShapeSparseAMM(t *testing.T) { + p := newTestPoolWithOpts(t, num.DecimalOne(), num.NewUint(99), num.NewUint(198), num.NewUint(297), num.NewUint(1000), 100) + + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + // when range [99, 198] expect orders at ticks of 9 from 99 -> 189 + // there will be no order at price 200 since that is the pools fair-price and it quotes +/-1 eitherside + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assert.Equal(t, 14, len(buys)) + assert.Equal(t, 0, len(sells)) + + // check boundary orders + assert.Equal(t, "99", buys[0].Price.String()) + assert.Equal(t, "191", buys[(len(buys)-1)].Price.String()) + + // when range [99, 191] expect orders at prices 100 -> 191 + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, num.NewUint(189), nil) + assert.Equal(t, 14, len(buys)) + assert.Equal(t, 0, len(sells)) + + // check boundary orders + assert.Equal(t, "99", buys[0].Price.String()) + assert.Equal(t, "189", buys[(len(buys)-1)].Price.String()) + + // when range [198, 297] expect orders at prices 207 -> 297 + // there will be no order at price 198 since that is the pools fair-price and it quotes +/-1 eitherside + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 12, len(sells)) + + // check boundary orders + assert.Equal(t, "203", sells[0].Price.String()) + assert.Equal(t, "297", sells[(len(sells)-1)].Price.String()) + + // when range [207, 297] expect orders at prices 207 -> 297 + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(207), high, nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 11, len(sells)) + + // check boundary orders + assert.Equal(t, "207", sells[0].Price.String()) + assert.Equal(t, "297", sells[(len(sells)-1)].Price.String()) + + // range (8, 8) should return a single buy order at price 8, which is a bit counter intuitive + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(117), num.NewUint(117), nil) + assertOrderPrices(t, buys, types.SideBuy, 117, 117) + assert.Equal(t, 0, len(sells)) + + // range (10, 10) should return only the orders at the fair-price, which is 0 orders + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(198), num.NewUint(198), nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 0, len(sells)) +} + +func TestOrderbookShapeSparseAMMBoundaryOrders(t *testing.T) { + submit := &types.SubmitAMM{ + AMMBaseCommand: types.AMMBaseCommand{ + Party: vgcrypto.RandomHash(), + MarketID: vgcrypto.RandomHash(), + SlippageTolerance: num.DecimalFromFloat(0.1), + }, + CommitmentAmount: num.MustUintFromString("5960289358452040000000", 10), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: num.NewUint(195836), + LowerBound: num.NewUint(92079), + UpperBound: num.NewUint(246109), + LeverageAtLowerBound: ptr.From(num.DecimalFromFloat(95.13295934001242)), + LeverageAtUpperBound: ptr.From(num.DecimalFromFloat(86.1204552842962)), + }, + } + p := newTestPoolWithSubmission(t, num.DecimalFromInt64(1000), num.DecimalFromFloat(10000000000000000), submit, 100) + defer p.ctrl.Finish() + + ensurePositionN(t, p.pos, 0, nil, -1) + buys, sells := p.pool.OrderbookShape( + num.MustUintFromString("1958381716019393098944", 10), + num.MustUintFromString("4897350000000000000000", 10), + nil, + ) + assert.Equal(t, 0, len(buys)) + require.Equal(t, "1958381716019393098944", sells[0].Price.String()) + require.Equal(t, "2461090000000000000000", sells[len(sells)-1].Price.String()) +} diff --git a/core/execution/future/market.go b/core/execution/future/market.go index 3ca2a7f455..d06e2a06fb 100644 --- a/core/execution/future/market.go +++ b/core/execution/future/market.go @@ -222,7 +222,19 @@ func NewMarket( asset := tradableInstrument.Instrument.Product.GetAsset() positionEngine := positions.NewSnapshotEngine(log, positionConfig, mkt.ID, broker) - ammEngine := amm.New(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, priceFactor, positionFactor, marketActivityTracker, parties) + ammEngine := amm.New( + log, + broker, + collateralEngine, + mkt.GetID(), + asset, + positionEngine, + priceFactor, + positionFactor, + marketActivityTracker, + parties, + mkt.AllowedEmptyAmmLevels, + ) // @TODO -> the raw auctionstate shouldn't be something exposed to the matching engine // as far as matching goes: it's either an auction or not @@ -651,6 +663,8 @@ func (m *Market) Update(ctx context.Context, config *types.Market, oracleEngine m.tsCalc.UpdateParameters(*m.mkt.LiquidityMonitoringParameters.TargetStakeParameters) m.pMonitor.UpdateSettings(m.tradableInstrument.RiskModel, m.mkt.PriceMonitoringSettings, m.as) m.liquidity.UpdateMarketConfig(m.tradableInstrument.RiskModel, m.pMonitor) + m.amm.UpdateAllowedEmptyLevels(m.mkt.AllowedEmptyAmmLevels) + if err := m.markPriceCalculator.UpdateConfig(ctx, oracleEngine, m.mkt.MarkPriceConfiguration); err != nil { m.markPriceCalculator.SetOraclePriceScalingFunc(m.scaleOracleData) return err @@ -1441,7 +1455,13 @@ func (m *Market) getNewPeggedPrice(order *types.Order) (*num.Uint, error) { } // we're converting both offset and tick size to asset decimals so we can adjust the price (in asset) directly - priceInMarket, _ := num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) + inMarketD := price.ToDecimal().Div(m.priceFactor) + + // if there are any decimals (because its an AMM price) then rounding down on a sell with 0 offset could cause a crossed book if the spread is small + if order.PeggedOrder.Reference == types.PeggedReferenceBestAsk { + inMarketD = inMarketD.Ceil() + } + priceInMarket, _ := num.UintFromDecimal(inMarketD) // if the pegged offset is zero and the reference price is non-tick size (from an AMM) then we have to move it so it // is otherwise the pegged will cross. @@ -1458,6 +1478,7 @@ func (m *Market) getNewPeggedPrice(order *types.Order) (*num.Uint, error) { if order.Side == types.SideSell { priceInMarket.AddSum(order.PeggedOrder.Offset) + // this can only happen when pegged to mid, in which case we want to round to the nearest *better* tick size // but this can never cross the mid by construction as the the minimum offset is 1 tick size and all prices must be // whole multiples of tick size. @@ -5355,7 +5376,7 @@ func (m *Market) getRebasingOrder( pool *amm.Pool, ) (*types.Order, error) { var volume uint64 - fairPrice := pool.BestPrice(nil) + fairPrice := pool.FairPrice() oneTick, _ := num.UintFromDecimal(m.priceFactor) oneTick = num.Max(num.UintOne(), oneTick) @@ -5504,7 +5525,7 @@ func (m *Market) SubmitAMM(ctx context.Context, submit *types.SubmitAMM, determi } // create a rebasing order if the AMM needs it i.e its base if not within best-bid/best-ask - if ok, side, quote := m.needsRebase(pool.BestPrice(nil)); ok { + if ok, side, quote := m.needsRebase(pool.FairPrice()); ok { order, err = m.getRebasingOrder(quote, side, submit.SlippageTolerance, pool) if err != nil { m.broker.Send( @@ -5593,7 +5614,7 @@ func (m *Market) AmendAMM(ctx context.Context, amend *types.AmendAMM, determinis }() var order *types.Order - if ok, side, quote := m.needsRebase(pool.BestPrice(nil)); ok { + if ok, side, quote := m.needsRebase(pool.FairPrice()); ok { order, err = m.getRebasingOrder(quote, side, amend.SlippageTolerance, pool) if err != nil { return err diff --git a/core/execution/future/market_snapshot.go b/core/execution/future/market_snapshot.go index bec64150d2..8aa58bc47e 100644 --- a/core/execution/future/market_snapshot.go +++ b/core/execution/future/market_snapshot.go @@ -96,9 +96,9 @@ func NewMarketFromSnapshot( var ammEngine *amm.Engine if em.Amm == nil { - ammEngine = amm.New(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, priceFactor, positionFactor, marketActivityTracker, parties) + ammEngine = amm.New(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, priceFactor, positionFactor, marketActivityTracker, parties, mkt.AllowedEmptyAmmLevels) } else { - ammEngine, err = amm.NewFromProto(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, em.Amm, priceFactor, positionFactor, marketActivityTracker, parties) + ammEngine, err = amm.NewFromProto(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, em.Amm, priceFactor, positionFactor, marketActivityTracker, parties, mkt.AllowedEmptyAmmLevels) if err != nil { return nil, err } diff --git a/core/governance/engine.go b/core/governance/engine.go index ece08bc28a..879626e5f9 100644 --- a/core/governance/engine.go +++ b/core/governance/engine.go @@ -1306,6 +1306,11 @@ func (e *Engine) updatedMarketFromProposal(p *proposal) (*types.Market, types.Pr return nil, types.ProposalErrorInvalidMarket, fmt.Errorf("market \"%s\" doesn't exist anymore", terms.MarketID) } + allowedEmptyAMMLevels := defaultAllowedEmptyAMMLevels + if terms.Changes.AllowedEmptyAmmLevels != nil { + allowedEmptyAMMLevels = *terms.Changes.AllowedEmptyAmmLevels + } + newMarket := &types.NewMarket{ Changes: &types.NewMarketConfiguration{ Instrument: &types.InstrumentConfiguration{ @@ -1325,6 +1330,7 @@ func (e *Engine) updatedMarketFromProposal(p *proposal) (*types.Market, types.Pr MarkPriceConfiguration: terms.Changes.MarkPriceConfiguration, TickSize: terms.Changes.TickSize, EnableTxReordering: terms.Changes.EnableTxReordering, + AllowedEmptyAmmLevels: &allowedEmptyAMMLevels, }, } diff --git a/core/governance/market.go b/core/governance/market.go index a173c48483..f770a59c4e 100644 --- a/core/governance/market.go +++ b/core/governance/market.go @@ -73,6 +73,8 @@ var ( ErrMaxPriceInvalid = errors.New("max price for capped future must be greater than zero") ) +const defaultAllowedEmptyAMMLevels = uint64(100) + func assignProduct( source *types.InstrumentConfiguration, target *types.Instrument, @@ -251,6 +253,12 @@ func buildMarketFromProposal( if definition.Changes.LiquidationStrategy != nil { lstrat = definition.Changes.LiquidationStrategy.DeepClone() } + + allowedEmptyAMMLevels := defaultAllowedEmptyAMMLevels + if definition.Changes.AllowedEmptyAmmLevels != nil { + allowedEmptyAMMLevels = *definition.Changes.AllowedEmptyAmmLevels + } + makerFeeDec, _ := num.DecimalFromString(makerFee) infraFeeDec, _ := num.DecimalFromString(infraFee) buybackFeeDec, _ := num.DecimalFromString(buybackFee) @@ -290,6 +298,7 @@ func buildMarketFromProposal( MarkPriceConfiguration: definition.Changes.MarkPriceConfiguration, TickSize: definition.Changes.TickSize, EnableTxReordering: definition.Changes.EnableTxReordering, + AllowedEmptyAmmLevels: allowedEmptyAMMLevels, } if fCap := market.TradableInstrument.Instrument.Product.Cap(); fCap != nil { marginCalc.FullyCollateralised = fCap.FullyCollateralised diff --git a/core/integration/features/amm/0090-VAMM-006-014.feature b/core/integration/features/amm/0090-VAMM-006-014.feature index c96d7d99ee..e14e4439f0 100644 --- a/core/integration/features/amm/0090-VAMM-006-014.feature +++ b/core/integration/features/amm/0090-VAMM-006-014.feature @@ -195,29 +195,29 @@ Feature: Ensure the vAMM positions follow the market correctly Scenario: 0090-VAMM-009: If other traders trade to move the market mid price to 85 the vAMM will post no further buy orders below this price, and the vAMM's position notional value will be equal to 4x its total account balance. When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | - | party4 | ETH/MAR22 | sell | 550 | 80 | 1 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | sell | 581 | 80 | 1 | TYPE_LIMIT | TIF_GTC | # AMM is at its bound so will have no orders below 85 so best bid will be 40 which is an LP order from the test setup # best offer will be 86 which is quoted from the pool Then the market data for the market "ETH/MAR22" should be: - | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | - | 100 | TRADING_MODE_CONTINUOUS | 22033 | 1000 | 551 | 100 | 63 | 63 | 86 | 40 | + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 63 | 63 | 86 | 40 | And the following trades should be executed: | buyer | price | size | seller | is amm | - | vamm1-id | 92 | 550 | party4 | true | + | vamm1-id | 92 | 581 | party4 | true | When the network moves ahead "1" blocks Then the parties should have the following profit and loss: | party | volume | unrealised pnl | realised pnl | is amm | | party1 | 1 | -8 | 0 | | | party2 | -1 | 8 | 0 | | - | party4 | -550 | 0 | 0 | | - | vamm1-id | 550 | 0 | 0 | true | + | party4 | -581 | 0 | 0 | | + | vamm1-id | 581 | 0 | 0 | true | # vAMM receives fees, but loses out in the MTM settlement And the following transfers should happen: | from | from account | to | to account | market id | amount | asset | is amm | type | - | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 203 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | - | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 98098 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + | | ACCOUNT_TYPE_FEES_MAKER | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 214 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 100214 | USD | true | TRANSFER_TYPE_MARGIN_LOW | # Now make sure we don't trade with vAMM below 85 When the parties place the following orders: @@ -237,11 +237,11 @@ Feature: Ensure the vAMM positions follow the market correctly | party1 | 1 | -25 | 0 | | | party2 | -1 | 25 | 0 | | | party3 | 10 | 0 | 0 | | - | party4 | -560 | 9350 | 0 | | - | vamm1-id | 550 | -9350 | 0 | true | + | party4 | -591 | 9877 | 0 | | + | vamm1-id | 581 | -9877 | 0 | true | And the market data for the market "ETH/MAR22" should be: - | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | best offer price | best bid price | - | 75 | TRADING_MODE_CONTINUOUS | 16824 | 1000 | 561 | 100 | 63 | 63 | 86 | 40 | + | mark price | trading mode | mid price | static mid price | best offer price | best bid price | + | 75 | TRADING_MODE_CONTINUOUS | 63 | 63 | 86 | 40 | # TODO: vamm does not appear to have any notional. Neither party nor alias work. #And the AMM "vamm1-id" has the following taker notional "4000" #And the party "vamm1" has the following taker notional "4000" diff --git a/core/integration/features/amm/0090-VAMM-sparse-auction.feature b/core/integration/features/amm/0090-VAMM-sparse-auction.feature new file mode 100644 index 0000000000..8d539ea972 --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-sparse-auction.feature @@ -0,0 +1,185 @@ +Feature: vAMM rebasing when created or amended + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the oracle spec for settlement data filtering data from "0xCAFECAFE19" named "termination-oracle": + | property | type | binding | decimals | + | prices.ETH.value | TYPE_INTEGER | settlement data | 0 | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE19" named "termination-oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | termination-oracle | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0090-VAMM-006 through 0090-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + | vamm2 | USD | 1000000 | + + @VAMM + Scenario: Uncrossing with one low-volume AMM + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.05 | 100 | 90 | 120 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 90 | 120 | + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 1000 | 0.05 | 90 | 80 | 140 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 90 | 80 | 140 | + + + # even though their bounds are crossed, the sparse-ness means their volume it not crossed + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 0 | TRADING_MODE_OPENING_AUCTION | 98 | 103 | 1 | 1 | + + + # amend the second one so that it has more volume now and they should cross + When the parties amend the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 10000 | 0.05 | 90 | 80 | 140 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 90 | 80 | 140 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 0 | TRADING_MODE_OPENING_AUCTION | 98 | 92 | 1 | 1 | + + # uncross! + When the opening auction period ends for market "ETH/MAR22" + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 95 | TRADING_MODE_CONTINUOUS | 94 | 95 | 1 | 1 | + + +@VAMM + Scenario: Uncrossing orders entirely within a low volume AMM's spread + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.05 | 100 | 90 | 120 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 90 | 120 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 0 | TRADING_MODE_OPENING_AUCTION | 98 | 105 | 1 | 1 | + + # lets splatter some orders in the AMM's spread + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 5 | 99 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | sell | 5 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | buy | 5 | 101 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | buy | 10 | 104 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 0 | TRADING_MODE_OPENING_AUCTION | 104 | 99 | 10 | 5 | + + + # uncross! AMM should be unaffected + When the opening auction period ends for market "ETH/MAR22" + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 102 | TRADING_MODE_CONTINUOUS | 101 | 105 | 5 | 1 | + + + When the parties cancel all their orders for the markets: + | party | market id | + | party1 | ETH/MAR22 | + | party2 | ETH/MAR22 | + + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 102 | TRADING_MODE_CONTINUOUS | 98 | 105 | 1 | 1 | + + +@VAMM + Scenario: Uncrossing orders with a low volume AMM + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.05 | 100 | 90 | 120 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 90 | 120 | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 0 | TRADING_MODE_OPENING_AUCTION | 98 | 105 | 1 | 1 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 5 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | buy | 5 | 91 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 0 | TRADING_MODE_OPENING_AUCTION | 98 | 95 | 1 | 5 | + + + # uncross! AMM should be unaffected + When the opening auction period ends for market "ETH/MAR22" + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 95 | TRADING_MODE_CONTINUOUS | 94 | 95 | 1 | 3 | diff --git a/core/integration/features/amm/0090-VAMM-sparse.feature b/core/integration/features/amm/0090-VAMM-sparse.feature new file mode 100644 index 0000000000..a8f31adfd4 --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-sparse.feature @@ -0,0 +1,206 @@ +Feature: vAMM rebasing when created or amended + + Background: + Given the average block duration is "1" + And the margin calculator named "margin-calculator-1": + | search factor | initial factor | release factor | + | 1.2 | 1.5 | 1.7 | + And the log normal risk model named "log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.001 | 0.0011407711613050422 | 0 | 0.9 | 3.0 | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.00 | 20s | 1 | + + And the following network parameters are set: + | name | value | + | market.value.windowLength | 60s | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | market.auction.minimumDuration | 1 | + | market.fee.factors.infrastructureFee | 0.001 | + | market.fee.factors.makerFee | 0.004 | + | spam.protection.max.stopOrdersPerMarket | 5 | + | market.liquidity.equityLikeShareFeeFraction | 1 | + | market.amm.minCommitmentQuantum | 1 | + | market.liquidity.bondPenaltyParameter | 0.2 | + | market.liquidity.stakeToCcyVolume | 1 | + | market.liquidity.successorLaunchWindowLength | 1h | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + #risk factor short:3.5569036 + #risk factor long:0.801225765 + And the following assets are registered: + | id | decimal places | + | USD | 0 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.0004 | 0.001 | + + And the liquidity sla params named "SLA-22": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.5 | 0.6 | 1 | 1.0 | + + And the oracle spec for settlement data filtering data from "0xCAFECAFE19" named "termination-oracle": + | property | type | binding | decimals | + | prices.ETH.value | TYPE_INTEGER | settlement data | 0 | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE19" named "termination-oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | termination-oracle | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0090-VAMM-006 through 0090-VAMM-014 on this setup + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | lp1 | USD | 1000000 | + | lp2 | USD | 1000000 | + | lp3 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | vamm1 | USD | 1000000 | + | vamm2 | USD | 1000000 | + + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party5 | ETH/MAR22 | buy | 20 | 90 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR22 | sell | 10 | 130 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 1000 | 0.05 | 100 | 90 | 120 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 1000 | STATUS_ACTIVE | 100 | 90 | 120 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + + + # note that the commitment is low and is creating zero volume price ticks so the best bid is more than 1 away from the AMM's + # fair price + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 100 | TRADING_MODE_CONTINUOUS | 98 | 105 | 1 | 1 | + + @VAMM + Scenario: Sparse AMM incoming orders makes it long + + # AMM's has a BUY at 98 so this SELL order won't match with 99 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 5 | 99 | 0 | TYPE_LIMIT | TIF_GTC | | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 100 | TRADING_MODE_CONTINUOUS | 98 | 99 | 1 | 5 | + + # lets send in a 98 that will now match with the AMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 1 | 98 | 1 | TYPE_LIMIT | TIF_GTC | | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 99 | 1 | party1 | true | + + # AMM is now quoting at 96 and 100, but we have our sell limit order at 99. + And the market data for the market "ETH/MAR22" should be: + | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | TRADING_MODE_CONTINUOUS | 96 | 99 | 1 | 5 | + + # lets send in a 99 to eat that limit order and leave us with AMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | buy | 5 | 99 | 1 | TYPE_LIMIT | TIF_GTC | | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party2 | 99 | 5 | party1 | true | + + # AMM is now quoting at 96 and 100 + And the market data for the market "ETH/MAR22" should be: + | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | TRADING_MODE_CONTINUOUS | 96 | 100 | 1 | 1 | + + # order at 99 doesn't match since the AMM's volume is at 100 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | buy | 5 | 99 | 0 | TYPE_LIMIT | TIF_FOK | | + + # this one will + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | buy | 1 | 100 | 1 | TYPE_LIMIT | TIF_FOK | | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | TRADING_MODE_CONTINUOUS | 98 | 105 | 1 | 1 | + + + @VAMM + Scenario: Sparse AMM incoming orders makes it short + + # AMM's has a BUY at 98 so this SELL order won't match with 99 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 5 | 102 | 0 | TYPE_LIMIT | TIF_GTC | | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 100 | TRADING_MODE_CONTINUOUS | 102 | 105 | 5 | 1 | + + # lets send in a 105 that will now match with the AMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 1 | 105 | 1 | TYPE_LIMIT | TIF_GTC | | + + # AMM is now quoting at 100 and 110, but we have our sell limit order at 102. + And the market data for the market "ETH/MAR22" should be: + | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | TRADING_MODE_CONTINUOUS | 102 | 111 | 5 | 1 | + + # lets send in a 102 to eat that limit order and leave us with AMM + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | sell | 5 | 102 | 1 | TYPE_LIMIT | TIF_GTC | | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party1 | 102 | 5 | party2 | true | + + # AMM is now quoting at 96 and 100 + And the market data for the market "ETH/MAR22" should be: + | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | TRADING_MODE_CONTINUOUS | 100 | 111 | 1 | 1 | + + # order at 102 doesn't match since the AMM's volume is at 100 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | sell | 5 | 102 | 0 | TYPE_LIMIT | TIF_FOK | | + + # this one will + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | sell | 1 | 100 | 1 | TYPE_LIMIT | TIF_FOK | | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | TRADING_MODE_CONTINUOUS | 98 | 105 | 1 | 1 | \ No newline at end of file diff --git a/core/integration/features/amm/pegged-orders-market-tick.feature b/core/integration/features/amm/pegged-orders-market-tick.feature index 450c6e7950..74226e7a0f 100644 --- a/core/integration/features/amm/pegged-orders-market-tick.feature +++ b/core/integration/features/amm/pegged-orders-market-tick.feature @@ -149,6 +149,6 @@ Feature: 0090-VAMM-036: With an existing book consisting solely of vAMM orders, | buy | 40 | 0 | | buy | 93 | 10 | | sell | 99 | 0 | - | sell | 105 | 10 | + | sell | 106 | 10 | | sell | 160 | 0 | diff --git a/core/integration/features/amm/pegged-orders.feature b/core/integration/features/amm/pegged-orders.feature index 61ef929634..465a0f4f5c 100644 --- a/core/integration/features/amm/pegged-orders.feature +++ b/core/integration/features/amm/pegged-orders.feature @@ -35,7 +35,7 @@ Feature: 0090-VAMM-036: With an existing book consisting solely of vAMM orders, #risk factor long:0.801225765 And the following assets are registered: | id | decimal places | - | USD | 0 | + | USD | 5 | And the fees configuration named "fees-config-1": | maker fee | infrastructure fee | | 0.0004 | 0.001 | @@ -45,26 +45,26 @@ Feature: 0090-VAMM-036: With an existing book consisting solely of vAMM orders, | 0.5 | 0.6 | 1 | 1.0 | And the markets: - | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | - | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | decimal places | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | default-eth-for-future | 1e0 | 0 | SLA-22 | 1 | # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0090-VAMM-006 through 0090-VAMM-014 on this setup Given the parties deposit on asset's general account the following amount: - | party | asset | amount | - | lp1 | USD | 1000000 | - | lp2 | USD | 1000000 | - | lp3 | USD | 1000000 | - | party1 | USD | 1000000 | - | party2 | USD | 1000000 | - | party3 | USD | 1000000 | - | party4 | USD | 1000000 | - | party5 | USD | 1000000 | - | vamm1 | USD | 1000000 | + | party | asset | amount | + | lp1 | USD | 100000000000 | + | lp2 | USD | 100000000000 | + | lp3 | USD | 100000000000 | + | party1 | USD | 100000000000 | + | party2 | USD | 100000000000 | + | party3 | USD | 100000000000 | + | party4 | USD | 100000000000 | + | party5 | USD | 100000000000 | + | vamm1 | USD | 100000000000 | When the parties submit the following liquidity provision: | id | party | market id | commitment amount | fee | lp type | - | lp_1 | lp1 | ETH/MAR22 | 600 | 0.02 | submission | - | lp_2 | lp2 | ETH/MAR22 | 400 | 0.015 | submission | + | lp_1 | lp1 | ETH/MAR22 | 60000000 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 40000000 | 0.015 | submission | Then the network moves ahead "4" blocks And the current epoch is "0" @@ -81,20 +81,20 @@ Feature: 0090-VAMM-036: With an existing book consisting solely of vAMM orders, And the market data for the market "ETH/MAR22" should be: | mark price | trading mode | target stake | supplied stake | open interest | ref price | mid price | static mid price | - | 100 | TRADING_MODE_CONTINUOUS | 39 | 1000 | 1 | 100 | 100 | 100 | + | 100 | TRADING_MODE_CONTINUOUS | 399880 | 100000000 | 1 | 100 | 100 | 100 | When the parties submit the following AMM: - | party | market id | amount | slippage | base | lower bound | upper bound | lower leverage | upper leverage | proposed fee | - | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + | party | market id | amount | slippage | base | lower bound | upper bound | lower leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 10000000000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | Then the AMM pool status should be: - | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | - | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 10000000000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | And set the following AMM sub account aliases: | party | market id | alias | | vamm1 | ETH/MAR22 | vamm1-id | And the following transfers should happen: - | from | from account | to | to account | market id | amount | asset | is amm | type | - | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + | from | from account | to | to account | market id | amount | asset | is amm | type | + | vamm1 | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_GENERAL | | 10000000000 | USD | true | TRANSFER_TYPE_AMM_LOW | @VAMM Scenario: Simply submit pegged orders, cancel all orders on the orderbook, the pegged orders should be pegged to the AMM orders. @@ -138,3 +138,25 @@ Feature: 0090-VAMM-036: With an existing book consisting solely of vAMM orders, | buy | 94 | 10 | | sell | 106 | 10 | | sell | 160 | 0 | + + + @VAMM + Scenario: AMM decimal best ask rounds up to peg 0 offset + + # trade with the AMM so its fair price is non-tick + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | ETH/MAR22 | buy | 100 | 0 | 1 | TYPE_MARKET | TIF_IOC | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 100 | TRADING_MODE_CONTINUOUS | 100 | 102 | 79 | 77 | + + When the parties place the following pegged iceberg orders: + | party | market id | side | volume | peak size | minimum visible size | pegged reference | offset | + | lp1 | ETH/MAR22 | buy | 100 | 10 | 2 | BID | 0 | + | lp1 | ETH/MAR22 | sell | 100 | 10 | 2 | ASK | 0 | + Then the order book should have the following volumes for market "ETH/MAR22": + | side | price | volume | + | buy | 100 | 10 | + | sell | 103 | 10 | diff --git a/core/integration/steps/the_markets.go b/core/integration/steps/the_markets.go index 392591bdfb..d3c8e8de17 100644 --- a/core/integration/steps/the_markets.go +++ b/core/integration/steps/the_markets.go @@ -645,6 +645,7 @@ func newMarket(config *market.Config, row marketRow) types.Market { LiquiditySLAParams: types.LiquiditySLAParamsFromProto(slaParams), MarkPriceConfiguration: markPriceConfig, TickSize: row.tickSize(), + AllowedEmptyAmmLevels: row.allowedEmptyAMMLevels(), } if row.isSuccessor() { @@ -717,6 +718,7 @@ func parseMarketsTable(table *godog.Table) []RowWrapper { "max price cap", "binary", "fully collateralised", + "allowed empty amm levels", }) } @@ -917,6 +919,13 @@ func (r marketRow) tickSize() *num.Uint { return num.UintOne() } +func (r marketRow) allowedEmptyAMMLevels() uint64 { + if r.row.HasColumn("allowed empty AMM levels") { + return r.row.MustU64("allowed empty AMM levels") + } + return 100 +} + func (r marketRow) id() string { return r.row.MustStr("id") } diff --git a/core/types/governance_new_market.go b/core/types/governance_new_market.go index b23d7791c6..c0e45267a1 100644 --- a/core/types/governance_new_market.go +++ b/core/types/governance_new_market.go @@ -413,6 +413,7 @@ type NewMarketConfiguration struct { MarkPriceConfiguration *CompositePriceConfiguration TickSize *num.Uint EnableTxReordering bool + AllowedEmptyAmmLevels *uint64 } func (n NewMarketConfiguration) IntoProto() *vegapb.NewMarketConfiguration { @@ -461,6 +462,7 @@ func (n NewMarketConfiguration) IntoProto() *vegapb.NewMarketConfiguration { MarkPriceConfiguration: n.MarkPriceConfiguration.IntoProto(), TickSize: n.TickSize.String(), EnableTransactionReordering: n.EnableTxReordering, + AllowedEmptyAmmLevels: n.AllowedEmptyAmmLevels, } if n.Successor != nil { r.Successor = n.Successor.IntoProto() @@ -483,6 +485,7 @@ func (n NewMarketConfiguration) DeepClone() *NewMarketConfiguration { QuadraticSlippageFactor: n.QuadraticSlippageFactor.Copy(), TickSize: n.TickSize.Clone(), EnableTxReordering: n.EnableTxReordering, + AllowedEmptyAmmLevels: n.AllowedEmptyAmmLevels, } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.Instrument != nil { @@ -632,6 +635,7 @@ func NewMarketConfigurationFromProto(p *vegapb.NewMarketConfiguration) (*NewMark MarkPriceConfiguration: markPriceConfig, TickSize: tickSize, EnableTxReordering: p.EnableTransactionReordering, + AllowedEmptyAmmLevels: p.AllowedEmptyAmmLevels, } if p.RiskParameters != nil { switch rp := p.RiskParameters.(type) { diff --git a/core/types/governance_update_market.go b/core/types/governance_update_market.go index ce35f5e14a..97e58934f5 100644 --- a/core/types/governance_update_market.go +++ b/core/types/governance_update_market.go @@ -139,6 +139,7 @@ type UpdateMarketConfiguration struct { MarkPriceConfiguration *CompositePriceConfiguration TickSize *num.Uint EnableTxReordering bool + AllowedEmptyAmmLevels *uint64 } func (n UpdateMarketConfiguration) String() string { @@ -164,6 +165,7 @@ func (n UpdateMarketConfiguration) DeepClone() *UpdateMarketConfiguration { QuadraticSlippageFactor: n.QuadraticSlippageFactor.Copy(), TickSize: n.TickSize.Clone(), EnableTxReordering: n.EnableTxReordering, + AllowedEmptyAmmLevels: n.AllowedEmptyAmmLevels, } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.Instrument != nil { @@ -236,6 +238,7 @@ func (n UpdateMarketConfiguration) IntoProto() *vegapb.UpdateMarketConfiguration MarkPriceConfiguration: n.MarkPriceConfiguration.IntoProto(), TickSize: n.TickSize.String(), EnableTransactionReordering: n.EnableTxReordering, + AllowedEmptyAmmLevels: n.AllowedEmptyAmmLevels, } switch rp := riskParams.(type) { case *vegapb.UpdateMarketConfiguration_Simple: @@ -337,6 +340,7 @@ func UpdateMarketConfigurationFromProto(p *vegapb.UpdateMarketConfiguration) (*U MarkPriceConfiguration: CompositePriceConfigurationFromProto(p.MarkPriceConfiguration), TickSize: tickSize, EnableTxReordering: p.EnableTransactionReordering, + AllowedEmptyAmmLevels: p.AllowedEmptyAmmLevels, } if p.RiskParameters != nil { switch rp := p.RiskParameters.(type) { diff --git a/core/types/market.go b/core/types/market.go index 4cf9a010f4..a7c8fc9bc6 100644 --- a/core/types/market.go +++ b/core/types/market.go @@ -1101,6 +1101,7 @@ type Market struct { MarkPriceConfiguration *CompositePriceConfiguration TickSize *num.Uint EnableTxReordering bool + AllowedEmptyAmmLevels uint64 } func MarketFromProto(mkt *vegapb.Market) (*Market, error) { @@ -1168,6 +1169,7 @@ func MarketFromProto(mkt *vegapb.Market) (*Market, error) { MarkPriceConfiguration: markPriceConfiguration, TickSize: tickSize, EnableTxReordering: mkt.EnableTransactionReordering, + AllowedEmptyAmmLevels: mkt.AllowedEmptyAmmLevels, } if mkt.LiquiditySlaParams != nil { @@ -1241,6 +1243,7 @@ func (m Market) IntoProto() *vegapb.Market { MarkPriceConfiguration: m.MarkPriceConfiguration.IntoProto(), TickSize: m.TickSize.String(), EnableTransactionReordering: m.EnableTxReordering, + AllowedEmptyAmmLevels: m.AllowedEmptyAmmLevels, } return r } @@ -1295,6 +1298,7 @@ func (m Market) DeepClone() *Market { InsurancePoolFraction: m.InsurancePoolFraction, TickSize: m.TickSize.Clone(), EnableTxReordering: m.EnableTxReordering, + AllowedEmptyAmmLevels: m.AllowedEmptyAmmLevels, } if m.LiquiditySLAParams != nil { diff --git a/datanode/api/trading_data_v2.go b/datanode/api/trading_data_v2.go index 67bdbe1eb8..d8de10a837 100644 --- a/datanode/api/trading_data_v2.go +++ b/datanode/api/trading_data_v2.go @@ -6022,6 +6022,7 @@ func (t *TradingDataServiceV2) EstimateAMMBounds(ctx context.Context, req *v2.Es riskFactors.Long, priceFactor, positionFactor, + market.AllowedEmptyAMMLevels, ) // liquidation prices are in asset DP, convert back to market DP diff --git a/datanode/entities/market.go b/datanode/entities/market.go index 6ebd8c8073..77efc33806 100644 --- a/datanode/entities/market.go +++ b/datanode/entities/market.go @@ -71,6 +71,7 @@ type Market struct { MarkPriceConfiguration *CompositePriceConfiguration TickSize *decimal.Decimal EnableTXReordering bool + AllowedEmptyAMMLevels uint64 } func (m *Market) HasCap() (cap *vega.FutureCap, hasCap bool) { @@ -227,6 +228,7 @@ func NewMarketFromProto(market *vega.Market, txHash TxHash, vegaTime time.Time) MarkPriceConfiguration: mpc, TickSize: &tickSize, EnableTXReordering: market.EnableTransactionReordering, + AllowedEmptyAMMLevels: market.AllowedEmptyAmmLevels, }, nil } @@ -294,6 +296,7 @@ func (m Market) ToProto() *vega.Market { MarkPriceConfiguration: m.MarkPriceConfiguration.CompositePriceConfiguration, TickSize: m.TickSize.String(), EnableTransactionReordering: m.EnableTXReordering, + AllowedEmptyAmmLevels: m.AllowedEmptyAMMLevels, } } diff --git a/datanode/gateway/graphql/generated.go b/datanode/gateway/graphql/generated.go index 82611b0385..6ec20b2525 100644 --- a/datanode/gateway/graphql/generated.go +++ b/datanode/gateway/graphql/generated.go @@ -1333,6 +1333,7 @@ type ComplexityRoot struct { Market struct { AccountsConnection func(childComplexity int, partyID *string, pagination *v2.Pagination, includeDerivedParties *bool) int + AllowedEmptyAMMLevels func(childComplexity int) int CandlesConnection func(childComplexity int, since string, to *string, interval vega.Interval, pagination *v2.Pagination) int Data func(childComplexity int) int DecimalPlaces func(childComplexity int) int @@ -1520,6 +1521,7 @@ type ComplexityRoot struct { } NewMarket struct { + AllowedEmptyAMMLevels func(childComplexity int) int DecimalPlaces func(childComplexity int) int EnableTxReordering func(childComplexity int) int Instrument func(childComplexity int) int @@ -2989,6 +2991,7 @@ type ComplexityRoot struct { } UpdateMarketConfiguration struct { + AllowedEmptyAMMLevels func(childComplexity int) int EnableTxReordering func(childComplexity int) int Instrument func(childComplexity int) int LinearSlippageFactor func(childComplexity int) int @@ -3477,6 +3480,7 @@ type MarketResolver interface { LiquiditySLAParameters(ctx context.Context, obj *vega.Market) (*vega.LiquiditySLAParameters, error) EnableTxReordering(ctx context.Context, obj *vega.Market) (bool, error) + AllowedEmptyAMMLevels(ctx context.Context, obj *vega.Market) (int, error) } type MarketDataResolver interface { Market(ctx context.Context, obj *vega.MarketData) (*vega.Market, error) @@ -3549,6 +3553,7 @@ type NewMarketResolver interface { MarkPriceConfiguration(ctx context.Context, obj *vega.NewMarket) (*vega.CompositePriceConfiguration, error) TickSize(ctx context.Context, obj *vega.NewMarket) (string, error) EnableTxReordering(ctx context.Context, obj *vega.NewMarket) (bool, error) + AllowedEmptyAMMLevels(ctx context.Context, obj *vega.NewMarket) (*int, error) } type NewSpotMarketResolver interface { Instrument(ctx context.Context, obj *vega.NewSpotMarket) (*vega.InstrumentConfiguration, error) @@ -4079,6 +4084,7 @@ type UpdateMarketConfigurationResolver interface { RiskParameters(ctx context.Context, obj *vega.UpdateMarketConfiguration) (UpdateMarketRiskParameters, error) EnableTxReordering(ctx context.Context, obj *vega.UpdateMarketConfiguration) (bool, error) + AllowedEmptyAMMLevels(ctx context.Context, obj *vega.UpdateMarketConfiguration) (*int, error) } type UpdateMarketStateResolver interface { Market(ctx context.Context, obj *vega.UpdateMarketState) (*vega.Market, error) @@ -8741,6 +8747,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Market.AccountsConnection(childComplexity, args["partyId"].(*string), args["pagination"].(*v2.Pagination), args["includeDerivedParties"].(*bool)), true + case "Market.allowedEmptyAMMLevels": + if e.complexity.Market.AllowedEmptyAMMLevels == nil { + break + } + + return e.complexity.Market.AllowedEmptyAMMLevels(childComplexity), true + case "Market.candlesConnection": if e.complexity.Market.CandlesConnection == nil { break @@ -9639,6 +9652,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.NewFreeform.DoNotUse(childComplexity), true + case "NewMarket.allowedEmptyAMMLevels": + if e.complexity.NewMarket.AllowedEmptyAMMLevels == nil { + break + } + + return e.complexity.NewMarket.AllowedEmptyAMMLevels(childComplexity), true + case "NewMarket.decimalPlaces": if e.complexity.NewMarket.DecimalPlaces == nil { break @@ -16675,6 +16695,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.UpdateMarket.UpdateMarketConfiguration(childComplexity), true + case "UpdateMarketConfiguration.allowedEmptyAMMLevels": + if e.complexity.UpdateMarketConfiguration.AllowedEmptyAMMLevels == nil { + break + } + + return e.complexity.UpdateMarketConfiguration.AllowedEmptyAMMLevels(childComplexity), true + case "UpdateMarketConfiguration.enableTxReordering": if e.complexity.UpdateMarketConfiguration.EnableTxReordering == nil { break @@ -22227,6 +22254,8 @@ func (ec *executionContext) fieldContext_AbstractMarginLevels_market(ctx context return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -22882,6 +22911,8 @@ func (ec *executionContext) fieldContext_AccountBalance_market(ctx context.Conte return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -23591,6 +23622,8 @@ func (ec *executionContext) fieldContext_AccountEvent_market(ctx context.Context return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -35658,6 +35691,8 @@ func (ec *executionContext) fieldContext_Entities_markets(ctx context.Context, f return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -48920,6 +48955,8 @@ func (ec *executionContext) fieldContext_LiquidityProvision_market(ctx context.C return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -51577,6 +51614,8 @@ func (ec *executionContext) fieldContext_MarginLevels_market(ctx context.Context return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -54260,6 +54299,50 @@ func (ec *executionContext) fieldContext_Market_enableTxReordering(ctx context.C return fc, nil } +func (ec *executionContext) _Market_allowedEmptyAMMLevels(ctx context.Context, field graphql.CollectedField, obj *vega.Market) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Market().AllowedEmptyAMMLevels(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Market_allowedEmptyAMMLevels(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Market", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _MarketConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.MarketConnection) (ret graphql.Marshaler) { fc, err := ec.fieldContext_MarketConnection_edges(ctx, field) if err != nil { @@ -54467,6 +54550,8 @@ func (ec *executionContext) fieldContext_MarketData_market(ctx context.Context, return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -56495,6 +56580,8 @@ func (ec *executionContext) fieldContext_MarketDepth_market(ctx context.Context, return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -56960,6 +57047,8 @@ func (ec *executionContext) fieldContext_MarketDepthUpdate_market(ctx context.Co return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -57264,6 +57353,8 @@ func (ec *executionContext) fieldContext_MarketEdge_node(ctx context.Context, fi return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -59583,6 +59674,47 @@ func (ec *executionContext) fieldContext_NewMarket_enableTxReordering(ctx contex return fc, nil } +func (ec *executionContext) _NewMarket_allowedEmptyAMMLevels(ctx context.Context, field graphql.CollectedField, obj *vega.NewMarket) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_NewMarket_allowedEmptyAMMLevels(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.NewMarket().AllowedEmptyAMMLevels(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_NewMarket_allowedEmptyAMMLevels(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "NewMarket", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _NewSpotMarket_instrument(ctx context.Context, field graphql.CollectedField, obj *vega.NewSpotMarket) (ret graphql.Marshaler) { fc, err := ec.fieldContext_NewSpotMarket_instrument(ctx, field) if err != nil { @@ -66369,6 +66501,8 @@ func (ec *executionContext) fieldContext_Order_market(ctx context.Context, field return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -75036,6 +75170,8 @@ func (ec *executionContext) fieldContext_Position_market(ctx context.Context, fi return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -83133,6 +83269,8 @@ func (ec *executionContext) fieldContext_Query_market(ctx context.Context, field return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -96677,6 +96815,8 @@ func (ec *executionContext) fieldContext_SuccessorMarket_market(ctx context.Cont return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -100571,6 +100711,8 @@ func (ec *executionContext) fieldContext_Trade_market(ctx context.Context, field return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -104965,6 +105107,8 @@ func (ec *executionContext) fieldContext_UpdateMarket_updateMarketConfiguration( return ec.fieldContext_UpdateMarketConfiguration_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_UpdateMarketConfiguration_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_UpdateMarketConfiguration_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type UpdateMarketConfiguration", field.Name) }, @@ -105591,6 +105735,47 @@ func (ec *executionContext) fieldContext_UpdateMarketConfiguration_enableTxReord return fc, nil } +func (ec *executionContext) _UpdateMarketConfiguration_allowedEmptyAMMLevels(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateMarketConfiguration) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_UpdateMarketConfiguration_allowedEmptyAMMLevels(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.UpdateMarketConfiguration().AllowedEmptyAMMLevels(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_UpdateMarketConfiguration_allowedEmptyAMMLevels(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "UpdateMarketConfiguration", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _UpdateMarketLogNormalRiskModel_logNormal(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateMarketConfiguration_LogNormal) (ret graphql.Marshaler) { fc, err := ec.fieldContext_UpdateMarketLogNormalRiskModel_logNormal(ctx, field) if err != nil { @@ -105792,6 +105977,8 @@ func (ec *executionContext) fieldContext_UpdateMarketState_market(ctx context.Co return ec.fieldContext_Market_tickSize(ctx, field) case "enableTxReordering": return ec.fieldContext_Market_enableTxReordering(ctx, field) + case "allowedEmptyAMMLevels": + return ec.fieldContext_Market_allowedEmptyAMMLevels(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -126578,6 +126765,42 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o continue } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "allowedEmptyAMMLevels": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Market_allowedEmptyAMMLevels(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) @@ -129182,6 +129405,39 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet continue } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "allowedEmptyAMMLevels": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._NewMarket_allowedEmptyAMMLevels(ctx, field, obj) + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) @@ -148312,6 +148568,39 @@ func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel continue } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "allowedEmptyAMMLevels": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._UpdateMarketConfiguration_allowedEmptyAMMLevels(ctx, field, obj) + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) default: panic("unknown field " + strconv.Quote(field.Name)) diff --git a/datanode/gateway/graphql/market_resolvers.go b/datanode/gateway/graphql/market_resolvers.go index afc769028a..a912cacca2 100644 --- a/datanode/gateway/graphql/market_resolvers.go +++ b/datanode/gateway/graphql/market_resolvers.go @@ -304,3 +304,7 @@ func (r *myMarketResolver) CandlesConnection(ctx context.Context, market *types. func (r *myMarketResolver) LiquiditySLAParameters(ctx context.Context, obj *types.Market) (*types.LiquiditySLAParameters, error) { return obj.LiquiditySlaParams, nil } + +func (r *myMarketResolver) AllowedEmptyAMMLevels(ctx context.Context, obj *types.Market) (int, error) { + return int(obj.AllowedEmptyAmmLevels), nil +} diff --git a/datanode/gateway/graphql/new_market_resolver.go b/datanode/gateway/graphql/new_market_resolver.go index b54ac9f24d..674405d77e 100644 --- a/datanode/gateway/graphql/new_market_resolver.go +++ b/datanode/gateway/graphql/new_market_resolver.go @@ -20,6 +20,7 @@ import ( "errors" "strconv" + "code.vegaprotocol.io/vega/libs/ptr" types "code.vegaprotocol.io/vega/protos/vega" ) @@ -120,3 +121,11 @@ func (r *newMarketResolver) LiquidationStrategy(ctx context.Context, obj *types. func (r *newMarketResolver) MarkPriceConfiguration(ctx context.Context, obj *types.NewMarket) (*types.CompositePriceConfiguration, error) { return obj.Changes.MarkPriceConfiguration, nil } + +func (r *newMarketResolver) AllowedEmptyAMMLevels(ctx context.Context, obj *types.NewMarket) (*int, error) { + v := obj.Changes.AllowedEmptyAmmLevels + if v == nil { + return nil, nil + } + return ptr.From(int(*obj.Changes.AllowedEmptyAmmLevels)), nil +} diff --git a/datanode/gateway/graphql/schema.graphql b/datanode/gateway/graphql/schema.graphql index b64acfc673..13dca9b212 100644 --- a/datanode/gateway/graphql/schema.graphql +++ b/datanode/gateway/graphql/schema.graphql @@ -2843,6 +2843,9 @@ type Market { "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" enableTxReordering: Boolean! + + "Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission" + allowedEmptyAMMLevels: Int! } """ @@ -4964,6 +4967,8 @@ type NewMarket { tickSize: String! "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" enableTxReordering: Boolean! + "Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission" + allowedEmptyAMMLevels: Int } type CompositePriceConfiguration { @@ -5029,6 +5034,8 @@ type UpdateMarketConfiguration { tickSize: String! "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" enableTxReordering: Boolean! + "Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission" + allowedEmptyAMMLevels: Int } type UpdateInstrumentConfiguration { diff --git a/datanode/gateway/graphql/update_market_configuration_resolver.go b/datanode/gateway/graphql/update_market_configuration_resolver.go index fd69437b6b..43d1bedaac 100644 --- a/datanode/gateway/graphql/update_market_configuration_resolver.go +++ b/datanode/gateway/graphql/update_market_configuration_resolver.go @@ -20,6 +20,7 @@ import ( "errors" "strconv" + "code.vegaprotocol.io/vega/libs/ptr" "code.vegaprotocol.io/vega/protos/vega" ) @@ -149,3 +150,11 @@ func (r *updateMarketConfigurationResolver) RiskParameters(ctx context.Context, return params, nil } + +func (r *updateMarketConfigurationResolver) AllowedEmptyAMMLevels(ctx context.Context, obj *vega.UpdateMarketConfiguration) (*int, error) { + v := obj.AllowedEmptyAmmLevels + if v == nil { + return nil, nil + } + return ptr.From(int(*obj.AllowedEmptyAmmLevels)), nil +} diff --git a/datanode/networkhistory/service_test.go b/datanode/networkhistory/service_test.go index 9c6c274277..7f885b0eda 100644 --- a/datanode/networkhistory/service_test.go +++ b/datanode/networkhistory/service_test.go @@ -379,12 +379,12 @@ func TestMain(t *testing.M) { log.Infof("%s", goldenSourceHistorySegment[4000].HistorySegmentID) log.Infof("%s", goldenSourceHistorySegment[5000].HistorySegmentID) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmZVrRBX1dLuyLV32k1SvCmsrE59TtZqB6VXk7G2c8h3zq", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmSGjsHHy6V8PVJ7V44SSFo7dmEPyYFYEUpPU5VBPdqnHC", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmSPQTqAixXcijQpq56GURyX2TvAAXgEyqPkSUvR4BoJ7s", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "Qma8wkZn4PNuDwUAR9FDjGDgiq6CjBLPqBwViAfohoLdTn", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmRioFJQUpo8PB3AEN68PVe2Xq5scWmeUDRVyv3uf6VoVT", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmY3WQQaUrvxK363MaNhftcC6n4QLYehQaHENDH5djxMZ4", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmRyCcnax6RH9PtFGrEBkcXfDq7Jh2H6o7acxKeZB8ExDZ", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmRWPg4Lr5qyK8TBVYbeJ3iUBorKe8GStwAdaC4vum4qZB", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmasanrWiKQh3joV4BdhxbQN21dqM54uw8t9kTCGLppmwu", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmZQbGxTfiaBSC87nkPrnmXYcfmWfEkQZtEemDQ5vWYdbg", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmUt9PiyNgD8iCfweDA6hmsz4L9GNbcXCg2imLipdLJGYS", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmXjq4ck8SfUDjbcbASr5QnE6Y6YBHT8uZjz9AFnqFqMeJ", snapshots) }, postgresRuntimePath, sqlFs) if exitCode != 0 { diff --git a/datanode/service/market_depth_amm.go b/datanode/service/market_depth_amm.go index fe3fe41237..412bb8fa78 100644 --- a/datanode/service/market_depth_amm.go +++ b/datanode/service/market_depth_amm.go @@ -245,17 +245,19 @@ func (m *MarketDepth) expandByLevels(pool entities.AMMPool, levels []*level, pri estimated := []bool{} orders := []*types.Order{} + level1 := levels[0] extraVolume := int64(0) for i := range levels { if i == len(levels)-1 { break } - level1 := levels[i] + // level1 := levels[i] level2 := levels[i+1] // check if the interval is fully outside of the AMM range if ammDefn.lower.low.GTE(level2.price) { + level1 = level2 continue } if ammDefn.upper.high.LTE(level1.price) { @@ -312,12 +314,19 @@ func (m *MarketDepth) expandByLevels(pool entities.AMMPool, levels []*level, pri // we need to add this volume to the price level we step to next extraVolume = ammDefn.position.Sub(v2).Abs().IntPart() + level1 = level2 continue } } // calculate the volume volume := v1.Sub(v2).Abs().IntPart() + // if the volume is less than zero AMM must be sparse and so we want to keep adding it up until we have at least 1 volume + // so we'll continue and not shuffle along level1 + if volume == 0 { + continue + } + // this is extra volume from when we stepped over the AMM's fair-price if extraVolume != 0 { volume += extraVolume @@ -329,6 +338,9 @@ func (m *MarketDepth) expandByLevels(pool entities.AMMPool, levels []*level, pri m.makeOrder(retPrice, ammDefn.partyID, uint64(volume), side), ) estimated = append(estimated, level1.estimated || level2.estimated) + + // shuffle + level1 = level2 } return orders, estimated, nil } diff --git a/datanode/service/market_depth_amm_test.go b/datanode/service/market_depth_amm_test.go index a994b73a58..09fe4610e1 100644 --- a/datanode/service/market_depth_amm_test.go +++ b/datanode/service/market_depth_amm_test.go @@ -208,6 +208,33 @@ func TestAMMMarketDepth(t *testing.T) { assert.Equal(t, 20, int(mds.service.GetTotalVolume(marketID))) } +func TestAMMSparseMarketDepth(t *testing.T) { + ctx := context.Background() + mds := getService(t) + defer mds.ctrl.Finish() + + marketID := vgcrypto.RandomHash() + + ensureLiveOrders(t, mds, marketID) + ensureDecimalPlaces(t, mds, 1, 1) + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 0}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + + pool := getSparseAMMDefinition(t, marketID) + mds.amm.EXPECT().ListActive(gomock.Any()).Return([]entities.AMMPool{pool}, nil).Times(1) + mds.service.Initialise(ctx) + + // little volume over the range, and its all estimated + assert.Equal(t, 2, int(mds.service.GetTotalAMMVolume(marketID))) + assert.Equal(t, 2, int(mds.service.GetAMMVolume(marketID, true))) + assert.Equal(t, 0, int(mds.service.GetAMMVolume(marketID, false))) + assert.Equal(t, 22, int(mds.service.GetTotalVolume(marketID))) + + // best bid and best ask + assert.Equal(t, "1960", mds.service.GetBestBidPrice(marketID).String()) + assert.Equal(t, "2033", mds.service.GetBestAskPrice(marketID).String()) +} + func TestAMMInitialiseNoAMM(t *testing.T) { ctx := context.Background() mds := getService(t) @@ -477,6 +504,22 @@ func ensureLiveOrders(t *testing.T, mds *MDS, marketID string) { }, nil).Times(1) } +func getSparseAMMDefinition(t *testing.T, marketID string) entities.AMMPool { + t.Helper() + return entities.AMMPool{ + PartyID: entities.PartyID(vgcrypto.RandomHash()), + AmmPartyID: entities.PartyID(vgcrypto.RandomHash()), + MarketID: entities.MarketID(marketID), + ParametersLowerBound: ptr.From(num.DecimalFromInt64(1800)), + LowerVirtualLiquidity: num.DecimalFromFloat(5807.2351752738390703940959525483259), + LowerTheoreticalPosition: num.DecimalFromFloat(7.024119613637249), + ParametersBase: num.DecimalFromInt64(2000), + ParametersUpperBound: ptr.From(num.DecimalFromInt64(2200)), + UpperVirtualLiquidity: num.DecimalFromFloat(6106.0011747584543685842512031629329), + UpperTheoreticalPosition: num.DecimalFromFloat(6.3539545218646371), + } +} + func getAMMDefinition(t *testing.T, marketID string) entities.AMMPool { t.Helper() return entities.AMMPool{ diff --git a/datanode/sqlstore/markets.go b/datanode/sqlstore/markets.go index fe8e87c207..18cd28be0b 100644 --- a/datanode/sqlstore/markets.go +++ b/datanode/sqlstore/markets.go @@ -95,7 +95,7 @@ const ( sqlMarketsColumns = `id, tx_hash, vega_time, instrument_id, tradable_instrument, decimal_places, fees, opening_auction, price_monitoring_settings, liquidity_monitoring_parameters, trading_mode, state, market_timestamps, position_decimal_places, lp_price_range, linear_slippage_factor, quadratic_slippage_factor, - parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size, enable_tx_reordering` + parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size, enable_tx_reordering, allowed_empty_amm_levels` ) func NewMarkets(connectionSource *ConnectionSource) *Markets { @@ -108,7 +108,7 @@ func NewMarkets(connectionSource *ConnectionSource) *Markets { func (m *Markets) Upsert(ctx context.Context, market *entities.Market) error { query := fmt.Sprintf(`insert into markets(%s) -values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24) +values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25) on conflict (id, vega_time) do update set instrument_id=EXCLUDED.instrument_id, @@ -132,7 +132,8 @@ set liquidation_strategy=EXCLUDED.liquidation_strategy, mark_price_configuration=EXCLUDED.mark_price_configuration, tick_size=EXCLUDED.tick_size, - enable_tx_reordering=EXCLUDED.enable_tx_reordering;`, sqlMarketsColumns) + enable_tx_reordering=EXCLUDED.enable_tx_reordering, + allowed_empty_amm_levels=EXCLUDED.allowed_empty_amm_levels`, sqlMarketsColumns) defer metrics.StartSQLQuery("Markets", "Upsert")() if _, err := m.Exec(ctx, query, market.ID, market.TxHash, market.VegaTime, market.InstrumentID, market.TradableInstrument, market.DecimalPlaces, @@ -140,7 +141,7 @@ set market.TradingMode, market.State, market.MarketTimestamps, market.PositionDecimalPlaces, market.LpPriceRange, market.LinearSlippageFactor, market.QuadraticSlippageFactor, market.ParentMarketID, market.InsurancePoolFraction, market.LiquiditySLAParameters, market.LiquidationStrategy, - market.MarkPriceConfiguration, market.TickSize, market.EnableTXReordering); err != nil { + market.MarkPriceConfiguration, market.TickSize, market.EnableTXReordering, market.AllowedEmptyAMMLevels); err != nil { err = fmt.Errorf("could not insert market into database: %w", err) return err } @@ -167,7 +168,7 @@ func getSelect() string { select mc.id, mc.tx_hash, mc.vega_time, mc.instrument_id, mc.tradable_instrument, mc.decimal_places, mc.fees, mc.opening_auction, mc.price_monitoring_settings, mc.liquidity_monitoring_parameters, mc.trading_mode, mc.state, mc.market_timestamps, mc.position_decimal_places, mc.lp_price_range, mc.linear_slippage_factor, mc.quadratic_slippage_factor, - mc.parent_market_id, mc.insurance_pool_fraction, ml.market_id as successor_market_id, mc.liquidity_sla_parameters, mc.liquidation_strategy, mc.mark_price_configuration, mc.tick_size, mc.enable_tx_reordering + mc.parent_market_id, mc.insurance_pool_fraction, ml.market_id as successor_market_id, mc.liquidity_sla_parameters, mc.liquidation_strategy, mc.mark_price_configuration, mc.tick_size, mc.enable_tx_reordering, mc.allowed_empty_amm_levels from markets_current mc left join lineage ml on mc.id = ml.parent_market_id ` diff --git a/datanode/sqlstore/migrations/0119_allowed_empty_amm_levels.sql b/datanode/sqlstore/migrations/0119_allowed_empty_amm_levels.sql new file mode 100644 index 0000000000..8d90bcc8e8 --- /dev/null +++ b/datanode/sqlstore/migrations/0119_allowed_empty_amm_levels.sql @@ -0,0 +1,86 @@ +-- +goose Up + +ALTER TABLE markets ADD COLUMN IF NOT EXISTS allowed_empty_amm_levels INT default 0; +ALTER TABLE markets_current ADD COLUMN IF NOT EXISTS allowed_empty_amm_levels INT default 0; + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION update_current_markets() + RETURNS TRIGGER + LANGUAGE PLPGSQL AS +$$ +BEGIN +INSERT INTO markets_current(id,tx_hash,vega_time,instrument_id,tradable_instrument,decimal_places,fees,opening_auction,price_monitoring_settings,liquidity_monitoring_parameters,trading_mode,state,market_timestamps,position_decimal_places,lp_price_range, linear_slippage_factor, quadratic_slippage_factor, parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size, enable_tx_reordering, allowed_empty_amm_levels) +VALUES (NEW.id,NEW.tx_hash,NEW.vega_time,NEW.instrument_id,NEW.tradable_instrument,NEW.decimal_places,NEW.fees,NEW.opening_auction,NEW.price_monitoring_settings,NEW.liquidity_monitoring_parameters,NEW.trading_mode,NEW.state,NEW.market_timestamps,NEW.position_decimal_places,NEW.lp_price_range, NEW.linear_slippage_factor, NEW.quadratic_slippage_factor, NEW.parent_market_id, NEW.insurance_pool_fraction, NEW.liquidity_sla_parameters, NEW.liquidation_strategy, NEW.mark_price_configuration, NEW.tick_size, NEW.enable_tx_reordering, NEW.allowed_empty_amm_levels) + ON CONFLICT(id) DO UPDATE SET + tx_hash=EXCLUDED.tx_hash, + instrument_id=EXCLUDED.instrument_id, + tradable_instrument=EXCLUDED.tradable_instrument, + decimal_places=EXCLUDED.decimal_places, + fees=EXCLUDED.fees, + opening_auction=EXCLUDED.opening_auction, + price_monitoring_settings=EXCLUDED.price_monitoring_settings, + liquidity_monitoring_parameters=EXCLUDED.liquidity_monitoring_parameters, + trading_mode=EXCLUDED.trading_mode, + state=EXCLUDED.state, + market_timestamps=EXCLUDED.market_timestamps, + position_decimal_places=EXCLUDED.position_decimal_places, + lp_price_range=EXCLUDED.lp_price_range, + linear_slippage_factor=EXCLUDED.linear_slippage_factor, + quadratic_slippage_factor=EXCLUDED.quadratic_slippage_factor, + vega_time=EXCLUDED.vega_time, + parent_market_id=EXCLUDED.parent_market_id, + insurance_pool_fraction=EXCLUDED.insurance_pool_fraction, + liquidity_sla_parameters=EXCLUDED.liquidity_sla_parameters, + liquidation_strategy=EXCLUDED.liquidation_strategy, + mark_price_configuration=EXCLUDED.mark_price_configuration, + tick_size=EXCLUDED.tick_size, + enable_tx_reordering=EXCLUDED.enable_tx_reordering, + allowed_empty_amm_levels=EXCLUDED.allowed_empty_amm_levels; +RETURN NULL; +END; +$$; +-- +goose StatementEnd + + +-- +goose Down +ALTER TABLE markets DROP COLUMN IF EXISTS allowed_empty_amm_levels; +ALTER TABLE markets_current DROP COLUMN IF EXISTS allowed_empty_amm_levels; + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION update_current_markets() + RETURNS TRIGGER + LANGUAGE PLPGSQL AS +$$ +BEGIN +INSERT INTO markets_current(id,tx_hash,vega_time,instrument_id,tradable_instrument,decimal_places,fees,opening_auction,price_monitoring_settings,liquidity_monitoring_parameters,trading_mode,state,market_timestamps,position_decimal_places,lp_price_range, linear_slippage_factor, quadratic_slippage_factor, parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size, enable_tx_reordering) +VALUES (NEW.id,NEW.tx_hash,NEW.vega_time,NEW.instrument_id,NEW.tradable_instrument,NEW.decimal_places,NEW.fees,NEW.opening_auction,NEW.price_monitoring_settings,NEW.liquidity_monitoring_parameters,NEW.trading_mode,NEW.state,NEW.market_timestamps,NEW.position_decimal_places,NEW.lp_price_range, NEW.linear_slippage_factor, NEW.quadratic_slippage_factor, NEW.parent_market_id, NEW.insurance_pool_fraction, NEW.liquidity_sla_parameters, NEW.liquidation_strategy, NEW.mark_price_configuration, NEW.tick_size, NEW.enable_tx_reordering) + ON CONFLICT(id) DO UPDATE SET + tx_hash=EXCLUDED.tx_hash, + instrument_id=EXCLUDED.instrument_id, + tradable_instrument=EXCLUDED.tradable_instrument, + decimal_places=EXCLUDED.decimal_places, + fees=EXCLUDED.fees, + opening_auction=EXCLUDED.opening_auction, + price_monitoring_settings=EXCLUDED.price_monitoring_settings, + liquidity_monitoring_parameters=EXCLUDED.liquidity_monitoring_parameters, + trading_mode=EXCLUDED.trading_mode, + state=EXCLUDED.state, + market_timestamps=EXCLUDED.market_timestamps, + position_decimal_places=EXCLUDED.position_decimal_places, + lp_price_range=EXCLUDED.lp_price_range, + linear_slippage_factor=EXCLUDED.linear_slippage_factor, + quadratic_slippage_factor=EXCLUDED.quadratic_slippage_factor, + vega_time=EXCLUDED.vega_time, + parent_market_id=EXCLUDED.parent_market_id, + insurance_pool_fraction=EXCLUDED.insurance_pool_fraction, + liquidity_sla_parameters=EXCLUDED.liquidity_sla_parameters, + liquidation_strategy=EXCLUDED.liquidation_strategy, + mark_price_configuration=EXCLUDED.mark_price_configuration, + tick_size=EXCLUDED.tick_size, + enable_tx_reordering=EXCLUDED.enable_tx_reordering; +RETURN NULL; +END; +$$; +-- +goose StatementEnd + + diff --git a/protos/data-node/api/v2/trading_data.pb.go b/protos/data-node/api/v2/trading_data.pb.go index 2e1c174064..4b300a80d7 100644 --- a/protos/data-node/api/v2/trading_data.pb.go +++ b/protos/data-node/api/v2/trading_data.pb.go @@ -437,11 +437,11 @@ const ( EstimateAMMBoundsResponse_AMM_ERROR_UNSPECIFIED EstimateAMMBoundsResponse_AMMError = 0 // Commitment is below the global limit set by the network parameter `market.amm.minCommitmentQuantum`. EstimateAMMBoundsResponse_AMM_ERROR_COMMITMENT_BELOW_MINIMUM EstimateAMMBoundsResponse_AMMError = 1 - // AMM's lower price is too far from the base price for the given commitment resulting in zero volume between price levels. + // AMM's lower price is too far from the base price for the given commitment resulting in too many zero volume price levels. EstimateAMMBoundsResponse_AMM_ERROR_LOWER_BOUND_TOO_WIDE EstimateAMMBoundsResponse_AMMError = 2 - // AMM's upper price is too far from the base price for the given commitment resulting in zero volume between price levels. + // AMM's upper price is too far from the base price for the given commitment resulting in too many zero volume price levels. EstimateAMMBoundsResponse_AMM_ERROR_UPPER_BOUND_TOO_WIDE EstimateAMMBoundsResponse_AMMError = 3 - // AMM bounds are too wide for the given commitment resulting in zero volume between price levels. + // AMM bounds are too wide for the given commitment resulting in too many zero volume price levels. EstimateAMMBoundsResponse_AMM_ERROR_BOTH_BOUNDS_TOO_WIDE EstimateAMMBoundsResponse_AMMError = 4 ) diff --git a/protos/sources/data-node/api/v2/trading_data.proto b/protos/sources/data-node/api/v2/trading_data.proto index 891d9079e6..0b93043337 100644 --- a/protos/sources/data-node/api/v2/trading_data.proto +++ b/protos/sources/data-node/api/v2/trading_data.proto @@ -5092,11 +5092,11 @@ message EstimateAMMBoundsResponse { AMM_ERROR_UNSPECIFIED = 0; // Commitment is below the global limit set by the network parameter `market.amm.minCommitmentQuantum`. AMM_ERROR_COMMITMENT_BELOW_MINIMUM = 1; - // AMM's lower price is too far from the base price for the given commitment resulting in zero volume between price levels. + // AMM's lower price is too far from the base price for the given commitment resulting in too many zero volume price levels. AMM_ERROR_LOWER_BOUND_TOO_WIDE = 2; - // AMM's upper price is too far from the base price for the given commitment resulting in zero volume between price levels. + // AMM's upper price is too far from the base price for the given commitment resulting in too many zero volume price levels. AMM_ERROR_UPPER_BOUND_TOO_WIDE = 3; - // AMM bounds are too wide for the given commitment resulting in zero volume between price levels. + // AMM bounds are too wide for the given commitment resulting in too many zero volume price levels. AMM_ERROR_BOTH_BOUNDS_TOO_WIDE = 4; } diff --git a/protos/sources/vega/governance.proto b/protos/sources/vega/governance.proto index d3bbb725b6..72686ffef9 100644 --- a/protos/sources/vega/governance.proto +++ b/protos/sources/vega/governance.proto @@ -154,6 +154,8 @@ message NewMarketConfiguration { string tick_size = 16; // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks bool enable_transaction_reordering = 17; + // Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission. + optional uint64 allowed_empty_amm_levels = 18; } // New spot market on Vega @@ -229,6 +231,8 @@ message UpdateMarketConfiguration { string tick_size = 12; // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks bool enable_transaction_reordering = 13; + // Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission. + optional uint64 allowed_empty_amm_levels = 14; } // Configuration to update a spot market on Vega diff --git a/protos/sources/vega/markets.proto b/protos/sources/vega/markets.proto index 675c166050..7a159d9aec 100644 --- a/protos/sources/vega/markets.proto +++ b/protos/sources/vega/markets.proto @@ -418,6 +418,8 @@ message Market { string tick_size = 21; // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks bool enable_transaction_reordering = 22; + // Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission. + uint64 allowed_empty_amm_levels = 23; } // Time stamps for important times about creating, enacting etc the market diff --git a/protos/vega/governance.pb.go b/protos/vega/governance.pb.go index cfe75a9e37..c926d90e71 100644 --- a/protos/vega/governance.pb.go +++ b/protos/vega/governance.pb.go @@ -1226,6 +1226,8 @@ type NewMarketConfiguration struct { TickSize string `protobuf:"bytes,16,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks EnableTransactionReordering bool `protobuf:"varint,17,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` + // Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission. + AllowedEmptyAmmLevels *uint64 `protobuf:"varint,18,opt,name=allowed_empty_amm_levels,json=allowedEmptyAmmLevels,proto3,oneof" json:"allowed_empty_amm_levels,omitempty"` } func (x *NewMarketConfiguration) Reset() { @@ -1394,6 +1396,13 @@ func (x *NewMarketConfiguration) GetEnableTransactionReordering() bool { return false } +func (x *NewMarketConfiguration) GetAllowedEmptyAmmLevels() uint64 { + if x != nil && x.AllowedEmptyAmmLevels != nil { + return *x.AllowedEmptyAmmLevels + } + return 0 +} + type isNewMarketConfiguration_RiskParameters interface { isNewMarketConfiguration_RiskParameters() } @@ -1727,6 +1736,8 @@ type UpdateMarketConfiguration struct { TickSize string `protobuf:"bytes,12,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks EnableTransactionReordering bool `protobuf:"varint,13,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` + // Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission. + AllowedEmptyAmmLevels *uint64 `protobuf:"varint,14,opt,name=allowed_empty_amm_levels,json=allowedEmptyAmmLevels,proto3,oneof" json:"allowed_empty_amm_levels,omitempty"` } func (x *UpdateMarketConfiguration) Reset() { @@ -1874,6 +1885,13 @@ func (x *UpdateMarketConfiguration) GetEnableTransactionReordering() bool { return false } +func (x *UpdateMarketConfiguration) GetAllowedEmptyAmmLevels() uint64 { + if x != nil && x.AllowedEmptyAmmLevels != nil { + return *x.AllowedEmptyAmmLevels + } + return 0 +} + type isUpdateMarketConfiguration_RiskParameters interface { isUpdateMarketConfiguration_RiskParameters() } @@ -5009,7 +5027,7 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0xda, 0x09, 0x0a, 0x16, 0x4e, 0x65, 0x77, 0x4d, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0xb5, 0x0a, 0x0a, 0x16, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, @@ -5084,604 +5102,633 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x22, 0x4b, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, - 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x73, 0x22, 0x7a, 0x0a, 0x16, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, - 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, - 0x09, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x22, 0x66, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, - 0x39, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x10, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x07, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xb5, 0x08, 0x0a, 0x19, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, - 0x19, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6b, 0x0a, 0x1f, 0x6c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, - 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, - 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, - 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, - 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, - 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x0e, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, - 0x0c, 0x6c, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x14, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, - 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x19, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, - 0x74, 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x17, 0x71, - 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, - 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x56, 0x0a, 0x18, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x4c, 0x41, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x53, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, - 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, - 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x5b, - 0x0a, 0x18, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, 0x0f, - 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x22, 0xab, 0x05, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, - 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x53, 0x0a, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, - 0x15, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, - 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, - 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, - 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, - 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x4c, 0x41, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x09, 0x73, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x14, 0x6c, + 0x12, 0x3c, 0x0a, 0x18, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x04, 0x48, 0x03, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x41, 0x6d, 0x6d, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x42, 0x11, + 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, + 0x4b, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x7a, 0x0a, 0x16, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x36, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6f, 0x6f, 0x6c, + 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x09, 0x4e, 0x65, 0x77, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, + 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x66, 0x0a, + 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x07, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x90, 0x09, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6b, 0x0a, 0x1f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x64, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x12, 0x29, 0x0a, 0x0e, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x6c, 0x70, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, + 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6c, 0x69, 0x6e, + 0x65, 0x61, 0x72, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x3e, 0x0a, 0x19, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x73, + 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x17, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, + 0x74, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x56, 0x0a, 0x18, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, + 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x53, 0x4c, 0x41, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x52, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x6c, 0x61, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x52, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x5b, 0x0a, 0x18, 0x6d, 0x61, 0x72, + 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, + 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x3c, 0x0a, 0x18, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x15, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x6d, 0x6d, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x73, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x70, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x1b, 0x0a, 0x19, 0x5f, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x61, 0x6d, + 0x6d, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0xab, 0x05, 0x0a, 0x1d, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, + 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x15, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, + 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, + 0x39, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, + 0x09, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x6c, + 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, + 0x4c, 0x41, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x09, 0x73, 0x6c, + 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x47, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, - 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x22, 0x4b, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x49, 0x6e, + 0x6e, 0x67, 0x73, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, + 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, + 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x4b, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x70, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0xc5, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xc5, 0x01, - 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, - 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x48, 0x00, 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x3c, 0x0a, 0x09, - 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, - 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, - 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0xf0, 0x02, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x69, 0x0a, 0x24, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, + 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x18, + 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, + 0x42, 0x09, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0xf0, 0x02, 0x0a, 0x13, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x69, 0x0a, 0x24, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1f, 0x64, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x53, + 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x71, 0x0a, + 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, + 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x23, 0x64, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x54, 0x72, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x5c, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, + 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xe9, + 0x07, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, + 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, + 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, + 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, + 0x61, 0x6d, 0x70, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, + 0x11, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x55, + 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x71, 0x0a, 0x28, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, + 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x69, 0x0a, 0x24, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x1f, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x71, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, - 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5c, 0x0a, 0x18, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x54, 0x6f, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, + 0x6f, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, - 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xe9, 0x07, 0x0a, 0x16, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x13, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, - 0x73, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, - 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x4c, 0x6f, 0x77, - 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x61, 0x6d, 0x70, - 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x12, 0x71, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, - 0x63, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x69, 0x0a, 0x24, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, - 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x1f, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x46, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x5f, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x65, - 0x74, 0x75, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x64, 0x61, 0x74, - 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x1b, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x18, 0x66, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x1b, 0x66, 0x75, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x18, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x53, 0x63, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, + 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x15, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x77, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x66, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, + 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x15, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x7b, 0x0a, 0x26, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x23, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, 0x66, 0x75, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x15, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x7b, 0x0a, 0x26, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x23, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x1e, 0x0a, 0x1c, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, - 0x1b, 0x0a, 0x19, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, - 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x1b, 0x0a, 0x19, - 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, - 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x29, 0x0a, 0x27, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x30, - 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x22, 0x38, 0x0a, 0x08, 0x4e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2c, 0x0a, 0x07, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x0b, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x46, - 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x80, 0x09, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, - 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x12, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x39, 0x0a, 0x0d, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, - 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x68, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, - 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, - 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, - 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, - 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, - 0x46, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, - 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, - 0x3f, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x12, 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x17, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x12, 0x68, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, - 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x62, 0x0a, 0x1c, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x72, 0x65, - 0x62, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x72, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x19, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xde, 0x08, 0x0a, 0x18, 0x42, + 0x6e, 0x64, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, + 0x29, 0x0a, 0x27, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x16, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x07, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x08, 0x4e, 0x65, 0x77, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x22, 0x5c, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x07, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x0d, + 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0x80, 0x09, + 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, + 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, 0x73, + 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x13, + 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x65, 0x6e, 0x61, 0x63, 0x74, + 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31, 0x0a, + 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x39, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, + 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x58, 0x0a, + 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x65, + 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x66, 0x72, + 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x48, + 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x36, + 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x6a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x70, + 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, + 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, + 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, + 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x6f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x11, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x70, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, + 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x68, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x12, 0x62, 0x0a, 0x1c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x62, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, + 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x19, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x22, 0xde, 0x08, 0x0a, 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2f, 0x0a, + 0x13, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x65, 0x6e, 0x61, 0x63, + 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31, + 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x39, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x30, 0x0a, 0x0a, + 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x58, + 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, + 0x66, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, + 0x6d, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, + 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, + 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x6f, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, + 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, + 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, + 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x17, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x6f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x48, 0x00, 0x52, 0x15, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x68, 0x0a, 0x1e, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x70, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x12, 0x2d, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, + 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x12, 0x62, 0x0a, 0x1c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x62, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, + 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x19, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x22, 0xeb, 0x03, 0x0a, 0x12, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x16, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, + 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, + 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, + 0x69, 0x6e, 0x56, 0x6f, 0x74, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3a, + 0x0a, 0x19, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, + 0x6c, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x70, 0x12, 0x31, 0x0a, 0x15, + 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x69, 0x6e, + 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x22, + 0xbe, 0x01, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x41, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, - 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x63, 0x74, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x31, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x39, 0x0a, 0x0d, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x65, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6e, - 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x66, 0x72, 0x65, 0x65, 0x66, 0x6f, - 0x72, 0x6d, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4e, 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x48, 0x00, 0x52, 0x0b, 0x6e, - 0x65, 0x77, 0x46, 0x72, 0x65, 0x65, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x36, 0x0a, 0x0c, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0f, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x12, 0x46, 0x0a, 0x12, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x0c, 0x6e, 0x65, 0x77, - 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x12, 0x3f, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x12, 0x49, 0x0a, 0x13, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x11, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, - 0x17, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, - 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x15, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x12, 0x68, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x70, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x48, - 0x00, 0x52, 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x2d, - 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x48, 0x00, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x62, 0x0a, - 0x1c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x72, - 0x65, 0x62, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x72, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x19, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xeb, 0x03, 0x0a, 0x12, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x6d, 0x69, 0x6e, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, - 0x5f, 0x65, 0x6e, 0x61, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, - 0x78, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x12, 0x35, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, - 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, - 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, - 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x6f, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x56, 0x6f, 0x74, 0x65, - 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6c, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x71, + 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x22, 0x57, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x4a, 0x04, 0x08, + 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xac, 0x04, 0x0a, 0x0e, 0x47, 0x6f, + 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x03, 0x79, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, + 0x65, 0x52, 0x03, 0x79, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x02, 0x6e, 0x6f, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x02, + 0x6e, 0x6f, 0x12, 0x3f, 0x0a, 0x09, 0x79, 0x65, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x59, 0x65, 0x73, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x79, 0x65, 0x73, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x08, 0x6e, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4e, 0x6f, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6e, 0x6f, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x12, 0x3e, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x1a, + 0x47, 0x0a, 0x0d, 0x59, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x0c, 0x4e, 0x6f, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x36, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x5f, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x22, 0xa6, 0x08, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x2a, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x05, + 0x74, 0x65, 0x72, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x01, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, + 0x52, 0x09, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x70, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, - 0x72, 0x69, 0x74, 0x79, 0x4c, 0x70, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x69, 0x6e, 0x5f, 0x65, 0x71, - 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, - 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x22, 0xbe, 0x01, 0x0a, 0x12, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6c, 0x6f, - 0x73, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x41, 0x0a, - 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x57, 0x0a, 0x11, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, - 0x03, 0x10, 0x04, 0x22, 0xac, 0x04, 0x0a, 0x0e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x03, 0x79, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x03, 0x79, 0x65, 0x73, - 0x12, 0x1a, 0x0a, 0x02, 0x6e, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x02, 0x6e, 0x6f, 0x12, 0x3f, 0x0a, 0x09, - 0x79, 0x65, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x59, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x79, 0x65, 0x73, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x3c, 0x0a, - 0x08, 0x6e, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4e, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x07, 0x6e, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0d, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x1a, 0x47, 0x0a, 0x0d, 0x59, 0x65, 0x73, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x0c, 0x4e, 0x6f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x36, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x4e, 0x47, 0x4c, - 0x45, 0x5f, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, - 0x10, 0x01, 0x22, 0xa6, 0x08, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x30, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0c, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x35, - 0x0a, 0x09, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x52, 0x09, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x5e, 0x0a, 0x29, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x26, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x54, 0x0a, 0x24, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x21, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x3e, 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x48, 0x05, - 0x52, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x1e, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x06, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x88, 0x01, 0x01, 0x22, - 0xae, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, - 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x41, 0x53, 0x53, - 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, - 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, - 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x4f, 0x54, 0x45, 0x10, 0x07, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x2c, 0x0a, 0x2a, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x27, 0x0a, 0x25, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x22, 0xca, 0x03, 0x0a, 0x04, - 0x56, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, - 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x1e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x1d, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x1a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x42, - 0x0a, 0x1e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, - 0x69, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x45, 0x71, 0x75, - 0x69, 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x57, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x37, 0x0a, 0x0e, 0x65, 0x6c, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x45, 0x4c, 0x53, 0x50, 0x61, 0x69, 0x72, 0x52, 0x0c, 0x65, - 0x6c, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x22, 0x3b, 0x0a, 0x05, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x56, - 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4e, 0x4f, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x56, 0x41, 0x4c, - 0x55, 0x45, 0x5f, 0x59, 0x45, 0x53, 0x10, 0x02, 0x22, 0x3c, 0x0a, 0x0b, 0x56, 0x6f, 0x74, 0x65, - 0x45, 0x4c, 0x53, 0x50, 0x61, 0x69, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6c, 0x73, 0x22, 0x5b, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x3c, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, + 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6d, + 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x5e, 0x0a, 0x29, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x03, 0x52, 0x26, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x54, 0x0a, 0x24, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, + 0x61, 0x6a, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, + 0x21, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, + 0x65, 0x72, 0x6d, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, + 0x65, 0x72, 0x6d, 0x73, 0x48, 0x05, 0x52, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x54, 0x65, 0x72, + 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, + 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x22, 0xae, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x49, 0x4e, 0x45, 0x44, + 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x41, 0x43, + 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x57, + 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, + 0x56, 0x4f, 0x54, 0x45, 0x10, 0x07, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x2c, 0x0a, + 0x2a, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x27, 0x0a, 0x25, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6a, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, + 0x65, 0x72, 0x6d, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, + 0x64, 0x22, 0xca, 0x03, 0x0a, 0x04, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, + 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x1e, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x41, 0x0a, 0x1d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, + 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x42, 0x0a, 0x1e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x65, 0x71, + 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x37, 0x0a, 0x0e, 0x65, 0x6c, 0x73, 0x5f, + 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x45, 0x4c, 0x53, 0x50, + 0x61, 0x69, 0x72, 0x52, 0x0c, 0x65, 0x6c, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x22, 0x3b, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x56, 0x41, + 0x4c, 0x55, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x4e, 0x4f, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x5f, 0x59, 0x45, 0x53, 0x10, 0x02, 0x22, 0x3c, + 0x0a, 0x0b, 0x56, 0x6f, 0x74, 0x65, 0x45, 0x4c, 0x53, 0x50, 0x61, 0x69, 0x72, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6c, 0x73, 0x22, 0x5b, 0x0a, 0x1b, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x3c, 0x0a, 0x07, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x22, 0xba, 0x01, 0x0a, 0x1c, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, - 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, + 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, + 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, + 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, + 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, + 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, + 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x57, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, + 0xbe, 0x01, 0x0a, 0x1a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x42, + 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, @@ -5689,305 +5736,288 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x22, 0x57, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x3a, 0x0a, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, - 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xbe, 0x01, 0x0a, 0x1a, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, - 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x65, 0x62, - 0x61, 0x74, 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, - 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, - 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, - 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x4f, 0x0a, 0x15, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, - 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, - 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, - 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x0d, - 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, - 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, - 0x69, 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x07, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x1e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x0e, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3b, - 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x1b, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x64, 0x22, 0x47, 0x0a, 0x0b, 0x4e, - 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x73, 0x22, 0xd9, 0x03, 0x0a, 0x18, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, + 0x22, 0x4f, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x22, 0xe6, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x0d, + 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x65, 0x6e, 0x65, 0x66, + 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, + 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, + 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, + 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x12, 0x36, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x73, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x73, 0x22, 0x53, 0x0a, 0x11, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x3e, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, + 0xa0, 0x01, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, + 0x3c, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, + 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x22, 0x3e, 0x0a, 0x1b, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x47, 0x0a, 0x0b, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x12, 0x38, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x32, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2e, - 0x0a, 0x13, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, - 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, - 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x12, - 0x37, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, - 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x72, - 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x22, 0x2f, 0x0a, 0x0e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4f, - 0x6e, 0x22, 0xdc, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, - 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x11, 0x64, 0x69, - 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, - 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, - 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x2a, 0x96, 0x14, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, - 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, - 0x53, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, - 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, - 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, - 0x43, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, - 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, - 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x05, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, - 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x55, - 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, - 0x08, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, - 0x4f, 0x44, 0x45, 0x10, 0x0b, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, - 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, - 0x54, 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, - 0x10, 0x0c, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x2e, 0x0a, - 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, - 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x0e, 0x12, 0x31, 0x0a, - 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x43, 0x4f, - 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x0f, - 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, - 0x10, 0x10, 0x12, 0x2a, 0x0a, 0x26, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x4c, - 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x53, 0x10, 0x11, 0x12, 0x25, - 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x4e, 0x4f, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, - 0x45, 0x52, 0x53, 0x10, 0x12, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, - 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, - 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x13, 0x12, 0x32, 0x0a, 0x2e, 0x50, 0x52, 0x4f, 0x50, 0x4f, - 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, - 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x14, 0x12, 0x36, 0x0a, 0x32, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, - 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, + 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xd9, 0x03, 0x0a, 0x18, 0x4e, + 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6f, 0x66, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x66, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x18, + 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x6e, 0x65, + 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6f, + 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x06, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x2f, 0x0a, 0x0e, 0x4f, 0x6e, 0x65, 0x4f, 0x66, 0x66, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x65, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x22, 0xdc, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x75, + 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x20, + 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, + 0x12, 0x48, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x48, 0x01, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2a, 0x96, 0x14, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x01, + 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, + 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x03, + 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, + 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, + 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x05, + 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, + 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x06, + 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x07, 0x12, + 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x50, 0x52, + 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x08, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x50, 0x4f, + 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x52, 0x41, + 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x0b, 0x12, 0x2b, 0x0a, 0x27, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, + 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, + 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x0c, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x15, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, - 0x4f, 0x4f, 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x10, 0x16, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, - 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, - 0x17, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, - 0x53, 0x54, 0x41, 0x4e, 0x54, 0x49, 0x41, 0x54, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, - 0x10, 0x19, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x55, 0x54, - 0x55, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, - 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, - 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, 0x1e, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x4a, 0x4f, 0x52, - 0x49, 0x54, 0x59, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x36, 0x0a, 0x32, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, - 0x52, 0x54, 0x49, 0x43, 0x49, 0x50, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x45, - 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, - 0x44, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x53, - 0x53, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x10, 0x21, 0x12, 0x1f, 0x0a, - 0x1b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x22, 0x12, 0x2e, - 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, - 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x23, 0x12, 0x23, - 0x0a, 0x1f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x46, 0x4f, 0x52, - 0x4d, 0x10, 0x24, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, - 0x4e, 0x54, 0x5f, 0x45, 0x51, 0x55, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x5f, 0x53, - 0x48, 0x41, 0x52, 0x45, 0x10, 0x25, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, + 0x44, 0x10, 0x0d, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x55, + 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, + 0x44, 0x10, 0x0e, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x52, + 0x43, 0x32, 0x30, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x5f, 0x41, 0x44, 0x44, + 0x52, 0x45, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x26, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, - 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x43, 0x49, - 0x4d, 0x41, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x53, 0x10, 0x27, 0x12, 0x35, 0x0a, 0x31, - 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, - 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, - 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, - 0x53, 0x10, 0x28, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x41, 0x44, 0x44, 0x52, - 0x45, 0x53, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x49, 0x4e, 0x5f, 0x55, - 0x53, 0x45, 0x10, 0x29, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, - 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x56, - 0x45, 0x10, 0x2a, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x52, - 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0x2b, - 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x5f, 0x53, 0x4c, 0x49, 0x50, 0x50, 0x41, - 0x47, 0x45, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, - 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x2c, 0x12, 0x39, 0x0a, 0x35, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x52, - 0x41, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x4c, 0x49, 0x50, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, - 0x45, 0x10, 0x2d, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x50, - 0x4f, 0x54, 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x44, - 0x55, 0x43, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x2f, 0x12, 0x2b, - 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, - 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x30, 0x12, 0x36, 0x0a, 0x32, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, - 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, - 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x31, 0x12, 0x37, 0x0a, 0x33, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, - 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, - 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x32, 0x12, 0x3e, 0x0a, 0x3a, - 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, - 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, - 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, - 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x33, 0x12, 0x2e, 0x0a, 0x2a, - 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x34, 0x12, 0x25, 0x0a, 0x21, - 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, - 0x53, 0x10, 0x35, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, - 0x41, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x36, 0x12, 0x2c, 0x0a, 0x28, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x50, - 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x37, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, + 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x10, 0x12, 0x2a, 0x0a, 0x26, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4d, + 0x50, 0x41, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, + 0x50, 0x53, 0x10, 0x11, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, + 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53, 0x10, 0x12, 0x12, 0x30, 0x0a, 0x2c, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, + 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x13, 0x12, 0x32, 0x0a, + 0x2e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, + 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, + 0x14, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, + 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x15, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, + 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x10, 0x16, + 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, + 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0x17, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, 0x50, 0x4f, + 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x55, 0x4c, 0x44, 0x5f, + 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x49, 0x41, 0x54, 0x45, 0x5f, + 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x19, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, - 0x52, 0x41, 0x4d, 0x10, 0x38, 0x12, 0x32, 0x0a, 0x2e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, - 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, - 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x39, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x52, 0x45, - 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x3a, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, - 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x44, 0x45, 0x43, - 0x4c, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x3b, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, - 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x50, - 0x4c, 0x41, 0x43, 0x45, 0x53, 0x10, 0x3c, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x52, 0x4f, 0x50, 0x4f, - 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x52, 0x45, 0x42, 0x41, 0x54, 0x45, 0x5f, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x3d, 0x2a, 0xb4, 0x01, 0x0a, 0x15, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x24, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, + 0x49, 0x44, 0x5f, 0x46, 0x55, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, + 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x49, + 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, 0x1e, 0x12, 0x31, + 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x4d, 0x41, 0x4a, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, + 0x4f, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, + 0x1f, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x49, 0x50, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, + 0x53, 0x10, 0x21, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x10, 0x22, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x52, + 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x10, 0x23, 0x12, 0x23, 0x0a, 0x1f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, + 0x52, 0x45, 0x45, 0x46, 0x4f, 0x52, 0x4d, 0x10, 0x24, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, + 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x51, 0x55, 0x49, 0x54, 0x59, 0x5f, + 0x4c, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x10, 0x25, 0x12, 0x21, 0x0a, 0x1d, + 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x26, 0x12, + 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, + 0x54, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x53, + 0x10, 0x27, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x52, + 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x54, + 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x53, 0x10, 0x28, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, + 0x59, 0x5f, 0x49, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x10, 0x29, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, + 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x56, 0x45, 0x10, 0x2a, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, 0x50, + 0x52, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, + 0x41, 0x52, 0x47, 0x45, 0x10, 0x2b, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, + 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x5f, + 0x53, 0x4c, 0x49, 0x50, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, + 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x2c, 0x12, 0x39, + 0x0a, 0x35, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x51, 0x55, 0x41, 0x44, 0x52, 0x41, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x4c, 0x49, 0x50, 0x50, + 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, + 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x2d, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x50, 0x4f, + 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, + 0x45, 0x44, 0x10, 0x2f, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, + 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, + 0x30, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x31, 0x12, 0x37, 0x0a, 0x33, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, + 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x32, 0x12, 0x3e, 0x0a, 0x3a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, + 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x33, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x10, 0x34, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x4c, 0x41, + 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x35, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, + 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x36, + 0x12, 0x2c, 0x0a, 0x28, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, + 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x37, 0x12, 0x2b, + 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, + 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x38, 0x12, 0x32, 0x0a, 0x2e, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x39, 0x12, + 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, + 0x54, 0x43, 0x48, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x3a, 0x12, 0x2d, + 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x54, + 0x43, 0x48, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x3b, 0x12, 0x2e, 0x0a, + 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x44, 0x45, 0x43, + 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x53, 0x10, 0x3c, 0x12, 0x30, 0x0a, + 0x2c, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x52, + 0x45, 0x42, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x3d, 0x2a, + 0xb4, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x24, 0x4d, 0x41, 0x52, + 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, - 0x22, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, - 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x4d, + 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, - 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4d, 0x45, 0x10, 0x03, - 0x2a, 0x99, 0x01, 0x0a, 0x16, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x24, 0x47, + 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, + 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, + 0x53, 0x55, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x99, 0x01, 0x0a, 0x16, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x28, 0x0a, 0x24, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, - 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x48, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, - 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, - 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, - 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x2f, 0x76, 0x65, 0x67, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x4f, 0x52, 0x5f, 0x4e, + 0x4f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x47, 0x4f, 0x56, 0x45, + 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, + 0x10, 0x02, 0x42, 0x27, 0x5a, 0x25, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/protos/vega/markets.pb.go b/protos/vega/markets.pb.go index e044a01458..81216afd34 100644 --- a/protos/vega/markets.pb.go +++ b/protos/vega/markets.pb.go @@ -2228,6 +2228,8 @@ type Market struct { TickSize string `protobuf:"bytes,21,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks EnableTransactionReordering bool `protobuf:"varint,22,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` + // Number of allowed price levels between an AMM's fair price and its quote prices. An AMM definition that exceeds this will be rejected at submission. + AllowedEmptyAmmLevels uint64 `protobuf:"varint,23,opt,name=allowed_empty_amm_levels,json=allowedEmptyAmmLevels,proto3" json:"allowed_empty_amm_levels,omitempty"` } func (x *Market) Reset() { @@ -2416,6 +2418,13 @@ func (x *Market) GetEnableTransactionReordering() bool { return false } +func (x *Market) GetAllowedEmptyAmmLevels() uint64 { + if x != nil { + return x.AllowedEmptyAmmLevels + } + return 0 +} + // Time stamps for important times about creating, enacting etc the market type MarketTimestamps struct { state protoimpl.MessageState @@ -3018,7 +3027,7 @@ var file_vega_markets_proto_rawDesc = []byte{ 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x0d, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb0, + 0x0d, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xe9, 0x0f, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x49, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, @@ -3102,114 +3111,117 @@ var file_vega_markets_proto_rawDesc = []byte{ 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x22, 0xfc, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x13, 0x0a, - 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, - 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x45, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, - 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x07, 0x12, 0x1c, 0x0a, 0x18, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x45, 0x52, - 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x44, 0x10, 0x09, 0x12, 0x22, 0x0a, 0x1e, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, - 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x0a, - 0x22, 0x9c, 0x02, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, - 0x0a, 0x17, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, - 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x54, - 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, - 0x48, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x54, - 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, - 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x23, 0x0a, - 0x1f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x4f, - 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, - 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, - 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, - 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, - 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, - 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, - 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x42, - 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x22, 0x72, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6f, - 0x70, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, - 0x12, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, - 0x74, 0x65, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, 0x2b, 0x0a, 0x11, 0x64, - 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6c, 0x6c, - 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, - 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x69, 0x73, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x22, 0xda, 0x03, 0x0a, 0x1b, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x70, - 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x65, 0x63, 0x61, - 0x79, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x61, 0x73, 0x68, 0x5f, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x73, - 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x3c, - 0x0a, 0x1a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x65, - 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x18, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x6e, - 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x14, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0f, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x5d, 0x0a, 0x19, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x42, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2a, - 0xa3, 0x01, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, - 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, - 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, - 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, - 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, 0x10, 0x02, - 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, - 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x54, 0x52, - 0x41, 0x44, 0x45, 0x10, 0x03, 0x42, 0x27, 0x5a, 0x25, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, - 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x12, 0x37, 0x0a, 0x18, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x65, 0x6d, 0x70, + 0x74, 0x79, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x41, 0x6d, 0x6d, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x22, 0xfc, 0x01, 0x0a, 0x05, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, + 0x44, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x05, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, + 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, + 0x45, 0x44, 0x10, 0x07, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, + 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, + 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, + 0x4c, 0x45, 0x44, 0x10, 0x09, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, + 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, 0x56, + 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x0a, 0x22, 0x9c, 0x02, 0x0a, 0x0b, 0x54, 0x72, + 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x52, 0x41, + 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x41, 0x44, 0x49, + 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, + 0x55, 0x53, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, + 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, + 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, + 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, + 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x54, + 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, + 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, 0x44, + 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, + 0x45, 0x44, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, + 0x45, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, + 0x4f, 0x44, 0x45, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, 0x41, + 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x1a, 0x0a, + 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, + 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, + 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x72, 0x0a, 0x10, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x65, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x8a, + 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x74, 0x65, 0x70, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x66, + 0x75, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6d, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x6c, + 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xda, 0x03, 0x0a, 0x1b, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x64, + 0x65, 0x63, 0x61, 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x65, 0x63, 0x61, 0x79, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, + 0x1f, 0x0a, 0x0b, 0x63, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6c, 0x65, + 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6c, 0x65, + 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5d, 0x0a, 0x19, 0x64, 0x61, 0x74, + 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, + 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, 0x65, + 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0xa3, 0x01, 0x0a, 0x12, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, + 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x45, + 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4d, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, + 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, 0x03, 0x42, 0x27, + 0x5a, 0x25, 0x63, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var (