diff --git a/cmd/gctcli/commands.go b/cmd/gctcli/commands.go index fe2bb7c6..e6f0f8d7 100644 --- a/cmd/gctcli/commands.go +++ b/cmd/gctcli/commands.go @@ -3350,3 +3350,104 @@ func gctScriptUpload(c *cli.Context) error { jsonOutput(uploadCommand) return nil } + +var getHistoricCandlesCommand = cli.Command{ + Name: "gethistoriccandles", + Usage: "gets historical candles for the specified granularity up to range size time from now.", + ArgsUsage: " ", + Action: getHistoricCandles, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "exchange, e", + Usage: "the exchange to get the candles from", + }, + cli.StringFlag{ + Name: "pair", + Usage: "the currency pair to get the candles for", + }, + cli.IntFlag{ + Name: "rangesize, r", + Usage: "the amount of time to go back from now to fetch candles in the given granularity", + }, + cli.IntFlag{ + Name: "granularity, g", + Usage: "value is in seconds and can be one of the following {60, 300, 900, 3600, 21600, 86400}", + }, + }, +} + +func getHistoricCandles(c *cli.Context) error { + if c.NArg() == 0 && c.NumFlags() == 0 { + cli.ShowCommandHelp(c, "gethistoriccandles") + return nil + } + + var exchangeName string + if c.IsSet("exchange") { + exchangeName = c.String("exchange") + } else { + exchangeName = c.Args().First() + } + if !validExchange(exchangeName) { + return errInvalidExchange + } + + var currencyPair string + if c.IsSet("pair") { + currencyPair = c.String("pair") + } else { + currencyPair = c.Args().Get(1) + } + if !validPair(currencyPair) { + return errInvalidPair + } + p := currency.NewPairDelimiter(currencyPair, pairDelimiter) + + var rangesize int64 + if c.IsSet("rangesize") { + rangesize = c.Int64("rangesize") + } else { + rs, err := strconv.Atoi(c.Args().Get(2)) + if err != nil { + return fmt.Errorf("unable to strconv input to int. Err: %s", err) + } + rangesize = int64(rs) + } + + var granularity int64 + if c.IsSet("granularity") { + granularity = c.Int64("granularity") + } else { + gr, err := strconv.Atoi(c.Args().Get(3)) + if err != nil { + return fmt.Errorf("unable to strconv input to int. Err: %s", err) + } + granularity = int64(gr) + } + + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + client := gctrpc.NewGoCryptoTraderClient(conn) + result, err := client.GetHistoricCandles(context.Background(), + &gctrpc.GetHistoricCandlesRequest{ + Exchange: exchangeName, + Pair: &gctrpc.CurrencyPair{ + Delimiter: p.Delimiter, + Base: p.Base.String(), + Quote: p.Quote.String(), + }, + Rangesize: rangesize, + Granularity: granularity, + }) + + if err != nil { + return err + } + + jsonOutput(result) + return nil +} diff --git a/cmd/gctcli/main.go b/cmd/gctcli/main.go index 0f453c1b..a353c5c1 100644 --- a/cmd/gctcli/main.go +++ b/cmd/gctcli/main.go @@ -133,6 +133,7 @@ func main() { getTickerStreamCommand, getExchangeTickerStreamCommand, getAuditEventCommand, + getHistoricCandlesCommand, gctScriptCommand, } diff --git a/common/common.go b/common/common.go index 93086851..2e58eb7c 100644 --- a/common/common.go +++ b/common/common.go @@ -12,6 +12,7 @@ import ( "os" "os/user" "path/filepath" + "reflect" "regexp" "strconv" "strings" @@ -354,3 +355,24 @@ func SplitStringSliceByLimit(in []string, limit uint) [][]string { } return sliceSlice } + +// InArray checks if _val_ belongs to _array_ +func InArray(val, array interface{}) (exists bool, index int) { + exists = false + index = -1 + if array == nil { + return + } + switch reflect.TypeOf(array).Kind() { + case reflect.Array, reflect.Slice: + s := reflect.ValueOf(array) + for i := 0; i < s.Len(); i++ { + if reflect.DeepEqual(val, s.Index(i).Interface()) { + index = i + exists = true + return + } + } + } + return +} diff --git a/common/common_test.go b/common/common_test.go index 5413564a..2a5ad76f 100644 --- a/common/common_test.go +++ b/common/common_test.go @@ -526,3 +526,41 @@ func TestSplitStringSliceByLimit(t *testing.T) { t.Errorf("expected len() to be 20 instead received: %v", len(out[0])) } } + +func TestInArray(t *testing.T) { + InArray(nil, nil) + + array := [6]int{2, 3, 5, 7, 11, 13} + isIn, pos := InArray(5, array) + if !isIn { + t.Errorf("failed to find the value within the array") + } + if pos != 2 { + t.Errorf("failed return the correct position of the value in the array") + } + isIn, _ = InArray(1, array) + if isIn { + t.Errorf("found a non existent value in the array") + } + + slice := make([]int, 0) + slice = append(append(slice, 5), 3) + isIn, pos = InArray(5, slice) + if !isIn { + t.Errorf("failed to find the value within the slice") + } + if pos != 0 { + t.Errorf("failed return the correct position of the value in the slice") + } + isIn, pos = InArray(3, slice) + if !isIn { + t.Errorf("failed to find the value within the slice") + } + if pos != 1 { + t.Errorf("failed return the correct position of the value in the slice") + } + isIn, _ = InArray(1, slice) + if isIn { + t.Errorf("found a non existent value in the slice") + } +} diff --git a/engine/rpcserver.go b/engine/rpcserver.go index 67290990..9d335fee 100644 --- a/engine/rpcserver.go +++ b/engine/rpcserver.go @@ -1221,6 +1221,44 @@ func (s *RPCServer) GetAuditEvent(ctx context.Context, r *gctrpc.GetAuditEventRe return &resp, nil } +// GetHistoricCandles returns historical candles for a given exchange +func (s *RPCServer) GetHistoricCandles(ctx context.Context, req *gctrpc.GetHistoricCandlesRequest) (*gctrpc.GetHistoricCandlesResponse, error) { + if req.Exchange == "" { + return nil, errors.New(errExchangeNameUnset) + } + + if req.Pair.String() == "" { + return nil, errors.New(errCurrencyPairUnset) + } + + exchange := GetExchangeByName(req.Exchange) + if exchange == nil { + return nil, errors.New("Exchange " + req.Exchange + " not found") + } + + candles, err := exchange.GetHistoricCandles(currency.Pair{ + Delimiter: req.Pair.Delimiter, + Base: currency.NewCode(req.Pair.Base), + Quote: currency.NewCode(req.Pair.Quote), + }, req.Rangesize, req.Granularity) + if err != nil { + return nil, err + } + resp := gctrpc.GetHistoricCandlesResponse{} + for _, candle := range candles { + tempCandle := &gctrpc.Candle{ + Time: candle.Time, + Low: candle.Low, + High: candle.High, + Open: candle.Open, + Close: candle.Close, + Volume: candle.Volume, + } + resp.Candle = append(resp.Candle, tempCandle) + } + return &resp, nil +} + // GCTScriptStatus returns a slice of current running scripts that includes next run time and uuid func (s *RPCServer) GCTScriptStatus(ctx context.Context, r *gctrpc.GCTScriptStatusRequest) (*gctrpc.GCTScriptStatusResponse, error) { if !gctscript.GCTScriptConfig.Enabled { diff --git a/exchanges/binance/binance.go b/exchanges/binance/binance.go index c324dc5f..2869099a 100644 --- a/exchanges/binance/binance.go +++ b/exchanges/binance/binance.go @@ -72,6 +72,11 @@ type Binance struct { validIntervals []TimeInterval } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *Binance) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetExchangeInfo returns exchange information. Check binance_types for more // information func (b *Binance) GetExchangeInfo() (ExchangeInfo, error) { diff --git a/exchanges/bitfinex/bitfinex.go b/exchanges/bitfinex/bitfinex.go index ec627bba..0dbf285e 100644 --- a/exchanges/bitfinex/bitfinex.go +++ b/exchanges/bitfinex/bitfinex.go @@ -91,6 +91,11 @@ type Bitfinex struct { WebsocketSubdChannels map[int]WebsocketChanInfo } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *Bitfinex) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetPlatformStatus returns the Bifinex platform status func (b *Bitfinex) GetPlatformStatus() (int, error) { var response []interface{} diff --git a/exchanges/bitflyer/bitflyer.go b/exchanges/bitflyer/bitflyer.go index 9c9a520a..7bacc7d4 100644 --- a/exchanges/bitflyer/bitflyer.go +++ b/exchanges/bitflyer/bitflyer.go @@ -7,6 +7,7 @@ import ( "net/url" "strconv" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" ) @@ -70,6 +71,11 @@ type Bitflyer struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *Bitflyer) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetLatestBlockCA returns the latest block information from bitflyer chain // analysis system func (b *Bitflyer) GetLatestBlockCA() (ChainAnalysisBlock, error) { diff --git a/exchanges/bithumb/bithumb.go b/exchanges/bithumb/bithumb.go index d4fc20fc..f9bb94c0 100644 --- a/exchanges/bithumb/bithumb.go +++ b/exchanges/bithumb/bithumb.go @@ -11,6 +11,7 @@ import ( "strconv" "strings" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -55,6 +56,11 @@ type Bithumb struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *Bithumb) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetTradablePairs returns a list of tradable currencies func (b *Bithumb) GetTradablePairs() ([]string, error) { result, err := b.GetAllTickers() diff --git a/exchanges/bitmex/bitmex.go b/exchanges/bitmex/bitmex.go index 5a886b4d..dbae21a5 100644 --- a/exchanges/bitmex/bitmex.go +++ b/exchanges/bitmex/bitmex.go @@ -9,6 +9,7 @@ import ( "strings" "time" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -908,3 +909,8 @@ func calculateTradingFee(purchasePrice, amount float64, isMaker bool) float64 { return fee * purchasePrice * amount } + +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *Bitmex) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} diff --git a/exchanges/bitstamp/bitstamp.go b/exchanges/bitstamp/bitstamp.go index f647dee8..c53a398b 100644 --- a/exchanges/bitstamp/bitstamp.go +++ b/exchanges/bitstamp/bitstamp.go @@ -64,6 +64,11 @@ type Bitstamp struct { WebsocketConn *wshandler.WebsocketConnection } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *Bitstamp) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetFee returns an estimate of fee based on type of transaction func (b *Bitstamp) GetFee(feeBuilder *exchange.FeeBuilder) (float64, error) { var fee float64 diff --git a/exchanges/bittrex/bittrex.go b/exchanges/bittrex/bittrex.go index 70a64a53..8d49567b 100644 --- a/exchanges/bittrex/bittrex.go +++ b/exchanges/bittrex/bittrex.go @@ -9,6 +9,7 @@ import ( "strings" "time" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -62,6 +63,11 @@ type Bittrex struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *Bittrex) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetMarkets is used to get the open and available trading markets at Bittrex // along with other meta data. func (b *Bittrex) GetMarkets() (Market, error) { diff --git a/exchanges/btcmarkets/btcmarkets.go b/exchanges/btcmarkets/btcmarkets.go index 60e031d8..c167ed37 100644 --- a/exchanges/btcmarkets/btcmarkets.go +++ b/exchanges/btcmarkets/btcmarkets.go @@ -82,6 +82,11 @@ type BTCMarkets struct { WebsocketConn *wshandler.WebsocketConnection } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *BTCMarkets) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetMarkets returns the BTCMarkets instruments func (b *BTCMarkets) GetMarkets() ([]Market, error) { var resp []Market diff --git a/exchanges/btse/btse.go b/exchanges/btse/btse.go index 99faa3b7..9b4f481a 100644 --- a/exchanges/btse/btse.go +++ b/exchanges/btse/btse.go @@ -10,6 +10,7 @@ import ( "strconv" "time" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -324,3 +325,8 @@ func calculateTradingFee(isMaker bool) float64 { func parseOrderTime(timeStr string) (time.Time, error) { return time.Parse(btseTimeLayout, timeStr) } + +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (b *BTSE) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} diff --git a/exchanges/coinbasepro/coinbasepro.go b/exchanges/coinbasepro/coinbasepro.go index 8ebcab1a..f3ddd38e 100644 --- a/exchanges/coinbasepro/coinbasepro.go +++ b/exchanges/coinbasepro/coinbasepro.go @@ -162,19 +162,28 @@ func (c *CoinbasePro) GetTrades(currencyPair string) ([]Trade, error) { // GetHistoricRates returns historic rates for a product. Rates are returned in // grouped buckets based on requested granularity. -func (c *CoinbasePro) GetHistoricRates(currencyPair string, start, end, granularity int64) ([]History, error) { +func (c *CoinbasePro) GetHistoricRates(currencyPair, start, end string, granularity int64) ([]History, error) { var resp [][]interface{} var history []History values := url.Values{} - if start > 0 { - values.Set("start", strconv.FormatInt(start, 10)) + if len(start) > 0 { + values.Set("start", start) + } else { + values.Set("start", "") } - if end > 0 { - values.Set("end", strconv.FormatInt(end, 10)) + if len(end) > 0 { + values.Set("end", end) + } else { + values.Set("end", "") } + allowedGranularities := [6]int64{60, 300, 900, 3600, 21600, 86400} + validGran, _ := common.InArray(granularity, allowedGranularities) + if !validGran { + return nil, errors.New("Invalid granularity value: " + strconv.FormatInt(granularity, 10) + ". Allowed values are {60, 300, 900, 3600, 21600, 86400}") + } if granularity > 0 { values.Set("granularity", strconv.FormatInt(granularity, 10)) } diff --git a/exchanges/coinbasepro/coinbasepro_test.go b/exchanges/coinbasepro/coinbasepro_test.go index 75fe978f..e309a53d 100644 --- a/exchanges/coinbasepro/coinbasepro_test.go +++ b/exchanges/coinbasepro/coinbasepro_test.go @@ -1,6 +1,7 @@ package coinbasepro import ( + "fmt" "log" "net/http" "os" @@ -75,10 +76,55 @@ func TestGetTrades(t *testing.T) { } } -func TestGetHistoricRates(t *testing.T) { - _, err := c.GetHistoricRates(testPair, 0, 0, 0) +func TestGetHistoricRatesApiCheck(t *testing.T) { + e := expectedCandles(5, 300, 60) + if e != nil { + t.Error(e) + } + e = expectedCandles(2, 600, 300) + if e != nil { + t.Error(e) + } + e = expectedCandles(2, 1800, 900) + if e != nil { + t.Error(e) + } + e = expectedCandles(2, 7200, 3600) + if e != nil { + t.Error(e) + } + e = expectedCandles(2, 43200, 21600) + if e != nil { + t.Error(e) + } + e = expectedCandles(2, 172800, 86400) + if e != nil { + t.Error(e) + } +} + +// expectedCandles uses the previous candle time window because the current one might not be complete and if used the test would become non-deterministic +func expectedCandles(expectedCandles int, timeRange time.Duration, candleGranularity int64) error { + end := time.Now().UTC().Add(-time.Second * timeRange) // the latest candle may not yet be ready, so skipping to the previous one + start := end.Add(-time.Second * timeRange) + resp, err := c.GetHistoricRates(testPair, start.Format(time.RFC3339), end.Format(time.RFC3339), candleGranularity) if err != nil { - t.Error("GetHistoricRates() error", err) + return err + } + if len(resp) != expectedCandles { + err := fmt.Errorf("expected %d candles, returned: %d", expectedCandles, len(resp)) + return err + } + return nil +} + +func TestGetHistoricRatesGranularityCheck(t *testing.T) { + end := time.Now().UTC() + start := time.Now().UTC().Add(-time.Second * 300) + invalidGranularity := 11 + _, err := c.GetHistoricRates(testPair, start.Format(time.RFC3339), end.Format(time.RFC3339), int64(invalidGranularity)) + if err == nil { + t.Error("granularity validation did not work as expected") } } diff --git a/exchanges/coinbasepro/coinbasepro_wrapper.go b/exchanges/coinbasepro/coinbasepro_wrapper.go index afcd6f79..cd249430 100644 --- a/exchanges/coinbasepro/coinbasepro_wrapper.go +++ b/exchanges/coinbasepro/coinbasepro_wrapper.go @@ -96,6 +96,7 @@ func (c *CoinbasePro) SetDefaults() { TradeFee: true, FiatDepositFee: true, FiatWithdrawalFee: true, + CandleHistory: true, }, WebsocketCapabilities: protocol.Features{ TickerFetching: true, @@ -615,3 +616,26 @@ func (c *CoinbasePro) GetSubscriptions() ([]wshandler.WebsocketChannelSubscripti func (c *CoinbasePro) AuthenticateWebsocket() error { return common.ErrFunctionNotSupported } + +// GetHistoricCandles Allows to retrieve an amount of candles back in time starting from now up to rangesize * granularity, where granularity is the trade period covered by each candle +func (c *CoinbasePro) GetHistoricCandles(p currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + end := time.Now().UTC() + b := granularity * rangesize + start := time.Now().UTC().Add(-time.Second * time.Duration(b)) + history, err := c.GetHistoricRates(p.String(), start.Format(time.RFC3339), end.Format(time.RFC3339), granularity) + if err != nil { + return nil, err + } + var candles []exchange.Candle + for x := range history { + candles = append(candles, exchange.Candle{ + Time: history[x].Time, + Low: history[x].Low, + High: history[x].High, + Open: history[x].Open, + Close: history[x].Close, + Volume: history[x].Volume, + }) + } + return candles, nil +} diff --git a/exchanges/coinbene/coinbene.go b/exchanges/coinbene/coinbene.go index 64951070..85086be8 100644 --- a/exchanges/coinbene/coinbene.go +++ b/exchanges/coinbene/coinbene.go @@ -14,6 +14,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" + "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -1072,3 +1073,8 @@ func (c *Coinbene) SendAuthHTTPRequest(method, path, epPath string, isSwap bool, } return json.Unmarshal(resp, result) } + +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (c *Coinbene) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrFunctionNotSupported +} diff --git a/exchanges/coinut/coinut.go b/exchanges/coinut/coinut.go index 7cb7157e..c29b43f8 100644 --- a/exchanges/coinut/coinut.go +++ b/exchanges/coinut/coinut.go @@ -9,6 +9,7 @@ import ( "strconv" "strings" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -55,6 +56,11 @@ type COINUT struct { instrumentMap instrumentMap } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (c *COINUT) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // SeedInstruments seeds the instrument map func (c *COINUT) SeedInstruments() error { i, err := c.GetInstruments() diff --git a/exchanges/exchange_types.go b/exchanges/exchange_types.go index 2c9024c5..8e478678 100644 --- a/exchanges/exchange_types.go +++ b/exchanges/exchange_types.go @@ -139,6 +139,16 @@ type TradeHistory struct { Description string } +// Candle holds historic rate information. Modelled after the Coinbase historic rate structure +type Candle struct { + Time int64 + Low float64 + High float64 + Open float64 + Close float64 + Volume float64 +} + // FundHistory holds exchange funding history data type FundHistory struct { ExchangeName string diff --git a/exchanges/exmo/exmo.go b/exchanges/exmo/exmo.go index 0e2dd899..554ef625 100644 --- a/exchanges/exmo/exmo.go +++ b/exchanges/exmo/exmo.go @@ -49,6 +49,11 @@ type EXMO struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (e *EXMO) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetTrades returns the trades for a symbol or symbols func (e *EXMO) GetTrades(symbol string) (map[string][]Trades, error) { v := url.Values{} diff --git a/exchanges/gateio/gateio.go b/exchanges/gateio/gateio.go index d9551eb9..2115559b 100644 --- a/exchanges/gateio/gateio.go +++ b/exchanges/gateio/gateio.go @@ -8,6 +8,7 @@ import ( "strconv" "strings" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/convert" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" @@ -47,6 +48,12 @@ type Gateio struct { exchange.Base } +// GetHistoriCandles +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (g *Gateio) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetSymbols returns all supported symbols func (g *Gateio) GetSymbols() ([]string, error) { var result []string diff --git a/exchanges/gemini/gemini.go b/exchanges/gemini/gemini.go index cc5d96a6..744c1b0c 100644 --- a/exchanges/gemini/gemini.go +++ b/exchanges/gemini/gemini.go @@ -11,6 +11,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" + "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" log "github.com/thrasher-corp/gocryptotrader/logger" @@ -444,3 +445,8 @@ func calculateTradingFee(notionVolume *NotionalVolume, purchasePrice, amount flo return volumeFee * amount * purchasePrice } + +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (g *Gemini) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrFunctionNotSupported +} diff --git a/exchanges/hitbtc/hitbtc.go b/exchanges/hitbtc/hitbtc.go index 63649393..ba0d2b76 100644 --- a/exchanges/hitbtc/hitbtc.go +++ b/exchanges/hitbtc/hitbtc.go @@ -8,6 +8,7 @@ import ( "net/url" "strconv" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -50,6 +51,11 @@ type HitBTC struct { WebsocketConn *wshandler.WebsocketConnection } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (h *HitBTC) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // Public Market Data // https://api.hitbtc.com/?python#market-data diff --git a/exchanges/huobi/huobi.go b/exchanges/huobi/huobi.go index 22121506..783bcd9f 100644 --- a/exchanges/huobi/huobi.go +++ b/exchanges/huobi/huobi.go @@ -70,6 +70,11 @@ type HUOBI struct { AuthenticatedWebsocketConn *wshandler.WebsocketConnection } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (h *HUOBI) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetSpotKline returns kline data // KlinesRequestParams contains symbol, period and size func (h *HUOBI) GetSpotKline(arg KlinesRequestParams) ([]KlineItem, error) { diff --git a/exchanges/interfaces.go b/exchanges/interfaces.go index 2b0bd58b..0a2661e6 100644 --- a/exchanges/interfaces.go +++ b/exchanges/interfaces.go @@ -68,4 +68,5 @@ type IBotExchange interface { GetDefaultConfig() (*config.ExchangeConfig, error) GetBase() *Base SupportsAsset(assetType asset.Item) bool + GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]Candle, error) } diff --git a/exchanges/itbit/itbit.go b/exchanges/itbit/itbit.go index 555853f5..84d41816 100644 --- a/exchanges/itbit/itbit.go +++ b/exchanges/itbit/itbit.go @@ -40,6 +40,11 @@ type ItBit struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (i *ItBit) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetTicker returns ticker info for a specified market. // currencyPair - example "XBTUSD" "XBTSGD" "XBTEUR" func (i *ItBit) GetTicker(currencyPair string) (Ticker, error) { diff --git a/exchanges/kraken/kraken.go b/exchanges/kraken/kraken.go index ca487ee8..665b2fce 100644 --- a/exchanges/kraken/kraken.go +++ b/exchanges/kraken/kraken.go @@ -9,6 +9,7 @@ import ( "strings" "sync" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -63,6 +64,11 @@ type Kraken struct { wsRequestMtx sync.Mutex } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (k *Kraken) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetServerTime returns current server time func (k *Kraken) GetServerTime() (TimeResponse, error) { path := fmt.Sprintf("%s/%s/public/%s", k.API.Endpoints.URL, krakenAPIVersion, krakenServerTime) diff --git a/exchanges/lakebtc/lakebtc.go b/exchanges/lakebtc/lakebtc.go index 1aef5c5b..92f6e06b 100644 --- a/exchanges/lakebtc/lakebtc.go +++ b/exchanges/lakebtc/lakebtc.go @@ -8,6 +8,7 @@ import ( "strconv" "strings" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -40,6 +41,11 @@ type LakeBTC struct { WebsocketConn } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (l *LakeBTC) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetTicker returns the current ticker from lakeBTC func (l *LakeBTC) GetTicker() (map[string]Ticker, error) { response := make(map[string]TickerResponse) diff --git a/exchanges/lbank/lbank.go b/exchanges/lbank/lbank.go index f7f7322b..d105f2e0 100644 --- a/exchanges/lbank/lbank.go +++ b/exchanges/lbank/lbank.go @@ -15,7 +15,9 @@ import ( "strconv" "strings" + "github.com/thrasher-corp/gocryptotrader/common" gctcrypto "github.com/thrasher-corp/gocryptotrader/common/crypto" + "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/order" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -578,3 +580,8 @@ func (l *Lbank) SendAuthHTTPRequest(method, endpoint string, vals url.Values, re l.HTTPDebugging, l.HTTPRecording) } + +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (l *Lbank) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrFunctionNotSupported +} diff --git a/exchanges/localbitcoins/localbitcoins.go b/exchanges/localbitcoins/localbitcoins.go index f84f0728..f71381ed 100644 --- a/exchanges/localbitcoins/localbitcoins.go +++ b/exchanges/localbitcoins/localbitcoins.go @@ -11,6 +11,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" + "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" log "github.com/thrasher-corp/gocryptotrader/logger" ) @@ -112,6 +113,11 @@ type LocalBitcoins struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (l *LocalBitcoins) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrFunctionNotSupported +} + // GetAccountInformation lets you retrieve the public user information on a // LocalBitcoins user. The response contains the same information that is found // on an account's public profile page. diff --git a/exchanges/okcoin/okcoin.go b/exchanges/okcoin/okcoin.go index 51df8211..2352cf89 100644 --- a/exchanges/okcoin/okcoin.go +++ b/exchanges/okcoin/okcoin.go @@ -1,6 +1,9 @@ package okcoin import ( + "github.com/thrasher-corp/gocryptotrader/common" + "github.com/thrasher-corp/gocryptotrader/currency" + exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/okgroup" ) @@ -18,3 +21,8 @@ const ( type OKCoin struct { okgroup.OKGroup } + +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (o *OKCoin) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrFunctionNotSupported +} diff --git a/exchanges/okex/okex.go b/exchanges/okex/okex.go index 51a4d2bc..6020a264 100644 --- a/exchanges/okex/okex.go +++ b/exchanges/okex/okex.go @@ -5,6 +5,8 @@ import ( "net/http" "github.com/thrasher-corp/gocryptotrader/common" + "github.com/thrasher-corp/gocryptotrader/currency" + exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/okgroup" ) @@ -45,6 +47,11 @@ type OKEX struct { okgroup.OKGroup } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (o *OKEX) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrFunctionNotSupported +} + // GetFuturesPostions Get the information of all holding positions in futures trading. // Due to high energy consumption, you are advised to capture data with the "Futures Account of a Currency" API instead. func (o *OKEX) GetFuturesPostions() (resp okgroup.GetFuturesPositionsResponse, _ error) { diff --git a/exchanges/poloniex/poloniex.go b/exchanges/poloniex/poloniex.go index eb28f579..91946905 100644 --- a/exchanges/poloniex/poloniex.go +++ b/exchanges/poloniex/poloniex.go @@ -10,6 +10,7 @@ import ( "strconv" "time" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -59,6 +60,11 @@ type Poloniex struct { WebsocketConn *wshandler.WebsocketConnection } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (p *Poloniex) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetTicker returns current ticker information func (p *Poloniex) GetTicker() (map[string]Ticker, error) { type response struct { diff --git a/exchanges/protocol/features.go b/exchanges/protocol/features.go index 09e24396..821907a2 100644 --- a/exchanges/protocol/features.go +++ b/exchanges/protocol/features.go @@ -37,4 +37,5 @@ type Features struct { AuthenticatedEndpoints bool `json:"authenticatedEndpoints,omitempty"` MessageCorrelation bool `json:"messageCorrelation,omitempty"` MessageSequenceNumbers bool `json:"messageSequenceNumbers,omitempty"` + CandleHistory bool `json:"candlehistory,omitempty"` } diff --git a/exchanges/yobit/yobit.go b/exchanges/yobit/yobit.go index da82d928..f6b3ee79 100644 --- a/exchanges/yobit/yobit.go +++ b/exchanges/yobit/yobit.go @@ -8,6 +8,7 @@ import ( "strconv" "strings" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" @@ -42,6 +43,11 @@ type Yobit struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (y *Yobit) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // GetInfo returns the Yobit info func (y *Yobit) GetInfo() (Info, error) { resp := Info{} diff --git a/exchanges/zb/zb.go b/exchanges/zb/zb.go index 462d5742..89ac80ad 100644 --- a/exchanges/zb/zb.go +++ b/exchanges/zb/zb.go @@ -10,6 +10,7 @@ import ( "strings" "time" + "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/common/convert" "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" @@ -47,6 +48,11 @@ type ZB struct { exchange.Base } +// GetHistoriCandles returns _rangesize_ number of candles for the given _granularity_ and _pair_ starting from the latest available +func (z *ZB) GetHistoricCandles(pair currency.Pair, rangesize, granularity int64) ([]exchange.Candle, error) { + return nil, common.ErrNotYetImplemented +} + // SpotNewOrder submits an order to ZB func (z *ZB) SpotNewOrder(arg SpotNewOrderRequestParams) (int64, error) { var result SpotNewOrderResponse diff --git a/gctrpc/gen_pb_linux.sh b/gctrpc/gen_pb_linux.sh index 8240e5ee..944b8a9d 100755 --- a/gctrpc/gen_pb_linux.sh +++ b/gctrpc/gen_pb_linux.sh @@ -1,4 +1,5 @@ echo "GoCryptoTrader: Generating gRPC, proxy and swagger files." +export GOPATH=$(go env GOPATH) protoc -I=. -I=$GOPATH/src -I=$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --go_out=plugins=grpc:. rpc.proto protoc -I=. -I=$GOPATH/src -I=$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --grpc-gateway_out=logtostderr=true:. rpc.proto protoc -I=. -I=$GOPATH/src -I=$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --swagger_out=logtostderr=true:. rpc.proto \ No newline at end of file diff --git a/gctrpc/rpc.pb.go b/gctrpc/rpc.pb.go index be6cebfe..80261705 100644 --- a/gctrpc/rpc.pb.go +++ b/gctrpc/rpc.pb.go @@ -5014,6 +5014,187 @@ func (m *GetAuditEventResponse) GetEvents() []*AuditEvent { return nil } +type GetHistoricCandlesRequest struct { + Exchange string `protobuf:"bytes,1,opt,name=exchange,proto3" json:"exchange,omitempty"` + Pair *CurrencyPair `protobuf:"bytes,2,opt,name=pair,proto3" json:"pair,omitempty"` + Rangesize int64 `protobuf:"varint,3,opt,name=rangesize,proto3" json:"rangesize,omitempty"` + Granularity int64 `protobuf:"varint,4,opt,name=granularity,proto3" json:"granularity,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetHistoricCandlesRequest) Reset() { *m = GetHistoricCandlesRequest{} } +func (m *GetHistoricCandlesRequest) String() string { return proto.CompactTextString(m) } +func (*GetHistoricCandlesRequest) ProtoMessage() {} +func (*GetHistoricCandlesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{98} +} + +func (m *GetHistoricCandlesRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetHistoricCandlesRequest.Unmarshal(m, b) +} +func (m *GetHistoricCandlesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetHistoricCandlesRequest.Marshal(b, m, deterministic) +} +func (m *GetHistoricCandlesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetHistoricCandlesRequest.Merge(m, src) +} +func (m *GetHistoricCandlesRequest) XXX_Size() int { + return xxx_messageInfo_GetHistoricCandlesRequest.Size(m) +} +func (m *GetHistoricCandlesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetHistoricCandlesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetHistoricCandlesRequest proto.InternalMessageInfo + +func (m *GetHistoricCandlesRequest) GetExchange() string { + if m != nil { + return m.Exchange + } + return "" +} + +func (m *GetHistoricCandlesRequest) GetPair() *CurrencyPair { + if m != nil { + return m.Pair + } + return nil +} + +func (m *GetHistoricCandlesRequest) GetRangesize() int64 { + if m != nil { + return m.Rangesize + } + return 0 +} + +func (m *GetHistoricCandlesRequest) GetGranularity() int64 { + if m != nil { + return m.Granularity + } + return 0 +} + +type GetHistoricCandlesResponse struct { + Candle []*Candle `protobuf:"bytes,1,rep,name=candle,proto3" json:"candle,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetHistoricCandlesResponse) Reset() { *m = GetHistoricCandlesResponse{} } +func (m *GetHistoricCandlesResponse) String() string { return proto.CompactTextString(m) } +func (*GetHistoricCandlesResponse) ProtoMessage() {} +func (*GetHistoricCandlesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{99} +} + +func (m *GetHistoricCandlesResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetHistoricCandlesResponse.Unmarshal(m, b) +} +func (m *GetHistoricCandlesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetHistoricCandlesResponse.Marshal(b, m, deterministic) +} +func (m *GetHistoricCandlesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetHistoricCandlesResponse.Merge(m, src) +} +func (m *GetHistoricCandlesResponse) XXX_Size() int { + return xxx_messageInfo_GetHistoricCandlesResponse.Size(m) +} +func (m *GetHistoricCandlesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetHistoricCandlesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetHistoricCandlesResponse proto.InternalMessageInfo + +func (m *GetHistoricCandlesResponse) GetCandle() []*Candle { + if m != nil { + return m.Candle + } + return nil +} + +type Candle struct { + Time int64 `protobuf:"varint,1,opt,name=time,proto3" json:"time,omitempty"` + Low float64 `protobuf:"fixed64,2,opt,name=low,proto3" json:"low,omitempty"` + High float64 `protobuf:"fixed64,3,opt,name=high,proto3" json:"high,omitempty"` + Open float64 `protobuf:"fixed64,4,opt,name=open,proto3" json:"open,omitempty"` + Close float64 `protobuf:"fixed64,5,opt,name=close,proto3" json:"close,omitempty"` + Volume float64 `protobuf:"fixed64,6,opt,name=volume,proto3" json:"volume,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Candle) Reset() { *m = Candle{} } +func (m *Candle) String() string { return proto.CompactTextString(m) } +func (*Candle) ProtoMessage() {} +func (*Candle) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{100} +} + +func (m *Candle) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Candle.Unmarshal(m, b) +} +func (m *Candle) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Candle.Marshal(b, m, deterministic) +} +func (m *Candle) XXX_Merge(src proto.Message) { + xxx_messageInfo_Candle.Merge(m, src) +} +func (m *Candle) XXX_Size() int { + return xxx_messageInfo_Candle.Size(m) +} +func (m *Candle) XXX_DiscardUnknown() { + xxx_messageInfo_Candle.DiscardUnknown(m) +} + +var xxx_messageInfo_Candle proto.InternalMessageInfo + +func (m *Candle) GetTime() int64 { + if m != nil { + return m.Time + } + return 0 +} + +func (m *Candle) GetLow() float64 { + if m != nil { + return m.Low + } + return 0 +} + +func (m *Candle) GetHigh() float64 { + if m != nil { + return m.High + } + return 0 +} + +func (m *Candle) GetOpen() float64 { + if m != nil { + return m.Open + } + return 0 +} + +func (m *Candle) GetClose() float64 { + if m != nil { + return m.Close + } + return 0 +} + +func (m *Candle) GetVolume() float64 { + if m != nil { + return m.Volume + } + return 0 +} + type AuditEvent struct { Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` Identifier string `protobuf:"bytes,2,opt,name=identifier,proto3" json:"identifier,omitempty"` @@ -5028,7 +5209,7 @@ func (m *AuditEvent) Reset() { *m = AuditEvent{} } func (m *AuditEvent) String() string { return proto.CompactTextString(m) } func (*AuditEvent) ProtoMessage() {} func (*AuditEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{98} + return fileDescriptor_77a6da22d6a3feb1, []int{101} } func (m *AuditEvent) XXX_Unmarshal(b []byte) error { @@ -5091,7 +5272,7 @@ func (m *GCTScript) Reset() { *m = GCTScript{} } func (m *GCTScript) String() string { return proto.CompactTextString(m) } func (*GCTScript) ProtoMessage() {} func (*GCTScript) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{99} + return fileDescriptor_77a6da22d6a3feb1, []int{102} } func (m *GCTScript) XXX_Unmarshal(b []byte) error { @@ -5151,7 +5332,7 @@ func (m *GCTScriptExecuteRequest) Reset() { *m = GCTScriptExecuteRequest func (m *GCTScriptExecuteRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptExecuteRequest) ProtoMessage() {} func (*GCTScriptExecuteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{100} + return fileDescriptor_77a6da22d6a3feb1, []int{103} } func (m *GCTScriptExecuteRequest) XXX_Unmarshal(b []byte) error { @@ -5190,7 +5371,7 @@ func (m *GCTScriptStopRequest) Reset() { *m = GCTScriptStopRequest{} } func (m *GCTScriptStopRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptStopRequest) ProtoMessage() {} func (*GCTScriptStopRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{101} + return fileDescriptor_77a6da22d6a3feb1, []int{104} } func (m *GCTScriptStopRequest) XXX_Unmarshal(b []byte) error { @@ -5228,7 +5409,7 @@ func (m *GCTScriptStopAllRequest) Reset() { *m = GCTScriptStopAllRequest func (m *GCTScriptStopAllRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptStopAllRequest) ProtoMessage() {} func (*GCTScriptStopAllRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{102} + return fileDescriptor_77a6da22d6a3feb1, []int{105} } func (m *GCTScriptStopAllRequest) XXX_Unmarshal(b []byte) error { @@ -5259,7 +5440,7 @@ func (m *GCTScriptStatusRequest) Reset() { *m = GCTScriptStatusRequest{} func (m *GCTScriptStatusRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptStatusRequest) ProtoMessage() {} func (*GCTScriptStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{103} + return fileDescriptor_77a6da22d6a3feb1, []int{106} } func (m *GCTScriptStatusRequest) XXX_Unmarshal(b []byte) error { @@ -5290,7 +5471,7 @@ func (m *GCTScriptListAllRequest) Reset() { *m = GCTScriptListAllRequest func (m *GCTScriptListAllRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptListAllRequest) ProtoMessage() {} func (*GCTScriptListAllRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{104} + return fileDescriptor_77a6da22d6a3feb1, []int{107} } func (m *GCTScriptListAllRequest) XXX_Unmarshal(b []byte) error { @@ -5326,7 +5507,7 @@ func (m *GCTScriptUploadRequest) Reset() { *m = GCTScriptUploadRequest{} func (m *GCTScriptUploadRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptUploadRequest) ProtoMessage() {} func (*GCTScriptUploadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{105} + return fileDescriptor_77a6da22d6a3feb1, []int{108} } func (m *GCTScriptUploadRequest) XXX_Unmarshal(b []byte) error { @@ -5393,7 +5574,7 @@ func (m *GCTScriptReadScriptRequest) Reset() { *m = GCTScriptReadScriptR func (m *GCTScriptReadScriptRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptReadScriptRequest) ProtoMessage() {} func (*GCTScriptReadScriptRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{106} + return fileDescriptor_77a6da22d6a3feb1, []int{109} } func (m *GCTScriptReadScriptRequest) XXX_Unmarshal(b []byte) error { @@ -5432,7 +5613,7 @@ func (m *GCTScriptQueryRequest) Reset() { *m = GCTScriptQueryRequest{} } func (m *GCTScriptQueryRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptQueryRequest) ProtoMessage() {} func (*GCTScriptQueryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{107} + return fileDescriptor_77a6da22d6a3feb1, []int{110} } func (m *GCTScriptQueryRequest) XXX_Unmarshal(b []byte) error { @@ -5472,7 +5653,7 @@ func (m *GCTScriptAutoLoadRequest) Reset() { *m = GCTScriptAutoLoadReque func (m *GCTScriptAutoLoadRequest) String() string { return proto.CompactTextString(m) } func (*GCTScriptAutoLoadRequest) ProtoMessage() {} func (*GCTScriptAutoLoadRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{108} + return fileDescriptor_77a6da22d6a3feb1, []int{111} } func (m *GCTScriptAutoLoadRequest) XXX_Unmarshal(b []byte) error { @@ -5519,7 +5700,7 @@ func (m *GCTScriptStatusResponse) Reset() { *m = GCTScriptStatusResponse func (m *GCTScriptStatusResponse) String() string { return proto.CompactTextString(m) } func (*GCTScriptStatusResponse) ProtoMessage() {} func (*GCTScriptStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{109} + return fileDescriptor_77a6da22d6a3feb1, []int{112} } func (m *GCTScriptStatusResponse) XXX_Unmarshal(b []byte) error { @@ -5567,7 +5748,7 @@ func (m *GCTScriptQueryResponse) Reset() { *m = GCTScriptQueryResponse{} func (m *GCTScriptQueryResponse) String() string { return proto.CompactTextString(m) } func (*GCTScriptQueryResponse) ProtoMessage() {} func (*GCTScriptQueryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{110} + return fileDescriptor_77a6da22d6a3feb1, []int{113} } func (m *GCTScriptQueryResponse) XXX_Unmarshal(b []byte) error { @@ -5621,7 +5802,7 @@ func (m *GCTScriptGenericResponse) Reset() { *m = GCTScriptGenericRespon func (m *GCTScriptGenericResponse) String() string { return proto.CompactTextString(m) } func (*GCTScriptGenericResponse) ProtoMessage() {} func (*GCTScriptGenericResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{111} + return fileDescriptor_77a6da22d6a3feb1, []int{114} } func (m *GCTScriptGenericResponse) XXX_Unmarshal(b []byte) error { @@ -5769,6 +5950,9 @@ func init() { proto.RegisterType((*GetExchangeTickerStreamRequest)(nil), "gctrpc.GetExchangeTickerStreamRequest") proto.RegisterType((*GetAuditEventRequest)(nil), "gctrpc.GetAuditEventRequest") proto.RegisterType((*GetAuditEventResponse)(nil), "gctrpc.GetAuditEventResponse") + proto.RegisterType((*GetHistoricCandlesRequest)(nil), "gctrpc.GetHistoricCandlesRequest") + proto.RegisterType((*GetHistoricCandlesResponse)(nil), "gctrpc.GetHistoricCandlesResponse") + proto.RegisterType((*Candle)(nil), "gctrpc.Candle") proto.RegisterType((*AuditEvent)(nil), "gctrpc.AuditEvent") proto.RegisterType((*GCTScript)(nil), "gctrpc.GCTScript") proto.RegisterType((*GCTScriptExecuteRequest)(nil), "gctrpc.GCTScriptExecuteRequest") @@ -5788,340 +5972,350 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 5321 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7c, 0xcd, 0x6f, 0x1c, 0x47, - 0x76, 0x38, 0x66, 0xf8, 0x39, 0x8f, 0x5f, 0xc3, 0xe2, 0xd7, 0x68, 0x48, 0x8a, 0x52, 0x7b, 0x2d, - 0x4b, 0xfe, 0xa0, 0x6c, 0x59, 0xbf, 0xdf, 0x3a, 0x6b, 0x67, 0x37, 0x14, 0x25, 0x73, 0xb5, 0xd6, - 0x5a, 0xdc, 0x26, 0x2d, 0x03, 0xde, 0xc0, 0x93, 0xe6, 0x74, 0x71, 0xd8, 0x51, 0x4f, 0x77, 0xbb, - 0xbb, 0x86, 0x14, 0x9d, 0x04, 0x59, 0x18, 0x48, 0x90, 0x43, 0x90, 0x1c, 0x16, 0x09, 0x12, 0x20, - 0xa7, 0x9c, 0x82, 0x00, 0xb9, 0x04, 0x39, 0xe5, 0xb0, 0xc8, 0x35, 0xc8, 0x31, 0x97, 0xfc, 0x01, - 0x41, 0x6e, 0x49, 0x80, 0x00, 0xb9, 0xe4, 0x14, 0xd4, 0xab, 0x8f, 0xae, 0xea, 0xee, 0x21, 0x87, - 0xb6, 0xd6, 0xb9, 0x48, 0x5d, 0xaf, 0x5e, 0xbd, 0xf7, 0xea, 0xd5, 0xab, 0xaa, 0xf7, 0xea, 0xbd, - 0x21, 0x34, 0xd2, 0xa4, 0xbb, 0x9d, 0xa4, 0x31, 0x8b, 0xc9, 0x64, 0xaf, 0xcb, 0xd2, 0xa4, 0xdb, - 0xde, 0xe8, 0xc5, 0x71, 0x2f, 0xa4, 0x77, 0xbd, 0x24, 0xb8, 0xeb, 0x45, 0x51, 0xcc, 0x3c, 0x16, - 0xc4, 0x51, 0x26, 0xb0, 0x9c, 0x26, 0xcc, 0xef, 0x51, 0xf6, 0x38, 0x3a, 0x8e, 0x5d, 0xfa, 0xc5, - 0x80, 0x66, 0xcc, 0xf9, 0xbb, 0x71, 0x58, 0xd0, 0xa0, 0x2c, 0x89, 0xa3, 0x8c, 0x92, 0x55, 0x98, - 0x1c, 0x24, 0x2c, 0xe8, 0xd3, 0x56, 0xed, 0x46, 0xed, 0x76, 0xc3, 0x95, 0x2d, 0x72, 0x17, 0x96, - 0xbc, 0x53, 0x2f, 0x08, 0xbd, 0xa3, 0x90, 0x76, 0xe8, 0x8b, 0xee, 0x89, 0x17, 0xf5, 0x68, 0xd6, - 0xaa, 0xdf, 0xa8, 0xdd, 0x1e, 0x73, 0x89, 0xee, 0x7a, 0xa4, 0x7a, 0xc8, 0x1b, 0xb0, 0x48, 0x23, - 0x0e, 0xf2, 0x0d, 0xf4, 0x31, 0x44, 0x6f, 0xca, 0x8e, 0x1c, 0xf9, 0x3e, 0xac, 0xfa, 0xf4, 0xd8, - 0x1b, 0x84, 0xac, 0x73, 0x1c, 0xa7, 0xf4, 0x45, 0x27, 0x49, 0xe3, 0xd3, 0xc0, 0xa7, 0x69, 0x6b, - 0x1c, 0xa5, 0x58, 0x96, 0xbd, 0x1f, 0xf2, 0xce, 0x7d, 0xd9, 0x47, 0xee, 0xc1, 0x8a, 0x1e, 0x15, - 0x78, 0xac, 0xd3, 0x1d, 0xa4, 0x29, 0x8d, 0xba, 0xe7, 0xad, 0x09, 0x1c, 0xb4, 0xa4, 0x06, 0x05, - 0x1e, 0xdb, 0x95, 0x5d, 0xe4, 0x53, 0x68, 0x66, 0x83, 0xa3, 0xec, 0x3c, 0x63, 0xb4, 0xdf, 0xc9, - 0x98, 0xc7, 0x06, 0x59, 0x6b, 0xf2, 0xc6, 0xd8, 0xed, 0x99, 0x7b, 0x6f, 0x6e, 0x0b, 0x35, 0x6e, - 0x17, 0x54, 0xb2, 0x7d, 0xa0, 0xf0, 0x0f, 0x10, 0xfd, 0x51, 0xc4, 0xd2, 0x73, 0x77, 0x21, 0xb3, - 0xa1, 0xe4, 0x63, 0x98, 0x4b, 0x93, 0x6e, 0x87, 0x46, 0x7e, 0x12, 0x07, 0x11, 0xcb, 0x5a, 0x53, - 0x48, 0xf5, 0xce, 0x30, 0xaa, 0x6e, 0xd2, 0x7d, 0xa4, 0x70, 0x05, 0xc9, 0xd9, 0xd4, 0x00, 0xb5, - 0x1f, 0xc0, 0x72, 0x15, 0x63, 0xd2, 0x84, 0xb1, 0xe7, 0xf4, 0x5c, 0xae, 0x0e, 0xff, 0x24, 0xcb, - 0x30, 0x71, 0xea, 0x85, 0x03, 0x8a, 0x8b, 0x31, 0xed, 0x8a, 0xc6, 0xf7, 0xea, 0xef, 0xd5, 0xda, - 0x87, 0xb0, 0x58, 0x62, 0x53, 0x41, 0xe0, 0x8e, 0x49, 0x60, 0xe6, 0xde, 0x92, 0x12, 0xd9, 0xdd, - 0xdf, 0x55, 0x63, 0x0d, 0xaa, 0xce, 0x4d, 0xd8, 0xda, 0xa3, 0x6c, 0x37, 0xee, 0xf7, 0x07, 0x51, - 0xd0, 0x45, 0x1b, 0x73, 0x69, 0xe8, 0x9d, 0xd3, 0x34, 0x53, 0x96, 0xf5, 0x31, 0x2c, 0x57, 0xf5, - 0x93, 0x16, 0x4c, 0xc9, 0xb5, 0x47, 0xfe, 0xd3, 0xae, 0x6a, 0x92, 0x0d, 0x68, 0x74, 0xe3, 0x28, - 0xa2, 0x5d, 0x46, 0x7d, 0x39, 0x91, 0x1c, 0xe0, 0xfc, 0x7e, 0x1d, 0x6e, 0x0c, 0xe7, 0x29, 0x4d, - 0xf7, 0x4b, 0x58, 0xed, 0x9a, 0x08, 0x9d, 0x54, 0x62, 0xb4, 0x6a, 0xb8, 0x14, 0xbb, 0xc6, 0x52, - 0x5c, 0x48, 0x69, 0xbb, 0xb2, 0x57, 0x2c, 0xd2, 0x4a, 0xb7, 0xaa, 0xaf, 0x7d, 0x0c, 0xed, 0xe1, - 0x83, 0x2a, 0x54, 0x7e, 0xcf, 0x56, 0xf9, 0x86, 0x12, 0xad, 0x8a, 0x88, 0xa9, 0xfb, 0xef, 0xc2, - 0xda, 0x1e, 0x8d, 0x68, 0x1a, 0x74, 0xb5, 0x71, 0x48, 0x9d, 0x73, 0x0d, 0x6a, 0x9b, 0x94, 0xac, - 0x72, 0x80, 0xd3, 0x86, 0x56, 0x79, 0xa0, 0x98, 0xae, 0xb3, 0x0a, 0xcb, 0x7b, 0x94, 0x69, 0xb8, - 0x5e, 0xc5, 0x5f, 0xd4, 0x60, 0x05, 0x3b, 0xb2, 0xa3, 0xec, 0x5c, 0x74, 0x48, 0x55, 0xff, 0x06, - 0x2c, 0x6a, 0xd2, 0x99, 0xda, 0x46, 0x42, 0xcb, 0xef, 0x1a, 0x5a, 0x2e, 0x8f, 0xcc, 0x37, 0x53, - 0x66, 0xee, 0xa6, 0x7c, 0x4f, 0x4a, 0x70, 0x7b, 0x17, 0x56, 0x2a, 0x51, 0xaf, 0x62, 0xff, 0x4e, - 0x0b, 0x56, 0xf7, 0x28, 0x33, 0xcc, 0xd8, 0x30, 0xd0, 0x19, 0x03, 0xcc, 0xed, 0x32, 0x63, 0x5e, - 0xca, 0x72, 0xbb, 0x94, 0x4d, 0xf2, 0x2a, 0xcc, 0x87, 0x41, 0xc6, 0x68, 0xd4, 0xf1, 0x7c, 0x3f, - 0xa5, 0x99, 0x38, 0xf2, 0x1a, 0xee, 0x9c, 0x80, 0xee, 0x08, 0xa0, 0xf3, 0xf7, 0x35, 0xbe, 0x30, - 0x05, 0x56, 0x52, 0x59, 0x4f, 0xa0, 0x91, 0x9f, 0x0a, 0x42, 0x49, 0xdb, 0x86, 0x92, 0xaa, 0xc6, - 0x6c, 0x17, 0x8e, 0x86, 0x9c, 0x40, 0xfb, 0x27, 0x30, 0xff, 0xb2, 0x37, 0xf4, 0x7b, 0xd0, 0x96, - 0xb6, 0xa1, 0x4e, 0xe4, 0x8f, 0xbd, 0x3e, 0x55, 0x76, 0xd5, 0x86, 0x69, 0x75, 0x80, 0x4b, 0x1e, - 0xba, 0xed, 0x6c, 0xc2, 0x7a, 0xe5, 0x48, 0x69, 0x58, 0x77, 0x61, 0x69, 0x8f, 0x32, 0x7d, 0xcc, - 0x2b, 0x8a, 0x43, 0x4f, 0x01, 0xe7, 0x3e, 0x5a, 0xa2, 0x31, 0x40, 0xaa, 0x70, 0x03, 0x1a, 0xf9, - 0x25, 0x22, 0x6d, 0x5b, 0x03, 0x9c, 0x7b, 0x68, 0xa6, 0x6a, 0xd4, 0xd3, 0xc3, 0x7d, 0x97, 0x8a, - 0x61, 0xd7, 0x60, 0x3a, 0x66, 0x49, 0xa7, 0x1b, 0xfb, 0x4a, 0xf4, 0xa9, 0x98, 0x25, 0xbb, 0xb1, - 0x4f, 0xa5, 0x69, 0x18, 0x63, 0xb4, 0x69, 0xfc, 0xa5, 0x58, 0x4a, 0xbb, 0x4b, 0xca, 0xf1, 0x23, - 0x68, 0x28, 0x82, 0x6a, 0x29, 0xdf, 0x32, 0x96, 0xb2, 0x6a, 0xcc, 0xf6, 0x53, 0xc1, 0x51, 0xae, - 0xe4, 0xb4, 0x14, 0x20, 0x6b, 0xbf, 0x0f, 0x73, 0x56, 0xd7, 0x65, 0x96, 0xdd, 0x30, 0x97, 0xec, - 0x3e, 0xac, 0x3e, 0x0c, 0x32, 0xf3, 0xc6, 0x1d, 0x65, 0xb9, 0x3e, 0x87, 0xf9, 0x7d, 0x2f, 0x48, - 0xb3, 0x83, 0x41, 0x92, 0xc4, 0x68, 0xde, 0xaf, 0xc1, 0x42, 0x7e, 0xad, 0x27, 0xbc, 0x4f, 0x0e, - 0x9a, 0xd7, 0x60, 0x1c, 0x41, 0x5e, 0x81, 0x39, 0x75, 0x9d, 0x0b, 0x34, 0x21, 0xd2, 0xac, 0x04, - 0x22, 0x92, 0xf3, 0xd5, 0xb8, 0xa5, 0x3a, 0xcb, 0xb1, 0x20, 0x30, 0x1e, 0x79, 0xda, 0xad, 0xc0, - 0x6f, 0xd3, 0x10, 0xea, 0xf6, 0x75, 0xd0, 0x82, 0xa9, 0x53, 0x9a, 0x1e, 0xc5, 0x19, 0x45, 0x9f, - 0x61, 0xda, 0x55, 0x4d, 0x2e, 0xc8, 0x20, 0x0b, 0xa2, 0x5e, 0x27, 0xf3, 0x22, 0xff, 0x28, 0x7e, - 0x81, 0x1e, 0xc2, 0xb4, 0x3b, 0x8b, 0xc0, 0x03, 0x01, 0x23, 0x37, 0x61, 0xf6, 0x84, 0xb1, 0xa4, - 0xc3, 0x5d, 0x97, 0x78, 0xc0, 0xa4, 0x43, 0x30, 0xc3, 0x61, 0x87, 0x02, 0xc4, 0x37, 0x36, 0xa2, - 0x0c, 0x32, 0x9a, 0x7a, 0x3d, 0x1a, 0xb1, 0xd6, 0xa4, 0xd8, 0xd8, 0x1c, 0xfa, 0x89, 0x02, 0x92, - 0x4d, 0x00, 0x44, 0x4b, 0xd2, 0xf8, 0xc5, 0x79, 0x6b, 0x4a, 0x98, 0x1e, 0x87, 0xec, 0x73, 0x00, - 0xd7, 0xdf, 0x91, 0x97, 0x51, 0xe5, 0x7a, 0x04, 0x34, 0x6b, 0x4d, 0x0b, 0xfd, 0x71, 0xf0, 0xae, - 0x86, 0x92, 0x0e, 0xf7, 0x3b, 0xa4, 0xd6, 0x3b, 0x5e, 0x96, 0x51, 0x96, 0xb5, 0x1a, 0x68, 0x40, - 0xf7, 0x2b, 0x0c, 0xa8, 0xe0, 0x7f, 0xc8, 0x71, 0x3b, 0x38, 0x4c, 0xfb, 0x1f, 0x16, 0x94, 0xfb, - 0x5b, 0xde, 0x80, 0x9d, 0xd0, 0x88, 0xf1, 0xdb, 0x83, 0x33, 0x49, 0x82, 0x16, 0xa0, 0x6e, 0x9a, - 0x56, 0xc7, 0x4e, 0x12, 0xb4, 0x3f, 0xe3, 0xce, 0x45, 0x99, 0x6a, 0x85, 0x09, 0xbe, 0x69, 0x1f, - 0x25, 0xab, 0x4a, 0x58, 0xdb, 0x8e, 0x4c, 0xd3, 0x3c, 0x83, 0xe6, 0x1e, 0x65, 0x87, 0x41, 0xf7, - 0x39, 0x4d, 0x47, 0x30, 0x4a, 0x72, 0x1b, 0xc6, 0xb9, 0x45, 0x49, 0x06, 0xcb, 0xfa, 0x26, 0x94, - 0x1e, 0x1b, 0x67, 0xe4, 0x22, 0x06, 0x5f, 0x0b, 0xd4, 0x5c, 0x87, 0x9d, 0x27, 0xc2, 0x2e, 0x1a, - 0x6e, 0x03, 0x21, 0x87, 0xe7, 0x09, 0x75, 0x9e, 0xc1, 0xac, 0x39, 0x88, 0x1f, 0x1a, 0x3e, 0x0d, - 0x83, 0x7e, 0xc0, 0x68, 0xaa, 0x0e, 0x0d, 0x0d, 0xe0, 0xf6, 0xc8, 0x97, 0x48, 0xda, 0x31, 0x7e, - 0xf3, 0xfd, 0xf6, 0xc5, 0x20, 0x66, 0x8a, 0xb6, 0x68, 0x38, 0x7f, 0x52, 0x87, 0x79, 0x35, 0x1d, - 0x69, 0xcc, 0x4a, 0xe6, 0xda, 0xa5, 0x32, 0xdf, 0x84, 0xd9, 0xd0, 0xcb, 0x58, 0x67, 0x90, 0xf8, - 0x9e, 0x72, 0x6d, 0xc6, 0xdc, 0x19, 0x0e, 0xfb, 0x44, 0x80, 0xb8, 0x45, 0x2b, 0xcf, 0x15, 0xf7, - 0x96, 0xe4, 0x3e, 0xdb, 0x35, 0x27, 0x43, 0x60, 0x9c, 0x8f, 0x41, 0x6b, 0xaf, 0xb9, 0xf8, 0xcd, - 0x61, 0x27, 0x41, 0xef, 0x04, 0xad, 0xbb, 0xe6, 0xe2, 0x37, 0x5f, 0xc1, 0x30, 0x3e, 0x43, 0x5b, - 0xae, 0xb9, 0xfc, 0x93, 0x43, 0x8e, 0x02, 0x1f, 0x4d, 0xb7, 0xe6, 0xf2, 0x4f, 0x0e, 0xf1, 0xb2, - 0xe7, 0x68, 0xa8, 0x35, 0x97, 0x7f, 0x72, 0xaf, 0xff, 0x34, 0x0e, 0x07, 0x7d, 0xda, 0x6a, 0x20, - 0x50, 0xb6, 0xc8, 0x3a, 0x34, 0x92, 0x34, 0xe8, 0xd2, 0x8e, 0xc7, 0x4e, 0xd0, 0x98, 0x6a, 0xee, - 0x34, 0x02, 0x76, 0xd8, 0x89, 0xb3, 0x04, 0x8b, 0x7a, 0xa1, 0xf5, 0xe9, 0xf9, 0x29, 0x4c, 0x49, - 0xc8, 0x85, 0x8b, 0xfe, 0x36, 0x4c, 0x31, 0x81, 0xd6, 0xaa, 0xe3, 0x2e, 0xd0, 0x86, 0x65, 0x6b, - 0xda, 0x55, 0x68, 0xce, 0x0f, 0x80, 0x98, 0xdc, 0xe4, 0x42, 0xdc, 0xc9, 0xe9, 0x88, 0xe3, 0x78, - 0xc1, 0xa6, 0x93, 0xe5, 0x04, 0xbe, 0xc4, 0xcb, 0xe8, 0x69, 0xea, 0xf3, 0x83, 0x24, 0x7e, 0xfe, - 0xad, 0x9a, 0xe6, 0x8f, 0x61, 0x4e, 0x33, 0x7e, 0xcc, 0x68, 0x9f, 0x2b, 0xdc, 0xeb, 0xc7, 0x83, - 0x88, 0x21, 0xcf, 0x9a, 0x2b, 0x5b, 0xdc, 0x02, 0x51, 0xbf, 0xc8, 0xb2, 0xe6, 0x8a, 0x06, 0x99, - 0x87, 0x7a, 0xe0, 0xcb, 0xe0, 0xa9, 0x1e, 0xf8, 0xce, 0xff, 0xd4, 0x60, 0xd1, 0x98, 0xc8, 0x95, - 0x8d, 0xb2, 0x64, 0x71, 0xf5, 0x0a, 0x8b, 0xbb, 0x03, 0xe3, 0x47, 0x81, 0xcf, 0x63, 0x36, 0xae, - 0xd7, 0x15, 0x45, 0xce, 0x9a, 0x87, 0x8b, 0x28, 0x1c, 0xd5, 0xcb, 0x9e, 0x67, 0xad, 0xf1, 0x0b, - 0x51, 0x39, 0x4a, 0x69, 0x3f, 0x4c, 0x94, 0xf7, 0x83, 0xad, 0xcb, 0xc9, 0xa2, 0x2e, 0x85, 0xb7, - 0xaa, 0x69, 0x6b, 0xcb, 0xeb, 0x02, 0xe4, 0xc0, 0x0b, 0x97, 0xf5, 0x57, 0x00, 0x62, 0x8d, 0x29, - 0xed, 0xef, 0x5a, 0x49, 0x68, 0x6d, 0x82, 0x06, 0xb2, 0xf3, 0x11, 0xba, 0x1a, 0x26, 0x73, 0xa9, - 0xfc, 0x7b, 0x16, 0x4d, 0x61, 0x8b, 0xa4, 0x44, 0x33, 0xb3, 0x88, 0xbd, 0x8b, 0xc4, 0x76, 0xba, - 0x5d, 0xbe, 0xf4, 0x46, 0x60, 0x7e, 0xe1, 0x1d, 0xfe, 0x0c, 0xa6, 0xe4, 0x08, 0x69, 0x16, 0x02, - 0xa1, 0x1e, 0xf8, 0xe4, 0x7d, 0x00, 0xe3, 0x1e, 0x12, 0xf3, 0x5a, 0x57, 0x32, 0xc8, 0x41, 0xca, - 0x1a, 0x90, 0x9d, 0x81, 0xee, 0x1c, 0xc3, 0x52, 0x05, 0x0a, 0x17, 0x45, 0x87, 0xd5, 0x52, 0x14, - 0xd5, 0x26, 0x5b, 0x30, 0xc3, 0x62, 0xe6, 0x85, 0x9d, 0xfc, 0x86, 0xa8, 0xb9, 0x80, 0xa0, 0x67, - 0x1c, 0x82, 0x07, 0x54, 0x1c, 0x0a, 0xcb, 0xe5, 0x07, 0x54, 0x1c, 0xfa, 0x8e, 0x87, 0x8e, 0x97, - 0x35, 0x69, 0xa9, 0xc2, 0x8b, 0x96, 0xec, 0x0d, 0x98, 0xf6, 0xc4, 0x10, 0x35, 0xb1, 0x85, 0xc2, - 0xc4, 0x5c, 0x8d, 0xe0, 0x10, 0xbc, 0x81, 0x76, 0xe3, 0xe8, 0x38, 0xe8, 0x29, 0xeb, 0x78, 0x0d, - 0x0f, 0x2b, 0x05, 0xcb, 0x7d, 0x12, 0xdf, 0x63, 0x1e, 0x72, 0x9b, 0x75, 0xf1, 0xdb, 0xf9, 0xbd, - 0x1a, 0x34, 0xf7, 0xe3, 0x94, 0x1d, 0xc7, 0x61, 0x10, 0x4b, 0xf7, 0x9e, 0xbb, 0x23, 0xca, 0xfd, - 0x97, 0x7e, 0xa4, 0x6c, 0xf2, 0x13, 0xb2, 0x1b, 0x07, 0x91, 0xb0, 0xd5, 0xba, 0x54, 0x50, 0x1c, - 0x44, 0xdc, 0x54, 0xc9, 0x0d, 0x98, 0xf1, 0x69, 0xd6, 0x4d, 0x83, 0x84, 0x87, 0x73, 0xf2, 0x58, - 0x30, 0x41, 0x9c, 0xf0, 0x91, 0x17, 0x7a, 0x51, 0x97, 0xca, 0x93, 0x5d, 0x35, 0x9d, 0x15, 0x3c, - 0xae, 0xb4, 0x24, 0x46, 0x64, 0x6d, 0x83, 0xe5, 0x54, 0xfe, 0x3f, 0x34, 0x12, 0x05, 0x94, 0xe6, - 0xd7, 0xd2, 0x77, 0x75, 0x61, 0x3a, 0x6e, 0x8e, 0xea, 0x6c, 0x70, 0xdf, 0x3f, 0xa7, 0x77, 0x30, - 0xe8, 0xf7, 0xbd, 0xf4, 0x5c, 0x71, 0x8b, 0x60, 0x7c, 0x37, 0x0e, 0x22, 0xae, 0x28, 0x3e, 0x29, - 0xe5, 0xbc, 0xf1, 0x6f, 0x53, 0xf4, 0xba, 0x25, 0xba, 0xa9, 0xad, 0x31, 0x5b, 0x5b, 0xd7, 0x01, - 0x12, 0x9a, 0x76, 0x69, 0xc4, 0xbc, 0x9e, 0x9a, 0xb1, 0x01, 0x71, 0x4e, 0x80, 0x3c, 0x3d, 0x3e, - 0x0e, 0x83, 0x88, 0x72, 0xb6, 0x52, 0x98, 0x0b, 0xb4, 0x3f, 0x5c, 0x06, 0x9b, 0xd3, 0x58, 0x89, - 0xd3, 0x8f, 0x61, 0xf1, 0x69, 0x54, 0xc1, 0x48, 0x91, 0xab, 0x5d, 0x44, 0xae, 0x5e, 0x22, 0xf7, - 0x43, 0x98, 0x35, 0x04, 0xcf, 0xc8, 0x7b, 0xd0, 0x90, 0x32, 0xea, 0x40, 0xa1, 0xad, 0x4f, 0x83, - 0xd2, 0x0c, 0xdd, 0x1c, 0xd9, 0xf9, 0xb3, 0x1a, 0xcc, 0xe4, 0x92, 0x65, 0xe4, 0x3e, 0x4c, 0x70, - 0x75, 0x2b, 0x2a, 0xd7, 0x35, 0x95, 0x1c, 0x67, 0x1b, 0xff, 0x15, 0x7e, 0xa1, 0x40, 0x6e, 0x1f, - 0x00, 0xe4, 0xc0, 0x0a, 0xb7, 0xee, 0xae, 0xed, 0xd6, 0x5d, 0x2b, 0x53, 0x55, 0xa2, 0x19, 0x9e, - 0xdd, 0x3f, 0x8d, 0xf3, 0x70, 0xaf, 0xc2, 0x58, 0xa4, 0x0d, 0xbe, 0x05, 0x33, 0x62, 0x2f, 0xf0, - 0x13, 0x40, 0x09, 0x3c, 0x9b, 0x3f, 0x6d, 0x04, 0x91, 0x0b, 0xb8, 0x37, 0xb0, 0x9f, 0xbc, 0x03, - 0x73, 0x28, 0x6c, 0x27, 0x16, 0x0a, 0x91, 0x1b, 0xdb, 0x1e, 0x30, 0x8b, 0x28, 0x52, 0x65, 0x24, - 0x81, 0x15, 0x6b, 0x48, 0x27, 0x13, 0x22, 0xc8, 0x4b, 0xea, 0x03, 0xc3, 0x95, 0x1e, 0x26, 0xa5, - 0x50, 0x96, 0x24, 0x28, 0xfb, 0x84, 0xea, 0x96, 0xba, 0xe5, 0x1e, 0x72, 0x17, 0x66, 0x25, 0x47, - 0xd4, 0x8c, 0xbc, 0xe2, 0x6c, 0x19, 0x67, 0xc4, 0x40, 0x44, 0x20, 0x7d, 0x58, 0x36, 0x07, 0x68, - 0x09, 0x27, 0x70, 0xe0, 0xfb, 0xa3, 0x4b, 0x18, 0x95, 0x04, 0x24, 0xdd, 0x52, 0x47, 0xfb, 0xd7, - 0xa1, 0x35, 0x6c, 0x42, 0x15, 0xcb, 0xfe, 0xba, 0xbd, 0xec, 0xcb, 0x15, 0x26, 0x99, 0x99, 0x0f, - 0x88, 0x9f, 0xc1, 0xda, 0x10, 0x61, 0xae, 0xf0, 0xea, 0x60, 0x58, 0xaa, 0x69, 0x4d, 0x7f, 0x5c, - 0x83, 0xf6, 0x8e, 0xef, 0x97, 0x0e, 0xa7, 0xfc, 0x91, 0xe0, 0xdb, 0x3e, 0x72, 0x37, 0x61, 0xbd, - 0x52, 0x20, 0xf9, 0x9a, 0xf1, 0x02, 0x36, 0x5d, 0xda, 0x8f, 0x4f, 0xe9, 0xb7, 0x2d, 0xb2, 0x73, - 0x03, 0xae, 0x0f, 0xe3, 0x2c, 0x65, 0xc3, 0xe7, 0x3d, 0xfb, 0x79, 0x5c, 0x3b, 0x46, 0xff, 0x5e, - 0x83, 0x39, 0xfb, 0xe1, 0xfc, 0x65, 0xc5, 0xe2, 0x6f, 0x02, 0x49, 0x69, 0xc6, 0x3a, 0x49, 0x1c, - 0x86, 0x3c, 0x24, 0xf7, 0x69, 0xe8, 0x9d, 0xcb, 0x27, 0xfb, 0x26, 0xef, 0xd9, 0x17, 0x1d, 0x0f, - 0x39, 0x9c, 0xac, 0xc1, 0x94, 0x97, 0x04, 0x1d, 0x6e, 0x35, 0x22, 0x1e, 0x9f, 0xf4, 0x92, 0xe0, - 0x23, 0x7a, 0x4e, 0x1c, 0x98, 0x93, 0x1d, 0x9d, 0x90, 0x9e, 0xd2, 0x10, 0x7d, 0xbe, 0x31, 0x77, - 0x46, 0x74, 0x3f, 0xe1, 0x20, 0x72, 0x07, 0x9a, 0x49, 0x1a, 0x70, 0xf3, 0xcb, 0x73, 0x03, 0x53, - 0x28, 0xcd, 0x82, 0x84, 0xab, 0xd9, 0x39, 0x3f, 0x85, 0x6b, 0x15, 0xba, 0x90, 0x67, 0xd4, 0xf7, - 0x61, 0xc1, 0xce, 0x30, 0xa8, 0x73, 0x4a, 0x7b, 0xad, 0xd6, 0x40, 0x77, 0xfe, 0xd8, 0xa2, 0x23, - 0xbd, 0x4f, 0xc4, 0x71, 0x3d, 0xa6, 0xdf, 0xb4, 0x9c, 0x2f, 0x60, 0x39, 0x07, 0xee, 0xc6, 0xd1, - 0x29, 0x4d, 0x33, 0x6e, 0x6d, 0x04, 0xc6, 0x8f, 0xd3, 0x58, 0x3d, 0xc8, 0xe2, 0x37, 0xf7, 0xdb, - 0x58, 0x2c, 0xcd, 0xa0, 0xce, 0x62, 0x8e, 0x93, 0x7a, 0x4c, 0xdd, 0x52, 0xf8, 0xcd, 0xfd, 0xe4, - 0x00, 0x89, 0xd0, 0x0e, 0xf6, 0x09, 0x53, 0x9d, 0x91, 0x30, 0xce, 0xc5, 0x79, 0x86, 0xee, 0xa3, - 0x29, 0x8a, 0x9c, 0xe3, 0xaf, 0xc2, 0x8c, 0x98, 0x23, 0x1f, 0xa9, 0xe6, 0xb7, 0x61, 0xcd, 0xaf, - 0x20, 0xa6, 0x0b, 0xc7, 0x1a, 0xea, 0xfc, 0x67, 0x1d, 0x66, 0xd1, 0x63, 0x7d, 0x48, 0x99, 0x17, - 0x84, 0x17, 0xfb, 0xd2, 0xc2, 0x07, 0xad, 0x6b, 0x1f, 0xf4, 0x15, 0x98, 0x33, 0x1f, 0x44, 0xce, - 0x55, 0x30, 0x6b, 0x3c, 0x87, 0x9c, 0x93, 0x57, 0x61, 0x1e, 0x43, 0xeb, 0x1c, 0x4b, 0xd8, 0xcc, - 0x1c, 0x42, 0x35, 0x9a, 0x1d, 0x08, 0x4c, 0x14, 0x02, 0x01, 0xde, 0x8d, 0xce, 0x74, 0x27, 0x0b, - 0x7c, 0x1d, 0x27, 0x20, 0xe4, 0x20, 0xf0, 0x8d, 0x6e, 0x1c, 0x3d, 0x65, 0x74, 0xe3, 0x68, 0x1e, - 0x03, 0xa5, 0x54, 0x24, 0x0a, 0x30, 0xdf, 0x35, 0x8d, 0x46, 0x37, 0xab, 0x80, 0x87, 0x41, 0x1f, - 0xb3, 0x61, 0xf2, 0x71, 0xbb, 0x21, 0x2c, 0x56, 0xb4, 0xf2, 0x30, 0x0d, 0xcc, 0x30, 0x2d, 0x0f, - 0xea, 0x66, 0xac, 0xa0, 0x6e, 0x0b, 0x66, 0xe2, 0x84, 0x46, 0x1d, 0x19, 0x62, 0xcf, 0x0a, 0xef, - 0x81, 0x83, 0x9e, 0x21, 0x44, 0x3e, 0x99, 0xa0, 0xce, 0xb3, 0x51, 0xe2, 0x52, 0x5b, 0x31, 0xf5, - 0xa2, 0x62, 0x54, 0x20, 0x38, 0x76, 0x59, 0x20, 0xe8, 0xec, 0xa0, 0x57, 0xac, 0x18, 0x4b, 0xf3, - 0x79, 0x13, 0x26, 0x51, 0x4d, 0xca, 0x72, 0x96, 0xad, 0x30, 0x46, 0x1a, 0x85, 0x2b, 0x71, 0x9c, - 0x1f, 0x62, 0x0e, 0x11, 0xbb, 0x46, 0x11, 0xfd, 0x1a, 0x4c, 0x8b, 0x55, 0xd1, 0x56, 0x33, 0x85, - 0xed, 0xc7, 0xbe, 0xf3, 0x2f, 0x35, 0x20, 0x07, 0x83, 0xa3, 0x7e, 0x30, 0x3a, 0xb5, 0xd1, 0x03, - 0x74, 0x02, 0xe3, 0x68, 0x26, 0xc2, 0x1c, 0xf1, 0xbb, 0x60, 0x21, 0xe3, 0x45, 0x0b, 0xc9, 0x97, - 0x73, 0xa2, 0x3a, 0x46, 0x9f, 0x34, 0x17, 0x9f, 0x1f, 0xf1, 0x61, 0x40, 0x23, 0xd6, 0x91, 0x8f, - 0x2d, 0xfc, 0x88, 0x47, 0xc0, 0x63, 0xdf, 0x39, 0x80, 0x25, 0x6b, 0x66, 0x52, 0xd3, 0x37, 0x61, - 0x56, 0x08, 0x90, 0x84, 0x5e, 0x57, 0xbf, 0x86, 0xcf, 0x20, 0x6c, 0x1f, 0x41, 0x17, 0xe9, 0xeb, - 0x0f, 0x6a, 0xb0, 0x7c, 0x10, 0xf4, 0x07, 0xa1, 0xc7, 0xe8, 0x2f, 0x41, 0x63, 0xf9, 0xf4, 0xc7, - 0xac, 0xe9, 0x2b, 0x4d, 0x8e, 0xe7, 0x9a, 0x74, 0xfe, 0xab, 0x06, 0x2b, 0x05, 0x51, 0xb4, 0x4f, - 0x68, 0x1b, 0xd3, 0x90, 0xc7, 0x01, 0x89, 0x64, 0x30, 0xad, 0x5b, 0x4c, 0x5f, 0x81, 0xb9, 0x7e, - 0x10, 0x05, 0xfd, 0x41, 0xbf, 0x23, 0x74, 0x2f, 0x64, 0x9a, 0x95, 0xc0, 0x7d, 0x5c, 0x02, 0x8e, - 0xe4, 0xbd, 0x30, 0x90, 0xc6, 0x25, 0x92, 0x00, 0x0a, 0xa4, 0xb7, 0x61, 0x39, 0xf7, 0xdb, 0x3b, - 0x3d, 0x2f, 0x88, 0x3a, 0x61, 0x9c, 0x65, 0x72, 0x8d, 0x49, 0xde, 0xb7, 0xe7, 0x05, 0xd1, 0x93, - 0x38, 0xcb, 0x8c, 0x43, 0x60, 0xd2, 0x3c, 0x04, 0xb8, 0x03, 0xd3, 0xfc, 0xf4, 0xc4, 0x0b, 0xe9, - 0x83, 0xb8, 0x7f, 0xf4, 0x72, 0x75, 0x7f, 0x13, 0x66, 0xc5, 0xbb, 0x1b, 0xf3, 0xd2, 0x1e, 0x55, - 0x2b, 0x30, 0x83, 0xb0, 0x43, 0x04, 0x55, 0x2e, 0xc3, 0x7f, 0xd4, 0x80, 0xec, 0x72, 0x57, 0x26, - 0x1c, 0xd9, 0x1e, 0xf8, 0x51, 0x22, 0xe2, 0xe6, 0xdc, 0xc2, 0x1a, 0x12, 0xf2, 0xd8, 0x36, 0xbf, - 0x31, 0xcb, 0xfc, 0xf4, 0x6c, 0xc6, 0xaf, 0xf8, 0x38, 0x56, 0x3a, 0xc7, 0x5f, 0x85, 0xf9, 0x33, - 0x2f, 0x0c, 0x29, 0xd3, 0x29, 0x36, 0xf9, 0x12, 0x2f, 0xa0, 0x2a, 0x06, 0x57, 0x13, 0x9e, 0x32, - 0x26, 0xbc, 0x02, 0x4b, 0xd6, 0x7c, 0xa5, 0x37, 0x74, 0x1f, 0x56, 0x05, 0x78, 0x27, 0x0c, 0x47, - 0x3e, 0x55, 0x9d, 0xbf, 0xa8, 0xc3, 0x5a, 0x69, 0x98, 0x76, 0x1b, 0x6c, 0x33, 0xbe, 0xa5, 0xa7, - 0x5b, 0x3d, 0x60, 0x5b, 0x36, 0xe5, 0xa8, 0xf6, 0x3f, 0xd4, 0x60, 0x52, 0x80, 0x2e, 0x5c, 0x8d, - 0xcf, 0xd4, 0x81, 0x20, 0x0d, 0x4e, 0x44, 0x44, 0xdf, 0x1d, 0x8d, 0x99, 0xf8, 0xcf, 0x4c, 0xab, - 0x8a, 0x93, 0x44, 0x66, 0x54, 0xbf, 0x0f, 0xcd, 0x22, 0xc2, 0x95, 0x52, 0x4e, 0xe2, 0x55, 0xe5, - 0xd1, 0x29, 0x35, 0xd2, 0xa8, 0xbf, 0xa8, 0xc1, 0xc2, 0x6e, 0x1c, 0xf9, 0x01, 0xbf, 0x31, 0xf7, - 0xbd, 0xd4, 0xeb, 0x67, 0x32, 0x93, 0x2f, 0x40, 0xea, 0xd9, 0x5d, 0x03, 0x86, 0x3c, 0x70, 0x6e, - 0x02, 0x74, 0x4f, 0x68, 0xf7, 0x79, 0x47, 0xbe, 0x38, 0x8a, 0xf4, 0x3f, 0x87, 0x3c, 0x08, 0xfc, - 0x8c, 0xbc, 0x05, 0x4b, 0x79, 0x77, 0xc7, 0x8b, 0xfc, 0x8e, 0x7c, 0x6e, 0xc4, 0xec, 0x86, 0xc6, - 0xdb, 0x89, 0xfc, 0x9d, 0xec, 0x79, 0xc6, 0x7d, 0x45, 0xfd, 0xca, 0xd6, 0xb1, 0x8e, 0xf0, 0x05, - 0x0d, 0xdf, 0x41, 0xb0, 0xf3, 0xdf, 0x35, 0xbc, 0x01, 0xd5, 0xac, 0xe4, 0x6a, 0xe7, 0x0f, 0x6b, - 0xf8, 0xde, 0x6a, 0x2d, 0x59, 0xbd, 0xb0, 0x64, 0x04, 0xc6, 0x03, 0x46, 0xfb, 0xea, 0x62, 0xe1, - 0xdf, 0xe4, 0x01, 0x34, 0xf5, 0x8c, 0x3b, 0x09, 0xaa, 0x45, 0x6e, 0x93, 0xb5, 0x3c, 0x70, 0xb4, - 0xb4, 0xe6, 0x2e, 0x74, 0x0b, 0x6a, 0x54, 0xdb, 0x6b, 0x62, 0xa4, 0x83, 0xba, 0x8b, 0xda, 0x96, - 0xe7, 0x93, 0x68, 0x09, 0xa9, 0x69, 0x77, 0xc0, 0xa8, 0x2f, 0x5d, 0x65, 0xdd, 0x76, 0xfe, 0xad, - 0x06, 0x0b, 0x3b, 0xbe, 0x8f, 0xf3, 0x1e, 0xe5, 0x98, 0x50, 0xb3, 0xac, 0x5f, 0x32, 0xcb, 0xb1, - 0xaf, 0x39, 0xcb, 0x6f, 0x7c, 0x88, 0x0c, 0x51, 0x82, 0xe3, 0x40, 0x33, 0x9f, 0x67, 0xf5, 0xf2, - 0x3a, 0xdf, 0x01, 0x22, 0xc2, 0x2b, 0x4b, 0x1d, 0x45, 0xac, 0x15, 0x58, 0xb2, 0xb0, 0xe4, 0x59, - 0xf3, 0x21, 0xdc, 0xde, 0xa3, 0x6c, 0x37, 0x3d, 0x4f, 0x58, 0xac, 0xdc, 0xd9, 0x87, 0x34, 0x89, - 0xb3, 0x40, 0x9d, 0x5c, 0x74, 0xa4, 0xd3, 0xe7, 0x1f, 0x6b, 0x70, 0x67, 0x04, 0x42, 0x72, 0x0a, - 0x9f, 0x97, 0xdf, 0x97, 0x7e, 0xcd, 0x2c, 0x6f, 0x19, 0x89, 0xca, 0xb6, 0x86, 0xc8, 0x2a, 0x03, - 0x4d, 0xb2, 0xfd, 0x01, 0xcc, 0xdb, 0x9d, 0x57, 0x3a, 0x2a, 0x42, 0xb8, 0x75, 0x89, 0x10, 0xa3, - 0xd8, 0xdc, 0x2d, 0x98, 0xef, 0x5a, 0x24, 0x24, 0xa3, 0x02, 0xd4, 0xd9, 0x85, 0xd7, 0x2e, 0xe5, - 0x26, 0xd5, 0x36, 0x34, 0x42, 0x77, 0xfe, 0x66, 0x1c, 0xd6, 0x3e, 0x0d, 0xd8, 0x89, 0x9f, 0x7a, - 0x67, 0xca, 0xfa, 0x46, 0x11, 0xb2, 0x10, 0xbc, 0xd7, 0xcb, 0xef, 0x0d, 0xaf, 0xc3, 0x62, 0x1c, - 0x51, 0x8c, 0x31, 0x3a, 0x89, 0x97, 0x65, 0x67, 0x71, 0xaa, 0xee, 0xd2, 0x85, 0x38, 0xa2, 0x3c, - 0xce, 0xd8, 0x97, 0xe0, 0xc2, 0x6d, 0x3c, 0x5e, 0xbc, 0x8d, 0x9b, 0x30, 0x96, 0x04, 0x91, 0xcc, - 0x99, 0xf0, 0x4f, 0x7e, 0x77, 0xb2, 0xd4, 0xf3, 0x0d, 0xca, 0xf2, 0xee, 0x44, 0xa8, 0xa6, 0x6b, - 0xbe, 0xe2, 0x4f, 0x15, 0x5e, 0xf1, 0x0d, 0x9d, 0x4c, 0xdb, 0xaf, 0x16, 0x5b, 0x30, 0x23, 0x3f, - 0x3b, 0xcc, 0xeb, 0xc9, 0x10, 0x08, 0x24, 0xe8, 0xd0, 0xeb, 0x19, 0xde, 0x1a, 0x58, 0xde, 0xda, - 0x26, 0xc0, 0x31, 0xa5, 0x1d, 0x2b, 0x18, 0x6a, 0x1c, 0x53, 0x2a, 0x0e, 0x5d, 0xee, 0x2a, 0x1f, - 0x79, 0xd1, 0xf3, 0x0e, 0xbe, 0x41, 0xcc, 0x0a, 0x71, 0x38, 0xe0, 0x63, 0xaf, 0x8f, 0x3e, 0x31, - 0x76, 0x2a, 0x99, 0xe6, 0x84, 0x46, 0x39, 0x6c, 0x27, 0x7f, 0x4d, 0x41, 0x94, 0x6e, 0xc0, 0xce, - 0x5b, 0xf3, 0xf9, 0xf8, 0xdd, 0x80, 0x9d, 0xeb, 0xf1, 0xa8, 0xb3, 0xf4, 0xbc, 0xb5, 0x90, 0x8f, - 0xdf, 0x15, 0x20, 0x2e, 0x5e, 0x76, 0x16, 0x1c, 0x53, 0x51, 0x18, 0xd2, 0x94, 0xa5, 0x52, 0x1c, - 0xb2, 0x1b, 0xfb, 0xe8, 0x46, 0x9e, 0x05, 0xa9, 0x11, 0x9c, 0x2e, 0x8a, 0x10, 0x96, 0x03, 0x95, - 0x69, 0x38, 0xaf, 0x43, 0x53, 0x99, 0x8b, 0x59, 0x3b, 0x99, 0xd2, 0x6c, 0x10, 0x32, 0x55, 0x3b, - 0x29, 0x5a, 0xce, 0x3b, 0x58, 0x15, 0xf1, 0x24, 0xee, 0xf5, 0xf2, 0xf0, 0x49, 0x9a, 0xd6, 0x2a, - 0x4c, 0x86, 0x08, 0x57, 0x43, 0x44, 0xcb, 0x89, 0xf0, 0x3d, 0xa7, 0x30, 0x24, 0xcf, 0x5a, 0x04, - 0xd1, 0x71, 0x2c, 0xa3, 0x05, 0xfc, 0xe6, 0x7b, 0xd1, 0xa7, 0x47, 0x83, 0x9e, 0xaa, 0x81, 0xc2, - 0x06, 0xc7, 0x3c, 0xf3, 0xd2, 0x48, 0x5e, 0xa8, 0xf8, 0xcd, 0x31, 0x69, 0x9a, 0xc6, 0xa9, 0xbc, - 0x3d, 0x45, 0xc3, 0xd9, 0x83, 0xb5, 0x83, 0xab, 0x89, 0xc8, 0x09, 0x89, 0xd7, 0x1a, 0xb9, 0xfd, - 0xb1, 0xe1, 0x7c, 0x64, 0x55, 0x80, 0x60, 0x95, 0xc0, 0x28, 0xdb, 0x68, 0x19, 0x26, 0xf0, 0x2c, - 0x57, 0xc4, 0xb0, 0xc1, 0x23, 0xc2, 0x56, 0x99, 0x9a, 0xae, 0x41, 0x2b, 0x57, 0x54, 0x88, 0x93, - 0xf0, 0xff, 0x55, 0x54, 0x54, 0x58, 0x63, 0x47, 0x2b, 0xa9, 0xf8, 0xa5, 0x56, 0x49, 0x7c, 0x09, - 0x4b, 0xa6, 0x68, 0xdf, 0x6a, 0xd4, 0xff, 0xb3, 0x1a, 0xbe, 0x90, 0xe9, 0x08, 0xec, 0x80, 0xa5, - 0xd4, 0xeb, 0x7f, 0xab, 0x09, 0xf1, 0x1f, 0xc0, 0x4d, 0xb3, 0x5e, 0xea, 0xca, 0x92, 0x38, 0xbf, - 0x83, 0x69, 0x44, 0x91, 0xe4, 0xff, 0x3f, 0x90, 0xff, 0x03, 0xb8, 0x6e, 0xc8, 0x7f, 0x45, 0x31, - 0x9c, 0x3f, 0xaf, 0xe1, 0x2b, 0xe2, 0xce, 0xc0, 0x0f, 0x98, 0xe5, 0x73, 0xf0, 0x93, 0x89, 0x79, - 0x29, 0xeb, 0xf8, 0x1e, 0xa3, 0xba, 0x88, 0x93, 0x43, 0x1e, 0x7a, 0x0c, 0x1f, 0x4f, 0x68, 0xe4, - 0x8b, 0x4e, 0xf9, 0x18, 0x40, 0x23, 0x5f, 0x75, 0x89, 0xc8, 0xe1, 0xe8, 0xdc, 0x0a, 0xd4, 0x1e, - 0xe0, 0x3d, 0x8d, 0x45, 0x2f, 0xb8, 0xe3, 0x27, 0x5c, 0xd1, 0xe0, 0xdb, 0x3a, 0x3e, 0x3e, 0xe6, - 0x5b, 0x6e, 0x02, 0xc1, 0xb2, 0xe5, 0xec, 0x8a, 0xa4, 0xb4, 0x21, 0x9a, 0xdc, 0x6f, 0xaf, 0xc3, - 0x24, 0x45, 0x37, 0xb9, 0x98, 0xdd, 0x36, 0x70, 0x25, 0x86, 0xf3, 0x02, 0x20, 0x87, 0xf2, 0x63, - 0x08, 0xb5, 0x28, 0xdf, 0x40, 0xf9, 0x37, 0xb9, 0x0e, 0x10, 0xf8, 0x34, 0x62, 0xc1, 0x71, 0x40, - 0x55, 0xfd, 0x81, 0x01, 0xe1, 0xb7, 0x52, 0x9f, 0x66, 0x99, 0x4a, 0xde, 0x35, 0x5c, 0xd5, 0xe4, - 0xf1, 0x05, 0xbf, 0x4b, 0x33, 0xe6, 0xf5, 0x13, 0x75, 0x45, 0x6a, 0x80, 0x73, 0x04, 0x8d, 0xbd, - 0xdd, 0xc3, 0x03, 0xbc, 0x7d, 0x39, 0xe3, 0x4f, 0x3e, 0x79, 0xfc, 0x50, 0x31, 0xe6, 0xdf, 0xfa, - 0xed, 0xbb, 0x6e, 0xbc, 0x7d, 0x13, 0x6e, 0x16, 0xec, 0x44, 0xf9, 0xf0, 0xfc, 0x9b, 0x2b, 0x34, - 0xa2, 0x2f, 0x58, 0x27, 0x1d, 0x44, 0x92, 0xcb, 0x14, 0x6f, 0xbb, 0x83, 0xc8, 0x79, 0x08, 0x6b, - 0x9a, 0xc7, 0x23, 0xe1, 0x51, 0xab, 0x05, 0xbc, 0x03, 0x93, 0xe2, 0xe6, 0x97, 0x55, 0x18, 0x8b, - 0xfa, 0x28, 0x52, 0x03, 0x5c, 0x89, 0xe0, 0xec, 0xc0, 0xb2, 0x06, 0x1e, 0xb0, 0x38, 0xf9, 0x1a, - 0x24, 0xae, 0x19, 0x82, 0x70, 0x12, 0x3b, 0x61, 0xa8, 0x22, 0xb3, 0x16, 0xac, 0x1a, 0x5d, 0x3c, - 0xe2, 0x53, 0x3d, 0xe6, 0xa0, 0x27, 0x41, 0xc6, 0x8c, 0x41, 0x7f, 0x55, 0x33, 0x46, 0x7d, 0x92, - 0x84, 0xb1, 0xe7, 0x2b, 0xa9, 0xb6, 0x60, 0x46, 0x30, 0xed, 0x18, 0x99, 0x03, 0x10, 0x20, 0xbc, - 0xb7, 0x73, 0x04, 0x4c, 0xa9, 0xd7, 0x4d, 0x84, 0x87, 0x1e, 0xf3, 0x74, 0xb2, 0x7d, 0x2c, 0x4f, - 0xb6, 0xf3, 0x4d, 0xe2, 0xa5, 0xdd, 0x93, 0xe0, 0x94, 0xfa, 0xf2, 0x3e, 0xd2, 0x6d, 0xbe, 0xce, - 0xf1, 0x29, 0x4d, 0xcf, 0xd2, 0x80, 0x09, 0x7f, 0x7f, 0xda, 0xcd, 0x01, 0xce, 0x1e, 0xb4, 0x73, - 0x7d, 0x50, 0xcf, 0x57, 0x5f, 0x57, 0xd6, 0xe1, 0x03, 0x58, 0xd1, 0xc0, 0x9f, 0x0c, 0xa8, 0xce, - 0x7d, 0x5f, 0x85, 0xc6, 0x8f, 0xa0, 0xa5, 0x81, 0x3b, 0x03, 0x16, 0x3f, 0x31, 0x14, 0xb7, 0x6a, - 0x91, 0x69, 0xa8, 0x31, 0xc6, 0xab, 0x92, 0xb8, 0xb2, 0xd5, 0xab, 0xd2, 0xe7, 0xd6, 0x9a, 0x8a, - 0x85, 0xcb, 0xfd, 0x0b, 0x5d, 0x6a, 0x6d, 0xbe, 0x46, 0xbf, 0x01, 0x53, 0x82, 0xa8, 0x7a, 0x30, - 0xa8, 0x10, 0x55, 0x61, 0x38, 0xb1, 0xb1, 0xc4, 0x72, 0xbe, 0x97, 0x90, 0xcf, 0x15, 0x51, 0xbf, - 0x44, 0x11, 0xd6, 0x1a, 0x37, 0x64, 0x41, 0xc5, 0x87, 0x86, 0x72, 0x64, 0xb1, 0xf0, 0xa5, 0x2c, - 0x15, 0x9d, 0x7a, 0x4e, 0xe7, 0xde, 0x9f, 0xbe, 0x0b, 0xf3, 0x7b, 0xb1, 0x70, 0xf3, 0x0f, 0xb9, - 0x77, 0x9b, 0x92, 0xa7, 0x30, 0x25, 0x7f, 0x56, 0x41, 0x56, 0x4b, 0xbf, 0xb3, 0x40, 0xf5, 0xb7, - 0xd7, 0x86, 0xfc, 0xfe, 0xc2, 0x59, 0xfa, 0xea, 0x9f, 0xff, 0xf5, 0xe7, 0xf5, 0x39, 0x32, 0x73, - 0xf7, 0xf4, 0x9d, 0xbb, 0x3d, 0xca, 0xd0, 0x8d, 0xea, 0xc1, 0x9c, 0x55, 0x09, 0x4f, 0x36, 0xac, - 0x6a, 0xf6, 0x42, 0x81, 0x7c, 0x7b, 0xf3, 0xc2, 0x5a, 0x77, 0xe7, 0x1a, 0xb2, 0x58, 0x22, 0x8b, - 0x92, 0x45, 0x5e, 0xe4, 0x4e, 0xbe, 0x80, 0x85, 0x47, 0x98, 0x5e, 0xd3, 0x44, 0xc9, 0x56, 0x4e, - 0xac, 0xb2, 0xc0, 0xbf, 0x7d, 0x63, 0x38, 0x82, 0x64, 0xb8, 0x8e, 0x0c, 0x57, 0xc8, 0x12, 0x67, - 0x28, 0xd2, 0x77, 0x9a, 0x27, 0xc9, 0xa0, 0x29, 0x4b, 0x86, 0x5f, 0x2a, 0xcf, 0x0d, 0xe4, 0xb9, - 0x4a, 0x96, 0x39, 0x4f, 0x5f, 0x30, 0xc8, 0x99, 0xc6, 0x98, 0x1d, 0x30, 0x4b, 0xdc, 0xc9, 0xf5, - 0xa1, 0xb5, 0xef, 0x82, 0xe5, 0xd6, 0x25, 0xb5, 0xf1, 0xf6, 0x2c, 0x7b, 0x94, 0xe3, 0xea, 0xf2, - 0x78, 0xf2, 0x73, 0xe1, 0x32, 0x56, 0xfe, 0x18, 0x83, 0xbc, 0x76, 0xf9, 0x2f, 0x40, 0x84, 0x0c, - 0xb7, 0x47, 0xfd, 0xa9, 0x88, 0xf3, 0x1d, 0x14, 0xe6, 0x3a, 0xd9, 0x90, 0xc2, 0x58, 0x3f, 0x0f, - 0x51, 0x3f, 0x40, 0x21, 0x5d, 0x98, 0x35, 0xeb, 0xda, 0xc9, 0x7a, 0x85, 0x87, 0xaa, 0x99, 0x6f, - 0x54, 0x77, 0x4a, 0x86, 0x2d, 0x64, 0x48, 0x48, 0x53, 0x32, 0xd4, 0x65, 0xf0, 0xe4, 0x4b, 0x58, - 0x28, 0xd4, 0x84, 0x13, 0xa7, 0xb0, 0x7c, 0x15, 0xf5, 0xfd, 0xed, 0x57, 0x2e, 0xc4, 0x91, 0x5c, - 0xaf, 0x23, 0xd7, 0x96, 0xb3, 0x64, 0xac, 0xb2, 0xe2, 0xfc, 0xbd, 0xda, 0xeb, 0x24, 0xc3, 0x75, - 0x36, 0xcb, 0x97, 0x47, 0xe2, 0xbd, 0x75, 0x49, 0xed, 0x73, 0x69, 0xad, 0x15, 0x4f, 0xdc, 0xad, - 0x19, 0x96, 0x84, 0x1a, 0x45, 0xf7, 0x18, 0xbe, 0x8d, 0xc2, 0x77, 0xb3, 0xba, 0x68, 0x5f, 0xfe, - 0x6e, 0xc0, 0x69, 0x23, 0xd7, 0x65, 0x42, 0x0a, 0x5c, 0x63, 0x96, 0x90, 0xcc, 0xfa, 0x4d, 0x83, - 0x64, 0x6a, 0x5b, 0x75, 0xc5, 0xaf, 0x0a, 0x2a, 0x67, 0x6a, 0xfe, 0x4c, 0x60, 0xe8, 0x4c, 0x63, - 0x96, 0x64, 0xe4, 0x05, 0xcc, 0x8b, 0xe3, 0xe2, 0xe5, 0xaf, 0xec, 0x26, 0xf2, 0x5d, 0x73, 0x48, - 0x7e, 0x66, 0x98, 0x0b, 0xfb, 0x29, 0x34, 0xb4, 0x9f, 0x4d, 0x5a, 0xc6, 0x24, 0xac, 0x02, 0xef, - 0xf6, 0x90, 0xf2, 0x5d, 0x65, 0xad, 0xce, 0x9c, 0x9c, 0x95, 0x28, 0xc6, 0xe5, 0x84, 0x7f, 0x0a, - 0x90, 0xd7, 0xf3, 0x92, 0x6b, 0x25, 0xca, 0x5a, 0x73, 0xed, 0xaa, 0x2e, 0xf5, 0xcb, 0x25, 0x24, - 0xdf, 0x24, 0xf3, 0x16, 0x79, 0xb5, 0xdf, 0x74, 0x58, 0x61, 0xed, 0xb7, 0x62, 0x05, 0x70, 0x7b, - 0x78, 0xe9, 0xa7, 0x5a, 0x14, 0x47, 0x6d, 0x36, 0xfd, 0x7c, 0xcc, 0x67, 0x20, 0x2e, 0x0b, 0xa3, - 0xe6, 0x74, 0xa3, 0x8a, 0x4b, 0xe5, 0x65, 0x51, 0x2e, 0x20, 0x2d, 0x5d, 0x16, 0x79, 0x9d, 0x28, - 0x79, 0x8e, 0xbf, 0xdc, 0x34, 0x4a, 0x26, 0x89, 0x49, 0xab, 0x5c, 0x3f, 0xda, 0xbe, 0x3e, 0xac, - 0x3b, 0xab, 0xb6, 0x6f, 0xf9, 0xc2, 0x84, 0x9b, 0x4a, 0x2c, 0xb8, 0x28, 0x94, 0xb4, 0x16, 0xdc, - 0xaa, 0xa7, 0x6c, 0x5f, 0xab, 0xe8, 0x91, 0xd4, 0x57, 0x90, 0xfa, 0x02, 0x99, 0xd3, 0x47, 0x22, - 0xd2, 0x12, 0x6b, 0xa2, 0x2b, 0x58, 0xac, 0x35, 0x29, 0x96, 0x39, 0x5a, 0x67, 0x60, 0xa9, 0xd8, - 0xb1, 0x74, 0x06, 0xea, 0x72, 0x46, 0xf2, 0xbb, 0x76, 0xd5, 0xa4, 0xaa, 0xe2, 0x72, 0x2e, 0x2c, - 0xbb, 0x2a, 0xed, 0x96, 0xa1, 0xa5, 0x59, 0xce, 0x16, 0x72, 0xbe, 0x46, 0xd6, 0x8a, 0x9c, 0x65, - 0x99, 0x17, 0xf9, 0xaa, 0x06, 0x4b, 0x15, 0x45, 0x44, 0xb9, 0x04, 0xc3, 0x4b, 0x9e, 0x72, 0x09, - 0x2e, 0xaa, 0x42, 0x72, 0x50, 0x82, 0x0d, 0x07, 0x25, 0xf0, 0x7c, 0x5f, 0x4b, 0x20, 0x1f, 0xcc, - 0xb8, 0x65, 0xfe, 0x51, 0x0d, 0x56, 0xab, 0x0b, 0x86, 0xc8, 0xab, 0xfa, 0xb7, 0x60, 0x17, 0x95, - 0x32, 0xb5, 0x6f, 0x5d, 0x86, 0x26, 0xa5, 0x79, 0x15, 0xa5, 0xd9, 0x72, 0xda, 0x5c, 0x9a, 0x14, - 0x71, 0xab, 0x04, 0x3a, 0xc3, 0x2c, 0x8b, 0x5d, 0x92, 0x43, 0x0c, 0xdf, 0xa2, 0xba, 0x72, 0xa9, - 0x7d, 0xf3, 0x02, 0x0c, 0xfb, 0xf8, 0x22, 0x2b, 0x72, 0x41, 0xb0, 0x8e, 0x45, 0xd7, 0xf6, 0xc8, - 0x3d, 0x9a, 0x97, 0xbc, 0x58, 0x7b, 0xb4, 0x54, 0xc5, 0x63, 0xed, 0xd1, 0x72, 0x61, 0x4d, 0x69, - 0x8f, 0x22, 0x33, 0x2c, 0xb2, 0x21, 0x9f, 0xe1, 0xb6, 0x91, 0x29, 0xbe, 0x56, 0x71, 0xab, 0x67, - 0x55, 0xdb, 0xc6, 0x4e, 0xe2, 0x95, 0x8e, 0x4a, 0x91, 0x39, 0xe4, 0xda, 0x73, 0x61, 0x5a, 0xa1, - 0x93, 0xb5, 0x22, 0x01, 0x45, 0xb9, 0xb2, 0x4a, 0xc3, 0x59, 0x43, 0xa2, 0x8b, 0xce, 0xac, 0x49, - 0x94, 0xd3, 0x3c, 0x82, 0x19, 0xa3, 0x22, 0x81, 0xe8, 0x43, 0xb6, 0x5c, 0x80, 0xd1, 0x5e, 0xaf, - 0xec, 0xb3, 0x8f, 0x12, 0x67, 0x81, 0x33, 0xc8, 0x10, 0x41, 0xf3, 0xf8, 0x4d, 0x98, 0xb3, 0x8a, - 0x02, 0x72, 0xe5, 0x57, 0x95, 0x2d, 0xe4, 0xca, 0xaf, 0xac, 0x24, 0x50, 0x8e, 0xa6, 0x83, 0xca, - 0xcf, 0x24, 0x8a, 0xe6, 0xf5, 0x39, 0x34, 0x74, 0x2e, 0x3e, 0xd7, 0x7f, 0x31, 0x3d, 0x7f, 0x19, - 0x0f, 0x6b, 0x0d, 0xce, 0xf8, 0xe0, 0xa3, 0xb8, 0x7f, 0x24, 0xf5, 0x65, 0x64, 0x9a, 0x73, 0x7d, - 0x95, 0xd3, 0xed, 0xb9, 0xbe, 0xaa, 0x52, 0xd3, 0x96, 0xbe, 0xba, 0x88, 0xa0, 0xe7, 0x90, 0xc2, - 0x42, 0x21, 0xc3, 0x9b, 0xbb, 0x15, 0xd5, 0xf9, 0xec, 0xdc, 0xad, 0x18, 0x92, 0x1a, 0xb6, 0x1d, - 0x37, 0xc1, 0xcf, 0x0b, 0xc3, 0xdc, 0xb6, 0xc4, 0x71, 0x2f, 0xf2, 0x9f, 0x96, 0xdd, 0x5a, 0x89, - 0x5e, 0xcb, 0x6e, 0xed, 0x64, 0x69, 0xe9, 0xb8, 0x17, 0x4f, 0x40, 0xe4, 0x19, 0x4c, 0xab, 0xc4, - 0x5b, 0x6e, 0xb4, 0x85, 0x94, 0x63, 0xbb, 0x55, 0xee, 0x90, 0x54, 0x2d, 0xc3, 0xf5, 0x7c, 0x1f, - 0xa9, 0xca, 0x85, 0x30, 0xd2, 0x70, 0xf9, 0x42, 0x94, 0x33, 0x78, 0xf9, 0x42, 0x54, 0xe5, 0xed, - 0xac, 0x85, 0x10, 0x27, 0x97, 0xe6, 0xf1, 0xb7, 0x35, 0x7c, 0x9e, 0xbc, 0x38, 0x8b, 0x46, 0xde, - 0xbe, 0x42, 0xc2, 0x4d, 0x08, 0xf4, 0xce, 0x95, 0x53, 0x74, 0xce, 0x6d, 0x14, 0xd3, 0x71, 0x36, - 0xd5, 0x65, 0x8a, 0xc3, 0x7c, 0x81, 0xae, 0xf3, 0x75, 0x5c, 0xe8, 0xbf, 0xae, 0x89, 0xdf, 0xe5, - 0x5f, 0x40, 0x97, 0x6c, 0x8f, 0x28, 0x80, 0x12, 0xf8, 0xee, 0xc8, 0xf8, 0x52, 0xdc, 0x5b, 0x28, - 0xee, 0x0d, 0x67, 0xfd, 0x02, 0x71, 0xb9, 0xb0, 0xbf, 0x0d, 0xeb, 0x3a, 0xdb, 0x66, 0xd1, 0xfd, - 0x70, 0x10, 0xf9, 0x59, 0x1e, 0x97, 0x0e, 0x49, 0xc9, 0xe5, 0x86, 0x53, 0x4c, 0xc2, 0xd8, 0xf7, - 0xe3, 0x99, 0xec, 0x15, 0x62, 0x1c, 0x73, 0xda, 0x9c, 0x7b, 0x02, 0x8b, 0x6a, 0xdc, 0x87, 0x81, - 0xc7, 0xbe, 0x31, 0xcf, 0x1b, 0xc8, 0xb3, 0xed, 0xac, 0x98, 0x3c, 0x8f, 0x03, 0x8f, 0x69, 0x8e, - 0x19, 0x16, 0x4f, 0x58, 0xf9, 0x15, 0x33, 0xf8, 0xae, 0xcc, 0xbc, 0x98, 0xc1, 0x77, 0x75, 0x2a, - 0xc8, 0x0e, 0xbe, 0x7b, 0x94, 0x89, 0xd4, 0x8c, 0x2f, 0x19, 0x9c, 0x42, 0xf3, 0x60, 0x28, 0xd3, - 0x83, 0xaf, 0xcd, 0x54, 0xfa, 0x40, 0x0e, 0x32, 0xcd, 0x0a, 0x4c, 0xf9, 0x64, 0x4f, 0x45, 0xa5, - 0x88, 0x99, 0x79, 0x21, 0x5b, 0xc3, 0x73, 0x32, 0x65, 0xbe, 0x95, 0x49, 0x1b, 0x9b, 0xaf, 0x11, - 0x21, 0xe1, 0xef, 0x91, 0x39, 0xdf, 0x73, 0x20, 0x76, 0x94, 0x84, 0xbf, 0x63, 0xd3, 0xa7, 0x40, - 0x45, 0xbe, 0x65, 0xb4, 0x10, 0xe9, 0x26, 0x32, 0x5e, 0x77, 0x56, 0xcb, 0x21, 0x12, 0xe7, 0xcd, - 0x59, 0xff, 0x16, 0x2c, 0x15, 0x62, 0xef, 0x97, 0xc4, 0xdb, 0x32, 0xe7, 0x42, 0xe0, 0xad, 0x98, - 0x33, 0x8c, 0x83, 0x0b, 0x49, 0x14, 0x72, 0xb3, 0x2a, 0xde, 0xb0, 0x72, 0x14, 0x17, 0x45, 0x3e, - 0xf2, 0xde, 0x20, 0xab, 0xa5, 0x70, 0x04, 0x29, 0xbc, 0x5d, 0x23, 0x7f, 0x58, 0xc3, 0x9f, 0x0e, - 0x0d, 0xc9, 0xe1, 0x90, 0x3b, 0x55, 0x01, 0xef, 0x95, 0xc5, 0x90, 0xe7, 0x09, 0xb9, 0x5e, 0x8c, - 0x8a, 0x4b, 0xe2, 0x9c, 0xe0, 0x0b, 0x84, 0x99, 0x89, 0xb1, 0x62, 0xf2, 0x8a, 0x14, 0xcd, 0xd0, - 0xa0, 0xb5, 0x18, 0x8a, 0xcb, 0xa8, 0x52, 0x71, 0xfa, 0x99, 0xfd, 0x07, 0x02, 0x2c, 0x96, 0xb7, - 0x2a, 0x66, 0x7d, 0x15, 0xd6, 0xaf, 0x20, 0xeb, 0x4d, 0xb2, 0x5e, 0x98, 0x6f, 0x41, 0x04, 0xe1, - 0xd6, 0x1a, 0x29, 0x16, 0xd3, 0xad, 0x2d, 0xa5, 0x95, 0x2c, 0xb7, 0xb6, 0x9c, 0xd9, 0x29, 0xb9, - 0xb5, 0x1e, 0x47, 0xc1, 0xcb, 0x90, 0x30, 0x68, 0x16, 0x53, 0x1d, 0xc6, 0x56, 0xae, 0x4e, 0x82, - 0x18, 0x5b, 0x79, 0xc8, 0xbb, 0x6f, 0xc1, 0x6b, 0xef, 0x32, 0xf1, 0x7c, 0x7c, 0x57, 0x96, 0x27, - 0x11, 0x06, 0x0b, 0x85, 0x34, 0x84, 0xb1, 0x96, 0x95, 0xf9, 0x89, 0x11, 0x78, 0xda, 0xc7, 0x87, - 0xe6, 0x39, 0x40, 0x32, 0x7c, 0x1b, 0xbd, 0x80, 0xa5, 0x8a, 0x94, 0x82, 0x11, 0x3b, 0x0e, 0xcd, - 0x37, 0xb4, 0xcb, 0xd2, 0x59, 0x4f, 0xeb, 0xf6, 0x23, 0x4b, 0xce, 0x3b, 0xa5, 0x82, 0x73, 0x62, - 0xcc, 0x57, 0xfe, 0x39, 0xa1, 0x32, 0x45, 0x2b, 0x8b, 0xd3, 0xde, 0x1a, 0xda, 0x5f, 0x79, 0x35, - 0x68, 0x96, 0xf2, 0x81, 0x3d, 0x84, 0x79, 0x5b, 0x54, 0xe3, 0x49, 0xa1, 0x2a, 0x1b, 0x72, 0xe9, - 0x0c, 0xed, 0x3d, 0xa3, 0xd9, 0x7d, 0x81, 0xb4, 0x23, 0x98, 0xb3, 0xf2, 0x54, 0x86, 0xb9, 0x56, - 0x64, 0xc0, 0x46, 0xb7, 0x9f, 0xa2, 0x3e, 0x33, 0x16, 0x27, 0xe2, 0x40, 0x6c, 0x16, 0xf3, 0x62, - 0x64, 0xab, 0x92, 0x65, 0x9e, 0xfc, 0xfa, 0xe6, 0x5c, 0x33, 0x83, 0xab, 0x4c, 0xac, 0x55, 0x70, - 0xb5, 0x53, 0x6e, 0x97, 0xaf, 0xe3, 0x25, 0x4c, 0xf1, 0x30, 0x2a, 0xe6, 0x9e, 0x0e, 0xe3, 0x5e, - 0x2f, 0xa4, 0xa4, 0x3c, 0xa3, 0x42, 0x72, 0x6a, 0x84, 0x39, 0x5b, 0x77, 0x5f, 0xce, 0xde, 0x1b, - 0xb0, 0x58, 0xee, 0x9b, 0xa3, 0x49, 0xfc, 0xfb, 0x62, 0xef, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x42, 0xce, 0x0b, 0x50, 0x92, 0x4c, 0x00, 0x00, + // 5474 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0x4d, 0x6f, 0x1c, 0x47, + 0x76, 0x98, 0x21, 0x45, 0x72, 0x1e, 0xbf, 0x86, 0xc5, 0xaf, 0xd1, 0x88, 0x12, 0xa5, 0xf6, 0x5a, + 0x96, 0xfc, 0x41, 0xd9, 0xb2, 0x92, 0x75, 0xd6, 0xce, 0x6e, 0x28, 0x4a, 0xa6, 0xb5, 0xd6, 0x5a, + 0xdc, 0x26, 0x2d, 0x03, 0xde, 0xc0, 0x93, 0xe6, 0x74, 0x71, 0xd8, 0x51, 0x4f, 0x77, 0xbb, 0xbb, + 0x86, 0x14, 0xbd, 0x09, 0xb2, 0x30, 0x92, 0x20, 0x87, 0x20, 0x39, 0x18, 0x01, 0x12, 0x20, 0x97, + 0xe4, 0x14, 0x04, 0xc8, 0x25, 0xc8, 0x29, 0x87, 0x45, 0xae, 0x41, 0x8e, 0xb9, 0xe4, 0x07, 0x04, + 0xb9, 0x25, 0x01, 0x02, 0xe4, 0x92, 0x53, 0x50, 0xaf, 0x3e, 0xba, 0xaa, 0xbb, 0x67, 0x38, 0xb4, + 0xb5, 0xde, 0x8b, 0x34, 0xfd, 0xea, 0xd5, 0x7b, 0xaf, 0x5e, 0xbd, 0xaa, 0x7a, 0xaf, 0xde, 0x2b, + 0x42, 0x23, 0x4d, 0xba, 0x5b, 0x49, 0x1a, 0xb3, 0x98, 0x4c, 0xf5, 0xba, 0x2c, 0x4d, 0xba, 0xed, + 0x8d, 0x5e, 0x1c, 0xf7, 0x42, 0x7a, 0xc7, 0x4b, 0x82, 0x3b, 0x5e, 0x14, 0xc5, 0xcc, 0x63, 0x41, + 0x1c, 0x65, 0x02, 0xcb, 0x69, 0xc2, 0xc2, 0x2e, 0x65, 0x8f, 0xa2, 0xa3, 0xd8, 0xa5, 0x9f, 0x0f, + 0x68, 0xc6, 0x9c, 0x7f, 0x98, 0x84, 0x45, 0x0d, 0xca, 0x92, 0x38, 0xca, 0x28, 0x59, 0x83, 0xa9, + 0x41, 0xc2, 0x82, 0x3e, 0x6d, 0xd5, 0xae, 0xd7, 0x6e, 0x35, 0x5c, 0xf9, 0x45, 0xee, 0xc0, 0xb2, + 0x77, 0xe2, 0x05, 0xa1, 0x77, 0x18, 0xd2, 0x0e, 0x7d, 0xde, 0x3d, 0xf6, 0xa2, 0x1e, 0xcd, 0x5a, + 0xf5, 0xeb, 0xb5, 0x5b, 0x13, 0x2e, 0xd1, 0x4d, 0x0f, 0x55, 0x0b, 0x79, 0x0d, 0x96, 0x68, 0xc4, + 0x41, 0xbe, 0x81, 0x3e, 0x81, 0xe8, 0x4d, 0xd9, 0x90, 0x23, 0xdf, 0x83, 0x35, 0x9f, 0x1e, 0x79, + 0x83, 0x90, 0x75, 0x8e, 0xe2, 0x94, 0x3e, 0xef, 0x24, 0x69, 0x7c, 0x12, 0xf8, 0x34, 0x6d, 0x4d, + 0xa2, 0x14, 0x2b, 0xb2, 0xf5, 0x7d, 0xde, 0xb8, 0x27, 0xdb, 0xc8, 0x5d, 0x58, 0xd5, 0xbd, 0x02, + 0x8f, 0x75, 0xba, 0x83, 0x34, 0xa5, 0x51, 0xf7, 0xac, 0x75, 0x09, 0x3b, 0x2d, 0xab, 0x4e, 0x81, + 0xc7, 0x76, 0x64, 0x13, 0xf9, 0x04, 0x9a, 0xd9, 0xe0, 0x30, 0x3b, 0xcb, 0x18, 0xed, 0x77, 0x32, + 0xe6, 0xb1, 0x41, 0xd6, 0x9a, 0xba, 0x3e, 0x71, 0x6b, 0xf6, 0xee, 0xeb, 0x5b, 0x42, 0x8d, 0x5b, + 0x05, 0x95, 0x6c, 0xed, 0x2b, 0xfc, 0x7d, 0x44, 0x7f, 0x18, 0xb1, 0xf4, 0xcc, 0x5d, 0xcc, 0x6c, + 0x28, 0xf9, 0x08, 0xe6, 0xd3, 0xa4, 0xdb, 0xa1, 0x91, 0x9f, 0xc4, 0x41, 0xc4, 0xb2, 0xd6, 0x34, + 0x52, 0xbd, 0x3d, 0x8c, 0xaa, 0x9b, 0x74, 0x1f, 0x2a, 0x5c, 0x41, 0x72, 0x2e, 0x35, 0x40, 0xed, + 0xfb, 0xb0, 0x52, 0xc5, 0x98, 0x34, 0x61, 0xe2, 0x19, 0x3d, 0x93, 0xb3, 0xc3, 0x7f, 0x92, 0x15, + 0xb8, 0x74, 0xe2, 0x85, 0x03, 0x8a, 0x93, 0x31, 0xe3, 0x8a, 0x8f, 0xef, 0xd5, 0xdf, 0xa9, 0xb5, + 0x0f, 0x60, 0xa9, 0xc4, 0xa6, 0x82, 0xc0, 0x6d, 0x93, 0xc0, 0xec, 0xdd, 0x65, 0x25, 0xb2, 0xbb, + 0xb7, 0xa3, 0xfa, 0x1a, 0x54, 0x9d, 0x1b, 0xb0, 0xb9, 0x4b, 0xd9, 0x4e, 0xdc, 0xef, 0x0f, 0xa2, + 0xa0, 0x8b, 0x36, 0xe6, 0xd2, 0xd0, 0x3b, 0xa3, 0x69, 0xa6, 0x2c, 0xeb, 0x23, 0x58, 0xa9, 0x6a, + 0x27, 0x2d, 0x98, 0x96, 0x73, 0x8f, 0xfc, 0x67, 0x5c, 0xf5, 0x49, 0x36, 0xa0, 0xd1, 0x8d, 0xa3, + 0x88, 0x76, 0x19, 0xf5, 0xe5, 0x40, 0x72, 0x80, 0xf3, 0x87, 0x75, 0xb8, 0x3e, 0x9c, 0xa7, 0x34, + 0xdd, 0x2f, 0x60, 0xad, 0x6b, 0x22, 0x74, 0x52, 0x89, 0xd1, 0xaa, 0xe1, 0x54, 0xec, 0x18, 0x53, + 0x31, 0x92, 0xd2, 0x56, 0x65, 0xab, 0x98, 0xa4, 0xd5, 0x6e, 0x55, 0x5b, 0xfb, 0x08, 0xda, 0xc3, + 0x3b, 0x55, 0xa8, 0xfc, 0xae, 0xad, 0xf2, 0x0d, 0x25, 0x5a, 0x15, 0x11, 0x53, 0xf7, 0xdf, 0x85, + 0xf5, 0x5d, 0x1a, 0xd1, 0x34, 0xe8, 0x6a, 0xe3, 0x90, 0x3a, 0xe7, 0x1a, 0xd4, 0x36, 0x29, 0x59, + 0xe5, 0x00, 0xa7, 0x0d, 0xad, 0x72, 0x47, 0x31, 0x5c, 0x67, 0x0d, 0x56, 0x76, 0x29, 0xd3, 0x70, + 0x3d, 0x8b, 0x3f, 0xaf, 0xc1, 0x2a, 0x36, 0x64, 0x87, 0xd9, 0x99, 0x68, 0x90, 0xaa, 0xfe, 0x2d, + 0x58, 0xd2, 0xa4, 0x33, 0xb5, 0x8c, 0x84, 0x96, 0xdf, 0x36, 0xb4, 0x5c, 0xee, 0x99, 0x2f, 0xa6, + 0xcc, 0x5c, 0x4d, 0xf9, 0x9a, 0x94, 0xe0, 0xf6, 0x0e, 0xac, 0x56, 0xa2, 0x5e, 0xc4, 0xfe, 0x9d, + 0x16, 0xac, 0xed, 0x52, 0x66, 0x98, 0xb1, 0x61, 0xa0, 0xb3, 0x06, 0x98, 0xdb, 0x65, 0xc6, 0xbc, + 0x94, 0xe5, 0x76, 0x29, 0x3f, 0xc9, 0xcb, 0xb0, 0x10, 0x06, 0x19, 0xa3, 0x51, 0xc7, 0xf3, 0xfd, + 0x94, 0x66, 0x62, 0xcb, 0x6b, 0xb8, 0xf3, 0x02, 0xba, 0x2d, 0x80, 0xce, 0x3f, 0xd6, 0xf8, 0xc4, + 0x14, 0x58, 0x49, 0x65, 0x3d, 0x86, 0x46, 0xbe, 0x2b, 0x08, 0x25, 0x6d, 0x19, 0x4a, 0xaa, 0xea, + 0xb3, 0x55, 0xd8, 0x1a, 0x72, 0x02, 0xed, 0x1f, 0xc3, 0xc2, 0x8b, 0x5e, 0xd0, 0xef, 0x40, 0x5b, + 0xda, 0x86, 0xda, 0x91, 0x3f, 0xf2, 0xfa, 0x54, 0xd9, 0x55, 0x1b, 0x66, 0xd4, 0x06, 0x2e, 0x79, + 0xe8, 0x6f, 0xe7, 0x2a, 0x5c, 0xa9, 0xec, 0x29, 0x0d, 0xeb, 0x0e, 0x2c, 0xef, 0x52, 0xa6, 0xb7, + 0x79, 0x45, 0x71, 0xe8, 0x2e, 0xe0, 0xdc, 0x43, 0x4b, 0x34, 0x3a, 0x48, 0x15, 0x6e, 0x40, 0x23, + 0x3f, 0x44, 0xa4, 0x6d, 0x6b, 0x80, 0x73, 0x17, 0xcd, 0x54, 0xf5, 0x7a, 0x72, 0xb0, 0xe7, 0x52, + 0xd1, 0xed, 0x32, 0xcc, 0xc4, 0x2c, 0xe9, 0x74, 0x63, 0x5f, 0x89, 0x3e, 0x1d, 0xb3, 0x64, 0x27, + 0xf6, 0xa9, 0x34, 0x0d, 0xa3, 0x8f, 0x36, 0x8d, 0xbf, 0x16, 0x53, 0x69, 0x37, 0x49, 0x39, 0x7e, + 0x08, 0x0d, 0x45, 0x50, 0x4d, 0xe5, 0x1b, 0xc6, 0x54, 0x56, 0xf5, 0xd9, 0x7a, 0x22, 0x38, 0xca, + 0x99, 0x9c, 0x91, 0x02, 0x64, 0xed, 0x77, 0x61, 0xde, 0x6a, 0x3a, 0xcf, 0xb2, 0x1b, 0xe6, 0x94, + 0xdd, 0x83, 0xb5, 0x07, 0x41, 0x66, 0x9e, 0xb8, 0xe3, 0x4c, 0xd7, 0x67, 0xb0, 0xb0, 0xe7, 0x05, + 0x69, 0xb6, 0x3f, 0x48, 0x92, 0x18, 0xcd, 0xfb, 0x15, 0x58, 0xcc, 0x8f, 0xf5, 0x84, 0xb7, 0xc9, + 0x4e, 0x0b, 0x1a, 0x8c, 0x3d, 0xc8, 0x4b, 0x30, 0xaf, 0x8e, 0x73, 0x81, 0x26, 0x44, 0x9a, 0x93, + 0x40, 0x44, 0x72, 0xbe, 0x9c, 0xb4, 0x54, 0x67, 0x39, 0x16, 0x04, 0x26, 0x23, 0x4f, 0xbb, 0x15, + 0xf8, 0xdb, 0x34, 0x84, 0xba, 0x7d, 0x1c, 0xb4, 0x60, 0xfa, 0x84, 0xa6, 0x87, 0x71, 0x46, 0xd1, + 0x67, 0x98, 0x71, 0xd5, 0x27, 0x17, 0x64, 0x90, 0x05, 0x51, 0xaf, 0x93, 0x79, 0x91, 0x7f, 0x18, + 0x3f, 0x47, 0x0f, 0x61, 0xc6, 0x9d, 0x43, 0xe0, 0xbe, 0x80, 0x91, 0x1b, 0x30, 0x77, 0xcc, 0x58, + 0xd2, 0xe1, 0xae, 0x4b, 0x3c, 0x60, 0xd2, 0x21, 0x98, 0xe5, 0xb0, 0x03, 0x01, 0xe2, 0x0b, 0x1b, + 0x51, 0x06, 0x19, 0x4d, 0xbd, 0x1e, 0x8d, 0x58, 0x6b, 0x4a, 0x2c, 0x6c, 0x0e, 0xfd, 0x58, 0x01, + 0xc9, 0x55, 0x00, 0x44, 0x4b, 0xd2, 0xf8, 0xf9, 0x59, 0x6b, 0x5a, 0x98, 0x1e, 0x87, 0xec, 0x71, + 0x00, 0xd7, 0xdf, 0xa1, 0x97, 0x51, 0xe5, 0x7a, 0x04, 0x34, 0x6b, 0xcd, 0x08, 0xfd, 0x71, 0xf0, + 0x8e, 0x86, 0x92, 0x0e, 0xf7, 0x3b, 0xa4, 0xd6, 0x3b, 0x5e, 0x96, 0x51, 0x96, 0xb5, 0x1a, 0x68, + 0x40, 0xf7, 0x2a, 0x0c, 0xa8, 0xe0, 0x7f, 0xc8, 0x7e, 0xdb, 0xd8, 0x4d, 0xfb, 0x1f, 0x16, 0x94, + 0xfb, 0x5b, 0xde, 0x80, 0x1d, 0xd3, 0x88, 0xf1, 0xd3, 0x83, 0x33, 0x49, 0x82, 0x16, 0xa0, 0x6e, + 0x9a, 0x56, 0xc3, 0x76, 0x12, 0xb4, 0x3f, 0xe5, 0xce, 0x45, 0x99, 0x6a, 0x85, 0x09, 0xbe, 0x6e, + 0x6f, 0x25, 0x6b, 0x4a, 0x58, 0xdb, 0x8e, 0x4c, 0xd3, 0x3c, 0x85, 0xe6, 0x2e, 0x65, 0x07, 0x41, + 0xf7, 0x19, 0x4d, 0xc7, 0x30, 0x4a, 0x72, 0x0b, 0x26, 0xb9, 0x45, 0x49, 0x06, 0x2b, 0xfa, 0x24, + 0x94, 0x1e, 0x1b, 0x67, 0xe4, 0x22, 0x06, 0x9f, 0x0b, 0xd4, 0x5c, 0x87, 0x9d, 0x25, 0xc2, 0x2e, + 0x1a, 0x6e, 0x03, 0x21, 0x07, 0x67, 0x09, 0x75, 0x9e, 0xc2, 0x9c, 0xd9, 0x89, 0x6f, 0x1a, 0x3e, + 0x0d, 0x83, 0x7e, 0xc0, 0x68, 0xaa, 0x36, 0x0d, 0x0d, 0xe0, 0xf6, 0xc8, 0xa7, 0x48, 0xda, 0x31, + 0xfe, 0xe6, 0xeb, 0xed, 0xf3, 0x41, 0xcc, 0x14, 0x6d, 0xf1, 0xe1, 0xfc, 0x59, 0x1d, 0x16, 0xd4, + 0x70, 0xa4, 0x31, 0x2b, 0x99, 0x6b, 0xe7, 0xca, 0x7c, 0x03, 0xe6, 0x42, 0x2f, 0x63, 0x9d, 0x41, + 0xe2, 0x7b, 0xca, 0xb5, 0x99, 0x70, 0x67, 0x39, 0xec, 0x63, 0x01, 0xe2, 0x16, 0xad, 0x3c, 0x57, + 0x5c, 0x5b, 0x92, 0xfb, 0x5c, 0xd7, 0x1c, 0x0c, 0x81, 0x49, 0xde, 0x07, 0xad, 0xbd, 0xe6, 0xe2, + 0x6f, 0x0e, 0x3b, 0x0e, 0x7a, 0xc7, 0x68, 0xdd, 0x35, 0x17, 0x7f, 0xf3, 0x19, 0x0c, 0xe3, 0x53, + 0xb4, 0xe5, 0x9a, 0xcb, 0x7f, 0x72, 0xc8, 0x61, 0xe0, 0xa3, 0xe9, 0xd6, 0x5c, 0xfe, 0x93, 0x43, + 0xbc, 0xec, 0x19, 0x1a, 0x6a, 0xcd, 0xe5, 0x3f, 0xb9, 0xd7, 0x7f, 0x12, 0x87, 0x83, 0x3e, 0x6d, + 0x35, 0x10, 0x28, 0xbf, 0xc8, 0x15, 0x68, 0x24, 0x69, 0xd0, 0xa5, 0x1d, 0x8f, 0x1d, 0xa3, 0x31, + 0xd5, 0xdc, 0x19, 0x04, 0x6c, 0xb3, 0x63, 0x67, 0x19, 0x96, 0xf4, 0x44, 0xeb, 0xdd, 0xf3, 0x13, + 0x98, 0x96, 0x90, 0x91, 0x93, 0xfe, 0x26, 0x4c, 0x33, 0x81, 0xd6, 0xaa, 0xe3, 0x2a, 0xd0, 0x86, + 0x65, 0x6b, 0xda, 0x55, 0x68, 0xce, 0x0f, 0x80, 0x98, 0xdc, 0xe4, 0x44, 0xdc, 0xce, 0xe9, 0x88, + 0xed, 0x78, 0xd1, 0xa6, 0x93, 0xe5, 0x04, 0xbe, 0xc0, 0xc3, 0xe8, 0x49, 0xea, 0xf3, 0x8d, 0x24, + 0x7e, 0xf6, 0xad, 0x9a, 0xe6, 0x8f, 0x60, 0x5e, 0x33, 0x7e, 0xc4, 0x68, 0x9f, 0x2b, 0xdc, 0xeb, + 0xc7, 0x83, 0x88, 0x21, 0xcf, 0x9a, 0x2b, 0xbf, 0xb8, 0x05, 0xa2, 0x7e, 0x91, 0x65, 0xcd, 0x15, + 0x1f, 0x64, 0x01, 0xea, 0x81, 0x2f, 0x83, 0xa7, 0x7a, 0xe0, 0x3b, 0xff, 0x57, 0x83, 0x25, 0x63, + 0x20, 0x17, 0x36, 0xca, 0x92, 0xc5, 0xd5, 0x2b, 0x2c, 0xee, 0x36, 0x4c, 0x1e, 0x06, 0x3e, 0x8f, + 0xd9, 0xb8, 0x5e, 0x57, 0x15, 0x39, 0x6b, 0x1c, 0x2e, 0xa2, 0x70, 0x54, 0x2f, 0x7b, 0x96, 0xb5, + 0x26, 0x47, 0xa2, 0x72, 0x94, 0xd2, 0x7a, 0xb8, 0x54, 0x5e, 0x0f, 0xb6, 0x2e, 0xa7, 0x8a, 0xba, + 0x14, 0xde, 0xaa, 0xa6, 0xad, 0x2d, 0xaf, 0x0b, 0x90, 0x03, 0x47, 0x4e, 0xeb, 0xaf, 0x01, 0xc4, + 0x1a, 0x53, 0xda, 0xdf, 0xe5, 0x92, 0xd0, 0xda, 0x04, 0x0d, 0x64, 0xe7, 0x43, 0x74, 0x35, 0x4c, + 0xe6, 0x52, 0xf9, 0x77, 0x2d, 0x9a, 0xc2, 0x16, 0x49, 0x89, 0x66, 0x66, 0x11, 0x7b, 0x1b, 0x89, + 0x6d, 0x77, 0xbb, 0x7c, 0xea, 0x8d, 0xc0, 0x7c, 0xe4, 0x19, 0xfe, 0x14, 0xa6, 0x65, 0x0f, 0x69, + 0x16, 0x02, 0xa1, 0x1e, 0xf8, 0xe4, 0x5d, 0x00, 0xe3, 0x1c, 0x12, 0xe3, 0xba, 0xa2, 0x64, 0x90, + 0x9d, 0x94, 0x35, 0x20, 0x3b, 0x03, 0xdd, 0x39, 0x82, 0xe5, 0x0a, 0x14, 0x2e, 0x8a, 0x0e, 0xab, + 0xa5, 0x28, 0xea, 0x9b, 0x6c, 0xc2, 0x2c, 0x8b, 0x99, 0x17, 0x76, 0xf2, 0x13, 0xa2, 0xe6, 0x02, + 0x82, 0x9e, 0x72, 0x08, 0x6e, 0x50, 0x71, 0x28, 0x2c, 0x97, 0x6f, 0x50, 0x71, 0xe8, 0x3b, 0x1e, + 0x3a, 0x5e, 0xd6, 0xa0, 0xa5, 0x0a, 0x47, 0x4d, 0xd9, 0x6b, 0x30, 0xe3, 0x89, 0x2e, 0x6a, 0x60, + 0x8b, 0x85, 0x81, 0xb9, 0x1a, 0xc1, 0x21, 0x78, 0x02, 0xed, 0xc4, 0xd1, 0x51, 0xd0, 0x53, 0xd6, + 0xf1, 0x0a, 0x6e, 0x56, 0x0a, 0x96, 0xfb, 0x24, 0xbe, 0xc7, 0x3c, 0xe4, 0x36, 0xe7, 0xe2, 0x6f, + 0xe7, 0x0f, 0x6a, 0xd0, 0xdc, 0x8b, 0x53, 0x76, 0x14, 0x87, 0x41, 0x2c, 0xdd, 0x7b, 0xee, 0x8e, + 0x28, 0xf7, 0x5f, 0xfa, 0x91, 0xf2, 0x93, 0xef, 0x90, 0xdd, 0x38, 0x88, 0x84, 0xad, 0xd6, 0xa5, + 0x82, 0xe2, 0x20, 0xe2, 0xa6, 0x4a, 0xae, 0xc3, 0xac, 0x4f, 0xb3, 0x6e, 0x1a, 0x24, 0x3c, 0x9c, + 0x93, 0xdb, 0x82, 0x09, 0xe2, 0x84, 0x0f, 0xbd, 0xd0, 0x8b, 0xba, 0x54, 0xee, 0xec, 0xea, 0xd3, + 0x59, 0xc5, 0xed, 0x4a, 0x4b, 0x62, 0x44, 0xd6, 0x36, 0x58, 0x0e, 0xe5, 0x57, 0xa1, 0x91, 0x28, + 0xa0, 0x34, 0xbf, 0x96, 0x3e, 0xab, 0x0b, 0xc3, 0x71, 0x73, 0x54, 0x67, 0x83, 0xfb, 0xfe, 0x39, + 0xbd, 0xfd, 0x41, 0xbf, 0xef, 0xa5, 0x67, 0x8a, 0x5b, 0x04, 0x93, 0x3b, 0x71, 0x10, 0x71, 0x45, + 0xf1, 0x41, 0x29, 0xe7, 0x8d, 0xff, 0x36, 0x45, 0xaf, 0x5b, 0xa2, 0x9b, 0xda, 0x9a, 0xb0, 0xb5, + 0x75, 0x0d, 0x20, 0xa1, 0x69, 0x97, 0x46, 0xcc, 0xeb, 0xa9, 0x11, 0x1b, 0x10, 0xe7, 0x18, 0xc8, + 0x93, 0xa3, 0xa3, 0x30, 0x88, 0x28, 0x67, 0x2b, 0x85, 0x19, 0xa1, 0xfd, 0xe1, 0x32, 0xd8, 0x9c, + 0x26, 0x4a, 0x9c, 0x7e, 0x04, 0x4b, 0x4f, 0xa2, 0x0a, 0x46, 0x8a, 0x5c, 0x6d, 0x14, 0xb9, 0x7a, + 0x89, 0xdc, 0x07, 0x30, 0x67, 0x08, 0x9e, 0x91, 0x77, 0xa0, 0x21, 0x65, 0xd4, 0x81, 0x42, 0x5b, + 0xef, 0x06, 0xa5, 0x11, 0xba, 0x39, 0xb2, 0xf3, 0xe7, 0x35, 0x98, 0xcd, 0x25, 0xcb, 0xc8, 0x3d, + 0xb8, 0xc4, 0xd5, 0xad, 0xa8, 0x5c, 0xd3, 0x54, 0x72, 0x9c, 0x2d, 0xfc, 0x57, 0xf8, 0x85, 0x02, + 0xb9, 0xbd, 0x0f, 0x90, 0x03, 0x2b, 0xdc, 0xba, 0x3b, 0xb6, 0x5b, 0x77, 0xb9, 0x4c, 0x55, 0x89, + 0x66, 0x78, 0x76, 0xff, 0x32, 0xc9, 0xc3, 0xbd, 0x0a, 0x63, 0x91, 0x36, 0xf8, 0x06, 0xcc, 0x8a, + 0xb5, 0xc0, 0x77, 0x00, 0x25, 0xf0, 0x5c, 0x7e, 0xb5, 0x11, 0x44, 0x2e, 0xe0, 0xda, 0xc0, 0x76, + 0xf2, 0x16, 0xcc, 0xa3, 0xb0, 0x9d, 0x58, 0x28, 0x44, 0x2e, 0x6c, 0xbb, 0xc3, 0x1c, 0xa2, 0x48, + 0x95, 0x91, 0x04, 0x56, 0xad, 0x2e, 0x9d, 0x4c, 0x88, 0x20, 0x0f, 0xa9, 0xf7, 0x0c, 0x57, 0x7a, + 0x98, 0x94, 0x42, 0x59, 0x92, 0xa0, 0x6c, 0x13, 0xaa, 0x5b, 0xee, 0x96, 0x5b, 0xc8, 0x1d, 0x98, + 0x93, 0x1c, 0x51, 0x33, 0xf2, 0x88, 0xb3, 0x65, 0x9c, 0x15, 0x1d, 0x11, 0x81, 0xf4, 0x61, 0xc5, + 0xec, 0xa0, 0x25, 0xbc, 0x84, 0x1d, 0xdf, 0x1d, 0x5f, 0xc2, 0xa8, 0x24, 0x20, 0xe9, 0x96, 0x1a, + 0xda, 0xbf, 0x09, 0xad, 0x61, 0x03, 0xaa, 0x98, 0xf6, 0x57, 0xed, 0x69, 0x5f, 0xa9, 0x30, 0xc9, + 0xcc, 0xbc, 0x40, 0xfc, 0x14, 0xd6, 0x87, 0x08, 0x73, 0x81, 0x5b, 0x07, 0xc3, 0x52, 0x4d, 0x6b, + 0xfa, 0xd3, 0x1a, 0xb4, 0xb7, 0x7d, 0xbf, 0xb4, 0x39, 0xe5, 0x97, 0x04, 0xdf, 0xf6, 0x96, 0x7b, + 0x15, 0xae, 0x54, 0x0a, 0x24, 0x6f, 0x33, 0x9e, 0xc3, 0x55, 0x97, 0xf6, 0xe3, 0x13, 0xfa, 0x6d, + 0x8b, 0xec, 0x5c, 0x87, 0x6b, 0xc3, 0x38, 0x4b, 0xd9, 0xf0, 0x7a, 0xcf, 0xbe, 0x1e, 0xd7, 0x8e, + 0xd1, 0x7f, 0xd6, 0x60, 0xde, 0xbe, 0x38, 0x7f, 0x51, 0xb1, 0xf8, 0xeb, 0x40, 0x52, 0x9a, 0xb1, + 0x4e, 0x12, 0x87, 0x21, 0x0f, 0xc9, 0x7d, 0x1a, 0x7a, 0x67, 0xf2, 0xca, 0xbe, 0xc9, 0x5b, 0xf6, + 0x44, 0xc3, 0x03, 0x0e, 0x27, 0xeb, 0x30, 0xed, 0x25, 0x41, 0x87, 0x5b, 0x8d, 0x88, 0xc7, 0xa7, + 0xbc, 0x24, 0xf8, 0x90, 0x9e, 0x11, 0x07, 0xe6, 0x65, 0x43, 0x27, 0xa4, 0x27, 0x34, 0x44, 0x9f, + 0x6f, 0xc2, 0x9d, 0x15, 0xcd, 0x8f, 0x39, 0x88, 0xdc, 0x86, 0x66, 0x92, 0x06, 0xdc, 0xfc, 0xf2, + 0xdc, 0xc0, 0x34, 0x4a, 0xb3, 0x28, 0xe1, 0x6a, 0x74, 0xce, 0x4f, 0xe0, 0x72, 0x85, 0x2e, 0xe4, + 0x1e, 0xf5, 0x7d, 0x58, 0xb4, 0x33, 0x0c, 0x6a, 0x9f, 0xd2, 0x5e, 0xab, 0xd5, 0xd1, 0x5d, 0x38, + 0xb2, 0xe8, 0x48, 0xef, 0x13, 0x71, 0x5c, 0x8f, 0xe9, 0x3b, 0x2d, 0xe7, 0x73, 0x58, 0xc9, 0x81, + 0x3b, 0x71, 0x74, 0x42, 0xd3, 0x8c, 0x5b, 0x1b, 0x81, 0xc9, 0xa3, 0x34, 0x56, 0x17, 0xb2, 0xf8, + 0x9b, 0xfb, 0x6d, 0x2c, 0x96, 0x66, 0x50, 0x67, 0x31, 0xc7, 0x49, 0x3d, 0xa6, 0x4e, 0x29, 0xfc, + 0xcd, 0xfd, 0xe4, 0x00, 0x89, 0xd0, 0x0e, 0xb6, 0x09, 0x53, 0x9d, 0x95, 0x30, 0xce, 0xc5, 0x79, + 0x8a, 0xee, 0xa3, 0x29, 0x8a, 0x1c, 0xe3, 0xaf, 0xc3, 0xac, 0x18, 0x23, 0xef, 0xa9, 0xc6, 0xb7, + 0x61, 0x8d, 0xaf, 0x20, 0xa6, 0x0b, 0x47, 0x1a, 0xea, 0xfc, 0x77, 0x1d, 0xe6, 0xd0, 0x63, 0x7d, + 0x40, 0x99, 0x17, 0x84, 0xa3, 0x7d, 0x69, 0xe1, 0x83, 0xd6, 0xb5, 0x0f, 0xfa, 0x12, 0xcc, 0x9b, + 0x17, 0x22, 0x67, 0x2a, 0x98, 0x35, 0xae, 0x43, 0xce, 0xc8, 0xcb, 0xb0, 0x80, 0xa1, 0x75, 0x8e, + 0x25, 0x6c, 0x66, 0x1e, 0xa1, 0x1a, 0xcd, 0x0e, 0x04, 0x2e, 0x15, 0x02, 0x01, 0xde, 0x8c, 0xce, + 0x74, 0x27, 0x0b, 0x7c, 0x1d, 0x27, 0x20, 0x64, 0x3f, 0xf0, 0x8d, 0x66, 0xec, 0x3d, 0x6d, 0x34, + 0x63, 0x6f, 0x1e, 0x03, 0xa5, 0x54, 0x24, 0x0a, 0x30, 0xdf, 0x35, 0x83, 0x46, 0x37, 0xa7, 0x80, + 0x07, 0x41, 0x1f, 0xb3, 0x61, 0xf2, 0x72, 0xbb, 0x21, 0x2c, 0x56, 0x7c, 0xe5, 0x61, 0x1a, 0x98, + 0x61, 0x5a, 0x1e, 0xd4, 0xcd, 0x5a, 0x41, 0xdd, 0x26, 0xcc, 0xc6, 0x09, 0x8d, 0x3a, 0x32, 0xc4, + 0x9e, 0x13, 0xde, 0x03, 0x07, 0x3d, 0x45, 0x88, 0xbc, 0x32, 0x41, 0x9d, 0x67, 0xe3, 0xc4, 0xa5, + 0xb6, 0x62, 0xea, 0x45, 0xc5, 0xa8, 0x40, 0x70, 0xe2, 0xbc, 0x40, 0xd0, 0xd9, 0x46, 0xaf, 0x58, + 0x31, 0x96, 0xe6, 0xf3, 0x3a, 0x4c, 0xa1, 0x9a, 0x94, 0xe5, 0xac, 0x58, 0x61, 0x8c, 0x34, 0x0a, + 0x57, 0xe2, 0x38, 0x1f, 0x60, 0x0e, 0x11, 0x9b, 0xc6, 0x11, 0xfd, 0x32, 0xcc, 0x88, 0x59, 0xd1, + 0x56, 0x33, 0x8d, 0xdf, 0x8f, 0x7c, 0xe7, 0xdf, 0x6a, 0x40, 0xf6, 0x07, 0x87, 0xfd, 0x60, 0x7c, + 0x6a, 0xe3, 0x07, 0xe8, 0x04, 0x26, 0xd1, 0x4c, 0x84, 0x39, 0xe2, 0xef, 0x82, 0x85, 0x4c, 0x16, + 0x2d, 0x24, 0x9f, 0xce, 0x4b, 0xd5, 0x31, 0xfa, 0x94, 0x39, 0xf9, 0x7c, 0x8b, 0x0f, 0x03, 0x1a, + 0xb1, 0x8e, 0xbc, 0x6c, 0xe1, 0x5b, 0x3c, 0x02, 0x1e, 0xf9, 0xce, 0x3e, 0x2c, 0x5b, 0x23, 0x93, + 0x9a, 0xbe, 0x01, 0x73, 0x42, 0x80, 0x24, 0xf4, 0xba, 0xfa, 0x36, 0x7c, 0x16, 0x61, 0x7b, 0x08, + 0x1a, 0xa5, 0xaf, 0x3f, 0xaa, 0xc1, 0xca, 0x7e, 0xd0, 0x1f, 0x84, 0x1e, 0xa3, 0xbf, 0x00, 0x8d, + 0xe5, 0xc3, 0x9f, 0xb0, 0x86, 0xaf, 0x34, 0x39, 0x99, 0x6b, 0xd2, 0xf9, 0x9f, 0x1a, 0xac, 0x16, + 0x44, 0xd1, 0x3e, 0xa1, 0x6d, 0x4c, 0x43, 0x2e, 0x07, 0x24, 0x92, 0xc1, 0xb4, 0x6e, 0x31, 0x7d, + 0x09, 0xe6, 0xfb, 0x41, 0x14, 0xf4, 0x07, 0xfd, 0x8e, 0xd0, 0xbd, 0x90, 0x69, 0x4e, 0x02, 0xf7, + 0x70, 0x0a, 0x38, 0x92, 0xf7, 0xdc, 0x40, 0x9a, 0x94, 0x48, 0x02, 0x28, 0x90, 0xde, 0x84, 0x95, + 0xdc, 0x6f, 0xef, 0xf4, 0xbc, 0x20, 0xea, 0x84, 0x71, 0x96, 0xc9, 0x39, 0x26, 0x79, 0xdb, 0xae, + 0x17, 0x44, 0x8f, 0xe3, 0x2c, 0x33, 0x36, 0x81, 0x29, 0x73, 0x13, 0xe0, 0x0e, 0x4c, 0xf3, 0x93, + 0x63, 0x2f, 0xa4, 0xf7, 0xe3, 0xfe, 0xe1, 0x8b, 0xd5, 0xfd, 0x0d, 0x98, 0x13, 0xf7, 0x6e, 0xcc, + 0x4b, 0x7b, 0x54, 0xcd, 0xc0, 0x2c, 0xc2, 0x0e, 0x10, 0x54, 0x39, 0x0d, 0xff, 0x55, 0x03, 0xb2, + 0xc3, 0x5d, 0x99, 0x70, 0x6c, 0x7b, 0xe0, 0x5b, 0x89, 0x88, 0x9b, 0x73, 0x0b, 0x6b, 0x48, 0xc8, + 0x23, 0xdb, 0xfc, 0x26, 0x2c, 0xf3, 0xd3, 0xa3, 0x99, 0xbc, 0xe0, 0xe5, 0x58, 0x69, 0x1f, 0x7f, + 0x19, 0x16, 0x4e, 0xbd, 0x30, 0xa4, 0x4c, 0xa7, 0xd8, 0xe4, 0x4d, 0xbc, 0x80, 0xaa, 0x18, 0x5c, + 0x0d, 0x78, 0xda, 0x18, 0xf0, 0x2a, 0x2c, 0x5b, 0xe3, 0x95, 0xde, 0xd0, 0x3d, 0x58, 0x13, 0xe0, + 0xed, 0x30, 0x1c, 0x7b, 0x57, 0x75, 0xfe, 0xb2, 0x0e, 0xeb, 0xa5, 0x6e, 0xda, 0x6d, 0xb0, 0xcd, + 0xf8, 0xa6, 0x1e, 0x6e, 0x75, 0x87, 0x2d, 0xf9, 0x29, 0x7b, 0xb5, 0xff, 0xa9, 0x06, 0x53, 0x02, + 0x34, 0x72, 0x36, 0x3e, 0x55, 0x1b, 0x82, 0x34, 0x38, 0x11, 0x11, 0x7d, 0x77, 0x3c, 0x66, 0xe2, + 0x3f, 0x33, 0xad, 0x2a, 0x76, 0x12, 0x99, 0x51, 0xfd, 0x3e, 0x34, 0x8b, 0x08, 0x17, 0x4a, 0x39, + 0x89, 0x5b, 0x95, 0x87, 0x27, 0xd4, 0x48, 0xa3, 0xfe, 0xbc, 0x06, 0x8b, 0x3b, 0x71, 0xe4, 0x07, + 0xfc, 0xc4, 0xdc, 0xf3, 0x52, 0xaf, 0x9f, 0xc9, 0x4c, 0xbe, 0x00, 0xa9, 0x6b, 0x77, 0x0d, 0x18, + 0x72, 0xc1, 0x79, 0x15, 0xa0, 0x7b, 0x4c, 0xbb, 0xcf, 0x3a, 0xf2, 0xc6, 0x51, 0xa4, 0xff, 0x39, + 0xe4, 0x7e, 0xe0, 0x67, 0xe4, 0x0d, 0x58, 0xce, 0x9b, 0x3b, 0x5e, 0xe4, 0x77, 0xe4, 0x75, 0x23, + 0x66, 0x37, 0x34, 0xde, 0x76, 0xe4, 0x6f, 0x67, 0xcf, 0x32, 0xee, 0x2b, 0xea, 0x5b, 0xb6, 0x8e, + 0xb5, 0x85, 0x2f, 0x6a, 0xf8, 0x36, 0x82, 0x9d, 0xff, 0xad, 0xe1, 0x09, 0xa8, 0x46, 0x25, 0x67, + 0x3b, 0xbf, 0x58, 0xc3, 0xfb, 0x56, 0x6b, 0xca, 0xea, 0x85, 0x29, 0x23, 0x30, 0x19, 0x30, 0xda, + 0x57, 0x07, 0x0b, 0xff, 0x4d, 0xee, 0x43, 0x53, 0x8f, 0xb8, 0x93, 0xa0, 0x5a, 0xe4, 0x32, 0x59, + 0xcf, 0x03, 0x47, 0x4b, 0x6b, 0xee, 0x62, 0xb7, 0xa0, 0x46, 0xb5, 0xbc, 0x2e, 0x8d, 0xb5, 0x51, + 0x77, 0x51, 0xdb, 0x72, 0x7f, 0x12, 0x5f, 0x42, 0x6a, 0xda, 0x1d, 0x30, 0xea, 0x4b, 0x57, 0x59, + 0x7f, 0x3b, 0xff, 0x51, 0x83, 0xc5, 0x6d, 0xdf, 0xc7, 0x71, 0x8f, 0xb3, 0x4d, 0xa8, 0x51, 0xd6, + 0xcf, 0x19, 0xe5, 0xc4, 0xd7, 0x1c, 0xe5, 0x37, 0xde, 0x44, 0x86, 0x28, 0xc1, 0x71, 0xa0, 0x99, + 0x8f, 0xb3, 0x7a, 0x7a, 0x9d, 0xef, 0x00, 0x11, 0xe1, 0x95, 0xa5, 0x8e, 0x22, 0xd6, 0x2a, 0x2c, + 0x5b, 0x58, 0x72, 0xaf, 0x79, 0x1f, 0x6e, 0xed, 0x52, 0xb6, 0x93, 0x9e, 0x25, 0x2c, 0x56, 0xee, + 0xec, 0x03, 0x9a, 0xc4, 0x59, 0xa0, 0x76, 0x2e, 0x3a, 0xd6, 0xee, 0xf3, 0xcf, 0x35, 0xb8, 0x3d, + 0x06, 0x21, 0x39, 0x84, 0xcf, 0xca, 0xf7, 0x4b, 0xbf, 0x61, 0x96, 0xb7, 0x8c, 0x45, 0x65, 0x4b, + 0x43, 0x64, 0x95, 0x81, 0x26, 0xd9, 0x7e, 0x0f, 0x16, 0xec, 0xc6, 0x0b, 0x6d, 0x15, 0x21, 0xdc, + 0x3c, 0x47, 0x88, 0x71, 0x6c, 0xee, 0x26, 0x2c, 0x74, 0x2d, 0x12, 0x92, 0x51, 0x01, 0xea, 0xec, + 0xc0, 0x2b, 0xe7, 0x72, 0x93, 0x6a, 0x1b, 0x1a, 0xa1, 0x3b, 0x7f, 0x37, 0x09, 0xeb, 0x9f, 0x04, + 0xec, 0xd8, 0x4f, 0xbd, 0x53, 0x65, 0x7d, 0xe3, 0x08, 0x59, 0x08, 0xde, 0xeb, 0xe5, 0xfb, 0x86, + 0x57, 0x61, 0x29, 0x8e, 0x28, 0xc6, 0x18, 0x9d, 0xc4, 0xcb, 0xb2, 0xd3, 0x38, 0x55, 0x67, 0xe9, + 0x62, 0x1c, 0x51, 0x1e, 0x67, 0xec, 0x49, 0x70, 0xe1, 0x34, 0x9e, 0x2c, 0x9e, 0xc6, 0x4d, 0x98, + 0x48, 0x82, 0x48, 0xe6, 0x4c, 0xf8, 0x4f, 0x7e, 0x76, 0xb2, 0xd4, 0xf3, 0x0d, 0xca, 0xf2, 0xec, + 0x44, 0xa8, 0xa6, 0x6b, 0xde, 0xe2, 0x4f, 0x17, 0x6e, 0xf1, 0x0d, 0x9d, 0xcc, 0xd8, 0xb7, 0x16, + 0x9b, 0x30, 0x2b, 0x7f, 0x76, 0x98, 0xd7, 0x93, 0x21, 0x10, 0x48, 0xd0, 0x81, 0xd7, 0x33, 0xbc, + 0x35, 0xb0, 0xbc, 0xb5, 0xab, 0x00, 0x47, 0x94, 0x76, 0xac, 0x60, 0xa8, 0x71, 0x44, 0xa9, 0xd8, + 0x74, 0xb9, 0xab, 0x7c, 0xe8, 0x45, 0xcf, 0x3a, 0x78, 0x07, 0x31, 0x27, 0xc4, 0xe1, 0x80, 0x8f, + 0xbc, 0x3e, 0xfa, 0xc4, 0xd8, 0xa8, 0x64, 0x9a, 0x17, 0x1a, 0xe5, 0xb0, 0xed, 0xfc, 0x36, 0x05, + 0x51, 0xba, 0x01, 0x3b, 0x6b, 0x2d, 0xe4, 0xfd, 0x77, 0x02, 0x76, 0xa6, 0xfb, 0xa3, 0xce, 0xd2, + 0xb3, 0xd6, 0x62, 0xde, 0x7f, 0x47, 0x80, 0xb8, 0x78, 0xd9, 0x69, 0x70, 0x44, 0x45, 0x61, 0x48, + 0x53, 0x96, 0x4a, 0x71, 0xc8, 0x4e, 0xec, 0xa3, 0x1b, 0x79, 0x1a, 0xa4, 0x46, 0x70, 0xba, 0x24, + 0x42, 0x58, 0x0e, 0x54, 0xa6, 0xe1, 0xbc, 0x0a, 0x4d, 0x65, 0x2e, 0x66, 0xed, 0x64, 0x4a, 0xb3, + 0x41, 0xc8, 0x54, 0xed, 0xa4, 0xf8, 0x72, 0xde, 0xc2, 0xaa, 0x88, 0xc7, 0x71, 0xaf, 0x97, 0x87, + 0x4f, 0xd2, 0xb4, 0xd6, 0x60, 0x2a, 0x44, 0xb8, 0xea, 0x22, 0xbe, 0x9c, 0x08, 0xef, 0x73, 0x0a, + 0x5d, 0xf2, 0xac, 0x45, 0x10, 0x1d, 0xc5, 0x32, 0x5a, 0xc0, 0xdf, 0x7c, 0x2d, 0xfa, 0xf4, 0x70, + 0xd0, 0x53, 0x35, 0x50, 0xf8, 0xc1, 0x31, 0x4f, 0xbd, 0x34, 0x92, 0x07, 0x2a, 0xfe, 0xe6, 0x98, + 0x34, 0x4d, 0xe3, 0x54, 0x9e, 0x9e, 0xe2, 0xc3, 0xd9, 0x85, 0xf5, 0xfd, 0x8b, 0x89, 0xc8, 0x09, + 0x89, 0xdb, 0x1a, 0xb9, 0xfc, 0xf1, 0xc3, 0xf9, 0xd0, 0xaa, 0x00, 0xc1, 0x2a, 0x81, 0x71, 0x96, + 0xd1, 0x0a, 0x5c, 0xc2, 0xbd, 0x5c, 0x11, 0xc3, 0x0f, 0x1e, 0x11, 0xb6, 0xca, 0xd4, 0x74, 0x0d, + 0x5a, 0xb9, 0xa2, 0x42, 0xec, 0x84, 0xbf, 0x52, 0x51, 0x51, 0x61, 0xf5, 0x1d, 0xaf, 0xa4, 0xe2, + 0x17, 0x5a, 0x25, 0xf1, 0x05, 0x2c, 0x9b, 0xa2, 0x7d, 0xab, 0x51, 0xff, 0xcf, 0x6a, 0x78, 0x43, + 0xa6, 0x23, 0xb0, 0x7d, 0x96, 0x52, 0xaf, 0xff, 0xad, 0x26, 0xc4, 0x7f, 0x00, 0x37, 0xcc, 0x7a, + 0xa9, 0x0b, 0x4b, 0xe2, 0xfc, 0x2e, 0xa6, 0x11, 0x45, 0x92, 0xff, 0x97, 0x20, 0xff, 0x7b, 0x70, + 0xcd, 0x90, 0xff, 0x82, 0x62, 0x38, 0x7f, 0x51, 0xc3, 0x5b, 0xc4, 0xed, 0x81, 0x1f, 0x30, 0xcb, + 0xe7, 0xe0, 0x3b, 0x13, 0xf3, 0x52, 0xd6, 0xf1, 0x3d, 0x46, 0x75, 0x11, 0x27, 0x87, 0x3c, 0xf0, + 0x18, 0x5e, 0x9e, 0xd0, 0xc8, 0x17, 0x8d, 0xf2, 0x32, 0x80, 0x46, 0xbe, 0x6a, 0x12, 0x91, 0xc3, + 0xe1, 0x99, 0x15, 0xa8, 0xdd, 0xc7, 0x73, 0x1a, 0x8b, 0x5e, 0x70, 0xc5, 0x5f, 0x72, 0xc5, 0x07, + 0x5f, 0xd6, 0xf1, 0xd1, 0x11, 0x5f, 0x72, 0x97, 0x10, 0x2c, 0xbf, 0x9c, 0x1d, 0x91, 0x94, 0x36, + 0x44, 0x93, 0xeb, 0xed, 0x55, 0x98, 0xa2, 0xe8, 0x26, 0x17, 0xb3, 0xdb, 0x06, 0xae, 0xc4, 0x70, + 0xfe, 0x4a, 0x58, 0xd8, 0x07, 0x41, 0xc6, 0xe2, 0x34, 0xe8, 0xee, 0x78, 0x91, 0x1f, 0x8e, 0xe5, + 0x06, 0x5d, 0x60, 0x86, 0x36, 0xa0, 0x91, 0x62, 0xfd, 0x5f, 0xf0, 0x05, 0x95, 0xb5, 0x11, 0x39, + 0x80, 0x9f, 0xcb, 0xbd, 0xd4, 0x8b, 0x06, 0xa1, 0x97, 0xf2, 0x53, 0x62, 0x52, 0xdc, 0x28, 0x1b, + 0x20, 0xe7, 0x01, 0x66, 0x3e, 0x4b, 0x22, 0xca, 0xd1, 0xde, 0x84, 0xa9, 0x2e, 0x82, 0xe4, 0x68, + 0x17, 0x8c, 0x18, 0xcc, 0x0f, 0xa9, 0x2b, 0x5b, 0x9d, 0xdf, 0xaf, 0xc1, 0x94, 0x00, 0xf1, 0xdd, + 0x56, 0x17, 0xce, 0x4f, 0xb8, 0xf8, 0x5b, 0x95, 0xe3, 0xd4, 0xf3, 0x72, 0x1c, 0x55, 0xb4, 0x33, + 0x61, 0x14, 0xed, 0x10, 0x98, 0x8c, 0x13, 0x1a, 0xa9, 0xe2, 0x1e, 0xfe, 0x9b, 0xcf, 0x5a, 0x37, + 0x8c, 0x33, 0x2a, 0x23, 0x17, 0xf1, 0x61, 0x14, 0xea, 0x4c, 0x99, 0x85, 0x3a, 0xce, 0x73, 0x80, + 0x7c, 0x1a, 0x50, 0x12, 0x6e, 0xb6, 0xf2, 0xd2, 0x99, 0xff, 0x26, 0xd7, 0x00, 0x02, 0x9f, 0x46, + 0x2c, 0x38, 0x0a, 0xa8, 0x2a, 0xf8, 0x30, 0x20, 0xdc, 0x0d, 0xe8, 0xd3, 0x2c, 0x53, 0xd9, 0xd2, + 0x86, 0xab, 0x3e, 0xb9, 0xa2, 0xf9, 0x58, 0x32, 0xe6, 0xf5, 0x13, 0xe5, 0x93, 0x68, 0x80, 0x73, + 0x08, 0x8d, 0xdd, 0x9d, 0x83, 0x7d, 0x74, 0x77, 0x38, 0xe3, 0x8f, 0x3f, 0x7e, 0xf4, 0x40, 0x31, + 0xe6, 0xbf, 0x75, 0xb2, 0xa1, 0x6e, 0x24, 0x1b, 0x08, 0x9f, 0x65, 0x76, 0xac, 0x82, 0x26, 0xfe, + 0x9b, 0x5b, 0x70, 0x44, 0x9f, 0xb3, 0x4e, 0x3a, 0x88, 0x24, 0x97, 0x69, 0xfe, 0xed, 0x0e, 0x22, + 0xe7, 0x01, 0xac, 0x6b, 0x1e, 0x0f, 0x45, 0x08, 0xa3, 0x6c, 0xe9, 0x36, 0x4c, 0x09, 0x57, 0x4b, + 0x96, 0xbd, 0x2c, 0xe9, 0xbd, 0x5f, 0x75, 0x70, 0x25, 0x82, 0xb3, 0x0d, 0x2b, 0x1a, 0xb8, 0xcf, + 0xe2, 0xe4, 0x6b, 0x90, 0xb8, 0x6c, 0x08, 0xc2, 0x49, 0x6c, 0x87, 0xa1, 0x0a, 0x85, 0x5b, 0xb0, + 0x66, 0x34, 0xf1, 0x10, 0x5b, 0xb5, 0x98, 0x9d, 0x1e, 0x07, 0x19, 0x33, 0x3a, 0xfd, 0x4d, 0xcd, + 0xe8, 0xf5, 0x71, 0x12, 0xc6, 0x9e, 0xaf, 0xa4, 0xda, 0x84, 0x59, 0xc1, 0xb4, 0x63, 0xa4, 0x6a, + 0x40, 0x80, 0xd0, 0x51, 0xca, 0x11, 0xb0, 0x86, 0xa1, 0x6e, 0x22, 0x3c, 0xf0, 0x98, 0xa7, 0xab, + 0x1b, 0x26, 0xf2, 0xea, 0x06, 0xbe, 0xf4, 0xbc, 0xb4, 0x7b, 0x1c, 0x9c, 0x50, 0x5f, 0x3a, 0x00, + 0xfa, 0x9b, 0xcf, 0x73, 0x7c, 0x42, 0xd3, 0xd3, 0x34, 0x60, 0xc2, 0xea, 0x66, 0xdc, 0x1c, 0xe0, + 0xec, 0x42, 0x3b, 0xd7, 0x07, 0xf5, 0x7c, 0xf5, 0xeb, 0xc2, 0x3a, 0xbc, 0x0f, 0xab, 0x1a, 0xf8, + 0xe3, 0x01, 0xd5, 0xc5, 0x06, 0x17, 0xa1, 0xf1, 0x43, 0x68, 0x69, 0xe0, 0xf6, 0x80, 0xc5, 0x8f, + 0x0d, 0xc5, 0xad, 0x59, 0x64, 0x1a, 0xaa, 0x8f, 0x71, 0x8d, 0x27, 0x7c, 0x24, 0x75, 0x8d, 0xf7, + 0x99, 0x35, 0xa7, 0x62, 0xe2, 0x72, 0x87, 0x4e, 0xd7, 0xb6, 0x9b, 0xd7, 0xff, 0xaf, 0xc1, 0xb4, + 0x20, 0xaa, 0x6e, 0x68, 0x2a, 0x44, 0x55, 0x18, 0x4e, 0x6c, 0x4c, 0xb1, 0x1c, 0xef, 0x39, 0xe4, + 0x73, 0x45, 0xd4, 0xcf, 0x51, 0x84, 0x35, 0xc7, 0x0d, 0x59, 0xc1, 0xf2, 0xbe, 0xa1, 0x1c, 0x59, + 0x9d, 0x7d, 0x2e, 0x4b, 0x45, 0xa7, 0x9e, 0xd3, 0xb9, 0xfb, 0xd5, 0x3d, 0x58, 0xd8, 0x8d, 0x45, + 0x5c, 0x75, 0xc0, 0xc3, 0x89, 0x94, 0x3c, 0x81, 0x69, 0xf9, 0x8e, 0x85, 0xac, 0x95, 0x1e, 0xb6, + 0xa0, 0xfa, 0xdb, 0xeb, 0x43, 0x1e, 0xbc, 0x38, 0xcb, 0x5f, 0xfe, 0xeb, 0xbf, 0x7f, 0x55, 0x9f, + 0x27, 0xb3, 0x77, 0x4e, 0xde, 0xba, 0xd3, 0xa3, 0x0c, 0xfd, 0xd6, 0x1e, 0xcc, 0x5b, 0x4f, 0x0f, + 0xc8, 0x86, 0xf5, 0x7c, 0xa0, 0xf0, 0x22, 0xa1, 0x7d, 0x75, 0xe4, 0xe3, 0x02, 0xe7, 0x32, 0xb2, + 0x58, 0x26, 0x4b, 0x92, 0x45, 0xfe, 0xaa, 0x80, 0x7c, 0x0e, 0x8b, 0x0f, 0x31, 0x9f, 0xa9, 0x89, + 0x92, 0xcd, 0x9c, 0x58, 0xe5, 0x8b, 0x8a, 0xf6, 0xf5, 0xe1, 0x08, 0x92, 0xe1, 0x15, 0x64, 0xb8, + 0x4a, 0x96, 0x39, 0x43, 0x91, 0x2f, 0xd5, 0x3c, 0x49, 0x06, 0x4d, 0x59, 0xa3, 0xfd, 0x42, 0x79, + 0x6e, 0x20, 0xcf, 0x35, 0xb2, 0xc2, 0x79, 0xfa, 0x82, 0x41, 0xce, 0x34, 0xc6, 0x74, 0x8c, 0xf9, + 0xa6, 0x80, 0x5c, 0x1b, 0xfa, 0xd8, 0x40, 0xb0, 0xdc, 0x3c, 0xe7, 0x31, 0x82, 0x3d, 0xca, 0x1e, + 0xe5, 0xb8, 0xfa, 0x3d, 0x02, 0xf9, 0x4a, 0xf8, 0xe8, 0x95, 0xaf, 0x5f, 0xc8, 0x2b, 0xe7, 0x3f, + 0xb9, 0x11, 0x32, 0xdc, 0x1a, 0xf7, 0x6d, 0x8e, 0xf3, 0x1d, 0x14, 0xe6, 0x1a, 0xd9, 0x90, 0xc2, + 0x58, 0xef, 0x71, 0xd4, 0x8b, 0x1f, 0xd2, 0x85, 0x39, 0xf3, 0x21, 0x01, 0xb9, 0x52, 0x11, 0x12, + 0x68, 0xe6, 0x1b, 0xd5, 0x8d, 0x92, 0x61, 0x0b, 0x19, 0x12, 0xd2, 0x94, 0x0c, 0xf5, 0xbb, 0x03, + 0xf2, 0x05, 0x2c, 0x16, 0x8a, 0xf0, 0x89, 0x53, 0x98, 0xbe, 0x8a, 0x07, 0x15, 0xed, 0x97, 0x46, + 0xe2, 0x48, 0xae, 0xd7, 0x90, 0x6b, 0xcb, 0x59, 0x36, 0x66, 0x59, 0x71, 0xfe, 0x5e, 0xed, 0x55, + 0x92, 0xe1, 0x3c, 0x9b, 0xf5, 0xe2, 0x63, 0xf1, 0xde, 0x3c, 0xa7, 0xd8, 0xbc, 0x34, 0xd7, 0x8a, + 0x27, 0xae, 0xd6, 0x0c, 0x6b, 0x70, 0x8d, 0x57, 0x0e, 0x18, 0x2f, 0x8f, 0xc3, 0xf7, 0x6a, 0xf5, + 0x2b, 0x09, 0xf9, 0x50, 0xc3, 0x69, 0x23, 0xd7, 0x15, 0x42, 0x0a, 0x5c, 0x63, 0x96, 0x90, 0xcc, + 0x7a, 0x44, 0x22, 0x99, 0xda, 0x56, 0x5d, 0xf1, 0x8c, 0xa3, 0x72, 0xa4, 0xe6, 0xbb, 0x8c, 0xa1, + 0x23, 0x8d, 0x59, 0x92, 0x91, 0xe7, 0xb0, 0x20, 0xb6, 0x8b, 0x17, 0x3f, 0xb3, 0x57, 0x91, 0xef, + 0xba, 0x43, 0xf2, 0x3d, 0xc3, 0x9c, 0xd8, 0x4f, 0xa0, 0xa1, 0x03, 0x1b, 0xd2, 0x32, 0x06, 0x61, + 0x55, 0xd4, 0xb7, 0x87, 0xd4, 0x4b, 0x2b, 0x6b, 0x75, 0xe6, 0xe5, 0xa8, 0x44, 0xf5, 0x33, 0x27, + 0xfc, 0x13, 0x80, 0xbc, 0x80, 0x9a, 0x5c, 0x2e, 0x51, 0xd6, 0x9a, 0x6b, 0x57, 0x35, 0xa9, 0xa7, + 0x62, 0x48, 0xbe, 0x49, 0x16, 0x2c, 0xf2, 0x6a, 0xbd, 0xe9, 0x38, 0xce, 0x5a, 0x6f, 0xc5, 0x92, + 0xeb, 0xf6, 0xf0, 0x5a, 0x5b, 0x35, 0x29, 0x8e, 0x5a, 0x6c, 0xfa, 0xbe, 0x9e, 0x8f, 0x40, 0x1c, + 0x16, 0x46, 0x91, 0xef, 0x46, 0x15, 0x97, 0xca, 0xc3, 0xa2, 0x5c, 0xb1, 0x5b, 0x3a, 0x2c, 0xf2, + 0xc2, 0x5c, 0xf2, 0x0c, 0x9f, 0xca, 0x1a, 0x35, 0xaa, 0xc4, 0xa4, 0x55, 0x2e, 0xd8, 0x6d, 0x5f, + 0x1b, 0xd6, 0x9c, 0x55, 0xdb, 0xb7, 0xbc, 0xd2, 0xc3, 0x45, 0x25, 0x26, 0x5c, 0x54, 0xa6, 0x5a, + 0x13, 0x6e, 0x15, 0xb0, 0xb6, 0x2f, 0x57, 0xb4, 0x48, 0xea, 0xab, 0x48, 0x7d, 0x91, 0xcc, 0xeb, + 0x2d, 0x11, 0x69, 0x89, 0x39, 0xd1, 0x25, 0x43, 0xd6, 0x9c, 0x14, 0xeb, 0x4a, 0xad, 0x3d, 0xb0, + 0x54, 0x5d, 0x5a, 0xda, 0x03, 0x75, 0xfd, 0x28, 0xf9, 0x3d, 0xbb, 0x4c, 0x55, 0x95, 0xcd, 0x39, + 0x23, 0xeb, 0xdc, 0x4a, 0xab, 0x65, 0x68, 0x2d, 0x9c, 0xb3, 0x89, 0x9c, 0x2f, 0x93, 0xf5, 0x22, + 0x67, 0x59, 0x57, 0x47, 0xbe, 0xac, 0xc1, 0x72, 0x45, 0xd5, 0x56, 0x2e, 0xc1, 0xf0, 0x1a, 0xb3, + 0x5c, 0x82, 0x51, 0x65, 0x5f, 0x0e, 0x4a, 0xb0, 0xe1, 0xa0, 0x04, 0x9e, 0xef, 0x6b, 0x09, 0xe4, + 0x0d, 0x25, 0xb7, 0xcc, 0x3f, 0xa9, 0xc1, 0x5a, 0x75, 0x85, 0x16, 0x79, 0x59, 0x3f, 0xbe, 0x1b, + 0x55, 0x3b, 0xd6, 0xbe, 0x79, 0x1e, 0x9a, 0x94, 0xe6, 0x65, 0x94, 0x66, 0xd3, 0x69, 0x73, 0x69, + 0x52, 0xc4, 0xad, 0x12, 0xe8, 0x14, 0xd3, 0x5a, 0x76, 0x0d, 0x14, 0x31, 0x7c, 0x8b, 0xea, 0x52, + 0xb1, 0xf6, 0x8d, 0x11, 0x18, 0xf6, 0xf6, 0x45, 0x56, 0xe5, 0x84, 0x60, 0xe1, 0x90, 0x2e, 0xa6, + 0x92, 0x6b, 0x34, 0xaf, 0x31, 0xb2, 0xd6, 0x68, 0xa9, 0x6c, 0xca, 0x5a, 0xa3, 0xe5, 0x4a, 0xa6, + 0xd2, 0x1a, 0x45, 0x66, 0x58, 0xd5, 0x44, 0x3e, 0xc5, 0x65, 0x23, 0x73, 0xaa, 0xad, 0xe2, 0x52, + 0xcf, 0xaa, 0x96, 0x8d, 0x9d, 0x35, 0x2d, 0x6d, 0x95, 0x22, 0x55, 0xcb, 0xb5, 0xe7, 0xc2, 0x8c, + 0x42, 0x27, 0xeb, 0x45, 0x02, 0x8a, 0x72, 0x65, 0x59, 0x8c, 0xb3, 0x8e, 0x44, 0x97, 0x9c, 0x39, + 0x93, 0x28, 0xa7, 0x79, 0x08, 0xb3, 0x46, 0x09, 0x08, 0xd1, 0x9b, 0x6c, 0xb9, 0xe2, 0xa5, 0x7d, + 0xa5, 0xb2, 0xcd, 0xde, 0x4a, 0x9c, 0x45, 0xce, 0x20, 0x43, 0x04, 0xcd, 0xe3, 0xb7, 0x61, 0xde, + 0xaa, 0xc2, 0xc8, 0x95, 0x5f, 0x55, 0x27, 0x92, 0x2b, 0xbf, 0xb2, 0x74, 0x43, 0x39, 0x9a, 0x0e, + 0x2a, 0x3f, 0x93, 0x28, 0x9a, 0xd7, 0x67, 0xd0, 0xd0, 0xc5, 0x0f, 0xb9, 0xfe, 0x8b, 0xf5, 0x10, + 0xe7, 0xf1, 0xb0, 0xe6, 0xe0, 0x94, 0x77, 0x3e, 0x8c, 0xfb, 0x87, 0x52, 0x5f, 0x46, 0x6a, 0x3f, + 0xd7, 0x57, 0xb9, 0xbe, 0x21, 0xd7, 0x57, 0x55, 0x2d, 0x80, 0xa5, 0xaf, 0x2e, 0x22, 0xe8, 0x31, + 0xa4, 0xb0, 0x58, 0x48, 0xa9, 0xe7, 0x6e, 0x45, 0x75, 0x01, 0x41, 0xee, 0x56, 0x0c, 0xc9, 0xc5, + 0xdb, 0x8e, 0x9b, 0xe0, 0xe7, 0x85, 0x61, 0x6e, 0x5b, 0x62, 0xbb, 0x17, 0x09, 0x67, 0xcb, 0x6e, + 0xad, 0xcc, 0xba, 0x65, 0xb7, 0x76, 0x76, 0xba, 0xb4, 0xdd, 0x8b, 0x3b, 0x37, 0xf2, 0x14, 0x66, + 0x54, 0xa6, 0x33, 0x37, 0xda, 0x42, 0x8e, 0xb7, 0xdd, 0x2a, 0x37, 0x48, 0xaa, 0x96, 0xe1, 0x7a, + 0xbe, 0x8f, 0x54, 0xe5, 0x44, 0x18, 0x79, 0xcf, 0x7c, 0x22, 0xca, 0x29, 0xd3, 0x7c, 0x22, 0xaa, + 0x12, 0xa5, 0xd6, 0x44, 0x88, 0x9d, 0x4b, 0xf3, 0xf8, 0xfb, 0x1a, 0xde, 0x07, 0x8f, 0x4e, 0x5b, + 0x92, 0x37, 0x2f, 0x90, 0xe1, 0x14, 0x02, 0xbd, 0x75, 0xe1, 0x9c, 0xa8, 0x73, 0x0b, 0xc5, 0x74, + 0x9c, 0xab, 0xea, 0x30, 0xc5, 0x6e, 0xbe, 0x40, 0xd7, 0x09, 0x52, 0x2e, 0xf4, 0xdf, 0xd6, 0xc4, + 0x1f, 0x42, 0x18, 0x41, 0x97, 0x6c, 0x8d, 0x29, 0x80, 0x12, 0xf8, 0xce, 0xd8, 0xf8, 0x52, 0xdc, + 0x9b, 0x28, 0xee, 0x75, 0xe7, 0xca, 0x08, 0x71, 0xb9, 0xb0, 0xbf, 0x03, 0x57, 0x74, 0x7a, 0xd3, + 0xa2, 0xfb, 0xfe, 0x20, 0xf2, 0xb3, 0x3c, 0x2e, 0x1d, 0x92, 0x03, 0xcd, 0x0d, 0xa7, 0x98, 0xf5, + 0xb2, 0xcf, 0xc7, 0x53, 0xd9, 0x2a, 0xc4, 0x38, 0xe2, 0xb4, 0x39, 0xf7, 0x04, 0x96, 0x54, 0xbf, + 0xf7, 0x03, 0x8f, 0x7d, 0x63, 0x9e, 0xd7, 0x91, 0x67, 0xdb, 0x59, 0x35, 0x79, 0x1e, 0x05, 0x1e, + 0xd3, 0x1c, 0x33, 0xac, 0x56, 0xb1, 0x12, 0x5a, 0x66, 0xf0, 0x5d, 0x99, 0xea, 0x32, 0x83, 0xef, + 0xea, 0xdc, 0x9b, 0x1d, 0x7c, 0xf7, 0x28, 0x13, 0xb9, 0x30, 0x5f, 0x32, 0x38, 0x81, 0xe6, 0xfe, + 0x50, 0xa6, 0xfb, 0x5f, 0x9b, 0xa9, 0xf4, 0x81, 0x1c, 0x64, 0x9a, 0x15, 0x98, 0xf2, 0xc1, 0x9e, + 0x88, 0xd2, 0x1c, 0x33, 0xd5, 0x45, 0x36, 0x87, 0x27, 0xc1, 0xca, 0x7c, 0x2b, 0xb3, 0x64, 0x36, + 0x5f, 0x23, 0x42, 0xc2, 0x07, 0xe0, 0x9c, 0xef, 0x19, 0x10, 0x3b, 0x4a, 0xc2, 0x87, 0x83, 0x7a, + 0x17, 0xa8, 0x48, 0x70, 0x8d, 0x17, 0x22, 0xdd, 0x40, 0xc6, 0x57, 0x9c, 0xb5, 0x72, 0x88, 0xc4, + 0x79, 0x73, 0xd6, 0x3f, 0x85, 0xe5, 0x42, 0xec, 0xfd, 0x82, 0x78, 0x5b, 0xe6, 0x5c, 0x08, 0xbc, + 0x15, 0x73, 0x86, 0x71, 0x70, 0x21, 0x6b, 0x45, 0x6e, 0x54, 0xc5, 0x1b, 0x56, 0x52, 0x68, 0x54, + 0xe4, 0x23, 0xcf, 0x0d, 0xb2, 0x56, 0x0a, 0x47, 0x90, 0xc2, 0x9b, 0x35, 0xf2, 0xc7, 0x35, 0xcc, + 0x58, 0x0c, 0x49, 0x9a, 0x91, 0xdb, 0x55, 0x01, 0xef, 0x85, 0xc5, 0x90, 0xfb, 0x09, 0xb9, 0x56, + 0x8c, 0x8a, 0x4b, 0xe2, 0x1c, 0xe3, 0x0d, 0x84, 0x99, 0xfa, 0xb2, 0x62, 0xf2, 0x8a, 0x9c, 0xd8, + 0xd0, 0xa0, 0xb5, 0x18, 0x8a, 0xcb, 0xa8, 0x52, 0x71, 0xfa, 0x99, 0xfd, 0x17, 0x19, 0x2c, 0x96, + 0x37, 0x2b, 0x46, 0x7d, 0x11, 0xd6, 0x2f, 0x21, 0xeb, 0xab, 0xe4, 0x4a, 0x61, 0xbc, 0x05, 0x11, + 0x84, 0x5b, 0x6b, 0xa4, 0x58, 0x4c, 0xb7, 0xb6, 0x94, 0xc7, 0xb3, 0xdc, 0xda, 0x72, 0x2a, 0xad, + 0xe4, 0xd6, 0x7a, 0x1c, 0x05, 0x0f, 0x43, 0xc2, 0xa0, 0x59, 0x4c, 0x75, 0x18, 0x4b, 0xb9, 0x3a, + 0x09, 0x62, 0x2c, 0xe5, 0x21, 0xf7, 0xbe, 0x05, 0xaf, 0xbd, 0xcb, 0xc4, 0xf5, 0xf1, 0x1d, 0x59, + 0x0f, 0x46, 0x18, 0x2c, 0x16, 0xd2, 0x10, 0xc6, 0x5c, 0x56, 0xe6, 0x27, 0xc6, 0xe0, 0x69, 0x6f, + 0x1f, 0x9a, 0xe7, 0x00, 0xc9, 0xf0, 0x65, 0xf4, 0x1c, 0x96, 0x2b, 0x52, 0x0a, 0x46, 0xec, 0x38, + 0x34, 0xdf, 0xd0, 0x2e, 0x4b, 0x67, 0x5d, 0xad, 0xdb, 0x97, 0x2c, 0x39, 0xef, 0x94, 0x0a, 0xce, + 0x89, 0x31, 0x5e, 0xf9, 0xf7, 0x9b, 0xca, 0x14, 0xad, 0x2c, 0x4e, 0x7b, 0x73, 0x68, 0x7b, 0xe5, + 0xd1, 0xa0, 0x59, 0xca, 0x0b, 0xf6, 0x10, 0x16, 0x6c, 0x51, 0x8d, 0x2b, 0x85, 0xaa, 0x6c, 0xc8, + 0xb9, 0x23, 0xb4, 0xd7, 0x8c, 0x66, 0xf7, 0x39, 0xd2, 0x8e, 0x60, 0xde, 0xca, 0x53, 0x19, 0xe6, + 0x5a, 0x91, 0x01, 0x1b, 0xdf, 0x7e, 0x8a, 0xfa, 0xcc, 0x58, 0x9c, 0x88, 0x0d, 0xb1, 0x59, 0xcc, + 0x8b, 0x91, 0xcd, 0x4a, 0x96, 0x79, 0xf2, 0xeb, 0x9b, 0x73, 0xcd, 0x0c, 0xae, 0x32, 0xb1, 0x56, + 0xc1, 0xd5, 0x4e, 0xb9, 0x9d, 0x3f, 0x8f, 0xe7, 0x30, 0xc5, 0xcd, 0xa8, 0x98, 0x7b, 0x3a, 0x88, + 0x7b, 0xbd, 0x90, 0x92, 0xf2, 0x88, 0x0a, 0xc9, 0xa9, 0x31, 0xc6, 0x6c, 0x9d, 0x7d, 0x39, 0x7b, + 0x6f, 0xc0, 0x62, 0xb5, 0x6e, 0x7e, 0x8a, 0xc7, 0x4f, 0x21, 0x73, 0x6d, 0x1d, 0x3f, 0xd5, 0x89, + 0xf7, 0xb6, 0x33, 0x0a, 0x65, 0xc8, 0x39, 0x74, 0x2c, 0xf1, 0x44, 0xbe, 0x3b, 0x3b, 0x9c, 0xc2, + 0xbf, 0x26, 0xf7, 0xf6, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0x6a, 0xb5, 0xd2, 0x87, 0x80, 0x4e, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6193,6 +6387,7 @@ type GoCryptoTraderClient interface { GCTScriptStopAll(ctx context.Context, in *GCTScriptStopAllRequest, opts ...grpc.CallOption) (*GCTScriptGenericResponse, error) GCTScriptListAll(ctx context.Context, in *GCTScriptListAllRequest, opts ...grpc.CallOption) (*GCTScriptStatusResponse, error) GCTScriptAutoLoadToggle(ctx context.Context, in *GCTScriptAutoLoadRequest, opts ...grpc.CallOption) (*GCTScriptGenericResponse, error) + GetHistoricCandles(ctx context.Context, in *GetHistoricCandlesRequest, opts ...grpc.CallOption) (*GetHistoricCandlesResponse, error) } type goCryptoTraderClient struct { @@ -6808,6 +7003,15 @@ func (c *goCryptoTraderClient) GCTScriptAutoLoadToggle(ctx context.Context, in * return out, nil } +func (c *goCryptoTraderClient) GetHistoricCandles(ctx context.Context, in *GetHistoricCandlesRequest, opts ...grpc.CallOption) (*GetHistoricCandlesResponse, error) { + out := new(GetHistoricCandlesResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/GetHistoricCandles", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // GoCryptoTraderServer is the server API for GoCryptoTrader service. type GoCryptoTraderServer interface { GetInfo(context.Context, *GetInfoRequest) (*GetInfoResponse, error) @@ -6867,6 +7071,7 @@ type GoCryptoTraderServer interface { GCTScriptStopAll(context.Context, *GCTScriptStopAllRequest) (*GCTScriptGenericResponse, error) GCTScriptListAll(context.Context, *GCTScriptListAllRequest) (*GCTScriptStatusResponse, error) GCTScriptAutoLoadToggle(context.Context, *GCTScriptAutoLoadRequest) (*GCTScriptGenericResponse, error) + GetHistoricCandles(context.Context, *GetHistoricCandlesRequest) (*GetHistoricCandlesResponse, error) } // UnimplementedGoCryptoTraderServer can be embedded to have forward compatible implementations. @@ -7044,6 +7249,9 @@ func (*UnimplementedGoCryptoTraderServer) GCTScriptListAll(ctx context.Context, func (*UnimplementedGoCryptoTraderServer) GCTScriptAutoLoadToggle(ctx context.Context, req *GCTScriptAutoLoadRequest) (*GCTScriptGenericResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GCTScriptAutoLoadToggle not implemented") } +func (*UnimplementedGoCryptoTraderServer) GetHistoricCandles(ctx context.Context, req *GetHistoricCandlesRequest) (*GetHistoricCandlesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetHistoricCandles not implemented") +} func RegisterGoCryptoTraderServer(s *grpc.Server, srv GoCryptoTraderServer) { s.RegisterService(&_GoCryptoTrader_serviceDesc, srv) @@ -8087,6 +8295,24 @@ func _GoCryptoTrader_GCTScriptAutoLoadToggle_Handler(srv interface{}, ctx contex return interceptor(ctx, in, info, handler) } +func _GoCryptoTrader_GetHistoricCandles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetHistoricCandlesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).GetHistoricCandles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/GetHistoricCandles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).GetHistoricCandles(ctx, req.(*GetHistoricCandlesRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _GoCryptoTrader_serviceDesc = grpc.ServiceDesc{ ServiceName: "gctrpc.GoCryptoTrader", HandlerType: (*GoCryptoTraderServer)(nil), @@ -8303,6 +8529,10 @@ var _GoCryptoTrader_serviceDesc = grpc.ServiceDesc{ MethodName: "GCTScriptAutoLoadToggle", Handler: _GoCryptoTrader_GCTScriptAutoLoadToggle_Handler, }, + { + MethodName: "GetHistoricCandles", + Handler: _GoCryptoTrader_GetHistoricCandles_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/gctrpc/rpc.pb.gw.go b/gctrpc/rpc.pb.gw.go index 161f2c15..ba85c1f7 100644 --- a/gctrpc/rpc.pb.gw.go +++ b/gctrpc/rpc.pb.gw.go @@ -1711,6 +1711,39 @@ func local_request_GoCryptoTrader_GCTScriptAutoLoadToggle_0(ctx context.Context, } +var ( + filter_GoCryptoTrader_GetHistoricCandles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_GoCryptoTrader_GetHistoricCandles_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetHistoricCandlesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_GoCryptoTrader_GetHistoricCandles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetHistoricCandles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_GoCryptoTrader_GetHistoricCandles_0(ctx context.Context, marshaler runtime.Marshaler, server GoCryptoTraderServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetHistoricCandlesRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_GoCryptoTrader_GetHistoricCandles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetHistoricCandles(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterGoCryptoTraderHandlerServer registers the http handlers for service GoCryptoTrader to "mux". // UnaryRPC :call GoCryptoTraderServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -2804,6 +2837,26 @@ func RegisterGoCryptoTraderHandlerServer(ctx context.Context, mux *runtime.Serve }) + mux.Handle("GET", pattern_GoCryptoTrader_GetHistoricCandles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_GoCryptoTrader_GetHistoricCandles_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_GetHistoricCandles_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -3985,6 +4038,26 @@ func RegisterGoCryptoTraderHandlerClient(ctx context.Context, mux *runtime.Serve }) + mux.Handle("GET", pattern_GoCryptoTrader_GetHistoricCandles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_GetHistoricCandles_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_GetHistoricCandles_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -4102,6 +4175,8 @@ var ( pattern_GoCryptoTrader_GCTScriptListAll_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "gctscript", "stop"}, "", runtime.AssumeColonVerbOpt(true))) pattern_GoCryptoTrader_GCTScriptAutoLoadToggle_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "gctscript", "autoload"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_GoCryptoTrader_GetHistoricCandles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "gethistoriccandles"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -4218,4 +4293,6 @@ var ( forward_GoCryptoTrader_GCTScriptListAll_0 = runtime.ForwardResponseMessage forward_GoCryptoTrader_GCTScriptAutoLoadToggle_0 = runtime.ForwardResponseMessage + + forward_GoCryptoTrader_GetHistoricCandles_0 = runtime.ForwardResponseMessage ) diff --git a/gctrpc/rpc.proto b/gctrpc/rpc.proto index 99b3d4c9..9a8ed003 100644 --- a/gctrpc/rpc.proto +++ b/gctrpc/rpc.proto @@ -521,6 +521,26 @@ message GetAuditEventResponse { repeated AuditEvent events = 1; } +message GetHistoricCandlesRequest { + string exchange = 1; + CurrencyPair pair = 2; + int64 rangesize = 3; + int64 granularity = 4; +} + +message GetHistoricCandlesResponse { + repeated Candle candle =1; +} + +message Candle { + int64 time = 1; + double low = 2; + double high = 3; + double open = 4; + double close = 5; + double volume = 6; +} + message AuditEvent { string type = 1 ; string identifier = 2; @@ -956,5 +976,9 @@ service GoCryptoTrader { }; } - + rpc GetHistoricCandles(GetHistoricCandlesRequest) returns (GetHistoricCandlesResponse) { + option (google.api.http) = { + get: "/v1/gethistoriccandles" + }; + } } diff --git a/gctrpc/rpc.swagger.json b/gctrpc/rpc.swagger.json index aca3e330..247a6299 100644 --- a/gctrpc/rpc.swagger.json +++ b/gctrpc/rpc.swagger.json @@ -840,6 +840,62 @@ ] } }, + "/v1/gethistoriccandles": { + "get": { + "operationId": "GetHistoricCandles", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGetHistoricCandlesResponse" + } + } + }, + "parameters": [ + { + "name": "exchange", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "pair.delimiter", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "pair.base", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "pair.quote", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "rangesize", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + }, + { + "name": "granularity", + "in": "query", + "required": false, + "type": "string", + "format": "int64" + } + ], + "tags": [ + "GoCryptoTrader" + ] + } + }, "/v1/getinfo": { "get": { "operationId": "GetInfo", @@ -1548,6 +1604,35 @@ "gctrpcCancelOrderResponse": { "type": "object" }, + "gctrpcCandle": { + "type": "object", + "properties": { + "time": { + "type": "string", + "format": "int64" + }, + "low": { + "type": "number", + "format": "double" + }, + "high": { + "type": "number", + "format": "double" + }, + "open": { + "type": "number", + "format": "double" + }, + "close": { + "type": "number", + "format": "double" + }, + "volume": { + "type": "number", + "format": "double" + } + } + }, "gctrpcCoin": { "type": "object", "properties": { @@ -2032,6 +2117,17 @@ } } }, + "gctrpcGetHistoricCandlesResponse": { + "type": "object", + "properties": { + "candle": { + "type": "array", + "items": { + "$ref": "#/definitions/gctrpcCandle" + } + } + } + }, "gctrpcGetInfoResponse": { "type": "object", "properties": {