diff --git a/Gopkg.lock b/Gopkg.lock
index 2190ec995b6c854d86538b67b108ef32bae39402..551db449c60c15b120b60e3d07e8ed1efbb94fe8 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -10,14 +10,14 @@
 [[projects]]
   name = "github.com/OneOfOne/xxhash"
   packages = ["."]
-  revision = "4e9e81466dc37c9fd94ce9ecf42020ef54112203"
-  version = "v1.2.1"
+  revision = "6def279d2ce6c81a79dd1c1be580f03bb216fb8a"
+  version = "v1.2.2"
 
 [[projects]]
   branch = "master"
   name = "github.com/btcsuite/btcd"
   packages = ["btcec"]
-  revision = "2be2f12b358dc57d70b8f501b00be450192efbc3"
+  revision = "86fed781132ac890ee03e906e4ecd5d6fa180c64"
 
 [[projects]]
   branch = "master"
@@ -116,7 +116,7 @@
   branch = "master"
   name = "github.com/golang/snappy"
   packages = ["."]
-  revision = "553a641470496b2327abcac10b36396bd98e45c9"
+  revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a"
 
 [[projects]]
   name = "github.com/gorilla/websocket"
@@ -144,9 +144,18 @@
 
 [[projects]]
   name = "github.com/jawher/mow.cli"
-  packages = ["."]
-  revision = "0e80ee9f63156ea1954dc2375c33a1c7e752c25c"
-  version = "v1.0.3"
+  packages = [
+    ".",
+    "internal/container",
+    "internal/flow",
+    "internal/fsm",
+    "internal/lexer",
+    "internal/matcher",
+    "internal/parser",
+    "internal/values"
+  ]
+  revision = "2f22195f169da29d54624afd9eb83ada5c9e4ee9"
+  version = "v1.0.4"
 
 [[projects]]
   branch = "master"
@@ -188,19 +197,19 @@
   branch = "master"
   name = "github.com/rcrowley/go-metrics"
   packages = ["."]
-  revision = "d932a24a8ccb8fcadc993e5c6c58f93dac168294"
+  revision = "e2704e165165ec55d062f5919b4b29494e9fa790"
 
 [[projects]]
   name = "github.com/spf13/cobra"
   packages = ["."]
-  revision = "a1f051bc3eba734da4772d60e2d677f47cf93ef4"
-  version = "v0.0.2"
+  revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385"
+  version = "v0.0.3"
 
 [[projects]]
   name = "github.com/spf13/pflag"
   packages = ["."]
-  revision = "e57e3eeb33f795204c1ca35f56c44f83227c6e66"
-  version = "v1.0.0"
+  revision = "583c0c0531f06d5278b7d917446061adc344b5cd"
+  version = "v1.0.1"
 
 [[projects]]
   branch = "master"
@@ -235,7 +244,7 @@
     "leveldb/table",
     "leveldb/util"
   ]
-  revision = "714f901b98fdb3aa954b4193d8cbd64a28d80cad"
+  revision = "5d6fca44a948d2be89a9702de7717f0168403d3d"
 
 [[projects]]
   name = "github.com/tendermint/abci"
@@ -245,8 +254,8 @@
     "example/kvstore",
     "types"
   ]
-  revision = "78a8905690ef54f9d57e3b2b0ee7ad3a04ef3f1f"
-  version = "v0.10.3"
+  revision = "9af8b7a7c87478869f8c280ed9539470b8f470b4"
+  version = "v0.11.0-rc4"
 
 [[projects]]
   branch = "master"
@@ -258,11 +267,17 @@
   ]
   revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057"
 
+[[projects]]
+  name = "github.com/tendermint/go-amino"
+  packages = ["."]
+  revision = "ed62928576cfcaf887209dc96142cd79cdfff389"
+  version = "0.9.9"
+
 [[projects]]
   name = "github.com/tendermint/go-crypto"
   packages = ["."]
-  revision = "c3e19f3ea26f5c3357e0bcbb799b0761ef923755"
-  version = "v0.5.0"
+  revision = "915416979bf70efa4bcbf1c6cd5d64c5fff9fc19"
+  version = "v0.6.2"
 
 [[projects]]
   name = "github.com/tendermint/go-wire"
@@ -271,7 +286,6 @@
     "data"
   ]
   revision = "fa721242b042ecd4c6ed1a934ee740db4f74e45c"
-  source = "github.com/tendermint/go-amino"
   version = "v0.7.3"
 
 [[projects]]
@@ -288,19 +302,20 @@
     "consensus",
     "consensus/types",
     "evidence",
+    "libs/events",
+    "libs/pubsub",
+    "libs/pubsub/query",
     "mempool",
     "node",
     "p2p",
     "p2p/conn",
     "p2p/pex",
-    "p2p/trust",
     "p2p/upnp",
     "proxy",
     "rpc/core",
     "rpc/core/types",
     "rpc/grpc",
     "rpc/lib",
-    "rpc/lib/client",
     "rpc/lib/server",
     "rpc/lib/types",
     "state",
@@ -309,11 +324,10 @@
     "state/txindex/null",
     "types",
     "types/priv_validator",
-    "version",
-    "wire"
+    "version"
   ]
-  revision = "4930b61a381b9fb9bc530eb5deb56ea6429a1c3a"
-  version = "v0.18.0"
+  revision = "cb35c6378fe28aaa67998314f0996cd6cd4f30ff"
+  version = "v0.20.0-rc2"
 
 [[projects]]
   name = "github.com/tendermint/tmlibs"
@@ -324,24 +338,22 @@
     "db",
     "flowrate",
     "log",
-    "merkle",
-    "pubsub",
-    "pubsub/query"
+    "merkle"
   ]
-  revision = "2e24b64fc121dcdf1cabceab8dc2f7257675483c"
-  version = "v0.8.1"
+  revision = "d970af87248a4e162590300dbb74e102183a417d"
+  version = "v0.8.3"
 
 [[projects]]
   branch = "master"
   name = "github.com/tmthrgd/asm"
   packages = ["."]
-  revision = "4be3ab5ca701563b932e93c3f3b58aad8b5ed230"
+  revision = "e7da50cc23089806f643a8a72d1e6e2b4daefe91"
 
 [[projects]]
   branch = "master"
   name = "github.com/tmthrgd/go-hex"
   packages = ["."]
-  revision = "13ed8ac0738b1390630f86f6bf0943730c6d8037"
+  revision = "a82aa03cedda71045967f5cc69c22cada26f4e6c"
 
 [[projects]]
   branch = "master"
@@ -373,30 +385,31 @@
     "scrypt",
     "ssh/terminal"
   ]
-  revision = "d6449816ce06963d9d136eee5a56fca5b0616e7e"
+  revision = "df8d4716b3472e4a531c33cedbe537dae921a1a9"
 
 [[projects]]
   branch = "master"
   name = "golang.org/x/net"
   packages = [
     "context",
+    "http/httpguts",
     "http2",
     "http2/hpack",
     "idna",
     "internal/timeseries",
-    "lex/httplex",
     "trace"
   ]
-  revision = "61147c48b25b599e5b561d2e9c4f3e1ef489ca41"
+  revision = "1e491301e022f8f977054da4c2d852decd59571f"
 
 [[projects]]
   branch = "master"
   name = "golang.org/x/sys"
   packages = [
+    "cpu",
     "unix",
     "windows"
   ]
-  revision = "3b87a42e500a6dc65dae1a55d0b641295971163e"
+  revision = "c11f84a56e43e20a78cee75a7c034031ecf57d1f"
 
 [[projects]]
   name = "golang.org/x/text"
@@ -420,10 +433,9 @@
   version = "v0.3.0"
 
 [[projects]]
-  branch = "master"
   name = "google.golang.org/genproto"
   packages = ["googleapis/rpc/status"]
-  revision = "51d0944304c3cbce4afe9e5247e21100037bff78"
+  revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200"
 
 [[projects]]
   name = "google.golang.org/grpc"
@@ -470,6 +482,6 @@
 [solve-meta]
   analyzer-name = "dep"
   analyzer-version = 1
-  inputs-digest = "53146785a49a1d6940ce537262f1ff17196fed4244188f33c2f14342fadac88a"
+  inputs-digest = "3d26d13f94ec6b8d225fefdd181e9f6cf73f028cc3bdd8d2234e1db66028d836"
   solver-name = "gps-cdcl"
   solver-version = 1
diff --git a/Gopkg.toml b/Gopkg.toml
index 55f708a373ed2504431f41072256a953e611464e..3845d38d4949999f6e76082fb3a4b40f98c5cd2b 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -3,11 +3,7 @@
   unused-packages = true
   non-go = true
 
-[[constraint]]
-  name = "github.com/tendermint/tendermint"
-  version = "~0.18.0"
-
-[[constraint]]
-  name = "github.com/tendermint/go-wire"
-  source = "github.com/tendermint/go-amino"
-  version = "~0.7.3"
\ No newline at end of file
+# Because Tendermint did this, we have to...
+[[override]]
+  name = "google.golang.org/genproto"
+  revision = "7fd901a49ba6a7f87732eb344f6e3c5b19d1b200"
\ No newline at end of file
diff --git a/client/mock/client_mock.go b/client/mock/client_mock.go
index c683cc4ee3ed6b4dc1e702adc34387ffd789e72b..1a689bb39227d4118850b4ccae94b4cc37b20aa7 100644
--- a/client/mock/client_mock.go
+++ b/client/mock/client_mock.go
@@ -21,7 +21,6 @@ import (
 	"github.com/hyperledger/burrow/logging"
 	"github.com/hyperledger/burrow/rpc"
 	"github.com/hyperledger/burrow/txs"
-	tm_crypto "github.com/tendermint/go-crypto"
 )
 
 var _ NodeClient = (*MockNodeClient)(nil)
@@ -64,7 +63,6 @@ func (mock *MockNodeClient) Status() (ChainId []byte, ValidatorPublicKey []byte,
 	// fill return values
 	ChainId = make([]byte, 64)
 	LatestBlockHash = make([]byte, 64)
-	ValidatorPublicKey = tm_crypto.PubKeyEd25519{}.Wrap().Bytes()
 	BlockHeight = 0
 	LatestBlockTime = 0
 	return
diff --git a/client/node_client.go b/client/node_client.go
index c98ff55086e0dfb2fedab79e6916fce0b0dce167..3cac3db2a2d94b8a611144f6cfb9ec3863642070 100644
--- a/client/node_client.go
+++ b/client/node_client.go
@@ -21,9 +21,9 @@ import (
 	"github.com/hyperledger/burrow/crypto"
 	"github.com/hyperledger/burrow/logging"
 	"github.com/hyperledger/burrow/rpc"
-	tendermint_client "github.com/hyperledger/burrow/rpc/tm/client"
+	tmClient "github.com/hyperledger/burrow/rpc/tm/client"
+	rpcClient "github.com/hyperledger/burrow/rpc/tm/lib/client"
 	"github.com/hyperledger/burrow/txs"
-	"github.com/tendermint/tendermint/rpc/lib/client"
 )
 
 type NodeClient interface {
@@ -75,8 +75,8 @@ func NewBurrowNodeClient(rpcString string, logger *logging.Logger) *burrowNodeCl
 // broadcast to blockchain node
 
 func (burrowNodeClient *burrowNodeClient) Broadcast(tx txs.Tx) (*txs.Receipt, error) {
-	client := rpcclient.NewURIClient(burrowNodeClient.broadcastRPC)
-	receipt, err := tendermint_client.BroadcastTx(client, tx)
+	client := rpcClient.NewURIClient(burrowNodeClient.broadcastRPC)
+	receipt, err := tmClient.BroadcastTx(client, tx)
 	if err != nil {
 		return nil, err
 	}
@@ -105,7 +105,7 @@ func (burrowNodeClient *burrowNodeClient) DeriveWebsocketClient() (nodeWsClient
 		"websocket address", wsAddr,
 		"endpoint", "/websocket",
 	)
-	wsClient := rpcclient.NewWSClient(wsAddr, "/websocket")
+	wsClient := rpcClient.NewWSClient(wsAddr, "/websocket")
 	if err = wsClient.Start(); err != nil {
 		return nil, err
 	}
@@ -124,8 +124,8 @@ func (burrowNodeClient *burrowNodeClient) DeriveWebsocketClient() (nodeWsClient
 func (burrowNodeClient *burrowNodeClient) Status() (GenesisHash []byte, ValidatorPublicKey []byte,
 	LatestBlockHash []byte, LatestBlockHeight uint64, LatestBlockTime int64, err error) {
 
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
-	res, err := tendermint_client.Status(client)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	res, err := tmClient.Status(client)
 	if err != nil {
 		err = fmt.Errorf("error connecting to node (%s) to get status: %s",
 			burrowNodeClient.broadcastRPC, err.Error())
@@ -142,8 +142,8 @@ func (burrowNodeClient *burrowNodeClient) Status() (GenesisHash []byte, Validato
 }
 
 func (burrowNodeClient *burrowNodeClient) ChainId() (ChainName, ChainId string, GenesisHash []byte, err error) {
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
-	chainIdResult, err := tendermint_client.ChainId(client)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	chainIdResult, err := tmClient.ChainId(client)
 	if err != nil {
 		err = fmt.Errorf("error connecting to node (%s) to get chain id: %s",
 			burrowNodeClient.broadcastRPC, err.Error())
@@ -162,8 +162,8 @@ func (burrowNodeClient *burrowNodeClient) ChainId() (ChainName, ChainId string,
 func (burrowNodeClient *burrowNodeClient) QueryContract(callerAddress, calleeAddress crypto.Address,
 	data []byte) (ret []byte, gasUsed uint64, err error) {
 
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
-	callResult, err := tendermint_client.Call(client, callerAddress, calleeAddress, data)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	callResult, err := tmClient.Call(client, callerAddress, calleeAddress, data)
 	if err != nil {
 		err = fmt.Errorf("error (%v) connnecting to node (%s) to query contract at (%s) with data (%X)",
 			err.Error(), burrowNodeClient.broadcastRPC, calleeAddress, data)
@@ -176,10 +176,10 @@ func (burrowNodeClient *burrowNodeClient) QueryContract(callerAddress, calleeAdd
 func (burrowNodeClient *burrowNodeClient) QueryContractCode(address crypto.Address, code,
 	data []byte) (ret []byte, gasUsed uint64, err error) {
 
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
 	// TODO: [ben] Call and CallCode have an inconsistent signature; it makes sense for both to only
 	// have a single address that is the contract to query.
-	callResult, err := tendermint_client.CallCode(client, address, code, data)
+	callResult, err := tmClient.CallCode(client, address, code, data)
 	if err != nil {
 		err = fmt.Errorf("error connnecting to node (%s) to query contract code at (%s) with data (%X) and code (%X): %v",
 			burrowNodeClient.broadcastRPC, address, data, code, err.Error())
@@ -190,8 +190,8 @@ func (burrowNodeClient *burrowNodeClient) QueryContractCode(address crypto.Addre
 
 // GetAccount returns a copy of the account
 func (burrowNodeClient *burrowNodeClient) GetAccount(address crypto.Address) (acm.Account, error) {
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
-	account, err := tendermint_client.GetAccount(client, address)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	account, err := tmClient.GetAccount(client, address)
 	if err != nil {
 		err = fmt.Errorf("error connecting to node (%s) to fetch account (%s): %s",
 			burrowNodeClient.broadcastRPC, address, err.Error())
@@ -207,8 +207,8 @@ func (burrowNodeClient *burrowNodeClient) GetAccount(address crypto.Address) (ac
 
 // DumpStorage returns the full storage for an acm.
 func (burrowNodeClient *burrowNodeClient) DumpStorage(address crypto.Address) (*rpc.ResultDumpStorage, error) {
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
-	resultStorage, err := tendermint_client.DumpStorage(client, address)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	resultStorage, err := tmClient.DumpStorage(client, address)
 	if err != nil {
 		return nil, fmt.Errorf("error connecting to node (%s) to get storage for account (%X): %s",
 			burrowNodeClient.broadcastRPC, address, err.Error())
@@ -222,8 +222,8 @@ func (burrowNodeClient *burrowNodeClient) DumpStorage(address crypto.Address) (*
 func (burrowNodeClient *burrowNodeClient) GetName(name string) (owner crypto.Address, data string,
 	expirationBlock uint64, err error) {
 
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
-	entryResult, err := tendermint_client.GetName(client, name)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	entryResult, err := tmClient.GetName(client, name)
 	if err != nil {
 		err = fmt.Errorf("error connecting to node (%s) to get name registrar entry for name (%s)",
 			burrowNodeClient.broadcastRPC, name)
@@ -241,8 +241,8 @@ func (burrowNodeClient *burrowNodeClient) GetName(name string) (owner crypto.Add
 func (burrowNodeClient *burrowNodeClient) ListValidators() (blockHeight uint64,
 	bondedValidators, unbondingValidators []acm.Validator, err error) {
 
-	client := rpcclient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
-	validatorsResult, err := tendermint_client.ListValidators(client)
+	client := rpcClient.NewJSONRPCClient(burrowNodeClient.broadcastRPC)
+	validatorsResult, err := tmClient.ListValidators(client)
 	if err != nil {
 		err = fmt.Errorf("error connecting to node (%s) to get validators", burrowNodeClient.broadcastRPC)
 		return
diff --git a/client/websocket_client.go b/client/websocket_client.go
index 1841cefc4c36de8c026533c133c3551c6f1c5535..90e737b275f3a1ced1f731d60db4a28217f6b77b 100644
--- a/client/websocket_client.go
+++ b/client/websocket_client.go
@@ -22,14 +22,14 @@ import (
 	"encoding/json"
 
 	"github.com/hyperledger/burrow/crypto"
-	exe_events "github.com/hyperledger/burrow/execution/events"
+	exeEvents "github.com/hyperledger/burrow/execution/events"
 	"github.com/hyperledger/burrow/logging"
 	"github.com/hyperledger/burrow/logging/structure"
 	"github.com/hyperledger/burrow/rpc"
-	tm_client "github.com/hyperledger/burrow/rpc/tm/client"
+	"github.com/hyperledger/burrow/rpc/tm/client"
+	rpcClient "github.com/hyperledger/burrow/rpc/tm/lib/client"
 	"github.com/hyperledger/burrow/txs"
-	"github.com/tendermint/tendermint/rpc/lib/client"
-	tm_types "github.com/tendermint/tendermint/types"
+	tmTypes "github.com/tendermint/tendermint/types"
 )
 
 const (
@@ -38,7 +38,7 @@ const (
 
 type Confirmation struct {
 	BlockHash   []byte
-	EventDataTx *exe_events.EventDataTx
+	EventDataTx *exeEvents.EventDataTx
 	Exception   error
 	Error       error
 }
@@ -49,20 +49,20 @@ var _ NodeWebsocketClient = (*burrowNodeWebsocketClient)(nil)
 
 type burrowNodeWebsocketClient struct {
 	// TODO: assert no memory leak on closing with open websocket
-	tendermintWebsocket *rpcclient.WSClient
+	tendermintWebsocket *rpcClient.WSClient
 	logger              *logging.Logger
 }
 
 // Subscribe to an eventid
 func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) Subscribe(eventId string) error {
 	// TODO we can in the background listen to the subscription id and remember it to ease unsubscribing later.
-	return tm_client.Subscribe(burrowNodeWebsocketClient.tendermintWebsocket,
+	return client.Subscribe(burrowNodeWebsocketClient.tendermintWebsocket,
 		eventId)
 }
 
 // Unsubscribe from an eventid
 func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) Unsubscribe(subscriptionId string) error {
-	return tm_client.Unsubscribe(burrowNodeWebsocketClient.tendermintWebsocket,
+	return client.Unsubscribe(burrowNodeWebsocketClient.tendermintWebsocket,
 		subscriptionId)
 }
 
@@ -75,11 +75,11 @@ func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) WaitForConfirmation(
 	confirmationChannel := make(chan Confirmation, 1)
 	var latestBlockHash []byte
 
-	eventID := exe_events.EventStringAccountInput(inputAddr)
+	eventID := exeEvents.EventStringAccountInput(inputAddr)
 	if err := burrowNodeWebsocketClient.Subscribe(eventID); err != nil {
 		return nil, fmt.Errorf("Error subscribing to AccInput event (%s): %v", eventID, err)
 	}
-	if err := burrowNodeWebsocketClient.Subscribe(tm_types.EventNewBlock); err != nil {
+	if err := burrowNodeWebsocketClient.Subscribe(tmTypes.EventNewBlock); err != nil {
 		return nil, fmt.Errorf("Error subscribing to NewBlock event: %v", err)
 	}
 	// Read the incoming events
@@ -112,7 +112,7 @@ func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) WaitForConfirmation(
 				}
 
 				switch response.ID {
-				case tm_client.SubscribeRequestID:
+				case client.SubscribeRequestID:
 					resultSubscribe := new(rpc.ResultSubscribe)
 					err = json.Unmarshal(response.Result, resultSubscribe)
 					if err != nil {
@@ -125,7 +125,7 @@ func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) WaitForConfirmation(
 						"event", resultSubscribe.EventID,
 						"subscription_id", resultSubscribe.SubscriptionID)
 
-				case tm_client.EventResponseID(tm_types.EventNewBlock):
+				case client.EventResponseID(tmTypes.EventNewBlock):
 					resultEvent := new(rpc.ResultEvent)
 					err = json.Unmarshal(response.Result, resultEvent)
 					if err != nil {
@@ -133,7 +133,7 @@ func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) WaitForConfirmation(
 							structure.ErrorKey, err)
 						continue
 					}
-					blockData := resultEvent.EventDataNewBlock()
+					blockData := resultEvent.Tendermint.EventDataNewBlock()
 					if blockData != nil {
 						latestBlockHash = blockData.Block.Hash()
 						burrowNodeWebsocketClient.logger.TraceMsg("Registered new block",
@@ -142,7 +142,7 @@ func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) WaitForConfirmation(
 						)
 					}
 
-				case tm_client.EventResponseID(eventID):
+				case client.EventResponseID(eventID):
 					resultEvent := new(rpc.ResultEvent)
 					err = json.Unmarshal(response.Result, resultEvent)
 					if err != nil {
@@ -192,7 +192,7 @@ func (burrowNodeWebsocketClient *burrowNodeWebsocketClient) WaitForConfirmation(
 				default:
 					burrowNodeWebsocketClient.logger.InfoMsg("Received unsolicited response",
 						"response_id", response.ID,
-						"expected_response_id", tm_client.EventResponseID(eventID))
+						"expected_response_id", client.EventResponseID(eventID))
 				}
 			}
 		}
diff --git a/consensus/tendermint/config.go b/consensus/tendermint/config.go
index fe0a1d50bdf5d55d9baf0db80850916562c7a5fa..4f9db3c7a3737c62e981cdec475bc5b58713fa52 100644
--- a/consensus/tendermint/config.go
+++ b/consensus/tendermint/config.go
@@ -37,7 +37,6 @@ func (btc *BurrowTendermintConfig) TendermintConfig() *tm_config.Config {
 		conf.P2P.Seeds = btc.Seeds
 		conf.P2P.PersistentPeers = btc.PersistentPeers
 		conf.P2P.ListenAddress = btc.ListenAddress
-		conf.P2P.AuthEnc = false
 		conf.Moniker = btc.Moniker
 	}
 	// Disable Tendermint RPC
diff --git a/consensus/tendermint/events.go b/consensus/tendermint/events.go
index c9e6b50935e557c1c0f36715100ccab643ae8379..db069d683404f3fe763b6c17e0a63802af70bad4 100644
--- a/consensus/tendermint/events.go
+++ b/consensus/tendermint/events.go
@@ -5,8 +5,8 @@ import (
 
 	"github.com/hyperledger/burrow/event"
 	"github.com/hyperledger/burrow/logging/structure"
+	"github.com/tendermint/tendermint/libs/pubsub"
 	tm_types "github.com/tendermint/tendermint/types"
-	"github.com/tendermint/tmlibs/pubsub"
 )
 
 // Publishes all tendermint events available on subscribable to publisher
diff --git a/consensus/tendermint/query/node_view.go b/consensus/tendermint/query/node_view.go
index 8f9539956e40233f2cf6e1fe4733e37ab1a18afb..915f4001b8ca64dc7c6399a0e0ecd343079f0706 100644
--- a/consensus/tendermint/query/node_view.go
+++ b/consensus/tendermint/query/node_view.go
@@ -27,7 +27,7 @@ func NewNodeView(tmNode *tendermint.Node, txDecoder txs.Decoder) *NodeView {
 }
 
 func (nv *NodeView) PrivValidatorPublicKey() (crypto.PublicKey, error) {
-	pub := nv.tmNode.PrivValidator().GetPubKey().Unwrap().(tm_crypto.PubKeyEd25519)
+	pub := nv.tmNode.PrivValidator().GetPubKey().(tm_crypto.PubKeyEd25519)
 
 	return crypto.PublicKeyFromBytes(pub[:], crypto.CurveTypeEd25519)
 }
diff --git a/consensus/tendermint/tendermint.go b/consensus/tendermint/tendermint.go
index cfd986ab90af96a6b3c1d68c250e5f63f06ce361..c1139345a2fcc5b16a8bf2d2f28894b8ab548efa 100644
--- a/consensus/tendermint/tendermint.go
+++ b/consensus/tendermint/tendermint.go
@@ -109,7 +109,7 @@ func DeriveGenesisDoc(burrowGenesisDoc *genesis.GenesisDoc) *tm_types.GenesisDoc
 		tm := tm_crypto.PubKeyEd25519{}
 		copy(tm[:], validator.PublicKey.RawBytes())
 		validators[i] = tm_types.GenesisValidator{
-			PubKey: tm_crypto.PubKey{tm},
+			PubKey: tm,
 			Name:   validator.Name,
 			Power:  int64(validator.Amount),
 		}
@@ -129,7 +129,7 @@ func SubscribeNewBlock(ctx context.Context, subscribable event.Subscribable, sub
 	return event.SubscribeCallback(ctx, subscribable, subscriber, query, func(message interface{}) bool {
 		tmEventData, ok := message.(tm_types.TMEventData)
 		if ok {
-			eventDataNewBlock, ok := tmEventData.Unwrap().(tm_types.EventDataNewBlock)
+			eventDataNewBlock, ok := tmEventData.(tm_types.EventDataNewBlock)
 			if ok {
 				ch <- &eventDataNewBlock
 			}
diff --git a/consensus/tendermint/validator/priv_validator_memory.go b/consensus/tendermint/validator/priv_validator_memory.go
index 4126d3d6e4e798dfdaf5dd8e897d47d937090959..7f5077c1f10fa89200f23e7f0b941d021d76eae7 100644
--- a/consensus/tendermint/validator/priv_validator_memory.go
+++ b/consensus/tendermint/validator/priv_validator_memory.go
@@ -5,13 +5,12 @@ import (
 	"github.com/hyperledger/burrow/crypto"
 	tm_crypto "github.com/tendermint/go-crypto"
 	tm_types "github.com/tendermint/tendermint/types"
-	val_types "github.com/tendermint/tendermint/types/priv_validator"
 )
 
 type privValidatorMemory struct {
 	acm.Addressable
-	tm_types.Signer
-	lastSignedInfo *val_types.LastSignedInfo
+	signer         goCryptoSigner
+	lastSignedInfo *LastSignedInfo
 }
 
 var _ tm_types.PrivValidator = &privValidatorMemory{}
@@ -21,8 +20,8 @@ var _ tm_types.PrivValidator = &privValidatorMemory{}
 func NewPrivValidatorMemory(addressable acm.Addressable, signer crypto.Signer) *privValidatorMemory {
 	return &privValidatorMemory{
 		Addressable:    addressable,
-		Signer:         asTendermintSigner(signer),
-		lastSignedInfo: val_types.NewLastSignedInfo(),
+		signer:         asTendermintSigner(signer),
+		lastSignedInfo: NewLastSignedInfo(),
 	}
 }
 
@@ -33,38 +32,31 @@ func (pvm *privValidatorMemory) GetAddress() tm_types.Address {
 func (pvm *privValidatorMemory) GetPubKey() tm_crypto.PubKey {
 	tm := tm_crypto.PubKeyEd25519{}
 	copy(tm[:], pvm.PublicKey().RawBytes())
-	return tm_crypto.PubKey{tm}
+	return tm
 }
 
 // TODO: consider persistence to disk/database to avoid double signing after a crash
 func (pvm *privValidatorMemory) SignVote(chainID string, vote *tm_types.Vote) error {
-	return pvm.lastSignedInfo.SignVote(pvm.Signer, chainID, vote)
+	return pvm.lastSignedInfo.SignVote(pvm.signer, chainID, vote)
 }
 
 func (pvm *privValidatorMemory) SignProposal(chainID string, proposal *tm_types.Proposal) error {
-	return pvm.lastSignedInfo.SignProposal(pvm.Signer, chainID, proposal)
+	return pvm.lastSignedInfo.SignProposal(pvm.signer, chainID, proposal)
 }
 
 func (pvm *privValidatorMemory) SignHeartbeat(chainID string, heartbeat *tm_types.Heartbeat) error {
-	var err error
-	heartbeat.Signature, err = pvm.Signer.Sign(heartbeat.SignBytes(chainID))
-	return err
+	return pvm.lastSignedInfo.SignHeartbeat(pvm.signer, chainID, heartbeat)
 }
 
-func asTendermintSigner(signer crypto.Signer) tm_types.Signer {
-	return tendermintSigner{Signer: signer}
-}
-
-type tendermintSigner struct {
-	crypto.Signer
-}
+func asTendermintSigner(signer crypto.Signer) goCryptoSigner {
+	return func(msg []byte) tm_crypto.Signature {
+		sig, err := signer.Sign(msg)
+		if err != nil {
+			return nil
+		}
+		tmSig := tm_crypto.SignatureEd25519{}
+		copy(tmSig[:], sig.RawBytes())
+		return tmSig
 
-func (tms tendermintSigner) Sign(msg []byte) (tm_crypto.Signature, error) {
-	sig, err := tms.Signer.Sign(msg)
-	if err != nil {
-		return tm_crypto.Signature{}, err
 	}
-	tm_sig := tm_crypto.SignatureEd25519{}
-	copy(tm_sig[:], sig.RawBytes())
-	return tm_crypto.Signature{tm_sig}, nil
 }
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/sign_info.go b/consensus/tendermint/validator/sign_info.go
similarity index 52%
rename from vendor/github.com/tendermint/tendermint/types/priv_validator/sign_info.go
rename to consensus/tendermint/validator/sign_info.go
index 8b135df63564c951719bb94001d43a332eb571d8..975538656cad456bfd55c07df5419e340d37ac11 100644
--- a/vendor/github.com/tendermint/tendermint/types/priv_validator/sign_info.go
+++ b/consensus/tendermint/validator/sign_info.go
@@ -1,13 +1,13 @@
-package types
+package validator
 
 import (
 	"bytes"
-	"encoding/json"
 	"errors"
 	"fmt"
+	"sync"
 	"time"
 
-	crypto "github.com/tendermint/go-crypto"
+	"github.com/tendermint/go-crypto"
 	"github.com/tendermint/tendermint/types"
 	cmn "github.com/tendermint/tmlibs/common"
 )
@@ -27,15 +27,15 @@ func voteToStep(vote *types.Vote) int8 {
 	case types.VoteTypePrecommit:
 		return stepPrecommit
 	default:
-		panic("Unknown vote type")
+		cmn.PanicSanity("Unknown vote type")
+		return 0
 	}
 }
 
-//-------------------------------------
-
 // LastSignedInfo contains information about the latest
 // data signed by a validator to help prevent double signing.
 type LastSignedInfo struct {
+	sync.Mutex
 	Height    int64            `json:"height"`
 	Round     int              `json:"round"`
 	Step      int8             `json:"step"`
@@ -49,15 +49,32 @@ func NewLastSignedInfo() *LastSignedInfo {
 	}
 }
 
-func (lsi *LastSignedInfo) String() string {
-	return fmt.Sprintf("LH:%v, LR:%v, LS:%v", lsi.Height, lsi.Round, lsi.Step)
+type goCryptoSigner func(msg []byte) crypto.Signature
+
+// SignVote signs a canonical representation of the vote, along with the
+// chainID. Implements PrivValidator.
+func (lsi *LastSignedInfo) SignVote(sign goCryptoSigner, chainID string, vote *types.Vote) error {
+	lsi.Lock()
+	defer lsi.Unlock()
+	if err := lsi.signVote(sign, chainID, vote); err != nil {
+		return errors.New(cmn.Fmt("Error signing vote: %v", err))
+	}
+	return nil
 }
 
-// Verify returns an error if there is a height/round/step regression
-// or if the HRS matches but there are no LastSignBytes.
-// It returns true if HRS matches exactly and the LastSignature exists.
-// It panics if the HRS matches, the LastSignBytes are not empty, but the LastSignature is empty.
-func (lsi LastSignedInfo) Verify(height int64, round int, step int8) (bool, error) {
+// SignProposal signs a canonical representation of the proposal, along with
+// the chainID. Implements PrivValidator.
+func (lsi *LastSignedInfo) SignProposal(sign goCryptoSigner, chainID string, proposal *types.Proposal) error {
+	lsi.Lock()
+	defer lsi.Unlock()
+	if err := lsi.signProposal(sign, chainID, proposal); err != nil {
+		return fmt.Errorf("Error signing proposal: %v", err)
+	}
+	return nil
+}
+
+// returns error if HRS regression or no SignBytes. returns true if HRS is unchanged
+func (lsi *LastSignedInfo) checkHRS(height int64, round int, step int8) (bool, error) {
 	if lsi.Height > height {
 		return false, errors.New("Height regression")
 	}
@@ -72,49 +89,26 @@ func (lsi LastSignedInfo) Verify(height int64, round int, step int8) (bool, erro
 				return false, errors.New("Step regression")
 			} else if lsi.Step == step {
 				if lsi.SignBytes != nil {
-					if lsi.Signature.Empty() {
-						panic("info: LastSignature is nil but LastSignBytes is not!")
+					if lsi.Signature == nil {
+						panic("pv: Signature is nil but SignBytes is not!")
 					}
 					return true, nil
 				}
-				return false, errors.New("No LastSignature found")
+				return false, errors.New("No Signature found")
 			}
 		}
 	}
 	return false, nil
 }
 
-// Set height/round/step and signature on the info
-func (lsi *LastSignedInfo) Set(height int64, round int, step int8,
-	signBytes []byte, sig crypto.Signature) {
-
-	lsi.Height = height
-	lsi.Round = round
-	lsi.Step = step
-	lsi.Signature = sig
-	lsi.SignBytes = signBytes
-}
-
-// Reset resets all the values.
-// XXX: Unsafe.
-func (lsi *LastSignedInfo) Reset() {
-	lsi.Height = 0
-	lsi.Round = 0
-	lsi.Step = 0
-	lsi.Signature = crypto.Signature{}
-	lsi.SignBytes = nil
-}
-
-// SignVote checks the height/round/step (HRS) are greater than the latest state of the LastSignedInfo.
-// If so, it signs the vote, updates the LastSignedInfo, and sets the signature on the vote.
-// If the HRS are equal and the only thing changed is the timestamp, it sets the vote.Timestamp to the previous
-// value and the Signature to the LastSignedInfo.Signature.
-// Else it returns an error.
-func (lsi *LastSignedInfo) SignVote(signer types.Signer, chainID string, vote *types.Vote) error {
+// signVote checks if the vote is good to sign and sets the vote signature.
+// It may need to set the timestamp as well if the vote is otherwise the same as
+// a previously signed vote (ie. we crashed after signing but before the vote hit the WAL).
+func (lsi *LastSignedInfo) signVote(sign goCryptoSigner, chainID string, vote *types.Vote) error {
 	height, round, step := vote.Height, vote.Round, voteToStep(vote)
 	signBytes := vote.SignBytes(chainID)
 
-	sameHRS, err := lsi.Verify(height, round, step)
+	sameHRS, err := lsi.checkHRS(height, round, step)
 	if err != nil {
 		return err
 	}
@@ -135,25 +129,22 @@ func (lsi *LastSignedInfo) SignVote(signer types.Signer, chainID string, vote *t
 		}
 		return err
 	}
-	sig, err := signer.Sign(signBytes)
-	if err != nil {
-		return err
-	}
-	lsi.Set(height, round, step, signBytes, sig)
+
+	// It passed the checks. Sign the vote
+	sig := sign(signBytes)
+	lsi.saveSigned(height, round, step, signBytes, sig)
 	vote.Signature = sig
 	return nil
 }
 
-// SignProposal checks if the height/round/step (HRS) are greater than the latest state of the LastSignedInfo.
-// If so, it signs the proposal, updates the LastSignedInfo, and sets the signature on the proposal.
-// If the HRS are equal and the only thing changed is the timestamp, it sets the timestamp to the previous
-// value and the Signature to the LastSignedInfo.Signature.
-// Else it returns an error.
-func (lsi *LastSignedInfo) SignProposal(signer types.Signer, chainID string, proposal *types.Proposal) error {
+// signProposal checks if the proposal is good to sign and sets the proposal signature.
+// It may need to set the timestamp as well if the proposal is otherwise the same as
+// a previously signed proposal ie. we crashed after signing but before the proposal hit the WAL).
+func (lsi *LastSignedInfo) signProposal(sign goCryptoSigner, chainID string, proposal *types.Proposal) error {
 	height, round, step := proposal.Height, proposal.Round, stepPropose
 	signBytes := proposal.SignBytes(chainID)
 
-	sameHRS, err := lsi.Verify(height, round, step)
+	sameHRS, err := lsi.checkHRS(height, round, step)
 	if err != nil {
 		return err
 	}
@@ -174,39 +165,63 @@ func (lsi *LastSignedInfo) SignProposal(signer types.Signer, chainID string, pro
 		}
 		return err
 	}
-	sig, err := signer.Sign(signBytes)
-	if err != nil {
-		return err
-	}
-	lsi.Set(height, round, step, signBytes, sig)
+
+	// It passed the checks. Sign the proposal
+	sig := sign(signBytes)
+	lsi.saveSigned(height, round, step, signBytes, sig)
 	proposal.Signature = sig
 	return nil
 }
 
+// Persist height/round/step and signature
+func (lsi *LastSignedInfo) saveSigned(height int64, round int, step int8,
+	signBytes []byte, sig crypto.Signature) {
+
+	lsi.Height = height
+	lsi.Round = round
+	lsi.Step = step
+	lsi.Signature = sig
+	lsi.SignBytes = signBytes
+}
+
+// SignHeartbeat signs a canonical representation of the heartbeat, along with the chainID.
+// Implements PrivValidator.
+func (lsi *LastSignedInfo) SignHeartbeat(sign goCryptoSigner, chainID string, heartbeat *types.Heartbeat) error {
+	lsi.Lock()
+	defer lsi.Unlock()
+	heartbeat.Signature = sign(heartbeat.SignBytes(chainID))
+	return nil
+}
+
+// String returns a string representation of the LastSignedInfo.
+func (lsi *LastSignedInfo) String() string {
+	return fmt.Sprintf("PrivValidator{LH:%v, LR:%v, LS:%v}", lsi.Height, lsi.Round, lsi.Step)
+}
+
 //-------------------------------------
 
 // returns the timestamp from the lastSignBytes.
 // returns true if the only difference in the votes is their timestamp.
 func checkVotesOnlyDifferByTimestamp(lastSignBytes, newSignBytes []byte) (time.Time, bool) {
-	var lastVote, newVote types.CanonicalJSONOnceVote
-	if err := json.Unmarshal(lastSignBytes, &lastVote); err != nil {
-		panic(fmt.Sprintf("LastSignBytes cannot be unmarshalled into vote: %v", err))
+	var lastVote, newVote types.CanonicalJSONVote
+	if err := cdc.UnmarshalJSON(lastSignBytes, &lastVote); err != nil {
+		panic(fmt.Sprintf("SignBytes cannot be unmarshalled into vote: %v", err))
 	}
-	if err := json.Unmarshal(newSignBytes, &newVote); err != nil {
+	if err := cdc.UnmarshalJSON(newSignBytes, &newVote); err != nil {
 		panic(fmt.Sprintf("signBytes cannot be unmarshalled into vote: %v", err))
 	}
 
-	lastTime, err := time.Parse(types.TimeFormat, lastVote.Vote.Timestamp)
+	lastTime, err := time.Parse(types.TimeFormat, lastVote.Timestamp)
 	if err != nil {
 		panic(err)
 	}
 
 	// set the times to the same value and check equality
 	now := types.CanonicalTime(time.Now())
-	lastVote.Vote.Timestamp = now
-	newVote.Vote.Timestamp = now
-	lastVoteBytes, _ := json.Marshal(lastVote)
-	newVoteBytes, _ := json.Marshal(newVote)
+	lastVote.Timestamp = now
+	newVote.Timestamp = now
+	lastVoteBytes, _ := cdc.MarshalJSON(lastVote)
+	newVoteBytes, _ := cdc.MarshalJSON(newVote)
 
 	return lastTime, bytes.Equal(newVoteBytes, lastVoteBytes)
 }
@@ -214,25 +229,25 @@ func checkVotesOnlyDifferByTimestamp(lastSignBytes, newSignBytes []byte) (time.T
 // returns the timestamp from the lastSignBytes.
 // returns true if the only difference in the proposals is their timestamp
 func checkProposalsOnlyDifferByTimestamp(lastSignBytes, newSignBytes []byte) (time.Time, bool) {
-	var lastProposal, newProposal types.CanonicalJSONOnceProposal
-	if err := json.Unmarshal(lastSignBytes, &lastProposal); err != nil {
-		panic(fmt.Sprintf("LastSignBytes cannot be unmarshalled into proposal: %v", err))
+	var lastProposal, newProposal types.CanonicalJSONProposal
+	if err := cdc.UnmarshalJSON(lastSignBytes, &lastProposal); err != nil {
+		panic(fmt.Sprintf("SignBytes cannot be unmarshalled into proposal: %v", err))
 	}
-	if err := json.Unmarshal(newSignBytes, &newProposal); err != nil {
+	if err := cdc.UnmarshalJSON(newSignBytes, &newProposal); err != nil {
 		panic(fmt.Sprintf("signBytes cannot be unmarshalled into proposal: %v", err))
 	}
 
-	lastTime, err := time.Parse(types.TimeFormat, lastProposal.Proposal.Timestamp)
+	lastTime, err := time.Parse(types.TimeFormat, lastProposal.Timestamp)
 	if err != nil {
 		panic(err)
 	}
 
 	// set the times to the same value and check equality
 	now := types.CanonicalTime(time.Now())
-	lastProposal.Proposal.Timestamp = now
-	newProposal.Proposal.Timestamp = now
-	lastProposalBytes, _ := json.Marshal(lastProposal)
-	newProposalBytes, _ := json.Marshal(newProposal)
+	lastProposal.Timestamp = now
+	newProposal.Timestamp = now
+	lastProposalBytes, _ := cdc.MarshalJSON(lastProposal)
+	newProposalBytes, _ := cdc.MarshalJSON(newProposal)
 
 	return lastTime, bytes.Equal(newProposalBytes, lastProposalBytes)
 }
diff --git a/consensus/tendermint/validator/wire.go b/consensus/tendermint/validator/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..7f063ca389e87af133f79a100e2c81c424d21960
--- /dev/null
+++ b/consensus/tendermint/validator/wire.go
@@ -0,0 +1,12 @@
+package validator
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+}
diff --git a/core/integration/test_wrapper.go b/core/integration/test_wrapper.go
index 8a0e5a46d47526e632c5903518cab7349b1fc75f..79b5db460b908c8c5f8f387a5194efa95578cecd 100644
--- a/core/integration/test_wrapper.go
+++ b/core/integration/test_wrapper.go
@@ -45,6 +45,7 @@ const (
 )
 
 // Enable logger output during tests
+//var debugLogging = true
 var debugLogging = false
 
 // We use this to wrap tests
diff --git a/event/emitter.go b/event/emitter.go
index a09d158f9fb830511a00a9fb15d5bbb395d72478..ec9f1e31187c6e436d12ec1396ad57bd55dc3ce1 100644
--- a/event/emitter.go
+++ b/event/emitter.go
@@ -24,8 +24,8 @@ import (
 	"github.com/hyperledger/burrow/logging"
 	"github.com/hyperledger/burrow/logging/structure"
 	"github.com/hyperledger/burrow/process"
+	"github.com/tendermint/tendermint/libs/pubsub"
 	"github.com/tendermint/tmlibs/common"
-	"github.com/tendermint/tmlibs/pubsub"
 )
 
 const DefaultEventBufferCapacity = 2 << 10
@@ -72,7 +72,7 @@ func (em *emitter) Shutdown(ctx context.Context) error {
 
 // Publisher
 func (em *emitter) Publish(ctx context.Context, message interface{}, tags map[string]interface{}) error {
-	return em.pubsubServer.PublishWithTags(ctx, message, tags)
+	return em.pubsubServer.PublishWithTags(ctx, message, tagMap(tags))
 }
 
 // Subscribable
@@ -121,3 +121,11 @@ func GenerateSubscriptionID() (string, error) {
 	rStr := hex.EncodeToString(b)
 	return strings.ToUpper(rStr), nil
 }
+
+func tagMap(tags map[string]interface{}) pubsub.TagMap {
+	mp := make(map[string]string, len(tags))
+	for k, v := range tags {
+		mp[k] = structure.StringifyKey(v)
+	}
+	return pubsub.NewTagMap(mp)
+}
diff --git a/event/query.go b/event/query.go
index cd1aa6fc4d98a534c3c1d39b1419c5695038d15a..41f4ca712753e7f0d8fbf5ae852ce4e47984658f 100644
--- a/event/query.go
+++ b/event/query.go
@@ -7,8 +7,8 @@ import (
 	"text/template"
 	"time"
 
-	"github.com/tendermint/tmlibs/pubsub"
-	"github.com/tendermint/tmlibs/pubsub/query"
+	"github.com/tendermint/tendermint/libs/pubsub"
+	"github.com/tendermint/tendermint/libs/pubsub/query"
 )
 
 const (
diff --git a/event/query_test.go b/event/query_test.go
index d6b2ecf16b75cc7d8d17618f43a5b757123e73ee..35e9b36a791785e52ebeebd869d9809cc9e21a1a 100644
--- a/event/query_test.go
+++ b/event/query_test.go
@@ -3,8 +3,10 @@ package event
 import (
 	"testing"
 
+	"github.com/hyperledger/burrow/logging/structure"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"github.com/tendermint/tendermint/libs/pubsub"
 )
 
 func TestQueryBuilder(t *testing.T) {
@@ -23,17 +25,17 @@ func TestQueryBuilder(t *testing.T) {
 	require.NoError(t, err)
 	assert.Equal(t, "foo.size >= 45 AND bar.name = 'marmot'", qry.String())
 
-	assert.True(t, qry.Matches(map[string]interface{}{"foo.size": 80, "bar.name": "marmot"}))
-	assert.False(t, qry.Matches(map[string]interface{}{"foo.size": 8, "bar.name": "marmot"}))
-	assert.False(t, qry.Matches(map[string]interface{}{"foo.size": 80, "bar.name": "marot"}))
+	assert.True(t, qry.Matches(makeTagMap("foo.size", 80, "bar.name", "marmot")))
+	assert.False(t, qry.Matches(makeTagMap("foo.size", 8, "bar.name", "marmot")))
+	assert.False(t, qry.Matches(makeTagMap("foo.size", 80, "bar.name", "marot")))
 
 	qb = qb.AndContains("bar.desc", "burrow")
 	qry, err = qb.Query()
 	require.NoError(t, err)
 	assert.Equal(t, "foo.size >= 45 AND bar.name = 'marmot' AND bar.desc CONTAINS 'burrow'", qry.String())
 
-	assert.True(t, qry.Matches(map[string]interface{}{"foo.size": 80, "bar.name": "marmot", "bar.desc": "lives in a burrow"}))
-	assert.False(t, qry.Matches(map[string]interface{}{"foo.size": 80, "bar.name": "marmot", "bar.desc": "lives in a shoe"}))
+	assert.True(t, qry.Matches(makeTagMap("foo.size", 80, "bar.name", "marmot", "bar.desc", "lives in a burrow")))
+	assert.False(t, qry.Matches(makeTagMap("foo.size", 80, "bar.name", "marmot", "bar.desc", "lives in a shoe")))
 
 	qb = NewQueryBuilder().AndEquals("foo", "bar")
 	qb = qb.And(NewQueryBuilder().AndGreaterThanOrEqual("frogs", 4))
@@ -41,3 +43,11 @@ func TestQueryBuilder(t *testing.T) {
 	require.NoError(t, err)
 	assert.Equal(t, "foo = 'bar' AND frogs >= 4", qry.String())
 }
+
+func makeTagMap(keyvals ...interface{}) pubsub.TagMap {
+	tmap := make(map[string]string)
+	for i := 0; i < len(keyvals); i += 2 {
+		tmap[keyvals[i].(string)] = structure.StringifyKey(keyvals[i+1])
+	}
+	return pubsub.NewTagMap(tmap)
+}
diff --git a/rpc/result.go b/rpc/result.go
index 0de6909a798cfd266f6605ceb9342cdd44bd2fdf..63e05cf127b71705a87ff325c4efd19f6ff09f9f 100644
--- a/rpc/result.go
+++ b/rpc/result.go
@@ -21,15 +21,26 @@ import (
 	acm "github.com/hyperledger/burrow/account"
 	"github.com/hyperledger/burrow/crypto"
 	"github.com/hyperledger/burrow/execution"
-	exe_events "github.com/hyperledger/burrow/execution/events"
-	evm_events "github.com/hyperledger/burrow/execution/evm/events"
+	exeEvents "github.com/hyperledger/burrow/execution/events"
+	evmEvents "github.com/hyperledger/burrow/execution/evm/events"
 	"github.com/hyperledger/burrow/genesis"
 	"github.com/hyperledger/burrow/txs"
-	ctypes "github.com/tendermint/tendermint/consensus/types"
+	"github.com/tendermint/go-amino"
+	consensusTypes "github.com/tendermint/tendermint/consensus/types"
 	"github.com/tendermint/tendermint/p2p"
-	tm_types "github.com/tendermint/tendermint/types"
+	"github.com/tendermint/tendermint/rpc/core/types"
+	tmTypes "github.com/tendermint/tendermint/types"
 )
 
+// When using Tendermint types like Block and Vote we are forced to wrap the outer object and use amino marshalling
+var aminoCodec = amino.NewCodec()
+
+func init() {
+	//types.RegisterEvidences(AminoCodec)
+	//crypto.RegisterAmino(cdc)
+	core_types.RegisterAmino(aminoCodec)
+}
+
 type ResultGetStorage struct {
 	Key   []byte
 	Value []byte
@@ -64,12 +75,37 @@ type StorageItem struct {
 
 type ResultListBlocks struct {
 	LastHeight uint64
-	BlockMetas []*tm_types.BlockMeta
+	BlockMetas []*tmTypes.BlockMeta
 }
 
 type ResultGetBlock struct {
-	BlockMeta *tm_types.BlockMeta
-	Block     *tm_types.Block
+	BlockMeta *BlockMeta
+	Block     *Block
+}
+
+type BlockMeta struct {
+	*tmTypes.BlockMeta
+}
+
+func (bm BlockMeta) MarshalJSON() ([]byte, error) {
+	return aminoCodec.MarshalJSON(bm.BlockMeta)
+}
+
+func (bm *BlockMeta) UnmarshalJSON(data []byte) (err error) {
+	return aminoCodec.UnmarshalJSON(data, &bm.BlockMeta)
+}
+
+// Needed for go-amino handling of interface types
+type Block struct {
+	*tmTypes.Block
+}
+
+func (b Block) MarshalJSON() ([]byte, error) {
+	return aminoCodec.MarshalJSON(b.Block)
+}
+
+func (b *Block) UnmarshalJSON(data []byte) (err error) {
+	return aminoCodec.UnmarshalJSON(data, &b.Block)
 }
 
 type ResultStatus struct {
@@ -115,8 +151,8 @@ type ResultListValidators struct {
 }
 
 type ResultDumpConsensusState struct {
-	RoundState      *ctypes.RoundState
-	PeerRoundStates []*ctypes.PeerRoundState
+	RoundState      consensusTypes.RoundStateSimple
+	PeerRoundStates []*consensusTypes.PeerRoundState
 }
 
 type ResultPeers struct {
@@ -155,8 +191,6 @@ type ResultBroadcastTx struct {
 	txs.Receipt
 }
 
-// Unwrap
-
 func (rbt ResultBroadcastTx) MarshalJSON() ([]byte, error) {
 	return json.Marshal(rbt.Receipt)
 }
@@ -182,50 +216,50 @@ type ResultSignTx struct {
 	Tx txs.Wrapper
 }
 
-type ResultEvent struct {
-	Event         string
-	TMEventData   *tm_types.TMEventData     `json:",omitempty"`
-	EventDataTx   *exe_events.EventDataTx   `json:",omitempty"`
-	EventDataCall *evm_events.EventDataCall `json:",omitempty"`
-	EventDataLog  *evm_events.EventDataLog  `json:",omitempty"`
+type TendermintEvent struct {
+	tmTypes.TMEventData
+}
+
+func (te TendermintEvent) MarshalJSON() ([]byte, error) {
+	return aminoCodec.MarshalJSON(te.TMEventData)
+}
+
+func (te *TendermintEvent) UnmarshalJSON(data []byte) (err error) {
+	return aminoCodec.UnmarshalJSON(data, &te.TMEventData)
 }
 
-func (resultEvent ResultEvent) EventDataNewBlock() *tm_types.EventDataNewBlock {
-	if resultEvent.TMEventData != nil {
-		eventData, _ := resultEvent.TMEventData.Unwrap().(tm_types.EventDataNewBlock)
+func (te *TendermintEvent) EventDataNewBlock() *tmTypes.EventDataNewBlock {
+	if te != nil {
+		eventData, _ := te.TMEventData.(tmTypes.EventDataNewBlock)
 		return &eventData
 	}
 	return nil
 }
 
+type ResultEvent struct {
+	Event         string
+	Tendermint    *TendermintEvent         `json:",omitempty"`
+	EventDataTx   *exeEvents.EventDataTx   `json:",omitempty"`
+	EventDataCall *evmEvents.EventDataCall `json:",omitempty"`
+	EventDataLog  *evmEvents.EventDataLog  `json:",omitempty"`
+}
+
 // Map any supported event data element to our ResultEvent sum type
 func NewResultEvent(event string, eventData interface{}) (*ResultEvent, error) {
+	res := &ResultEvent{
+		Event: event,
+	}
 	switch ed := eventData.(type) {
-	case tm_types.TMEventData:
-		return &ResultEvent{
-			Event:       event,
-			TMEventData: &ed,
-		}, nil
-
-	case *exe_events.EventDataTx:
-		return &ResultEvent{
-			Event:       event,
-			EventDataTx: ed,
-		}, nil
-
-	case *evm_events.EventDataCall:
-		return &ResultEvent{
-			Event:         event,
-			EventDataCall: ed,
-		}, nil
-
-	case *evm_events.EventDataLog:
-		return &ResultEvent{
-			Event:        event,
-			EventDataLog: ed,
-		}, nil
-
+	case tmTypes.TMEventData:
+		res.Tendermint = &TendermintEvent{ed}
+	case *exeEvents.EventDataTx:
+		res.EventDataTx = ed
+	case *evmEvents.EventDataCall:
+		res.EventDataCall = ed
+	case *evmEvents.EventDataLog:
+		res.EventDataLog = ed
 	default:
 		return nil, fmt.Errorf("could not map event data of type %T to ResultEvent", eventData)
 	}
+	return res, nil
 }
diff --git a/rpc/result_test.go b/rpc/result_test.go
index 01c531e9527c79b94513c657c544073688d7caf0..2aa750ba26cb4300a7a07d210d41c8074cc37d60 100644
--- a/rpc/result_test.go
+++ b/rpc/result_test.go
@@ -18,6 +18,8 @@ import (
 	"encoding/json"
 	"testing"
 
+	goCrypto "github.com/tendermint/go-crypto"
+
 	acm "github.com/hyperledger/burrow/account"
 	"github.com/hyperledger/burrow/crypto"
 	"github.com/hyperledger/burrow/execution"
@@ -25,7 +27,9 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"github.com/tendermint/go-wire"
-	tm_types "github.com/tendermint/tendermint/types"
+	"github.com/tendermint/tendermint/consensus/types"
+	tmTypes "github.com/tendermint/tendermint/types"
+	"github.com/tendermint/tmlibs/common"
 )
 
 func TestResultBroadcastTx(t *testing.T) {
@@ -96,24 +100,72 @@ func TestResultCall_MarshalJSON(t *testing.T) {
 }
 
 func TestResultEvent(t *testing.T) {
-	eventDataNewBlock := tm_types.EventDataNewBlock{
-		Block: &tm_types.Block{
-			Header: &tm_types.Header{
+	eventDataNewBlock := tmTypes.EventDataNewBlock{
+		Block: &tmTypes.Block{
+			Header: &tmTypes.Header{
 				ChainID: "chainy",
 				NumTxs:  30,
 			},
+			LastCommit: &tmTypes.Commit{
+				Precommits: []*tmTypes.Vote{
+					{
+						Signature: goCrypto.SignatureEd25519{1, 2, 3},
+					},
+				},
+			},
 		},
 	}
 	res := ResultEvent{
-		TMEventData: &tm_types.TMEventData{
-			TMEventDataInner: eventDataNewBlock,
+		Tendermint: &TendermintEvent{
+			TMEventData: &eventDataNewBlock,
 		},
 	}
 	bs, err := json.Marshal(res)
 	require.NoError(t, err)
 
 	resOut := new(ResultEvent)
-	json.Unmarshal(bs, resOut)
+	require.NoError(t, json.Unmarshal(bs, resOut))
+	bsOut, err := json.Marshal(resOut)
+	require.NoError(t, err)
+	assert.Equal(t, string(bs), string(bsOut))
+	//fmt.Println(string(bs))
+	//fmt.Println(string(bsOut))
+}
+
+func TestResultGetBlock(t *testing.T) {
+	res := &ResultGetBlock{
+		Block: &Block{&tmTypes.Block{
+			LastCommit: &tmTypes.Commit{
+				Precommits: []*tmTypes.Vote{
+					{
+						Signature: goCrypto.SignatureEd25519{1, 2, 3},
+					},
+				},
+			},
+		},
+		},
+	}
+	bs, err := json.Marshal(res)
+	require.NoError(t, err)
+	resOut := new(ResultGetBlock)
+	require.NoError(t, json.Unmarshal([]byte(bs), resOut))
+	bsOut, err := json.Marshal(resOut)
+	require.NoError(t, err)
+	assert.Equal(t, string(bs), string(bsOut))
+}
+
+func TestResultDumpConsensusState(t *testing.T) {
+	res := &ResultDumpConsensusState{
+		RoundState: types.RoundStateSimple{
+			HeightRoundStep: "34/0/3",
+			Votes:           json.RawMessage(`[{"i'm a json": "32"}]`),
+			LockedBlockHash: common.HexBytes{'b', 'y', 't', 'e', 's'},
+		},
+	}
+	bs, err := json.Marshal(res)
+	require.NoError(t, err)
+	resOut := new(ResultDumpConsensusState)
+	require.NoError(t, json.Unmarshal([]byte(bs), resOut))
 	bsOut, err := json.Marshal(resOut)
 	require.NoError(t, err)
 	assert.Equal(t, string(bs), string(bsOut))
diff --git a/rpc/service.go b/rpc/service.go
index 415768f851caf0ca9d76252d6b344ddde20ec88c..f848bd60a3ba1c1ab97564065f96f0f92ad22c61 100644
--- a/rpc/service.go
+++ b/rpc/service.go
@@ -345,8 +345,8 @@ func (s *Service) ListNames(predicate func(*execution.NameRegEntry) bool) (*Resu
 
 func (s *Service) GetBlock(height uint64) (*ResultGetBlock, error) {
 	return &ResultGetBlock{
-		Block:     s.nodeView.BlockStore().LoadBlock(int64(height)),
-		BlockMeta: s.nodeView.BlockStore().LoadBlockMeta(int64(height)),
+		Block:     &Block{s.nodeView.BlockStore().LoadBlock(int64(height))},
+		BlockMeta: &BlockMeta{s.nodeView.BlockStore().LoadBlockMeta(int64(height))},
 	}, nil
 }
 
@@ -401,7 +401,7 @@ func (s *Service) DumpConsensusState() (*ResultDumpConsensusState, error) {
 		return nil, err
 	}
 	return &ResultDumpConsensusState{
-		RoundState:      s.nodeView.RoundState(),
+		RoundState:      s.nodeView.RoundState().RoundStateSimple(),
 		PeerRoundStates: peerRoundState,
 	}, nil
 }
diff --git a/rpc/tm/client/websocket_client.go b/rpc/tm/client/websocket_client.go
index e089718ad31ec74ce4e15a7523ade7e737ab70ef..96ba127f79c409da04cbf1b9f8062b9f46f8bdf7 100644
--- a/rpc/tm/client/websocket_client.go
+++ b/rpc/tm/client/websocket_client.go
@@ -18,11 +18,11 @@ import (
 	"context"
 
 	"github.com/hyperledger/burrow/rpc/tm"
-	"github.com/tendermint/tendermint/rpc/lib/types"
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
 )
 
 type WebsocketClient interface {
-	Send(ctx context.Context, request rpctypes.RPCRequest) error
+	Send(ctx context.Context, request types.RPCRequest) error
 }
 
 const SubscribeRequestID = "Subscribe"
@@ -33,7 +33,7 @@ func EventResponseID(eventID string) string {
 }
 
 func Subscribe(wsc WebsocketClient, eventID string) error {
-	req, err := rpctypes.MapToRequest(SubscribeRequestID,
+	req, err := types.MapToRequest(SubscribeRequestID,
 		"subscribe", map[string]interface{}{"eventID": eventID})
 	if err != nil {
 		return err
@@ -42,7 +42,7 @@ func Subscribe(wsc WebsocketClient, eventID string) error {
 }
 
 func Unsubscribe(websocketClient WebsocketClient, subscriptionID string) error {
-	req, err := rpctypes.MapToRequest(UnsubscribeRequestID,
+	req, err := types.MapToRequest(UnsubscribeRequestID,
 		"unsubscribe", map[string]interface{}{"subscriptionID": subscriptionID})
 	if err != nil {
 		return err
diff --git a/rpc/tm/integration/client_test.go b/rpc/tm/integration/client_test.go
index d09ad1763340c011173176806945217c0737f315..87bb496acb1ef048f62e027b6c91a84b915f5570 100644
--- a/rpc/tm/integration/client_test.go
+++ b/rpc/tm/integration/client_test.go
@@ -22,6 +22,9 @@ import (
 	"testing"
 	"time"
 
+	"fmt"
+	"strings"
+
 	"github.com/hyperledger/burrow/binary"
 	exe_events "github.com/hyperledger/burrow/execution/events"
 	"github.com/hyperledger/burrow/rpc"
@@ -342,7 +345,7 @@ func TestListUnconfirmedTxs(t *testing.T) {
 			}
 		}()
 
-		runThenWaitForBlock(t, wsc, nextBlockPredicateFn(), func() {
+		require.NoError(t, runThenWaitForBlock(t, wsc, nextBlockPredicateFn(), func() {
 			broadcastTx(t, client, tx)
 			select {
 			case <-time.After(time.Second * timeoutSeconds * 10):
@@ -352,7 +355,7 @@ func TestListUnconfirmedTxs(t *testing.T) {
 					"mempool during this test (previous txs should have made it into a block)")
 				assert.Contains(t, transactions, tx, "Transaction should be returned by ListUnconfirmedTxs")
 			}
-		})
+		}))
 	})
 }
 
@@ -386,11 +389,8 @@ func TestDumpConsensusState(t *testing.T) {
 		waitNBlocks(t, wsc, 3)
 		resp, err := tm_client.DumpConsensusState(client)
 		assert.NoError(t, err)
-		commitTime := resp.RoundState.CommitTime
 		assert.NotZero(t, startTime)
-		assert.NotZero(t, commitTime)
-		assert.True(t, commitTime.Unix() > startTime.Unix(),
-			"Commit time %v should be later than start time %v", commitTime, startTime)
-		assert.Equal(t, types.RoundStepNewHeight, resp.RoundState.Step)
+		assert.Equal(t, fmt.Sprintf("/0/%d", types.RoundStepNewHeight),
+			strings.TrimLeft(resp.RoundState.HeightRoundStep, "0123456789"))
 	})
 }
diff --git a/rpc/tm/integration/shared.go b/rpc/tm/integration/shared.go
index ee6e0aee21a191ef05991780a1598cba415ea5b9..e7b58d95de50d11d16efa2af153723e81c297268 100644
--- a/rpc/tm/integration/shared.go
+++ b/rpc/tm/integration/shared.go
@@ -28,10 +28,10 @@ import (
 	"github.com/hyperledger/burrow/crypto"
 	"github.com/hyperledger/burrow/execution"
 	"github.com/hyperledger/burrow/rpc"
-	tm_client "github.com/hyperledger/burrow/rpc/tm/client"
+	tmClient "github.com/hyperledger/burrow/rpc/tm/client"
+	rpcClient "github.com/hyperledger/burrow/rpc/tm/lib/client"
 	"github.com/hyperledger/burrow/txs"
 	"github.com/stretchr/testify/require"
-	"github.com/tendermint/tendermint/rpc/lib/client"
 )
 
 const (
@@ -43,9 +43,9 @@ const (
 // global variables for use across all tests
 var (
 	privateAccounts = integration.MakePrivateAccounts(5) // make keys
-	jsonRpcClient   = rpcclient.NewJSONRPCClient(rpcAddr)
-	httpClient      = rpcclient.NewURIClient(rpcAddr)
-	clients         = map[string]tm_client.RPCClient{
+	jsonRpcClient   = rpcClient.NewJSONRPCClient(rpcAddr)
+	httpClient      = rpcClient.NewURIClient(rpcAddr)
+	clients         = map[string]tmClient.RPCClient{
 		"JSONRPC": jsonRpcClient,
 		"HTTP":    httpClient,
 	}
@@ -55,7 +55,7 @@ var (
 //-------------------------------------------------------------------------------
 // some default transaction functions
 
-func makeDefaultSendTx(t *testing.T, client tm_client.RPCClient, addr crypto.Address, amt uint64) *txs.SendTx {
+func makeDefaultSendTx(t *testing.T, client tmClient.RPCClient, addr crypto.Address, amt uint64) *txs.SendTx {
 	sequence := getSequence(t, client, privateAccounts[0].Address())
 	tx := txs.NewSendTx()
 	tx.AddInputWithSequence(privateAccounts[0].PublicKey(), amt, sequence+1)
@@ -63,13 +63,13 @@ func makeDefaultSendTx(t *testing.T, client tm_client.RPCClient, addr crypto.Add
 	return tx
 }
 
-func makeDefaultSendTxSigned(t *testing.T, client tm_client.RPCClient, addr crypto.Address, amt uint64) *txs.SendTx {
+func makeDefaultSendTxSigned(t *testing.T, client tmClient.RPCClient, addr crypto.Address, amt uint64) *txs.SendTx {
 	tx := makeDefaultSendTx(t, client, addr, amt)
 	require.NoError(t, tx.Sign(genesisDoc.ChainID(), privateAccounts[0]))
 	return tx
 }
 
-func makeDefaultCallTx(t *testing.T, client tm_client.RPCClient, addr *crypto.Address, code []byte, amt, gasLim,
+func makeDefaultCallTx(t *testing.T, client tmClient.RPCClient, addr *crypto.Address, code []byte, amt, gasLim,
 	fee uint64) *txs.CallTx {
 	sequence := getSequence(t, client, privateAccounts[0].Address())
 	tx := txs.NewCallTxWithSequence(privateAccounts[0].PublicKey(), addr, code, amt, gasLim, fee,
@@ -78,7 +78,7 @@ func makeDefaultCallTx(t *testing.T, client tm_client.RPCClient, addr *crypto.Ad
 	return tx
 }
 
-func makeDefaultNameTx(t *testing.T, client tm_client.RPCClient, name, value string, amt, fee uint64) *txs.NameTx {
+func makeDefaultNameTx(t *testing.T, client tmClient.RPCClient, name, value string, amt, fee uint64) *txs.NameTx {
 	sequence := getSequence(t, client, privateAccounts[0].Address())
 	tx := txs.NewNameTxWithSequence(privateAccounts[0].PublicKey(), name, value, amt, fee, sequence+1)
 	require.NoError(t, tx.Sign(genesisDoc.ChainID(), privateAccounts[0]))
@@ -89,8 +89,8 @@ func makeDefaultNameTx(t *testing.T, client tm_client.RPCClient, name, value str
 // rpc call wrappers (fail on err)
 
 // get an account's sequence number
-func getSequence(t *testing.T, client tm_client.RPCClient, addr crypto.Address) uint64 {
-	acc, err := tm_client.GetAccount(client, addr)
+func getSequence(t *testing.T, client tmClient.RPCClient, addr crypto.Address) uint64 {
+	acc, err := tmClient.GetAccount(client, addr)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -101,8 +101,8 @@ func getSequence(t *testing.T, client tm_client.RPCClient, addr crypto.Address)
 }
 
 // get the account
-func getAccount(t *testing.T, client tm_client.RPCClient, addr crypto.Address) acm.Account {
-	ac, err := tm_client.GetAccount(client, addr)
+func getAccount(t *testing.T, client tmClient.RPCClient, addr crypto.Address) acm.Account {
+	ac, err := tmClient.GetAccount(client, addr)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -110,9 +110,9 @@ func getAccount(t *testing.T, client tm_client.RPCClient, addr crypto.Address) a
 }
 
 // sign transaction
-func signTx(t *testing.T, client tm_client.RPCClient, tx txs.Tx,
+func signTx(t *testing.T, client tmClient.RPCClient, tx txs.Tx,
 	privAcc *acm.ConcretePrivateAccount) txs.Tx {
-	signedTx, err := tm_client.SignTx(client, tx, []*acm.ConcretePrivateAccount{privAcc})
+	signedTx, err := tmClient.SignTx(client, tx, []*acm.ConcretePrivateAccount{privAcc})
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -120,8 +120,8 @@ func signTx(t *testing.T, client tm_client.RPCClient, tx txs.Tx,
 }
 
 // broadcast transaction
-func broadcastTx(t *testing.T, client tm_client.RPCClient, tx txs.Tx) *txs.Receipt {
-	rec, err := tm_client.BroadcastTx(client, tx)
+func broadcastTx(t *testing.T, client tmClient.RPCClient, tx txs.Tx) *txs.Receipt {
+	rec, err := tmClient.BroadcastTx(client, tx)
 	require.NoError(t, err)
 	return rec
 }
@@ -129,24 +129,24 @@ func broadcastTx(t *testing.T, client tm_client.RPCClient, tx txs.Tx) *txs.Recei
 // dump all storage for an account. currently unused
 func dumpStorage(t *testing.T, addr crypto.Address) *rpc.ResultDumpStorage {
 	client := clients["HTTP"]
-	resp, err := tm_client.DumpStorage(client, addr)
+	resp, err := tmClient.DumpStorage(client, addr)
 	if err != nil {
 		t.Fatal(err)
 	}
 	return resp
 }
 
-func getStorage(t *testing.T, client tm_client.RPCClient, addr crypto.Address, key []byte) []byte {
-	resp, err := tm_client.GetStorage(client, addr, key)
+func getStorage(t *testing.T, client tmClient.RPCClient, addr crypto.Address, key []byte) []byte {
+	resp, err := tmClient.GetStorage(client, addr, key)
 	if err != nil {
 		t.Fatal(err)
 	}
 	return resp
 }
 
-func callCode(t *testing.T, client tm_client.RPCClient, fromAddress crypto.Address, code, data,
+func callCode(t *testing.T, client tmClient.RPCClient, fromAddress crypto.Address, code, data,
 	expected []byte) {
-	resp, err := tm_client.CallCode(client, fromAddress, code, data)
+	resp, err := tmClient.CallCode(client, fromAddress, code, data)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -157,9 +157,9 @@ func callCode(t *testing.T, client tm_client.RPCClient, fromAddress crypto.Addre
 	}
 }
 
-func callContract(t *testing.T, client tm_client.RPCClient, fromAddress, toAddress crypto.Address,
+func callContract(t *testing.T, client tmClient.RPCClient, fromAddress, toAddress crypto.Address,
 	data, expected []byte) {
-	resp, err := tm_client.Call(client, fromAddress, toAddress, data)
+	resp, err := tmClient.Call(client, fromAddress, toAddress, data)
 	if err != nil {
 		t.Fatal(err)
 	}
@@ -171,8 +171,8 @@ func callContract(t *testing.T, client tm_client.RPCClient, fromAddress, toAddre
 }
 
 // get the namereg entry
-func getNameRegEntry(t *testing.T, client tm_client.RPCClient, name string) *execution.NameRegEntry {
-	entry, err := tm_client.GetName(client, name)
+func getNameRegEntry(t *testing.T, client tmClient.RPCClient, name string) *execution.NameRegEntry {
+	entry, err := tmClient.GetName(client, name)
 	if err != nil {
 		t.Fatal(err)
 	}
diff --git a/rpc/tm/integration/websocket_client_test.go b/rpc/tm/integration/websocket_client_test.go
index d19e32fe4892600b08efff4315e27a34cecb3e49..9ff32410da0f6a27a433147c6044ba59fd4248bd 100644
--- a/rpc/tm/integration/websocket_client_test.go
+++ b/rpc/tm/integration/websocket_client_test.go
@@ -54,7 +54,7 @@ func TestWSNewBlock(t *testing.T) {
 	}()
 	waitForEvent(t, wsc, eid, func() {},
 		func(eventID string, resultEvent *rpc.ResultEvent) (bool, error) {
-			fmt.Println("Check: ", resultEvent.EventDataNewBlock().Block)
+			fmt.Println("Check: ", resultEvent.Tendermint.EventDataNewBlock().Block)
 			return true, nil
 		})
 }
@@ -76,7 +76,7 @@ func TestWSBlockchainGrowth(t *testing.T) {
 	for i := int64(0); i < 2; i++ {
 		waitForEvent(t, wsc, eid, func() {},
 			func(eventID string, resultEvent *rpc.ResultEvent) (bool, error) {
-				eventDataNewBlock := resultEvent.EventDataNewBlock()
+				eventDataNewBlock := resultEvent.Tendermint.EventDataNewBlock()
 				if eventDataNewBlock == nil {
 					t.Fatalf("Was expecting EventDataNewBlock but got %v", resultEvent)
 				}
@@ -318,7 +318,7 @@ Subscribe:
 			if response.ID == tm_client.EventResponseID(tm_types.EventNewBlock) {
 				res := new(rpc.ResultEvent)
 				json.Unmarshal(response.Result, res)
-				enb := res.EventDataNewBlock()
+				enb := res.Tendermint.EventDataNewBlock()
 				if enb != nil {
 					assert.Equal(t, genesisDoc.ChainID(), enb.Block.ChainID)
 					if blocksSeen > 1 {
diff --git a/rpc/tm/integration/websocket_helpers.go b/rpc/tm/integration/websocket_helpers.go
index 2df6cd390bfb4151cad5cbb092447ee39b9cf42c..4397010b8158ef5aa470026bd94478f06649e57e 100644
--- a/rpc/tm/integration/websocket_helpers.go
+++ b/rpc/tm/integration/websocket_helpers.go
@@ -28,12 +28,12 @@ import (
 	"github.com/hyperledger/burrow/crypto"
 	"github.com/hyperledger/burrow/execution/events"
 	"github.com/hyperledger/burrow/rpc"
-	tm_client "github.com/hyperledger/burrow/rpc/tm/client"
+	tmClient "github.com/hyperledger/burrow/rpc/tm/client"
+	rpcClient "github.com/hyperledger/burrow/rpc/tm/lib/client"
+	rpcTypes "github.com/hyperledger/burrow/rpc/tm/lib/types"
 	"github.com/hyperledger/burrow/txs"
 	"github.com/stretchr/testify/require"
-	"github.com/tendermint/tendermint/rpc/lib/client"
-	"github.com/tendermint/tendermint/rpc/lib/types"
-	tm_types "github.com/tendermint/tendermint/types"
+	tmTypes "github.com/tendermint/tendermint/types"
 )
 
 const (
@@ -43,31 +43,31 @@ const (
 
 //--------------------------------------------------------------------------------
 // Utilities for testing the websocket service
-type blockPredicate func(block *tm_types.Block) bool
+type blockPredicate func(block *tmTypes.Block) bool
 type resultEventChecker func(eventID string, resultEvent *rpc.ResultEvent) (bool, error)
 
 // create a new connection
-func newWSClient() *rpcclient.WSClient {
-	wsc := rpcclient.NewWSClient(websocketAddr, websocketEndpoint)
+func newWSClient() *rpcClient.WSClient {
+	wsc := rpcClient.NewWSClient(websocketAddr, websocketEndpoint)
 	if err := wsc.Start(); err != nil {
 		panic(err)
 	}
 	return wsc
 }
 
-func stopWSClient(wsc *rpcclient.WSClient) {
+func stopWSClient(wsc *rpcClient.WSClient) {
 	wsc.Stop()
 }
 
 // subscribe to an event
-func subscribe(t *testing.T, wsc *rpcclient.WSClient, eventId string) {
-	if err := tm_client.Subscribe(wsc, eventId); err != nil {
+func subscribe(t *testing.T, wsc *rpcClient.WSClient, eventId string) {
+	if err := tmClient.Subscribe(wsc, eventId); err != nil {
 		t.Fatal(err)
 	}
 }
 
-func subscribeAndGetSubscriptionId(t *testing.T, wsc *rpcclient.WSClient, eventId string) string {
-	if err := tm_client.Subscribe(wsc, eventId); err != nil {
+func subscribeAndGetSubscriptionId(t *testing.T, wsc *rpcClient.WSClient, eventId string) string {
+	if err := tmClient.Subscribe(wsc, eventId); err != nil {
 		t.Fatal(err)
 	}
 
@@ -78,7 +78,7 @@ func subscribeAndGetSubscriptionId(t *testing.T, wsc *rpcclient.WSClient, eventI
 			t.Fatal("Timeout waiting for subscription result")
 		case response := <-wsc.ResponsesCh:
 			require.Nil(t, response.Error, "Got error response from websocket channel: %v", response.Error)
-			if response.ID == tm_client.SubscribeRequestID {
+			if response.ID == tmClient.SubscribeRequestID {
 				res := new(rpc.ResultSubscribe)
 				err := json.Unmarshal(response.Result, res)
 				if err == nil {
@@ -90,14 +90,14 @@ func subscribeAndGetSubscriptionId(t *testing.T, wsc *rpcclient.WSClient, eventI
 }
 
 // unsubscribe from an event
-func unsubscribe(t *testing.T, wsc *rpcclient.WSClient, subscriptionId string) {
-	if err := tm_client.Unsubscribe(wsc, subscriptionId); err != nil {
+func unsubscribe(t *testing.T, wsc *rpcClient.WSClient, subscriptionId string) {
+	if err := tmClient.Unsubscribe(wsc, subscriptionId); err != nil {
 		t.Fatal(err)
 	}
 }
 
 // broadcast transaction and wait for new block
-func broadcastTxAndWait(t *testing.T, client tm_client.RPCClient, tx txs.Tx) (*txs.Receipt, error) {
+func broadcastTxAndWait(t *testing.T, client tmClient.RPCClient, tx txs.Tx) (*txs.Receipt, error) {
 	wsc := newWSClient()
 	defer stopWSClient(wsc)
 	inputs := tx.GetInputs()
@@ -109,18 +109,21 @@ func broadcastTxAndWait(t *testing.T, client tm_client.RPCClient, tx txs.Tx) (*t
 	var rec *txs.Receipt
 	var err error
 
-	subscribeAndWaitForNext(t, wsc, events.EventStringAccountInput(address),
+	err = subscribeAndWaitForNext(t, wsc, events.EventStringAccountInput(address),
 		func() {
-			rec, err = tm_client.BroadcastTx(client, tx)
+			rec, err = tmClient.BroadcastTx(client, tx)
 		}, func(eventID string, resultEvent *rpc.ResultEvent) (bool, error) {
 			return true, nil
 		})
+	if err != nil {
+		return nil, err
+	}
 	return rec, err
 }
 
 func nextBlockPredicateFn() blockPredicate {
 	initialHeight := int64(-1)
-	return func(block *tm_types.Block) bool {
+	return func(block *tmTypes.Block) bool {
 		if initialHeight <= 0 {
 			initialHeight = block.Height
 			return false
@@ -135,28 +138,28 @@ func nextBlockPredicateFn() blockPredicate {
 	}
 }
 
-func waitNBlocks(t *testing.T, wsc *rpcclient.WSClient, n int) {
+func waitNBlocks(t *testing.T, wsc *rpcClient.WSClient, n int) {
 	i := 0
-	runThenWaitForBlock(t, wsc,
-		func(block *tm_types.Block) bool {
+	require.NoError(t, runThenWaitForBlock(t, wsc,
+		func(block *tmTypes.Block) bool {
 			i++
 			return i >= n
 		},
-		func() {})
+		func() {}))
 }
 
-func runThenWaitForBlock(t *testing.T, wsc *rpcclient.WSClient, predicate blockPredicate, runner func()) {
+func runThenWaitForBlock(t *testing.T, wsc *rpcClient.WSClient, predicate blockPredicate, runner func()) error {
 	eventDataChecker := func(event string, eventData *rpc.ResultEvent) (bool, error) {
-		eventDataNewBlock := eventData.EventDataNewBlock()
+		eventDataNewBlock := eventData.Tendermint.EventDataNewBlock()
 		if eventDataNewBlock == nil {
 			return false, fmt.Errorf("could not convert %#v to EventDataNewBlock", eventData)
 		}
 		return predicate(eventDataNewBlock.Block), nil
 	}
-	subscribeAndWaitForNext(t, wsc, tm_types.EventNewBlock, runner, eventDataChecker)
+	return subscribeAndWaitForNext(t, wsc, tmTypes.EventNewBlock, runner, eventDataChecker)
 }
 
-func subscribeAndWaitForNext(t *testing.T, wsc *rpcclient.WSClient, event string, runner func(),
+func subscribeAndWaitForNext(t *testing.T, wsc *rpcClient.WSClient, event string, runner func(),
 	checker resultEventChecker) error {
 
 	subId := subscribeAndGetSubscriptionId(t, wsc, event)
@@ -171,7 +174,7 @@ func subscribeAndWaitForNext(t *testing.T, wsc *rpcclient.WSClient, event string
 // stopWaiting is true waitForEvent will return or if stopWaiting is false
 // waitForEvent will keep listening for new events. If an error is returned
 // waitForEvent will fail the test.
-func waitForEvent(t *testing.T, wsc *rpcclient.WSClient, eventID string, runner func(),
+func waitForEvent(t *testing.T, wsc *rpcClient.WSClient, eventID string, runner func(),
 	checker resultEventChecker) error {
 
 	// go routine to wait for websocket msg
@@ -193,7 +196,7 @@ func waitForEvent(t *testing.T, wsc *rpcclient.WSClient, eventID string, runner
 					errCh <- r.Error
 					return
 				}
-				if r.ID == tm_client.EventResponseID(eventID) {
+				if r.ID == tmClient.EventResponseID(eventID) {
 					resultEvent, err := readResponse(r)
 					if err != nil {
 						errCh <- err
@@ -231,7 +234,7 @@ func waitForEvent(t *testing.T, wsc *rpcclient.WSClient, eventID string, runner
 	return nil
 }
 
-func readResponse(r rpctypes.RPCResponse) (*rpc.ResultEvent, error) {
+func readResponse(r rpcTypes.RPCResponse) (*rpc.ResultEvent, error) {
 	if r.Error != nil {
 		return nil, r.Error
 	}
diff --git a/vendor/github.com/tendermint/tendermint/rpc/lib/client/http_client.go b/rpc/tm/lib/client/http_client.go
similarity index 92%
rename from vendor/github.com/tendermint/tendermint/rpc/lib/client/http_client.go
rename to rpc/tm/lib/client/http_client.go
index 902b7eebce778b8d1da9ce6f0690bc7dd58aff31..46b07c48d6f6c892b0583c384ca5bf23c61454c8 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/lib/client/http_client.go
+++ b/rpc/tm/lib/client/http_client.go
@@ -1,4 +1,4 @@
-package rpcclient
+package client
 
 import (
 	"bytes"
@@ -11,9 +11,8 @@ import (
 	"reflect"
 	"strings"
 
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
 	"github.com/pkg/errors"
-
-	types "github.com/tendermint/tendermint/rpc/lib/types"
 )
 
 // HTTPClient is a common interface for JSONRPCClient and URIClient.
@@ -141,9 +140,8 @@ func (c *URIClient) Call(method string, params map[string]interface{}, result in
 //------------------------------------------------
 
 func unmarshalResponseBytes(responseBytes []byte, result interface{}) (interface{}, error) {
-	// read response
-	// if rpc/core/types is imported, the result will unmarshal
-	// into the correct type
+	// Read response.  If rpc/core/types is imported, the result will unmarshal
+	// into the correct type.
 	// log.Notice("response", "response", string(responseBytes))
 	var err error
 	response := &types.RPCResponse{}
@@ -154,7 +152,7 @@ func unmarshalResponseBytes(responseBytes []byte, result interface{}) (interface
 	if response.Error != nil {
 		return nil, errors.Errorf("Response error: %v", response.Error)
 	}
-	// unmarshal the RawMessage into the result
+	// Unmarshal the RawMessage into the result.
 	err = json.Unmarshal(response.Result, result)
 	if err != nil {
 		return nil, errors.Errorf("Error unmarshalling rpc response result: %v", err)
@@ -167,7 +165,7 @@ func argsToURLValues(args map[string]interface{}) (url.Values, error) {
 	if len(args) == 0 {
 		return values, nil
 	}
-	err := argsToJson(args)
+	err := argsToJSON(args)
 	if err != nil {
 		return nil, err
 	}
@@ -177,13 +175,13 @@ func argsToURLValues(args map[string]interface{}) (url.Values, error) {
 	return values, nil
 }
 
-func argsToJson(args map[string]interface{}) error {
+func argsToJSON(args map[string]interface{}) error {
 	for k, v := range args {
 		rt := reflect.TypeOf(v)
 		isByteSlice := rt.Kind() == reflect.Slice && rt.Elem().Kind() == reflect.Uint8
 		if isByteSlice {
-			bytes := reflect.ValueOf(v).Bytes()
-			args[k] = fmt.Sprintf("0x%X", bytes)
+			bs := reflect.ValueOf(v).Bytes()
+			args[k] = fmt.Sprintf("0x%X", bs)
 			continue
 		}
 
diff --git a/vendor/github.com/tendermint/tendermint/rpc/lib/client/ws_client.go b/rpc/tm/lib/client/ws_client.go
similarity index 98%
rename from vendor/github.com/tendermint/tendermint/rpc/lib/client/ws_client.go
rename to rpc/tm/lib/client/ws_client.go
index ab2e94d0b855302afbfd6b67f71128078bc17e8f..1527d9311cd736ae85ccb137c2880e6b6c2f3a8d 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/lib/client/ws_client.go
+++ b/rpc/tm/lib/client/ws_client.go
@@ -1,20 +1,18 @@
-package rpcclient
+package client
 
 import (
 	"context"
 	"encoding/json"
 	"fmt"
-	"math/rand"
 	"net"
 	"net/http"
 	"sync"
 	"time"
 
 	"github.com/gorilla/websocket"
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
 	"github.com/pkg/errors"
-	metrics "github.com/rcrowley/go-metrics"
-
-	types "github.com/tendermint/tendermint/rpc/lib/types"
+	"github.com/rcrowley/go-metrics"
 	cmn "github.com/tendermint/tmlibs/common"
 )
 
@@ -255,7 +253,7 @@ func (c *WSClient) reconnect() error {
 	}()
 
 	for {
-		jitterSeconds := time.Duration(rand.Float64() * float64(time.Second)) // 1s == (1e9 ns)
+		jitterSeconds := time.Duration(cmn.RandFloat64() * float64(time.Second)) // 1s == (1e9 ns)
 		backoffDuration := jitterSeconds + ((1 << uint(attempt)) * time.Second)
 
 		c.Logger.Info("reconnecting", "attempt", attempt+1, "backoff_duration", backoffDuration)
diff --git a/rpc/tm/lib/lib.go b/rpc/tm/lib/lib.go
new file mode 100644
index 0000000000000000000000000000000000000000..31b495a83b77ccc0477ef1b9862bb7f0a527b40e
--- /dev/null
+++ b/rpc/tm/lib/lib.go
@@ -0,0 +1,4 @@
+// Originally copied from tendermint/rpc/lib and stripped of go-amino serialisation library in favour go
+// stdlib json module
+
+package lib
diff --git a/rpc/tm/lib/rpc_test.go b/rpc/tm/lib/rpc_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..0a21c0d83db84d8d504c783a4a593d65ea2f50e8
--- /dev/null
+++ b/rpc/tm/lib/rpc_test.go
@@ -0,0 +1,371 @@
+package lib
+
+import (
+	"bytes"
+	"context"
+	crand "crypto/rand"
+	"encoding/json"
+	"fmt"
+	"math/rand"
+	"net/http"
+	"os"
+	"os/exec"
+	"testing"
+	"time"
+
+	"github.com/go-kit/kit/log/term"
+	"github.com/hyperledger/burrow/logging/lifecycle"
+	"github.com/hyperledger/burrow/rpc/tm/lib/client"
+	"github.com/hyperledger/burrow/rpc/tm/lib/server"
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+	cmn "github.com/tendermint/tmlibs/common"
+	"github.com/tendermint/tmlibs/log"
+)
+
+// Client and Server should work over tcp or unix sockets
+const (
+	tcpAddr = "tcp://0.0.0.0:47768"
+
+	unixSocket = "/tmp/rpc_test.sock"
+	unixAddr   = "unix://" + unixSocket
+
+	websocketEndpoint = "/websocket/endpoint"
+)
+
+type ResultEcho struct {
+	Value string `json:"value"`
+}
+
+type ResultEchoInt struct {
+	Value int `json:"value"`
+}
+
+type ResultEchoBytes struct {
+	Value []byte `json:"value"`
+}
+
+type ResultEchoDataBytes struct {
+	Value cmn.HexBytes `json:"value"`
+}
+
+// Define some routes
+var Routes = map[string]*server.RPCFunc{
+	"echo":            server.NewRPCFunc(EchoResult, "arg"),
+	"echo_ws":         server.NewWSRPCFunc(EchoWSResult, "arg"),
+	"echo_bytes":      server.NewRPCFunc(EchoBytesResult, "arg"),
+	"echo_data_bytes": server.NewRPCFunc(EchoDataBytesResult, "arg"),
+	"echo_int":        server.NewRPCFunc(EchoIntResult, "arg"),
+}
+
+func EchoResult(v string) (*ResultEcho, error) {
+	return &ResultEcho{v}, nil
+}
+
+func EchoWSResult(wsCtx types.WSRPCContext, v string) (*ResultEcho, error) {
+	return &ResultEcho{v}, nil
+}
+
+func EchoIntResult(v int) (*ResultEchoInt, error) {
+	return &ResultEchoInt{v}, nil
+}
+
+func EchoBytesResult(v []byte) (*ResultEchoBytes, error) {
+	return &ResultEchoBytes{v}, nil
+}
+
+func EchoDataBytesResult(v cmn.HexBytes) (*ResultEchoDataBytes, error) {
+	return &ResultEchoDataBytes{v}, nil
+}
+
+func TestMain(m *testing.M) {
+	setup()
+	code := m.Run()
+	os.Exit(code)
+}
+
+var colorFn = func(keyvals ...interface{}) term.FgBgColor {
+	for i := 0; i < len(keyvals)-1; i += 2 {
+		if keyvals[i] == "socket" {
+			if keyvals[i+1] == "tcp" {
+				return term.FgBgColor{Fg: term.DarkBlue}
+			} else if keyvals[i+1] == "unix" {
+				return term.FgBgColor{Fg: term.DarkCyan}
+			}
+		}
+	}
+	return term.FgBgColor{}
+}
+
+// launch unix and tcp servers
+func setup() {
+	logger, _ := lifecycle.NewStdErrLogger()
+
+	cmd := exec.Command("rm", "-f", unixSocket)
+	err := cmd.Start()
+	if err != nil {
+		panic(err)
+	}
+	if err = cmd.Wait(); err != nil {
+		panic(err)
+	}
+
+	tcpLogger := logger.With("socket", "tcp")
+	mux := http.NewServeMux()
+	server.RegisterRPCFuncs(mux, Routes, tcpLogger)
+	wm := server.NewWebsocketManager(Routes, logger, server.ReadWait(5*time.Second), server.PingPeriod(1*time.Second))
+	mux.HandleFunc(websocketEndpoint, wm.WebsocketHandler)
+	go func() {
+		_, err := server.StartHTTPServer(tcpAddr, mux, tcpLogger)
+		if err != nil {
+			panic(err)
+		}
+	}()
+
+	unixLogger := logger.With("socket", "unix")
+	mux2 := http.NewServeMux()
+	server.RegisterRPCFuncs(mux2, Routes, unixLogger)
+	wm = server.NewWebsocketManager(Routes, logger)
+	mux2.HandleFunc(websocketEndpoint, wm.WebsocketHandler)
+	go func() {
+		_, err := server.StartHTTPServer(unixAddr, mux2, unixLogger)
+		if err != nil {
+			panic(err)
+		}
+	}()
+
+	// wait for servers to start
+	time.Sleep(time.Second * 2)
+}
+
+func echoViaHTTP(cl client.HTTPClient, val string) (string, error) {
+	params := map[string]interface{}{
+		"arg": val,
+	}
+	result := new(ResultEcho)
+	if _, err := cl.Call("echo", params, result); err != nil {
+		return "", err
+	}
+	return result.Value, nil
+}
+
+func echoIntViaHTTP(cl client.HTTPClient, val int) (int, error) {
+	params := map[string]interface{}{
+		"arg": val,
+	}
+	result := new(ResultEchoInt)
+	if _, err := cl.Call("echo_int", params, result); err != nil {
+		return 0, err
+	}
+	return result.Value, nil
+}
+
+func echoBytesViaHTTP(cl client.HTTPClient, bytes []byte) ([]byte, error) {
+	params := map[string]interface{}{
+		"arg": bytes,
+	}
+	result := new(ResultEchoBytes)
+	if _, err := cl.Call("echo_bytes", params, result); err != nil {
+		return []byte{}, err
+	}
+	return result.Value, nil
+}
+
+func echoDataBytesViaHTTP(cl client.HTTPClient, bytes cmn.HexBytes) (cmn.HexBytes, error) {
+	params := map[string]interface{}{
+		"arg": bytes,
+	}
+	result := new(ResultEchoDataBytes)
+	if _, err := cl.Call("echo_data_bytes", params, result); err != nil {
+		return []byte{}, err
+	}
+	return result.Value, nil
+}
+
+func testWithHTTPClient(t *testing.T, cl client.HTTPClient) {
+	val := "acbd"
+	got, err := echoViaHTTP(cl, val)
+	require.Nil(t, err)
+	assert.Equal(t, got, val)
+
+	val2 := randBytes(t)
+	got2, err := echoBytesViaHTTP(cl, val2)
+	require.Nil(t, err)
+	assert.Equal(t, got2, val2)
+
+	val3 := cmn.HexBytes(randBytes(t))
+	got3, err := echoDataBytesViaHTTP(cl, val3)
+	require.Nil(t, err)
+	assert.Equal(t, got3, val3)
+
+	val4 := rand.Intn(10000)
+	got4, err := echoIntViaHTTP(cl, val4)
+	require.Nil(t, err)
+	assert.Equal(t, got4, val4)
+}
+
+func echoViaWS(cl *client.WSClient, val string) (string, error) {
+	params := map[string]interface{}{
+		"arg": val,
+	}
+	err := cl.Call(context.Background(), "echo", params)
+	if err != nil {
+		return "", err
+	}
+
+	msg := <-cl.ResponsesCh
+	if msg.Error != nil {
+		return "", err
+
+	}
+	result := new(ResultEcho)
+	err = json.Unmarshal(msg.Result, result)
+	if err != nil {
+		return "", nil
+	}
+	return result.Value, nil
+}
+
+func echoBytesViaWS(cl *client.WSClient, bytes []byte) ([]byte, error) {
+	params := map[string]interface{}{
+		"arg": bytes,
+	}
+	err := cl.Call(context.Background(), "echo_bytes", params)
+	if err != nil {
+		return []byte{}, err
+	}
+
+	msg := <-cl.ResponsesCh
+	if msg.Error != nil {
+		return []byte{}, msg.Error
+
+	}
+	result := new(ResultEchoBytes)
+	err = json.Unmarshal(msg.Result, result)
+	if err != nil {
+		return []byte{}, nil
+	}
+	return result.Value, nil
+}
+
+func testWithWSClient(t *testing.T, cl *client.WSClient) {
+	val := "acbd"
+	got, err := echoViaWS(cl, val)
+	require.Nil(t, err)
+	assert.Equal(t, got, val)
+
+	val2 := randBytes(t)
+	got2, err := echoBytesViaWS(cl, val2)
+	require.Nil(t, err)
+	assert.Equal(t, got2, val2)
+}
+
+//-------------
+
+func TestServersAndClientsBasic(t *testing.T) {
+	serverAddrs := [...]string{tcpAddr, unixAddr}
+	for _, addr := range serverAddrs {
+		cl1 := client.NewURIClient(addr)
+		fmt.Printf("=== testing server on %s using %v client", addr, cl1)
+		testWithHTTPClient(t, cl1)
+
+		cl2 := client.NewJSONRPCClient(addr)
+		fmt.Printf("=== testing server on %s using %v client", addr, cl2)
+		testWithHTTPClient(t, cl2)
+
+		cl3 := client.NewWSClient(addr, websocketEndpoint)
+		cl3.SetLogger(log.TestingLogger())
+		err := cl3.Start()
+		require.Nil(t, err)
+		fmt.Printf("=== testing server on %s using %v client", addr, cl3)
+		testWithWSClient(t, cl3)
+		cl3.Stop()
+	}
+}
+
+func TestHexStringArg(t *testing.T) {
+	cl := client.NewURIClient(tcpAddr)
+	// should NOT be handled as hex
+	val := "0xabc"
+	got, err := echoViaHTTP(cl, val)
+	require.Nil(t, err)
+	assert.Equal(t, got, val)
+}
+
+func TestQuotedStringArg(t *testing.T) {
+	cl := client.NewURIClient(tcpAddr)
+	// should NOT be unquoted
+	val := "\"abc\""
+	got, err := echoViaHTTP(cl, val)
+	require.Nil(t, err)
+	assert.Equal(t, got, val)
+}
+
+func TestWSNewWSRPCFunc(t *testing.T) {
+	cl := client.NewWSClient(tcpAddr, websocketEndpoint)
+	cl.SetLogger(log.TestingLogger())
+	err := cl.Start()
+	require.Nil(t, err)
+	defer cl.Stop()
+
+	val := "acbd"
+	params := map[string]interface{}{
+		"arg": val,
+	}
+	err = cl.Call(context.Background(), "echo_ws", params)
+	require.Nil(t, err)
+
+	msg := <-cl.ResponsesCh
+	if msg.Error != nil {
+		t.Fatal(err)
+	}
+	result := new(ResultEcho)
+	err = json.Unmarshal(msg.Result, result)
+	require.Nil(t, err)
+	got := result.Value
+	assert.Equal(t, got, val)
+}
+
+func TestWSHandlesArrayParams(t *testing.T) {
+	cl := client.NewWSClient(tcpAddr, websocketEndpoint)
+	cl.SetLogger(log.TestingLogger())
+	err := cl.Start()
+	require.Nil(t, err)
+	defer cl.Stop()
+
+	val := "acbd"
+	params := []interface{}{val}
+	err = cl.CallWithArrayParams(context.Background(), "echo_ws", params)
+	require.Nil(t, err)
+
+	msg := <-cl.ResponsesCh
+	if msg.Error != nil {
+		t.Fatalf("%+v", err)
+	}
+	result := new(ResultEcho)
+	err = json.Unmarshal(msg.Result, result)
+	require.Nil(t, err)
+	got := result.Value
+	assert.Equal(t, got, val)
+}
+
+// TestWSClientPingPong checks that a client & server exchange pings
+// & pongs so connection stays alive.
+func TestWSClientPingPong(t *testing.T) {
+	cl := client.NewWSClient(tcpAddr, websocketEndpoint)
+	cl.SetLogger(log.TestingLogger())
+	err := cl.Start()
+	require.Nil(t, err)
+	defer cl.Stop()
+
+	time.Sleep(6 * time.Second)
+}
+
+func randBytes(t *testing.T) []byte {
+	n := rand.Intn(10) + 2
+	buf := make([]byte, n)
+	_, err := crand.Read(buf)
+	require.Nil(t, err)
+	return bytes.Replace(buf, []byte("="), []byte{100}, -1)
+}
diff --git a/rpc/tm/lib/server/handlers.go b/rpc/tm/lib/server/handlers.go
new file mode 100644
index 0000000000000000000000000000000000000000..8f9e103ed6820ac1a419dad80484d5c98670deb2
--- /dev/null
+++ b/rpc/tm/lib/server/handlers.go
@@ -0,0 +1,771 @@
+package server
+
+import (
+	"bytes"
+	"context"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"reflect"
+	"runtime/debug"
+	"sort"
+	"strings"
+	"time"
+
+	"github.com/gorilla/websocket"
+	"github.com/hyperledger/burrow/consensus/tendermint"
+	"github.com/hyperledger/burrow/logging"
+	"github.com/hyperledger/burrow/logging/structure"
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
+	"github.com/pkg/errors"
+	cmn "github.com/tendermint/tmlibs/common"
+)
+
+// RegisterRPCFuncs adds a route for each function in the funcMap, as well as general jsonrpc and websocket handlers for all functions.
+// "result" is the interface on which the result objects are registered, and is popualted with every RPCResponse
+func RegisterRPCFuncs(mux *http.ServeMux, funcMap map[string]*RPCFunc, logger *logging.Logger) {
+	// HTTP endpoints
+	for funcName, rpcFunc := range funcMap {
+		mux.HandleFunc("/"+funcName, makeHTTPHandler(rpcFunc, logger))
+	}
+
+	// JSONRPC endpoints
+	mux.HandleFunc("/", makeJSONRPCHandler(funcMap, logger))
+}
+
+//-------------------------------------
+// function introspection
+
+// RPCFunc contains the introspected type information for a function
+type RPCFunc struct {
+	f        reflect.Value  // underlying rpc function
+	args     []reflect.Type // type of each function arg
+	returns  []reflect.Type // type of each return arg
+	argNames []string       // name of each argument
+	ws       bool           // websocket only
+}
+
+// NewRPCFunc wraps a function for introspection.
+// f is the function, args are comma separated argument names
+func NewRPCFunc(f interface{}, args string) *RPCFunc {
+	return newRPCFunc(f, args, false)
+}
+
+// NewWSRPCFunc wraps a function for introspection and use in the websockets.
+func NewWSRPCFunc(f interface{}, args string) *RPCFunc {
+	return newRPCFunc(f, args, true)
+}
+
+func newRPCFunc(f interface{}, args string, ws bool) *RPCFunc {
+	var argNames []string
+	if args != "" {
+		argNames = strings.Split(args, ",")
+	}
+	return &RPCFunc{
+		f:        reflect.ValueOf(f),
+		args:     funcArgTypes(f),
+		returns:  funcReturnTypes(f),
+		argNames: argNames,
+		ws:       ws,
+	}
+}
+
+// return a function's argument types
+func funcArgTypes(f interface{}) []reflect.Type {
+	t := reflect.TypeOf(f)
+	n := t.NumIn()
+	typez := make([]reflect.Type, n)
+	for i := 0; i < n; i++ {
+		typez[i] = t.In(i)
+	}
+	return typez
+}
+
+// return a function's return types
+func funcReturnTypes(f interface{}) []reflect.Type {
+	t := reflect.TypeOf(f)
+	n := t.NumOut()
+	typez := make([]reflect.Type, n)
+	for i := 0; i < n; i++ {
+		typez[i] = t.Out(i)
+	}
+	return typez
+}
+
+// function introspection
+//-----------------------------------------------------------------------------
+// rpc.json
+
+// jsonrpc calls grab the given method's function info and runs reflect.Call
+func makeJSONRPCHandler(funcMap map[string]*RPCFunc, logger *logging.Logger) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		b, err := ioutil.ReadAll(r.Body)
+		if err != nil {
+			WriteRPCResponseHTTP(w, types.RPCInvalidRequestError("", errors.Wrap(err, "Error reading request body")))
+			return
+		}
+		// if its an empty request (like from a browser),
+		// just display a list of functions
+		if len(b) == 0 {
+			writeListOfEndpoints(w, r, funcMap)
+			return
+		}
+
+		var request types.RPCRequest
+		err = json.Unmarshal(b, &request)
+		if err != nil {
+			WriteRPCResponseHTTP(w, types.RPCParseError("", errors.Wrap(err, "Error unmarshalling request")))
+			return
+		}
+		// A Notification is a Request object without an "id" member.
+		// The Server MUST NOT reply to a Notification, including those that are within a batch request.
+		if request.ID == "" {
+			logger.TraceMsg("HTTPJSONRPC received a notification, skipping... (please send a non-empty ID if you want to call a method)")
+			return
+		}
+		if len(r.URL.Path) > 1 {
+			WriteRPCResponseHTTP(w, types.RPCInvalidRequestError(request.ID, errors.Errorf("Path %s is invalid", r.URL.Path)))
+			return
+		}
+		rpcFunc := funcMap[request.Method]
+		if rpcFunc == nil || rpcFunc.ws {
+			WriteRPCResponseHTTP(w, types.RPCMethodNotFoundError(request.ID))
+			return
+		}
+		var args []reflect.Value
+		if len(request.Params) > 0 {
+			args, err = jsonParamsToArgsRPC(rpcFunc, request.Params)
+			if err != nil {
+				WriteRPCResponseHTTP(w, types.RPCInvalidParamsError(request.ID, errors.Wrap(err, "Error converting json params to arguments")))
+				return
+			}
+		}
+		returns := rpcFunc.f.Call(args)
+		logger.InfoMsg("HTTP JSONRPC called", "method", request.Method, "args", args, "returns", returns)
+		result, err := unreflectResult(returns)
+		if err != nil {
+			WriteRPCResponseHTTP(w, types.RPCInternalError(request.ID, err))
+			return
+		}
+		WriteRPCResponseHTTP(w, types.NewRPCSuccessResponse(request.ID, result))
+	}
+}
+
+func mapParamsToArgs(rpcFunc *RPCFunc, params map[string]json.RawMessage, argsOffset int) ([]reflect.Value, error) {
+	values := make([]reflect.Value, len(rpcFunc.argNames))
+	for i, argName := range rpcFunc.argNames {
+		argType := rpcFunc.args[i+argsOffset]
+
+		if p, ok := params[argName]; ok && p != nil && len(p) > 0 {
+			val := reflect.New(argType)
+			err := json.Unmarshal(p, val.Interface())
+			if err != nil {
+				return nil, err
+			}
+			values[i] = val.Elem()
+		} else { // use default for that type
+			values[i] = reflect.Zero(argType)
+		}
+	}
+
+	return values, nil
+}
+
+func arrayParamsToArgs(rpcFunc *RPCFunc, params []json.RawMessage, argsOffset int) ([]reflect.Value, error) {
+	if len(rpcFunc.argNames) != len(params) {
+		return nil, errors.Errorf("Expected %v parameters (%v), got %v (%v)",
+			len(rpcFunc.argNames), rpcFunc.argNames, len(params), params)
+	}
+
+	values := make([]reflect.Value, len(params))
+	for i, p := range params {
+		argType := rpcFunc.args[i+argsOffset]
+		val := reflect.New(argType)
+		err := json.Unmarshal(p, val.Interface())
+		if err != nil {
+			return nil, err
+		}
+		values[i] = val.Elem()
+	}
+	return values, nil
+}
+
+// `raw` is unparsed json (from json.RawMessage) encoding either a map or an array.
+// `argsOffset` should be 0 for RPC calls, and 1 for WS requests, where len(rpcFunc.args) != len(rpcFunc.argNames).
+//
+// Example:
+//   rpcFunc.args = [rpctypes.WSRPCContext string]
+//   rpcFunc.argNames = ["arg"]
+func jsonParamsToArgs(rpcFunc *RPCFunc, raw []byte, argsOffset int) ([]reflect.Value, error) {
+
+	// TODO: Make more efficient, perhaps by checking the first character for '{' or '['?
+	// First, try to get the map.
+	var m map[string]json.RawMessage
+	err := json.Unmarshal(raw, &m)
+	if err == nil {
+		return mapParamsToArgs(rpcFunc, m, argsOffset)
+	}
+
+	// Otherwise, try an array.
+	var a []json.RawMessage
+	err = json.Unmarshal(raw, &a)
+	if err == nil {
+		return arrayParamsToArgs(rpcFunc, a, argsOffset)
+	}
+
+	// Otherwise, bad format, we cannot parse
+	return nil, errors.Errorf("Unknown type for JSON params: %v. Expected map or array", err)
+}
+
+// Convert a []interface{} OR a map[string]interface{} to properly typed values
+func jsonParamsToArgsRPC(rpcFunc *RPCFunc, params json.RawMessage) ([]reflect.Value, error) {
+	return jsonParamsToArgs(rpcFunc, params, 0)
+}
+
+// Same as above, but with the first param the websocket connection
+func jsonParamsToArgsWS(rpcFunc *RPCFunc, params json.RawMessage, wsCtx types.WSRPCContext) ([]reflect.Value, error) {
+	values, err := jsonParamsToArgs(rpcFunc, params, 1)
+	if err != nil {
+		return nil, err
+	}
+	return append([]reflect.Value{reflect.ValueOf(wsCtx)}, values...), nil
+}
+
+// rpc.json
+//-----------------------------------------------------------------------------
+// rpc.http
+
+// convert from a function name to the http handler
+func makeHTTPHandler(rpcFunc *RPCFunc, logger *logging.Logger) func(http.ResponseWriter, *http.Request) {
+	// Exception for websocket endpoints
+	if rpcFunc.ws {
+		return func(w http.ResponseWriter, r *http.Request) {
+			WriteRPCResponseHTTP(w, types.RPCMethodNotFoundError(""))
+		}
+	}
+	logger = logger.WithScope("makeHTTPHandler")
+	// All other endpoints
+	return func(w http.ResponseWriter, r *http.Request) {
+		logger.TraceMsg("HTTP REST Handler received request", "request", r)
+		args, err := httpParamsToArgs(rpcFunc, r)
+		if err != nil {
+			WriteRPCResponseHTTP(w, types.RPCInvalidParamsError("", errors.Wrap(err, "Error converting http params to arguments")))
+			return
+		}
+		returns := rpcFunc.f.Call(args)
+		logger.InfoMsg("HTTP REST", "method", r.URL.Path, "args", args, "returns", returns)
+		result, err := unreflectResult(returns)
+		if err != nil {
+			WriteRPCResponseHTTP(w, types.RPCInternalError("", err))
+			return
+		}
+		WriteRPCResponseHTTP(w, types.NewRPCSuccessResponse("", result))
+	}
+}
+
+// Covert an http query to a list of properly typed values.
+// To be properly decoded the arg must be a concrete type from tendermint (if its an interface).
+func httpParamsToArgs(rpcFunc *RPCFunc, r *http.Request) ([]reflect.Value, error) {
+	values := make([]reflect.Value, len(rpcFunc.args))
+
+	for i, name := range rpcFunc.argNames {
+		argType := rpcFunc.args[i]
+
+		values[i] = reflect.Zero(argType) // set default for that type
+
+		arg := GetParam(r, name)
+		// log.Notice("param to arg", "argType", argType, "name", name, "arg", arg)
+
+		if "" == arg {
+			continue
+		}
+
+		v, err, ok := nonJSONToArg(argType, arg)
+		if err != nil {
+			return nil, err
+		}
+		if ok {
+			values[i] = v
+			continue
+		}
+
+		values[i], err = jsonStringToArg(argType, arg)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return values, nil
+}
+
+func jsonStringToArg(ty reflect.Type, arg string) (reflect.Value, error) {
+	v := reflect.New(ty)
+	err := json.Unmarshal([]byte(arg), v.Interface())
+	if err != nil {
+		return v, err
+	}
+	v = v.Elem()
+	return v, nil
+}
+
+func nonJSONToArg(ty reflect.Type, arg string) (reflect.Value, error, bool) {
+	isQuotedString := strings.HasPrefix(arg, `"`) && strings.HasSuffix(arg, `"`)
+	isHexString := strings.HasPrefix(strings.ToLower(arg), "0x")
+	expectingString := ty.Kind() == reflect.String
+	expectingByteSlice := ty.Kind() == reflect.Slice && ty.Elem().Kind() == reflect.Uint8
+
+	if isHexString {
+		if !expectingString && !expectingByteSlice {
+			err := errors.Errorf("Got a hex string arg, but expected '%s'",
+				ty.Kind().String())
+			return reflect.ValueOf(nil), err, false
+		}
+
+		var value []byte
+		value, err := hex.DecodeString(arg[2:])
+		if err != nil {
+			return reflect.ValueOf(nil), err, false
+		}
+		if ty.Kind() == reflect.String {
+			return reflect.ValueOf(string(value)), nil, true
+		}
+		return reflect.ValueOf([]byte(value)), nil, true
+	}
+
+	if isQuotedString && expectingByteSlice {
+		v := reflect.New(reflect.TypeOf(""))
+		err := json.Unmarshal([]byte(arg), v.Interface())
+		if err != nil {
+			return reflect.ValueOf(nil), err, false
+		}
+		v = v.Elem()
+		return reflect.ValueOf([]byte(v.String())), nil, true
+	}
+
+	return reflect.ValueOf(nil), nil, false
+}
+
+// rpc.http
+//-----------------------------------------------------------------------------
+// rpc.websocket
+
+const (
+	defaultWSWriteChanCapacity = 1000
+	defaultWSWriteWait         = 10 * time.Second
+	defaultWSReadWait          = 30 * time.Second
+	defaultWSPingPeriod        = (defaultWSReadWait * 9) / 10
+)
+
+// A single websocket connection contains listener id, underlying ws
+// connection, and the event switch for subscribing to events.
+//
+// In case of an error, the connection is stopped.
+type wsConnection struct {
+	cmn.BaseService
+
+	remoteAddr string
+	baseConn   *websocket.Conn
+	writeChan  chan types.RPCResponse
+
+	funcMap map[string]*RPCFunc
+
+	// write channel capacity
+	writeChanCapacity int
+
+	// each write times out after this.
+	writeWait time.Duration
+
+	// Connection times out if we haven't received *anything* in this long, not even pings.
+	readWait time.Duration
+
+	// Send pings to server with this period. Must be less than readWait, but greater than zero.
+	pingPeriod time.Duration
+
+	// object that is used to subscribe / unsubscribe from events
+	eventSub types.EventSubscriber
+}
+
+// NewWSConnection wraps websocket.Conn.
+//
+// See the commentary on the func(*wsConnection) functions for a detailed
+// description of how to configure ping period and pong wait time. NOTE: if the
+// write buffer is full, pongs may be dropped, which may cause clients to
+// disconnect. see https://github.com/gorilla/websocket/issues/97
+func NewWSConnection(baseConn *websocket.Conn, funcMap map[string]*RPCFunc,
+	logger *logging.Logger, options ...func(*wsConnection)) *wsConnection {
+	wsc := &wsConnection{
+		remoteAddr:        baseConn.RemoteAddr().String(),
+		baseConn:          baseConn,
+		funcMap:           funcMap,
+		writeWait:         defaultWSWriteWait,
+		writeChanCapacity: defaultWSWriteChanCapacity,
+		readWait:          defaultWSReadWait,
+		pingPeriod:        defaultWSPingPeriod,
+	}
+	for _, option := range options {
+		option(wsc)
+	}
+
+	wsc.BaseService = *cmn.NewBaseService(tendermint.NewLogger(logger.With("remote", baseConn.RemoteAddr())),
+		"wsConnection", wsc)
+	return wsc
+}
+
+// EventSubscriber sets object that is used to subscribe / unsubscribe from
+// events - not Goroutine-safe. If none given, default node's eventBus will be
+// used.
+func EventSubscriber(eventSub types.EventSubscriber) func(*wsConnection) {
+	return func(wsc *wsConnection) {
+		wsc.eventSub = eventSub
+	}
+}
+
+// WriteWait sets the amount of time to wait before a websocket write times out.
+// It should only be used in the constructor - not Goroutine-safe.
+func WriteWait(writeWait time.Duration) func(*wsConnection) {
+	return func(wsc *wsConnection) {
+		wsc.writeWait = writeWait
+	}
+}
+
+// WriteChanCapacity sets the capacity of the websocket write channel.
+// It should only be used in the constructor - not Goroutine-safe.
+func WriteChanCapacity(cap int) func(*wsConnection) {
+	return func(wsc *wsConnection) {
+		wsc.writeChanCapacity = cap
+	}
+}
+
+// ReadWait sets the amount of time to wait before a websocket read times out.
+// It should only be used in the constructor - not Goroutine-safe.
+func ReadWait(readWait time.Duration) func(*wsConnection) {
+	return func(wsc *wsConnection) {
+		wsc.readWait = readWait
+	}
+}
+
+// PingPeriod sets the duration for sending websocket pings.
+// It should only be used in the constructor - not Goroutine-safe.
+func PingPeriod(pingPeriod time.Duration) func(*wsConnection) {
+	return func(wsc *wsConnection) {
+		wsc.pingPeriod = pingPeriod
+	}
+}
+
+// OnStart implements cmn.Service by starting the read and write routines. It
+// blocks until the connection closes.
+func (wsc *wsConnection) OnStart() error {
+	wsc.writeChan = make(chan types.RPCResponse, wsc.writeChanCapacity)
+
+	// Read subscriptions/unsubscriptions to events
+	go wsc.readRoutine()
+	// Write responses, BLOCKING.
+	wsc.writeRoutine()
+
+	return nil
+}
+
+// OnStop implements cmn.Service by unsubscribing remoteAddr from all subscriptions.
+func (wsc *wsConnection) OnStop() {
+	// Both read and write loops close the websocket connection when they exit their loops.
+	// The writeChan is never closed, to allow WriteRPCResponse() to fail.
+	if wsc.eventSub != nil {
+		wsc.eventSub.UnsubscribeAll(context.TODO(), wsc.remoteAddr)
+	}
+}
+
+// GetRemoteAddr returns the remote address of the underlying connection.
+// It implements WSRPCConnection
+func (wsc *wsConnection) GetRemoteAddr() string {
+	return wsc.remoteAddr
+}
+
+// GetEventSubscriber implements WSRPCConnection by returning event subscriber.
+func (wsc *wsConnection) GetEventSubscriber() types.EventSubscriber {
+	return wsc.eventSub
+}
+
+// WriteRPCResponse pushes a response to the writeChan, and blocks until it is accepted.
+// It implements WSRPCConnection. It is Goroutine-safe.
+func (wsc *wsConnection) WriteRPCResponse(resp types.RPCResponse) {
+	select {
+	case <-wsc.Quit():
+		return
+	case wsc.writeChan <- resp:
+	}
+}
+
+// TryWriteRPCResponse attempts to push a response to the writeChan, but does not block.
+// It implements WSRPCConnection. It is Goroutine-safe
+func (wsc *wsConnection) TryWriteRPCResponse(resp types.RPCResponse) bool {
+	select {
+	case <-wsc.Quit():
+		return false
+	case wsc.writeChan <- resp:
+		return true
+	default:
+		return false
+	}
+}
+
+// Read from the socket and subscribe to or unsubscribe from events
+func (wsc *wsConnection) readRoutine() {
+	defer func() {
+		if r := recover(); r != nil {
+			err, ok := r.(error)
+			if !ok {
+				err = fmt.Errorf("WSJSONRPC: %v", r)
+			}
+			wsc.Logger.Error("Panic in WSJSONRPC handler", "err", err, "stack", string(debug.Stack()))
+			wsc.WriteRPCResponse(types.RPCInternalError("unknown", err))
+			go wsc.readRoutine()
+		} else {
+			wsc.baseConn.Close() // nolint: errcheck
+		}
+	}()
+
+	wsc.baseConn.SetPongHandler(func(m string) error {
+		return wsc.baseConn.SetReadDeadline(time.Now().Add(wsc.readWait))
+	})
+
+	for {
+		select {
+		case <-wsc.Quit():
+			return
+		default:
+			// reset deadline for every type of message (control or data)
+			if err := wsc.baseConn.SetReadDeadline(time.Now().Add(wsc.readWait)); err != nil {
+				wsc.Logger.Error("failed to set read deadline", "err", err)
+			}
+			var in []byte
+			_, in, err := wsc.baseConn.ReadMessage()
+			if err != nil {
+				if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
+					wsc.Logger.Info("Client closed the connection")
+				} else {
+					wsc.Logger.Error("Failed to read request", "err", err)
+				}
+				wsc.Stop()
+				return
+			}
+
+			var request types.RPCRequest
+			err = json.Unmarshal(in, &request)
+			if err != nil {
+				wsc.WriteRPCResponse(types.RPCParseError("", errors.Wrap(err, "Error unmarshaling request")))
+				continue
+			}
+
+			// A Notification is a Request object without an "id" member.
+			// The Server MUST NOT reply to a Notification, including those that are within a batch request.
+			if request.ID == "" {
+				wsc.Logger.Debug("WSJSONRPC received a notification, skipping... (please send a non-empty ID if you want to call a method)")
+				continue
+			}
+
+			// Now, fetch the RPCFunc and execute it.
+
+			rpcFunc := wsc.funcMap[request.Method]
+			if rpcFunc == nil {
+				wsc.WriteRPCResponse(types.RPCMethodNotFoundError(request.ID))
+				continue
+			}
+			var args []reflect.Value
+			if rpcFunc.ws {
+				wsCtx := types.WSRPCContext{Request: request, WSRPCConnection: wsc}
+				if len(request.Params) > 0 {
+					args, err = jsonParamsToArgsWS(rpcFunc, request.Params, wsCtx)
+				}
+			} else {
+				if len(request.Params) > 0 {
+					args, err = jsonParamsToArgsRPC(rpcFunc, request.Params)
+				}
+			}
+			if err != nil {
+				wsc.WriteRPCResponse(types.RPCInternalError(request.ID, errors.Wrap(err, "Error converting json params to arguments")))
+				continue
+			}
+			returns := rpcFunc.f.Call(args)
+
+			// TODO: Need to encode args/returns to string if we want to log them
+			wsc.Logger.Info("WSJSONRPC", "method", request.Method)
+
+			result, err := unreflectResult(returns)
+			if err != nil {
+				wsc.WriteRPCResponse(types.RPCInternalError(request.ID, err))
+				continue
+			} else {
+				wsc.WriteRPCResponse(types.NewRPCSuccessResponse(request.ID, result))
+				continue
+			}
+
+		}
+	}
+}
+
+// receives on a write channel and writes out on the socket
+func (wsc *wsConnection) writeRoutine() {
+	pingTicker := time.NewTicker(wsc.pingPeriod)
+	defer func() {
+		pingTicker.Stop()
+		if err := wsc.baseConn.Close(); err != nil {
+			wsc.Logger.Error("Error closing connection", "err", err)
+		}
+	}()
+
+	// https://github.com/gorilla/websocket/issues/97
+	pongs := make(chan string, 1)
+	wsc.baseConn.SetPingHandler(func(m string) error {
+		select {
+		case pongs <- m:
+		default:
+		}
+		return nil
+	})
+
+	for {
+		select {
+		case m := <-pongs:
+			err := wsc.writeMessageWithDeadline(websocket.PongMessage, []byte(m))
+			if err != nil {
+				wsc.Logger.Info("Failed to write pong (client may disconnect)", "err", err)
+			}
+		case <-pingTicker.C:
+			err := wsc.writeMessageWithDeadline(websocket.PingMessage, []byte{})
+			if err != nil {
+				wsc.Logger.Error("Failed to write ping", "err", err)
+				wsc.Stop()
+				return
+			}
+		case msg := <-wsc.writeChan:
+			jsonBytes, err := json.MarshalIndent(msg, "", "  ")
+			if err != nil {
+				wsc.Logger.Error("Failed to marshal RPCResponse to JSON", "err", err)
+			} else {
+				if err = wsc.writeMessageWithDeadline(websocket.TextMessage, jsonBytes); err != nil {
+					wsc.Logger.Error("Failed to write response", "err", err)
+					wsc.Stop()
+					return
+				}
+			}
+		case <-wsc.Quit():
+			return
+		}
+	}
+}
+
+// All writes to the websocket must (re)set the write deadline.
+// If some writes don't set it while others do, they may timeout incorrectly (https://github.com/tendermint/tendermint/issues/553)
+func (wsc *wsConnection) writeMessageWithDeadline(msgType int, msg []byte) error {
+	if err := wsc.baseConn.SetWriteDeadline(time.Now().Add(wsc.writeWait)); err != nil {
+		return err
+	}
+	return wsc.baseConn.WriteMessage(msgType, msg)
+}
+
+//----------------------------------------
+
+// WebsocketManager is the main manager for all websocket connections.
+// It holds the event switch and a map of functions for routing.
+// NOTE: The websocket path is defined externally, e.g. in node/node.go
+type WebsocketManager struct {
+	websocket.Upgrader
+	funcMap       map[string]*RPCFunc
+	logger        *logging.Logger
+	wsConnOptions []func(*wsConnection)
+}
+
+// NewWebsocketManager returns a new WebsocketManager that routes according to
+// the given funcMap and connects to the server with the given connection
+// options.
+func NewWebsocketManager(funcMap map[string]*RPCFunc, logger *logging.Logger,
+	wsConnOptions ...func(*wsConnection)) *WebsocketManager {
+	return &WebsocketManager{
+		funcMap: funcMap,
+		Upgrader: websocket.Upgrader{
+			CheckOrigin: func(r *http.Request) bool {
+				// TODO ???
+				return true
+			},
+		},
+		logger:        logger,
+		wsConnOptions: wsConnOptions,
+	}
+}
+
+// WebsocketHandler upgrades the request/response (via http.Hijack) and starts the wsConnection.
+func (wm *WebsocketManager) WebsocketHandler(w http.ResponseWriter, r *http.Request) {
+	wsConn, err := wm.Upgrade(w, r, nil)
+	if err != nil {
+		// TODO - return http error
+		wm.logger.TraceMsg("Failed to upgrade to websocket connection", structure.ErrorKey, err)
+		return
+	}
+
+	// register connection
+	con := NewWSConnection(wsConn, wm.funcMap, wm.logger, wm.wsConnOptions...)
+	wm.logger.InfoMsg("New websocket connection", "remote_address", con.remoteAddr)
+	err = con.Start() // Blocking
+	if err != nil {
+		wm.logger.TraceMsg("Error starting connection", structure.ErrorKey, err)
+	}
+}
+
+// rpc.websocket
+//-----------------------------------------------------------------------------
+
+// NOTE: assume returns is result struct and error. If error is not nil, return it
+func unreflectResult(returns []reflect.Value) (interface{}, error) {
+	errV := returns[1]
+	if errV.Interface() != nil {
+		return nil, errors.Errorf("%v", errV.Interface())
+	}
+	rv := returns[0]
+	// the result is a registered interface,
+	// we need a pointer to it so we can marshal with type byte
+	rvp := reflect.New(rv.Type())
+	rvp.Elem().Set(rv)
+	return rvp.Interface(), nil
+}
+
+// writes a list of available rpc endpoints as an html page
+func writeListOfEndpoints(w http.ResponseWriter, r *http.Request, funcMap map[string]*RPCFunc) {
+	noArgNames := []string{}
+	argNames := []string{}
+	for name, funcData := range funcMap {
+		if len(funcData.args) == 0 {
+			noArgNames = append(noArgNames, name)
+		} else {
+			argNames = append(argNames, name)
+		}
+	}
+	sort.Strings(noArgNames)
+	sort.Strings(argNames)
+	buf := new(bytes.Buffer)
+	buf.WriteString("<html><body>")
+	buf.WriteString("<br>Available endpoints:<br>")
+
+	for _, name := range noArgNames {
+		link := fmt.Sprintf("//%s/%s", r.Host, name)
+		buf.WriteString(fmt.Sprintf("<a href=\"%s\">%s</a></br>", link, link))
+	}
+
+	buf.WriteString("<br>Endpoints that require arguments:<br>")
+	for _, name := range argNames {
+		link := fmt.Sprintf("//%s/%s?", r.Host, name)
+		funcData := funcMap[name]
+		for i, argName := range funcData.argNames {
+			link += argName + "=_"
+			if i < len(funcData.argNames)-1 {
+				link += "&"
+			}
+		}
+		buf.WriteString(fmt.Sprintf("<a href=\"%s\">%s</a></br>", link, link))
+	}
+	buf.WriteString("</body></html>")
+	w.Header().Set("Content-Type", "text/html")
+	w.WriteHeader(200)
+	w.Write(buf.Bytes()) // nolint: errcheck
+}
diff --git a/rpc/tm/lib/server/handlers_test.go b/rpc/tm/lib/server/handlers_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..44bebb0ec7638352e2ad6d91b62e2fe0a5b47420
--- /dev/null
+++ b/rpc/tm/lib/server/handlers_test.go
@@ -0,0 +1,93 @@
+package server
+
+import (
+	"encoding/json"
+	"io/ioutil"
+	"net/http"
+	"net/http/httptest"
+	"strings"
+	"testing"
+
+	"github.com/hyperledger/burrow/logging"
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func testMux() *http.ServeMux {
+	funcMap := map[string]*RPCFunc{
+		"c": NewRPCFunc(func(s string, i int) (string, error) { return "foo", nil }, "s,i"),
+	}
+	mux := http.NewServeMux()
+	logger := logging.NewNoopLogger()
+	RegisterRPCFuncs(mux, funcMap, logger)
+
+	return mux
+}
+
+func statusOK(code int) bool { return code >= 200 && code <= 299 }
+
+// Ensure that nefarious/unintended inputs to `params`
+// do not crash our RPC handlers.
+// See Issue https://github.com/tendermint/tendermint/issues/708.
+func TestRPCParams(t *testing.T) {
+	mux := testMux()
+	tests := []struct {
+		payload string
+		wantErr string
+	}{
+		// bad
+		{`{"jsonrpc": "2.0", "id": "0"}`, "Method not found"},
+		{`{"jsonrpc": "2.0", "method": "y", "id": "0"}`, "Method not found"},
+		{`{"method": "c", "id": "0", "params": a}`, "invalid character"},
+		{`{"method": "c", "id": "0", "params": ["a"]}`, "got 1"},
+		{`{"method": "c", "id": "0", "params": ["a", "b"]}`, "of type int"},
+		{`{"method": "c", "id": "0", "params": [1, 1]}`, "of type string"},
+
+		// good
+		{`{"jsonrpc": "2.0", "method": "c", "id": "0", "params": null}`, ""},
+		{`{"method": "c", "id": "0", "params": {}}`, ""},
+		{`{"method": "c", "id": "0", "params": ["a", 10]}`, ""},
+	}
+
+	for i, tt := range tests {
+		req, _ := http.NewRequest("POST", "http://localhost/", strings.NewReader(tt.payload))
+		rec := httptest.NewRecorder()
+		mux.ServeHTTP(rec, req)
+		res := rec.Result()
+		// Always expecting back a JSONRPCResponse
+		assert.True(t, statusOK(res.StatusCode), "#%d: should always return 2XX", i)
+		blob, err := ioutil.ReadAll(res.Body)
+		if err != nil {
+			t.Errorf("#%d: err reading body: %v", i, err)
+			continue
+		}
+
+		recv := new(types.RPCResponse)
+		assert.Nil(t, json.Unmarshal(blob, recv), "#%d: expecting successful parsing of an RPCResponse:\nblob: %s", i, blob)
+		assert.NotEqual(t, recv, new(types.RPCResponse), "#%d: not expecting a blank RPCResponse", i)
+
+		if tt.wantErr == "" {
+			assert.Nil(t, recv.Error, "#%d: not expecting an error", i)
+		} else {
+			assert.True(t, recv.Error.Code < 0, "#%d: not expecting a positive JSONRPC code", i)
+			// The wanted error is either in the message or the data
+			assert.Contains(t, recv.Error.Message+recv.Error.Data, tt.wantErr, "#%d: expected substring", i)
+		}
+	}
+}
+
+func TestRPCNotification(t *testing.T) {
+	mux := testMux()
+	body := strings.NewReader(`{"jsonrpc": "2.0"}`)
+	req, _ := http.NewRequest("POST", "http://localhost/", body)
+	rec := httptest.NewRecorder()
+	mux.ServeHTTP(rec, req)
+	res := rec.Result()
+
+	// Always expecting back a JSONRPCResponse
+	require.True(t, statusOK(res.StatusCode), "should always return 2XX")
+	blob, err := ioutil.ReadAll(res.Body)
+	require.Nil(t, err, "reading from the body should not give back an error")
+	require.Equal(t, len(blob), 0, "a notification SHOULD NOT be responded to by the server")
+}
diff --git a/rpc/tm/lib/server/http_params.go b/rpc/tm/lib/server/http_params.go
new file mode 100644
index 0000000000000000000000000000000000000000..248e451b2d9fc5d8f61286cb39966a012a3b3122
--- /dev/null
+++ b/rpc/tm/lib/server/http_params.go
@@ -0,0 +1,90 @@
+package server
+
+import (
+	"net/http"
+	"regexp"
+	"strconv"
+
+	"github.com/pkg/errors"
+	"github.com/tmthrgd/go-hex"
+)
+
+var (
+	// Parts of regular expressions
+	atom    = "[A-Z0-9!#$%&'*+\\-/=?^_`{|}~]+"
+	dotAtom = atom + `(?:\.` + atom + `)*`
+	domain  = `[A-Z0-9.-]+\.[A-Z]{2,4}`
+
+	RE_HEX     = regexp.MustCompile(`^(?i)[a-f0-9]+$`)
+	RE_EMAIL   = regexp.MustCompile(`^(?i)(` + dotAtom + `)@(` + dotAtom + `)$`)
+	RE_ADDRESS = regexp.MustCompile(`^(?i)[a-z0-9]{25,34}$`)
+	RE_HOST    = regexp.MustCompile(`^(?i)(` + domain + `)$`)
+
+	//RE_ID12       = regexp.MustCompile(`^[a-zA-Z0-9]{12}$`)
+)
+
+func GetParam(r *http.Request, param string) string {
+	s := r.URL.Query().Get(param)
+	if s == "" {
+		s = r.FormValue(param)
+	}
+	return s
+}
+
+func GetParamByteSlice(r *http.Request, param string) ([]byte, error) {
+	s := GetParam(r, param)
+	return hex.DecodeString(s)
+}
+
+func GetParamInt64(r *http.Request, param string) (int64, error) {
+	s := GetParam(r, param)
+	i, err := strconv.ParseInt(s, 10, 64)
+	if err != nil {
+		return 0, errors.Errorf(param, err.Error())
+	}
+	return i, nil
+}
+
+func GetParamInt32(r *http.Request, param string) (int32, error) {
+	s := GetParam(r, param)
+	i, err := strconv.ParseInt(s, 10, 32)
+	if err != nil {
+		return 0, errors.Errorf(param, err.Error())
+	}
+	return int32(i), nil
+}
+
+func GetParamUint64(r *http.Request, param string) (uint64, error) {
+	s := GetParam(r, param)
+	i, err := strconv.ParseUint(s, 10, 64)
+	if err != nil {
+		return 0, errors.Errorf(param, err.Error())
+	}
+	return i, nil
+}
+
+func GetParamUint(r *http.Request, param string) (uint, error) {
+	s := GetParam(r, param)
+	i, err := strconv.ParseUint(s, 10, 64)
+	if err != nil {
+		return 0, errors.Errorf(param, err.Error())
+	}
+	return uint(i), nil
+}
+
+func GetParamRegexp(r *http.Request, param string, re *regexp.Regexp) (string, error) {
+	s := GetParam(r, param)
+	if !re.MatchString(s) {
+		return "", errors.Errorf(param, "Did not match regular expression %v", re.String())
+	}
+	return s, nil
+}
+
+func GetParamFloat64(r *http.Request, param string) (float64, error) {
+	s := GetParam(r, param)
+	f, err := strconv.ParseFloat(s, 64)
+	if err != nil {
+		return 0, errors.Errorf(param, err.Error())
+	}
+	return f, nil
+}
diff --git a/rpc/tm/lib/server/http_server.go b/rpc/tm/lib/server/http_server.go
new file mode 100644
index 0000000000000000000000000000000000000000..dfb350f9c553a83fb31f79437835bdfc7ab21002
--- /dev/null
+++ b/rpc/tm/lib/server/http_server.go
@@ -0,0 +1,120 @@
+// Commons for HTTP handling
+package server
+
+import (
+	"bufio"
+	"encoding/json"
+	"fmt"
+	"net"
+	"net/http"
+	"runtime/debug"
+	"strings"
+	"time"
+
+	"github.com/hyperledger/burrow/logging"
+	"github.com/hyperledger/burrow/logging/structure"
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
+	"github.com/pkg/errors"
+)
+
+func StartHTTPServer(listenAddr string, handler http.Handler, logger *logging.Logger) (listener net.Listener, err error) {
+	var proto, addr string
+	parts := strings.SplitN(listenAddr, "://", 2)
+	if len(parts) != 2 {
+		return nil, errors.Errorf("Invalid listening address %s (use fully formed addresses, including the tcp:// or unix:// prefix)", listenAddr)
+	}
+	proto, addr = parts[0], parts[1]
+
+	logger.InfoMsg("Starting RPC HTTP server", "listen_address", listenAddr)
+	listener, err = net.Listen(proto, addr)
+	if err != nil {
+		return nil, errors.Errorf("Failed to listen on %v: %v", listenAddr, err)
+	}
+
+	go func() {
+		err := http.Serve(
+			listener,
+			RecoverAndLogHandler(handler, logger),
+		)
+		logger.TraceMsg("RPC HTTP server stopped", structure.ErrorKey, err)
+	}()
+	return listener, nil
+}
+
+func WriteRPCResponseHTTP(w http.ResponseWriter, res types.RPCResponse) {
+	jsonBytes, err := json.MarshalIndent(res, "", "  ")
+	if err != nil {
+		panic(err)
+	}
+	w.Header().Set("Content-Type", "application/json")
+	w.WriteHeader(200)
+	w.Write(jsonBytes) // nolint: errcheck, gas
+}
+
+//-----------------------------------------------------------------------------
+
+// Wraps an HTTP handler, adding error logging.
+// If the inner function panics, the outer function recovers, logs, sends an
+// HTTP 500 error response.
+func RecoverAndLogHandler(handler http.Handler, logger *logging.Logger) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		// Wrap the ResponseWriter to remember the status
+		rww := &ResponseWriterWrapper{-1, w}
+		begin := time.Now()
+
+		// Common headers
+		origin := r.Header.Get("Origin")
+		rww.Header().Set("Access-Control-Allow-Origin", origin)
+		rww.Header().Set("Access-Control-Allow-Credentials", "true")
+		rww.Header().Set("Access-Control-Expose-Headers", "X-Server-Time")
+		rww.Header().Set("X-Server-Time", fmt.Sprintf("%v", begin.Unix()))
+
+		defer func() {
+			// Send a 500 error if a panic happens during a handler.
+			// Without this, Chrome & Firefox were retrying aborted ajax requests,
+			// at least to my localhost.
+			if e := recover(); e != nil {
+
+				// If RPCResponse
+				if res, ok := e.(types.RPCResponse); ok {
+					WriteRPCResponseHTTP(rww, res)
+				} else {
+					// For the rest,
+					logger.TraceMsg("Panic in RPC HTTP handler", structure.ErrorKey, e,
+						"stack", string(debug.Stack()))
+					rww.WriteHeader(http.StatusInternalServerError)
+					WriteRPCResponseHTTP(rww, types.RPCInternalError("", e.(error)))
+				}
+			}
+
+			// Finally, log.
+			durationMS := time.Since(begin).Nanoseconds() / 1000000
+			if rww.Status == -1 {
+				rww.Status = 200
+			}
+			logger.InfoMsg("Served RPC HTTP response",
+				"method", r.Method, "url", r.URL,
+				"status", rww.Status, "duration", durationMS,
+				"remote_address", r.RemoteAddr,
+			)
+		}()
+
+		handler.ServeHTTP(rww, r)
+	})
+}
+
+// Remember the status for logging
+type ResponseWriterWrapper struct {
+	Status int
+	http.ResponseWriter
+}
+
+func (w *ResponseWriterWrapper) WriteHeader(status int) {
+	w.Status = status
+	w.ResponseWriter.WriteHeader(status)
+}
+
+// implements http.Hijacker
+func (w *ResponseWriterWrapper) Hijack() (net.Conn, *bufio.ReadWriter, error) {
+	return w.ResponseWriter.(http.Hijacker).Hijack()
+}
diff --git a/rpc/tm/lib/server/parse_test.go b/rpc/tm/lib/server/parse_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..0b5550c23a06878f1a0a5523fbb7317a68f95d79
--- /dev/null
+++ b/rpc/tm/lib/server/parse_test.go
@@ -0,0 +1,174 @@
+package server
+
+import (
+	"encoding/json"
+	"strconv"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	cmn "github.com/tendermint/tmlibs/common"
+)
+
+func TestParseJSONMap(t *testing.T) {
+	assert := assert.New(t)
+
+	input := []byte(`{"value":"1234","height":22}`)
+
+	// naive is float,string
+	var p1 map[string]interface{}
+	err := json.Unmarshal(input, &p1)
+	if assert.Nil(err) {
+		h, ok := p1["height"].(float64)
+		if assert.True(ok, "%#v", p1["height"]) {
+			assert.EqualValues(22, h)
+		}
+		v, ok := p1["value"].(string)
+		if assert.True(ok, "%#v", p1["value"]) {
+			assert.EqualValues("1234", v)
+		}
+	}
+
+	// preloading map with values doesn't help
+	tmp := 0
+	p2 := map[string]interface{}{
+		"value":  &cmn.HexBytes{},
+		"height": &tmp,
+	}
+	err = json.Unmarshal(input, &p2)
+	if assert.Nil(err) {
+		h, ok := p2["height"].(float64)
+		if assert.True(ok, "%#v", p2["height"]) {
+			assert.EqualValues(22, h)
+		}
+		v, ok := p2["value"].(string)
+		if assert.True(ok, "%#v", p2["value"]) {
+			assert.EqualValues("1234", v)
+		}
+	}
+
+	// preload here with *pointers* to the desired types
+	// struct has unknown types, but hard-coded keys
+	tmp = 0
+	p3 := struct {
+		Value  interface{} `json:"value"`
+		Height interface{} `json:"height"`
+	}{
+		Height: &tmp,
+		Value:  &cmn.HexBytes{},
+	}
+	err = json.Unmarshal(input, &p3)
+	if assert.Nil(err) {
+		h, ok := p3.Height.(*int)
+		if assert.True(ok, "%#v", p3.Height) {
+			assert.Equal(22, *h)
+		}
+		v, ok := p3.Value.(*cmn.HexBytes)
+		if assert.True(ok, "%#v", p3.Value) {
+			assert.EqualValues([]byte{0x12, 0x34}, *v)
+		}
+	}
+
+	// simplest solution, but hard-coded
+	p4 := struct {
+		Value  cmn.HexBytes `json:"value"`
+		Height int          `json:"height"`
+	}{}
+	err = json.Unmarshal(input, &p4)
+	if assert.Nil(err) {
+		assert.EqualValues(22, p4.Height)
+		assert.EqualValues([]byte{0x12, 0x34}, p4.Value)
+	}
+
+	// so, let's use this trick...
+	// dynamic keys on map, and we can deserialize to the desired types
+	var p5 map[string]*json.RawMessage
+	err = json.Unmarshal(input, &p5)
+	if assert.Nil(err) {
+		var h int
+		err = json.Unmarshal(*p5["height"], &h)
+		if assert.Nil(err) {
+			assert.Equal(22, h)
+		}
+
+		var v cmn.HexBytes
+		err = json.Unmarshal(*p5["value"], &v)
+		if assert.Nil(err) {
+			assert.Equal(cmn.HexBytes{0x12, 0x34}, v)
+		}
+	}
+}
+
+func TestParseJSONArray(t *testing.T) {
+	assert := assert.New(t)
+
+	input := []byte(`["1234",22]`)
+
+	// naive is float,string
+	var p1 []interface{}
+	err := json.Unmarshal(input, &p1)
+	if assert.Nil(err) {
+		v, ok := p1[0].(string)
+		if assert.True(ok, "%#v", p1[0]) {
+			assert.EqualValues("1234", v)
+		}
+		h, ok := p1[1].(float64)
+		if assert.True(ok, "%#v", p1[1]) {
+			assert.EqualValues(22, h)
+		}
+	}
+
+	// preloading map with values helps here (unlike map - p2 above)
+	tmp := 0
+	p2 := []interface{}{&cmn.HexBytes{}, &tmp}
+	err = json.Unmarshal(input, &p2)
+	if assert.Nil(err) {
+		v, ok := p2[0].(*cmn.HexBytes)
+		if assert.True(ok, "%#v", p2[0]) {
+			assert.EqualValues([]byte{0x12, 0x34}, *v)
+		}
+		h, ok := p2[1].(*int)
+		if assert.True(ok, "%#v", p2[1]) {
+			assert.EqualValues(22, *h)
+		}
+	}
+}
+
+func TestParseRPC(t *testing.T) {
+	assert := assert.New(t)
+
+	demo := func(height int, name string) {}
+	call := NewRPCFunc(demo, "height,name")
+
+	cases := []struct {
+		raw    string
+		height int64
+		name   string
+		fail   bool
+	}{
+		// should parse
+		{`[7, "flew"]`, 7, "flew", false},
+		{`{"name": "john", "height": 22}`, 22, "john", false},
+		// defaults
+		{`{"name": "solo", "unused": "stuff"}`, 0, "solo", false},
+		// should fail - wrong types/length
+		{`["flew", 7]`, 0, "", true},
+		{`[7,"flew",100]`, 0, "", true},
+		{`{"name": -12, "height": "fred"}`, 0, "", true},
+	}
+	for idx, tc := range cases {
+		i := strconv.Itoa(idx)
+		data := []byte(tc.raw)
+		vals, err := jsonParamsToArgs(call, data, 0)
+		if tc.fail {
+			assert.NotNil(err, i)
+		} else {
+			assert.Nil(err, "%s: %+v", i, err)
+			if assert.Equal(2, len(vals), i) {
+				assert.Equal(tc.height, vals[0].Int(), i)
+				assert.Equal(tc.name, vals[1].String(), i)
+			}
+		}
+
+	}
+
+}
diff --git a/rpc/tm/lib/types/types.go b/rpc/tm/lib/types/types.go
new file mode 100644
index 0000000000000000000000000000000000000000..42a7a219540c8305f51a940820d0e3870f54eceb
--- /dev/null
+++ b/rpc/tm/lib/types/types.go
@@ -0,0 +1,183 @@
+package types
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"strings"
+
+	"github.com/pkg/errors"
+	tmpubsub "github.com/tendermint/tendermint/libs/pubsub"
+)
+
+//----------------------------------------
+// REQUEST
+
+type RPCRequest struct {
+	JSONRPC string          `json:"jsonrpc"`
+	ID      string          `json:"id"`
+	Method  string          `json:"method"`
+	Params  json.RawMessage `json:"params"` // must be map[string]interface{} or []interface{}
+}
+
+func NewRPCRequest(id string, method string, params json.RawMessage) RPCRequest {
+	return RPCRequest{
+		JSONRPC: "2.0",
+		ID:      id,
+		Method:  method,
+		Params:  params,
+	}
+}
+
+func (req RPCRequest) String() string {
+	return fmt.Sprintf("[%s %s]", req.ID, req.Method)
+}
+
+func MapToRequest(id string, method string, params map[string]interface{}) (RPCRequest, error) {
+	var params_ = make(map[string]json.RawMessage, len(params))
+	for name, value := range params {
+		valueJSON, err := json.Marshal(value)
+		if err != nil {
+			return RPCRequest{}, err
+		}
+		params_[name] = valueJSON
+	}
+	payload, err := json.Marshal(params_) // NOTE: Amino doesn't handle maps yet.
+	if err != nil {
+		return RPCRequest{}, err
+	}
+	request := NewRPCRequest(id, method, payload)
+	return request, nil
+}
+
+func ArrayToRequest(id string, method string, params []interface{}) (RPCRequest, error) {
+	var params_ = make([]json.RawMessage, len(params))
+	for i, value := range params {
+		valueJSON, err := json.Marshal(value)
+		if err != nil {
+			return RPCRequest{}, err
+		}
+		params_[i] = valueJSON
+	}
+	payload, err := json.Marshal(params_) // NOTE: Amino doesn't handle maps yet.
+	if err != nil {
+		return RPCRequest{}, err
+	}
+	request := NewRPCRequest(id, method, payload)
+	return request, nil
+}
+
+//----------------------------------------
+// RESPONSE
+
+type RPCError struct {
+	Code    int    `json:"code"`
+	Message string `json:"message"`
+	Data    string `json:"data,omitempty"`
+}
+
+func (err RPCError) Error() string {
+	const baseFormat = "RPC error %v - %s"
+	if err.Data != "" {
+		return fmt.Sprintf(baseFormat+": %s", err.Code, err.Message, err.Data)
+	}
+	return fmt.Sprintf(baseFormat, err.Code, err.Message)
+}
+
+type RPCResponse struct {
+	JSONRPC string          `json:"jsonrpc"`
+	ID      string          `json:"id"`
+	Result  json.RawMessage `json:"result,omitempty"`
+	Error   *RPCError       `json:"error,omitempty"`
+}
+
+func NewRPCSuccessResponse(id string, res interface{}) RPCResponse {
+	var rawMsg json.RawMessage
+
+	if res != nil {
+		var js []byte
+		js, err := json.Marshal(res)
+		if err != nil {
+			return RPCInternalError(id, errors.Wrap(err, "Error marshalling response"))
+		}
+		rawMsg = json.RawMessage(js)
+	}
+
+	return RPCResponse{JSONRPC: "2.0", ID: id, Result: rawMsg}
+}
+
+func NewRPCErrorResponse(id string, code int, msg string, data string) RPCResponse {
+	return RPCResponse{
+		JSONRPC: "2.0",
+		ID:      id,
+		Error:   &RPCError{Code: code, Message: msg, Data: data},
+	}
+}
+
+func (resp RPCResponse) String() string {
+	if resp.Error == nil {
+		return fmt.Sprintf("[%s %v]", resp.ID, resp.Result)
+	}
+	return fmt.Sprintf("[%s %s]", resp.ID, resp.Error)
+}
+
+func RPCParseError(id string, err error) RPCResponse {
+	return NewRPCErrorResponse(id, -32700, "Parse error. Invalid JSON", err.Error())
+}
+
+func RPCInvalidRequestError(id string, err error) RPCResponse {
+	return NewRPCErrorResponse(id, -32600, "Invalid Request", err.Error())
+}
+
+func RPCMethodNotFoundError(id string) RPCResponse {
+	return NewRPCErrorResponse(id, -32601, "Method not found", "")
+}
+
+func RPCInvalidParamsError(id string, err error) RPCResponse {
+	return NewRPCErrorResponse(id, -32602, "Invalid params", err.Error())
+}
+
+func RPCInternalError(id string, err error) RPCResponse {
+	return NewRPCErrorResponse(id, -32603, "Internal error", err.Error())
+}
+
+func RPCServerError(id string, err error) RPCResponse {
+	return NewRPCErrorResponse(id, -32000, "Server error", err.Error())
+}
+
+//----------------------------------------
+
+// *wsConnection implements this interface.
+type WSRPCConnection interface {
+	GetRemoteAddr() string
+	WriteRPCResponse(resp RPCResponse)
+	TryWriteRPCResponse(resp RPCResponse) bool
+	GetEventSubscriber() EventSubscriber
+}
+
+// EventSubscriber mirros tendermint/tendermint/types.EventBusSubscriber
+type EventSubscriber interface {
+	Subscribe(ctx context.Context, subscriber string, query tmpubsub.Query, out chan<- interface{}) error
+	Unsubscribe(ctx context.Context, subscriber string, query tmpubsub.Query) error
+	UnsubscribeAll(ctx context.Context, subscriber string) error
+}
+
+// websocket-only RPCFuncs take this as the first parameter.
+type WSRPCContext struct {
+	Request RPCRequest
+	WSRPCConnection
+}
+
+//----------------------------------------
+// SOCKETS
+//
+// Determine if its a unix or tcp socket.
+// If tcp, must specify the port; `0.0.0.0` will return incorrectly as "unix" since there's no port
+// TODO: deprecate
+func SocketType(listenAddr string) string {
+	socketType := "unix"
+	if len(strings.Split(listenAddr, ":")) >= 2 {
+		socketType = "tcp"
+	}
+	return socketType
+}
diff --git a/rpc/tm/lib/types/types_test.go b/rpc/tm/lib/types/types_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..1227bbd149a8c6996d4acf6800d1566fd7ba53cc
--- /dev/null
+++ b/rpc/tm/lib/types/types_test.go
@@ -0,0 +1,48 @@
+package types
+
+import (
+	"encoding/json"
+	"fmt"
+	"testing"
+
+	"github.com/pkg/errors"
+	"github.com/stretchr/testify/assert"
+)
+
+type SampleResult struct {
+	Value string
+}
+
+func TestResponses(t *testing.T) {
+	assert := assert.New(t)
+
+	a := NewRPCSuccessResponse("1", &SampleResult{"hello"})
+	b, _ := json.Marshal(a)
+	s := `{"jsonrpc":"2.0","id":"1","result":{"Value":"hello"}}`
+	assert.Equal(string(s), string(b))
+
+	d := RPCParseError("1", errors.New("Hello world"))
+	e, _ := json.Marshal(d)
+	f := `{"jsonrpc":"2.0","id":"1","error":{"code":-32700,"message":"Parse error. Invalid JSON","data":"Hello world"}}`
+	assert.Equal(string(f), string(e))
+
+	g := RPCMethodNotFoundError("2")
+	h, _ := json.Marshal(g)
+	i := `{"jsonrpc":"2.0","id":"2","error":{"code":-32601,"message":"Method not found"}}`
+	assert.Equal(string(h), string(i))
+}
+
+func TestRPCError(t *testing.T) {
+	assert.Equal(t, "RPC error 12 - Badness: One worse than a code 11",
+		fmt.Sprintf("%v", &RPCError{
+			Code:    12,
+			Message: "Badness",
+			Data:    "One worse than a code 11",
+		}))
+
+	assert.Equal(t, "RPC error 12 - Badness",
+		fmt.Sprintf("%v", &RPCError{
+			Code:    12,
+			Message: "Badness",
+		}))
+}
diff --git a/rpc/tm/methods.go b/rpc/tm/methods.go
index 4f54885aa390f78a11ce462e5c4bf8348a2e5382..987d4893ac5426d49a6f6c185692fd1fdb8a60b0 100644
--- a/rpc/tm/methods.go
+++ b/rpc/tm/methods.go
@@ -11,9 +11,9 @@ import (
 	"github.com/hyperledger/burrow/execution"
 	"github.com/hyperledger/burrow/logging"
 	"github.com/hyperledger/burrow/rpc"
+	"github.com/hyperledger/burrow/rpc/tm/lib/server"
+	"github.com/hyperledger/burrow/rpc/tm/lib/types"
 	"github.com/hyperledger/burrow/txs"
-	gorpc "github.com/tendermint/tendermint/rpc/lib/server"
-	"github.com/tendermint/tendermint/rpc/lib/types"
 )
 
 // Method names
@@ -57,13 +57,13 @@ const (
 	SignTx                 = "unsafe/sign_tx"
 )
 
-const SubscriptionTimeoutSeconds = 5 * time.Second
+const SubscriptionTimeout = 5 * time.Second
 
-func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*gorpc.RPCFunc {
+func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*server.RPCFunc {
 	logger = logger.WithScope("GetRoutes")
-	return map[string]*gorpc.RPCFunc{
+	return map[string]*server.RPCFunc{
 		// Transact
-		BroadcastTx: gorpc.NewRPCFunc(func(tx txs.Wrapper) (*rpc.ResultBroadcastTx, error) {
+		BroadcastTx: server.NewRPCFunc(func(tx txs.Wrapper) (*rpc.ResultBroadcastTx, error) {
 			receipt, err := service.Transactor().BroadcastTx(tx.Unwrap())
 			if err != nil {
 				return nil, err
@@ -73,14 +73,14 @@ func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*gorpc.R
 			}, nil
 		}, "tx"),
 
-		SignTx: gorpc.NewRPCFunc(func(tx txs.Tx, concretePrivateAccounts []*acm.ConcretePrivateAccount) (*rpc.ResultSignTx, error) {
+		SignTx: server.NewRPCFunc(func(tx txs.Tx, concretePrivateAccounts []*acm.ConcretePrivateAccount) (*rpc.ResultSignTx, error) {
 			tx, err := service.Transactor().SignTx(tx, acm.SigningAccounts(concretePrivateAccounts))
 			return &rpc.ResultSignTx{Tx: txs.Wrap(tx)}, err
 
 		}, "tx,privAccounts"),
 
 		// Simulated call
-		Call: gorpc.NewRPCFunc(func(fromAddress, toAddress crypto.Address, data []byte) (*rpc.ResultCall, error) {
+		Call: server.NewRPCFunc(func(fromAddress, toAddress crypto.Address, data []byte) (*rpc.ResultCall, error) {
 			call, err := service.Transactor().Call(service.State(), fromAddress, toAddress, data)
 			if err != nil {
 				return nil, err
@@ -88,7 +88,7 @@ func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*gorpc.R
 			return &rpc.ResultCall{Call: *call}, nil
 		}, "fromAddress,toAddress,data"),
 
-		CallCode: gorpc.NewRPCFunc(func(fromAddress crypto.Address, code, data []byte) (*rpc.ResultCall, error) {
+		CallCode: server.NewRPCFunc(func(fromAddress crypto.Address, code, data []byte) (*rpc.ResultCall, error) {
 			call, err := service.Transactor().CallCode(service.State(), fromAddress, code, data)
 			if err != nil {
 				return nil, err
@@ -97,17 +97,17 @@ func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*gorpc.R
 		}, "fromAddress,code,data"),
 
 		// Events
-		Subscribe: gorpc.NewWSRPCFunc(func(wsCtx rpctypes.WSRPCContext, eventID string) (*rpc.ResultSubscribe, error) {
+		Subscribe: server.NewWSRPCFunc(func(wsCtx types.WSRPCContext, eventID string) (*rpc.ResultSubscribe, error) {
 			subscriptionID, err := event.GenerateSubscriptionID()
 			if err != nil {
 				return nil, err
 			}
 
-			ctx, cancel := context.WithTimeout(context.Background(), SubscriptionTimeoutSeconds*time.Second)
+			ctx, cancel := context.WithTimeout(context.Background(), SubscriptionTimeout)
 			defer cancel()
 
 			err = service.Subscribe(ctx, subscriptionID, eventID, func(resultEvent *rpc.ResultEvent) bool {
-				keepAlive := wsCtx.TryWriteRPCResponse(rpctypes.NewRPCSuccessResponse(
+				keepAlive := wsCtx.TryWriteRPCResponse(types.NewRPCSuccessResponse(
 					EventResponseID(wsCtx.Request.ID, eventID), resultEvent))
 				if !keepAlive {
 					logger.InfoMsg("dropping subscription because could not write to websocket",
@@ -125,8 +125,8 @@ func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*gorpc.R
 			}, nil
 		}, "eventID"),
 
-		Unsubscribe: gorpc.NewWSRPCFunc(func(wsCtx rpctypes.WSRPCContext, subscriptionID string) (*rpc.ResultUnsubscribe, error) {
-			ctx, cancel := context.WithTimeout(context.Background(), SubscriptionTimeoutSeconds*time.Second)
+		Unsubscribe: server.NewWSRPCFunc(func(wsCtx types.WSRPCContext, subscriptionID string) (*rpc.ResultUnsubscribe, error) {
+			ctx, cancel := context.WithTimeout(context.Background(), SubscriptionTimeout)
 			defer cancel()
 			// Since our model uses a random subscription ID per request we just drop all matching requests
 			err := service.Unsubscribe(ctx, subscriptionID)
@@ -139,42 +139,42 @@ func GetRoutes(service *rpc.Service, logger *logging.Logger) map[string]*gorpc.R
 		}, "subscriptionID"),
 
 		// Status
-		Status:  gorpc.NewRPCFunc(service.Status, ""),
-		NetInfo: gorpc.NewRPCFunc(service.NetInfo, ""),
+		Status:  server.NewRPCFunc(service.Status, ""),
+		NetInfo: server.NewRPCFunc(service.NetInfo, ""),
 
 		// Accounts
-		ListAccounts: gorpc.NewRPCFunc(func() (*rpc.ResultListAccounts, error) {
+		ListAccounts: server.NewRPCFunc(func() (*rpc.ResultListAccounts, error) {
 			return service.ListAccounts(func(acm.Account) bool {
 				return true
 			})
 		}, ""),
 
-		GetAccount:      gorpc.NewRPCFunc(service.GetAccount, "address"),
-		GetStorage:      gorpc.NewRPCFunc(service.GetStorage, "address,key"),
-		DumpStorage:     gorpc.NewRPCFunc(service.DumpStorage, "address"),
-		GetAccountHuman: gorpc.NewRPCFunc(service.GetAccountHumanReadable, "address"),
+		GetAccount:      server.NewRPCFunc(service.GetAccount, "address"),
+		GetStorage:      server.NewRPCFunc(service.GetStorage, "address,key"),
+		DumpStorage:     server.NewRPCFunc(service.DumpStorage, "address"),
+		GetAccountHuman: server.NewRPCFunc(service.GetAccountHumanReadable, "address"),
 
 		// Blockchain
-		Genesis:    gorpc.NewRPCFunc(service.Genesis, ""),
-		ChainID:    gorpc.NewRPCFunc(service.ChainId, ""),
-		ListBlocks: gorpc.NewRPCFunc(service.ListBlocks, "minHeight,maxHeight"),
-		GetBlock:   gorpc.NewRPCFunc(service.GetBlock, "height"),
+		Genesis:    server.NewRPCFunc(service.Genesis, ""),
+		ChainID:    server.NewRPCFunc(service.ChainId, ""),
+		ListBlocks: server.NewRPCFunc(service.ListBlocks, "minHeight,maxHeight"),
+		GetBlock:   server.NewRPCFunc(service.GetBlock, "height"),
 
 		// Consensus
-		ListUnconfirmedTxs: gorpc.NewRPCFunc(service.ListUnconfirmedTxs, "maxTxs"),
-		ListValidators:     gorpc.NewRPCFunc(service.ListValidators, ""),
-		DumpConsensusState: gorpc.NewRPCFunc(service.DumpConsensusState, ""),
+		ListUnconfirmedTxs: server.NewRPCFunc(service.ListUnconfirmedTxs, "maxTxs"),
+		ListValidators:     server.NewRPCFunc(service.ListValidators, ""),
+		DumpConsensusState: server.NewRPCFunc(service.DumpConsensusState, ""),
 
 		// Names
-		GetName: gorpc.NewRPCFunc(service.GetName, "name"),
-		ListNames: gorpc.NewRPCFunc(func() (*rpc.ResultListNames, error) {
+		GetName: server.NewRPCFunc(service.GetName, "name"),
+		ListNames: server.NewRPCFunc(func() (*rpc.ResultListNames, error) {
 			return service.ListNames(func(*execution.NameRegEntry) bool {
 				return true
 			})
 		}, ""),
 
 		// Private account
-		GeneratePrivateAccount: gorpc.NewRPCFunc(service.GeneratePrivateAccount, ""),
+		GeneratePrivateAccount: server.NewRPCFunc(service.GeneratePrivateAccount, ""),
 	}
 }
 
diff --git a/rpc/tm/server.go b/rpc/tm/server.go
index 4df1e3db5a9114ace449ddd5e6ba112788513aea..db6cd332ddf2039c9f9f69027816495ec370b84d 100644
--- a/rpc/tm/server.go
+++ b/rpc/tm/server.go
@@ -23,7 +23,7 @@ import (
 	"github.com/hyperledger/burrow/logging"
 	"github.com/hyperledger/burrow/logging/structure"
 	"github.com/hyperledger/burrow/rpc"
-	"github.com/tendermint/tendermint/rpc/lib/server"
+	"github.com/hyperledger/burrow/rpc/tm/lib/server"
 )
 
 func StartServer(service *rpc.Service, pattern, listenAddress string, emitter event.Emitter,
@@ -32,11 +32,10 @@ func StartServer(service *rpc.Service, pattern, listenAddress string, emitter ev
 	logger = logger.With(structure.ComponentKey, "RPC_TM")
 	routes := GetRoutes(service, logger)
 	mux := http.NewServeMux()
-	wm := rpcserver.NewWebsocketManager(routes, rpcserver.EventSubscriber(tendermint.SubscribableAsEventBus(emitter)))
+	wm := server.NewWebsocketManager(routes, logger, server.EventSubscriber(tendermint.SubscribableAsEventBus(emitter)))
 	mux.HandleFunc(pattern, wm.WebsocketHandler)
-	tmLogger := tendermint.NewLogger(logger)
-	rpcserver.RegisterRPCFuncs(mux, routes, tmLogger)
-	listener, err := rpcserver.StartHTTPServer(listenAddress, mux, tmLogger)
+	server.RegisterRPCFuncs(mux, routes, logger)
+	listener, err := server.StartHTTPServer(listenAddress, mux, logger)
 	if err != nil {
 		return nil, err
 	}
diff --git a/vendor/github.com/OneOfOne/xxhash/xxhash.go b/vendor/github.com/OneOfOne/xxhash/xxhash.go
index 817783d1a309dca1dd9e44b27fffc7b26a406e55..2387d65934bf7ee3d2bb5c7412f54531fb7dd170 100644
--- a/vendor/github.com/OneOfOne/xxhash/xxhash.go
+++ b/vendor/github.com/OneOfOne/xxhash/xxhash.go
@@ -14,6 +14,12 @@ const (
 	prime64x5 uint64 = 2870177450012600261
 
 	maxInt32 int32 = (1<<31 - 1)
+
+	// precomputed zero Vs for seed 0
+	zero64x1 = 0x60ea27eeadc0b5d6
+	zero64x2 = 0xc2b2ae3d27d4eb4f
+	zero64x3 = 0x0
+	zero64x4 = 0x61c8864e7a143579
 )
 
 // Checksum32 returns the checksum of the input data with the seed set to 0.
@@ -93,14 +99,6 @@ type XXHash64 struct {
 	memIdx         int8
 }
 
-var zeroVs64 = [...]uint64{
-	// workaround static overflow checker
-	func(s uint64) uint64 { return s + prime64x1 + prime64x2 }(0),
-	prime64x2,
-	0,
-	func(s uint64) uint64 { return s - prime64x1 }(0),
-}
-
 // Size returns the number of bytes Sum will return.
 func (xx *XXHash64) Size() int {
 	return 8
@@ -170,7 +168,7 @@ func mix64(h uint64) uint64 {
 
 func resetVs64(seed uint64) (v1, v2, v3, v4 uint64) {
 	if seed == 0 {
-		return zeroVs64[0], zeroVs64[1], zeroVs64[2], zeroVs64[3]
+		return zero64x1, zero64x2, zero64x3, zero64x4
 	}
 	return (seed + prime64x1 + prime64x2), (seed + prime64x2), (seed), (seed - prime64x1)
 }
diff --git a/vendor/github.com/OneOfOne/xxhash/xxhash_go17.go b/vendor/github.com/OneOfOne/xxhash/xxhash_go17.go
index d4ebc0530777c9533c3f42f0062cad4b57b0ba17..ae48e0c5ca7aae9525e5cd274260ea8736681229 100644
--- a/vendor/github.com/OneOfOne/xxhash/xxhash_go17.go
+++ b/vendor/github.com/OneOfOne/xxhash/xxhash_go17.go
@@ -3,6 +3,7 @@ package xxhash
 func u32(in []byte) uint32 {
 	return uint32(in[0]) | uint32(in[1])<<8 | uint32(in[2])<<16 | uint32(in[3])<<24
 }
+
 func u64(in []byte) uint64 {
 	return uint64(in[0]) | uint64(in[1])<<8 | uint64(in[2])<<16 | uint64(in[3])<<24 | uint64(in[4])<<32 | uint64(in[5])<<40 | uint64(in[6])<<48 | uint64(in[7])<<56
 }
diff --git a/vendor/github.com/OneOfOne/xxhash/xxhash_safe.go b/vendor/github.com/OneOfOne/xxhash/xxhash_safe.go
index 5252b774dd19771ce822432c677ebd3a81dfd8be..7532c2d31ecb93f6654c734a051732fa5b6ca17c 100644
--- a/vendor/github.com/OneOfOne/xxhash/xxhash_safe.go
+++ b/vendor/github.com/OneOfOne/xxhash/xxhash_safe.go
@@ -1,4 +1,4 @@
-// +build appengine safe
+// +build appengine safe ppc64le ppc64be mipsle mipsbe
 
 package xxhash
 
diff --git a/vendor/github.com/OneOfOne/xxhash/xxhash_unsafe.go b/vendor/github.com/OneOfOne/xxhash/xxhash_unsafe.go
index 59661249b1e51914cf2861d8f8ee436be8401b76..caacdc8b5a2cc499ac80ecbdb9e76d51fdf770a0 100644
--- a/vendor/github.com/OneOfOne/xxhash/xxhash_unsafe.go
+++ b/vendor/github.com/OneOfOne/xxhash/xxhash_unsafe.go
@@ -1,5 +1,9 @@
 // +build !safe
 // +build !appengine
+// +build !ppc64le
+// +build !mipsle
+// +build !ppc64be
+// +build !mipsbe
 
 package xxhash
 
diff --git a/vendor/github.com/golang/snappy/snappy.go b/vendor/github.com/golang/snappy/snappy.go
index 0cf5e379c47f2455ff7d517d13d57116f696b4a8..ece692ea4610ab717f74b1b4a416d1452d3673dc 100644
--- a/vendor/github.com/golang/snappy/snappy.go
+++ b/vendor/github.com/golang/snappy/snappy.go
@@ -2,10 +2,21 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package snappy implements the snappy block-based compression format.
-// It aims for very high speeds and reasonable compression.
+// Package snappy implements the Snappy compression format. It aims for very
+// high speeds and reasonable compression.
 //
-// The C++ snappy implementation is at https://github.com/google/snappy
+// There are actually two Snappy formats: block and stream. They are related,
+// but different: trying to decompress block-compressed data as a Snappy stream
+// will fail, and vice versa. The block format is the Decode and Encode
+// functions and the stream format is the Reader and Writer types.
+//
+// The block format, the more common case, is used when the complete size (the
+// number of bytes) of the original data is known upfront, at the time
+// compression starts. The stream format, also known as the framing format, is
+// for when that isn't always true.
+//
+// The canonical, C++ implementation is at https://github.com/google/snappy and
+// it only implements the block format.
 package snappy // import "github.com/golang/snappy"
 
 import (
diff --git a/vendor/github.com/jawher/mow.cli/args.go b/vendor/github.com/jawher/mow.cli/args.go
index 09ea940aae57635df76b99ea6ee89d60adc88b68..faf3f2b5eaeb4a89d714c41f2fb5074013abe255 100644
--- a/vendor/github.com/jawher/mow.cli/args.go
+++ b/vendor/github.com/jawher/mow.cli/args.go
@@ -2,7 +2,9 @@ package cli
 
 import (
 	"flag"
-	"fmt"
+
+	"github.com/jawher/mow.cli/internal/container"
+	"github.com/jawher/mow.cli/internal/values"
 )
 
 // BoolArg describes a boolean argument
@@ -13,7 +15,7 @@ type BoolArg struct {
 	Desc string
 	// A space separated list of environment variables names to be used to initialize this argument
 	EnvVar string
-	// The argument's inital value
+	// The argument's initial value
 	Value bool
 	// A boolean to display or not the current value of the argument in the help message
 	HideValue bool
@@ -199,26 +201,12 @@ VarArg defines an argument where the type and format is controlled by the develo
 The result will be stored in the value parameter (a value implementing the flag.Value interface) which will be populated when the app is run and the call arguments get parsed
 */
 func (c *Cmd) VarArg(name string, value flag.Value, desc string) {
-	c.mkArg(arg{name: name, desc: desc, value: value})
-}
-
-type arg struct {
-	name            string
-	desc            string
-	envVar          string
-	hideValue       bool
-	valueSetFromEnv bool
-	valueSetByUser  *bool
-	value           flag.Value
-}
-
-func (a *arg) String() string {
-	return fmt.Sprintf("ARG(%s)", a.name)
+	c.mkArg(container.Container{Name: name, Desc: desc, Value: value})
 }
 
-func (c *Cmd) mkArg(arg arg) {
-	arg.valueSetFromEnv = setFromEnv(arg.value, arg.envVar)
+func (c *Cmd) mkArg(arg container.Container) {
+	arg.ValueSetFromEnv = values.SetFromEnv(arg.Value, arg.EnvVar)
 
 	c.args = append(c.args, &arg)
-	c.argsIdx[arg.name] = &arg
+	c.argsIdx[arg.Name] = &arg
 }
diff --git a/vendor/github.com/jawher/mow.cli/cli.go b/vendor/github.com/jawher/mow.cli/cli.go
index 6b9ea7631ccefa52c4218e23eb9b6fe037f15095..4b0788dc5afaea70b560f33dfd901e4d483f78e7 100644
--- a/vendor/github.com/jawher/mow.cli/cli.go
+++ b/vendor/github.com/jawher/mow.cli/cli.go
@@ -5,6 +5,9 @@ import (
 	"fmt"
 	"io"
 	"os"
+
+	"github.com/jawher/mow.cli/internal/container"
+	"github.com/jawher/mow.cli/internal/flow"
 )
 
 /*
@@ -17,7 +20,7 @@ type Cli struct {
 
 type cliVersion struct {
 	version string
-	option  *opt
+	option  *container.Container
 }
 
 /*
@@ -35,8 +38,8 @@ func App(name, desc string) *Cli {
 		Cmd: &Cmd{
 			name:          name,
 			desc:          desc,
-			optionsIdx:    map[string]*opt{},
-			argsIdx:       map[string]*arg{},
+			optionsIdx:    map[string]*container.Container{},
+			argsIdx:       map[string]*container.Container{},
 			ErrorHandling: flag.ExitOnError,
 		},
 	}
@@ -62,7 +65,7 @@ func (cli *Cli) Version(name, version string) {
 	cli.version = &cliVersion{version, option}
 }
 
-func (cli *Cli) parse(args []string, entry, inFlow, outFlow *step) error {
+func (cli *Cli) parse(args []string, entry, inFlow, outFlow *flow.Step) error {
 	// We overload Cmd.parse() and handle cases that only apply to the CLI command, like versioning
 	// After that, we just call Cmd.parse() for the default behavior
 	if cli.versionSetAndRequested(args) {
@@ -74,7 +77,7 @@ func (cli *Cli) parse(args []string, entry, inFlow, outFlow *step) error {
 }
 
 func (cli *Cli) versionSetAndRequested(args []string) bool {
-	return cli.version != nil && cli.isFlagSet(args, cli.version.option.names)
+	return cli.version != nil && cli.isFlagSet(args, cli.version.option.Names)
 }
 
 /*
@@ -97,15 +100,15 @@ func (cli *Cli) Run(args []string) error {
 	if err := cli.doInit(); err != nil {
 		panic(err)
 	}
-	inFlow := &step{desc: "RootIn"}
-	outFlow := &step{desc: "RootOut"}
+	inFlow := &flow.Step{Desc: "RootIn", Exiter: exiter}
+	outFlow := &flow.Step{Desc: "RootOut", Exiter: exiter}
 	return cli.parse(args[1:], inFlow, inFlow, outFlow)
 }
 
 /*
 ActionCommand is a convenience function to configure a command with an action.
 
-cmd.ActionCommand(_, _, myFun } is equivalent to cmd.Command(_, _, func(cmd *cli.Cmd) { cmd.Action = myFun })
+cmd.ActionCommand(_, _, myFunc) is equivalent to cmd.Command(_, _, func(cmd *cli.Cmd) { cmd.Action = myFunc })
 */
 func ActionCommand(action func()) CmdInitializer {
 	return func(cmd *Cmd) {
@@ -118,11 +121,9 @@ Exit causes the app the exit with the specified exit code while giving the After
 This should be used instead of os.Exit.
 */
 func Exit(code int) {
-	panic(exit(code))
+	panic(flow.ExitCode(code))
 }
 
-type exit int
-
 var exiter = func(code int) {
 	os.Exit(code)
 }
diff --git a/vendor/github.com/jawher/mow.cli/commands.go b/vendor/github.com/jawher/mow.cli/commands.go
index 2dca78dc5a69745f328f6cf055c8a4d5332191b6..e8c44b48e7467556e0104672ba8fcce56aa2b721 100644
--- a/vendor/github.com/jawher/mow.cli/commands.go
+++ b/vendor/github.com/jawher/mow.cli/commands.go
@@ -5,6 +5,13 @@ import (
 	"fmt"
 	"strings"
 	"text/tabwriter"
+
+	"github.com/jawher/mow.cli/internal/container"
+	"github.com/jawher/mow.cli/internal/flow"
+	"github.com/jawher/mow.cli/internal/fsm"
+	"github.com/jawher/mow.cli/internal/lexer"
+	"github.com/jawher/mow.cli/internal/parser"
+	"github.com/jawher/mow.cli/internal/values"
 )
 
 /*
@@ -32,14 +39,14 @@ type Cmd struct {
 	desc    string
 
 	commands   []*Cmd
-	options    []*opt
-	optionsIdx map[string]*opt
-	args       []*arg
-	argsIdx    map[string]*arg
+	options    []*container.Container
+	optionsIdx map[string]*container.Container
+	args       []*container.Container
+	argsIdx    map[string]*container.Container
 
 	parents []string
 
-	fsm *state
+	fsm *fsm.State
 }
 
 /*
@@ -111,10 +118,10 @@ func (c *Cmd) Command(name, desc string, init CmdInitializer) {
 		desc:          desc,
 		init:          init,
 		commands:      []*Cmd{},
-		options:       []*opt{},
-		optionsIdx:    map[string]*opt{},
-		args:          []*arg{},
-		argsIdx:       map[string]*arg{},
+		options:       []*container.Container{},
+		optionsIdx:    map[string]*container.Container{},
+		args:          []*container.Container{},
+		argsIdx:       map[string]*container.Container{},
 	})
 }
 
@@ -126,13 +133,13 @@ The result should be stored in a variable (a pointer to a bool) which will be po
 */
 func (c *Cmd) Bool(p BoolParam) *bool {
 	into := new(bool)
-	value := newBoolValue(into, p.value())
+	value := values.NewBool(into, p.value())
 
 	switch x := p.(type) {
 	case BoolOpt:
-		c.mkOpt(opt{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	case BoolArg:
-		c.mkArg(arg{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	default:
 		panic(fmt.Sprintf("Unhandled param %v", p))
 	}
@@ -148,13 +155,13 @@ The result should be stored in a variable (a pointer to a string) which will be
 */
 func (c *Cmd) String(p StringParam) *string {
 	into := new(string)
-	value := newStringValue(into, p.value())
+	value := values.NewString(into, p.value())
 
 	switch x := p.(type) {
 	case StringOpt:
-		c.mkOpt(opt{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	case StringArg:
-		c.mkArg(arg{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	default:
 		panic(fmt.Sprintf("Unhandled param %v", p))
 	}
@@ -170,13 +177,13 @@ The result should be stored in a variable (a pointer to an int) which will be po
 */
 func (c *Cmd) Int(p IntParam) *int {
 	into := new(int)
-	value := newIntValue(into, p.value())
+	value := values.NewInt(into, p.value())
 
 	switch x := p.(type) {
 	case IntOpt:
-		c.mkOpt(opt{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	case IntArg:
-		c.mkArg(arg{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	default:
 		panic(fmt.Sprintf("Unhandled param %v", p))
 	}
@@ -192,13 +199,13 @@ The result should be stored in a variable (a pointer to a string slice) which wi
 */
 func (c *Cmd) Strings(p StringsParam) *[]string {
 	into := new([]string)
-	value := newStringsValue(into, p.value())
+	value := values.NewStrings(into, p.value())
 
 	switch x := p.(type) {
 	case StringsOpt:
-		c.mkOpt(opt{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	case StringsArg:
-		c.mkArg(arg{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	default:
 		panic(fmt.Sprintf("Unhandled param %v", p))
 	}
@@ -214,13 +221,13 @@ The result should be stored in a variable (a pointer to an int slice) which will
 */
 func (c *Cmd) Ints(p IntsParam) *[]int {
 	into := new([]int)
-	value := newIntsValue(into, p.value())
+	value := values.NewInts(into, p.value())
 
 	switch x := p.(type) {
 	case IntsOpt:
-		c.mkOpt(opt{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	case IntsArg:
-		c.mkArg(arg{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: value, valueSetByUser: x.SetByUser})
+		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: value, ValueSetByUser: x.SetByUser})
 	default:
 		panic(fmt.Sprintf("Unhandled param %v", p))
 	}
@@ -238,9 +245,9 @@ Instead, the VarOpt or VarOptArg structs hold the said value.
 func (c *Cmd) Var(p VarParam) {
 	switch x := p.(type) {
 	case VarOpt:
-		c.mkOpt(opt{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: p.value(), valueSetByUser: x.SetByUser})
+		c.mkOpt(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: p.value(), ValueSetByUser: x.SetByUser})
 	case VarArg:
-		c.mkArg(arg{name: x.Name, desc: x.Desc, envVar: x.EnvVar, hideValue: x.HideValue, value: p.value(), valueSetByUser: x.SetByUser})
+		c.mkArg(container.Container{Name: x.Name, Desc: x.Desc, EnvVar: x.EnvVar, HideValue: x.HideValue, Value: p.value(), ValueSetByUser: x.SetByUser})
 	default:
 		panic(fmt.Sprintf("Unhandled param %v", p))
 	}
@@ -262,14 +269,27 @@ func (c *Cmd) doInit() error {
 			c.Spec = "[OPTIONS] "
 		}
 		for _, arg := range c.args {
-			c.Spec += arg.name + " "
+			c.Spec += arg.Name + " "
 		}
 	}
-	fsm, err := uParse(c)
+
+	tokens, err := lexer.Tokenize(c.Spec)
+	if err != nil {
+		return err
+	}
+
+	params := parser.Params{
+		Spec:       c.Spec,
+		Options:    c.options,
+		OptionsIdx: c.optionsIdx,
+		Args:       c.args,
+		ArgsIdx:    c.argsIdx,
+	}
+	s, err := parser.Parse(tokens, params)
 	if err != nil {
 		return err
 	}
-	c.fsm = fsm
+	c.fsm = s
 	return nil
 }
 
@@ -338,10 +358,10 @@ func (c *Cmd) printHelp(longDesc bool) {
 
 		for _, arg := range c.args {
 			var (
-				env   = formatEnvVarsForHelp(arg.envVar)
-				value = formatValueForHelp(arg.hideValue, arg.value)
+				env   = formatEnvVarsForHelp(arg.EnvVar)
+				value = formatValueForHelp(arg.HideValue, arg.Value)
 			)
-			fmt.Fprintf(w, "  %s\t%s\n", arg.name, joinStrings(arg.desc, env, value))
+			fmt.Fprintf(w, "  %s\t%s\n", arg.Name, joinStrings(arg.Desc, env, value))
 		}
 	}
 
@@ -351,10 +371,10 @@ func (c *Cmd) printHelp(longDesc bool) {
 		for _, opt := range c.options {
 			var (
 				optNames = formatOptNamesForHelp(opt)
-				env      = formatEnvVarsForHelp(opt.envVar)
-				value    = formatValueForHelp(opt.hideValue, opt.value)
+				env      = formatEnvVarsForHelp(opt.EnvVar)
+				value    = formatValueForHelp(opt.HideValue, opt.Value)
 			)
-			fmt.Fprintf(w, "  %s\t%s\n", optNames, joinStrings(opt.desc, env, value))
+			fmt.Fprintf(w, "  %s\t%s\n", optNames, joinStrings(opt.Desc, env, value))
 		}
 	}
 
@@ -373,10 +393,10 @@ func (c *Cmd) printHelp(longDesc bool) {
 	w.Flush()
 }
 
-func formatOptNamesForHelp(o *opt) string {
+func formatOptNamesForHelp(o *container.Container) string {
 	short, long := "", ""
 
-	for _, n := range o.names {
+	for _, n := range o.Names {
 		if len(n) == 2 && short == "" {
 			short = n
 		}
@@ -404,7 +424,7 @@ func formatValueForHelp(hide bool, v flag.Value) string {
 		return ""
 	}
 
-	if dv, ok := v.(defaultValued); ok {
+	if dv, ok := v.(values.DefaultValued); ok {
 		if dv.IsDefault() {
 			return ""
 		}
@@ -430,7 +450,7 @@ func formatEnvVarsForHelp(envVars string) string {
 	return res
 }
 
-func (c *Cmd) parse(args []string, entry, inFlow, outFlow *step) error {
+func (c *Cmd) parse(args []string, entry, inFlow, outFlow *flow.Step) error {
 	if c.helpRequested(args) {
 		c.PrintLongHelp()
 		c.onError(errHelpRequested)
@@ -439,38 +459,41 @@ func (c *Cmd) parse(args []string, entry, inFlow, outFlow *step) error {
 
 	nargsLen := c.getOptsAndArgs(args)
 
-	if err := c.fsm.parse(args[:nargsLen]); err != nil {
+	if err := c.fsm.Parse(args[:nargsLen]); err != nil {
 		fmt.Fprintf(stdErr, "Error: %s\n", err.Error())
 		c.PrintHelp()
 		c.onError(err)
 		return err
 	}
 
-	newInFlow := &step{
-		do:    c.Before,
-		error: outFlow,
-		desc:  fmt.Sprintf("%s.Before", c.name),
+	newInFlow := &flow.Step{
+		Do:     c.Before,
+		Error:  outFlow,
+		Desc:   fmt.Sprintf("%s.Before", c.name),
+		Exiter: exiter,
 	}
-	inFlow.success = newInFlow
+	inFlow.Success = newInFlow
 
-	newOutFlow := &step{
-		do:      c.After,
-		success: outFlow,
-		error:   outFlow,
-		desc:    fmt.Sprintf("%s.After", c.name),
+	newOutFlow := &flow.Step{
+		Do:      c.After,
+		Success: outFlow,
+		Error:   outFlow,
+		Desc:    fmt.Sprintf("%s.After", c.name),
+		Exiter:  exiter,
 	}
 
 	args = args[nargsLen:]
 	if len(args) == 0 {
 		if c.Action != nil {
-			newInFlow.success = &step{
-				do:      c.Action,
-				success: newOutFlow,
-				error:   newOutFlow,
-				desc:    fmt.Sprintf("%s.Action", c.name),
+			newInFlow.Success = &flow.Step{
+				Do:      c.Action,
+				Success: newOutFlow,
+				Error:   newOutFlow,
+				Desc:    fmt.Sprintf("%s.Action", c.name),
+				Exiter:  exiter,
 			}
 
-			entry.run(nil)
+			entry.Run(nil)
 			return nil
 		}
 		c.PrintHelp()
@@ -543,3 +566,18 @@ func (c *Cmd) isAlias(arg string) bool {
 	}
 	return false
 }
+
+func joinStrings(parts ...string) string {
+	res := ""
+	for _, part := range parts {
+		s := strings.TrimSpace(part)
+		if s == "" {
+			continue
+		}
+		if res != "" {
+			res += " "
+		}
+		res += part
+	}
+	return res
+}
diff --git a/vendor/github.com/jawher/mow.cli/doc.go b/vendor/github.com/jawher/mow.cli/doc.go
index 398ae256eb05b9b4e112cc5ddfb4aacaf689f4f5..e3f560c438f4487893f6735857cdcd39ed7d7811 100644
--- a/vendor/github.com/jawher/mow.cli/doc.go
+++ b/vendor/github.com/jawher/mow.cli/doc.go
@@ -1,518 +1,658 @@
 /*
-Package cli provides a framework to build command line applications in Go with most of the burden of arguments parsing and validation
-placed on the framework instead of the user.
+Package cli provides a framework to build command line applications in Go with
+most of the burden of arguments parsing and validation placed on the framework
+instead of the user.
 
 
-Basics
-
-You start by creating an application by passing a name and a description:
-
-	cp = cli.App("cp", "Copy files around")
-
-To attach the code to execute when the app is launched, assign a function to the Action field:
-	cp.Action = func() {
-		fmt.Printf("Hello world\n")
-	}
-
-Finally, in your main func, call Run on the app:
-
-	cp.Run(os.Args)
 
-Options
-
-To add a (global) option, call one of the (String[s]|Int[s]|Bool)Opt methods on the app:
-
-	recursive := cp.BoolOpt("R recursive", false, "recursively copy the src to dst")
+Basics
 
-* The first argument is a space separated list of names for the option without the dashes
+To create a new application, initialize an app with cli.App. Specify a name and
+a brief description for the application:
 
-* The second parameter is the default value for the option
+    cp := cli.App("cp", "Copy files around")
 
-* The third parameter is the option description, as will be shown in the help messages
+To attach code to execute when the app is launched, assign a function to the
+Action field:
 
-There is also a second set of methods Bool, String, Int, Strings and Ints, which accepts a struct describing the option:
+    cp.Action = func() {
+        fmt.Printf("Hello world\n")
+    }
 
-	recursive = cp.Bool(BoolOpt{
-		Name:  "R",
-		Value: false,
-		Desc:  "copy src files recursively",
-		EnvVar: "",
-	})
+To assign a version to the application, use Version method and specify the flags
+that will be used to invoke the version command:
 
-There EnvVar field is a space separated list of environment variables names to be used to initialize the option.
+    cp.Version("v version", "cp 1.2.3")
 
-The result is a pointer to a value which will be populated after parsing the command line arguments.
-You can access the values in the Action func.
+Finally, in the main func, call Run passing in the arguments for parsing:
 
-In the command line, mow.cli accepts the following syntaxes
+    cp.Run(os.Args)
 
-* For boolean options:
 
-	-f : a single dash for the one letter names
-	-f=false : a single dash for the one letter names, equal sign followed by true or false
-	--force :  double dash for longer option names
-	-it : mow.cli supports option folding, this is equivalent to: -i -t
 
-* For string, int options:
+Options
 
-	-e=value : single dash for one letter names, equal sign followed by the value
-	-e value : single dash for one letter names, space followed by the value
-	-Ivalue : single dash for one letter names immediately followed by the value
-	--extra=value : double dash for longer option names, equal sign followed by the value
-	--extra value : double dash for longer option names, space followed by the value
+To add one or more command line options (also known as flags), use one of the
+short-form StringOpt, StringsOpt, IntOpt, IntsOpt, or BoolOpt methods on App (or
+Cmd if adding flags to a command or subcommand). For example, to add a boolean
+flag to the cp command that specifies recursive mode, use the following:
+
+    recursive := cp.BoolOpt("R recursive", false, "recursively copy the src to dst")
+
+The first argument is a space separated list of names for the option without the
+dashes. Generally, both short and long forms are specified, but this is not
+mandatory. Additional names (aliases) can be provide if desired, but these are
+not shown in the auto-generated help. The second argument is the default value
+for the option if it is not supplied by the user. And, the third argument is the
+description to be shown in help messages.
+
+There is also a second set of methods on App called String, Strings, Int, Ints,
+and Bool, which accept a long-form struct of the type: cli.StringOpt,
+cli.StringsOpt, cli.IntOpt, cli.IntsOpt, cli.BoolOpt. The struct describes the
+option and allows the use of additional features not available in the short-form
+methods described above:
+
+    recursive = cp.Bool(cli.BoolOpt{
+        Name:       "R recursive",
+        Value:      false,
+        Desc:       "copy src files recursively",
+        EnvVar:     "VAR_RECURSIVE",
+        SetByUser:  &recursiveSetByUser,
+    })
+
+Two features, EnvVar and SetByUser, can be defined in the long-form struct
+method. EnvVar is a space separated list of environment variables used to
+initialize the option if a value is not provided by the user. When help messages
+are shown, the value of any environment variables will be displayed. SetByUser
+is a pointer to a boolean variable that is set to true if the user specified the
+value on the command line. This can be useful to determine if the value of the
+option was explicitly set by the user or set via the default value.
+
+The result of both short- and long-forms is a pointer to a value, which will be
+populated after the command line arguments are parsed. You can only access the
+values stored in the pointers in the Action func, which is invoked after
+argument parsing has been completed. This precludes using the value of one
+option as the default value of another.
+
+On the command line, the following syntaxes are supported when specifying
+options.
+
+Boolean options:
+
+    -f         single dash one letter name
+    -f=false   single dash one letter name, equal sign followed by true or false
+    --force    double dash for longer option names
+    -it        single dash for multiple one letter names (option folding), this is equivalent to: -i -t
+
+String and int options:
+
+    -e=value       single dash one letter name, equal sign, followed by the value
+    -e value       single dash one letter name, space followed by the value
+    -Ivalue        single dash one letter name, immediately followed by the value
+    --extra=value  double dash for longer option names, equal sign followed by the value
+    --extra value  double dash for longer option names, space followed by the value
+
+Slice options (StringsOpt, IntsOpt) where option is repeated to accumulate
+values in a slice:
+
+    -e PATH:/bin    -e PATH:/usr/bin     resulting slice contains ["/bin", "/usr/bin"]
+    -ePATH:/bin     -ePATH:/usr/bin      resulting slice contains ["/bin", "/usr/bin"]
+    -e=PATH:/bin    -e=PATH:/usr/bin     resulting slice contains ["/bin", "/usr/bin"]
+    --env PATH:/bin --env PATH:/usr/bin  resulting slice contains ["/bin", "/usr/bin"]
+    --env=PATH:/bin --env=PATH:/usr/bin  resulting slice contains ["/bin", "/usr/bin"]
 
-* For slice options (StringsOpt, IntsOpt): repeat the option to accumulate the values in the resulting slice:
 
-	-e PATH:/bin -e PATH:/usr/bin : resulting slice contains ["/bin", "/usr/bin"]
 
 Arguments
 
-To accept arguments, you need to explicitly declare them by calling one of the (String[s]|Int[s]|Bool)Arg methods on the app:
-
-	src := cp.StringArg("SRC", "", "the file to copy")
-	dst := cp.StringArg("DST", "", "the destination")
-
-* The first argument is the argument name as will be shown in the help messages
-
-* The second parameter is the default value for the argument
-
-* The third parameter is the argument description, as will be shown in the help messages
-
-There is also a second set of methods Bool, String, Int, Strings and Ints, which accepts structs describing the argument:
-
-	src = cp.Strings(StringsArg{
-		Name:  "SRC",
-		Desc:  "The source files to copy",
-		Value: "",
-		EnvVar: "",
-    	SetByUser: &srcSetByUser,
-	})
-
-The Value field is where you can set the initial value for the argument.
-
-EnvVar accepts a space separated list of environment variables names to be used to initialize the argument.
-
-If SetByUser is specified (by passing a pointer to a bool variable), it will be set to true only if the user explicitly sets the argument.
-
-
-The result is a pointer to a value that will be populated after parsing the command line arguments.
-You can access the values in the Action func.
+To add one or more command line arguments (not prefixed by dashes), use one of
+the short-form StringArg, StringsArg, IntArg, IntsArg, or BoolArg methods on App
+(or Cmd if adding arguments to a command or subcommand). For example, to add two
+string arguments to our cp command, use the following calls:
+
+    src := cp.StringArg("SRC", "", "the file to copy")
+    dst := cp.StringArg("DST", "", "the destination")
+
+The first argument is the name of the argument as displayed in help messages.
+Argument names must be specified as all uppercase.  The second argument is the
+default value for the argument if it is not supplied. And the third, argument is
+the description to be shown in help messages.
+
+There is also a second set of methods on App called String, Strings, Int, Ints,
+and Bool, which accept a long-form struct of the type: cli.StringArg,
+cli.StringsArg, cli.IntArg, cli.IntsArg, cli.BoolArg. The struct describes the
+arguments and allows the use of additional features not available in the
+short-form methods described above:
+
+    src = cp.Strings(StringsArg{
+        Name:      "SRC",
+        Desc:      "The source files to copy",
+        Value:     "default value",
+        EnvVar:    "VAR1 VAR2",
+        SetByUser: &srcSetByUser,
+    })
+
+Two features, EnvVar and SetByUser, can be defined in the long-form struct
+method. EnvVar is a space separated list of environment variables used to
+initialize the argument if a value is not provided by the user. When help
+messages are shown, the value of any environment variables will be displayed.
+SetByUser is a pointer to a boolean variable that is set to true if the user
+specified the value on the command line. This can be useful to determine if the
+value of the argument was explicitly set by the user or set via the default
+value.
+
+The result of both short- and long-forms is a pointer to a value which will be
+populated after the command line arguments are parsed. You can only access the
+values stored in the pointers in the Action func, which is invoked after
+argument parsing has been completed. This precludes using the value of one
+argument as the default value of another.
 
 
 
 Operators
 
-The -- operator marks the end of options.
-Everything that follow will be treated as an argument,
-even if starts with a dash.
-
-For example, given the touch command which takes a filename as an argument (and possibly other options):
-
+The -- operator marks the end of command line options. Everything that follows
+will be treated as an argument, even if starts with a dash.  For example, the
+standard POSIX touch command, which takes a filename as an argument (and
+possibly other options that we'll ignore here), could be defined as:
 
-	file := cp.StringArg("FILE", "", "the file to create")
+    file := cp.StringArg("FILE", "", "the file to create")
 
+If we try to create a file named "-f" via our touch command:
 
-If we try to create a file named -f this way:
+    $ touch -f
 
+It will fail because the -f will be parsed as an option, not as an argument. The
+fix is to insert -- after all flags have been specified, so the remaining
+arguments are parsed as arguments instead of options as follows:
 
-	touch -f
+    $ touch -- -f
 
-Would fail, because -f will be parsed as an option not as an argument.
-The fix is to prefix the filename with the -- operator:
-
-
-	touch -- -f
+This ensures the -f is parsed as an argument instead of a flag named f.
 
 
 
 Commands
 
-mow.cli supports nesting commands and sub commands.
-Declare a top level command by calling the Command func on the app struct, and a sub command by calling
-the Command func on the command struct:
-
-	docker := cli.App("docker", "A self-sufficient runtime for linux containers")
-
-	docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
-		// initialize the run command here
-	})
-
-* The first argument is the command name, as will be shown in the help messages and as will need to be input by the user in the command line to call the command
-
-* The second argument is the command description as will be shown in the help messages
-
-* The third argument is a CmdInitializer, a function that receives a pointer to a Cmd struct representing the command.
-In this function, you can add options and arguments by calling the same methods as you would with an app struct (BoolOpt, StringArg, ...).
-You would also assign a function to the Action field of the Cmd struct for it to be executed when the command is invoked.
-
-	docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
-		detached := cmd.BoolOpt("d detach", false, "Detached mode: run the container in the background and print the new container ID")
-		memory := cmd.StringOpt("m memory", "", "Memory limit (format: <number><optional unit>, where unit = b, k, m or g)")
-
-		image := cmd.StringArg("IMAGE", "", "The image to run")
-
-		cmd.Action = func() {
-			if *detached {
-				//do something
-			}
-			runContainer(*image, *detached, *memory)
-		}
-	})
-
-You can also add sub commands by calling Command on the Cmd struct:
-
-	bzk.Command("job", "actions on jobs", func(cmd *cli.Cmd) {
-		cmd.Command("list", "list jobs", listJobs)
-		cmd.Command("start", "start a new job", startJob)
-		cmd.Command("log", "show a job log", nil)
-	})
-
-This could go on to any depth if need be.
-
-mow.cli also supports command aliases. For example:
-
-	app.Command("start run r", "start doing things", cli.ActionCommand(func() { start() }))
-
-will alias `start`, `run`, and `r` to the same action. Aliases also work for
-subcommands:
-
-	app.Command("job j", "actions on jobs", func(cmd *cli.Cmd) {
-		cmd.Command("list ls", "list jobs", func(cmd *cli.Cmd) {
-			cmd.Action = func() {
-				list()
-			}
-		})
-	})
-
-which then allows you to invoke the subcommand as `app job list`, `app job ls`,
-`app j ls`, or `app j list`.
-
-
-As a side-note: it may seem a bit weird the way mow.cli uses a function to initialize a command
-instead of just returning the command struct.
-
-The motivation behind this choice is scoping: as with the standard flag package, adding an option or an argument
-returns a pointer to a value which will be populated when the app is run.
-
-Since you'll want to store these pointers in variables, and to avoid having dozens of them in the same scope (the main func for example or as global variables),
-mow.cli's API was specifically tailored to take a func parameter (called CmdInitializer) which accepts the command struct.
-
-This way, the command specific variables scope is limited to this function.
+This package supports nesting of commands and subcommands. Declare a top-level
+command by calling the Command func on the top-level App struct. For example,
+the following creates an application called docker that will have one command
+called run:
+
+    docker := cli.App("docker", "A self-sufficient runtime for linux containers")
+
+    docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
+        // initialize the run command here
+    })
+
+The first argument is the name of the command the user will specify on the
+command line to invoke this command.  The second argument is the description of
+the command shown in help messages.  And, the last argument is a CmdInitializer,
+which is a function that receives a pointer to a Cmd struct representing the
+command.
+
+Within this function, define the options and arguments for the command by
+calling the same methods as you would with top-level App struct (BoolOpt,
+StringArg, ...).  To execute code when the command is invoked, assign a function
+to the Action field of the Cmd struct. Within that function, you can safely
+refer to the options and arguments as command line parsing will be completed at
+the time the function is invoked:
+
+    docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
+        var (
+            detached = cmd.BoolOpt("d detach", false, "Run container in background")
+            memory   = cmd.StringOpt("m memory", "", "Set memory limit")
+            image    = cmd.StringArg("IMAGE", "", "The image to run")
+        )
+
+        cmd.Action = func() {
+            if *detached {
+                // do something
+            }
+            runContainer(*image, *detached, *memory)
+        }
+    })
+
+Optionally, to provide a more extensive description of the command, assign a
+string to LongDesc, which is displayed when a user invokes --help. A LongDesc
+can be provided for Cmds as well as the top-level App:
+
+    cmd.LongDesc = `Run a command in a new container
+
+    With the docker run command, an operator can add to or override the
+    image defaults set by a developer. And, additionally, operators can
+    override nearly all the defaults set by the Docker runtime itself.
+    The operator’s ability to override image and Docker runtime defaults
+    is why run has more options than any other docker command.`
+
+Subcommands can be added by calling Command on the Cmd struct. They can by
+defined to any depth if needed:
+
+    docker.Command("job", "actions on jobs", func(job *cli.Cmd) {
+        job.Command("list", "list jobs", listJobs)
+        job.Command("start", "start a new job", startJob)
+        job.Command("log", "log commands", func(log *cli.Cmd) {
+            log.Command("show", "show logs", showLog)
+            log.Command("clear", "clear logs", clearLog)
+        })
+    })
+
+Command and subcommand aliases are also supported. To define one or more
+aliases, specify a space-separated list of strings to the first argument of
+Command:
+
+    job.Command("start run r", "start a new job", startJob)
+
+With the command structure defined above, users can invoke the app in a variety
+of ways:
+
+    $ docker job list
+    $ docker job start
+    $ docker job run   # using the alias we defined
+    $ docker job r     # using the alias we defined
+    $ docker job log show
+    $ docker job log clear
+
+As a convenience, to assign an Action to a func with no arguments, use
+ActionCommand when defining the Command. For example, the following two
+statements are equivalent:
+
+    app.Command("list", "list all configs", cli.ActionCommand(list))
+
+    // Exactly the same as above, just more verbose
+    app.Command("list", "list all configs", func(cmd *cli.Cmd)) {
+        cmd.Action = func() {
+            list()
+        }
+    }
+
+Please note that options, arguments, specs, and long descriptions cannot be
+provided when using ActionCommand. This is intended for very simple command
+invocations that take no arguments.
+
+Finally, as a side-note, it may seem a bit weird that this package uses a
+function to initialize a command instead of simply returning a command struct.
+The motivation behind this API decision is scoping: as with the standard flag
+package, adding an option or an argument returns a pointer to a value which will
+be populated when the app is run.  Since you'll want to store these pointers in
+variables, and to avoid having dozens of them in the same scope (the main func
+for example or as global variables), this API was specifically tailored to take
+a func parameter (called CmdInitializer), which accepts the command struct. With
+this design, the command's specific variables are limited in scope to this
+function.
 
-Custom types
 
-Out of the box, mow.cli supports the following types for options and arguments: bool, string, int, strings (slice of strings) and ints (slice of ints)
-
-You can however extend mow.cli to handle other types, e.g. `time.Duration`, `float64`, or even your own struct types for example.
-
-To do so, you'll need to:
-
-* implement the `flag.Value` interface for the custom type
-
-* declare the option or the flag using `VarOpt`, `VarArg` for the short hands, and `Var` for the full form.
-
-Here's an example:
-
-
-	// Declare your type
-	type Duration time.Duration
-
-	// Make it implement flag.Value
-	func (d *Duration) Set(v string) error {
-		parsed, err := time.ParseDuration(v)
-		if err != nil {
-			return err
-		}
-		*d = Duration(parsed)
-		return nil
-	}
-
-	func (d *Duration) String() string {
-		duration := time.Duration(*d)
-		return duration.String()
-	}
-
-	func main() {
-		duration := Duration(0)
-
-		app := App("var", "")
-
-		app.VarArg("DURATION", &duration, "")
-
-		app.Run([]string{"cp", "1h31m42s"})
-	}
-
-Boolean custom types
-
-To make your custom type behave as a boolean option, i.e. doesn't take a value, it has to implement a IsBoolFlag method that returns true:
-
-
-	type BoolLike int
-
-
-	func (d *BoolLike) IsBoolFlag() bool {
-		return true
-	}
-
-
-Multi-valued custom type
-
-To make your custom type behave as a multi-valued option or argument, i.e. takes multiple values,
-it has to implement a `Clear` method which will be called whenever the values list needs to be cleared,
-e.g. when the value was initially populated from an environment variable, and then explicitly set from the CLI:
-
-	type Durations []time.Duration
-
-	// Make it implement flag.Value
-	func (d *Durations) Set(v string) error {
-		parsed, err := time.ParseDuration(v)
-		if err != nil {
-			return err
-		}
-		*d = append(*d, Duration(parsed))
-		return nil
-	}
-
-	func (d *Durations) String() string {
-		return fmt.Sprintf("%v", *d)
-	}
-
-
-	// Make it multi-valued
-	func (d *Durations) Clear() {
-		*d = []Duration{}
-	}
 
 Interceptors
 
-It is possible to define snippets of code to be executed before and after a command or any of its sub commands is executed.
-
-For example, given an app with multiple commands but with a global flag which toggles a verbose mode:
-
-
-	app := cli.App("app", "bla bla")
-	verbose := app.Bool(cli.BoolOpt{
-		Name:  "verbose",
-		Value: false,
-		Desc:  "Enable debug logs",
-	})
-
-	app.Command("command1", "...", func(cmd *cli.Cmd) {
-
-	})
-
-	app.Command("command2", "...", func(cmd *cli.Cmd) {
-
-	})
-
-Instead of repeating yourself by checking if the verbose flag is set or not, and setting the debug level in every command (and its sub-commands),
-a before interceptor can be set on the `app` instead:
+Interceptors, or hooks, can be defined to be executed before and after a command
+or when any of its subcommands are executed.  For example, the following app
+defines multiple commands as well as a global flag which toggles verbosity:
 
-	app.Before = func() {
-		if (*verbose) {
-			logrus.SetLevel(logrus.DebugLevel)
-		}
-	}
+    app := cli.App("app", "bla bla")
+    verbose := app.BoolOpt("verbose v", false, "Enable debug logs")
 
-Whenever a valid command is called by the user, all the before interceptors defined on the app and the intermediate commands
-will be called, in order from the root to the leaf.
+    app.Command("command1", "...", func(cmd *cli.Cmd) {
+        if (*verbose) {
+            logrus.SetLevel(logrus.DebugLevel)
+        }
+    })
 
-Similarly, if you need to execute a code snippet after a command has been called, e.g. to cleanup resources allocated in before interceptors,
-simply set the After field of the app struct or any other command.
+    app.Command("command2", "...", func(cmd *cli.Cmd) {
+        if (*verbose) {
+            logrus.SetLevel(logrus.DebugLevel)
+        }
+    })
 
-After interceptors will be called, in order from the leaf up to the root (the opposite order of the Before interceptors).
+Instead of duplicating the check for the verbose flag and setting the debug
+level in every command (and its sub-commands), a Before interceptor can be set
+on the top-level App instead:
 
-Here's a diagram which shows in when and in which order multiple Before and After interceptors get executed:
+    app.Before = func() {
+        if (*verbose) {
+            logrus.SetLevel(logrus.DebugLevel)
+        }
+    }
 
-	+------------+    success    +------------+   success   +----------------+     success
-	| app.Before +---------------> cmd.Before +-------------> sub_cmd.Before +---------+
-	+------------+               +-+----------+             +--+-------------+         |
-	                               |                           |                     +-v-------+
-	                 error         |           error           |                     | sub_cmd |
-	       +-----------------------+   +-----------------------+                     | Action  |
-	       |                           |                                             +-+-------+
-	+------v-----+               +-----v------+             +----------------+         |
-	| app.After  <---------------+ cmd.After  <-------------+  sub_cmd.After <---------+
-	+------------+    always     +------------+    always   +----------------+      always
+Whenever a valid command is called by the user, all the Before interceptors
+defined on the app and the intermediate commands will be called, in order from
+the root to the leaf.
 
-Spec
+Similarly, to execute a hook after a command has been called, e.g. to cleanup
+resources allocated in Before interceptors, simply set the After field of the
+App struct or any other Command. After interceptors will be called, in order,
+from the leaf up to the root (the opposite order of the Before interceptors).
 
-An app or command's call syntax can be customized using spec strings.
-This can be useful to indicate that an argument is optional for example, or that 2 options are mutually exclusive.
+The following diagram shows when and in which order multiple Before and After
+interceptors are executed:
 
-You can set a spec string on:
+    +------------+    success    +------------+   success   +----------------+     success
+    | app.Before +---------------> cmd.Before +-------------> sub_cmd.Before +---------+
+    +------------+               +-+----------+             +--+-------------+         |
+                                   |                           |                     +-v-------+
+                     error         |           error           |                     | sub_cmd |
+           +-----------------------+   +-----------------------+                     | Action  |
+           |                           |                                             +-+-------+
+    +------v-----+               +-----v------+             +----------------+         |
+    | app.After  <---------------+ cmd.After  <-------------+  sub_cmd.After <---------+
+    +------------+    always     +------------+    always   +----------------+      always
 
-* The app: to configure the syntax for global options and arguments
 
-* A command: to configure the syntax for that command's options and arguments
 
-In both cases, a spec string is assigned to the Spec field:
-
-	cp := cli.App("cp", "Copy files around")
-	cp.Spec = "[-R [-H | -L | -P]]"
-
-And:
-
-	docker := cli.App("docker", "A self-sufficient runtime for linux containers")
-	docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
-		cmd.Spec = "[-d|--rm] IMAGE [COMMAND [ARG...]]"
-		:
-		:
-	}
+Exiting
 
-The spec syntax is mostly based on the conventions used in POSIX command line apps help messages and man pages:
+To exit the application, use cli.Exit function, which accepts an exit code and
+exits the app with the provided code.  It is important to use cli.Exit instead
+of os.Exit as the former ensures that all of the After interceptors are executed
+before exiting.
+
+    cli.Exit(1)
+
+
+
+Spec Strings
+
+An App or Command's invocation syntax can be customized using spec strings. This
+can be useful to indicate that an argument is optional or that two options are
+mutually exclusive.  The spec string is one of the key differentiators between
+this package and other CLI packages as it allows the developer to express usage
+in a simple, familiar, yet concise grammar.
+
+To define option and argument usage for the top-level App, assign a spec string
+to the App's Spec field:
+
+    cp := cli.App("cp", "Copy files around")
+    cp.Spec = "[-R [-H | -L | -P]]"
+
+Likewise, to define option and argument usage for a command or subcommand,
+assign a spec string to the Command's Spec field:
+
+    docker := cli.App("docker", "A self-sufficient runtime for linux containers")
+    docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
+        cmd.Spec = "[-d|--rm] IMAGE [COMMAND [ARG...]]"
+        :
+        :
+    }
+
+The spec syntax is mostly based on the conventions used in POSIX command line
+applications (help messages and man pages). This syntax is described in full
+below. If a user invokes the app or command with the incorrect syntax, the app
+terminates with a help message showing the proper invocation. The remainder of
+this section describes the many features and capabilities of the spec string
+grammar.
+
+Options can use both short and long option names in spec strings.  In the
+example below, the option is mandatory and must be provided.  Any options
+referenced in a spec string MUST be explicitly declared, otherwise this package
+will panic. I.e. for each item in the spec string, a corresponding *Opt or *Arg
+is required:
+
+    x.Spec = "-f"  // or x.Spec = "--force"
+    forceFlag := x.BoolOpt("f force", ...)
+
+Arguments are specified with all-uppercased words.  In the example below, both
+SRC and DST must be provided by the user (two arguments).  Like options, any
+argument referenced in a spec string MUST be explicitly declared, otherwise this
+package will panic:
+
+    x.Spec="SRC DST"
+    src := x.StringArg("SRC", ...)
+    dst := x.StringArg("DST", ...)
 
-Options
+With the exception of options, the order of the elements in a spec string is
+respected and enforced when command line arguments are parsed.  In the example
+below, consecutive options (-f and -g) are parsed regardless of the order they
+are specified (both "-f=5 -g=6" and "-g=6 -f=5" are valid).  Order between
+options and arguments is significant (-f and -g must appear before the SRC
+argument). The same holds true for arguments, where SRC must appear before DST:
 
-You can use both short and long option names in spec strings:
-	x.Spec="-f"
-And:
-	x.Spec="--force"
+    x.Spec = "-f -g SRC -h DST"
+    var (
+        factor = x.IntOpt("f", 1, "Fun factor (1-5)")
+        games  = x.IntOpt("g", 1, "# of games")
+        health = x.IntOpt("h", 1, "# of hosts")
+        src    = x.StringArg("SRC", ...)
+        dst    = x.StringArg("DST", ...)
+    )
 
-In both cases, we required that the f or force flag be set
+Optionality of options and arguments is specified in a spec string by enclosing
+the item in square brackets []. If the user does not provide an optional value,
+the app will use the default value specified when the argument was defined. In
+the example below, if -x is not provided, heapSize will default to 1024:
 
-Any option you reference in a spec string MUST be explicitly declared, otherwise mow.cli will panic:
+    x.Spec = "[-x]"
+    heapSize := x.IntOpt("x", 1024, "Heap size in MB")
 
-	x.BoolOpt("f force", ...)
+Choice between two or more items is specified in a spec string by separating
+each choice with the | operator. Choices are mutually exclusive. In the examples
+below, only a single choice can be provided by the user otherwise the app will
+terminate displaying a help message on proper usage:
 
-Arguments
+    x.Spec = "--rm | --daemon"
+    x.Spec = "-H | -L | -P"
+    x.Spec = "-t | DST"
 
-Arguments are all-uppercased words:
-	x.Spec="SRC DST"
-This spec string will force the user to pass exactly 2 arguments, SRC and DST
+Repetition of options and arguments is specified in a spec string with the ...
+postfix operator to mark an item as repeatable. Both options and arguments
+support repitition. In the example below, users may invoke the command with
+multiple -e options and multiple SRC arguments:
 
-Any argument you reference in a spec string MUST be explicitly declared, otherwise mow.cli will panic:
+    x.Spec = "-e... SRC..."
 
-	x.StringArg("SRC", ...)
-	x.StringArg("DST", ...)
+    // Allows parsing of the following shell command:
+    //   $ app -eeeee file1 file2
+    //   $ app -e -e -e -e file1 file2
 
-Ordering
+Grouping of options and arguments is specified in a spec string with
+parenthesis.  When combined with the choice | and repetition ... operators,
+complex syntaxes can be created. The parenthesis in the example below indicate a
+repeatable sequence of a -e option followed by an argument, and that is mutually
+exclusive to a choice between -x and -y options.
 
-Except for options, The order of the elements in a spec string is respected and enforced when parsing the command line arguments:
+    x.Spec = "(-e COMMAND)... | (-x|-y)"
+
+    // Allows parsing of the following shell command:
+    //   $ app -e show -e add
+    //   $ app -y
+    // But not the following:
+    //   $ app -e show -x
+
+Option groups, or option folding, are a shorthand method to declaring a choice
+between multiple options.  I.e. any combination of the listed options in any
+order with at least one option selected. The following two statements are
+equivalent:
+
+    x.Spec = "-abcd"
+    x.Spec = "(-a | -b | -c | -d)..."
+
+Option groups are typically used in conjunction with optionality [] operators.
+I.e. any combination of the listed options in any order or none at all. The
+following two statements are equivalent:
+
+    x.Spec = "[-abcd]"
+    x.Spec = "[-a | -b | -c | -d]..."
+
+All of the options can be specified using a special syntax: [OPTIONS]. This is a
+special token in the spec string (not optionality and not an argument called
+OPTIONS). It is equivalent to an optional repeatable choice between all the
+available options. For example, if an app or a command declares 4 options a, b,
+c and d, then the following two statements are equivalent:
+
+    x.Spec = "[OPTIONS]"
+    x.Spec = "[-a | -b | -c | -d]..."
 
-	x.Spec = "-f -g SRC -h DST"
+Inline option values are specified in the spec string with the =<some-text>
+notation immediately following an option (long or short form) to provide users
+with an inline description or value. The actual inline values are ignored by the
+spec parser as they exist only to provide a contextual hint to the user. In the
+example below, "absolute-path" and "in seconds" are ignored by the parser:
 
-Consecutive options (-f and -g for example) get parsed regardless of the order they are specified in (both "-f=5 -g=6" and "-g=6 -f=5" are valid).
+    x.Spec = "[ -a=<absolute-path> | --timeout=<in seconds> ] ARG"
 
-Order between options and arguments is significant (-f and -g must appear before the SRC argument).
+The -- operator can be used to automatically treat everything following it as
+arguments.  In other words, placing a -- in the spec string automatically
+inserts a -- in the same position in the program call arguments. This lets you
+write programs such as the POSIX time utility for example:
 
-Same goes for arguments, where SRC must appear before DST.
+    x.Spec = "-lp [-- CMD [ARG...]]"
 
-Optionality
+    // Allows parsing of the following shell command:
+    //   $ app -p ps -aux
 
-You can mark items as optional in a spec string by enclosing them in square brackets :[...]
-	x.Spec = "[-x]"
 
-Choice
 
-You can use the | operator to indicate a choice between two or more items
-	x.Spec = "--rm | --daemon"
-	x.Spec = "-H | -L | -P"
-	x.Spec = "-t | DST"
+Spec Grammar
 
-Repetition
+Below is the full EBNF grammar for the Specs language:
 
-You can use the ... postfix operator to mark an element as repeatable:
-	x.Spec="SRC..."
-	x.Spec="-e..."
+    spec         -> sequence
+    sequence     -> choice*
+    req_sequence -> choice+
+    choice       -> atom ('|' atom)*
+    atom         -> (shortOpt | longOpt | optSeq | allOpts | group | optional) rep?
+    shortOp      -> '-' [A-Za-z]
+    longOpt      -> '--' [A-Za-z][A-Za-z0-9]*
+    optSeq       -> '-' [A-Za-z]+
+    allOpts      -> '[OPTIONS]'
+    group        -> '(' req_sequence ')'
+    optional     -> '[' req_sequence ']'
+    rep          -> '...'
 
-Grouping
+By combining a few of these building blocks together (while respecting the
+grammar above), powerful and sophisticated validation constraints can be created
+in a simple and concise manner without having to define in code. This is one of
+the key differentiators between this package and other CLI packages. Validation
+of usage is handled entirely by the package through the spec string.
 
-You can group items using parenthesis. This is useful in combination with the choice and repetition operators (| and ...):
-	x.Spec = "(-e COMMAND)... | (-x|-y)"
-The parenthesis in the example above serve to mark that it is the sequence of a -e flag followed by an argument that is repeatable, and that
-all that is mutually exclusive to a choice between -x and -y options.
+Behind the scenes, this package parses the spec string and constructs a finite
+state machine used to parse the command line arguments. It also handles
+backtracking, which allows it to handle tricky cases, or what I like to call
+"the cp test":
 
-Option group
+    cp SRC... DST
+
+Without backtracking, this deceptively simple spec string cannot be parsed
+correctly. For instance, docopt can't handle this case, whereas this package
+does.
+
+
+
+Default Spec
+
+By default an auto-generated spec string is created for the app and every
+command unless a spec string has been set by the user.  This can simplify use of
+the package even further for simple syntaxes.
+
+The following logic is used to create an auto-generated spec string: 1) start
+with an empty spec string, 2) if at least one option was declared, append
+"[OPTIONS]" to the spec string, and 3) for each declared argument, append it, in
+the order of declaration, to the spec string. For example, given this command
+declaration:
 
-This is a shortcut to declare a choice between multiple options:
-	x.Spec = "-abcd"
-Is equivalent to:
-	x.Spec = "(-a | -b | -c | -d)..."
-I.e. any combination of the listed options in any order, with at least one option.
+    docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
+        var (
+            detached = cmd.BoolOpt("d detach", false, "Run container in background")
+            memory   = cmd.StringOpt("m memory", "", "Set memory limit")
+            image    = cmd.StringArg("IMAGE", "", "The image to run")
+            args     = cmd.StringsArg("ARG", nil, "Arguments")
+        )
+    })
 
-All options
+The auto-generated spec string, which should suffice for simple cases, would be:
 
-Another shortcut:
-	x.Spec = "[OPTIONS]"
-This is a special syntax (the square brackets are not for marking an optional item, and the uppercased word is not for an argument).
-This is equivalent to a repeatable choice between all the available options.
-For example, if an app or a command declares 4 options a, b, c and d, [OPTIONS] is equivalent to
-	x.Spec = "[-a | -b | -c | -d]..."
+    [OPTIONS] IMAGE ARG
 
-Inline option values
+If additional constraints are required, the spec string must be set explicitly
+using the grammar documented above.
 
-You can use the =<some-text> notation right after an option (long or short form) to give an inline description or value.
-An example:
-	x.Spec = "[ -a=<absolute-path> | --timeout=<in seconds> ] ARG"
-The inline values are ignored by the spec parser and are just there for the final user as a contextual hint.
 
-Operators
 
-The `--` operator can be used in a spec string to automatically treat everything following it as an options.
+Custom Types
 
-In other words, placing a `--` in the spec string automatically inserts a `--` in the same position in the program call arguments.
+By default, the following types are supported for options and arguments: bool,
+string, int, strings (slice of strings), and ints (slice of ints).  You can,
+however, extend this package to handle other types, e.g. time.Duration, float64,
+or even your own struct types.
 
-This lets you write programs like the `time` utility for example:
+To define your own custom type, you must implement the flag.Value interface for
+your custom type, and then declare the option or argument using VarOpt or VarArg
+respectively if using the short-form methods. If using the long-form struct,
+then use Var instead.
 
-	x.Spec = "time -lp [-- CMD [ARG...]]"
+The following example defines a custom type for a duration. It defines a
+duration argument that users will be able to invoke with strings in the form of
+"1h31m42s":
 
+    // Declare your type
+    type Duration time.Duration
 
-Spec Grammar
+    // Make it implement flag.Value
+    func (d *Duration) Set(v string) error {
+        parsed, err := time.ParseDuration(v)
+        if err != nil {
+            return err
+        }
+        *d = Duration(parsed)
+        return nil
+    }
 
-Here's the EBNF grammar for the Specs language:
+    func (d *Duration) String() string {
+        duration := time.Duration(*d)
+        return duration.String()
+    }
 
-	spec         -> sequence
-	sequence     -> choice*
-	req_sequence -> choice+
-	choice       -> atom ('|' atom)*
-	atom         -> (shortOpt | longOpt | optSeq | allOpts | group | optional) rep?
-	shortOp      -> '-' [A-Za-z]
-	longOpt      -> '--' [A-Za-z][A-Za-z0-9]*
-	optSeq       -> '-' [A-Za-z]+
-	allOpts      -> '[OPTIONS]'
-	group        -> '(' req_sequence ')'
-	optional     -> '[' req_sequence ']'
-	rep          -> '...'
+    func main() {
+        duration := Duration(0)
+        app := App("var", "")
+        app.VarArg("DURATION", &duration, "")
+        app.Run([]string{"cp", "1h31m42s"})
+    }
 
-And that's it for the spec language.
-You can combine these few building blocks in any way you want (while respecting the grammar above) to construct sophisticated validation constraints
-(don't go too wild though).
+To make a custom type to behave as a boolean option, i.e. doesn't take a value,
+it must implement the IsBoolFlag method that returns true:
 
-Behind the scenes, mow.cli parses the spec string and constructs a finite state machine to be used to parse the command line arguments.
-mow.cli also handles backtracking, and so it can handle tricky cases, or what I like to call "the cp test"
-	cp SRC... DST
-Without backtracking, this deceptively simple spec string cannot be parsed correctly.
-For instance, docopt can't handle this case, whereas mow.cli does.
+    type BoolLike int
 
-Default spec
+    func (d *BoolLike) IsBoolFlag() bool {
+        return true
+    }
 
-By default, and unless a spec string is set by the user, mow.cli auto-generates one for the app and every command using this logic:
+To make a custom type behave as a multi-valued option or argument, i.e. takes
+multiple values, it must implement the Clear method, which is called whenever
+the values list needs to be cleared, e.g. when the value was initially populated
+from an environment variable, and then explicitly set from the CLI:
 
-* Start with an empty spec string
+    type Durations []time.Duration
 
-* If at least one option was declared, append "[OPTIONS]" to the spec string
+    // Make it implement flag.Value
+    func (d *Durations) Set(v string) error {
+        parsed, err := time.ParseDuration(v)
+        if err != nil {
+            return err
+        }
+        *d = append(*d, Duration(parsed))
+        return nil
+    }
 
-* For every declared argument, append it, in the order of declaration, to the spec string
+    func (d *Durations) String() string {
+        return fmt.Sprintf("%v", *d)
+    }
 
-For example, given this command declaration:
-	docker.Command("run", "Run a command in a new container", func(cmd *cli.Cmd) {
-		detached := cmd.BoolOpt("d detach", false, "Detached mode: run the container in the background and print the new container ID")
-		memory := cmd.StringOpt("m memory", "", "Memory limit (format: <number><optional unit>, where unit = b, k, m or g)")
+    // Make it multi-valued
+    func (d *Durations) Clear() {
+        *d = []Duration{}
+    }
 
-		image := cmd.StringArg("IMAGE", "", "")
-		args := cmd.StringsArg("ARG", "", "")
-	})
-The auto-generated spec string would be:
-	[OPTIONS] IMAGE ARG
+To hide the default value of a custom type, it must implement the IsDefault
+method that returns a boolean. The help message generator will use the return
+value to decide whether or not to display the default value to users:
 
-Which should suffice for simple cases. If not, the spec string has to be set explicitly.
+    type Action string
 
+    func (a *Action) IsDefault() bool {
+        return (*a) == "nop"
+    }
 
-Exiting
-
-mow.cli provides the Exit function which accepts an exit code and exits the app with the provided code.
 
-You are highly encouraged to call cli.Exit instead of os.Exit for the After interceptors to be executed.
 */
 package cli
diff --git a/vendor/github.com/jawher/mow.cli/errors.go b/vendor/github.com/jawher/mow.cli/errors.go
index b2e21fc67e66c437cad2b5e367efb3ba50689ba8..40ad38b8d4b5a8e065e49b4c29ce077d727b1e4d 100644
--- a/vendor/github.com/jawher/mow.cli/errors.go
+++ b/vendor/github.com/jawher/mow.cli/errors.go
@@ -5,6 +5,6 @@ import (
 )
 
 var (
-	errHelpRequested    = errors.New("Help requested")
-	errVersionRequested = errors.New("Version requested")
+	errHelpRequested    = errors.New("help requested")
+	errVersionRequested = errors.New("version requested")
 )
diff --git a/vendor/github.com/jawher/mow.cli/flow.go b/vendor/github.com/jawher/mow.cli/flow.go
deleted file mode 100644
index 21bbbf8b513006331828acf1617a054e3db7540b..0000000000000000000000000000000000000000
--- a/vendor/github.com/jawher/mow.cli/flow.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package cli
-
-import (
-	"fmt"
-	"strings"
-)
-
-type step struct {
-	do      func()
-	success *step
-	error   *step
-	desc    string
-}
-
-func (s *step) run(p interface{}) {
-	s.callDo(p)
-
-	switch {
-	case s.success != nil:
-		s.success.run(p)
-	case p == nil:
-		return
-	default:
-		if code, ok := p.(exit); ok {
-			exiter(int(code))
-			return
-		}
-		panic(p)
-	}
-}
-
-func (s *step) callDo(p interface{}) {
-	if s.do == nil {
-		return
-	}
-	defer func() {
-		if e := recover(); e != nil {
-			if s.error == nil {
-				panic(p)
-			}
-			s.error.run(e)
-		}
-	}()
-	s.do()
-}
-
-func (s *step) dot() string {
-	trs := flowDot(s, map[*step]bool{})
-	return fmt.Sprintf("digraph G {\n\trankdir=LR\n%s\n}\n", strings.Join(trs, "\n"))
-}
-
-func flowDot(s *step, visited map[*step]bool) []string {
-	res := []string{}
-	if visited[s] {
-		return res
-	}
-	visited[s] = true
-
-	if s.success != nil {
-		res = append(res, fmt.Sprintf("\t\"%s\" -> \"%s\" [label=\"ok\"]", s.desc, s.success.desc))
-		res = append(res, flowDot(s.success, visited)...)
-	}
-	if s.error != nil {
-		res = append(res, fmt.Sprintf("\t\"%s\" -> \"%s\" [label=\"ko\"]", s.desc, s.error.desc))
-		res = append(res, flowDot(s.error, visited)...)
-	}
-	return res
-}
diff --git a/vendor/github.com/jawher/mow.cli/fsm.go b/vendor/github.com/jawher/mow.cli/fsm.go
deleted file mode 100644
index fbeaf0bab3b64159b6cbb983ffd065c277a18e05..0000000000000000000000000000000000000000
--- a/vendor/github.com/jawher/mow.cli/fsm.go
+++ /dev/null
@@ -1,254 +0,0 @@
-package cli
-
-import (
-	"sort"
-	"strings"
-
-	"fmt"
-)
-
-type state struct {
-	id          int
-	terminal    bool
-	transitions transitions
-	cmd         *Cmd
-}
-
-type transition struct {
-	matcher upMatcher
-	next    *state
-}
-
-type transitions []*transition
-
-func (t transitions) Len() int      { return len(t) }
-func (t transitions) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
-func (t transitions) Less(i, j int) bool {
-	a, _ := t[i].matcher, t[j].matcher
-	switch a.(type) {
-	case upShortcut:
-		return false
-	case upOptsEnd:
-		return false
-	case *arg:
-		return false
-	default:
-		return true
-	}
-
-}
-
-var _id = 0
-
-func newState(cmd *Cmd) *state {
-	_id++
-	return &state{_id, false, []*transition{}, cmd}
-}
-
-func (s *state) t(matcher upMatcher, next *state) *state {
-	s.transitions = append(s.transitions, &transition{matcher, next})
-	return next
-}
-
-func (s *state) has(tr *transition) bool {
-	for _, t := range s.transitions {
-		if t.next == tr.next && t.matcher == tr.matcher {
-			return true
-		}
-	}
-	return false
-}
-
-func incoming(s, into *state, visited map[*state]bool) []*transition {
-	res := []*transition{}
-	if visited[s] {
-		return res
-	}
-	visited[s] = true
-
-	for _, tr := range s.transitions {
-		if tr.next == into {
-			res = append(res, tr)
-		}
-		res = append(res, incoming(tr.next, into, visited)...)
-	}
-	return res
-}
-
-func removeTransitionAt(idx int, arr transitions) transitions {
-	res := make([]*transition, len(arr)-1)
-	copy(res, arr[:idx])
-	copy(res[idx:], arr[idx+1:])
-	return res
-}
-
-func (s *state) simplify() {
-	simplify(s, s, map[*state]bool{})
-}
-
-func simplify(start, s *state, visited map[*state]bool) {
-	if visited[s] {
-		return
-	}
-	visited[s] = true
-	for _, tr := range s.transitions {
-		simplify(start, tr.next, visited)
-	}
-	for s.simplifySelf(start) {
-	}
-}
-
-func (s *state) simplifySelf(start *state) bool {
-	for idx, tr := range s.transitions {
-		if _, ok := tr.matcher.(upShortcut); ok {
-			next := tr.next
-			s.transitions = removeTransitionAt(idx, s.transitions)
-			for _, tr := range next.transitions {
-				if !s.has(tr) {
-					s.transitions = append(s.transitions, tr)
-				}
-			}
-			if next.terminal {
-				s.terminal = true
-			}
-			return true
-		}
-	}
-	return false
-}
-
-func (s *state) dot() string {
-	trs := dot(s, map[*state]bool{})
-	return fmt.Sprintf("digraph G {\n\trankdir=LR\n%s\n}\n", strings.Join(trs, "\n"))
-}
-
-func dot(s *state, visited map[*state]bool) []string {
-	res := []string{}
-	if visited[s] {
-		return res
-	}
-	visited[s] = true
-
-	for _, tr := range s.transitions {
-		res = append(res, fmt.Sprintf("\tS%d -> S%d [label=\"%v\"]", s.id, tr.next.id, tr.matcher))
-		res = append(res, dot(tr.next, visited)...)
-	}
-	if s.terminal {
-		res = append(res, fmt.Sprintf("\tS%d [peripheries=2]", s.id))
-	}
-	return res
-}
-
-type parseContext struct {
-	args          map[*arg][]string
-	opts          map[*opt][]string
-	excludedOpts  map[*opt]struct{}
-	rejectOptions bool
-}
-
-func newParseContext() parseContext {
-	return parseContext{
-		args:          map[*arg][]string{},
-		opts:          map[*opt][]string{},
-		excludedOpts:  map[*opt]struct{}{},
-		rejectOptions: false,
-	}
-}
-
-func (pc parseContext) merge(o parseContext) {
-	for k, vs := range o.args {
-		pc.args[k] = append(pc.args[k], vs...)
-	}
-
-	for k, vs := range o.opts {
-		pc.opts[k] = append(pc.opts[k], vs...)
-	}
-}
-
-func (s *state) parse(args []string) error {
-	pc := newParseContext()
-	ok, err := s.apply(args, pc)
-	if err != nil {
-		return err
-	}
-	if !ok {
-		return fmt.Errorf("incorrect usage")
-	}
-
-	for opt, vs := range pc.opts {
-		if multiValued, ok := opt.value.(multiValued); ok {
-			multiValued.Clear()
-			opt.valueSetFromEnv = false
-		}
-		for _, v := range vs {
-			if err := opt.value.Set(v); err != nil {
-				return err
-			}
-		}
-
-		if opt.valueSetByUser != nil {
-			*opt.valueSetByUser = true
-		}
-	}
-
-	for arg, vs := range pc.args {
-		if multiValued, ok := arg.value.(multiValued); ok {
-			multiValued.Clear()
-			arg.valueSetFromEnv = false
-		}
-		for _, v := range vs {
-			if err := arg.value.Set(v); err != nil {
-				return err
-			}
-		}
-
-		if arg.valueSetByUser != nil {
-			*arg.valueSetByUser = true
-		}
-	}
-
-	return nil
-}
-
-func (s *state) apply(args []string, pc parseContext) (bool, error) {
-	if s.terminal && len(args) == 0 {
-		return true, nil
-	}
-	sort.Sort(s.transitions)
-
-	if len(args) > 0 {
-		arg := args[0]
-
-		if !pc.rejectOptions && arg == "--" {
-			pc.rejectOptions = true
-			args = args[1:]
-		}
-	}
-
-	type match struct {
-		tr  *transition
-		rem []string
-		pc  parseContext
-	}
-
-	matches := []*match{}
-	for _, tr := range s.transitions {
-		fresh := newParseContext()
-		fresh.rejectOptions = pc.rejectOptions
-		if ok, rem := tr.matcher.match(args, &fresh); ok {
-			matches = append(matches, &match{tr, rem, fresh})
-		}
-	}
-
-	for _, m := range matches {
-		ok, err := m.tr.next.apply(m.rem, m.pc)
-		if err != nil {
-			return false, err
-		}
-		if ok {
-			pc.merge(m.pc)
-			return true, nil
-		}
-	}
-	return false, nil
-}
diff --git a/vendor/github.com/jawher/mow.cli/internal/container/container.go b/vendor/github.com/jawher/mow.cli/internal/container/container.go
new file mode 100644
index 0000000000000000000000000000000000000000..d5d858f2a357878ca8d8dc5cd51aac2ce27dbdbd
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/container/container.go
@@ -0,0 +1,17 @@
+package container
+
+import "flag"
+
+/*
+Container holds an option or an arg data
+*/
+type Container struct {
+	Name            string
+	Desc            string
+	EnvVar          string
+	Names           []string
+	HideValue       bool
+	ValueSetFromEnv bool
+	ValueSetByUser  *bool
+	Value           flag.Value
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/flow/flow.go b/vendor/github.com/jawher/mow.cli/internal/flow/flow.go
new file mode 100644
index 0000000000000000000000000000000000000000..1c75809134413e0e057be6bc03b2c16e5ee02714
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/flow/flow.go
@@ -0,0 +1,56 @@
+package flow
+
+/*
+ExitCode is a value used in a call to panic to signify that code execution should be stopped,
+before/after listeners executed and finally that the app whould exit with the provided exit code
+*/
+type ExitCode int
+
+/*
+Step is the building block of execution flow.
+It has a code block to run, a success step to go to if the former succeeds, or go to an error step otherwise
+*/
+type Step struct {
+	Do      func()
+	Success *Step
+	Error   *Step
+	Desc    string
+	Exiter  func(code int)
+}
+
+/*
+Run call the code block of the step, moves to the success step if the call went ok, opr the the error step otherwise
+*/
+func (s *Step) Run(p interface{}) {
+	s.callDo(p)
+
+	switch {
+	case s.Success != nil:
+		s.Success.Run(p)
+	case p == nil:
+		return
+	default:
+		if code, ok := p.(ExitCode); ok {
+			if s.Exiter != nil {
+				s.Exiter(int(code))
+			}
+			return
+		}
+		panic(p)
+	}
+}
+
+func (s *Step) callDo(p interface{}) {
+	if s.Do == nil {
+		return
+	}
+	defer func() {
+		if e := recover(); e != nil {
+			if s.Error == nil {
+				panic(p)
+			}
+			s.Error.Run(e)
+		}
+	}()
+	s.Do()
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/fsm/fsm.go b/vendor/github.com/jawher/mow.cli/internal/fsm/fsm.go
new file mode 100644
index 0000000000000000000000000000000000000000..e16208e6a250ae378e6dff4b35937724db39b4ef
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/fsm/fsm.go
@@ -0,0 +1,190 @@
+package fsm
+
+import (
+	"sort"
+
+	"fmt"
+
+	"github.com/jawher/mow.cli/internal/container"
+	"github.com/jawher/mow.cli/internal/matcher"
+	"github.com/jawher/mow.cli/internal/values"
+)
+
+/*
+State is the basic building block in the FSM.
+A State can be final or not, and has transitions to other states
+
+*/
+type State struct {
+	Terminal    bool
+	Transitions StateTransitions
+}
+
+/*
+Transition links 2 states.
+If a transition's matcher matches, the next state can be reached
+*/
+type Transition struct {
+	Matcher matcher.Matcher
+	Next    *State
+}
+
+// StateTransitions is a sortable slice of transitions according to their priorities
+type StateTransitions []*Transition
+
+func (t StateTransitions) Len() int      { return len(t) }
+func (t StateTransitions) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
+func (t StateTransitions) Less(i, j int) bool {
+	a, b := t[i].Matcher, t[j].Matcher
+	return a.Priority() < b.Priority()
+}
+
+// NewState create a new state
+func NewState() *State {
+	return &State{Transitions: []*Transition{}}
+}
+
+// T creates a transition between 2 states
+func (s *State) T(matcher matcher.Matcher, next *State) *State {
+	s.Transitions = append(s.Transitions, &Transition{Matcher: matcher, Next: next})
+	return next
+}
+
+// Prepare simplifies the FSM and sorts the transitions according to their priorities
+func (s *State) Prepare() {
+	simplify(s, s, map[*State]bool{})
+	sortTransitions(s, map[*State]bool{})
+}
+
+func sortTransitions(s *State, visited map[*State]bool) {
+	if visited[s] {
+		return
+	}
+	visited[s] = true
+
+	sort.Sort(s.Transitions)
+
+	for _, tr := range s.Transitions {
+		sortTransitions(tr.Next, visited)
+	}
+}
+
+func simplify(start, s *State, visited map[*State]bool) {
+	if visited[s] {
+		return
+	}
+	visited[s] = true
+	for _, tr := range s.Transitions {
+		simplify(start, tr.Next, visited)
+	}
+	for s.simplifySelf(start) {
+	}
+}
+
+func (s *State) simplifySelf(start *State) bool {
+	for idx, tr := range s.Transitions {
+		if matcher.IsShortcut(tr.Matcher) {
+			next := tr.Next
+			s.Transitions = removeTransitionAt(idx, s.Transitions)
+			for _, tr := range next.Transitions {
+				if !s.has(tr) {
+					s.Transitions = append(s.Transitions, tr)
+				}
+			}
+			if next.Terminal {
+				s.Terminal = true
+			}
+			return true
+		}
+	}
+	return false
+}
+
+func removeTransitionAt(idx int, arr StateTransitions) StateTransitions {
+	res := make([]*Transition, len(arr)-1)
+	copy(res, arr[:idx])
+	copy(res[idx:], arr[idx+1:])
+	return res
+}
+
+func (s *State) has(tr *Transition) bool {
+	for _, t := range s.Transitions {
+		if t.Next == tr.Next && t.Matcher == tr.Matcher {
+			return true
+		}
+	}
+	return false
+}
+
+// Parse tries to navigate into the FSM according to the provided args
+func (s *State) Parse(args []string) error {
+	pc := matcher.NewParseContext()
+	ok := s.apply(args, pc)
+	if !ok {
+		return fmt.Errorf("incorrect usage")
+	}
+
+	if err := fillContainers(pc.Opts); err != nil {
+		return err
+	}
+
+	return fillContainers(pc.Args)
+}
+
+func fillContainers(containers map[*container.Container][]string) error {
+	for con, vs := range containers {
+		if multiValued, ok := con.Value.(values.MultiValued); ok {
+			multiValued.Clear()
+		}
+		for _, v := range vs {
+			if err := con.Value.Set(v); err != nil {
+				return err
+			}
+		}
+
+		con.ValueSetFromEnv = false
+		if con.ValueSetByUser != nil {
+			*con.ValueSetByUser = true
+		}
+	}
+	return nil
+}
+
+func (s *State) apply(args []string, pc matcher.ParseContext) bool {
+	if s.Terminal && len(args) == 0 {
+		return true
+	}
+
+	if len(args) > 0 {
+		arg := args[0]
+
+		if !pc.RejectOptions && arg == "--" {
+			pc.RejectOptions = true
+			args = args[1:]
+		}
+	}
+
+	type match struct {
+		tr  *Transition
+		rem []string
+		pc  matcher.ParseContext
+	}
+
+	var matches []*match
+	for _, tr := range s.Transitions {
+		fresh := matcher.NewParseContext()
+		fresh.RejectOptions = pc.RejectOptions
+		if ok, rem := tr.Matcher.Match(args, &fresh); ok {
+			matches = append(matches, &match{tr, rem, fresh})
+		}
+	}
+
+	for _, m := range matches {
+		if ok := m.tr.Next.apply(m.rem, m.pc); ok {
+			pc.Merge(m.pc)
+			return true
+		}
+	}
+
+	return false
+}
diff --git a/vendor/github.com/jawher/mow.cli/spec_tk.go b/vendor/github.com/jawher/mow.cli/internal/lexer/lexer.go
similarity index 54%
rename from vendor/github.com/jawher/mow.cli/spec_tk.go
rename to vendor/github.com/jawher/mow.cli/internal/lexer/lexer.go
index a4ebde8f4162bb889ebcde145ce6fda5d0cf1965..d0d49fce8e8996c0ff0c21843cbb2b90898566be 100644
--- a/vendor/github.com/jawher/mow.cli/spec_tk.go
+++ b/vendor/github.com/jawher/mow.cli/internal/lexer/lexer.go
@@ -1,4 +1,4 @@
-package cli
+package lexer
 
 import (
 	"strings"
@@ -6,41 +6,63 @@ import (
 	"fmt"
 )
 
-type uTokenType string
+// TokenType is a type representing the different kinds of tokens
+type TokenType string
 
 const (
-	utPos        uTokenType = "Pos"
-	utOpenPar    uTokenType = "OpenPar"
-	utClosePar   uTokenType = "ClosePar"
-	utOpenSq     uTokenType = "OpenSq"
-	utCloseSq    uTokenType = "CloseSq"
-	utChoice     uTokenType = "Choice"
-	utOptions    uTokenType = "Options"
-	utRep        uTokenType = "Rep"
-	utShortOpt   uTokenType = "ShortOpt"
-	utLongOpt    uTokenType = "LongOpt"
-	utOptSeq     uTokenType = "OptSeq"
-	utOptValue   uTokenType = "OptValue"
-	utDoubleDash uTokenType = "DblDash"
+	// TTArg is an arg token, e.g. ARG, SRC. DST
+	TTArg TokenType = "Arg"
+	// TTOpenPar (
+	TTOpenPar TokenType = "OpenPar"
+	// TTClosePar )
+	TTClosePar TokenType = "ClosePar"
+	// TTOpenSq [
+	TTOpenSq TokenType = "OpenSq"
+	// TTCloseSq ]
+	TTCloseSq TokenType = "CloseSq"
+	// TTChoice |
+	TTChoice TokenType = "Choice"
+	// TTOptions is the special OPTIONS keyword
+	TTOptions TokenType = "Options"
+	// TTRep ...
+	TTRep TokenType = "Rep"
+	// TTShortOpt -a, -f, ...
+	TTShortOpt TokenType = "ShortOpt"
+	// TTLongOpt --force, --retry, ...
+	TTLongOpt TokenType = "LongOpt"
+	// TTOptSeq a folded option sequence, -rm
+	TTOptSeq TokenType = "OptSeq"
+	// TTOptValue is the special =<example> syntax token
+	TTOptValue TokenType = "OptValue"
+	// TTDoubleDash --
+	TTDoubleDash TokenType = "DblDash"
 )
 
-type uToken struct {
-	typ uTokenType
-	val string
-	pos int
+// Token has a type, a value and a position in the input
+type Token struct {
+	// Type is the token type
+	Typ TokenType
+	// Val the textual content
+	Val string
+	// Pos is the token position in the input
+	Pos int
 }
 
-func (t *uToken) String() string {
-	return fmt.Sprintf("%s('%s')@%d", t.typ, t.val, t.pos)
+func (t *Token) String() string {
+	return fmt.Sprintf("%s('%s')@%d", t.Typ, t.Val, t.Pos)
 }
 
-type parseError struct {
-	input string
-	msg   string
-	pos   int
+// ParseError represents a parsing error
+type ParseError struct {
+	// Input is the text to parse
+	Input string
+	// Msg s the error message
+	Msg string
+	// Post is where in the input the error occured
+	Pos int
 }
 
-func (t *parseError) ident() string {
+func (t *ParseError) ident() string {
 	return strings.Map(func(c rune) rune {
 		switch c {
 		case '\t':
@@ -48,27 +70,29 @@ func (t *parseError) ident() string {
 		default:
 			return ' '
 		}
-	}, t.input[:t.pos])
+	}, t.Input[:t.Pos])
 }
-func (t *parseError) Error() string {
+
+func (t *ParseError) Error() string {
 	return fmt.Sprintf("Parse error at position %d:\n%s\n%s^ %s",
-		t.pos, t.input, t.ident(), t.msg)
+		t.Pos, t.Input, t.ident(), t.Msg)
 }
 
-func uTokenize(usage string) ([]*uToken, *parseError) {
+// Tokenize transforms the provided input into a slice of tokens or returns a ParseError
+func Tokenize(usage string) ([]*Token, error) {
 	pos := 0
-	res := []*uToken{}
+	var res []*Token
 	var (
-		tk = func(t uTokenType, v string) {
-			res = append(res, &uToken{t, v, pos})
+		tk = func(t TokenType, v string) {
+			res = append(res, &Token{t, v, pos})
 		}
 
-		tkp = func(t uTokenType, v string, p int) {
-			res = append(res, &uToken{t, v, p})
+		tkp = func(t TokenType, v string, p int) {
+			res = append(res, &Token{t, v, p})
 		}
 
-		err = func(msg string) *parseError {
-			return &parseError{usage, msg, pos}
+		err = func(msg string) *ParseError {
+			return &ParseError{usage, msg, pos}
 		}
 	)
 	eof := len(usage)
@@ -79,19 +103,19 @@ func uTokenize(usage string) ([]*uToken, *parseError) {
 		case '\t':
 			pos++
 		case '[':
-			tk(utOpenSq, "[")
+			tk(TTOpenSq, "[")
 			pos++
 		case ']':
-			tk(utCloseSq, "]")
+			tk(TTCloseSq, "]")
 			pos++
 		case '(':
-			tk(utOpenPar, "(")
+			tk(TTOpenPar, "(")
 			pos++
 		case ')':
-			tk(utClosePar, ")")
+			tk(TTClosePar, ")")
 			pos++
 		case '|':
-			tk(utChoice, "|")
+			tk(TTChoice, "|")
 			pos++
 		case '.':
 			start := pos
@@ -103,7 +127,7 @@ func uTokenize(usage string) ([]*uToken, *parseError) {
 			if pos >= eof || usage[pos] != '.' {
 				return nil, err("Unexpected end of usage, was expecting '.'")
 			}
-			tkp(utRep, "...", start)
+			tkp(TTRep, "...", start)
 			pos++
 		case '-':
 			start := pos
@@ -121,12 +145,12 @@ func uTokenize(usage string) ([]*uToken, *parseError) {
 						break
 					}
 				}
-				typ := utShortOpt
+				typ := TTShortOpt
+				opt := usage[start:pos]
 				if pos-start > 2 {
-					typ = utOptSeq
-					start++
+					typ = TTOptSeq
+					opt = opt[1:]
 				}
-				opt := usage[start:pos]
 				tkp(typ, opt, start)
 				if pos < eof && usage[pos] == '-' {
 					return nil, err("Invalid syntax")
@@ -134,7 +158,7 @@ func uTokenize(usage string) ([]*uToken, *parseError) {
 			case o == '-':
 				pos++
 				if pos == eof || usage[pos] == ' ' {
-					tkp(utDoubleDash, "--", start)
+					tkp(TTDoubleDash, "--", start)
 					continue
 				}
 				for pos0 := pos; pos < eof; pos++ {
@@ -147,7 +171,7 @@ func uTokenize(usage string) ([]*uToken, *parseError) {
 				if len(opt) == 2 {
 					return nil, err("Was expecting a long option name")
 				}
-				tkp(utLongOpt, opt, start)
+				tkp(TTLongOpt, opt, start)
 			}
 
 		case '=':
@@ -172,21 +196,21 @@ func uTokenize(usage string) ([]*uToken, *parseError) {
 			pos++
 			value := usage[start:pos]
 
-			tkp(utOptValue, value, start)
+			tkp(TTOptValue, value, start)
 
 		default:
 			switch {
 			case isUppercase(c):
 				start := pos
 				for pos = pos + 1; pos < eof; pos++ {
-					if !isOkPos(usage[pos]) {
+					if !isOkInArg(usage[pos]) {
 						break
 					}
 				}
 				s := usage[start:pos]
-				typ := utPos
+				typ := TTArg
 				if s == "OPTIONS" {
-					typ = utOptions
+					typ = TTOptions
 				}
 				tkp(typ, s, start)
 			default:
@@ -207,7 +231,7 @@ func isUppercase(c uint8) bool {
 	return c >= 'A' && c <= 'Z'
 }
 
-func isOkPos(c uint8) bool {
+func isOkInArg(c uint8) bool {
 	return isUppercase(c) || isDigit(c) || c == '_'
 }
 
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/arg.go b/vendor/github.com/jawher/mow.cli/internal/matcher/arg.go
new file mode 100644
index 0000000000000000000000000000000000000000..eae7562b2d914d179595a8712b74bd5b5c1da78a
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/arg.go
@@ -0,0 +1,35 @@
+package matcher
+
+import (
+	"strings"
+
+	"github.com/jawher/mow.cli/internal/container"
+)
+
+// NewArg creates an (positional) argument matcher
+func NewArg(a *container.Container) Matcher {
+	return &arg{arg: a}
+}
+
+type arg struct {
+	arg *container.Container
+}
+
+func (arg *arg) Match(args []string, c *ParseContext) (bool, []string) {
+	if len(args) == 0 {
+		return false, args
+	}
+	if !c.RejectOptions && strings.HasPrefix(args[0], "-") && args[0] != "-" {
+		return false, args
+	}
+	c.Args[arg.arg] = append(c.Args[arg.arg], args[0])
+	return true, args[1:]
+}
+
+func (*arg) Priority() int {
+	return 8
+}
+
+func (arg *arg) String() string {
+	return arg.arg.Name
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/context.go b/vendor/github.com/jawher/mow.cli/internal/matcher/context.go
new file mode 100644
index 0000000000000000000000000000000000000000..15891ae4cdaba74ec624c9a452f5f2a170ed214c
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/context.go
@@ -0,0 +1,32 @@
+package matcher
+
+import "github.com/jawher/mow.cli/internal/container"
+
+// ParseContext holds the state of the arguments parsing, i.e. the encountered options and arguments values, etc.
+type ParseContext struct {
+	Args          map[*container.Container][]string
+	Opts          map[*container.Container][]string
+	ExcludedOpts  map[*container.Container]struct{}
+	RejectOptions bool
+}
+
+// NewParseContext create a new ParseContext
+func NewParseContext() ParseContext {
+	return ParseContext{
+		Args:          map[*container.Container][]string{},
+		Opts:          map[*container.Container][]string{},
+		ExcludedOpts:  map[*container.Container]struct{}{},
+		RejectOptions: false,
+	}
+}
+
+// Merge adds the values in the provided context in the current context
+func (pc ParseContext) Merge(o ParseContext) {
+	for k, vs := range o.Args {
+		pc.Args[k] = append(pc.Args[k], vs...)
+	}
+
+	for k, vs := range o.Opts {
+		pc.Opts[k] = append(pc.Opts[k], vs...)
+	}
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/matchers.go b/vendor/github.com/jawher/mow.cli/internal/matcher/matchers.go
new file mode 100644
index 0000000000000000000000000000000000000000..9c7a93e12b0188967310e2a4050cd1ff6d795998
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/matchers.go
@@ -0,0 +1,20 @@
+package matcher
+
+/*
+Matcher is used to parse and consume the args and populate the ParseContext
+*/
+type Matcher interface {
+	/* Match examines the provided args and:
+	- likes it, fills the parse context and returns true and the remaining args it didn't consume
+	- doesn't like it, returns false and  the remaining args it didn't consume
+	*/
+	Match(args []string, c *ParseContext) (bool, []string)
+	// Priority used to sort matchers. the lower the returned number, the higher the priority of the matcher
+	Priority() int
+}
+
+// IsShortcut is a helper to determine whether a given matcher is a Shortcut (always matches)
+func IsShortcut(matcher Matcher) bool {
+	_, ok := matcher.(shortcut)
+	return ok
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/option.go b/vendor/github.com/jawher/mow.cli/internal/matcher/option.go
new file mode 100644
index 0000000000000000000000000000000000000000..395feadf27f036a16ba1f11fecd2cf0fdb66c464
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/option.go
@@ -0,0 +1,199 @@
+package matcher
+
+import (
+	"strings"
+
+	"github.com/jawher/mow.cli/internal/container"
+	"github.com/jawher/mow.cli/internal/values"
+)
+
+// NewOpt create an option matcher that can consume short and long options
+func NewOpt(o *container.Container, index map[string]*container.Container) Matcher {
+	return &opt{
+		theOne: o,
+		index:  index,
+	}
+}
+
+type opt struct {
+	theOne *container.Container
+	index  map[string]*container.Container
+}
+
+func (*opt) Priority() int {
+	return 1
+}
+
+func (o *opt) String() string {
+	return o.theOne.Names[0]
+}
+
+func (o *opt) Match(args []string, c *ParseContext) (bool, []string) {
+	if len(args) == 0 || c.RejectOptions {
+		return o.theOne.ValueSetFromEnv, args
+	}
+
+	idx := 0
+	for idx < len(args) {
+		arg := args[idx]
+		switch {
+		case arg == "-":
+			idx++
+		case arg == "--":
+			return o.theOne.ValueSetFromEnv, args
+		case strings.HasPrefix(arg, "--"):
+			matched, consumed, nargs := o.matchLongOpt(args, idx, c)
+
+			if matched {
+				return true, nargs
+			}
+			if consumed == 0 {
+				return o.theOne.ValueSetFromEnv, args
+			}
+			idx += consumed
+
+		case strings.HasPrefix(arg, "-"):
+			matched, consumed, nargs := o.matchShortOpt(args, idx, c)
+			if matched {
+				return true, nargs
+			}
+			if consumed == 0 {
+				return o.theOne.ValueSetFromEnv, args
+			}
+			idx += consumed
+
+		default:
+			return o.theOne.ValueSetFromEnv, args
+		}
+	}
+	return o.theOne.ValueSetFromEnv, args
+}
+
+func (o *opt) matchLongOpt(args []string, idx int, c *ParseContext) (bool, int, []string) {
+	arg := args[idx]
+	kv := strings.SplitN(arg, "=", 2)
+	name := kv[0]
+	opt, found := o.index[name]
+	if !found {
+		return false, 0, args
+	}
+
+	switch {
+	case len(kv) == 2:
+		if opt != o.theOne {
+			return false, 1, args
+		}
+		value := kv[1]
+		if value == "" {
+			return false, 0, args
+		}
+		c.Opts[o.theOne] = append(c.Opts[o.theOne], value)
+		return true, 1, removeStringAt(idx, args)
+	case values.IsBool(opt.Value):
+		if opt != o.theOne {
+			return false, 1, args
+		}
+		c.Opts[o.theOne] = append(c.Opts[o.theOne], "true")
+		return true, 1, removeStringAt(idx, args)
+	default:
+		if len(args[idx:]) < 2 {
+			return false, 0, args
+		}
+		if opt != o.theOne {
+			return false, 2, args
+		}
+		value := args[idx+1]
+		if strings.HasPrefix(value, "-") {
+			return false, 0, args
+		}
+		c.Opts[o.theOne] = append(c.Opts[o.theOne], value)
+		return true, 2, removeStringsBetween(idx, idx+1, args)
+	}
+}
+
+func (o *opt) matchShortOpt(args []string, idx int, c *ParseContext) (bool, int, []string) {
+	arg := args[idx]
+	if len(arg) < 2 {
+		return false, 0, args
+	}
+
+	if strings.HasPrefix(arg[2:], "=") {
+		name := arg[0:2]
+		opt, _ := o.index[name]
+		if opt != o.theOne {
+			return false, 1, args
+		}
+
+		value := arg[3:]
+		if value == "" {
+			return false, 0, args
+		}
+		c.Opts[o.theOne] = append(c.Opts[o.theOne], value)
+		return true, 1, removeStringAt(idx, args)
+
+	}
+
+	rem := arg[1:]
+
+	remIdx := 0
+	for len(rem[remIdx:]) > 0 {
+		name := "-" + rem[remIdx:remIdx+1]
+
+		opt, found := o.index[name]
+		if !found {
+			return false, 0, args
+		}
+
+		if values.IsBool(opt.Value) {
+			if opt != o.theOne {
+				remIdx++
+				continue
+			}
+
+			c.Opts[o.theOne] = append(c.Opts[o.theOne], "true")
+			newRem := rem[:remIdx] + rem[remIdx+1:]
+			if newRem == "" {
+				return true, 1, removeStringAt(idx, args)
+			}
+			return true, 0, replaceStringAt(idx, "-"+newRem, args)
+		}
+
+		value := rem[remIdx+1:]
+		if value == "" {
+			if len(args[idx+1:]) == 0 {
+				return false, 0, args
+			}
+			if opt != o.theOne {
+				return false, 2, args
+			}
+
+			value = args[idx+1]
+			if strings.HasPrefix(value, "-") {
+				return false, 0, args
+			}
+			c.Opts[o.theOne] = append(c.Opts[o.theOne], value)
+
+			newRem := rem[:remIdx]
+			if newRem == "" {
+				return true, 2, removeStringsBetween(idx, idx+1, args)
+			}
+
+			nargs := replaceStringAt(idx, "-"+newRem, args)
+
+			return true, 1, removeStringAt(idx+1, nargs)
+		}
+
+		if opt != o.theOne {
+			return false, 1, args
+		}
+		c.Opts[o.theOne] = append(c.Opts[o.theOne], value)
+		newRem := rem[:remIdx]
+		if newRem == "" {
+			return true, 1, removeStringAt(idx, args)
+		}
+		return true, 0, replaceStringAt(idx, "-"+newRem, args)
+
+	}
+
+	return false, 1, args
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/options.go b/vendor/github.com/jawher/mow.cli/internal/matcher/options.go
new file mode 100644
index 0000000000000000000000000000000000000000..387b78c88d8d93c4f937db12095bd526141adbdc
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/options.go
@@ -0,0 +1,66 @@
+package matcher
+
+import (
+	"strings"
+
+	"github.com/jawher/mow.cli/internal/container"
+)
+
+// NewOptions create an Options matcher which can parse a group of options
+func NewOptions(opts []*container.Container, index map[string]*container.Container) Matcher {
+	return &options{
+		options: opts,
+		index:   index,
+	}
+}
+
+type options struct {
+	options []*container.Container
+	index   map[string]*container.Container
+}
+
+func (*options) Priority() int {
+	return 2
+}
+
+func (om *options) Match(args []string, c *ParseContext) (bool, []string) {
+	ok, nargs := om.try(args, c)
+	if !ok {
+		return false, args
+	}
+
+	for {
+		ok, nnargs := om.try(nargs, c)
+		if !ok {
+			return true, nargs
+		}
+		nargs = nnargs
+	}
+}
+
+func (om *options) try(args []string, c *ParseContext) (bool, []string) {
+	if len(args) == 0 || c.RejectOptions {
+		return false, args
+	}
+	for _, o := range om.options {
+		if _, exclude := c.ExcludedOpts[o]; exclude {
+			continue
+		}
+		if ok, nargs := (&opt{theOne: o, index: om.index}).Match(args, c); ok {
+			if o.ValueSetFromEnv {
+				c.ExcludedOpts[o] = struct{}{}
+			}
+			return true, nargs
+		}
+	}
+	return false, args
+}
+
+func (om *options) String() string {
+	names := "-"
+	for _, opt := range om.options {
+		s := strings.TrimPrefix(opt.Names[0], "-")
+		names = names + s
+	}
+	return names
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/optsEnd.go b/vendor/github.com/jawher/mow.cli/internal/matcher/optsEnd.go
new file mode 100644
index 0000000000000000000000000000000000000000..2b175ceaacf8f0e1db24bf379f9b99acb7bf94bc
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/optsEnd.go
@@ -0,0 +1,25 @@
+package matcher
+
+// NewOptsEnd returns the special matcher that matches the -- operator
+func NewOptsEnd() Matcher {
+	return theOptsEnd
+}
+
+const (
+	theOptsEnd = optsEnd(true)
+)
+
+type optsEnd bool
+
+func (optsEnd) Match(args []string, c *ParseContext) (bool, []string) {
+	c.RejectOptions = true
+	return true, args
+}
+
+func (optsEnd) Priority() int {
+	return 9
+}
+
+func (optsEnd) String() string {
+	return "--"
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/shortcut.go b/vendor/github.com/jawher/mow.cli/internal/matcher/shortcut.go
new file mode 100644
index 0000000000000000000000000000000000000000..33140147867a3470f280ed8d18d9a054e14c4370
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/shortcut.go
@@ -0,0 +1,23 @@
+package matcher
+
+type shortcut bool
+
+const (
+	theShortcut = shortcut(true)
+)
+
+// NewShortcut create a special matcher that always matches and doesn't consume any input
+func NewShortcut() Matcher {
+	return theShortcut
+}
+func (shortcut) Match(args []string, c *ParseContext) (bool, []string) {
+	return true, args
+}
+
+func (shortcut) Priority() int {
+	return 10
+}
+
+func (shortcut) String() string {
+	return "*"
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/matcher/strings.go b/vendor/github.com/jawher/mow.cli/internal/matcher/strings.go
new file mode 100644
index 0000000000000000000000000000000000000000..e17d780a366a7f96eced56a4ad0fa51e96684d8b
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/matcher/strings.go
@@ -0,0 +1,23 @@
+package matcher
+
+func removeStringAt(idx int, arr []string) []string {
+	res := make([]string, len(arr)-1)
+	copy(res, arr[:idx])
+	copy(res[idx:], arr[idx+1:])
+	return res
+}
+
+func removeStringsBetween(from, to int, arr []string) []string {
+	res := make([]string, len(arr)-(to-from+1))
+	copy(res, arr[:from])
+	copy(res[from:], arr[to+1:])
+	return res
+}
+
+func replaceStringAt(idx int, with string, arr []string) []string {
+	res := make([]string, len(arr))
+	copy(res, arr[:idx])
+	res[idx] = with
+	copy(res[idx+1:], arr[idx+1:])
+	return res
+}
diff --git a/vendor/github.com/jawher/mow.cli/internal/parser/parser.go b/vendor/github.com/jawher/mow.cli/internal/parser/parser.go
new file mode 100644
index 0000000000000000000000000000000000000000..c725b62a60126727b17558681654722396c208ba
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/parser/parser.go
@@ -0,0 +1,261 @@
+package parser
+
+import (
+	"fmt"
+
+	"github.com/jawher/mow.cli/internal/container"
+	"github.com/jawher/mow.cli/internal/fsm"
+	"github.com/jawher/mow.cli/internal/lexer"
+	"github.com/jawher/mow.cli/internal/matcher"
+)
+
+// Params are used to cofigure the parser
+type Params struct {
+	Spec       string
+	Options    []*container.Container
+	OptionsIdx map[string]*container.Container
+	Args       []*container.Container
+	ArgsIdx    map[string]*container.Container
+}
+
+// Parse transforms a slice of tokens into an FSM or returns an ParseError
+func Parse(tokens []*lexer.Token, params Params) (*fsm.State, error) {
+	p := &parser{
+		spec:       params.Spec,
+		options:    params.Options,
+		optionsIdx: params.OptionsIdx,
+		args:       params.Args,
+		argsIdx:    params.ArgsIdx,
+		tokens:     tokens,
+	}
+	return p.parse()
+}
+
+type parser struct {
+	spec       string
+	options    []*container.Container
+	optionsIdx map[string]*container.Container
+	args       []*container.Container
+	argsIdx    map[string]*container.Container
+
+	tokens []*lexer.Token
+
+	tkpos int
+
+	matchedToken *lexer.Token
+
+	rejectOptions bool
+}
+
+func (p *parser) parse() (s *fsm.State, err error) {
+	defer func() {
+		if v := recover(); v != nil {
+			pos := len(p.spec)
+			if !p.eof() {
+				pos = p.token().Pos
+			}
+			s = nil
+			switch t, ok := v.(string); ok {
+			case true:
+				err = &lexer.ParseError{Input: p.spec, Msg: t, Pos: pos}
+			default:
+				panic(v)
+			}
+		}
+	}()
+	err = nil
+	var e *fsm.State
+	s, e = p.seq(false)
+	if !p.eof() {
+		s = nil
+		err = &lexer.ParseError{Input: p.spec, Msg: "Unexpected input", Pos: p.token().Pos}
+		return
+	}
+
+	e.Terminal = true
+	s.Prepare()
+	return
+}
+
+func (p *parser) seq(required bool) (*fsm.State, *fsm.State) {
+	start := fsm.NewState()
+	end := start
+
+	appendComp := func(s, e *fsm.State) {
+		for _, tr := range s.Transitions {
+			end.T(tr.Matcher, tr.Next)
+		}
+		end = e
+	}
+
+	if required {
+		s, e := p.choice()
+		appendComp(s, e)
+	}
+	for p.canAtom() {
+		s, e := p.choice()
+		appendComp(s, e)
+	}
+
+	return start, end
+}
+
+func (p *parser) choice() (*fsm.State, *fsm.State) {
+	start, end := fsm.NewState(), fsm.NewState()
+
+	add := func(s, e *fsm.State) {
+		start.T(matcher.NewShortcut(), s)
+		e.T(matcher.NewShortcut(), end)
+	}
+
+	add(p.atom())
+	for p.found(lexer.TTChoice) {
+		add(p.atom())
+	}
+	return start, end
+}
+
+func (p *parser) atom() (*fsm.State, *fsm.State) {
+	start := fsm.NewState()
+	var end *fsm.State
+	switch {
+	case p.eof():
+		panic("Unexpected end of input")
+	case p.found(lexer.TTArg):
+		name := p.matchedToken.Val
+		arg, declared := p.argsIdx[name]
+		if !declared {
+			p.back()
+			panic(fmt.Sprintf("Undeclared arg %s", name))
+		}
+		end = start.T(matcher.NewArg(arg), fsm.NewState())
+	case p.found(lexer.TTOptions):
+		if p.rejectOptions {
+			p.back()
+			panic("No options after --")
+		}
+		end = fsm.NewState()
+		start.T(matcher.NewOptions(p.options, p.optionsIdx), end)
+	case p.found(lexer.TTShortOpt):
+		if p.rejectOptions {
+			p.back()
+			panic("No options after --")
+		}
+		name := p.matchedToken.Val
+		opt, declared := p.optionsIdx[name]
+		if !declared {
+			p.back()
+			panic(fmt.Sprintf("Undeclared option %s", name))
+		}
+		end = start.T(matcher.NewOpt(opt, p.optionsIdx), fsm.NewState())
+		p.found(lexer.TTOptValue)
+	case p.found(lexer.TTLongOpt):
+		if p.rejectOptions {
+			p.back()
+			panic("No options after --")
+		}
+		name := p.matchedToken.Val
+		opt, declared := p.optionsIdx[name]
+		if !declared {
+			p.back()
+			panic(fmt.Sprintf("Undeclared option %s", name))
+		}
+		end = start.T(matcher.NewOpt(opt, p.optionsIdx), fsm.NewState())
+		p.found(lexer.TTOptValue)
+	case p.found(lexer.TTOptSeq):
+		if p.rejectOptions {
+			p.back()
+			panic("No options after --")
+		}
+		end = fsm.NewState()
+		sq := p.matchedToken.Val
+		var opts []*container.Container
+		for i := range sq {
+			sn := sq[i : i+1]
+			opt, declared := p.optionsIdx["-"+sn]
+			if !declared {
+				p.back()
+				panic(fmt.Sprintf("Undeclared option -%s", sn))
+			}
+			opts = append(opts, opt)
+		}
+		start.T(matcher.NewOptions(opts, p.optionsIdx), end)
+	case p.found(lexer.TTOpenPar):
+		start, end = p.seq(true)
+		p.expect(lexer.TTClosePar)
+	case p.found(lexer.TTOpenSq):
+		start, end = p.seq(true)
+		start.T(matcher.NewShortcut(), end)
+		p.expect(lexer.TTCloseSq)
+	case p.found(lexer.TTDoubleDash):
+		p.rejectOptions = true
+		end = start.T(matcher.NewOptsEnd(), fsm.NewState())
+		return start, end
+	default:
+		panic("Unexpected input: was expecting a command or a positional argument or an option")
+	}
+	if p.found(lexer.TTRep) {
+		end.T(matcher.NewShortcut(), start)
+	}
+	return start, end
+}
+
+func (p *parser) canAtom() bool {
+	switch {
+	case p.is(lexer.TTArg):
+		return true
+	case p.is(lexer.TTOptions):
+		return true
+	case p.is(lexer.TTShortOpt):
+		return true
+	case p.is(lexer.TTLongOpt):
+		return true
+	case p.is(lexer.TTOptSeq):
+		return true
+	case p.is(lexer.TTOpenPar):
+		return true
+	case p.is(lexer.TTOpenSq):
+		return true
+	case p.is(lexer.TTDoubleDash):
+		return true
+	default:
+		return false
+	}
+}
+
+func (p *parser) found(t lexer.TokenType) bool {
+	if p.is(t) {
+		p.matchedToken = p.token()
+		p.tkpos++
+		return true
+	}
+	return false
+}
+
+func (p *parser) is(t lexer.TokenType) bool {
+	if p.eof() {
+		return false
+	}
+	return p.token().Typ == t
+}
+
+func (p *parser) expect(t lexer.TokenType) {
+	if !p.found(t) {
+		panic(fmt.Sprintf("Was expecting %v", t))
+	}
+}
+
+func (p *parser) back() {
+	p.tkpos--
+}
+func (p *parser) eof() bool {
+	return p.tkpos >= len(p.tokens)
+}
+
+func (p *parser) token() *lexer.Token {
+	if p.eof() {
+		return nil
+	}
+
+	return p.tokens[p.tkpos]
+}
diff --git a/vendor/github.com/jawher/mow.cli/utils.go b/vendor/github.com/jawher/mow.cli/internal/values/utils.go
similarity index 50%
rename from vendor/github.com/jawher/mow.cli/utils.go
rename to vendor/github.com/jawher/mow.cli/internal/values/utils.go
index f486c5cefed6d0e994e254583ca02de19057f2c3..af66c4bb990b98386d249c56ecd0ca03cc643433 100644
--- a/vendor/github.com/jawher/mow.cli/utils.go
+++ b/vendor/github.com/jawher/mow.cli/internal/values/utils.go
@@ -1,4 +1,4 @@
-package cli
+package values
 
 import (
 	"flag"
@@ -6,16 +6,21 @@ import (
 	"strings"
 )
 
-func setFromEnv(into flag.Value, envVars string) bool {
-	multiValued, isMulti := into.(multiValued)
+// IsBool checks if a given value is a bool value, i.e. implements the BoolValued interface
+func IsBool(v flag.Value) bool {
+	if bf, ok := v.(BoolValued); ok {
+		return bf.IsBoolFlag()
+	}
 
-	if len(envVars) > 0 {
-		for _, rev := range strings.Split(envVars, " ") {
-			ev := strings.TrimSpace(rev)
-			if len(ev) == 0 {
-				continue
-			}
+	return false
+}
+
+// SetFromEnv fills a value from a list of env vars
+func SetFromEnv(into flag.Value, envVars string) bool {
+	multiValued, isMulti := into.(MultiValued)
 
+	if len(envVars) > 0 {
+		for _, ev := range strings.Fields(envVars) {
 			v := os.Getenv(ev)
 			if len(v) == 0 {
 				continue
@@ -36,7 +41,7 @@ func setFromEnv(into flag.Value, envVars string) bool {
 	return false
 }
 
-func setMultivalued(into multiValued, values []string) error {
+func setMultivalued(into MultiValued, values []string) error {
 	into.Clear()
 
 	for _, v := range values {
@@ -49,18 +54,3 @@ func setMultivalued(into multiValued, values []string) error {
 
 	return nil
 }
-
-func joinStrings(parts ...string) string {
-	res := ""
-	for _, part := range parts {
-		s := strings.TrimSpace(part)
-		if s == "" {
-			continue
-		}
-		if res != "" {
-			res += " "
-		}
-		res += part
-	}
-	return res
-}
diff --git a/vendor/github.com/jawher/mow.cli/internal/values/values.go b/vendor/github.com/jawher/mow.cli/internal/values/values.go
new file mode 100644
index 0000000000000000000000000000000000000000..9233c3b3104f5772161e751a7b58eafa47cdf7bf
--- /dev/null
+++ b/vendor/github.com/jawher/mow.cli/internal/values/values.go
@@ -0,0 +1,230 @@
+package values
+
+import (
+	"flag"
+	"fmt"
+	"strconv"
+)
+
+// BoolValued is an interface values can implement to indicate that they are a bool option, i.e. can be set without providing a value with just -f for example
+type BoolValued interface {
+	flag.Value
+	// IsBoolFlag should return true to indicate that this value is a bool value
+	IsBoolFlag() bool
+}
+
+// MultiValued is an interface ti indicate that a value can hold multiple values
+type MultiValued interface {
+	flag.Value
+	// Clear should clear the list of values
+	Clear()
+}
+
+// DefaultValued in an interface to determine if the value stored is the default value, and thus does not need be shown in the help message
+type DefaultValued interface {
+	// IsDefault should return true if the value stored is the default value, and thus does not need be shown in the help message
+	IsDefault() bool
+}
+
+/******************************************************************************/
+/* BOOL                                                                        */
+/******************************************************************************/
+
+// BoolValue is a flag.Value type holding boolean values
+type BoolValue bool
+
+var (
+	_ flag.Value    = NewBool(new(bool), false)
+	_ BoolValued    = NewBool(new(bool), false)
+	_ DefaultValued = NewBool(new(bool), false)
+)
+
+// NewBool creates a new bool value
+func NewBool(into *bool, v bool) *BoolValue {
+	*into = v
+	return (*BoolValue)(into)
+}
+
+// Set sets the value from a provided string
+func (bo *BoolValue) Set(s string) error {
+	b, err := strconv.ParseBool(s)
+	if err != nil {
+		return err
+	}
+	*bo = BoolValue(b)
+	return nil
+}
+
+// IsBoolFlag returns true
+func (bo *BoolValue) IsBoolFlag() bool {
+	return true
+}
+
+func (bo *BoolValue) String() string {
+	return fmt.Sprintf("%v", *bo)
+}
+
+// IsDefault return true if the bool value is false
+func (bo *BoolValue) IsDefault() bool {
+	return !bool(*bo)
+}
+
+/******************************************************************************/
+/* STRING                                                                        */
+/******************************************************************************/
+
+// StringValue is a flag.Value type holding string values
+type StringValue string
+
+var (
+	_ flag.Value    = NewString(new(string), "")
+	_ DefaultValued = NewString(new(string), "")
+)
+
+// NewString creates a new string value
+func NewString(into *string, v string) *StringValue {
+	*into = v
+	return (*StringValue)(into)
+}
+
+// Set sets the value from a provided string
+func (sa *StringValue) Set(s string) error {
+	*sa = StringValue(s)
+	return nil
+}
+
+func (sa *StringValue) String() string {
+	return fmt.Sprintf("%#v", *sa)
+}
+
+// IsDefault return true if the string value is empty
+func (sa *StringValue) IsDefault() bool {
+	return string(*sa) == ""
+}
+
+/******************************************************************************/
+/* INT                                                                        */
+/******************************************************************************/
+
+// IntValue is a flag.Value type holding int values
+type IntValue int
+
+var (
+	_ flag.Value = NewInt(new(int), 0)
+)
+
+// NewInt creates a new int value
+func NewInt(into *int, v int) *IntValue {
+	*into = v
+	return (*IntValue)(into)
+}
+
+// Set sets the value from a provided string
+func (ia *IntValue) Set(s string) error {
+	i, err := strconv.ParseInt(s, 10, 64)
+	if err != nil {
+		return err
+	}
+	*ia = IntValue(int(i))
+	return nil
+}
+
+func (ia *IntValue) String() string {
+	return fmt.Sprintf("%v", *ia)
+}
+
+/******************************************************************************/
+/* STRINGS                                                                    */
+/******************************************************************************/
+
+// StringsValue is a flag.Value type holding string slices values
+type StringsValue []string
+
+var (
+	_ flag.Value    = NewStrings(new([]string), nil)
+	_ MultiValued   = NewStrings(new([]string), nil)
+	_ DefaultValued = NewStrings(new([]string), nil)
+)
+
+// NewStrings creates a new multi-string value
+func NewStrings(into *[]string, v []string) *StringsValue {
+	*into = v
+	return (*StringsValue)(into)
+}
+
+// Set sets the value from a provided string
+func (sa *StringsValue) Set(s string) error {
+	*sa = append(*sa, s)
+	return nil
+}
+
+func (sa *StringsValue) String() string {
+	res := "["
+	for idx, s := range *sa {
+		if idx > 0 {
+			res += ", "
+		}
+		res += fmt.Sprintf("%#v", s)
+	}
+	return res + "]"
+}
+
+// Clear clears the slice
+func (sa *StringsValue) Clear() {
+	*sa = nil
+}
+
+// IsDefault return true if the string slice is empty
+func (sa *StringsValue) IsDefault() bool {
+	return len(*sa) == 0
+}
+
+/******************************************************************************/
+/* INTS                                                                       */
+/******************************************************************************/
+
+// IntsValue is a flag.Value type holding int values
+type IntsValue []int
+
+var (
+	_ flag.Value    = NewInts(new([]int), nil)
+	_ MultiValued   = NewInts(new([]int), nil)
+	_ DefaultValued = NewInts(new([]int), nil)
+)
+
+// NewInts creates a new multi-int value
+func NewInts(into *[]int, v []int) *IntsValue {
+	*into = v
+	return (*IntsValue)(into)
+}
+
+// Set sets the value from a provided string
+func (ia *IntsValue) Set(s string) error {
+	i, err := strconv.ParseInt(s, 10, 64)
+	if err != nil {
+		return err
+	}
+	*ia = append(*ia, int(i))
+	return nil
+}
+
+func (ia *IntsValue) String() string {
+	res := "["
+	for idx, s := range *ia {
+		if idx > 0 {
+			res += ", "
+		}
+		res += fmt.Sprintf("%v", s)
+	}
+	return res + "]"
+}
+
+// Clear clears the slice
+func (ia *IntsValue) Clear() {
+	*ia = nil
+}
+
+// IsDefault return true if the int slice is empty
+func (ia *IntsValue) IsDefault() bool {
+	return len(*ia) == 0
+}
diff --git a/vendor/github.com/jawher/mow.cli/matchers.go b/vendor/github.com/jawher/mow.cli/matchers.go
deleted file mode 100644
index 11a8efcca93d634f26c252aa4bd9099d3ff0dac1..0000000000000000000000000000000000000000
--- a/vendor/github.com/jawher/mow.cli/matchers.go
+++ /dev/null
@@ -1,282 +0,0 @@
-package cli
-
-import (
-	"fmt"
-	"strings"
-)
-
-type upMatcher interface {
-	match(args []string, c *parseContext) (bool, []string)
-}
-
-type upShortcut bool
-
-func (u upShortcut) match(args []string, c *parseContext) (bool, []string) {
-	return true, args
-}
-
-func (u upShortcut) String() string {
-	return "*"
-}
-
-type upOptsEnd bool
-
-func (u upOptsEnd) match(args []string, c *parseContext) (bool, []string) {
-	c.rejectOptions = true
-	return true, args
-}
-
-func (u upOptsEnd) String() string {
-	return "--"
-}
-
-const (
-	shortcut = upShortcut(true)
-	optsEnd  = upOptsEnd(true)
-)
-
-func (arg *arg) match(args []string, c *parseContext) (bool, []string) {
-	if len(args) == 0 {
-		return false, args
-	}
-	if !c.rejectOptions && strings.HasPrefix(args[0], "-") && args[0] != "-" {
-		return false, args
-	}
-	c.args[arg] = append(c.args[arg], args[0])
-	return true, args[1:]
-}
-
-type optMatcher struct {
-	theOne     *opt
-	optionsIdx map[string]*opt
-}
-
-func (o *optMatcher) match(args []string, c *parseContext) (bool, []string) {
-	if len(args) == 0 || c.rejectOptions {
-		return o.theOne.valueSetFromEnv, args
-	}
-
-	idx := 0
-	for idx < len(args) {
-		arg := args[idx]
-		switch {
-		case arg == "-":
-			idx++
-		case arg == "--":
-			return o.theOne.valueSetFromEnv, nil
-		case strings.HasPrefix(arg, "--"):
-			matched, consumed, nargs := o.matchLongOpt(args, idx, c)
-
-			if matched {
-				return true, nargs
-			}
-			if consumed == 0 {
-				return o.theOne.valueSetFromEnv, args
-			}
-			idx += consumed
-
-		case strings.HasPrefix(arg, "-"):
-			matched, consumed, nargs := o.matchShortOpt(args, idx, c)
-			if matched {
-				return true, nargs
-			}
-			if consumed == 0 {
-				return o.theOne.valueSetFromEnv, args
-			}
-			idx += consumed
-
-		default:
-			return o.theOne.valueSetFromEnv, args
-		}
-	}
-	return o.theOne.valueSetFromEnv, args
-}
-
-func (o *optMatcher) matchLongOpt(args []string, idx int, c *parseContext) (bool, int, []string) {
-	arg := args[idx]
-	kv := strings.Split(arg, "=")
-	name := kv[0]
-	opt, found := o.optionsIdx[name]
-	if !found {
-		return false, 0, args
-	}
-
-	switch {
-	case len(kv) == 2:
-		if opt != o.theOne {
-			return false, 1, args
-		}
-		value := kv[1]
-		c.opts[o.theOne] = append(c.opts[o.theOne], value)
-		return true, 1, removeStringAt(idx, args)
-	case opt.isBool():
-		if opt != o.theOne {
-			return false, 1, args
-		}
-		c.opts[o.theOne] = append(c.opts[o.theOne], "true")
-		return true, 1, removeStringAt(idx, args)
-	default:
-		if len(args[idx:]) < 2 {
-			return false, 0, args
-		}
-		if opt != o.theOne {
-			return false, 2, args
-		}
-		value := args[idx+1]
-		if strings.HasPrefix(value, "-") {
-			return false, 0, args
-		}
-		c.opts[o.theOne] = append(c.opts[o.theOne], value)
-		return true, 2, removeStringsBetween(idx, idx+1, args)
-	}
-}
-
-func (o *optMatcher) matchShortOpt(args []string, idx int, c *parseContext) (bool, int, []string) {
-	arg := args[idx]
-	if len(arg) < 2 {
-		return false, 0, args
-	}
-
-	if strings.HasPrefix(arg[2:], "=") {
-		name := arg[0:2]
-		opt, _ := o.optionsIdx[name]
-		if opt == o.theOne {
-			value := arg[3:]
-			if value == "" {
-				return false, 0, args
-			}
-			c.opts[o.theOne] = append(c.opts[o.theOne], value)
-			return true, 1, removeStringAt(idx, args)
-		}
-
-		return false, 1, args
-	}
-
-	rem := arg[1:]
-
-	remIdx := 0
-	for len(rem[remIdx:]) > 0 {
-		name := "-" + rem[remIdx:remIdx+1]
-
-		opt, found := o.optionsIdx[name]
-		if !found {
-			return false, 0, args
-		}
-
-		if opt.isBool() {
-			if opt != o.theOne {
-				remIdx++
-				continue
-			}
-
-			c.opts[o.theOne] = append(c.opts[o.theOne], "true")
-			newRem := rem[:remIdx] + rem[remIdx+1:]
-			if newRem == "" {
-				return true, 1, removeStringAt(idx, args)
-			}
-			return true, 0, replaceStringAt(idx, "-"+newRem, args)
-		}
-
-		value := rem[remIdx+1:]
-		if value == "" {
-			if len(args[idx+1:]) == 0 {
-				return false, 0, args
-			}
-			if opt != o.theOne {
-				return false, 2, args
-			}
-
-			value = args[idx+1]
-			if strings.HasPrefix(value, "-") {
-				return false, 0, args
-			}
-			c.opts[o.theOne] = append(c.opts[o.theOne], value)
-
-			newRem := rem[:remIdx]
-			if newRem == "" {
-				return true, 2, removeStringsBetween(idx, idx+1, args)
-			}
-
-			nargs := replaceStringAt(idx, "-"+newRem, args)
-
-			return true, 1, removeStringAt(idx+1, nargs)
-		}
-
-		if opt != o.theOne {
-			return false, 1, args
-		}
-		c.opts[o.theOne] = append(c.opts[o.theOne], value)
-		newRem := rem[:remIdx]
-		if newRem == "" {
-			return true, 1, removeStringAt(idx, args)
-		}
-		return true, 0, replaceStringAt(idx, "-"+newRem, args)
-
-	}
-
-	return false, 1, args
-}
-
-type optsMatcher struct {
-	options      []*opt
-	optionsIndex map[string]*opt
-}
-
-func (om optsMatcher) try(args []string, c *parseContext) (bool, []string) {
-	if len(args) == 0 || c.rejectOptions {
-		return false, args
-	}
-	for _, o := range om.options {
-		if _, exclude := c.excludedOpts[o]; exclude {
-			continue
-		}
-		if ok, nargs := (&optMatcher{theOne: o, optionsIdx: om.optionsIndex}).match(args, c); ok {
-			if o.valueSetFromEnv {
-				c.excludedOpts[o] = struct{}{}
-			}
-			return true, nargs
-		}
-	}
-	return false, args
-}
-
-func (om optsMatcher) match(args []string, c *parseContext) (bool, []string) {
-	ok, nargs := om.try(args, c)
-	if !ok {
-		return false, args
-	}
-
-	for {
-		ok, nnargs := om.try(nargs, c)
-		if !ok {
-			return true, nargs
-		}
-		nargs = nnargs
-	}
-}
-
-func (om optsMatcher) String() string {
-	return fmt.Sprintf("Opts(%v)", om.options)
-}
-
-func removeStringAt(idx int, arr []string) []string {
-	res := make([]string, len(arr)-1)
-	copy(res, arr[:idx])
-	copy(res[idx:], arr[idx+1:])
-	return res
-}
-
-func removeStringsBetween(from, to int, arr []string) []string {
-	res := make([]string, len(arr)-(to-from+1))
-	copy(res, arr[:from])
-	copy(res[from:], arr[to+1:])
-	return res
-}
-
-func replaceStringAt(idx int, with string, arr []string) []string {
-	res := make([]string, len(arr))
-	copy(res, arr[:idx])
-	res[idx] = with
-	copy(res[idx+1:], arr[idx+1:])
-	return res
-}
diff --git a/vendor/github.com/jawher/mow.cli/options.go b/vendor/github.com/jawher/mow.cli/options.go
index 7d1222610f884af008cd15bd33ddefffdc0e1f2a..da324d4a991600d79f8b571f2852e70a42565b6a 100644
--- a/vendor/github.com/jawher/mow.cli/options.go
+++ b/vendor/github.com/jawher/mow.cli/options.go
@@ -2,8 +2,10 @@ package cli
 
 import (
 	"flag"
-	"fmt"
 	"strings"
+
+	"github.com/jawher/mow.cli/internal/container"
+	"github.com/jawher/mow.cli/internal/values"
 )
 
 // BoolOpt describes a boolean option
@@ -229,30 +231,7 @@ The one letter names will then be called with a single dash (short option), the
 The result will be stored in the value parameter (a value implementing the flag.Value interface) which will be populated when the app is run and the call arguments get parsed
 */
 func (c *Cmd) VarOpt(name string, value flag.Value, desc string) {
-	c.mkOpt(opt{name: name, desc: desc, value: value})
-}
-
-type opt struct {
-	name            string
-	desc            string
-	envVar          string
-	names           []string
-	hideValue       bool
-	valueSetFromEnv bool
-	valueSetByUser  *bool
-	value           flag.Value
-}
-
-func (o *opt) isBool() bool {
-	if bf, ok := o.value.(boolValued); ok {
-		return bf.IsBoolFlag()
-	}
-
-	return false
-}
-
-func (o *opt) String() string {
-	return fmt.Sprintf("Opt(%v)", o.names)
+	c.mkOpt(container.Container{Name: name, Desc: desc, Value: value})
 }
 
 func mkOptStrs(optName string) []string {
@@ -267,13 +246,13 @@ func mkOptStrs(optName string) []string {
 	return res
 }
 
-func (c *Cmd) mkOpt(opt opt) {
-	opt.valueSetFromEnv = setFromEnv(opt.value, opt.envVar)
+func (c *Cmd) mkOpt(opt container.Container) {
+	opt.ValueSetFromEnv = values.SetFromEnv(opt.Value, opt.EnvVar)
 
-	opt.names = mkOptStrs(opt.name)
+	opt.Names = mkOptStrs(opt.Name)
 
 	c.options = append(c.options, &opt)
-	for _, name := range opt.names {
+	for _, name := range opt.Names {
 		c.optionsIdx[name] = &opt
 	}
 }
diff --git a/vendor/github.com/jawher/mow.cli/spec_parser.go b/vendor/github.com/jawher/mow.cli/spec_parser.go
deleted file mode 100644
index 2042008549fd77c863d64a4a91125df810be9b9e..0000000000000000000000000000000000000000
--- a/vendor/github.com/jawher/mow.cli/spec_parser.go
+++ /dev/null
@@ -1,243 +0,0 @@
-package cli
-
-import "fmt"
-
-func uParse(c *Cmd) (*state, error) {
-	tokens, err := uTokenize(c.Spec)
-	if err != nil {
-		return nil, err
-	}
-
-	p := &uParser{cmd: c, tokens: tokens}
-	return p.parse()
-}
-
-type uParser struct {
-	cmd    *Cmd
-	tokens []*uToken
-
-	tkpos int
-
-	matchedToken *uToken
-
-	rejectOptions bool
-}
-
-func (p *uParser) parse() (s *state, err error) {
-	defer func() {
-		if v := recover(); v != nil {
-			pos := len(p.cmd.Spec)
-			if !p.eof() {
-				pos = p.token().pos
-			}
-			s = nil
-			switch t, ok := v.(string); ok {
-			case true:
-				err = &parseError{p.cmd.Spec, t, pos}
-			default:
-				panic(v)
-			}
-		}
-	}()
-	err = nil
-	var e *state
-	s, e = p.seq(false)
-	if !p.eof() {
-		s = nil
-		err = &parseError{p.cmd.Spec, "Unexpected input", p.token().pos}
-		return
-	}
-
-	e.terminal = true
-	s.simplify()
-	return
-}
-
-func (p *uParser) seq(required bool) (*state, *state) {
-	start := newState(p.cmd)
-	end := start
-
-	appendComp := func(s, e *state) {
-		for _, tr := range s.transitions {
-			end.t(tr.matcher, tr.next)
-		}
-		end = e
-	}
-
-	if required {
-		s, e := p.choice()
-		appendComp(s, e)
-	}
-	for p.canAtom() {
-		s, e := p.choice()
-		appendComp(s, e)
-	}
-
-	return start, end
-}
-
-func (p *uParser) choice() (*state, *state) {
-	start, end := newState(p.cmd), newState(p.cmd)
-
-	add := func(s, e *state) {
-		start.t(shortcut, s)
-		e.t(shortcut, end)
-	}
-
-	add(p.atom())
-	for p.found(utChoice) {
-		add(p.atom())
-	}
-	return start, end
-}
-
-func (p *uParser) atom() (*state, *state) {
-	start := newState(p.cmd)
-	var end *state
-	switch {
-	case p.eof():
-		panic("Unexpected end of input")
-	case p.found(utPos):
-		name := p.matchedToken.val
-		arg, declared := p.cmd.argsIdx[name]
-		if !declared {
-			p.back()
-			panic(fmt.Sprintf("Undeclared arg %s", name))
-		}
-		end = start.t(arg, newState(p.cmd))
-	case p.found(utOptions):
-		if p.rejectOptions {
-			p.back()
-			panic("No options after --")
-		}
-		end = newState(p.cmd)
-		start.t(optsMatcher{options: p.cmd.options, optionsIndex: p.cmd.optionsIdx}, end)
-	case p.found(utShortOpt):
-		if p.rejectOptions {
-			p.back()
-			panic("No options after --")
-		}
-		name := p.matchedToken.val
-		opt, declared := p.cmd.optionsIdx[name]
-		if !declared {
-			p.back()
-			panic(fmt.Sprintf("Undeclared option %s", name))
-		}
-		end = start.t(&optMatcher{
-			theOne:     opt,
-			optionsIdx: p.cmd.optionsIdx,
-		}, newState(p.cmd))
-		p.found(utOptValue)
-	case p.found(utLongOpt):
-		if p.rejectOptions {
-			p.back()
-			panic("No options after --")
-		}
-		name := p.matchedToken.val
-		opt, declared := p.cmd.optionsIdx[name]
-		if !declared {
-			p.back()
-			panic(fmt.Sprintf("Undeclared option %s", name))
-		}
-		end = start.t(&optMatcher{
-			theOne:     opt,
-			optionsIdx: p.cmd.optionsIdx,
-		}, newState(p.cmd))
-		p.found(utOptValue)
-	case p.found(utOptSeq):
-		if p.rejectOptions {
-			p.back()
-			panic("No options after --")
-		}
-		end = newState(p.cmd)
-		sq := p.matchedToken.val
-		opts := []*opt{}
-		for i := range sq {
-			sn := sq[i : i+1]
-			opt, declared := p.cmd.optionsIdx["-"+sn]
-			if !declared {
-				p.back()
-				panic(fmt.Sprintf("Undeclared option %s", sn))
-			}
-			opts = append(opts, opt)
-		}
-		start.t(optsMatcher{options: opts, optionsIndex: p.cmd.optionsIdx}, end)
-	case p.found(utOpenPar):
-		start, end = p.seq(true)
-		p.expect(utClosePar)
-	case p.found(utOpenSq):
-		start, end = p.seq(true)
-		start.t(shortcut, end)
-		p.expect(utCloseSq)
-	case p.found(utDoubleDash):
-		p.rejectOptions = true
-		end = start.t(optsEnd, newState(p.cmd))
-		return start, end
-	default:
-		panic("Unexpected input: was expecting a command or a positional argument or an option")
-	}
-	if p.found(utRep) {
-		end.t(shortcut, start)
-	}
-	return start, end
-}
-
-func (p *uParser) canAtom() bool {
-	switch {
-	case p.is(utPos):
-		return true
-	case p.is(utOptions):
-		return true
-	case p.is(utShortOpt):
-		return true
-	case p.is(utLongOpt):
-		return true
-	case p.is(utOptSeq):
-		return true
-	case p.is(utOpenPar):
-		return true
-	case p.is(utOpenSq):
-		return true
-	case p.is(utDoubleDash):
-		return true
-	default:
-		return false
-	}
-}
-
-func (p *uParser) found(t uTokenType) bool {
-	if p.is(t) {
-		p.matchedToken = p.token()
-		p.tkpos++
-		return true
-	}
-	return false
-}
-
-func (p *uParser) is(t uTokenType) bool {
-	if p.eof() {
-		return false
-	}
-	return p.token().typ == t
-}
-
-func (p *uParser) expect(t uTokenType) {
-	if !p.found(t) {
-		panic(fmt.Sprintf("Was expecting %v", t))
-	}
-}
-
-func (p *uParser) back() {
-	p.tkpos--
-}
-func (p *uParser) eof() bool {
-	return p.tkpos >= len(p.tokens)
-}
-
-func (p *uParser) token() *uToken {
-	if p.eof() {
-		return nil
-	}
-
-	return p.tokens[p.tkpos]
-}
diff --git a/vendor/github.com/jawher/mow.cli/values.go b/vendor/github.com/jawher/mow.cli/values.go
deleted file mode 100644
index 953f303fad682ff4b1ed3105d177323ab8e9f470..0000000000000000000000000000000000000000
--- a/vendor/github.com/jawher/mow.cli/values.go
+++ /dev/null
@@ -1,203 +0,0 @@
-package cli
-
-import (
-	"flag"
-	"fmt"
-	"strconv"
-)
-
-type boolValued interface {
-	flag.Value
-	IsBoolFlag() bool
-}
-
-type multiValued interface {
-	flag.Value
-	Clear()
-}
-
-type defaultValued interface {
-	IsDefault() bool
-}
-
-/******************************************************************************/
-/* BOOL                                                                        */
-/******************************************************************************/
-
-type boolValue bool
-
-var (
-	_ flag.Value    = newBoolValue(new(bool), false)
-	_ boolValued    = newBoolValue(new(bool), false)
-	_ defaultValued = newBoolValue(new(bool), false)
-)
-
-func newBoolValue(into *bool, v bool) *boolValue {
-	*into = v
-	return (*boolValue)(into)
-}
-
-func (bo *boolValue) Set(s string) error {
-	b, err := strconv.ParseBool(s)
-	if err != nil {
-		return err
-	}
-	*bo = boolValue(b)
-	return nil
-}
-
-func (bo *boolValue) IsBoolFlag() bool {
-	return true
-}
-
-func (bo *boolValue) String() string {
-	return fmt.Sprintf("%v", *bo)
-}
-
-func (bo *boolValue) IsDefault() bool {
-	return !bool(*bo)
-}
-
-/******************************************************************************/
-/* STRING                                                                        */
-/******************************************************************************/
-
-type stringValue string
-
-var (
-	_ flag.Value    = newStringValue(new(string), "")
-	_ defaultValued = newStringValue(new(string), "")
-)
-
-func newStringValue(into *string, v string) *stringValue {
-	*into = v
-	return (*stringValue)(into)
-}
-
-func (sa *stringValue) Set(s string) error {
-	*sa = stringValue(s)
-	return nil
-}
-
-func (sa *stringValue) String() string {
-	return fmt.Sprintf("%#v", *sa)
-}
-
-func (sa *stringValue) IsDefault() bool {
-	return string(*sa) == ""
-}
-
-/******************************************************************************/
-/* INT                                                                        */
-/******************************************************************************/
-
-type intValue int
-
-var (
-	_ flag.Value = newIntValue(new(int), 0)
-)
-
-func newIntValue(into *int, v int) *intValue {
-	*into = v
-	return (*intValue)(into)
-}
-
-func (ia *intValue) Set(s string) error {
-	i, err := strconv.ParseInt(s, 10, 64)
-	if err != nil {
-		return err
-	}
-	*ia = intValue(int(i))
-	return nil
-}
-
-func (ia *intValue) String() string {
-	return fmt.Sprintf("%v", *ia)
-}
-
-/******************************************************************************/
-/* STRINGS                                                                    */
-/******************************************************************************/
-
-// Strings describes a string slice argument
-type stringsValue []string
-
-var (
-	_ flag.Value    = newStringsValue(new([]string), nil)
-	_ multiValued   = newStringsValue(new([]string), nil)
-	_ defaultValued = newStringsValue(new([]string), nil)
-)
-
-func newStringsValue(into *[]string, v []string) *stringsValue {
-	*into = v
-	return (*stringsValue)(into)
-}
-
-func (sa *stringsValue) Set(s string) error {
-	*sa = append(*sa, s)
-	return nil
-}
-
-func (sa *stringsValue) String() string {
-	res := "["
-	for idx, s := range *sa {
-		if idx > 0 {
-			res += ", "
-		}
-		res += fmt.Sprintf("%#v", s)
-	}
-	return res + "]"
-}
-
-func (sa *stringsValue) Clear() {
-	*sa = nil
-}
-
-func (sa *stringsValue) IsDefault() bool {
-	return len(*sa) == 0
-}
-
-/******************************************************************************/
-/* INTS                                                                       */
-/******************************************************************************/
-
-type intsValue []int
-
-var (
-	_ flag.Value    = newIntsValue(new([]int), nil)
-	_ multiValued   = newIntsValue(new([]int), nil)
-	_ defaultValued = newIntsValue(new([]int), nil)
-)
-
-func newIntsValue(into *[]int, v []int) *intsValue {
-	*into = v
-	return (*intsValue)(into)
-}
-
-func (ia *intsValue) Set(s string) error {
-	i, err := strconv.ParseInt(s, 10, 64)
-	if err != nil {
-		return err
-	}
-	*ia = append(*ia, int(i))
-	return nil
-}
-
-func (ia *intsValue) String() string {
-	res := "["
-	for idx, s := range *ia {
-		if idx > 0 {
-			res += ", "
-		}
-		res += fmt.Sprintf("%v", s)
-	}
-	return res + "]"
-}
-
-func (ia *intsValue) Clear() {
-	*ia = nil
-}
-
-func (ia *intsValue) IsDefault() bool {
-	return len(*ia) == 0
-}
diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go
index 291eae7d8e5bce17714a8392492051fa06ff310f..8fa8f486facc3b400dbe8ab4e5ae3387c344ad2a 100644
--- a/vendor/github.com/spf13/cobra/bash_completions.go
+++ b/vendor/github.com/spf13/cobra/bash_completions.go
@@ -251,6 +251,14 @@ __%[1]s_handle_word()
         __%[1]s_handle_command
     elif [[ $c -eq 0 ]]; then
         __%[1]s_handle_command
+    elif __%[1]s_contains_word "${words[c]}" "${command_aliases[@]}"; then
+        # aliashash variable is an associative array which is only supported in bash > 3.
+        if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then
+            words[c]=${aliashash[${words[c]}]}
+            __%[1]s_handle_command
+        else
+            __%[1]s_handle_noun
+        fi
     else
         __%[1]s_handle_noun
     fi
@@ -266,6 +274,7 @@ func writePostscript(buf *bytes.Buffer, name string) {
 	buf.WriteString(fmt.Sprintf(`{
     local cur prev words cword
     declare -A flaghash 2>/dev/null || :
+    declare -A aliashash 2>/dev/null || :
     if declare -F _init_completion >/dev/null 2>&1; then
         _init_completion -s || return
     else
@@ -305,6 +314,7 @@ func writeCommands(buf *bytes.Buffer, cmd *Command) {
 			continue
 		}
 		buf.WriteString(fmt.Sprintf("    commands+=(%q)\n", c.Name()))
+		writeCmdAliases(buf, c)
 	}
 	buf.WriteString("\n")
 }
@@ -443,6 +453,21 @@ func writeRequiredNouns(buf *bytes.Buffer, cmd *Command) {
 	}
 }
 
+func writeCmdAliases(buf *bytes.Buffer, cmd *Command) {
+	if len(cmd.Aliases) == 0 {
+		return
+	}
+
+	sort.Sort(sort.StringSlice(cmd.Aliases))
+
+	buf.WriteString(fmt.Sprint(`    if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then`, "\n"))
+	for _, value := range cmd.Aliases {
+		buf.WriteString(fmt.Sprintf("        command_aliases+=(%q)\n", value))
+		buf.WriteString(fmt.Sprintf("        aliashash[%q]=%q\n", value, cmd.Name()))
+	}
+	buf.WriteString(`    fi`)
+	buf.WriteString("\n")
+}
 func writeArgAliases(buf *bytes.Buffer, cmd *Command) {
 	buf.WriteString("    noun_aliases=()\n")
 	sort.Sort(sort.StringSlice(cmd.ArgAliases))
@@ -469,6 +494,10 @@ func gen(buf *bytes.Buffer, cmd *Command) {
 	}
 
 	buf.WriteString(fmt.Sprintf("    last_command=%q\n", commandName))
+	buf.WriteString("\n")
+	buf.WriteString("    command_aliases=()\n")
+	buf.WriteString("\n")
+
 	writeCommands(buf, cmd)
 	writeFlags(buf, cmd)
 	writeRequiredFlag(buf, cmd)
diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go
index 15b8112795cbb9227c5793ab1e77e66b860fe119..34d1bf367129f246217a3806d658e693bb5810fd 100644
--- a/vendor/github.com/spf13/cobra/command.go
+++ b/vendor/github.com/spf13/cobra/command.go
@@ -27,6 +27,9 @@ import (
 	flag "github.com/spf13/pflag"
 )
 
+// FParseErrWhitelist configures Flag parse errors to be ignored
+type FParseErrWhitelist flag.ParseErrorsWhitelist
+
 // Command is just that, a command for your application.
 // E.g.  'go run ...' - 'run' is the command. Cobra requires
 // you to define the usage and description as part of your command
@@ -137,6 +140,9 @@ type Command struct {
 	// TraverseChildren parses flags on all parents before executing child command.
 	TraverseChildren bool
 
+	//FParseErrWhitelist flag parse errors to be ignored
+	FParseErrWhitelist FParseErrWhitelist
+
 	// commands is the list of commands supported by this program.
 	commands []*Command
 	// parent is a parent command for this command.
@@ -1463,6 +1469,10 @@ func (c *Command) ParseFlags(args []string) error {
 	}
 	beforeErrorBufLen := c.flagErrorBuf.Len()
 	c.mergePersistentFlags()
+
+	//do it here after merging all flags and just before parse
+	c.Flags().ParseErrorsWhitelist = flag.ParseErrorsWhitelist(c.FParseErrWhitelist)
+
 	err := c.Flags().Parse(args)
 	// Print warnings if they occurred (e.g. deprecated flag messages).
 	if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil {
diff --git a/vendor/github.com/spf13/pflag/bytes.go b/vendor/github.com/spf13/pflag/bytes.go
new file mode 100644
index 0000000000000000000000000000000000000000..12c58db9fe30c5edf78f13cbf2ec37e0900e1f36
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/bytes.go
@@ -0,0 +1,105 @@
+package pflag
+
+import (
+	"encoding/hex"
+	"fmt"
+	"strings"
+)
+
+// BytesHex adapts []byte for use as a flag. Value of flag is HEX encoded
+type bytesHexValue []byte
+
+func (bytesHex bytesHexValue) String() string {
+	return fmt.Sprintf("%X", []byte(bytesHex))
+}
+
+func (bytesHex *bytesHexValue) Set(value string) error {
+	bin, err := hex.DecodeString(strings.TrimSpace(value))
+
+	if err != nil {
+		return err
+	}
+
+	*bytesHex = bin
+
+	return nil
+}
+
+func (*bytesHexValue) Type() string {
+	return "bytesHex"
+}
+
+func newBytesHexValue(val []byte, p *[]byte) *bytesHexValue {
+	*p = val
+	return (*bytesHexValue)(p)
+}
+
+func bytesHexConv(sval string) (interface{}, error) {
+
+	bin, err := hex.DecodeString(sval)
+
+	if err == nil {
+		return bin, nil
+	}
+
+	return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err)
+}
+
+// GetBytesHex return the []byte value of a flag with the given name
+func (f *FlagSet) GetBytesHex(name string) ([]byte, error) {
+	val, err := f.getFlagType(name, "bytesHex", bytesHexConv)
+
+	if err != nil {
+		return []byte{}, err
+	}
+
+	return val.([]byte), nil
+}
+
+// BytesHexVar defines an []byte flag with specified name, default value, and usage string.
+// The argument p points to an []byte variable in which to store the value of the flag.
+func (f *FlagSet) BytesHexVar(p *[]byte, name string, value []byte, usage string) {
+	f.VarP(newBytesHexValue(value, p), name, "", usage)
+}
+
+// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) {
+	f.VarP(newBytesHexValue(value, p), name, shorthand, usage)
+}
+
+// BytesHexVar defines an []byte flag with specified name, default value, and usage string.
+// The argument p points to an []byte variable in which to store the value of the flag.
+func BytesHexVar(p *[]byte, name string, value []byte, usage string) {
+	CommandLine.VarP(newBytesHexValue(value, p), name, "", usage)
+}
+
+// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash.
+func BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) {
+	CommandLine.VarP(newBytesHexValue(value, p), name, shorthand, usage)
+}
+
+// BytesHex defines an []byte flag with specified name, default value, and usage string.
+// The return value is the address of an []byte variable that stores the value of the flag.
+func (f *FlagSet) BytesHex(name string, value []byte, usage string) *[]byte {
+	p := new([]byte)
+	f.BytesHexVarP(p, name, "", value, usage)
+	return p
+}
+
+// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BytesHexP(name, shorthand string, value []byte, usage string) *[]byte {
+	p := new([]byte)
+	f.BytesHexVarP(p, name, shorthand, value, usage)
+	return p
+}
+
+// BytesHex defines an []byte flag with specified name, default value, and usage string.
+// The return value is the address of an []byte variable that stores the value of the flag.
+func BytesHex(name string, value []byte, usage string) *[]byte {
+	return CommandLine.BytesHexP(name, "", value, usage)
+}
+
+// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash.
+func BytesHexP(name, shorthand string, value []byte, usage string) *[]byte {
+	return CommandLine.BytesHexP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/count.go b/vendor/github.com/spf13/pflag/count.go
index 250a43814c920e0c1b6415631eea9ae5c22271c7..aa126e44d1c83255b9283a73ef38e4068c2f5922 100644
--- a/vendor/github.com/spf13/pflag/count.go
+++ b/vendor/github.com/spf13/pflag/count.go
@@ -11,13 +11,13 @@ func newCountValue(val int, p *int) *countValue {
 }
 
 func (i *countValue) Set(s string) error {
-	v, err := strconv.ParseInt(s, 0, 64)
-	// -1 means that no specific value was passed, so increment
-	if v == -1 {
+	// "+1" means that no specific value was passed, so increment
+	if s == "+1" {
 		*i = countValue(*i + 1)
-	} else {
-		*i = countValue(v)
+		return nil
 	}
+	v, err := strconv.ParseInt(s, 0, 0)
+	*i = countValue(v)
 	return err
 }
 
@@ -54,7 +54,7 @@ func (f *FlagSet) CountVar(p *int, name string, usage string) {
 // CountVarP is like CountVar only take a shorthand for the flag name.
 func (f *FlagSet) CountVarP(p *int, name, shorthand string, usage string) {
 	flag := f.VarPF(newCountValue(0, p), name, shorthand, usage)
-	flag.NoOptDefVal = "-1"
+	flag.NoOptDefVal = "+1"
 }
 
 // CountVar like CountVar only the flag is placed on the CommandLine instead of a given flag set
diff --git a/vendor/github.com/spf13/pflag/duration_slice.go b/vendor/github.com/spf13/pflag/duration_slice.go
new file mode 100644
index 0000000000000000000000000000000000000000..52c6b6dc1041f48e56a84c79369f0a15c7c3bee7
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/duration_slice.go
@@ -0,0 +1,128 @@
+package pflag
+
+import (
+	"fmt"
+	"strings"
+	"time"
+)
+
+// -- durationSlice Value
+type durationSliceValue struct {
+	value   *[]time.Duration
+	changed bool
+}
+
+func newDurationSliceValue(val []time.Duration, p *[]time.Duration) *durationSliceValue {
+	dsv := new(durationSliceValue)
+	dsv.value = p
+	*dsv.value = val
+	return dsv
+}
+
+func (s *durationSliceValue) Set(val string) error {
+	ss := strings.Split(val, ",")
+	out := make([]time.Duration, len(ss))
+	for i, d := range ss {
+		var err error
+		out[i], err = time.ParseDuration(d)
+		if err != nil {
+			return err
+		}
+
+	}
+	if !s.changed {
+		*s.value = out
+	} else {
+		*s.value = append(*s.value, out...)
+	}
+	s.changed = true
+	return nil
+}
+
+func (s *durationSliceValue) Type() string {
+	return "durationSlice"
+}
+
+func (s *durationSliceValue) String() string {
+	out := make([]string, len(*s.value))
+	for i, d := range *s.value {
+		out[i] = fmt.Sprintf("%s", d)
+	}
+	return "[" + strings.Join(out, ",") + "]"
+}
+
+func durationSliceConv(val string) (interface{}, error) {
+	val = strings.Trim(val, "[]")
+	// Empty string would cause a slice with one (empty) entry
+	if len(val) == 0 {
+		return []time.Duration{}, nil
+	}
+	ss := strings.Split(val, ",")
+	out := make([]time.Duration, len(ss))
+	for i, d := range ss {
+		var err error
+		out[i], err = time.ParseDuration(d)
+		if err != nil {
+			return nil, err
+		}
+
+	}
+	return out, nil
+}
+
+// GetDurationSlice returns the []time.Duration value of a flag with the given name
+func (f *FlagSet) GetDurationSlice(name string) ([]time.Duration, error) {
+	val, err := f.getFlagType(name, "durationSlice", durationSliceConv)
+	if err != nil {
+		return []time.Duration{}, err
+	}
+	return val.([]time.Duration), nil
+}
+
+// DurationSliceVar defines a durationSlice flag with specified name, default value, and usage string.
+// The argument p points to a []time.Duration variable in which to store the value of the flag.
+func (f *FlagSet) DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
+	f.VarP(newDurationSliceValue(value, p), name, "", usage)
+}
+
+// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
+	f.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
+}
+
+// DurationSliceVar defines a duration[] flag with specified name, default value, and usage string.
+// The argument p points to a duration[] variable in which to store the value of the flag.
+func DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
+	CommandLine.VarP(newDurationSliceValue(value, p), name, "", usage)
+}
+
+// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
+	CommandLine.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
+}
+
+// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
+// The return value is the address of a []time.Duration variable that stores the value of the flag.
+func (f *FlagSet) DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
+	p := []time.Duration{}
+	f.DurationSliceVarP(&p, name, "", value, usage)
+	return &p
+}
+
+// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
+	p := []time.Duration{}
+	f.DurationSliceVarP(&p, name, shorthand, value, usage)
+	return &p
+}
+
+// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
+// The return value is the address of a []time.Duration variable that stores the value of the flag.
+func DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
+	return CommandLine.DurationSliceP(name, "", value, usage)
+}
+
+// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
+func DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
+	return CommandLine.DurationSliceP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/flag.go b/vendor/github.com/spf13/pflag/flag.go
index 6f1fc3007a858771ba687a5a7ca429dfe8231e51..5eadc84e3c42c9048259ac864c8863807adcc504 100644
--- a/vendor/github.com/spf13/pflag/flag.go
+++ b/vendor/github.com/spf13/pflag/flag.go
@@ -101,6 +101,7 @@ package pflag
 import (
 	"bytes"
 	"errors"
+	goflag "flag"
 	"fmt"
 	"io"
 	"os"
@@ -123,6 +124,12 @@ const (
 	PanicOnError
 )
 
+// ParseErrorsWhitelist defines the parsing errors that can be ignored
+type ParseErrorsWhitelist struct {
+	// UnknownFlags will ignore unknown flags errors and continue parsing rest of the flags
+	UnknownFlags bool
+}
+
 // NormalizedName is a flag name that has been normalized according to rules
 // for the FlagSet (e.g. making '-' and '_' equivalent).
 type NormalizedName string
@@ -138,6 +145,9 @@ type FlagSet struct {
 	// help/usage messages.
 	SortFlags bool
 
+	// ParseErrorsWhitelist is used to configure a whitelist of errors
+	ParseErrorsWhitelist ParseErrorsWhitelist
+
 	name              string
 	parsed            bool
 	actual            map[NormalizedName]*Flag
@@ -153,6 +163,8 @@ type FlagSet struct {
 	output            io.Writer // nil means stderr; use out() accessor
 	interspersed      bool      // allow interspersed option/non-option args
 	normalizeNameFunc func(f *FlagSet, name string) NormalizedName
+
+	addedGoFlagSets []*goflag.FlagSet
 }
 
 // A Flag represents the state of a flag.
@@ -202,12 +214,18 @@ func sortFlags(flags map[NormalizedName]*Flag) []*Flag {
 func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) NormalizedName) {
 	f.normalizeNameFunc = n
 	f.sortedFormal = f.sortedFormal[:0]
-	for k, v := range f.orderedFormal {
-		delete(f.formal, NormalizedName(v.Name))
-		nname := f.normalizeFlagName(v.Name)
-		v.Name = string(nname)
-		f.formal[nname] = v
-		f.orderedFormal[k] = v
+	for fname, flag := range f.formal {
+		nname := f.normalizeFlagName(flag.Name)
+		if fname == nname {
+			continue
+		}
+		flag.Name = string(nname)
+		delete(f.formal, fname)
+		f.formal[nname] = flag
+		if _, set := f.actual[fname]; set {
+			delete(f.actual, fname)
+			f.actual[nname] = flag
+		}
 	}
 }
 
@@ -261,16 +279,16 @@ func (f *FlagSet) VisitAll(fn func(*Flag)) {
 	}
 }
 
-// HasFlags returns a bool to indicate if the FlagSet has any flags definied.
+// HasFlags returns a bool to indicate if the FlagSet has any flags defined.
 func (f *FlagSet) HasFlags() bool {
 	return len(f.formal) > 0
 }
 
 // HasAvailableFlags returns a bool to indicate if the FlagSet has any flags
-// definied that are not hidden or deprecated.
+// that are not hidden.
 func (f *FlagSet) HasAvailableFlags() bool {
 	for _, flag := range f.formal {
-		if !flag.Hidden && len(flag.Deprecated) == 0 {
+		if !flag.Hidden {
 			return true
 		}
 	}
@@ -380,6 +398,7 @@ func (f *FlagSet) MarkDeprecated(name string, usageMessage string) error {
 		return fmt.Errorf("deprecated message for flag %q must be set", name)
 	}
 	flag.Deprecated = usageMessage
+	flag.Hidden = true
 	return nil
 }
 
@@ -440,13 +459,15 @@ func (f *FlagSet) Set(name, value string) error {
 		return fmt.Errorf("invalid argument %q for %q flag: %v", value, flagName, err)
 	}
 
-	if f.actual == nil {
-		f.actual = make(map[NormalizedName]*Flag)
-	}
-	f.actual[normalName] = flag
-	f.orderedActual = append(f.orderedActual, flag)
+	if !flag.Changed {
+		if f.actual == nil {
+			f.actual = make(map[NormalizedName]*Flag)
+		}
+		f.actual[normalName] = flag
+		f.orderedActual = append(f.orderedActual, flag)
 
-	flag.Changed = true
+		flag.Changed = true
+	}
 
 	if flag.Deprecated != "" {
 		fmt.Fprintf(f.out(), "Flag --%s has been deprecated, %s\n", flag.Name, flag.Deprecated)
@@ -556,6 +577,14 @@ func UnquoteUsage(flag *Flag) (name string, usage string) {
 		name = "int"
 	case "uint64":
 		name = "uint"
+	case "stringSlice":
+		name = "strings"
+	case "intSlice":
+		name = "ints"
+	case "uintSlice":
+		name = "uints"
+	case "boolSlice":
+		name = "bools"
 	}
 
 	return
@@ -570,11 +599,14 @@ func wrapN(i, slop int, s string) (string, string) {
 		return s, ""
 	}
 
-	w := strings.LastIndexAny(s[:i], " \t")
+	w := strings.LastIndexAny(s[:i], " \t\n")
 	if w <= 0 {
 		return s, ""
 	}
-
+	nlPos := strings.LastIndex(s[:i], "\n")
+	if nlPos > 0 && nlPos < w {
+		return s[:nlPos], s[nlPos+1:]
+	}
 	return s[:w], s[w+1:]
 }
 
@@ -583,7 +615,7 @@ func wrapN(i, slop int, s string) (string, string) {
 // caller). Pass `w` == 0 to do no wrapping
 func wrap(i, w int, s string) string {
 	if w == 0 {
-		return s
+		return strings.Replace(s, "\n", "\n"+strings.Repeat(" ", i), -1)
 	}
 
 	// space between indent i and end of line width w into which
@@ -601,7 +633,7 @@ func wrap(i, w int, s string) string {
 	}
 	// If still not enough space then don't even try to wrap.
 	if wrap < 24 {
-		return s
+		return strings.Replace(s, "\n", r, -1)
 	}
 
 	// Try to avoid short orphan words on the final line, by
@@ -613,14 +645,14 @@ func wrap(i, w int, s string) string {
 	// Handle first line, which is indented by the caller (or the
 	// special case above)
 	l, s = wrapN(wrap, slop, s)
-	r = r + l
+	r = r + strings.Replace(l, "\n", "\n"+strings.Repeat(" ", i), -1)
 
 	// Now wrap the rest
 	for s != "" {
 		var t string
 
 		t, s = wrapN(wrap, slop, s)
-		r = r + "\n" + strings.Repeat(" ", i) + t
+		r = r + "\n" + strings.Repeat(" ", i) + strings.Replace(t, "\n", "\n"+strings.Repeat(" ", i), -1)
 	}
 
 	return r
@@ -637,7 +669,7 @@ func (f *FlagSet) FlagUsagesWrapped(cols int) string {
 
 	maxlen := 0
 	f.VisitAll(func(flag *Flag) {
-		if flag.Deprecated != "" || flag.Hidden {
+		if flag.Hidden {
 			return
 		}
 
@@ -660,6 +692,10 @@ func (f *FlagSet) FlagUsagesWrapped(cols int) string {
 				if flag.NoOptDefVal != "true" {
 					line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
 				}
+			case "count":
+				if flag.NoOptDefVal != "+1" {
+					line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
+				}
 			default:
 				line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
 			}
@@ -680,6 +716,9 @@ func (f *FlagSet) FlagUsagesWrapped(cols int) string {
 				line += fmt.Sprintf(" (default %s)", flag.DefValue)
 			}
 		}
+		if len(flag.Deprecated) != 0 {
+			line += fmt.Sprintf(" (DEPRECATED: %s)", flag.Deprecated)
+		}
 
 		lines = append(lines, line)
 	})
@@ -857,8 +896,10 @@ func VarP(value Value, name, shorthand, usage string) {
 // returns the error.
 func (f *FlagSet) failf(format string, a ...interface{}) error {
 	err := fmt.Errorf(format, a...)
-	fmt.Fprintln(f.out(), err)
-	f.usage()
+	if f.errorHandling != ContinueOnError {
+		fmt.Fprintln(f.out(), err)
+		f.usage()
+	}
 	return err
 }
 
@@ -874,6 +915,25 @@ func (f *FlagSet) usage() {
 	}
 }
 
+//--unknown (args will be empty)
+//--unknown --next-flag ... (args will be --next-flag ...)
+//--unknown arg ... (args will be arg ...)
+func stripUnknownFlagValue(args []string) []string {
+	if len(args) == 0 {
+		//--unknown
+		return args
+	}
+
+	first := args[0]
+	if first[0] == '-' {
+		//--unknown --next-flag ...
+		return args
+	}
+
+	//--unknown arg ... (args will be arg ...)
+	return args[1:]
+}
+
 func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) (a []string, err error) {
 	a = args
 	name := s[2:]
@@ -885,13 +945,24 @@ func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) (a []strin
 	split := strings.SplitN(name, "=", 2)
 	name = split[0]
 	flag, exists := f.formal[f.normalizeFlagName(name)]
+
 	if !exists {
-		if name == "help" { // special case for nice help message.
+		switch {
+		case name == "help":
 			f.usage()
 			return a, ErrHelp
+		case f.ParseErrorsWhitelist.UnknownFlags:
+			// --unknown=unknownval arg ...
+			// we do not want to lose arg in this case
+			if len(split) >= 2 {
+				return a, nil
+			}
+
+			return stripUnknownFlagValue(a), nil
+		default:
+			err = f.failf("unknown flag: --%s", name)
+			return
 		}
-		err = f.failf("unknown flag: --%s", name)
-		return
 	}
 
 	var value string
@@ -912,6 +983,9 @@ func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) (a []strin
 	}
 
 	err = fn(flag, value)
+	if err != nil {
+		f.failf(err.Error())
+	}
 	return
 }
 
@@ -926,13 +1000,25 @@ func (f *FlagSet) parseSingleShortArg(shorthands string, args []string, fn parse
 
 	flag, exists := f.shorthands[c]
 	if !exists {
-		if c == 'h' { // special case for nice help message.
+		switch {
+		case c == 'h':
 			f.usage()
 			err = ErrHelp
 			return
+		case f.ParseErrorsWhitelist.UnknownFlags:
+			// '-f=arg arg ...'
+			// we do not want to lose arg in this case
+			if len(shorthands) > 2 && shorthands[1] == '=' {
+				outShorts = ""
+				return
+			}
+
+			outArgs = stripUnknownFlagValue(outArgs)
+			return
+		default:
+			err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands)
+			return
 		}
-		err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands)
-		return
 	}
 
 	var value string
@@ -962,6 +1048,9 @@ func (f *FlagSet) parseSingleShortArg(shorthands string, args []string, fn parse
 	}
 
 	err = fn(flag, value)
+	if err != nil {
+		f.failf(err.Error())
+	}
 	return
 }
 
@@ -1016,6 +1105,11 @@ func (f *FlagSet) parseArgs(args []string, fn parseFunc) (err error) {
 // are defined and before flags are accessed by the program.
 // The return value will be ErrHelp if -help was set but not defined.
 func (f *FlagSet) Parse(arguments []string) error {
+	if f.addedGoFlagSets != nil {
+		for _, goFlagSet := range f.addedGoFlagSets {
+			goFlagSet.Parse(nil)
+		}
+	}
 	f.parsed = true
 
 	if len(arguments) < 0 {
@@ -1034,6 +1128,7 @@ func (f *FlagSet) Parse(arguments []string) error {
 		case ContinueOnError:
 			return err
 		case ExitOnError:
+			fmt.Println(err)
 			os.Exit(2)
 		case PanicOnError:
 			panic(err)
diff --git a/vendor/github.com/spf13/pflag/golangflag.go b/vendor/github.com/spf13/pflag/golangflag.go
index c4f47ebe590fe9268c1e8a7e712edeae763bd10e..d3dd72b7feed6744b897518f6a468ff7bacab69f 100644
--- a/vendor/github.com/spf13/pflag/golangflag.go
+++ b/vendor/github.com/spf13/pflag/golangflag.go
@@ -98,4 +98,8 @@ func (f *FlagSet) AddGoFlagSet(newSet *goflag.FlagSet) {
 	newSet.VisitAll(func(goflag *goflag.Flag) {
 		f.AddGoFlag(goflag)
 	})
+	if f.addedGoFlagSets == nil {
+		f.addedGoFlagSets = make([]*goflag.FlagSet, 0)
+	}
+	f.addedGoFlagSets = append(f.addedGoFlagSets, newSet)
 }
diff --git a/vendor/github.com/spf13/pflag/int16.go b/vendor/github.com/spf13/pflag/int16.go
new file mode 100644
index 0000000000000000000000000000000000000000..f1a01d05e6946c68062903ebb0081741e65ff5c2
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/int16.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- int16 Value
+type int16Value int16
+
+func newInt16Value(val int16, p *int16) *int16Value {
+	*p = val
+	return (*int16Value)(p)
+}
+
+func (i *int16Value) Set(s string) error {
+	v, err := strconv.ParseInt(s, 0, 16)
+	*i = int16Value(v)
+	return err
+}
+
+func (i *int16Value) Type() string {
+	return "int16"
+}
+
+func (i *int16Value) String() string { return strconv.FormatInt(int64(*i), 10) }
+
+func int16Conv(sval string) (interface{}, error) {
+	v, err := strconv.ParseInt(sval, 0, 16)
+	if err != nil {
+		return 0, err
+	}
+	return int16(v), nil
+}
+
+// GetInt16 returns the int16 value of a flag with the given name
+func (f *FlagSet) GetInt16(name string) (int16, error) {
+	val, err := f.getFlagType(name, "int16", int16Conv)
+	if err != nil {
+		return 0, err
+	}
+	return val.(int16), nil
+}
+
+// Int16Var defines an int16 flag with specified name, default value, and usage string.
+// The argument p points to an int16 variable in which to store the value of the flag.
+func (f *FlagSet) Int16Var(p *int16, name string, value int16, usage string) {
+	f.VarP(newInt16Value(value, p), name, "", usage)
+}
+
+// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int16VarP(p *int16, name, shorthand string, value int16, usage string) {
+	f.VarP(newInt16Value(value, p), name, shorthand, usage)
+}
+
+// Int16Var defines an int16 flag with specified name, default value, and usage string.
+// The argument p points to an int16 variable in which to store the value of the flag.
+func Int16Var(p *int16, name string, value int16, usage string) {
+	CommandLine.VarP(newInt16Value(value, p), name, "", usage)
+}
+
+// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash.
+func Int16VarP(p *int16, name, shorthand string, value int16, usage string) {
+	CommandLine.VarP(newInt16Value(value, p), name, shorthand, usage)
+}
+
+// Int16 defines an int16 flag with specified name, default value, and usage string.
+// The return value is the address of an int16 variable that stores the value of the flag.
+func (f *FlagSet) Int16(name string, value int16, usage string) *int16 {
+	p := new(int16)
+	f.Int16VarP(p, name, "", value, usage)
+	return p
+}
+
+// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int16P(name, shorthand string, value int16, usage string) *int16 {
+	p := new(int16)
+	f.Int16VarP(p, name, shorthand, value, usage)
+	return p
+}
+
+// Int16 defines an int16 flag with specified name, default value, and usage string.
+// The return value is the address of an int16 variable that stores the value of the flag.
+func Int16(name string, value int16, usage string) *int16 {
+	return CommandLine.Int16P(name, "", value, usage)
+}
+
+// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash.
+func Int16P(name, shorthand string, value int16, usage string) *int16 {
+	return CommandLine.Int16P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/string_array.go b/vendor/github.com/spf13/pflag/string_array.go
index 276b7ed49edf67a9a9d26716a2316cfde5f06c8a..fa7bc60187a793af7b9aabc709c2787e36bb8c90 100644
--- a/vendor/github.com/spf13/pflag/string_array.go
+++ b/vendor/github.com/spf13/pflag/string_array.go
@@ -52,7 +52,7 @@ func (f *FlagSet) GetStringArray(name string) ([]string, error) {
 
 // StringArrayVar defines a string flag with specified name, default value, and usage string.
 // The argument p points to a []string variable in which to store the values of the multiple flags.
-// The value of each argument will not try to be separated by comma
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
 func (f *FlagSet) StringArrayVar(p *[]string, name string, value []string, usage string) {
 	f.VarP(newStringArrayValue(value, p), name, "", usage)
 }
@@ -64,7 +64,7 @@ func (f *FlagSet) StringArrayVarP(p *[]string, name, shorthand string, value []s
 
 // StringArrayVar defines a string flag with specified name, default value, and usage string.
 // The argument p points to a []string variable in which to store the value of the flag.
-// The value of each argument will not try to be separated by comma
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
 func StringArrayVar(p *[]string, name string, value []string, usage string) {
 	CommandLine.VarP(newStringArrayValue(value, p), name, "", usage)
 }
@@ -76,7 +76,7 @@ func StringArrayVarP(p *[]string, name, shorthand string, value []string, usage
 
 // StringArray defines a string flag with specified name, default value, and usage string.
 // The return value is the address of a []string variable that stores the value of the flag.
-// The value of each argument will not try to be separated by comma
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
 func (f *FlagSet) StringArray(name string, value []string, usage string) *[]string {
 	p := []string{}
 	f.StringArrayVarP(&p, name, "", value, usage)
@@ -92,7 +92,7 @@ func (f *FlagSet) StringArrayP(name, shorthand string, value []string, usage str
 
 // StringArray defines a string flag with specified name, default value, and usage string.
 // The return value is the address of a []string variable that stores the value of the flag.
-// The value of each argument will not try to be separated by comma
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
 func StringArray(name string, value []string, usage string) *[]string {
 	return CommandLine.StringArrayP(name, "", value, usage)
 }
diff --git a/vendor/github.com/spf13/pflag/string_slice.go b/vendor/github.com/spf13/pflag/string_slice.go
index 05eee75438d18e1772f96edcce90ad9b18460da0..0cd3ccc083e28dc1a53874e8ade0759e1ef58425 100644
--- a/vendor/github.com/spf13/pflag/string_slice.go
+++ b/vendor/github.com/spf13/pflag/string_slice.go
@@ -82,6 +82,11 @@ func (f *FlagSet) GetStringSlice(name string) ([]string, error) {
 
 // StringSliceVar defines a string flag with specified name, default value, and usage string.
 // The argument p points to a []string variable in which to store the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+//   --ss="v1,v2" -ss="v3"
+// will result in
+//   []string{"v1", "v2", "v3"}
 func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) {
 	f.VarP(newStringSliceValue(value, p), name, "", usage)
 }
@@ -93,6 +98,11 @@ func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []s
 
 // StringSliceVar defines a string flag with specified name, default value, and usage string.
 // The argument p points to a []string variable in which to store the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+//   --ss="v1,v2" -ss="v3"
+// will result in
+//   []string{"v1", "v2", "v3"}
 func StringSliceVar(p *[]string, name string, value []string, usage string) {
 	CommandLine.VarP(newStringSliceValue(value, p), name, "", usage)
 }
@@ -104,6 +114,11 @@ func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage
 
 // StringSlice defines a string flag with specified name, default value, and usage string.
 // The return value is the address of a []string variable that stores the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+//   --ss="v1,v2" -ss="v3"
+// will result in
+//   []string{"v1", "v2", "v3"}
 func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string {
 	p := []string{}
 	f.StringSliceVarP(&p, name, "", value, usage)
@@ -119,6 +134,11 @@ func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage str
 
 // StringSlice defines a string flag with specified name, default value, and usage string.
 // The return value is the address of a []string variable that stores the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+//   --ss="v1,v2" -ss="v3"
+// will result in
+//   []string{"v1", "v2", "v3"}
 func StringSlice(name string, value []string, usage string) *[]string {
 	return CommandLine.StringSliceP(name, "", value, usage)
 }
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go
index 3655418ad3630584278170ad23fce3dd5b0ca895..e7ac0654187dab1f40d81818ac2a9245dfb2ed8b 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/db.go
@@ -35,6 +35,7 @@ type DB struct {
 	// Stats. Need 64-bit alignment.
 	cWriteDelay            int64 // The cumulative duration of write delays
 	cWriteDelayN           int32 // The cumulative number of write delays
+	inWritePaused          int32 // The indicator whether write operation is paused by compaction
 	aliveSnaps, aliveIters int32
 
 	// Session.
@@ -967,7 +968,8 @@ func (db *DB) GetProperty(name string) (value string, err error) {
 			float64(db.s.stor.writes())/1048576.0)
 	case p == "writedelay":
 		writeDelayN, writeDelay := atomic.LoadInt32(&db.cWriteDelayN), time.Duration(atomic.LoadInt64(&db.cWriteDelay))
-		value = fmt.Sprintf("DelayN:%d Delay:%s", writeDelayN, writeDelay)
+		paused := atomic.LoadInt32(&db.inWritePaused) == 1
+		value = fmt.Sprintf("DelayN:%d Delay:%s Paused:%t", writeDelayN, writeDelay, paused)
 	case p == "sstables":
 		for level, tables := range v.levels {
 			value += fmt.Sprintf("--- level %d ---\n", level)
@@ -996,6 +998,75 @@ func (db *DB) GetProperty(name string) (value string, err error) {
 	return
 }
 
+// DBStats is database statistics.
+type DBStats struct {
+	WriteDelayCount    int32
+	WriteDelayDuration time.Duration
+	WritePaused        bool
+
+	AliveSnapshots int32
+	AliveIterators int32
+
+	IOWrite uint64
+	IORead  uint64
+
+	BlockCacheSize    int
+	OpenedTablesCount int
+
+	LevelSizes        []int64
+	LevelTablesCounts []int
+	LevelRead         []int64
+	LevelWrite        []int64
+	LevelDurations    []time.Duration
+}
+
+// Stats populates s with database statistics.
+func (db *DB) Stats(s *DBStats) error {
+	err := db.ok()
+	if err != nil {
+		return err
+	}
+
+	s.IORead = db.s.stor.reads()
+	s.IOWrite = db.s.stor.writes()
+	s.WriteDelayCount = atomic.LoadInt32(&db.cWriteDelayN)
+	s.WriteDelayDuration = time.Duration(atomic.LoadInt64(&db.cWriteDelay))
+	s.WritePaused = atomic.LoadInt32(&db.inWritePaused) == 1
+
+	s.OpenedTablesCount = db.s.tops.cache.Size()
+	if db.s.tops.bcache != nil {
+		s.BlockCacheSize = db.s.tops.bcache.Size()
+	} else {
+		s.BlockCacheSize = 0
+	}
+
+	s.AliveIterators = atomic.LoadInt32(&db.aliveIters)
+	s.AliveSnapshots = atomic.LoadInt32(&db.aliveSnaps)
+
+	s.LevelDurations = s.LevelDurations[:0]
+	s.LevelRead = s.LevelRead[:0]
+	s.LevelWrite = s.LevelWrite[:0]
+	s.LevelSizes = s.LevelSizes[:0]
+	s.LevelTablesCounts = s.LevelTablesCounts[:0]
+
+	v := db.s.version()
+	defer v.release()
+
+	for level, tables := range v.levels {
+		duration, read, write := db.compStats.getStat(level)
+		if len(tables) == 0 && duration == 0 {
+			continue
+		}
+		s.LevelDurations = append(s.LevelDurations, duration)
+		s.LevelRead = append(s.LevelRead, read)
+		s.LevelWrite = append(s.LevelWrite, write)
+		s.LevelSizes = append(s.LevelSizes, tables.size())
+		s.LevelTablesCounts = append(s.LevelTablesCounts, len(tables))
+	}
+
+	return nil
+}
+
 // SizeOf calculates approximate sizes of the given key ranges.
 // The length of the returned sizes are equal with the length of the given
 // ranges. The returned sizes measure storage space usage, so if the user
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
index 31f4bc5efcb536acd44294118b7424986bc0c5f2..db0c1bece1dbd4e97cd65e6cf9433eb98e762950 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go
@@ -89,7 +89,11 @@ func (db *DB) flush(n int) (mdb *memDB, mdbFree int, err error) {
 			return false
 		case tLen >= pauseTrigger:
 			delayed = true
+			// Set the write paused flag explicitly.
+			atomic.StoreInt32(&db.inWritePaused, 1)
 			err = db.compTriggerWait(db.tcompCmdC)
+			// Unset the write paused flag.
+			atomic.StoreInt32(&db.inWritePaused, 0)
 			if err != nil {
 				return false
 			}
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
index 1189decac6127787d50da14702b5de210bd6fd3a..62ef1c6c6763ae7ee719918afe06cdf12519c755 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go
@@ -189,7 +189,8 @@ func (fs *fileStorage) doLog(t time.Time, str string) {
 	// write
 	fs.buf = append(fs.buf, []byte(str)...)
 	fs.buf = append(fs.buf, '\n')
-	fs.logw.Write(fs.buf)
+	n, _ := fs.logw.Write(fs.buf)
+	fs.logSize += int64(n)
 }
 
 func (fs *fileStorage) Log(str string) {
diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util.go b/vendor/github.com/syndtr/goleveldb/leveldb/util.go
index e572a329e948af67843148e0131af6e089e1d27f..0e2b519e5c71eb64f1804d380818b829073c682b 100644
--- a/vendor/github.com/syndtr/goleveldb/leveldb/util.go
+++ b/vendor/github.com/syndtr/goleveldb/leveldb/util.go
@@ -20,7 +20,7 @@ func shorten(str string) string {
 	return str[:3] + ".." + str[len(str)-3:]
 }
 
-var bunits = [...]string{"", "Ki", "Mi", "Gi"}
+var bunits = [...]string{"", "Ki", "Mi", "Gi", "Ti"}
 
 func shortenb(bytes int) string {
 	i := 0
diff --git a/vendor/github.com/tendermint/abci/example/kvstore/helpers.go b/vendor/github.com/tendermint/abci/example/kvstore/helpers.go
index c71e371a9429292b00db5f707460c59d5ba40684..63bc31a634d9483e53997309060c221868380277 100644
--- a/vendor/github.com/tendermint/abci/example/kvstore/helpers.go
+++ b/vendor/github.com/tendermint/abci/example/kvstore/helpers.go
@@ -8,9 +8,12 @@ import (
 // RandVal creates one random validator, with a key derived
 // from the input value
 func RandVal(i int) types.Validator {
-	pubkey := cmn.RandBytes(33)
+	addr := cmn.RandBytes(20)
+	pubkey := cmn.RandBytes(32)
 	power := cmn.RandUint16() + 1
-	return types.Validator{pubkey, int64(power)}
+	v := types.Ed25519Validator(pubkey, int64(power))
+	v.Address = addr
+	return v
 }
 
 // RandVals returns a list of cnt validators for initializing
@@ -30,7 +33,6 @@ func RandVals(cnt int) []types.Validator {
 // don't make any tx that modify the validator state
 func InitKVStore(app *PersistentKVStoreApplication) {
 	app.InitChain(types.RequestInitChain{
-		Validators:    RandVals(1),
-		AppStateBytes: []byte("[]"),
+		Validators: RandVals(1),
 	})
 }
diff --git a/vendor/github.com/tendermint/abci/example/kvstore/persistent_kvstore.go b/vendor/github.com/tendermint/abci/example/kvstore/persistent_kvstore.go
index 888258ff534044d12a22b34838eb3e3e95ffbdd6..02f7ce74a2b14a480b44a7ede1d92622eed1cf29 100644
--- a/vendor/github.com/tendermint/abci/example/kvstore/persistent_kvstore.go
+++ b/vendor/github.com/tendermint/abci/example/kvstore/persistent_kvstore.go
@@ -129,15 +129,16 @@ func (app *PersistentKVStoreApplication) Validators() (validators []types.Valida
 	return
 }
 
-func MakeValSetChangeTx(pubkey []byte, power int64) []byte {
-	return []byte(cmn.Fmt("val:%X/%d", pubkey, power))
+func MakeValSetChangeTx(pubkey types.PubKey, power int64) []byte {
+	return []byte(cmn.Fmt("val:%X/%d", pubkey.Data, power))
 }
 
 func isValidatorTx(tx []byte) bool {
 	return strings.HasPrefix(string(tx), ValidatorSetChangePrefix)
 }
 
-// format is "val:pubkey1/power1,addr2/power2,addr3/power3"tx
+// format is "val:pubkey/power"
+// pubkey is raw 32-byte ed25519 key
 func (app *PersistentKVStoreApplication) execValidatorTx(tx []byte) types.ResponseDeliverTx {
 	tx = tx[len(ValidatorSetChangePrefix):]
 
@@ -150,19 +151,13 @@ func (app *PersistentKVStoreApplication) execValidatorTx(tx []byte) types.Respon
 	}
 	pubkeyS, powerS := pubKeyAndPower[0], pubKeyAndPower[1]
 
-	// decode the pubkey, ensuring its go-crypto encoded
+	// decode the pubkey
 	pubkey, err := hex.DecodeString(pubkeyS)
 	if err != nil {
 		return types.ResponseDeliverTx{
 			Code: code.CodeTypeEncodingError,
 			Log:  fmt.Sprintf("Pubkey (%s) is invalid hex", pubkeyS)}
 	}
-	/*_, err = crypto.PubKeyFromBytes(pubkey)
-	if err != nil {
-		return types.ResponseDeliverTx{
-			Code: code.CodeTypeEncodingError,
-			Log:  fmt.Sprintf("Pubkey (%X) is invalid go-crypto encoded", pubkey)}
-	}*/
 
 	// decode the power
 	power, err := strconv.ParseInt(powerS, 10, 64)
@@ -173,12 +168,12 @@ func (app *PersistentKVStoreApplication) execValidatorTx(tx []byte) types.Respon
 	}
 
 	// update
-	return app.updateValidator(types.Validator{pubkey, power})
+	return app.updateValidator(types.Ed25519Validator(pubkey, int64(power)))
 }
 
 // add, update, or remove a validator
 func (app *PersistentKVStoreApplication) updateValidator(v types.Validator) types.ResponseDeliverTx {
-	key := []byte("val:" + string(v.PubKey))
+	key := []byte("val:" + string(v.PubKey.Data))
 	if v.Power == 0 {
 		// remove validator
 		if !app.app.state.db.Has(key) {
diff --git a/vendor/github.com/tendermint/abci/types/pubkey.go b/vendor/github.com/tendermint/abci/types/pubkey.go
new file mode 100644
index 0000000000000000000000000000000000000000..e5cd5fbf3e47942e51049a1aa2be446194ca56a4
--- /dev/null
+++ b/vendor/github.com/tendermint/abci/types/pubkey.go
@@ -0,0 +1,16 @@
+package types
+
+const (
+	PubKeyEd25519 = "ed25519"
+)
+
+func Ed25519Validator(pubkey []byte, power int64) Validator {
+	return Validator{
+		// Address:
+		PubKey: PubKey{
+			Type: PubKeyEd25519,
+			Data: pubkey,
+		},
+		Power: power,
+	}
+}
diff --git a/vendor/github.com/tendermint/abci/types/types.pb.go b/vendor/github.com/tendermint/abci/types/types.pb.go
index 92cbe7d8109ba857e7d94a272425e2d0ac4e629f..369cfde18685bc088dfc5f0076e977c54eabb531 100644
--- a/vendor/github.com/tendermint/abci/types/types.pb.go
+++ b/vendor/github.com/tendermint/abci/types/types.pb.go
@@ -38,9 +38,9 @@ It has these top-level messages:
 	TxSize
 	BlockGossip
 	Header
-	BlockID
-	PartSetHeader
 	Validator
+	SigningValidator
+	PubKey
 	Evidence
 */
 //nolint: gas
@@ -532,8 +532,11 @@ func (m *RequestSetOption) GetValue() string {
 }
 
 type RequestInitChain struct {
-	Validators    []Validator `protobuf:"bytes,1,rep,name=validators" json:"validators"`
-	AppStateBytes []byte      `protobuf:"bytes,2,opt,name=app_state_bytes,json=appStateBytes,proto3" json:"app_state_bytes,omitempty"`
+	Time            int64            `protobuf:"varint,1,opt,name=time,proto3" json:"time,omitempty"`
+	ChainId         string           `protobuf:"bytes,2,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
+	ConsensusParams *ConsensusParams `protobuf:"bytes,3,opt,name=consensus_params,json=consensusParams" json:"consensus_params,omitempty"`
+	Validators      []Validator      `protobuf:"bytes,4,rep,name=validators" json:"validators"`
+	AppStateBytes   []byte           `protobuf:"bytes,5,opt,name=app_state_bytes,json=appStateBytes,proto3" json:"app_state_bytes,omitempty"`
 }
 
 func (m *RequestInitChain) Reset()                    { *m = RequestInitChain{} }
@@ -541,6 +544,27 @@ func (m *RequestInitChain) String() string            { return proto.CompactText
 func (*RequestInitChain) ProtoMessage()               {}
 func (*RequestInitChain) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{5} }
 
+func (m *RequestInitChain) GetTime() int64 {
+	if m != nil {
+		return m.Time
+	}
+	return 0
+}
+
+func (m *RequestInitChain) GetChainId() string {
+	if m != nil {
+		return m.ChainId
+	}
+	return ""
+}
+
+func (m *RequestInitChain) GetConsensusParams() *ConsensusParams {
+	if m != nil {
+		return m.ConsensusParams
+	}
+	return nil
+}
+
 func (m *RequestInitChain) GetValidators() []Validator {
 	if m != nil {
 		return m.Validators
@@ -596,10 +620,10 @@ func (m *RequestQuery) GetProve() bool {
 }
 
 type RequestBeginBlock struct {
-	Hash                []byte     `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
-	Header              Header     `protobuf:"bytes,2,opt,name=header" json:"header"`
-	AbsentValidators    []int32    `protobuf:"varint,3,rep,packed,name=absent_validators,json=absentValidators" json:"absent_validators,omitempty"`
-	ByzantineValidators []Evidence `protobuf:"bytes,4,rep,name=byzantine_validators,json=byzantineValidators" json:"byzantine_validators"`
+	Hash                []byte             `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
+	Header              Header             `protobuf:"bytes,2,opt,name=header" json:"header"`
+	Validators          []SigningValidator `protobuf:"bytes,3,rep,name=validators" json:"validators"`
+	ByzantineValidators []Evidence         `protobuf:"bytes,4,rep,name=byzantine_validators,json=byzantineValidators" json:"byzantine_validators"`
 }
 
 func (m *RequestBeginBlock) Reset()                    { *m = RequestBeginBlock{} }
@@ -621,9 +645,9 @@ func (m *RequestBeginBlock) GetHeader() Header {
 	return Header{}
 }
 
-func (m *RequestBeginBlock) GetAbsentValidators() []int32 {
+func (m *RequestBeginBlock) GetValidators() []SigningValidator {
 	if m != nil {
-		return m.AbsentValidators
+		return m.Validators
 	}
 	return nil
 }
@@ -1238,6 +1262,8 @@ func (m *ResponseSetOption) GetInfo() string {
 }
 
 type ResponseInitChain struct {
+	ConsensusParams *ConsensusParams `protobuf:"bytes,1,opt,name=consensus_params,json=consensusParams" json:"consensus_params,omitempty"`
+	Validators      []Validator      `protobuf:"bytes,2,rep,name=validators" json:"validators"`
 }
 
 func (m *ResponseInitChain) Reset()                    { *m = ResponseInitChain{} }
@@ -1245,6 +1271,20 @@ func (m *ResponseInitChain) String() string            { return proto.CompactTex
 func (*ResponseInitChain) ProtoMessage()               {}
 func (*ResponseInitChain) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{18} }
 
+func (m *ResponseInitChain) GetConsensusParams() *ConsensusParams {
+	if m != nil {
+		return m.ConsensusParams
+	}
+	return nil
+}
+
+func (m *ResponseInitChain) GetValidators() []Validator {
+	if m != nil {
+		return m.Validators
+	}
+	return nil
+}
+
 type ResponseQuery struct {
 	Code uint32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
 	// bytes data = 2; // use "value" instead.
@@ -1319,6 +1359,7 @@ func (m *ResponseQuery) GetHeight() int64 {
 }
 
 type ResponseBeginBlock struct {
+	Tags []common.KVPair `protobuf:"bytes,1,rep,name=tags" json:"tags,omitempty"`
 }
 
 func (m *ResponseBeginBlock) Reset()                    { *m = ResponseBeginBlock{} }
@@ -1326,6 +1367,13 @@ func (m *ResponseBeginBlock) String() string            { return proto.CompactTe
 func (*ResponseBeginBlock) ProtoMessage()               {}
 func (*ResponseBeginBlock) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{20} }
 
+func (m *ResponseBeginBlock) GetTags() []common.KVPair {
+	if m != nil {
+		return m.Tags
+	}
+	return nil
+}
+
 type ResponseCheckTx struct {
 	Code      uint32          `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
 	Data      []byte          `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
@@ -1473,6 +1521,7 @@ func (m *ResponseDeliverTx) GetFee() common.KI64Pair {
 type ResponseEndBlock struct {
 	ValidatorUpdates      []Validator      `protobuf:"bytes,1,rep,name=validator_updates,json=validatorUpdates" json:"validator_updates"`
 	ConsensusParamUpdates *ConsensusParams `protobuf:"bytes,2,opt,name=consensus_param_updates,json=consensusParamUpdates" json:"consensus_param_updates,omitempty"`
+	Tags                  []common.KVPair  `protobuf:"bytes,3,rep,name=tags" json:"tags,omitempty"`
 }
 
 func (m *ResponseEndBlock) Reset()                    { *m = ResponseEndBlock{} }
@@ -1494,6 +1543,13 @@ func (m *ResponseEndBlock) GetConsensusParamUpdates() *ConsensusParams {
 	return nil
 }
 
+func (m *ResponseEndBlock) GetTags() []common.KVPair {
+	if m != nil {
+		return m.Tags
+	}
+	return nil
+}
+
 type ResponseCommit struct {
 	// reserve 1
 	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
@@ -1622,16 +1678,20 @@ func (m *BlockGossip) GetBlockPartSizeBytes() int32 {
 	return 0
 }
 
+// just the minimum the app might need
 type Header struct {
-	ChainID        string  `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
-	Height         int64   `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"`
-	Time           int64   `protobuf:"varint,3,opt,name=time,proto3" json:"time,omitempty"`
-	NumTxs         int32   `protobuf:"varint,4,opt,name=num_txs,json=numTxs,proto3" json:"num_txs,omitempty"`
-	LastBlockID    BlockID `protobuf:"bytes,5,opt,name=last_block_id,json=lastBlockId" json:"last_block_id"`
-	LastCommitHash []byte  `protobuf:"bytes,6,opt,name=last_commit_hash,json=lastCommitHash,proto3" json:"last_commit_hash,omitempty"`
-	DataHash       []byte  `protobuf:"bytes,7,opt,name=data_hash,json=dataHash,proto3" json:"data_hash,omitempty"`
-	ValidatorsHash []byte  `protobuf:"bytes,8,opt,name=validators_hash,json=validatorsHash,proto3" json:"validators_hash,omitempty"`
-	AppHash        []byte  `protobuf:"bytes,9,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"`
+	// basics
+	ChainID string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"`
+	Height  int64  `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"`
+	Time    int64  `protobuf:"varint,3,opt,name=time,proto3" json:"time,omitempty"`
+	// txs
+	NumTxs   int32 `protobuf:"varint,4,opt,name=num_txs,json=numTxs,proto3" json:"num_txs,omitempty"`
+	TotalTxs int64 `protobuf:"varint,5,opt,name=total_txs,json=totalTxs,proto3" json:"total_txs,omitempty"`
+	// hashes
+	LastBlockHash []byte `protobuf:"bytes,6,opt,name=last_block_hash,json=lastBlockHash,proto3" json:"last_block_hash,omitempty"`
+	AppHash       []byte `protobuf:"bytes,7,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"`
+	// consensus
+	Proposer Validator `protobuf:"bytes,8,opt,name=proposer" json:"proposer"`
 }
 
 func (m *Header) Reset()                    { *m = Header{} }
@@ -1667,116 +1727,122 @@ func (m *Header) GetNumTxs() int32 {
 	return 0
 }
 
-func (m *Header) GetLastBlockID() BlockID {
+func (m *Header) GetTotalTxs() int64 {
 	if m != nil {
-		return m.LastBlockID
+		return m.TotalTxs
 	}
-	return BlockID{}
+	return 0
 }
 
-func (m *Header) GetLastCommitHash() []byte {
+func (m *Header) GetLastBlockHash() []byte {
 	if m != nil {
-		return m.LastCommitHash
+		return m.LastBlockHash
 	}
 	return nil
 }
 
-func (m *Header) GetDataHash() []byte {
+func (m *Header) GetAppHash() []byte {
 	if m != nil {
-		return m.DataHash
+		return m.AppHash
 	}
 	return nil
 }
 
-func (m *Header) GetValidatorsHash() []byte {
+func (m *Header) GetProposer() Validator {
 	if m != nil {
-		return m.ValidatorsHash
+		return m.Proposer
 	}
-	return nil
+	return Validator{}
 }
 
-func (m *Header) GetAppHash() []byte {
+// Validator
+type Validator struct {
+	Address []byte `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
+	PubKey  PubKey `protobuf:"bytes,2,opt,name=pub_key,json=pubKey" json:"pub_key"`
+	Power   int64  `protobuf:"varint,3,opt,name=power,proto3" json:"power,omitempty"`
+}
+
+func (m *Validator) Reset()                    { *m = Validator{} }
+func (m *Validator) String() string            { return proto.CompactTextString(m) }
+func (*Validator) ProtoMessage()               {}
+func (*Validator) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{30} }
+
+func (m *Validator) GetAddress() []byte {
 	if m != nil {
-		return m.AppHash
+		return m.Address
 	}
 	return nil
 }
 
-type BlockID struct {
-	Hash  []byte        `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
-	Parts PartSetHeader `protobuf:"bytes,2,opt,name=parts" json:"parts"`
-}
-
-func (m *BlockID) Reset()                    { *m = BlockID{} }
-func (m *BlockID) String() string            { return proto.CompactTextString(m) }
-func (*BlockID) ProtoMessage()               {}
-func (*BlockID) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{30} }
-
-func (m *BlockID) GetHash() []byte {
+func (m *Validator) GetPubKey() PubKey {
 	if m != nil {
-		return m.Hash
+		return m.PubKey
 	}
-	return nil
+	return PubKey{}
 }
 
-func (m *BlockID) GetParts() PartSetHeader {
+func (m *Validator) GetPower() int64 {
 	if m != nil {
-		return m.Parts
+		return m.Power
 	}
-	return PartSetHeader{}
+	return 0
 }
 
-type PartSetHeader struct {
-	Total int32  `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"`
-	Hash  []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"`
+// Validator with an extra bool
+type SigningValidator struct {
+	Validator       Validator `protobuf:"bytes,1,opt,name=validator" json:"validator"`
+	SignedLastBlock bool      `protobuf:"varint,2,opt,name=signed_last_block,json=signedLastBlock,proto3" json:"signed_last_block,omitempty"`
 }
 
-func (m *PartSetHeader) Reset()                    { *m = PartSetHeader{} }
-func (m *PartSetHeader) String() string            { return proto.CompactTextString(m) }
-func (*PartSetHeader) ProtoMessage()               {}
-func (*PartSetHeader) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{31} }
+func (m *SigningValidator) Reset()                    { *m = SigningValidator{} }
+func (m *SigningValidator) String() string            { return proto.CompactTextString(m) }
+func (*SigningValidator) ProtoMessage()               {}
+func (*SigningValidator) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{31} }
 
-func (m *PartSetHeader) GetTotal() int32 {
+func (m *SigningValidator) GetValidator() Validator {
 	if m != nil {
-		return m.Total
+		return m.Validator
 	}
-	return 0
+	return Validator{}
 }
 
-func (m *PartSetHeader) GetHash() []byte {
+func (m *SigningValidator) GetSignedLastBlock() bool {
 	if m != nil {
-		return m.Hash
+		return m.SignedLastBlock
 	}
-	return nil
+	return false
 }
 
-type Validator struct {
-	PubKey []byte `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"`
-	Power  int64  `protobuf:"varint,2,opt,name=power,proto3" json:"power,omitempty"`
+type PubKey struct {
+	Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
+	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
 }
 
-func (m *Validator) Reset()                    { *m = Validator{} }
-func (m *Validator) String() string            { return proto.CompactTextString(m) }
-func (*Validator) ProtoMessage()               {}
-func (*Validator) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{32} }
+func (m *PubKey) Reset()                    { *m = PubKey{} }
+func (m *PubKey) String() string            { return proto.CompactTextString(m) }
+func (*PubKey) ProtoMessage()               {}
+func (*PubKey) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{32} }
 
-func (m *Validator) GetPubKey() []byte {
+func (m *PubKey) GetType() string {
 	if m != nil {
-		return m.PubKey
+		return m.Type
 	}
-	return nil
+	return ""
 }
 
-func (m *Validator) GetPower() int64 {
+func (m *PubKey) GetData() []byte {
 	if m != nil {
-		return m.Power
+		return m.Data
 	}
-	return 0
+	return nil
 }
 
 type Evidence struct {
-	PubKey []byte `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"`
-	Height int64  `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"`
+	Type             string    `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
+	Validator        Validator `protobuf:"bytes,2,opt,name=validator" json:"validator"`
+	Height           int64     `protobuf:"varint,3,opt,name=height,proto3" json:"height,omitempty"`
+	Time             int64     `protobuf:"varint,4,opt,name=time,proto3" json:"time,omitempty"`
+	TotalVotingPower int64     `protobuf:"varint,5,opt,name=total_voting_power,json=totalVotingPower,proto3" json:"total_voting_power,omitempty"`
 }
 
 func (m *Evidence) Reset()                    { *m = Evidence{} }
@@ -1784,11 +1850,18 @@ func (m *Evidence) String() string            { return proto.CompactTextString(m
 func (*Evidence) ProtoMessage()               {}
 func (*Evidence) Descriptor() ([]byte, []int) { return fileDescriptorTypes, []int{33} }
 
-func (m *Evidence) GetPubKey() []byte {
+func (m *Evidence) GetType() string {
 	if m != nil {
-		return m.PubKey
+		return m.Type
 	}
-	return nil
+	return ""
+}
+
+func (m *Evidence) GetValidator() Validator {
+	if m != nil {
+		return m.Validator
+	}
+	return Validator{}
 }
 
 func (m *Evidence) GetHeight() int64 {
@@ -1798,6 +1871,20 @@ func (m *Evidence) GetHeight() int64 {
 	return 0
 }
 
+func (m *Evidence) GetTime() int64 {
+	if m != nil {
+		return m.Time
+	}
+	return 0
+}
+
+func (m *Evidence) GetTotalVotingPower() int64 {
+	if m != nil {
+		return m.TotalVotingPower
+	}
+	return 0
+}
+
 func init() {
 	proto.RegisterType((*Request)(nil), "types.Request")
 	proto.RegisterType((*RequestEcho)(nil), "types.RequestEcho")
@@ -1829,9 +1916,9 @@ func init() {
 	proto.RegisterType((*TxSize)(nil), "types.TxSize")
 	proto.RegisterType((*BlockGossip)(nil), "types.BlockGossip")
 	proto.RegisterType((*Header)(nil), "types.Header")
-	proto.RegisterType((*BlockID)(nil), "types.BlockID")
-	proto.RegisterType((*PartSetHeader)(nil), "types.PartSetHeader")
 	proto.RegisterType((*Validator)(nil), "types.Validator")
+	proto.RegisterType((*SigningValidator)(nil), "types.SigningValidator")
+	proto.RegisterType((*PubKey)(nil), "types.PubKey")
 	proto.RegisterType((*Evidence)(nil), "types.Evidence")
 }
 
@@ -2240,115 +2327,120 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{
 func init() { proto.RegisterFile("types/types.proto", fileDescriptorTypes) }
 
 var fileDescriptorTypes = []byte{
-	// 1757 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0xcd, 0x6e, 0x1b, 0xc9,
-	0x11, 0x16, 0xff, 0x39, 0x45, 0x89, 0x94, 0x5a, 0xb2, 0x4d, 0x73, 0x11, 0x58, 0x18, 0x04, 0x5e,
-	0x3a, 0xf6, 0x8a, 0x89, 0x36, 0x36, 0x6c, 0x6f, 0xb0, 0x88, 0x29, 0x39, 0x26, 0xb1, 0x49, 0xd6,
-	0x19, 0x7b, 0x1d, 0x20, 0x17, 0xa2, 0xc9, 0x69, 0x91, 0x03, 0x73, 0x7e, 0x76, 0xba, 0xa9, 0xa5,
-	0x7c, 0xcb, 0x7d, 0xef, 0x39, 0xe7, 0x94, 0x27, 0xc8, 0x2b, 0x04, 0x09, 0xf2, 0x0e, 0x3a, 0xec,
-	0x31, 0x2f, 0x91, 0xa0, 0xba, 0x7b, 0x7e, 0x35, 0xb3, 0x58, 0xe4, 0xba, 0x17, 0xb2, 0xab, 0xeb,
-	0xab, 0xee, 0xae, 0xee, 0xea, 0xaf, 0x6a, 0x1a, 0x0e, 0xc4, 0x55, 0xc0, 0xf8, 0x48, 0xfe, 0x9e,
-	0x04, 0xa1, 0x2f, 0x7c, 0xd2, 0x90, 0xc2, 0xe0, 0x93, 0xa5, 0x23, 0x56, 0x9b, 0xf9, 0xc9, 0xc2,
-	0x77, 0x47, 0x4b, 0x7f, 0xe9, 0x8f, 0xa4, 0x76, 0xbe, 0xb9, 0x90, 0x92, 0x14, 0x64, 0x4b, 0x59,
-	0x0d, 0x46, 0x29, 0xb8, 0x60, 0x9e, 0xcd, 0x42, 0xd7, 0xf1, 0xc4, 0x48, 0xb8, 0x6b, 0x67, 0xce,
-	0x47, 0x0b, 0xdf, 0x75, 0x7d, 0x2f, 0x3d, 0x8d, 0xf9, 0x8f, 0x3a, 0xb4, 0x2c, 0xf6, 0xf5, 0x86,
-	0x71, 0x41, 0x86, 0x50, 0x67, 0x8b, 0x95, 0xdf, 0xaf, 0x1e, 0x57, 0x86, 0x9d, 0x53, 0x72, 0xa2,
-	0x70, 0x5a, 0xfb, 0x72, 0xb1, 0xf2, 0x27, 0x3b, 0x96, 0x44, 0x90, 0x87, 0xd0, 0xb8, 0x58, 0x6f,
-	0xf8, 0xaa, 0x5f, 0x93, 0xd0, 0xc3, 0x2c, 0xf4, 0x37, 0xa8, 0x9a, 0xec, 0x58, 0x0a, 0x83, 0xc3,
-	0x3a, 0xde, 0x85, 0xdf, 0xaf, 0x17, 0x0d, 0x3b, 0xf5, 0x2e, 0xe4, 0xb0, 0x88, 0x20, 0x4f, 0x01,
-	0x38, 0x13, 0x33, 0x3f, 0x10, 0x8e, 0xef, 0xf5, 0x1b, 0x12, 0x7f, 0x27, 0x8b, 0x7f, 0xc3, 0xc4,
-	0x97, 0x52, 0x3d, 0xd9, 0xb1, 0x0c, 0x1e, 0x09, 0x68, 0xe9, 0x78, 0x8e, 0x98, 0x2d, 0x56, 0xd4,
-	0xf1, 0xfa, 0xcd, 0x22, 0xcb, 0xa9, 0xe7, 0x88, 0x33, 0x54, 0xa3, 0xa5, 0x13, 0x09, 0xe8, 0xca,
-	0xd7, 0x1b, 0x16, 0x5e, 0xf5, 0x5b, 0x45, 0xae, 0xfc, 0x01, 0x55, 0xe8, 0x8a, 0xc4, 0x90, 0xcf,
-	0xa0, 0x33, 0x67, 0x4b, 0xc7, 0x9b, 0xcd, 0xd7, 0xfe, 0xe2, 0x7d, 0xbf, 0x2d, 0x4d, 0xfa, 0x59,
-	0x93, 0x31, 0x02, 0xc6, 0xa8, 0x9f, 0xec, 0x58, 0x30, 0x8f, 0x25, 0x72, 0x0a, 0xed, 0xc5, 0x8a,
-	0x2d, 0xde, 0xcf, 0xc4, 0xb6, 0x6f, 0x48, 0xcb, 0x5b, 0x59, 0xcb, 0x33, 0xd4, 0xbe, 0xdd, 0x4e,
-	0x76, 0xac, 0xd6, 0x42, 0x35, 0xd1, 0x2f, 0x9b, 0xad, 0x9d, 0x4b, 0x16, 0xa2, 0xd5, 0x61, 0x91,
-	0x5f, 0xe7, 0x4a, 0x2f, 0xed, 0x0c, 0x3b, 0x12, 0xc8, 0x63, 0x30, 0x98, 0x67, 0xeb, 0x85, 0x76,
-	0xa4, 0xe1, 0xed, 0xdc, 0x89, 0x7a, 0x76, 0xb4, 0xcc, 0x36, 0xd3, 0x6d, 0x72, 0x02, 0x4d, 0x8c,
-	0x12, 0x47, 0xf4, 0x77, 0xa5, 0xcd, 0x51, 0x6e, 0x89, 0x52, 0x37, 0xd9, 0xb1, 0x34, 0x6a, 0xdc,
-	0x82, 0xc6, 0x25, 0x5d, 0x6f, 0x98, 0xf9, 0x31, 0x74, 0x52, 0x91, 0x42, 0xfa, 0xd0, 0x72, 0x19,
-	0xe7, 0x74, 0xc9, 0xfa, 0x95, 0xe3, 0xca, 0xd0, 0xb0, 0x22, 0xd1, 0xec, 0xc2, 0x6e, 0x3a, 0x4e,
-	0x52, 0x86, 0x18, 0x0b, 0x68, 0x78, 0xc9, 0x42, 0x8e, 0x01, 0xa0, 0x0d, 0xb5, 0x68, 0x3e, 0x87,
-	0xfd, 0x7c, 0x10, 0x90, 0x7d, 0xa8, 0xbd, 0x67, 0x57, 0x1a, 0x89, 0x4d, 0x72, 0xa4, 0x17, 0x24,
-	0xa3, 0xd8, 0xb0, 0xf4, 0xea, 0xc2, 0xd8, 0x36, 0x0e, 0x03, 0xf2, 0x04, 0xe0, 0x92, 0xae, 0x1d,
-	0x9b, 0x0a, 0x3f, 0xe4, 0xfd, 0xca, 0x71, 0x6d, 0xd8, 0x39, 0xdd, 0xd7, 0xee, 0xbe, 0x8b, 0x14,
-	0xe3, 0xfa, 0x3f, 0xaf, 0xef, 0xed, 0x58, 0x29, 0x24, 0xb9, 0x0f, 0x3d, 0x1a, 0x04, 0x33, 0x2e,
-	0xa8, 0x60, 0xb3, 0xf9, 0x95, 0x60, 0x5c, 0xce, 0xb5, 0x6b, 0xed, 0xd1, 0x20, 0x78, 0x83, 0xbd,
-	0x63, 0xec, 0x34, 0xed, 0xd8, 0x51, 0x19, 0x45, 0x84, 0x40, 0xdd, 0xa6, 0x82, 0xca, 0xc5, 0xee,
-	0x5a, 0xb2, 0x8d, 0x7d, 0x01, 0x15, 0x2b, 0xbd, 0x58, 0xd9, 0x26, 0xb7, 0xa1, 0xb9, 0x62, 0xce,
-	0x72, 0x25, 0xe4, 0xed, 0xaa, 0x59, 0x5a, 0x42, 0xcf, 0x82, 0xd0, 0xbf, 0x64, 0xf2, 0x22, 0xb5,
-	0x2d, 0x25, 0x98, 0xff, 0xae, 0xc0, 0xc1, 0x8d, 0xc8, 0xc3, 0x71, 0x57, 0x94, 0xaf, 0xa2, 0xb9,
-	0xb0, 0x4d, 0x1e, 0xe2, 0xb8, 0xd4, 0x66, 0xa1, 0xbe, 0xe0, 0x7b, 0xda, 0xd7, 0x89, 0xec, 0xd4,
-	0x8e, 0x6a, 0x08, 0x79, 0x08, 0x07, 0x74, 0xce, 0x99, 0x27, 0x66, 0xa9, 0x3d, 0xaa, 0x1d, 0xd7,
-	0x86, 0x0d, 0x6b, 0x5f, 0x29, 0xde, 0x25, 0x3b, 0x32, 0x81, 0xa3, 0xf9, 0xd5, 0x07, 0xea, 0x09,
-	0xc7, 0x63, 0x69, 0x7c, 0x5d, 0xee, 0x69, 0x4f, 0xcf, 0xf3, 0xf2, 0xd2, 0xb1, 0x99, 0xb7, 0x60,
-	0x7a, 0xa6, 0xc3, 0xd8, 0x24, 0x19, 0xc9, 0x3c, 0x86, 0x6e, 0xf6, 0x32, 0x90, 0x2e, 0x54, 0xc5,
-	0x56, 0xfb, 0x51, 0x15, 0x5b, 0xd3, 0x8c, 0x4f, 0x32, 0x0e, 0xfc, 0x1b, 0x98, 0x07, 0xd0, 0xcb,
-	0xc5, 0x78, 0x6a, 0x53, 0x2b, 0xe9, 0x4d, 0x35, 0x7b, 0xb0, 0x97, 0x09, 0x6d, 0xf3, 0xdb, 0x06,
-	0xb4, 0x2d, 0xc6, 0x03, 0xdf, 0xe3, 0x8c, 0x3c, 0x05, 0x83, 0x6d, 0x17, 0x4c, 0xf1, 0x51, 0x25,
-	0x77, 0xdb, 0x15, 0xe6, 0x65, 0xa4, 0xc7, 0xeb, 0x17, 0x83, 0xc9, 0x83, 0x0c, 0x97, 0x1e, 0xe6,
-	0x8d, 0xd2, 0x64, 0xfa, 0x28, 0x4b, 0xa6, 0x47, 0x39, 0x6c, 0x8e, 0x4d, 0x1f, 0x64, 0xd8, 0x34,
-	0x3f, 0x70, 0x86, 0x4e, 0x9f, 0x15, 0xd0, 0x69, 0x7e, 0xf9, 0x25, 0x7c, 0xfa, 0xac, 0x80, 0x4f,
-	0xfb, 0x37, 0xe6, 0x2a, 0x24, 0xd4, 0x47, 0x59, 0x42, 0xcd, 0xbb, 0x93, 0x63, 0xd4, 0x5f, 0x15,
-	0x31, 0xea, 0xdd, 0x9c, 0x4d, 0x29, 0xa5, 0x7e, 0x7a, 0x83, 0x52, 0x6f, 0xe7, 0x4c, 0x0b, 0x38,
-	0xf5, 0x59, 0x86, 0x53, 0xa1, 0xd0, 0xb7, 0x12, 0x52, 0x7d, 0x72, 0x93, 0x54, 0xef, 0xe4, 0x8f,
-	0xb6, 0x88, 0x55, 0x47, 0x39, 0x56, 0xbd, 0x95, 0x5f, 0x65, 0x29, 0xad, 0x3e, 0xc0, 0xdb, 0x9d,
-	0x8b, 0x34, 0x64, 0x02, 0x16, 0x86, 0x7e, 0xa8, 0x79, 0x4f, 0x09, 0xe6, 0x10, 0xf9, 0x26, 0x89,
-	0xaf, 0xef, 0xa1, 0x60, 0x19, 0xf4, 0xa9, 0xe8, 0x32, 0xff, 0x52, 0x49, 0x6c, 0x25, 0x0b, 0xa7,
-	0xb9, 0xca, 0xd0, 0x5c, 0x95, 0x62, 0xe6, 0x6a, 0x86, 0x99, 0xc9, 0xcf, 0xe0, 0x60, 0x4d, 0xb9,
-	0x50, 0xfb, 0x32, 0xcb, 0x90, 0x57, 0x0f, 0x15, 0x6a, 0x43, 0x14, 0x8b, 0x7d, 0x02, 0x87, 0x29,
-	0x2c, 0x12, 0xa9, 0x24, 0xaa, 0xba, 0xbc, 0xbc, 0xfb, 0x31, 0xfa, 0x45, 0x10, 0x4c, 0x28, 0x5f,
-	0x99, 0xbf, 0x4b, 0xfc, 0x4f, 0x58, 0x9f, 0x40, 0x7d, 0xe1, 0xdb, 0xca, 0xad, 0x3d, 0x4b, 0xb6,
-	0x31, 0x13, 0xac, 0xfd, 0xa5, 0x9c, 0xd5, 0xb0, 0xb0, 0x89, 0xa8, 0xf8, 0xa6, 0x18, 0xea, 0x4a,
-	0x98, 0x87, 0xc9, 0x70, 0x71, 0xf8, 0x9a, 0x7f, 0xaf, 0x24, 0xfb, 0x11, 0x53, 0xf5, 0xff, 0x37,
-	0x01, 0x1e, 0x8d, 0xe3, 0xd9, 0x6c, 0x2b, 0xaf, 0x5b, 0xcd, 0x52, 0x42, 0x94, 0xa6, 0x9a, 0xd2,
-	0xc9, 0x6c, 0x9a, 0x6a, 0xc9, 0x3e, 0x25, 0x68, 0x8a, 0xf7, 0x2f, 0xe4, 0x3d, 0xd8, 0xb5, 0x94,
-	0x90, 0xe2, 0x2e, 0x23, 0xc3, 0x5d, 0x47, 0x40, 0x6e, 0xde, 0x10, 0xf3, 0xbf, 0x15, 0x64, 0xbf,
-	0x4c, 0xf4, 0x17, 0xfa, 0x13, 0x1d, 0x71, 0x35, 0x95, 0x8e, 0x7e, 0x98, 0x8f, 0x3f, 0x01, 0x58,
-	0x52, 0x3e, 0xfb, 0x86, 0x7a, 0x82, 0xd9, 0xda, 0x51, 0x63, 0x49, 0xf9, 0x1f, 0x65, 0x07, 0xb9,
-	0x0b, 0x6d, 0x54, 0x6f, 0x38, 0xb3, 0xa5, 0xc7, 0x35, 0xab, 0xb5, 0xa4, 0xfc, 0x2b, 0xce, 0x6c,
-	0xf2, 0x1c, 0xea, 0x82, 0x2e, 0x79, 0xbf, 0x25, 0x13, 0x43, 0xf7, 0x44, 0x15, 0xa4, 0x27, 0x5f,
-	0xbc, 0x7b, 0x4d, 0x9d, 0x70, 0x7c, 0x1b, 0xf3, 0xc2, 0x7f, 0xae, 0xef, 0x75, 0x11, 0xf3, 0xc8,
-	0x77, 0x1d, 0xc1, 0xdc, 0x40, 0x5c, 0x59, 0xd2, 0x86, 0x0c, 0xa1, 0x76, 0xc1, 0x98, 0x66, 0x88,
-	0xfd, 0xd8, 0x74, 0xfa, 0xe4, 0x97, 0xd2, 0x58, 0x25, 0x15, 0x84, 0x98, 0x7f, 0xae, 0x26, 0xa7,
-	0x9c, 0x24, 0x89, 0x1f, 0xd7, 0x1e, 0xfc, 0xad, 0x82, 0x79, 0x32, 0x4b, 0x49, 0xe4, 0x0c, 0x0e,
-	0xe2, 0xec, 0x3c, 0xdb, 0x04, 0x36, 0xc5, 0xda, 0xe5, 0xfb, 0x0b, 0x9f, 0xfd, 0xd8, 0xe0, 0x2b,
-	0x85, 0x27, 0xbf, 0x87, 0x3b, 0x0b, 0x1c, 0xd5, 0xe3, 0x1b, 0x3e, 0x0b, 0x68, 0x48, 0xdd, 0x78,
-	0xa8, 0x6a, 0x86, 0x82, 0xcf, 0x22, 0xd4, 0x6b, 0x04, 0x71, 0xeb, 0xd6, 0x22, 0xd3, 0xa1, 0xc7,
-	0x33, 0x7f, 0x8a, 0x29, 0x3f, 0x4d, 0x83, 0x45, 0xa7, 0x62, 0xfe, 0xb5, 0x02, 0xbd, 0xdc, 0x80,
-	0x64, 0x04, 0xa0, 0x58, 0x84, 0x3b, 0x1f, 0x98, 0x4e, 0xcf, 0x91, 0x1f, 0xd2, 0xe1, 0x37, 0xce,
-	0x07, 0x66, 0x19, 0xf3, 0xa8, 0x49, 0xee, 0x43, 0x4b, 0x6c, 0x15, 0x3a, 0x5b, 0x02, 0xbd, 0xdd,
-	0x4a, 0x68, 0x53, 0xc8, 0x7f, 0xf2, 0x18, 0x76, 0xd5, 0xc0, 0x4b, 0x9f, 0x73, 0x27, 0xd0, 0x89,
-	0x99, 0xa4, 0x87, 0x7e, 0x25, 0x35, 0x56, 0x67, 0x9e, 0x08, 0xe6, 0x9f, 0xc0, 0x88, 0xa7, 0x25,
-	0x1f, 0x81, 0xe1, 0xd2, 0xad, 0xae, 0x0f, 0x71, 0x6d, 0x0d, 0xab, 0xed, 0xd2, 0xad, 0x2c, 0x0d,
-	0xc9, 0x1d, 0x68, 0xa1, 0x52, 0x6c, 0xd5, 0x9e, 0x35, 0xac, 0xa6, 0x4b, 0xb7, 0x6f, 0xb7, 0xb1,
-	0x62, 0x49, 0x79, 0x54, 0xfc, 0xb9, 0x74, 0xfb, 0x8a, 0x72, 0xf3, 0x73, 0x68, 0xaa, 0x45, 0xfe,
-	0xa0, 0x81, 0xd1, 0xbe, 0x9a, 0xb1, 0xff, 0x35, 0x74, 0x52, 0xeb, 0x26, 0xbf, 0x80, 0x5b, 0xca,
-	0xc3, 0x80, 0x86, 0x42, 0xee, 0x48, 0x66, 0x40, 0x22, 0x95, 0xaf, 0x69, 0x28, 0x70, 0x4a, 0x55,
-	0xce, 0xfe, 0xab, 0x0a, 0x4d, 0x55, 0x2a, 0x92, 0xfb, 0x98, 0x76, 0xa9, 0xe3, 0xcd, 0x1c, 0x5b,
-	0x65, 0x88, 0x71, 0xe7, 0xbb, 0xeb, 0x7b, 0x2d, 0xc9, 0xa6, 0xd3, 0x73, 0xcc, 0xb4, 0xd8, 0xb0,
-	0x53, 0xc4, 0x55, 0xcd, 0x54, 0xb2, 0x04, 0xea, 0xc2, 0x71, 0x99, 0x76, 0x51, 0xb6, 0x71, 0xe5,
-	0xde, 0xc6, 0x95, 0x5b, 0x52, 0x57, 0x5b, 0xe2, 0x6d, 0x5c, 0xdc, 0x92, 0x57, 0xb0, 0x97, 0x4a,
-	0x18, 0x8e, 0xad, 0x0b, 0x99, 0x6e, 0xfa, 0x34, 0xa6, 0xe7, 0xe3, 0x43, 0x0c, 0xd7, 0xef, 0xae,
-	0xef, 0x75, 0x7e, 0x1b, 0xa5, 0x90, 0xe9, 0xb9, 0xd5, 0x89, 0xf3, 0xc9, 0xd4, 0x26, 0x43, 0x90,
-	0xe9, 0x65, 0xa6, 0x52, 0xac, 0x4a, 0x3b, 0x8a, 0x91, 0xbb, 0xd8, 0xaf, 0x73, 0x30, 0x56, 0xca,
-	0x1f, 0x81, 0x81, 0x41, 0xa7, 0x20, 0x8a, 0xa0, 0xdb, 0xd8, 0x21, 0x95, 0x1f, 0x43, 0x2f, 0x29,
-	0x71, 0x15, 0x44, 0xb1, 0x75, 0x37, 0xe9, 0x96, 0xc0, 0xbb, 0xd0, 0x8e, 0xd3, 0x9b, 0x21, 0x11,
-	0x2d, 0xaa, 0xb3, 0xda, 0x97, 0xd0, 0xd2, 0x4b, 0x2c, 0xac, 0xd4, 0x7f, 0x0e, 0x0d, 0x3c, 0x97,
-	0xe8, 0x42, 0x45, 0x25, 0x94, 0x3c, 0x0f, 0x26, 0x32, 0xf5, 0xba, 0x02, 0x9a, 0xcf, 0x60, 0x2f,
-	0xa3, 0xc5, 0x4c, 0x22, 0x7c, 0x41, 0xd7, 0xfa, 0x40, 0x95, 0x10, 0x4f, 0x56, 0x4d, 0x26, 0x33,
-	0x9f, 0x83, 0x11, 0x5f, 0x7a, 0x3c, 0x85, 0x60, 0x33, 0x9f, 0x45, 0xdf, 0x54, 0xbb, 0x56, 0x33,
-	0xd8, 0xcc, 0xbf, 0x50, 0xf9, 0x2a, 0xf0, 0xbf, 0xd1, 0xdf, 0x0e, 0x35, 0x4b, 0x09, 0xe6, 0x67,
-	0xd0, 0x8e, 0xaa, 0xfa, 0x72, 0xd3, 0x92, 0x28, 0x38, 0xfd, 0xb6, 0x01, 0xbd, 0x17, 0xe3, 0xb3,
-	0xe9, 0x8b, 0x20, 0x58, 0x3b, 0x0b, 0x2a, 0x33, 0xfb, 0x08, 0xea, 0xb2, 0x76, 0x29, 0x78, 0x7c,
-	0x18, 0x14, 0x15, 0xd1, 0xe4, 0x14, 0x1a, 0xb2, 0x84, 0x21, 0x45, 0x6f, 0x10, 0x83, 0xc2, 0x5a,
-	0x1a, 0x27, 0x51, 0x45, 0xce, 0xcd, 0xa7, 0x88, 0x41, 0x51, 0x41, 0x4d, 0x3e, 0x07, 0x23, 0x29,
-	0x3e, 0xca, 0x1e, 0x24, 0x06, 0xa5, 0xa5, 0x35, 0xda, 0x27, 0x79, 0xa8, 0xec, 0xf3, 0x7d, 0x50,
-	0x5a, 0x83, 0x92, 0xa7, 0xd0, 0x8a, 0x32, 0x79, 0xf1, 0x93, 0xc1, 0xa0, 0xa4, 0xec, 0xc5, 0xed,
-	0x51, 0x15, 0x4d, 0xd1, 0xbb, 0xc6, 0xa0, 0xb0, 0x36, 0x27, 0x8f, 0xa1, 0xa9, 0x89, 0xb8, 0xf0,
-	0xe3, 0x7f, 0x50, 0x5c, 0xbc, 0xa2, 0x93, 0xc9, 0xb7, 0x75, 0xd9, 0xdb, 0xcb, 0xa0, 0xf4, 0x23,
-	0x82, 0xbc, 0x00, 0x48, 0x7d, 0xc0, 0x96, 0x3e, 0xaa, 0x0c, 0xca, 0x3f, 0x0e, 0x08, 0x86, 0x63,
-	0xfc, 0xc1, 0x57, 0xfc, 0xd8, 0x31, 0x28, 0xab, 0xd7, 0xe7, 0x4d, 0xf9, 0x20, 0xf6, 0xe9, 0xff,
-	0x02, 0x00, 0x00, 0xff, 0xff, 0x46, 0xbe, 0x48, 0x9c, 0x8c, 0x13, 0x00, 0x00,
+	// 1832 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4b, 0x6f, 0x1b, 0xc9,
+	0x11, 0x16, 0xdf, 0x9c, 0xd2, 0x83, 0x74, 0xcb, 0xb6, 0x68, 0x2e, 0x02, 0x1b, 0x83, 0xc0, 0x91,
+	0xb3, 0x5a, 0x31, 0xd1, 0xae, 0x0d, 0x7b, 0x37, 0x59, 0x44, 0xd2, 0x3a, 0x4b, 0x61, 0xf3, 0x50,
+	0xc6, 0x5e, 0x07, 0xc8, 0x85, 0x68, 0x72, 0x5a, 0xc3, 0x81, 0x39, 0x8f, 0x9d, 0x6e, 0x6a, 0x29,
+	0xdf, 0x72, 0x0c, 0xb0, 0xc8, 0x35, 0xe7, 0xfc, 0x81, 0xdc, 0xf2, 0x17, 0x82, 0xfc, 0x89, 0xf8,
+	0x90, 0xe4, 0x94, 0x3f, 0x91, 0xa0, 0xaa, 0xe7, 0xad, 0xa1, 0xa1, 0x6c, 0x8e, 0xb9, 0x48, 0x5d,
+	0x5d, 0x55, 0x3d, 0x5d, 0xc5, 0xaa, 0xaf, 0xaa, 0x1a, 0x6e, 0xa9, 0xab, 0x50, 0xc8, 0x11, 0xfd,
+	0x3d, 0x0c, 0xa3, 0x40, 0x05, 0xac, 0x45, 0xc4, 0xf0, 0x03, 0xc7, 0x55, 0xf3, 0xe5, 0xf4, 0x70,
+	0x16, 0x78, 0x23, 0x27, 0x70, 0x82, 0x11, 0x71, 0xa7, 0xcb, 0x0b, 0xa2, 0x88, 0xa0, 0x95, 0xd6,
+	0x1a, 0x8e, 0x72, 0xe2, 0x4a, 0xf8, 0xb6, 0x88, 0x3c, 0xd7, 0x57, 0x23, 0xe5, 0x2d, 0xdc, 0xa9,
+	0x1c, 0xcd, 0x02, 0xcf, 0x0b, 0xfc, 0xfc, 0x67, 0xcc, 0xbf, 0x34, 0xa1, 0x63, 0x89, 0xaf, 0x96,
+	0x42, 0x2a, 0xb6, 0x0f, 0x4d, 0x31, 0x9b, 0x07, 0x83, 0xfa, 0x83, 0xda, 0xfe, 0xe6, 0x11, 0x3b,
+	0xd4, 0x72, 0x31, 0xf7, 0xf9, 0x6c, 0x1e, 0x8c, 0x37, 0x2c, 0x92, 0x60, 0xef, 0x43, 0xeb, 0x62,
+	0xb1, 0x94, 0xf3, 0x41, 0x83, 0x44, 0x77, 0x8b, 0xa2, 0x3f, 0x45, 0xd6, 0x78, 0xc3, 0xd2, 0x32,
+	0x78, 0xac, 0xeb, 0x5f, 0x04, 0x83, 0x66, 0xd5, 0xb1, 0x67, 0xfe, 0x05, 0x1d, 0x8b, 0x12, 0xec,
+	0x29, 0x80, 0x14, 0x6a, 0x12, 0x84, 0xca, 0x0d, 0xfc, 0x41, 0x8b, 0xe4, 0xf7, 0x8a, 0xf2, 0x2f,
+	0x84, 0xfa, 0x25, 0xb1, 0xc7, 0x1b, 0x96, 0x21, 0x13, 0x02, 0x35, 0x5d, 0xdf, 0x55, 0x93, 0xd9,
+	0x9c, 0xbb, 0xfe, 0xa0, 0x5d, 0xa5, 0x79, 0xe6, 0xbb, 0xea, 0x14, 0xd9, 0xa8, 0xe9, 0x26, 0x04,
+	0x9a, 0xf2, 0xd5, 0x52, 0x44, 0x57, 0x83, 0x4e, 0x95, 0x29, 0xbf, 0x42, 0x16, 0x9a, 0x42, 0x32,
+	0xec, 0x13, 0xd8, 0x9c, 0x0a, 0xc7, 0xf5, 0x27, 0xd3, 0x45, 0x30, 0x7b, 0x3d, 0xe8, 0x92, 0xca,
+	0xa0, 0xa8, 0x72, 0x82, 0x02, 0x27, 0xc8, 0x1f, 0x6f, 0x58, 0x30, 0x4d, 0x29, 0x76, 0x04, 0xdd,
+	0xd9, 0x5c, 0xcc, 0x5e, 0x4f, 0xd4, 0x6a, 0x60, 0x90, 0xe6, 0x9d, 0xa2, 0xe6, 0x29, 0x72, 0x5f,
+	0xae, 0xc6, 0x1b, 0x56, 0x67, 0xa6, 0x97, 0x68, 0x97, 0x2d, 0x16, 0xee, 0xa5, 0x88, 0x50, 0x6b,
+	0xb7, 0xca, 0xae, 0xcf, 0x34, 0x9f, 0xf4, 0x0c, 0x3b, 0x21, 0xd8, 0x63, 0x30, 0x84, 0x6f, 0xc7,
+	0x17, 0xdd, 0x24, 0xc5, 0xbb, 0xa5, 0x5f, 0xd4, 0xb7, 0x93, 0x6b, 0x76, 0x45, 0xbc, 0x66, 0x87,
+	0xd0, 0xc6, 0x28, 0x71, 0xd5, 0x60, 0x8b, 0x74, 0x6e, 0x97, 0xae, 0x48, 0xbc, 0xf1, 0x86, 0x15,
+	0x4b, 0x9d, 0x74, 0xa0, 0x75, 0xc9, 0x17, 0x4b, 0x61, 0x7e, 0x0f, 0x36, 0x73, 0x91, 0xc2, 0x06,
+	0xd0, 0xf1, 0x84, 0x94, 0xdc, 0x11, 0x83, 0xda, 0x83, 0xda, 0xbe, 0x61, 0x25, 0xa4, 0xb9, 0x03,
+	0x5b, 0xf9, 0x38, 0xc9, 0x29, 0x62, 0x2c, 0xa0, 0xe2, 0xa5, 0x88, 0x24, 0x06, 0x40, 0xac, 0x18,
+	0x93, 0xe6, 0xc7, 0xd0, 0x2f, 0x07, 0x01, 0xeb, 0x43, 0xe3, 0xb5, 0xb8, 0x8a, 0x25, 0x71, 0xc9,
+	0x6e, 0xc7, 0x17, 0xa2, 0x28, 0x36, 0xac, 0xf8, 0x76, 0xff, 0xac, 0xa5, 0xca, 0x69, 0x1c, 0x30,
+	0x06, 0x4d, 0xe5, 0x7a, 0xfa, 0x82, 0x0d, 0x8b, 0xd6, 0xec, 0x1e, 0xfe, 0x48, 0xdc, 0xf5, 0x27,
+	0xae, 0x1d, 0x9f, 0xd0, 0x21, 0xfa, 0xcc, 0x66, 0xc7, 0xd0, 0x9f, 0x05, 0xbe, 0x14, 0xbe, 0x5c,
+	0xca, 0x49, 0xc8, 0x23, 0xee, 0xc9, 0x38, 0xfe, 0x13, 0xc7, 0x9e, 0x26, 0xec, 0x73, 0xe2, 0x5a,
+	0xbd, 0x59, 0x71, 0x83, 0x3d, 0x01, 0xb8, 0xe4, 0x0b, 0xd7, 0xe6, 0x2a, 0x88, 0xe4, 0xa0, 0xf9,
+	0xa0, 0xb1, 0xbf, 0x79, 0xd4, 0x8f, 0x95, 0x5f, 0x25, 0x8c, 0x93, 0xe6, 0x5f, 0xdf, 0xde, 0xdf,
+	0xb0, 0x72, 0x92, 0xec, 0x21, 0xf4, 0x78, 0x18, 0x4e, 0xa4, 0xe2, 0x4a, 0x4c, 0xa6, 0x57, 0x4a,
+	0x48, 0xca, 0x8e, 0x2d, 0x6b, 0x9b, 0x87, 0xe1, 0x0b, 0xdc, 0x3d, 0xc1, 0x4d, 0xd3, 0x4e, 0x7d,
+	0x4b, 0x81, 0x8b, 0x16, 0xda, 0x5c, 0x71, 0xb2, 0x70, 0xcb, 0xa2, 0x35, 0xee, 0x85, 0x5c, 0xcd,
+	0x63, 0xeb, 0x68, 0xcd, 0xee, 0x42, 0x7b, 0x2e, 0x5c, 0x67, 0xae, 0xc8, 0xa0, 0x86, 0x15, 0x53,
+	0xe8, 0xcc, 0x30, 0x0a, 0x2e, 0x05, 0xe5, 0x6e, 0xd7, 0xd2, 0x84, 0xf9, 0xb7, 0x1a, 0xdc, 0xba,
+	0x16, 0xec, 0x78, 0xee, 0x9c, 0xcb, 0x79, 0xf2, 0x2d, 0x5c, 0xb3, 0xf7, 0xf1, 0x5c, 0x6e, 0x8b,
+	0x28, 0xc6, 0x94, 0xed, 0xd8, 0xd6, 0x31, 0x6d, 0xc6, 0x86, 0xc6, 0x22, 0xec, 0xc7, 0x05, 0xe7,
+	0x34, 0xc8, 0x39, 0x49, 0xac, 0xbf, 0x70, 0x1d, 0xdf, 0xf5, 0x9d, 0x77, 0xf9, 0x68, 0x0c, 0xb7,
+	0xa7, 0x57, 0x6f, 0xb8, 0xaf, 0x5c, 0x5f, 0x4c, 0xae, 0x79, 0xb9, 0x17, 0x1f, 0xf4, 0xfc, 0xd2,
+	0xb5, 0x85, 0x3f, 0x13, 0xf1, 0x01, 0xbb, 0xa9, 0x4a, 0x7a, 0xb4, 0x34, 0x1f, 0xc0, 0x4e, 0x31,
+	0x23, 0xd9, 0x0e, 0xd4, 0xd5, 0x2a, 0xb6, 0xac, 0xae, 0x56, 0xa6, 0x99, 0x46, 0x53, 0x9a, 0x7d,
+	0xd7, 0x64, 0x1e, 0x41, 0xaf, 0x94, 0x68, 0x39, 0x37, 0xd7, 0xf2, 0x6e, 0x36, 0x7b, 0xb0, 0x5d,
+	0xc8, 0x2f, 0xf3, 0x9b, 0x16, 0x74, 0x2d, 0x21, 0x43, 0x0c, 0x1f, 0xf6, 0x14, 0x0c, 0xb1, 0x9a,
+	0x09, 0x0d, 0x8a, 0xb5, 0x12, 0xe4, 0x68, 0x99, 0xe7, 0x09, 0x1f, 0x31, 0x20, 0x15, 0x66, 0x8f,
+	0x0a, 0x80, 0xbe, 0x5b, 0x56, 0xca, 0x23, 0xfa, 0x41, 0x11, 0xd1, 0x6f, 0x97, 0x64, 0x4b, 0x90,
+	0xfe, 0xa8, 0x00, 0xe9, 0xe5, 0x83, 0x0b, 0x98, 0xfe, 0xac, 0x02, 0xd3, 0xcb, 0xd7, 0x5f, 0x03,
+	0xea, 0xcf, 0x2a, 0x40, 0x7d, 0x70, 0xed, 0x5b, 0x95, 0xa8, 0x7e, 0x50, 0x44, 0xf5, 0xb2, 0x39,
+	0x25, 0x58, 0xff, 0x51, 0x15, 0xac, 0xdf, 0x2b, 0xe9, 0xac, 0xc5, 0xf5, 0x0f, 0xaf, 0xe1, 0xfa,
+	0xdd, 0x92, 0x6a, 0x05, 0xb0, 0x3f, 0x2b, 0x00, 0x3b, 0x54, 0xda, 0xb6, 0x06, 0xd9, 0x9f, 0x5c,
+	0x47, 0xf6, 0xbd, 0xf2, 0x4f, 0x5b, 0x05, 0xed, 0xa3, 0x12, 0xb4, 0xdf, 0x29, 0xdf, 0x72, 0x2d,
+	0xb6, 0x3f, 0xc2, 0x7c, 0x2f, 0x45, 0x1a, 0x62, 0x83, 0x88, 0xa2, 0x20, 0x8a, 0xc1, 0x57, 0x13,
+	0xe6, 0x3e, 0x22, 0x50, 0x16, 0x5f, 0xef, 0xa8, 0x03, 0x14, 0xf4, 0xb9, 0xe8, 0x32, 0xff, 0x50,
+	0xcb, 0x74, 0xa9, 0x14, 0xe4, 0xd1, 0xcb, 0x88, 0xd1, 0x2b, 0x57, 0x1e, 0xea, 0x85, 0xf2, 0xc0,
+	0xbe, 0x0f, 0xb7, 0x16, 0x5c, 0x2a, 0xed, 0x97, 0x49, 0x01, 0xce, 0x7a, 0xc8, 0xd0, 0x0e, 0xd1,
+	0xb8, 0xf6, 0x01, 0xec, 0xe6, 0x64, 0x11, 0x5a, 0x09, 0xba, 0x9a, 0x94, 0xbc, 0xfd, 0x54, 0xfa,
+	0x38, 0x0c, 0xc7, 0x5c, 0xce, 0xcd, 0x9f, 0x67, 0xf6, 0x67, 0xa5, 0x87, 0x41, 0x73, 0x16, 0xd8,
+	0xda, 0xac, 0x6d, 0x8b, 0xd6, 0x58, 0x8e, 0x16, 0x81, 0x43, 0x5f, 0x35, 0x2c, 0x5c, 0xa2, 0x54,
+	0x9a, 0x29, 0x86, 0x4e, 0x09, 0xf3, 0xf7, 0xb5, 0xec, 0xbc, 0xac, 0x1a, 0x55, 0x95, 0x97, 0xda,
+	0xff, 0x52, 0x5e, 0xea, 0x37, 0x2d, 0x2f, 0xe6, 0x9f, 0x6b, 0xd9, 0x6f, 0x91, 0x16, 0x8e, 0x6f,
+	0x67, 0x1c, 0x86, 0x85, 0xeb, 0xdb, 0x62, 0x45, 0xa9, 0xde, 0xb0, 0x34, 0x91, 0xd4, 0xe9, 0x36,
+	0x39, 0xb8, 0x58, 0xa7, 0x3b, 0xb4, 0xa7, 0x89, 0xb8, 0xe0, 0x04, 0x17, 0x94, 0x83, 0x5b, 0x96,
+	0x26, 0x72, 0xb8, 0x69, 0x14, 0x70, 0xf3, 0x1c, 0xd8, 0xf5, 0xec, 0x64, 0x1f, 0x43, 0x53, 0x71,
+	0x07, 0x9d, 0x87, 0xf6, 0xef, 0x1c, 0xea, 0xae, 0xf7, 0xf0, 0x8b, 0x57, 0xe7, 0xdc, 0x8d, 0x4e,
+	0xee, 0xa2, 0xf5, 0xff, 0x7a, 0x7b, 0x7f, 0x07, 0x65, 0x0e, 0x02, 0xcf, 0x55, 0xc2, 0x0b, 0xd5,
+	0x95, 0x45, 0x3a, 0xe6, 0xbf, 0x6b, 0x88, 0xda, 0x85, 0xac, 0xad, 0xf4, 0x45, 0x12, 0x9a, 0xf5,
+	0x5c, 0x61, 0xbd, 0x99, 0x7f, 0xbe, 0x03, 0xe0, 0x70, 0x39, 0xf9, 0x9a, 0xfb, 0x4a, 0xd8, 0xb1,
+	0x93, 0x0c, 0x87, 0xcb, 0x5f, 0xd3, 0x06, 0xf6, 0x1f, 0xc8, 0x5e, 0x4a, 0x61, 0x93, 0xb7, 0x1a,
+	0x56, 0xc7, 0xe1, 0xf2, 0x4b, 0x29, 0xec, 0xd4, 0xae, 0xce, 0x7f, 0x6f, 0x17, 0xdb, 0x87, 0xc6,
+	0x85, 0x10, 0x31, 0xb2, 0xf5, 0x53, 0xd5, 0xb3, 0x27, 0x1f, 0x91, 0xb2, 0x0e, 0x09, 0x14, 0x31,
+	0x7f, 0x5b, 0xcf, 0x82, 0x33, 0x2b, 0x6e, 0xff, 0x5f, 0x3e, 0xf8, 0x07, 0x75, 0x8b, 0x45, 0x28,
+	0x65, 0xa7, 0x70, 0x2b, 0x4d, 0x99, 0xc9, 0x32, 0xb4, 0x39, 0x76, 0x61, 0xb5, 0x77, 0xe6, 0x58,
+	0x3f, 0x55, 0xf8, 0x52, 0xcb, 0xb3, 0x5f, 0xc0, 0x5e, 0x29, 0xc9, 0xd3, 0xa3, 0xea, 0xef, 0xcc,
+	0xf5, 0x3b, 0xc5, 0x5c, 0x4f, 0xce, 0x4b, 0xfc, 0xd1, 0xf8, 0x16, 0xb1, 0xfe, 0x5d, 0x6c, 0x73,
+	0xf2, 0xd0, 0x5f, 0xf5, 0x8b, 0x9a, 0x7f, 0xac, 0x41, 0xaf, 0x74, 0x19, 0x36, 0x02, 0xd0, 0xc8,
+	0x29, 0xdd, 0x37, 0x22, 0x06, 0xa9, 0xc4, 0x07, 0xe4, 0xac, 0x17, 0xee, 0x1b, 0x61, 0x19, 0xd3,
+	0x64, 0xc9, 0x1e, 0x42, 0x47, 0xad, 0xb4, 0x74, 0xb1, 0x11, 0x7c, 0xb9, 0x22, 0xd1, 0xb6, 0xa2,
+	0xff, 0xec, 0x31, 0x6c, 0xe9, 0x83, 0x9d, 0x40, 0x4a, 0x37, 0x8c, 0x9b, 0x11, 0x96, 0x3f, 0xfa,
+	0x73, 0xe2, 0x58, 0x9b, 0xd3, 0x8c, 0x30, 0x7f, 0x03, 0x46, 0xfa, 0x59, 0xf6, 0x1e, 0x18, 0x1e,
+	0x5f, 0xc5, 0x5d, 0x32, 0xde, 0xad, 0x65, 0x75, 0x3d, 0xbe, 0xa2, 0x06, 0x99, 0xed, 0x41, 0x07,
+	0x99, 0x6a, 0xa5, 0xfd, 0xdd, 0xb2, 0xda, 0x1e, 0x5f, 0xbd, 0x5c, 0xa5, 0x0c, 0x87, 0xcb, 0xa4,
+	0x05, 0xf6, 0xf8, 0xea, 0x73, 0x2e, 0xcd, 0x4f, 0xa1, 0xad, 0x2f, 0x79, 0xa3, 0x83, 0x51, 0xbf,
+	0x5e, 0xd0, 0xff, 0x09, 0x6c, 0xe6, 0xee, 0xcd, 0x7e, 0x08, 0x77, 0xb4, 0x85, 0x21, 0x8f, 0x14,
+	0x79, 0xa4, 0x70, 0x20, 0x23, 0xe6, 0x39, 0x8f, 0x14, 0x7e, 0x52, 0x37, 0xf5, 0xbf, 0xab, 0x43,
+	0x5b, 0x37, 0xcc, 0xec, 0x61, 0x6e, 0x3a, 0xa1, 0xaa, 0x78, 0xb2, 0xf9, 0xf7, 0xb7, 0xf7, 0x3b,
+	0x54, 0x40, 0xce, 0x3e, 0xcb, 0x46, 0x95, 0x0c, 0x30, 0xeb, 0x85, 0x7e, 0x3e, 0x99, 0x78, 0x1a,
+	0xb9, 0x89, 0x67, 0x0f, 0x3a, 0xfe, 0xd2, 0x23, 0x97, 0x34, 0xb5, 0x4b, 0xfc, 0xa5, 0x87, 0x2e,
+	0x79, 0x0f, 0x0c, 0x15, 0x28, 0xbe, 0x20, 0x96, 0x4e, 0xd2, 0x2e, 0x6d, 0x20, 0xf3, 0x21, 0xf4,
+	0xf2, 0xd5, 0x16, 0xab, 0xa7, 0x06, 0xf7, 0xed, 0xac, 0xd6, 0xe2, 0x04, 0x70, 0x0f, 0xba, 0x69,
+	0x79, 0xd5, 0x48, 0xdf, 0xe1, 0xba, 0xaa, 0xe2, 0x3c, 0x1c, 0x46, 0x41, 0x18, 0x48, 0x11, 0xa5,
+	0x49, 0x59, 0x9d, 0x47, 0xa9, 0x9c, 0xe9, 0x82, 0x91, 0x32, 0xb1, 0x17, 0xe0, 0xb6, 0x1d, 0x09,
+	0x29, 0xe3, 0xb6, 0x3b, 0x21, 0xd9, 0x01, 0x74, 0xc2, 0xe5, 0x74, 0x82, 0x25, 0xa7, 0x18, 0x6f,
+	0xe7, 0xcb, 0xe9, 0x17, 0xe2, 0x2a, 0x19, 0x3c, 0x42, 0xa2, 0xa8, 0xe8, 0x04, 0x5f, 0x8b, 0x28,
+	0x76, 0x8b, 0x26, 0x4c, 0x05, 0xfd, 0xf2, 0xd4, 0xc1, 0x3e, 0x02, 0x23, 0x4d, 0xe9, 0x52, 0xdc,
+	0x97, 0xef, 0x9c, 0x09, 0x62, 0x67, 0x22, 0x5d, 0xc7, 0x17, 0xf6, 0x24, 0x73, 0x19, 0xdd, 0xab,
+	0x6b, 0xf5, 0x34, 0xe3, 0x67, 0x89, 0xcf, 0xcc, 0x1f, 0x40, 0x5b, 0xdf, 0x91, 0x7e, 0xab, 0xab,
+	0x30, 0x69, 0x9b, 0x68, 0x5d, 0x99, 0xa0, 0x7f, 0xaa, 0x41, 0x37, 0x99, 0x6a, 0x2a, 0x95, 0x0a,
+	0x97, 0xae, 0xdf, 0xf4, 0xd2, 0xeb, 0x46, 0xc2, 0x24, 0x84, 0x9a, 0xb9, 0x10, 0x3a, 0x00, 0xa6,
+	0x23, 0xe5, 0x32, 0x50, 0xae, 0xef, 0x4c, 0xb4, 0x37, 0x75, 0xc8, 0xf4, 0x89, 0xf3, 0x8a, 0x18,
+	0xe7, 0xb8, 0x7f, 0xf4, 0x4d, 0x0b, 0x7a, 0xc7, 0x27, 0xa7, 0x67, 0xc7, 0x61, 0xb8, 0x70, 0x67,
+	0x9c, 0x9a, 0xa9, 0x11, 0x34, 0xa9, 0x5d, 0xac, 0x78, 0x74, 0x1a, 0x56, 0xcd, 0x2d, 0xec, 0x08,
+	0x5a, 0xd4, 0x35, 0xb2, 0xaa, 0xb7, 0xa7, 0x61, 0xe5, 0xf8, 0x82, 0x1f, 0xd1, 0x7d, 0xe5, 0xf5,
+	0x27, 0xa8, 0x61, 0xd5, 0x0c, 0xc3, 0x3e, 0x05, 0x23, 0xeb, 0xf7, 0xd6, 0x3d, 0x44, 0x0d, 0xd7,
+	0x4e, 0x33, 0xa8, 0x9f, 0x95, 0xd0, 0x75, 0xcf, 0x36, 0xc3, 0xb5, 0x6d, 0x3f, 0x7b, 0x0a, 0x9d,
+	0xa4, 0x09, 0xa9, 0x7e, 0x2a, 0x1a, 0xae, 0x99, 0x34, 0xd0, 0x3d, 0xba, 0x91, 0xab, 0x7a, 0xcf,
+	0x1a, 0x56, 0x8e, 0x43, 0xec, 0x31, 0xb4, 0xe3, 0x3a, 0x50, 0xf9, 0xe8, 0x33, 0xac, 0x9e, 0x17,
+	0xd0, 0xc8, 0xac, 0x89, 0x5d, 0xf7, 0xe6, 0x36, 0x5c, 0x3b, 0xb7, 0xb1, 0x63, 0x80, 0x5c, 0xf3,
+	0xb6, 0xf6, 0x31, 0x6d, 0xb8, 0x7e, 0x1e, 0x63, 0x9f, 0x40, 0x37, 0x9b, 0xb1, 0xab, 0x1f, 0xb9,
+	0x86, 0xeb, 0x46, 0xa4, 0x69, 0x9b, 0x1e, 0x42, 0x3f, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x76, 0x56, 0x8a, 0x69, 0x84, 0x15, 0x00, 0x00,
 }
diff --git a/vendor/github.com/tendermint/abci/types/util.go b/vendor/github.com/tendermint/abci/types/util.go
index 39a24e02ecbeff3f28627226bda803e1cf2cbbd1..0924ab5ff3465b393202707288d7b101bbd848af 100644
--- a/vendor/github.com/tendermint/abci/types/util.go
+++ b/vendor/github.com/tendermint/abci/types/util.go
@@ -3,6 +3,9 @@ package types
 import (
 	"bytes"
 	"encoding/json"
+	"sort"
+
+	cmn "github.com/tendermint/tmlibs/common"
 )
 
 //------------------------------------------------------------------------------
@@ -10,13 +13,21 @@ import (
 // Validators is a list of validators that implements the Sort interface
 type Validators []Validator
 
+var _ sort.Interface = (Validators)(nil)
+
+// All these methods for Validators:
+//    Len, Less and Swap
+// are for Validators to implement sort.Interface
+// which will be used by the sort package.
+// See Issue https://github.com/tendermint/abci/issues/212
+
 func (v Validators) Len() int {
 	return len(v)
 }
 
 // XXX: doesn't distinguish same validator with different power
 func (v Validators) Less(i, j int) bool {
-	return bytes.Compare(v[i].PubKey, v[j].PubKey) <= 0
+	return bytes.Compare(v[i].PubKey.Data, v[j].PubKey.Data) <= 0
 }
 
 func (v Validators) Swap(i, j int) {
@@ -28,7 +39,11 @@ func (v Validators) Swap(i, j int) {
 func ValidatorsString(vs Validators) string {
 	s := make([]validatorPretty, len(vs))
 	for i, v := range vs {
-		s[i] = validatorPretty(v)
+		s[i] = validatorPretty{
+			Address: v.Address,
+			PubKey:  v.PubKey.Data,
+			Power:   v.Power,
+		}
 	}
 	b, err := json.Marshal(s)
 	if err != nil {
@@ -38,6 +53,7 @@ func ValidatorsString(vs Validators) string {
 }
 
 type validatorPretty struct {
-	PubKey []byte `json:"pub_key"`
-	Power  int64  `json:"power"`
+	Address cmn.HexBytes `json:"address"`
+	PubKey  []byte       `json:"pub_key"`
+	Power   int64        `json:"power"`
 }
diff --git a/vendor/github.com/tendermint/go-amino/LICENSE b/vendor/github.com/tendermint/go-amino/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..d22a28d8c87633dae40ef73692605f4d600d5119
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/LICENSE
@@ -0,0 +1,193 @@
+Tendermint Go-Amino
+Copyright (C) 2015 Tendermint
+
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        https://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       https://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/vendor/github.com/tendermint/go-amino/amino.go b/vendor/github.com/tendermint/go-amino/amino.go
new file mode 100644
index 0000000000000000000000000000000000000000..93831f074effc8d03e698877f2c7d46eceec3112
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/amino.go
@@ -0,0 +1,357 @@
+package amino
+
+import (
+	"bytes"
+	"encoding/binary"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"reflect"
+)
+
+//----------------------------------------
+// Typ3 and Typ4
+
+type Typ3 uint8
+type Typ4 uint8 // Typ3 | 0x08 (pointer bit)
+
+const (
+	// Typ3 types
+	Typ3_Varint     = Typ3(0)
+	Typ3_8Byte      = Typ3(1)
+	Typ3_ByteLength = Typ3(2)
+	Typ3_Struct     = Typ3(3)
+	Typ3_StructTerm = Typ3(4)
+	Typ3_4Byte      = Typ3(5)
+	Typ3_List       = Typ3(6)
+	Typ3_Interface  = Typ3(7)
+
+	// Typ4 bit
+	Typ4_Pointer = Typ4(0x08)
+)
+
+func (typ Typ3) String() string {
+	switch typ {
+	case Typ3_Varint:
+		return "Varint"
+	case Typ3_8Byte:
+		return "8Byte"
+	case Typ3_ByteLength:
+		return "ByteLength"
+	case Typ3_Struct:
+		return "Struct"
+	case Typ3_StructTerm:
+		return "StructTerm"
+	case Typ3_4Byte:
+		return "4Byte"
+	case Typ3_List:
+		return "List"
+	case Typ3_Interface:
+		return "Interface"
+	default:
+		return fmt.Sprintf("<Invalid Typ3 %X>", byte(typ))
+	}
+}
+
+func (typ Typ4) Typ3() Typ3      { return Typ3(typ & 0x07) }
+func (typ Typ4) IsPointer() bool { return (typ & 0x08) > 0 }
+func (typ Typ4) String() string {
+	if typ&0xF0 != 0 {
+		return fmt.Sprintf("<Invalid Typ4 %X>", byte(typ))
+	}
+	if typ&0x08 != 0 {
+		return "*" + Typ3(typ&0x07).String()
+	} else {
+		return Typ3(typ).String()
+	}
+}
+
+//----------------------------------------
+// *Codec methods
+
+// MarshalBinary encodes the object o according to the Amino spec,
+// but prefixed by a uvarint encoding of the object to encode.
+// Use MarshalBinaryBare if you don't want byte-length prefixing.
+//
+// For consistency, MarshalBinary will first dereference pointers
+// before encoding.  MarshalBinary will panic if o is a nil-pointer,
+// or if o is invalid.
+func (cdc *Codec) MarshalBinary(o interface{}) ([]byte, error) {
+
+	// Write the bytes here.
+	var buf = new(bytes.Buffer)
+
+	// Write the bz without length-prefixing.
+	bz, err := cdc.MarshalBinaryBare(o)
+	if err != nil {
+		return nil, err
+	}
+
+	// Write uvarint(len(bz)).
+	err = EncodeUvarint(buf, uint64(len(bz)))
+	if err != nil {
+		return nil, err
+	}
+
+	// Write bz.
+	_, err = buf.Write(bz)
+	if err != nil {
+		return nil, err
+	}
+
+	return buf.Bytes(), nil
+}
+
+// MarshalBinaryWriter writes the bytes as would be returned from
+// MarshalBinary to the writer w.
+func (cdc *Codec) MarshalBinaryWriter(w io.Writer, o interface{}) (n int64, err error) {
+	var bz, _n = []byte(nil), int(0)
+	bz, err = cdc.MarshalBinary(o)
+	if err != nil {
+		return 0, err
+	}
+	_n, err = w.Write(bz) // TODO: handle overflow in 32-bit systems.
+	n = int64(_n)
+	return
+}
+
+// Panics if error.
+func (cdc *Codec) MustMarshalBinary(o interface{}) []byte {
+	bz, err := cdc.MarshalBinary(o)
+	if err != nil {
+		panic(err)
+	}
+	return bz
+}
+
+// MarshalBinaryBare encodes the object o according to the Amino spec.
+// MarshalBinaryBare doesn't prefix the byte-length of the encoding,
+// so the caller must handle framing.
+func (cdc *Codec) MarshalBinaryBare(o interface{}) ([]byte, error) {
+
+	// Dereference value if pointer.
+	var rv, _, isNilPtr = derefPointers(reflect.ValueOf(o))
+	if isNilPtr {
+		// NOTE: You can still do so by calling
+		// `.MarshalBinary(struct{ *SomeType })` or so on.
+		panic("MarshalBinary cannot marshal a nil pointer directly. Try wrapping in a struct?")
+	}
+
+	// Encode Amino:binary bytes.
+	var bz []byte
+	buf := new(bytes.Buffer)
+	rt := rv.Type()
+	info, err := cdc.getTypeInfo_wlock(rt)
+	if err != nil {
+		return nil, err
+	}
+	err = cdc.encodeReflectBinary(buf, info, rv, FieldOptions{})
+	if err != nil {
+		return nil, err
+	}
+	bz = buf.Bytes()
+
+	return bz, nil
+}
+
+// Panics if error.
+func (cdc *Codec) MustMarshalBinaryBare(o interface{}) []byte {
+	bz, err := cdc.MarshalBinaryBare(o)
+	if err != nil {
+		panic(err)
+	}
+	return bz
+}
+
+// Like UnmarshalBinaryBare, but will first decode the byte-length prefix.
+// UnmarshalBinary will panic if ptr is a nil-pointer.
+// Returns an error if not all of bz is consumed.
+func (cdc *Codec) UnmarshalBinary(bz []byte, ptr interface{}) error {
+	if len(bz) == 0 {
+		return errors.New("UnmarshalBinary cannot decode empty bytes")
+	}
+
+	// Read byte-length prefix.
+	u64, n := binary.Uvarint(bz)
+	if n < 0 {
+		return fmt.Errorf("Error reading msg byte-length prefix: got code %v", n)
+	}
+	if u64 > uint64(len(bz)-n) {
+		return fmt.Errorf("Not enough bytes to read in UnmarshalBinary, want %v more bytes but only have %v",
+			u64, len(bz)-n)
+	} else if u64 < uint64(len(bz)-n) {
+		return fmt.Errorf("Bytes left over in UnmarshalBinary, should read %v more bytes but have %v",
+			u64, len(bz)-n)
+	}
+	bz = bz[n:]
+
+	// Decode.
+	return cdc.UnmarshalBinaryBare(bz, ptr)
+}
+
+// Like UnmarshalBinaryBare, but will first read the byte-length prefix.
+// UnmarshalBinaryReader will panic if ptr is a nil-pointer.
+// If maxSize is 0, there is no limit (not recommended).
+func (cdc *Codec) UnmarshalBinaryReader(r io.Reader, ptr interface{}, maxSize int64) (n int64, err error) {
+	if maxSize < 0 {
+		panic("maxSize cannot be negative.")
+	}
+
+	// Read byte-length prefix.
+	var l int64
+	var buf [binary.MaxVarintLen64]byte
+	for i := 0; i < len(buf); i++ {
+		_, err = r.Read(buf[i : i+1])
+		if err != nil {
+			return
+		}
+		n += 1
+		if buf[i]&0x80 == 0 {
+			break
+		}
+		if n >= maxSize {
+			err = fmt.Errorf("Read overflow, maxSize is %v but uvarint(length-prefix) is itself greater than maxSize.", maxSize)
+		}
+	}
+	u64, _ := binary.Uvarint(buf[:])
+	if err != nil {
+		return
+	}
+	if maxSize > 0 {
+		if uint64(maxSize) < u64 {
+			err = fmt.Errorf("Read overflow, maxSize is %v but this amino binary object is %v bytes.", maxSize, u64)
+			return
+		}
+		if (maxSize - n) < int64(u64) {
+			err = fmt.Errorf("Read overflow, maxSize is %v but this length-prefixed amino binary object is %v+%v bytes.", maxSize, n, u64)
+			return
+		}
+	}
+	l = int64(u64)
+	if l < 0 {
+		err = fmt.Errorf("Read overflow, this implementation can't read this because, why would anyone have this much data? Hello from 2018.")
+	}
+
+	// Read that many bytes.
+	var bz = make([]byte, l, l)
+	_, err = io.ReadFull(r, bz)
+	if err != nil {
+		return
+	}
+	n += l
+
+	// Decode.
+	err = cdc.UnmarshalBinaryBare(bz, ptr)
+	return
+}
+
+// Panics if error.
+func (cdc *Codec) MustUnmarshalBinary(bz []byte, ptr interface{}) {
+	err := cdc.UnmarshalBinary(bz, ptr)
+	if err != nil {
+		panic(err)
+	}
+}
+
+// UnmarshalBinaryBare will panic if ptr is a nil-pointer.
+func (cdc *Codec) UnmarshalBinaryBare(bz []byte, ptr interface{}) error {
+	if len(bz) == 0 {
+		return errors.New("UnmarshalBinaryBare cannot decode empty bytes")
+	}
+
+	rv, rt := reflect.ValueOf(ptr), reflect.TypeOf(ptr)
+	if rv.Kind() != reflect.Ptr {
+		panic("Unmarshal expects a pointer")
+	}
+	rv, rt = rv.Elem(), rt.Elem()
+	info, err := cdc.getTypeInfo_wlock(rt)
+	if err != nil {
+		return err
+	}
+	n, err := cdc.decodeReflectBinary(bz, info, rv, FieldOptions{})
+	if err != nil {
+		return err
+	}
+	if n != len(bz) {
+		return fmt.Errorf("Unmarshal didn't read all bytes. Expected to read %v, only read %v", len(bz), n)
+	}
+	return nil
+}
+
+// Panics if error.
+func (cdc *Codec) MustUnmarshalBinaryBare(bz []byte, ptr interface{}) {
+	err := cdc.UnmarshalBinaryBare(bz, ptr)
+	if err != nil {
+		panic(err)
+	}
+}
+
+func (cdc *Codec) MarshalJSON(o interface{}) ([]byte, error) {
+	rv := reflect.ValueOf(o)
+	if rv.Kind() == reflect.Invalid {
+		return []byte("null"), nil
+	}
+	rt := rv.Type()
+
+	// Note that we can't yet skip directly
+	// to checking if a type implements
+	// json.Marshaler because in some cases
+	// var s GenericInterface = t1(v1)
+	// var t GenericInterface = t2(v1)
+	// but we need to be able to encode
+	// both s and t disambiguated, so:
+	//    {"type":<disfix>, "value":<data>}
+	// for the above case.
+
+	w := new(bytes.Buffer)
+	info, err := cdc.getTypeInfo_wlock(rt)
+	if err != nil {
+		return nil, err
+	}
+	if err := cdc.encodeReflectJSON(w, info, rv, FieldOptions{}); err != nil {
+		return nil, err
+	}
+	return w.Bytes(), nil
+}
+
+func (cdc *Codec) UnmarshalJSON(bz []byte, ptr interface{}) error {
+	if len(bz) == 0 {
+		return errors.New("UnmarshalJSON cannot decode empty bytes")
+	}
+
+	rv := reflect.ValueOf(ptr)
+	if rv.Kind() != reflect.Ptr {
+		return errors.New("UnmarshalJSON expects a pointer")
+	}
+
+	// If the type implements json.Unmarshaler, just
+	// automatically respect that and skip to it.
+	// if rv.Type().Implements(jsonUnmarshalerType) {
+	// 	return rv.Interface().(json.Unmarshaler).UnmarshalJSON(bz)
+	// }
+
+	// 1. Dereference until we find the first addressable type.
+	rv = rv.Elem()
+	rt := rv.Type()
+	info, err := cdc.getTypeInfo_wlock(rt)
+	if err != nil {
+		return err
+	}
+	return cdc.decodeReflectJSON(bz, info, rv, FieldOptions{})
+}
+
+// MarshalJSONIndent calls json.Indent on the output of cdc.MarshalJSON
+// using the given prefix and indent string.
+func (cdc *Codec) MarshalJSONIndent(o interface{}, prefix, indent string) ([]byte, error) {
+	bz, err := cdc.MarshalJSON(o)
+	if err != nil {
+		return nil, err
+	}
+	var out bytes.Buffer
+	err = json.Indent(&out, bz, prefix, indent)
+	if err != nil {
+		return nil, err
+	}
+	return out.Bytes(), nil
+}
diff --git a/vendor/github.com/tendermint/go-amino/binary-decode.go b/vendor/github.com/tendermint/go-amino/binary-decode.go
new file mode 100644
index 0000000000000000000000000000000000000000..c1fac922afae9c3d34dd21b23811e3b7815b086c
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/binary-decode.go
@@ -0,0 +1,847 @@
+package amino
+
+import (
+	"errors"
+	"fmt"
+	"reflect"
+	"time"
+
+	"github.com/davecgh/go-spew/spew"
+)
+
+//----------------------------------------
+// cdc.decodeReflectBinary
+
+// This is the main entrypoint for decoding all types from binary form.  This
+// function calls decodeReflectBinary*, and generally those functions should
+// only call this one, for the prefix bytes are consumed here when present.
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectBinary(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if info.Type.Kind() == reflect.Interface && rv.Kind() == reflect.Ptr {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(D) decodeReflectBinary(bz: %X, info: %v, rv: %#v (%v), opts: %v)\n",
+			bz, info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(D) -> n: %v, err: %v\n", n, err)
+		}()
+	}
+
+	// TODO Read the disamb bytes here if necessary.
+	// e.g. rv isn't an interface, and
+	// info.ConcreteType.AlwaysDisambiguate.  But we don't support
+	// this yet.
+
+	// Read prefix+typ3 bytes if registered.
+	if info.Registered {
+		if len(bz) < PrefixBytesLen {
+			err = errors.New("EOF skipping prefix bytes.")
+			return
+		}
+		// Check prefix bytes.
+		prefix3 := NewPrefixBytes(bz[:PrefixBytesLen])
+		var prefix, typ = prefix3.SplitTyp3()
+		if info.Prefix != prefix {
+			panic("should not happen")
+		}
+		// Check that typ3 in prefix bytes is correct.
+		err = checkTyp3(info.Type, typ, opts)
+		if err != nil {
+			return
+		}
+		// Consume prefix.  Yum.
+		bz = bz[PrefixBytesLen:]
+		n += PrefixBytesLen
+	}
+
+	_n := 0
+	_n, err = cdc._decodeReflectBinary(bz, info, rv, opts)
+	slide(&bz, &n, _n)
+	return
+}
+
+// CONTRACT: any immediate disamb/prefix bytes have been consumed/stripped.
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) _decodeReflectBinary(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if info.Type.Kind() == reflect.Interface && rv.Kind() == reflect.Ptr {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(_) _decodeReflectBinary(bz: %X, info: %v, rv: %#v (%v), opts: %v)\n",
+			bz, info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(_) -> n: %v, err: %v\n", n, err)
+		}()
+	}
+	var _n int
+
+	// TODO consider the binary equivalent of json.Unmarshaller.
+
+	// Dereference-and-construct pointers all the way.
+	// This works for pointer-pointers.
+	for rv.Kind() == reflect.Ptr {
+		if rv.IsNil() {
+			newPtr := reflect.New(rv.Type().Elem())
+			rv.Set(newPtr)
+		}
+		rv = rv.Elem()
+	}
+
+	// Handle override if a pointer to rv implements UnmarshalAmino.
+	if info.IsAminoUnmarshaler {
+		// First, decode repr instance from bytes.
+		rrv, rinfo := reflect.New(info.AminoUnmarshalReprType).Elem(), (*TypeInfo)(nil)
+		rinfo, err = cdc.getTypeInfo_wlock(info.AminoUnmarshalReprType)
+		if err != nil {
+			return
+		}
+		_n, err = cdc._decodeReflectBinary(bz, rinfo, rrv, opts)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		// Then, decode from repr instance.
+		uwrm := rv.Addr().MethodByName("UnmarshalAmino")
+		uwouts := uwrm.Call([]reflect.Value{rrv})
+		erri := uwouts[0].Interface()
+		if erri != nil {
+			err = erri.(error)
+		}
+		return
+	}
+
+	switch info.Type.Kind() {
+
+	//----------------------------------------
+	// Complex
+
+	case reflect.Interface:
+		_n, err = cdc.decodeReflectBinaryInterface(bz, info, rv, opts)
+		n += _n
+		return
+
+	case reflect.Array:
+		ert := info.Type.Elem()
+		if ert.Kind() == reflect.Uint8 {
+			_n, err = cdc.decodeReflectBinaryByteArray(bz, info, rv, opts)
+			n += _n
+		} else {
+			_n, err = cdc.decodeReflectBinaryArray(bz, info, rv, opts)
+			n += _n
+		}
+		return
+
+	case reflect.Slice:
+		ert := info.Type.Elem()
+		if ert.Kind() == reflect.Uint8 {
+			_n, err = cdc.decodeReflectBinaryByteSlice(bz, info, rv, opts)
+			n += _n
+		} else {
+			_n, err = cdc.decodeReflectBinarySlice(bz, info, rv, opts)
+			n += _n
+		}
+		return
+
+	case reflect.Struct:
+		_n, err = cdc.decodeReflectBinaryStruct(bz, info, rv, opts)
+		n += _n
+		return
+
+	//----------------------------------------
+	// Signed
+
+	case reflect.Int64:
+		var num int64
+		if opts.BinVarint {
+			num, _n, err = DecodeVarint(bz)
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+			rv.SetInt(num)
+		} else {
+			num, _n, err = DecodeInt64(bz)
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+			rv.SetInt(num)
+		}
+		return
+
+	case reflect.Int32:
+		var num int32
+		num, _n, err = DecodeInt32(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetInt(int64(num))
+		return
+
+	case reflect.Int16:
+		var num int16
+		num, _n, err = DecodeInt16(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetInt(int64(num))
+		return
+
+	case reflect.Int8:
+		var num int8
+		num, _n, err = DecodeInt8(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetInt(int64(num))
+		return
+
+	case reflect.Int:
+		var num int64
+		num, _n, err = DecodeVarint(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetInt(num)
+		return
+
+	//----------------------------------------
+	// Unsigned
+
+	case reflect.Uint64:
+		var num uint64
+		if opts.BinVarint {
+			num, _n, err = DecodeUvarint(bz)
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+			rv.SetUint(num)
+		} else {
+			num, _n, err = DecodeUint64(bz)
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+			rv.SetUint(num)
+		}
+		return
+
+	case reflect.Uint32:
+		var num uint32
+		num, _n, err = DecodeUint32(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetUint(uint64(num))
+		return
+
+	case reflect.Uint16:
+		var num uint16
+		num, _n, err = DecodeUint16(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetUint(uint64(num))
+		return
+
+	case reflect.Uint8:
+		var num uint8
+		num, _n, err = DecodeUint8(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetUint(uint64(num))
+		return
+
+	case reflect.Uint:
+		var num uint64
+		num, _n, err = DecodeUvarint(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetUint(num)
+		return
+
+	//----------------------------------------
+	// Misc.
+
+	case reflect.Bool:
+		var b bool
+		b, _n, err = DecodeBool(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetBool(b)
+		return
+
+	case reflect.Float64:
+		var f float64
+		if !opts.Unsafe {
+			err = errors.New("Float support requires `amino:\"unsafe\"`.")
+			return
+		}
+		f, _n, err = DecodeFloat64(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetFloat(f)
+		return
+
+	case reflect.Float32:
+		var f float32
+		if !opts.Unsafe {
+			err = errors.New("Float support requires `amino:\"unsafe\"`.")
+			return
+		}
+		f, _n, err = DecodeFloat32(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetFloat(float64(f))
+		return
+
+	case reflect.String:
+		var str string
+		str, _n, err = DecodeString(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.SetString(str)
+		return
+
+	default:
+		panic(fmt.Sprintf("unknown field type %v", info.Type.Kind()))
+	}
+
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectBinaryInterface(bz []byte, iinfo *TypeInfo, rv reflect.Value, opts FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectBinaryInterface")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+	if !rv.IsNil() {
+		// JAE: Heed this note, this is very tricky.
+		// I've forgotten the reason a second time,
+		// but I'm pretty sure that reason exists.
+		err = errors.New("Decoding to a non-nil interface is not supported yet")
+		return
+	}
+
+	// Consume disambiguation / prefix+typ3 bytes.
+	disamb, hasDisamb, prefix, typ, hasPrefix, isNil, _n, err := DecodeDisambPrefixBytes(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+
+	// Special case for nil.
+	if isNil {
+		rv.Set(iinfo.ZeroValue)
+		return
+	}
+
+	// Get concrete type info from disfix/prefix.
+	var cinfo *TypeInfo
+	if hasDisamb {
+		cinfo, err = cdc.getTypeInfoFromDisfix_rlock(toDisfix(disamb, prefix))
+	} else if hasPrefix {
+		cinfo, err = cdc.getTypeInfoFromPrefix_rlock(iinfo, prefix)
+	} else {
+		err = errors.New("Expected disambiguation or prefix bytes.")
+	}
+	if err != nil {
+		return
+	}
+
+	// Check and consume typ3 byte.
+	// It cannot be a typ4 byte because it cannot be nil.
+	err = checkTyp3(cinfo.Type, typ, opts)
+	if err != nil {
+		return
+	}
+
+	// Construct the concrete type.
+	var crv, irvSet = constructConcreteType(cinfo)
+
+	// Decode into the concrete type.
+	_n, err = cdc._decodeReflectBinary(bz, cinfo, crv, opts)
+	if slide(&bz, &n, _n) && err != nil {
+		rv.Set(irvSet) // Helps with debugging
+		return
+	}
+
+	// We need to set here, for when !PointerPreferred and the type
+	// is say, an array of bytes (e.g. [32]byte), then we must call
+	// rv.Set() *after* the value was acquired.
+	// NOTE: rv.Set() should succeed because it was validated
+	// already during Register[Interface/Concrete].
+	rv.Set(irvSet)
+	return
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectBinaryByteArray(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectBinaryByteArray")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+	ert := info.Type.Elem()
+	if ert.Kind() != reflect.Uint8 {
+		panic("should not happen")
+	}
+	length := info.Type.Len()
+	if len(bz) < length {
+		return 0, fmt.Errorf("Insufficient bytes to decode [%v]byte.", length)
+	}
+
+	// Read byte-length prefixed byteslice.
+	var byteslice, _n = []byte(nil), int(0)
+	byteslice, _n, err = DecodeByteSlice(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+	if len(byteslice) != length {
+		err = fmt.Errorf("Mismatched byte array length: Expected %v, got %v",
+			length, len(byteslice))
+		return
+	}
+
+	// Copy read byteslice to rv array.
+	reflect.Copy(rv, reflect.ValueOf(byteslice))
+	return
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectBinaryArray(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectBinaryArray")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+	ert := info.Type.Elem()
+	if ert.Kind() == reflect.Uint8 {
+		panic("should not happen")
+	}
+	length := info.Type.Len()
+	einfo := (*TypeInfo)(nil)
+	einfo, err = cdc.getTypeInfo_wlock(ert)
+	if err != nil {
+		return
+	}
+
+	// Check and consume typ4 byte.
+	var ptr, _n = false, int(0)
+	ptr, _n, err = decodeTyp4AndCheck(ert, bz, opts)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+
+	// Read number of items.
+	var count = uint64(0)
+	count, _n, err = DecodeUvarint(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+	if int(count) != length {
+		err = fmt.Errorf("Expected num items of %v, decoded %v", length, count)
+		return
+	}
+
+	// NOTE: Unlike decodeReflectBinarySlice,
+	// there is nothing special to do for
+	// zero-length arrays.  Is that even possible?
+
+	// Read each item.
+	for i := 0; i < length; i++ {
+		var erv, _n = rv.Index(i), int(0)
+		// Maybe read nil.
+		if ptr {
+			numNil := int64(0)
+			numNil, _n, err = decodeNumNilBytes(bz)
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+			if numNil == 0 {
+				// Good, continue decoding item.
+			} else if numNil == 1 {
+				// Set nil/zero.
+				erv.Set(reflect.Zero(erv.Type()))
+				continue
+			} else {
+				panic("should not happen")
+			}
+		}
+		// Decode non-nil value.
+		_n, err = cdc.decodeReflectBinary(bz, einfo, erv, opts)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+	}
+	return
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectBinaryByteSlice(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectByteSlice")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+	ert := info.Type.Elem()
+	if ert.Kind() != reflect.Uint8 {
+		panic("should not happen")
+	}
+
+	// Read byte-length prefixed byteslice.
+	var byteslice, _n = []byte(nil), int(0)
+	byteslice, _n, err = DecodeByteSlice(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+	if len(byteslice) == 0 {
+		// Special case when length is 0.
+		// NOTE: We prefer nil slices.
+		rv.Set(info.ZeroValue)
+	} else {
+		rv.Set(reflect.ValueOf(byteslice))
+	}
+	return
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectBinarySlice(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectBinarySlice")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+	ert := info.Type.Elem()
+	if ert.Kind() == reflect.Uint8 {
+		panic("should not happen")
+	}
+	einfo := (*TypeInfo)(nil)
+	einfo, err = cdc.getTypeInfo_wlock(ert)
+	if err != nil {
+		return
+	}
+
+	// Check and consume typ4 byte.
+	var ptr, _n = false, int(0)
+	ptr, _n, err = decodeTyp4AndCheck(ert, bz, opts)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+
+	// Read number of items.
+	var count = uint64(0)
+	count, _n, err = DecodeUvarint(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+	if int(count) < 0 {
+		err = fmt.Errorf("Impossible number of elements (%v)", count)
+		return
+	}
+	if int(count) > len(bz) { // Currently, each item takes at least 1 byte.
+		err = fmt.Errorf("Impossible number of elements (%v) compared to buffer length (%v)",
+			count, len(bz))
+		return
+	}
+
+	// Special case when length is 0.
+	// NOTE: We prefer nil slices.
+	if count == 0 {
+		rv.Set(info.ZeroValue)
+		return
+	}
+
+	// Read each item.
+	// NOTE: Unlike decodeReflectBinaryArray,
+	// we need to construct a new slice before
+	// we populate it. Arrays on the other hand
+	// reserve space in the value itself.
+	var esrt = reflect.SliceOf(ert) // TODO could be optimized.
+	var srv = reflect.MakeSlice(esrt, int(count), int(count))
+	for i := 0; i < int(count); i++ {
+		var erv, _n = srv.Index(i), int(0)
+		// Maybe read nil.
+		if ptr {
+			var numNil = int64(0)
+			numNil, _n, err = decodeNumNilBytes(bz)
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+			if numNil == 0 {
+				// Good, continue decoding item.
+			} else if numNil == 1 {
+				// Set nil/zero.
+				erv.Set(reflect.Zero(erv.Type()))
+				continue
+			} else {
+				panic("should not happen")
+			}
+		}
+		// Decode non-nil value.
+		_n, err = cdc.decodeReflectBinary(bz, einfo, erv, opts)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+	}
+	rv.Set(srv)
+	return
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectBinaryStruct(bz []byte, info *TypeInfo, rv reflect.Value, _ FieldOptions) (n int, err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectBinaryStruct")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+	_n := 0 // nolint: ineffassign
+
+	// The "Struct" typ3 doesn't get read here.
+	// It's already implied, either by struct-key or list-element-type-byte.
+
+	switch info.Type {
+
+	case timeType:
+		// Special case: time.Time
+		var t time.Time
+		t, _n, err = DecodeTime(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		rv.Set(reflect.ValueOf(t))
+		return
+
+	default:
+		// Read each field.
+		for _, field := range info.Fields {
+
+			// Get field rv and info.
+			var frv = rv.Field(field.Index)
+			var finfo *TypeInfo
+			finfo, err = cdc.getTypeInfo_wlock(field.Type)
+			if err != nil {
+				return
+			}
+
+			// Read field key (number and type).
+			var fieldNum, typ = uint32(0), Typ3(0x00)
+			fieldNum, typ, _n, err = decodeFieldNumberAndTyp3(bz)
+			if field.BinFieldNum < fieldNum {
+				// Set nil field value.
+				frv.Set(reflect.Zero(frv.Type()))
+				continue
+				// Do not slide, we will read it again.
+			}
+			if fieldNum == 0 {
+				// Probably a StructTerm.
+				break
+			}
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+			// NOTE: In the future, we'll support upgradeability.
+			// So in the future, this may not match,
+			// so we will need to remove this sanity check.
+			if field.BinFieldNum != fieldNum {
+				err = errors.New(fmt.Sprintf("Expected field number %v, got %v", field.BinFieldNum, fieldNum))
+				return
+			}
+			typWanted := typeToTyp4(field.Type, field.FieldOptions).Typ3()
+			if typ != typWanted {
+				err = errors.New(fmt.Sprintf("Expected field type %X, got %X", typWanted, typ))
+				return
+			}
+
+			// Decode field into frv.
+			_n, err = cdc.decodeReflectBinary(bz, finfo, frv, field.FieldOptions)
+			if slide(&bz, &n, _n) && err != nil {
+				return
+			}
+		}
+
+		// Read "StructTerm".
+		// NOTE: In the future, we'll need to break out of a loop
+		// when encoutering an StructTerm typ3 byte.
+		var typ = Typ3(0x00)
+		typ, _n, err = decodeTyp3(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		if typ != Typ3_StructTerm {
+			err = errors.New(fmt.Sprintf("Expected StructTerm typ3 byte, got %X", typ))
+			return
+		}
+		return
+	}
+}
+
+//----------------------------------------
+
+func DecodeDisambPrefixBytes(bz []byte) (db DisambBytes, hasDb bool, pb PrefixBytes, typ Typ3, hasPb bool, isNil bool, n int, err error) {
+	// Special case: nil
+	if len(bz) >= 2 && bz[0] == 0x00 && bz[1] == 0x00 {
+		isNil = true
+		n = 2
+		return
+	}
+	// Validate
+	if len(bz) < 4 {
+		err = errors.New("EOF reading prefix bytes.")
+		return // hasPb = false
+	}
+	if bz[0] == 0x00 { // Disfix
+		// Validate
+		if len(bz) < 8 {
+			err = errors.New("EOF reading disamb bytes.")
+			return // hasPb = false
+		}
+		copy(db[0:3], bz[1:4])
+		copy(pb[0:4], bz[4:8])
+		pb, typ = pb.SplitTyp3()
+		hasDb = true
+		hasPb = true
+		n = 8
+		return
+	} else { // Prefix
+		// General case with no disambiguation
+		copy(pb[0:4], bz[0:4])
+		pb, typ = pb.SplitTyp3()
+		hasDb = false
+		hasPb = true
+		n = 4
+		return
+	}
+}
+
+// Read field key.
+func decodeFieldNumberAndTyp3(bz []byte) (num uint32, typ Typ3, n int, err error) {
+
+	// Read uvarint value.
+	var value64 = uint64(0)
+	value64, n, err = DecodeUvarint(bz)
+	if err != nil {
+		return
+	}
+
+	// Decode first typ3 byte.
+	typ = Typ3(value64 & 0x07)
+
+	// Decode num.
+	var num64 uint64
+	num64 = value64 >> 3
+	if num64 > (1<<29 - 1) {
+		err = errors.New(fmt.Sprintf("invalid field num %v", num64))
+		return
+	}
+	num = uint32(num64)
+	return
+}
+
+// Consume typ4 byte and error if it doesn't match rt.
+func decodeTyp4AndCheck(rt reflect.Type, bz []byte, opts FieldOptions) (ptr bool, n int, err error) {
+	var typ = Typ4(0x00)
+	typ, n, err = decodeTyp4(bz)
+	if err != nil {
+		return
+	}
+	var typWanted = typeToTyp4(rt, opts)
+	if typWanted != typ {
+		err = errors.New(fmt.Sprintf("Typ4 mismatch.  Expected %X, got %X", typWanted, typ))
+		return
+	}
+	ptr = (typ & 0x08) != 0
+	return
+}
+
+// Read Typ4 byte.
+func decodeTyp4(bz []byte) (typ Typ4, n int, err error) {
+	if len(bz) == 0 {
+		err = errors.New(fmt.Sprintf("EOF reading typ4 byte"))
+		return
+	}
+	if bz[0]&0xF0 != 0 {
+		err = errors.New(fmt.Sprintf("Invalid non-zero nibble reading typ4 byte"))
+		return
+	}
+	typ = Typ4(bz[0])
+	n = 1
+	return
+}
+
+// Error if typ doesn't match rt.
+func checkTyp3(rt reflect.Type, typ Typ3, opts FieldOptions) (err error) {
+	typWanted := typeToTyp3(rt, opts)
+	if typ != typWanted {
+		err = fmt.Errorf("Typ3 mismatch.  Expected %X, got %X", typWanted, typ)
+	}
+	return
+}
+
+// Read typ3 byte.
+func decodeTyp3(bz []byte) (typ Typ3, n int, err error) {
+	if len(bz) == 0 {
+		err = fmt.Errorf("EOF reading typ3 byte")
+		return
+	}
+	if bz[0]&0xF8 != 0 {
+		err = fmt.Errorf("Invalid typ3 byte")
+		return
+	}
+	typ = Typ3(bz[0])
+	n = 1
+	return
+}
+
+// Read a uvarint that encodes the number of nil items to skip.  NOTE:
+// Currently does not support any number besides 0 (not nil) and 1 (nil).  All
+// other values will error.
+func decodeNumNilBytes(bz []byte) (numNil int64, n int, err error) {
+	if len(bz) == 0 {
+		err = errors.New("EOF reading nil byte(s)")
+		return
+	}
+	if bz[0] == 0x00 {
+		numNil, n = 0, 1
+		return
+	}
+	if bz[0] == 0x01 {
+		numNil, n = 1, 1
+		return
+	}
+	n, err = 0, fmt.Errorf("Unexpected nil byte %X (sparse lists not supported)", bz[0])
+	return
+}
diff --git a/vendor/github.com/tendermint/go-amino/binary-encode.go b/vendor/github.com/tendermint/go-amino/binary-encode.go
new file mode 100644
index 0000000000000000000000000000000000000000..e141d4d224bf90fb2cf532c87a292952f51993ab
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/binary-encode.go
@@ -0,0 +1,425 @@
+package amino
+
+import (
+	"encoding/binary"
+	"errors"
+	"fmt"
+	"io"
+	"reflect"
+	"time"
+
+	"github.com/davecgh/go-spew/spew"
+)
+
+//----------------------------------------
+// cdc.encodeReflectBinary
+
+// This is the main entrypoint for encoding all types in binary form.  This
+// function calls encodeReflectBinary*, and generally those functions should
+// only call this one, for the prefix bytes are only written here.
+// The value may be a nil interface, but not a nil pointer.
+// The following contracts apply to all similar encode methods.
+// CONTRACT: rv is not a pointer
+// CONTRACT: rv is valid.
+func (cdc *Codec) encodeReflectBinary(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if rv.Kind() == reflect.Ptr {
+		panic("should not happen")
+	}
+	if !rv.IsValid() {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(E) encodeReflectBinary(info: %v, rv: %#v (%v), opts: %v)\n",
+			info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(E) -> err: %v\n", err)
+		}()
+	}
+
+	// Maybe write prefix+typ3 bytes.
+	if info.Registered {
+		var typ = typeToTyp4(info.Type, opts).Typ3()
+		_, err = w.Write(info.Prefix.WithTyp3(typ).Bytes())
+		if err != nil {
+			return
+		}
+	}
+
+	err = cdc._encodeReflectBinary(w, info, rv, opts)
+	return
+}
+
+// CONTRACT: any disamb/prefix+typ3 bytes have already been written.
+func (cdc *Codec) _encodeReflectBinary(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if rv.Kind() == reflect.Ptr {
+		panic("should not happen")
+	}
+	if !rv.IsValid() {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(_) _encodeReflectBinary(info: %v, rv: %#v (%v), opts: %v)\n",
+			info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(_) -> err: %v\n", err)
+		}()
+	}
+
+	// Handle override if rv implements json.Marshaler.
+	if info.IsAminoMarshaler {
+		// First, encode rv into repr instance.
+		var rrv, rinfo = reflect.Value{}, (*TypeInfo)(nil)
+		rrv, err = toReprObject(rv)
+		if err != nil {
+			return
+		}
+		rinfo, err = cdc.getTypeInfo_wlock(info.AminoMarshalReprType)
+		if err != nil {
+			return
+		}
+		// Then, encode the repr instance.
+		err = cdc._encodeReflectBinary(w, rinfo, rrv, opts)
+		return
+	}
+
+	switch info.Type.Kind() {
+
+	//----------------------------------------
+	// Complex
+
+	case reflect.Interface:
+		err = cdc.encodeReflectBinaryInterface(w, info, rv, opts)
+
+	case reflect.Array:
+		if info.Type.Elem().Kind() == reflect.Uint8 {
+			err = cdc.encodeReflectBinaryByteArray(w, info, rv, opts)
+		} else {
+			err = cdc.encodeReflectBinaryList(w, info, rv, opts)
+		}
+
+	case reflect.Slice:
+		if info.Type.Elem().Kind() == reflect.Uint8 {
+			err = cdc.encodeReflectBinaryByteSlice(w, info, rv, opts)
+		} else {
+			err = cdc.encodeReflectBinaryList(w, info, rv, opts)
+		}
+
+	case reflect.Struct:
+		err = cdc.encodeReflectBinaryStruct(w, info, rv, opts)
+
+	//----------------------------------------
+	// Signed
+
+	case reflect.Int64:
+		if opts.BinVarint {
+			err = EncodeVarint(w, rv.Int())
+		} else {
+			err = EncodeInt64(w, rv.Int())
+		}
+
+	case reflect.Int32:
+		err = EncodeInt32(w, int32(rv.Int()))
+
+	case reflect.Int16:
+		err = EncodeInt16(w, int16(rv.Int()))
+
+	case reflect.Int8:
+		err = EncodeInt8(w, int8(rv.Int()))
+
+	case reflect.Int:
+		err = EncodeVarint(w, rv.Int())
+
+	//----------------------------------------
+	// Unsigned
+
+	case reflect.Uint64:
+		if opts.BinVarint {
+			err = EncodeUvarint(w, rv.Uint())
+		} else {
+			err = EncodeUint64(w, rv.Uint())
+		}
+
+	case reflect.Uint32:
+		err = EncodeUint32(w, uint32(rv.Uint()))
+
+	case reflect.Uint16:
+		err = EncodeUint16(w, uint16(rv.Uint()))
+
+	case reflect.Uint8:
+		err = EncodeUint8(w, uint8(rv.Uint()))
+
+	case reflect.Uint:
+		err = EncodeUvarint(w, rv.Uint())
+
+	//----------------------------------------
+	// Misc
+
+	case reflect.Bool:
+		err = EncodeBool(w, rv.Bool())
+
+	case reflect.Float64:
+		if !opts.Unsafe {
+			err = errors.New("Amino float* support requires `amino:\"unsafe\"`.")
+			return
+		}
+		err = EncodeFloat64(w, rv.Float())
+
+	case reflect.Float32:
+		if !opts.Unsafe {
+			err = errors.New("Amino float* support requires `amino:\"unsafe\"`.")
+			return
+		}
+		err = EncodeFloat32(w, float32(rv.Float()))
+
+	case reflect.String:
+		err = EncodeString(w, rv.String())
+
+	//----------------------------------------
+	// Default
+
+	default:
+		panic(fmt.Sprintf("unsupported type %v", info.Type.Kind()))
+	}
+
+	return
+}
+
+func (cdc *Codec) encodeReflectBinaryInterface(w io.Writer, iinfo *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectBinaryInterface")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+
+	// Special case when rv is nil, write 0x0000.
+	if rv.IsNil() {
+		_, err = w.Write([]byte{0x00, 0x00})
+		return
+	}
+
+	// Get concrete non-pointer reflect value & type.
+	var crv, isPtr, isNilPtr = derefPointers(rv.Elem())
+	if isPtr && crv.Kind() == reflect.Interface {
+		// See "MARKER: No interface-pointers" in codec.go
+		panic("should not happen")
+	}
+	if isNilPtr {
+		panic(fmt.Sprintf("Illegal nil-pointer of type %v for registered interface %v. "+
+			"For compatibility with other languages, nil-pointer interface values are forbidden.", crv.Type(), iinfo.Type))
+	}
+	var crt = crv.Type()
+
+	// Get *TypeInfo for concrete type.
+	var cinfo *TypeInfo
+	cinfo, err = cdc.getTypeInfo_wlock(crt)
+	if err != nil {
+		return
+	}
+	if !cinfo.Registered {
+		err = fmt.Errorf("Cannot encode unregistered concrete type %v.", crt)
+		return
+	}
+
+	// Write disambiguation bytes if needed.
+	var needDisamb bool = false
+	if iinfo.AlwaysDisambiguate {
+		needDisamb = true
+	} else if len(iinfo.Implementers[cinfo.Prefix]) > 1 {
+		needDisamb = true
+	}
+	if needDisamb {
+		_, err = w.Write(append([]byte{0x00}, cinfo.Disamb[:]...))
+		if err != nil {
+			return
+		}
+	}
+
+	// Write prefix+typ3 bytes.
+	var typ = typeToTyp3(crt, opts)
+	_, err = w.Write(cinfo.Prefix.WithTyp3(typ).Bytes())
+	if err != nil {
+		return
+	}
+
+	// Write actual concrete value.
+	err = cdc._encodeReflectBinary(w, cinfo, crv, opts)
+	return
+}
+
+func (cdc *Codec) encodeReflectBinaryByteArray(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	ert := info.Type.Elem()
+	if ert.Kind() != reflect.Uint8 {
+		panic("should not happen")
+	}
+	length := info.Type.Len()
+
+	// Get byteslice.
+	var byteslice = []byte(nil)
+	if rv.CanAddr() {
+		byteslice = rv.Slice(0, length).Bytes()
+	} else {
+		byteslice = make([]byte, length)
+		reflect.Copy(reflect.ValueOf(byteslice), rv) // XXX: looks expensive!
+	}
+
+	// Write byte-length prefixed byteslice.
+	err = EncodeByteSlice(w, byteslice)
+	return
+}
+
+func (cdc *Codec) encodeReflectBinaryList(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectBinaryList")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+	ert := info.Type.Elem()
+	if ert.Kind() == reflect.Uint8 {
+		panic("should not happen")
+	}
+
+	// Write element Typ4 byte.
+	var typ = typeToTyp4(ert, opts)
+	err = EncodeByte(w, byte(typ))
+	if err != nil {
+		return
+	}
+
+	// Write length.
+	err = EncodeUvarint(w, uint64(rv.Len()))
+	if err != nil {
+		return
+	}
+
+	// Write elems.
+	var einfo *TypeInfo
+	einfo, err = cdc.getTypeInfo_wlock(ert)
+	if err != nil {
+		return
+	}
+	for i := 0; i < rv.Len(); i++ {
+		// Get dereferenced element value and info.
+		var erv, void = isVoid(rv.Index(i))
+		if typ.IsPointer() {
+			// We must write a byte to denote whether element is nil.
+			if void {
+				// Value is nil or empty.
+				// e.g. nil pointer, nil/empty slice, pointer to nil/empty slice, pointer
+				// to nil pointer.  Write 0x01 for "is nil".
+				// NOTE: Do not use a pointer to nil/empty slices to denote
+				// existence or not.  We have to make a design choice here, and
+				// here we discourage using pointers to denote existence.
+				_, err = w.Write([]byte{0x01})
+				continue
+			} else {
+				// Value is not nil or empty.  Write 0x00 for "not nil/empty".
+				_, err = w.Write([]byte{0x00})
+			}
+		}
+		// Write the element value.
+		// It may be a nil interface, but not a nil pointer.
+		err = cdc.encodeReflectBinary(w, einfo, erv, opts)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// CONTRACT: info.Type.Elem().Kind() == reflect.Uint8
+func (cdc *Codec) encodeReflectBinaryByteSlice(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectBinaryByteSlice")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+	ert := info.Type.Elem()
+	if ert.Kind() != reflect.Uint8 {
+		panic("should not happen")
+	}
+
+	// Write byte-length prefixed byte-slice.
+	var byteslice = rv.Bytes()
+	err = EncodeByteSlice(w, byteslice)
+	return
+}
+
+func (cdc *Codec) encodeReflectBinaryStruct(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectBinaryBinaryStruct")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+
+	// The "Struct" Typ3 doesn't get written here.
+	// It's already implied, either by struct-key or list-element-type-byte.
+
+	switch info.Type {
+
+	case timeType:
+		// Special case: time.Time
+		err = EncodeTime(w, rv.Interface().(time.Time))
+		return
+
+	default:
+		for _, field := range info.Fields {
+			// Get dereferenced field value and info.
+			var frv, void = isVoid(rv.Field(field.Index))
+			if void {
+				// Do not encode nil or empty fields.
+				continue
+			}
+			var finfo *TypeInfo
+			finfo, err = cdc.getTypeInfo_wlock(field.Type)
+			if err != nil {
+				return
+			}
+			// TODO Maybe allow omitempty somehow.
+			// Write field key (number and type).
+			err = encodeFieldNumberAndTyp3(w, field.BinFieldNum, field.BinTyp3)
+			if err != nil {
+				return
+			}
+			// Write field from rv.
+			err = cdc.encodeReflectBinary(w, finfo, frv, field.FieldOptions)
+			if err != nil {
+				return
+			}
+		}
+
+		// Write "StructTerm".
+		err = EncodeByte(w, byte(Typ3_StructTerm))
+		if err != nil {
+			return
+		}
+		return
+
+	}
+
+}
+
+//----------------------------------------
+// Misc.
+
+// Write field key.
+func encodeFieldNumberAndTyp3(w io.Writer, num uint32, typ Typ3) (err error) {
+	if (typ & 0xF8) != 0 {
+		panic(fmt.Sprintf("invalid Typ3 byte %X", typ))
+	}
+	if num < 0 || num > (1<<29-1) {
+		panic(fmt.Sprintf("invalid field number %v", num))
+	}
+
+	// Pack Typ3 and field number.
+	var value64 = (uint64(num) << 3) | uint64(typ)
+
+	// Write uvarint value for field and Typ3.
+	var buf [10]byte
+	n := binary.PutUvarint(buf[:], value64)
+	_, err = w.Write(buf[0:n])
+	return
+}
diff --git a/vendor/github.com/tendermint/go-amino/codec.go b/vendor/github.com/tendermint/go-amino/codec.go
new file mode 100644
index 0000000000000000000000000000000000000000..30af7e7e8ae891a55444f595d97a7a9a0b7c1e75
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/codec.go
@@ -0,0 +1,654 @@
+package amino
+
+import (
+	"bytes"
+	"crypto/sha256"
+	"fmt"
+	"reflect"
+	"strings"
+	"sync"
+	"unicode"
+)
+
+//----------------------------------------
+// PrefixBytes/DisambBytes/DisfixBytes types
+
+// Lengths
+const (
+	PrefixBytesLen = 4
+	DisambBytesLen = 3
+	DisfixBytesLen = PrefixBytesLen + DisambBytesLen
+)
+
+// Prefix types
+type (
+	PrefixBytes [PrefixBytesLen]byte
+	DisambBytes [DisambBytesLen]byte
+	DisfixBytes [DisfixBytesLen]byte // Disamb+Prefix
+)
+
+// Copy into PrefixBytes
+func NewPrefixBytes(prefixBytes []byte) PrefixBytes {
+	pb := PrefixBytes{}
+	copy(pb[:], prefixBytes)
+	return pb
+}
+
+func (pb PrefixBytes) Bytes() []byte                 { return pb[:] }
+func (pb PrefixBytes) EqualBytes(bz []byte) bool     { return bytes.Equal(pb[:], bz) }
+func (pb PrefixBytes) WithTyp3(typ Typ3) PrefixBytes { pb[3] |= byte(typ); return pb }
+func (pb PrefixBytes) SplitTyp3() (PrefixBytes, Typ3) {
+	typ := Typ3(pb[3] & 0x07)
+	pb[3] &= 0xF8
+	return pb, typ
+}
+func (db DisambBytes) Bytes() []byte             { return db[:] }
+func (db DisambBytes) EqualBytes(bz []byte) bool { return bytes.Equal(db[:], bz) }
+func (df DisfixBytes) Bytes() []byte             { return df[:] }
+func (df DisfixBytes) EqualBytes(bz []byte) bool { return bytes.Equal(df[:], bz) }
+
+// Return the DisambBytes and the PrefixBytes for a given name.
+func NameToDisfix(name string) (db DisambBytes, pb PrefixBytes) {
+	return nameToDisfix(name)
+}
+
+//----------------------------------------
+// Codec internals
+
+type TypeInfo struct {
+	Type      reflect.Type // Interface type.
+	PtrToType reflect.Type
+	ZeroValue reflect.Value
+	ZeroProto interface{}
+	InterfaceInfo
+	ConcreteInfo
+	StructInfo
+}
+
+type InterfaceInfo struct {
+	Priority     []DisfixBytes               // Disfix priority.
+	Implementers map[PrefixBytes][]*TypeInfo // Mutated over time.
+	InterfaceOptions
+}
+
+type InterfaceOptions struct {
+	Priority           []string // Disamb priority.
+	AlwaysDisambiguate bool     // If true, include disamb for all types.
+}
+
+type ConcreteInfo struct {
+
+	// These fields are only set when registered (as implementing an interface).
+	Registered       bool        // Registered with RegisterConcrete().
+	PointerPreferred bool        // Deserialize to pointer type if possible.
+	Name             string      // Registered name.
+	Disamb           DisambBytes // Disambiguation bytes derived from name.
+	Prefix           PrefixBytes // Prefix bytes derived from name.
+	ConcreteOptions              // Registration options.
+
+	// These fields get set for all concrete types,
+	// even those not manually registered (e.g. are never interface values).
+	IsAminoMarshaler       bool         // Implements MarshalAmino() (<ReprObject>, error).
+	AminoMarshalReprType   reflect.Type // <ReprType>
+	IsAminoUnmarshaler     bool         // Implements UnmarshalAmino(<ReprObject>) (error).
+	AminoUnmarshalReprType reflect.Type // <ReprType>
+}
+
+type StructInfo struct {
+	Fields []FieldInfo // If a struct.
+}
+
+func (cinfo ConcreteInfo) GetDisfix() DisfixBytes {
+	return toDisfix(cinfo.Disamb, cinfo.Prefix)
+}
+
+type ConcreteOptions struct {
+}
+
+type FieldInfo struct {
+	Name         string        // Struct field name
+	Type         reflect.Type  // Struct field type
+	Index        int           // Struct field index
+	ZeroValue    reflect.Value // Could be nil pointer unlike TypeInfo.ZeroValue.
+	FieldOptions               // Encoding options
+	BinTyp3      Typ3          // (Binary) Typ3 byte
+}
+
+type FieldOptions struct {
+	JSONName      string // (JSON) field name
+	JSONOmitEmpty bool   // (JSON) omitempty
+	BinVarint     bool   // (Binary) Use length-prefixed encoding for (u)int64.
+	BinFieldNum   uint32 // (Binary) max 1<<29-1
+	Unsafe        bool   // e.g. if this field is a float.
+}
+
+//----------------------------------------
+// Codec
+
+type Codec struct {
+	mtx              sync.RWMutex
+	typeInfos        map[reflect.Type]*TypeInfo
+	interfaceInfos   []*TypeInfo
+	concreteInfos    []*TypeInfo
+	disfixToTypeInfo map[DisfixBytes]*TypeInfo
+}
+
+func NewCodec() *Codec {
+	cdc := &Codec{
+		typeInfos:        make(map[reflect.Type]*TypeInfo),
+		disfixToTypeInfo: make(map[DisfixBytes]*TypeInfo),
+	}
+	return cdc
+}
+
+// This function should be used to register all interfaces that will be
+// encoded/decoded by go-amino.
+// Usage:
+// `amino.RegisterInterface((*MyInterface1)(nil), nil)`
+func (cdc *Codec) RegisterInterface(ptr interface{}, opts *InterfaceOptions) {
+
+	// Get reflect.Type from ptr.
+	rt := getTypeFromPointer(ptr)
+	if rt.Kind() != reflect.Interface {
+		panic(fmt.Sprintf("RegisterInterface expects an interface, got %v", rt))
+	}
+
+	// Construct InterfaceInfo
+	var info = cdc.newTypeInfoFromInterfaceType(rt, opts)
+
+	// Finally, check conflicts and register.
+	func() {
+		cdc.mtx.Lock()
+		defer cdc.mtx.Unlock()
+
+		cdc.collectImplementers_nolock(info)
+		err := cdc.checkConflictsInPrio_nolock(info)
+		if err != nil {
+			panic(err)
+		}
+		cdc.setTypeInfo_nolock(info)
+	}()
+	/*
+		NOTE: The above func block is a defensive pattern.
+
+		First of all, the defer call is necessary to recover from panics,
+		otherwise the Codec would become unusable after a single panic.
+
+		This “defer-panic-unlock” pattern requires a func block to denote the
+		boundary outside of which the defer call is guaranteed to have been
+		called.  In other words, using any other form of curly braces (e.g.  in
+		the form of a conditional or looping block) won't actually unlock when
+		it might appear to visually.  Consider:
+
+		```
+		var info = ...
+		{
+			cdc.mtx.Lock()
+			defer cdc.mtx.Unlock()
+
+			...
+		}
+		// Here, cdc.mtx.Unlock() hasn't been called yet.
+		```
+
+		So, while the above code could be simplified, it's there for defense.
+	*/
+}
+
+// This function should be used to register concrete types that will appear in
+// interface fields/elements to be encoded/decoded by go-amino.
+// Usage:
+// `amino.RegisterConcrete(MyStruct1{}, "com.tendermint/MyStruct1", nil)`
+func (cdc *Codec) RegisterConcrete(o interface{}, name string, opts *ConcreteOptions) {
+
+	var pointerPreferred bool
+
+	// Get reflect.Type.
+	rt := reflect.TypeOf(o)
+	if rt.Kind() == reflect.Interface {
+		panic(fmt.Sprintf("expected a non-interface: %v", rt))
+	}
+	if rt.Kind() == reflect.Ptr {
+		rt = rt.Elem()
+		if rt.Kind() == reflect.Ptr {
+			// We can encode/decode pointer-pointers, but not register them.
+			panic(fmt.Sprintf("registering pointer-pointers not yet supported: *%v", rt))
+		}
+		if rt.Kind() == reflect.Interface {
+			// MARKER: No interface-pointers
+			panic(fmt.Sprintf("registering interface-pointers not yet supported: *%v", rt))
+		}
+		pointerPreferred = true
+	}
+
+	// Construct ConcreteInfo.
+	var info = cdc.newTypeInfoFromRegisteredConcreteType(rt, pointerPreferred, name, opts)
+
+	// Finally, check conflicts and register.
+	func() {
+		cdc.mtx.Lock()
+		defer cdc.mtx.Unlock()
+
+		cdc.addCheckConflictsWithConcrete_nolock(info)
+		cdc.setTypeInfo_nolock(info)
+	}()
+}
+
+//----------------------------------------
+
+func (cdc *Codec) setTypeInfo_nolock(info *TypeInfo) {
+
+	if info.Type.Kind() == reflect.Ptr {
+		panic(fmt.Sprintf("unexpected pointer type"))
+	}
+	if _, ok := cdc.typeInfos[info.Type]; ok {
+		panic(fmt.Sprintf("TypeInfo already exists for %v", info.Type))
+	}
+
+	cdc.typeInfos[info.Type] = info
+	if info.Type.Kind() == reflect.Interface {
+		cdc.interfaceInfos = append(cdc.interfaceInfos, info)
+	} else if info.Registered {
+		cdc.concreteInfos = append(cdc.concreteInfos, info)
+		disfix := info.GetDisfix()
+		if existing, ok := cdc.disfixToTypeInfo[disfix]; ok {
+			panic(fmt.Sprintf("disfix <%X> already registered for %v", disfix, existing.Type))
+		}
+		cdc.disfixToTypeInfo[disfix] = info
+		//cdc.prefixToTypeInfos[prefix] =
+		//	append(cdc.prefixToTypeInfos[prefix], info)
+	}
+}
+
+func (cdc *Codec) getTypeInfo_wlock(rt reflect.Type) (info *TypeInfo, err error) {
+	cdc.mtx.Lock() // requires wlock because we might set.
+	defer cdc.mtx.Unlock()
+
+	// Dereference pointer type.
+	for rt.Kind() == reflect.Ptr {
+		rt = rt.Elem()
+	}
+
+	info, ok := cdc.typeInfos[rt]
+	if !ok {
+		if rt.Kind() == reflect.Interface {
+			err = fmt.Errorf("Unregistered interface %v", rt)
+			return
+		}
+
+		info = cdc.newTypeInfoUnregistered(rt)
+		cdc.setTypeInfo_nolock(info)
+	}
+	return info, nil
+}
+
+// iinfo: TypeInfo for the interface for which we must decode a
+// concrete type with prefix bytes pb.
+func (cdc *Codec) getTypeInfoFromPrefix_rlock(iinfo *TypeInfo, pb PrefixBytes) (info *TypeInfo, err error) {
+	cdc.mtx.RLock()
+	defer cdc.mtx.RUnlock()
+
+	infos, ok := iinfo.Implementers[pb]
+	if !ok {
+		err = fmt.Errorf("unrecognized prefix bytes %X", pb)
+		return
+	}
+	if len(infos) > 1 {
+		err = fmt.Errorf("Conflicting concrete types registered for %X: e.g. %v and %v.", pb, infos[0].Type, infos[1].Type)
+		return
+	}
+	info = infos[0]
+	return
+}
+
+func (cdc *Codec) getTypeInfoFromDisfix_rlock(df DisfixBytes) (info *TypeInfo, err error) {
+	cdc.mtx.RLock()
+	defer cdc.mtx.RUnlock()
+
+	info, ok := cdc.disfixToTypeInfo[df]
+	if !ok {
+		err = fmt.Errorf("unrecognized disambiguation+prefix bytes %X", df)
+		return
+	}
+	return
+}
+
+func (cdc *Codec) parseStructInfo(rt reflect.Type) (sinfo StructInfo) {
+	if rt.Kind() != reflect.Struct {
+		panic("should not happen")
+	}
+
+	var infos = make([]FieldInfo, 0, rt.NumField())
+	for i := 0; i < rt.NumField(); i++ {
+		var field = rt.Field(i)
+		var ftype = field.Type
+		if !isExported(field) {
+			continue // field is unexported
+		}
+		skip, opts := cdc.parseFieldOptions(field)
+		if skip {
+			continue // e.g. json:"-"
+		}
+		// NOTE: This is going to change a bit.
+		// NOTE: BinFieldNum starts with 1.
+		opts.BinFieldNum = uint32(len(infos) + 1)
+		fieldInfo := FieldInfo{
+			Name:         field.Name, // Mostly for debugging.
+			Index:        i,
+			Type:         ftype,
+			ZeroValue:    reflect.Zero(ftype),
+			FieldOptions: opts,
+			BinTyp3:      typeToTyp4(ftype, opts).Typ3(),
+		}
+		checkUnsafe(fieldInfo)
+		infos = append(infos, fieldInfo)
+	}
+	sinfo = StructInfo{infos}
+	return
+}
+
+func (cdc *Codec) parseFieldOptions(field reflect.StructField) (skip bool, opts FieldOptions) {
+	binTag := field.Tag.Get("binary")
+	aminoTag := field.Tag.Get("amino")
+	jsonTag := field.Tag.Get("json")
+
+	// If `json:"-"`, don't encode.
+	// NOTE: This skips binary as well.
+	if jsonTag == "-" {
+		skip = true
+		return
+	}
+
+	// Get JSON field name.
+	jsonTagParts := strings.Split(jsonTag, ",")
+	if jsonTagParts[0] == "" {
+		opts.JSONName = field.Name
+	} else {
+		opts.JSONName = jsonTagParts[0]
+	}
+
+	// Get JSON omitempty.
+	if len(jsonTagParts) > 1 {
+		if jsonTagParts[1] == "omitempty" {
+			opts.JSONOmitEmpty = true
+		}
+	}
+
+	// Parse binary tags.
+	if binTag == "varint" { // TODO: extend
+		opts.BinVarint = true
+	}
+
+	// Parse amino tags.
+	if aminoTag == "unsafe" {
+		opts.Unsafe = true
+	}
+
+	return
+}
+
+// Constructs a *TypeInfo automatically, not from registration.
+func (cdc *Codec) newTypeInfoUnregistered(rt reflect.Type) *TypeInfo {
+	if rt.Kind() == reflect.Ptr {
+		panic("unexpected pointer type") // should not happen.
+	}
+	if rt.Kind() == reflect.Interface {
+		panic("unexpected interface type") // should not happen.
+	}
+
+	var info = new(TypeInfo)
+	info.Type = rt
+	info.PtrToType = reflect.PtrTo(rt)
+	info.ZeroValue = reflect.Zero(rt)
+	info.ZeroProto = reflect.Zero(rt).Interface()
+	if rt.Kind() == reflect.Struct {
+		info.StructInfo = cdc.parseStructInfo(rt)
+	}
+	if rm, ok := rt.MethodByName("MarshalAmino"); ok {
+		info.ConcreteInfo.IsAminoMarshaler = true
+		info.ConcreteInfo.AminoMarshalReprType = marshalAminoReprType(rm)
+	}
+	if rm, ok := reflect.PtrTo(rt).MethodByName("UnmarshalAmino"); ok {
+		info.ConcreteInfo.IsAminoUnmarshaler = true
+		info.ConcreteInfo.AminoUnmarshalReprType = unmarshalAminoReprType(rm)
+	}
+	return info
+}
+
+func (cdc *Codec) newTypeInfoFromInterfaceType(rt reflect.Type, opts *InterfaceOptions) *TypeInfo {
+	if rt.Kind() != reflect.Interface {
+		panic(fmt.Sprintf("expected interface type, got %v", rt))
+	}
+
+	var info = new(TypeInfo)
+	info.Type = rt
+	info.PtrToType = reflect.PtrTo(rt)
+	info.ZeroValue = reflect.Zero(rt)
+	info.ZeroProto = reflect.Zero(rt).Interface()
+	info.InterfaceInfo.Implementers = make(map[PrefixBytes][]*TypeInfo)
+	if opts != nil {
+		info.InterfaceInfo.InterfaceOptions = *opts
+		info.InterfaceInfo.Priority = make([]DisfixBytes, len(opts.Priority))
+		// Construct Priority []DisfixBytes
+		for i, name := range opts.Priority {
+			disamb, prefix := nameToDisfix(name)
+			disfix := toDisfix(disamb, prefix)
+			info.InterfaceInfo.Priority[i] = disfix
+		}
+	}
+	return info
+}
+
+func (cdc *Codec) newTypeInfoFromRegisteredConcreteType(rt reflect.Type, pointerPreferred bool, name string, opts *ConcreteOptions) *TypeInfo {
+	if rt.Kind() == reflect.Interface ||
+		rt.Kind() == reflect.Ptr {
+		panic(fmt.Sprintf("expected non-interface non-pointer concrete type, got %v", rt))
+	}
+
+	var info = cdc.newTypeInfoUnregistered(rt)
+	info.ConcreteInfo.Registered = true
+	info.ConcreteInfo.PointerPreferred = pointerPreferred
+	info.ConcreteInfo.Name = name
+	info.ConcreteInfo.Disamb = nameToDisamb(name)
+	info.ConcreteInfo.Prefix = nameToPrefix(name)
+	if opts != nil {
+		info.ConcreteOptions = *opts
+	}
+	return info
+}
+
+// Find all conflicting prefixes for concrete types
+// that "implement" the interface.  "Implement" in quotes because
+// we only consider the pointer, for extra safety.
+func (cdc *Codec) collectImplementers_nolock(info *TypeInfo) {
+	for _, cinfo := range cdc.concreteInfos {
+		if cinfo.PtrToType.Implements(info.Type) {
+			info.Implementers[cinfo.Prefix] = append(
+				info.Implementers[cinfo.Prefix], cinfo)
+		}
+	}
+}
+
+// Ensure that prefix-conflicting implementing concrete types
+// are all registered in the priority list.
+// Returns an error if a disamb conflict is found.
+func (cdc *Codec) checkConflictsInPrio_nolock(iinfo *TypeInfo) error {
+
+	for _, cinfos := range iinfo.Implementers {
+		if len(cinfos) < 2 {
+			continue
+		}
+		for _, cinfo := range cinfos {
+			var inPrio = false
+			for _, disfix := range iinfo.InterfaceInfo.Priority {
+				if cinfo.GetDisfix() == disfix {
+					inPrio = true
+				}
+			}
+			if !inPrio {
+				return fmt.Errorf("%v conflicts with %v other(s). Add it to the priority list for %v.",
+					cinfo.Type, len(cinfos), iinfo.Type)
+			}
+		}
+	}
+	return nil
+}
+
+func (cdc *Codec) addCheckConflictsWithConcrete_nolock(cinfo *TypeInfo) {
+
+	// Iterate over registered interfaces that this "implements".
+	// "Implement" in quotes because we only consider the pointer, for extra
+	// safety.
+	for _, iinfo := range cdc.interfaceInfos {
+		if !cinfo.PtrToType.Implements(iinfo.Type) {
+			continue
+		}
+
+		// Add cinfo to iinfo.Implementers.
+		var origImpls = iinfo.Implementers[cinfo.Prefix]
+		iinfo.Implementers[cinfo.Prefix] = append(origImpls, cinfo)
+
+		// Finally, check that all conflicts are in `.Priority`.
+		// NOTE: This could be optimized, but it's non-trivial.
+		err := cdc.checkConflictsInPrio_nolock(iinfo)
+		if err != nil {
+			// Return to previous state.
+			iinfo.Implementers[cinfo.Prefix] = origImpls
+			panic(err)
+		}
+	}
+}
+
+//----------------------------------------
+// .String()
+
+func (ti TypeInfo) String() string {
+	buf := new(bytes.Buffer)
+	buf.Write([]byte("TypeInfo{"))
+	buf.Write([]byte(fmt.Sprintf("Type:%v,", ti.Type)))
+	if ti.Type.Kind() == reflect.Interface {
+		buf.Write([]byte(fmt.Sprintf("Priority:%v,", ti.Priority)))
+		buf.Write([]byte("Implementers:{"))
+		for pb, cinfos := range ti.Implementers {
+			buf.Write([]byte(fmt.Sprintf("\"%X\":", pb)))
+			buf.Write([]byte(fmt.Sprintf("%v,", cinfos)))
+		}
+		buf.Write([]byte("}"))
+		buf.Write([]byte(fmt.Sprintf("Priority:%v,", ti.InterfaceOptions.Priority)))
+		buf.Write([]byte(fmt.Sprintf("AlwaysDisambiguate:%v,", ti.InterfaceOptions.AlwaysDisambiguate)))
+	}
+	if ti.Type.Kind() != reflect.Interface {
+		if ti.ConcreteInfo.Registered {
+			buf.Write([]byte("Registered:true,"))
+			buf.Write([]byte(fmt.Sprintf("PointerPreferred:%v,", ti.PointerPreferred)))
+			buf.Write([]byte(fmt.Sprintf("Name:\"%v\",", ti.Name)))
+			buf.Write([]byte(fmt.Sprintf("Disamb:\"%X\",", ti.Disamb)))
+			buf.Write([]byte(fmt.Sprintf("Prefix:\"%X\",", ti.Prefix)))
+		} else {
+			buf.Write([]byte("Registered:false,"))
+		}
+		buf.Write([]byte(fmt.Sprintf("AminoMarshalReprType:\"%v\",", ti.AminoMarshalReprType)))
+		buf.Write([]byte(fmt.Sprintf("AminoUnmarshalReprType:\"%v\",", ti.AminoUnmarshalReprType)))
+		if ti.Type.Kind() == reflect.Struct {
+			buf.Write([]byte(fmt.Sprintf("Fields:%v,", ti.Fields)))
+		}
+	}
+	buf.Write([]byte("}"))
+	return buf.String()
+}
+
+//----------------------------------------
+// Misc.
+
+func isExported(field reflect.StructField) bool {
+	// Test 1:
+	if field.PkgPath != "" {
+		return false
+	}
+	// Test 2:
+	var first rune
+	for _, c := range field.Name {
+		first = c
+		break
+	}
+	// TODO: JAE: I'm not sure that the unicode spec
+	// is the correct spec to use, so this might be wrong.
+	if !unicode.IsUpper(first) {
+		return false
+	}
+	// Ok, it's exported.
+	return true
+}
+
+func nameToDisamb(name string) (db DisambBytes) {
+	db, _ = nameToDisfix(name)
+	return
+}
+
+func nameToPrefix(name string) (pb PrefixBytes) {
+	_, pb = nameToDisfix(name)
+	return
+}
+
+func nameToDisfix(name string) (db DisambBytes, pb PrefixBytes) {
+	hasher := sha256.New()
+	hasher.Write([]byte(name))
+	bz := hasher.Sum(nil)
+	for bz[0] == 0x00 {
+		bz = bz[1:]
+	}
+	copy(db[:], bz[0:3])
+	bz = bz[3:]
+	for bz[0] == 0x00 {
+		bz = bz[1:]
+	}
+	copy(pb[:], bz[0:4])
+	// Drop the last 3 bits to make room for the Typ3.
+	pb[3] &= 0xF8
+	return
+}
+
+func toDisfix(db DisambBytes, pb PrefixBytes) (df DisfixBytes) {
+	copy(df[0:3], db[0:3])
+	copy(df[3:7], pb[0:4])
+	return
+}
+
+func marshalAminoReprType(rm reflect.Method) (rrt reflect.Type) {
+	// Verify form of this method.
+	if rm.Type.NumIn() != 1 {
+		panic(fmt.Sprintf("MarshalAmino should have 1 input parameters (including receiver); got %v", rm.Type))
+	}
+	if rm.Type.NumOut() != 2 {
+		panic(fmt.Sprintf("MarshalAmino should have 2 output parameters; got %v", rm.Type))
+	}
+	if out := rm.Type.Out(1); out != errorType {
+		panic(fmt.Sprintf("MarshalAmino should have second output parameter of error type, got %v", out))
+	}
+	rrt = rm.Type.Out(0)
+	if rrt.Kind() == reflect.Ptr {
+		panic(fmt.Sprintf("Representative objects cannot be pointers; got %v", rrt))
+	}
+	return
+}
+
+func unmarshalAminoReprType(rm reflect.Method) (rrt reflect.Type) {
+	// Verify form of this method.
+	if rm.Type.NumIn() != 2 {
+		panic(fmt.Sprintf("UnmarshalAmino should have 2 input parameters (including receiver); got %v", rm.Type))
+	}
+	if in1 := rm.Type.In(0); in1.Kind() != reflect.Ptr {
+		panic(fmt.Sprintf("UnmarshalAmino first input parameter should be pointer type but got %v", in1))
+	}
+	if rm.Type.NumOut() != 1 {
+		panic(fmt.Sprintf("UnmarshalAmino should have 1 output parameters; got %v", rm.Type))
+	}
+	if out := rm.Type.Out(0); out != errorType {
+		panic(fmt.Sprintf("UnmarshalAmino should have first output parameter of error type, got %v", out))
+	}
+	rrt = rm.Type.In(1)
+	if rrt.Kind() == reflect.Ptr {
+		panic(fmt.Sprintf("Representative objects cannot be pointers; got %v", rrt))
+	}
+	return
+}
diff --git a/vendor/github.com/tendermint/go-amino/decoder.go b/vendor/github.com/tendermint/go-amino/decoder.go
new file mode 100644
index 0000000000000000000000000000000000000000..36a640e8251e9df53cbd5da9874640380232f514
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/decoder.go
@@ -0,0 +1,288 @@
+package amino
+
+import (
+	"encoding/binary"
+	"errors"
+	"fmt"
+	"math"
+	"time"
+)
+
+//----------------------------------------
+// Signed
+
+func DecodeInt8(bz []byte) (i int8, n int, err error) {
+	var i64 = int64(0)
+	i64, n, err = DecodeVarint(bz)
+	if err != nil {
+		return
+	}
+	if i64 > int64(math.MaxInt8) {
+		err = errors.New("EOF decoding int8")
+		return
+	}
+	i = int8(i64)
+	return
+}
+
+func DecodeInt16(bz []byte) (i int16, n int, err error) {
+	var i64 = int64(0)
+	i64, n, err = DecodeVarint(bz)
+	if err != nil {
+		return
+	}
+	if i64 > int64(math.MaxInt16) {
+		err = errors.New("EOF decoding int16")
+		return
+	}
+	i = int16(i64)
+	return
+}
+
+func DecodeInt32(bz []byte) (i int32, n int, err error) {
+	const size int = 4
+	if len(bz) < size {
+		err = errors.New("EOF decoding int32")
+		return
+	}
+	i = int32(binary.BigEndian.Uint32(bz[:size]))
+	n = size
+	return
+}
+
+func DecodeInt64(bz []byte) (i int64, n int, err error) {
+	const size int = 8
+	if len(bz) < size {
+		err = errors.New("EOF decoding int64")
+		return
+	}
+	i = int64(binary.BigEndian.Uint64(bz[:size]))
+	n = size
+	return
+}
+
+func DecodeVarint(bz []byte) (i int64, n int, err error) {
+	i, n = binary.Varint(bz)
+	if n < 0 {
+		n = 0
+		err = errors.New("EOF decoding varint")
+	}
+	return
+}
+
+//----------------------------------------
+// Unsigned
+
+func DecodeByte(bz []byte) (b byte, n int, err error) {
+	return DecodeUint8(bz)
+}
+
+func DecodeUint8(bz []byte) (u uint8, n int, err error) {
+	var u64 = uint64(0)
+	u64, n, err = DecodeUvarint(bz)
+	if err != nil {
+		return
+	}
+	if u64 > uint64(math.MaxUint8) {
+		err = errors.New("EOF decoding uint8")
+		return
+	}
+	u = uint8(u64)
+	return
+}
+func DecodeUint16(bz []byte) (u uint16, n int, err error) {
+	var u64 = uint64(0)
+	u64, n, err = DecodeUvarint(bz)
+	if err != nil {
+		return
+	}
+	if u64 > uint64(math.MaxUint16) {
+		err = errors.New("EOF decoding uint16")
+		return
+	}
+	u = uint16(u64)
+	return
+}
+
+func DecodeUint32(bz []byte) (u uint32, n int, err error) {
+	const size int = 4
+	if len(bz) < size {
+		err = errors.New("EOF decoding uint32")
+		return
+	}
+	u = binary.BigEndian.Uint32(bz[:size])
+	n = size
+	return
+}
+
+func DecodeUint64(bz []byte) (u uint64, n int, err error) {
+	const size int = 8
+	if len(bz) < size {
+		err = errors.New("EOF decoding uint64")
+		return
+	}
+	u = binary.BigEndian.Uint64(bz[:size])
+	n = size
+	return
+}
+
+func DecodeUvarint(bz []byte) (u uint64, n int, err error) {
+	u, n = binary.Uvarint(bz)
+	if n <= 0 {
+		n = 0
+		err = errors.New("EOF decoding uvarint")
+	}
+	return
+}
+
+//----------------------------------------
+// Other
+
+func DecodeBool(bz []byte) (b bool, n int, err error) {
+	const size int = 1
+	if len(bz) < size {
+		err = errors.New("EOF decoding bool")
+		return
+	}
+	switch bz[0] {
+	case 0:
+		b = false
+	case 1:
+		b = true
+	default:
+		err = errors.New("invalid bool")
+	}
+	n = size
+	return
+}
+
+// NOTE: UNSAFE
+func DecodeFloat32(bz []byte) (f float32, n int, err error) {
+	const size int = 4
+	if len(bz) < size {
+		err = errors.New("EOF decoding float32")
+		return
+	}
+	i := binary.BigEndian.Uint32(bz[:size])
+	f = math.Float32frombits(i)
+	n = size
+	return
+}
+
+// NOTE: UNSAFE
+func DecodeFloat64(bz []byte) (f float64, n int, err error) {
+	const size int = 8
+	if len(bz) < size {
+		err = errors.New("EOF decoding float64")
+		return
+	}
+	i := binary.BigEndian.Uint64(bz[:size])
+	f = math.Float64frombits(i)
+	n = size
+	return
+}
+
+// DecodeTime decodes seconds (int64) and nanoseconds (int32) since January 1,
+// 1970 UTC, and returns the corresponding time.  If nanoseconds is not in the
+// range [0, 999999999], or if seconds is too large, the behavior is
+// undefined.
+// TODO return error if behavior is undefined.
+func DecodeTime(bz []byte) (t time.Time, n int, err error) {
+
+	// TODO: This is a temporary measure until we support MarshalAmino/UnmarshalAmino.
+	// Basically, MarshalAmino on time should return a struct.
+	// This is how that struct would be encoded.
+
+	{ // Decode field number 1 and Typ3 (8Byte).
+		var fieldNum, typ, _n = uint32(0), Typ3(0x00), int(0)
+		fieldNum, typ, _n, err = decodeFieldNumberAndTyp3(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		if fieldNum != 1 {
+			err = fmt.Errorf("Expected field number 1, got %v", fieldNum)
+			return
+		}
+		if typ != Typ3_8Byte {
+			err = fmt.Errorf("Expected Typ3 bytes <8Bytes> for time field #1, got %X", typ)
+			return
+		}
+	}
+	// Actually read the Int64.
+	var sec, _n = int64(0), int(0)
+	sec, _n, err = DecodeInt64(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+
+	{ // Decode field number 2 and Typ3 (4Byte).
+		var fieldNum, typ, _n = uint32(0), Typ3(0x00), int(0)
+		fieldNum, typ, _n, err = decodeFieldNumberAndTyp3(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		if fieldNum != 2 {
+			err = fmt.Errorf("Expected field number 2, got %v", fieldNum)
+			return
+		}
+		if typ != Typ3_4Byte {
+			err = fmt.Errorf("Expected Typ3 bytes <4Byte> for time field #2, got %X", typ)
+			return
+		}
+	}
+	// Actually read the Int32.
+	var nsec = int32(0)
+	nsec, _n, err = DecodeInt32(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+	// Validation check.
+	if nsec < 0 || 999999999 < nsec {
+		err = fmt.Errorf("Invalid time, nanoseconds out of bounds %v", nsec)
+		return
+	}
+	{ // Expect "StructTerm" Typ3 byte.
+		var typ, _n = Typ3(0x00), int(0)
+		typ, _n, err = decodeTyp3(bz)
+		if slide(&bz, &n, _n) && err != nil {
+			return
+		}
+		if typ != Typ3_StructTerm {
+			err = errors.New(fmt.Sprintf("Expected StructTerm Typ3 byte for time, got %X", typ))
+			return
+		}
+	}
+	// Construct time.
+	t = time.Unix(sec, int64(nsec))
+	// Strip timezone and monotonic for deep equality.
+	t = t.UTC().Truncate(0)
+	return
+}
+
+func DecodeByteSlice(bz []byte) (bz2 []byte, n int, err error) {
+	var count uint64
+	var _n int
+	count, _n, err = DecodeUvarint(bz)
+	if slide(&bz, &n, _n) && err != nil {
+		return
+	}
+	if int(count) < 0 {
+		err = fmt.Errorf("invalid negative length %v decoding []byte", count)
+		return
+	}
+	if len(bz) < int(count) {
+		err = fmt.Errorf("insufficient bytes decoding []byte of length %v", count)
+		return
+	}
+	bz2 = make([]byte, count)
+	copy(bz2, bz[0:count])
+	n += int(count)
+	return
+}
+
+func DecodeString(bz []byte) (s string, n int, err error) {
+	var bz2 []byte
+	bz2, n, err = DecodeByteSlice(bz)
+	s = string(bz2)
+	return
+}
diff --git a/vendor/github.com/tendermint/go-amino/deep_copy.go b/vendor/github.com/tendermint/go-amino/deep_copy.go
new file mode 100644
index 0000000000000000000000000000000000000000..987a866c6db045b3ac8812f3aee338c7e147a267
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/deep_copy.go
@@ -0,0 +1,253 @@
+package amino
+
+import (
+	"fmt"
+	"reflect"
+)
+
+//----------------------------------------
+// DeepCopy
+
+// Deeply copies an object.
+// If anything implements `.DeepCopy() <any>` along the way,
+// the result of that function will be used.
+// Otherwise, if it implements `.MarshalAmino() (<any>, error)` and
+// `.UnmarshalAmino(<any>) error`, the pair will be used to copy.
+// If .MarshalAmino() or .UnmarshalAmino() returns an error, this
+// function will panic.
+func DeepCopy(o interface{}) (r interface{}) {
+	if o == nil {
+		return nil
+	}
+	src := reflect.ValueOf(o)
+	dst := reflect.New(src.Type()).Elem()
+	deepCopy(src, dst)
+	return dst.Interface()
+}
+
+func deepCopy(src, dst reflect.Value) {
+	if isNil(src) {
+		return
+	}
+	if callDeepCopy(src, dst) {
+		return
+	}
+	if callAminoCopy(src, dst) {
+		return
+	}
+	_deepCopy(src, dst)
+}
+
+func _deepCopy(src, dst reflect.Value) {
+
+	switch src.Kind() {
+	case reflect.Ptr:
+		cpy := reflect.New(src.Type().Elem())
+		_deepCopy(src.Elem(), cpy.Elem())
+		dst.Set(cpy)
+		return
+
+	case reflect.Interface:
+		cpy := reflect.New(src.Elem().Type())
+		deepCopy(src.Elem(), cpy.Elem())
+		dst.Set(cpy.Elem())
+		return
+
+	case reflect.Array:
+		switch src.Type().Elem().Kind() {
+		case reflect.Int64, reflect.Int32, reflect.Int16,
+			reflect.Int8, reflect.Int, reflect.Uint64,
+			reflect.Uint32, reflect.Uint16, reflect.Uint8,
+			reflect.Uint, reflect.Bool, reflect.Float64,
+			reflect.Float32, reflect.String:
+
+			reflect.Copy(dst, src)
+			return
+		default:
+			for i := 0; i < src.Type().Len(); i++ {
+				esrc := src.Index(i)
+				edst := dst.Index(i)
+				deepCopy(esrc, edst)
+			}
+			return
+		}
+
+	case reflect.Slice:
+		switch src.Type().Elem().Kind() {
+		case reflect.Int64, reflect.Int32, reflect.Int16,
+			reflect.Int8, reflect.Int, reflect.Uint64,
+			reflect.Uint32, reflect.Uint16, reflect.Uint8,
+			reflect.Uint, reflect.Bool, reflect.Float64,
+			reflect.Float32, reflect.String:
+
+			cpy := reflect.MakeSlice(
+				src.Type(), src.Len(), src.Len())
+			reflect.Copy(cpy, src)
+			dst.Set(src)
+			return
+		default:
+			cpy := reflect.MakeSlice(
+				src.Type(), src.Len(), src.Len())
+			for i := 0; i < src.Len(); i++ {
+				esrc := src.Index(i)
+				ecpy := cpy.Index(i)
+				deepCopy(esrc, ecpy)
+			}
+			dst.Set(src)
+			return
+		}
+
+	case reflect.Struct:
+		switch src.Type() {
+		case timeType:
+			dst.Set(src)
+			return
+		default:
+			for i := 0; i < src.NumField(); i++ {
+				if !isExported(src.Type().Field(i)) {
+					continue // field is unexported
+				}
+				srcf := src.Field(i)
+				dstf := dst.Field(i)
+				deepCopy(srcf, dstf)
+			}
+			return
+		}
+
+	case reflect.Map:
+		cpy := reflect.MakeMapWithSize(src.Type(), src.Len())
+		keys := src.MapKeys()
+		for _, key := range keys {
+			val := src.MapIndex(key)
+			cpy.SetMapIndex(key, val)
+		}
+		dst.Set(cpy)
+		return
+
+	// Primitive types
+	case reflect.Int64, reflect.Int32, reflect.Int16,
+		reflect.Int8, reflect.Int:
+		dst.SetInt(src.Int())
+	case reflect.Uint64, reflect.Uint32, reflect.Uint16,
+		reflect.Uint8, reflect.Uint:
+		dst.SetUint(src.Uint())
+	case reflect.Bool:
+		dst.SetBool(src.Bool())
+	case reflect.Float64, reflect.Float32:
+		dst.SetFloat(src.Float())
+	case reflect.String:
+		dst.SetString(src.String())
+
+	default:
+		panic(fmt.Sprintf("unsupported type %v", src.Kind()))
+	}
+
+	return
+}
+
+//----------------------------------------
+// misc.
+
+// Call .DeepCopy() method if possible.
+func callDeepCopy(src, dst reflect.Value) bool {
+	dc := src.MethodByName("DeepCopy")
+	if !dc.IsValid() {
+		return false
+	}
+	if dc.Type().NumIn() != 0 {
+		return false
+	}
+	if dc.Type().NumOut() != 1 {
+		return false
+	}
+	otype := dc.Type().Out(0)
+	if dst.Kind() == reflect.Ptr &&
+		dst.Type().Elem() == otype {
+		cpy := reflect.New(dst.Type().Elem())
+		out := dc.Call(nil)[0]
+		cpy.Elem().Set(out)
+		dst.Set(cpy)
+		return true
+	}
+	if dst.Type() == otype {
+		out := dc.Call(nil)[0]
+		dst.Set(out)
+		return true
+	}
+	return false
+}
+
+// Call .MarshalAmino() and .UnmarshalAmino to copy if possible.
+// Panics if .MarshalAmino() or .UnmarshalAmino() return an error.
+// CONTRACT: src and dst are of equal types.
+func callAminoCopy(src, dst reflect.Value) bool {
+	if src.Type() != dst.Type() {
+		panic("should not happen")
+	}
+	if src.Kind() == reflect.Ptr {
+		cpy := reflect.New(src.Type().Elem())
+		dst.Set(cpy)
+	} else if src.CanAddr() {
+		if !dst.CanAddr() {
+			panic("should not happen")
+		}
+		src = src.Addr()
+		dst = dst.Addr()
+	} else {
+		return false
+	}
+	if !canAminoCopy(src) {
+		return false
+	}
+	cpy := reflect.New(src.Type().Elem())
+	dst.Set(cpy)
+	ma := src.MethodByName("MarshalAmino")
+	ua := dst.MethodByName("UnmarshalAmino")
+	outs := ma.Call(nil)
+	repr, err := outs[0], outs[1]
+	if !err.IsNil() {
+		panic(err.Interface())
+	}
+	outs = ua.Call([]reflect.Value{repr})
+	err = outs[0]
+	if !err.IsNil() {
+		panic(err.Interface())
+	}
+	return true
+}
+
+func canAminoCopy(rv reflect.Value) bool {
+	if !rv.MethodByName("UnmarshalAmino").IsValid() {
+		return false
+	}
+	ua := rv.MethodByName("UnmarshalAmino")
+	if !ua.IsValid() {
+		return false
+	}
+	if ua.Type().NumIn() != 1 {
+		return false
+	}
+	if ua.Type().NumOut() != 1 {
+		return false
+	}
+	if ua.Type().Out(0) != errorType {
+		return false
+	}
+	ma := rv.MethodByName("MarshalAmino")
+	if !ma.IsValid() {
+		return false
+	}
+	if ma.Type().NumIn() != 0 {
+		return false
+	}
+	if ma.Type().NumOut() != 2 {
+		return false
+	}
+	if ma.Type().Out(1) != errorType {
+		return false
+	}
+	if ua.Type().In(0) != ma.Type().Out(0) {
+		return false
+	}
+	return true
+}
diff --git a/vendor/github.com/tendermint/go-amino/doc.go b/vendor/github.com/tendermint/go-amino/doc.go
new file mode 100644
index 0000000000000000000000000000000000000000..0a94c1ba5961522cac9afae8d1377b467f93cf62
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/doc.go
@@ -0,0 +1,92 @@
+/*
+
+Amino is an encoding library that can handle interfaces (like protobuf "oneof")
+well.  This is achieved by prefixing bytes before each "concrete type".
+
+A concrete type is some non-interface value (generally a struct) which
+implements the interface to be (de)serialized. Not all structures need to be
+registered as concrete types -- only when they will be stored in interface type
+fields (or interface type slices) do they need to be registered.
+
+
+Registering types
+
+All interfaces and the concrete types that implement them must be registered.
+
+ amino.RegisterInterface((*MyInterface1)(nil), nil)
+ amino.RegisterInterface((*MyInterface2)(nil), nil)
+ amino.RegisterConcrete(MyStruct1{}, "com.tendermint/MyStruct1", nil)
+ amino.RegisterConcrete(MyStruct2{}, "com.tendermint/MyStruct2", nil)
+ amino.RegisterConcrete(&MyStruct3{}, "anythingcangoinhereifitsunique", nil)
+
+Notice that an interface is represented by a nil pointer.
+
+Structures that must be deserialized as pointer values must be registered with
+a pointer value as well.  It's OK to (de)serialize such structures in
+non-pointer (value) form, but when deserializing such structures into an
+interface field, they will always be deserialized as pointers.
+
+
+How it works
+
+All registered concrete types are encoded with leading 4 bytes (called "prefix
+bytes"), even when it's not held in an interface field/element.  In this way,
+Amino ensures that concrete types (almost) always have the same canonical
+representation.  The first byte of the prefix bytes must not be a zero byte, so
+there are 2**(8*4)-2**(8*3) possible values.
+
+When there are 4096 types registered at once, the probability of there being a
+conflict is ~ 0.2%. See https://instacalc.com/51189 for estimation.  This is
+assuming that all registered concrete types have unique natural names (e.g.
+prefixed by a unique entity name such as "com.tendermint/", and not
+"mined/grinded" to produce a particular sequence of "prefix bytes").
+
+TODO Update instacalc.com link with 255/256 since 0x00 is an escape.
+
+Do not mine/grind to produce a particular sequence of prefix bytes, and avoid
+using dependencies that do so.
+
+Since 4 bytes are not sufficient to ensure no conflicts, sometimes it is
+necessary to prepend more than the 4 prefix bytes for disambiguation.  Like the
+prefix bytes, the disambiguation bytes are also computed from the registered
+name of the concrete type.  There are 3 disambiguation bytes, and in binary
+form they always precede the prefix bytes.  The first byte of the
+disambiguation bytes must not be a zero byte, so there are 2**(8*3)-2**(8*2)
+possible values.
+
+ // Sample Amino encoded binary bytes with 4 prefix bytes.
+ > [0xBB 0x9C 0x83 0xDD] [...]
+
+ // Sample Amino encoded binary bytes with 3 disambiguation bytes and 4
+ // prefix bytes.
+ > 0x00 <0xA8 0xFC 0x54> [0xBB 0x9C 0x83 0xDD] [...]
+
+The prefix bytes never start with a zero byte, so the disambiguation bytes are
+escaped with 0x00.
+
+Notice that the 4 prefix bytes always immediately precede the binary encoding
+of the concrete type.
+
+
+Computing prefix bytes
+
+To compute the disambiguation bytes, we take `hash := sha256(concreteTypeName)`,
+and drop the leading 0x00 bytes.
+
+ > hash := sha256("com.tendermint.consensus/MyConcreteName")
+ > hex.EncodeBytes(hash) // 0x{00 00 A8 FC 54 00 00 00 BB 9C 83 DD ...} (example)
+
+In the example above, hash has two leading 0x00 bytes, so we drop them.
+
+ > rest = dropLeadingZeroBytes(hash) // 0x{A8 FC 54 00 00 BB 9C 83 DD ...}
+ > disamb = rest[0:3]
+ > rest = dropLeadingZeroBytes(rest[3:])
+ > prefix = rest[0:4]
+
+The first 3 bytes are called the "disambiguation bytes" (in angle brackets).
+The next 4 bytes are called the "prefix bytes" (in square brackets).
+
+ > <0xA8 0xFC 0x54> [0xBB 0x9C 9x83 9xDD]
+
+*/
+package amino
diff --git a/vendor/github.com/tendermint/go-amino/encoder.go b/vendor/github.com/tendermint/go-amino/encoder.go
new file mode 100644
index 0000000000000000000000000000000000000000..29d6383098f2ff8b49c9c6261f5869a7dfcf9830
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/encoder.go
@@ -0,0 +1,160 @@
+package amino
+
+import (
+	"encoding/binary"
+	"io"
+	"math"
+	"time"
+)
+
+//----------------------------------------
+// Signed
+
+func EncodeInt8(w io.Writer, i int8) (err error) {
+	return EncodeVarint(w, int64(i))
+}
+
+func EncodeInt16(w io.Writer, i int16) (err error) {
+	return EncodeVarint(w, int64(i))
+}
+
+func EncodeInt32(w io.Writer, i int32) (err error) {
+	var buf [4]byte
+	binary.BigEndian.PutUint32(buf[:], uint32(i))
+	_, err = w.Write(buf[:])
+	return
+}
+
+func EncodeInt64(w io.Writer, i int64) (err error) {
+	var buf [8]byte
+	binary.BigEndian.PutUint64(buf[:], uint64(i))
+	_, err = w.Write(buf[:])
+	return err
+}
+
+func EncodeVarint(w io.Writer, i int64) (err error) {
+	var buf [10]byte
+	n := binary.PutVarint(buf[:], i)
+	_, err = w.Write(buf[0:n])
+	return
+}
+
+func VarintSize(i int64) int {
+	var buf [10]byte
+	n := binary.PutVarint(buf[:], i)
+	return n
+}
+
+//----------------------------------------
+// Unsigned
+
+func EncodeByte(w io.Writer, b byte) (err error) {
+	return EncodeUvarint(w, uint64(b))
+}
+
+func EncodeUint8(w io.Writer, u uint8) (err error) {
+	return EncodeUvarint(w, uint64(u))
+}
+
+func EncodeUint16(w io.Writer, u uint16) (err error) {
+	return EncodeUvarint(w, uint64(u))
+}
+
+func EncodeUint32(w io.Writer, u uint32) (err error) {
+	var buf [4]byte
+	binary.BigEndian.PutUint32(buf[:], u)
+	_, err = w.Write(buf[:])
+	return
+}
+
+func EncodeUint64(w io.Writer, u uint64) (err error) {
+	var buf [8]byte
+	binary.BigEndian.PutUint64(buf[:], u)
+	_, err = w.Write(buf[:])
+	return
+}
+
+func EncodeUvarint(w io.Writer, u uint64) (err error) {
+	var buf [10]byte
+	n := binary.PutUvarint(buf[:], u)
+	_, err = w.Write(buf[0:n])
+	return
+}
+
+func UvarintSize(u uint64) int {
+	var buf [10]byte
+	n := binary.PutUvarint(buf[:], u)
+	return n
+}
+
+//----------------------------------------
+// Other
+
+func EncodeBool(w io.Writer, b bool) (err error) {
+	if b {
+		err = EncodeUint8(w, 1) // same as EncodeUvarint(w, 1).
+	} else {
+		err = EncodeUint8(w, 0) // same as EncodeUvarint(w, 0).
+	}
+	return
+}
+
+// NOTE: UNSAFE
+func EncodeFloat32(w io.Writer, f float32) (err error) {
+	return EncodeUint32(w, math.Float32bits(f))
+}
+
+// NOTE: UNSAFE
+func EncodeFloat64(w io.Writer, f float64) (err error) {
+	return EncodeUint64(w, math.Float64bits(f))
+}
+
+// EncodeTime writes the number of seconds (int64) and nanoseconds (int32),
+// with millisecond resolution since January 1, 1970 UTC to the Writer as an
+// Int64.
+// Milliseconds are used to ease compatibility with Javascript,
+// which does not support finer resolution.
+func EncodeTime(w io.Writer, t time.Time) (err error) {
+	var s = t.Unix()
+	var ns = int32(t.Nanosecond()) // this int64 -> int32 is safe.
+
+	// TODO: We are hand-encoding a struct until MarshalAmino/UnmarshalAmino is supported.
+
+	err = encodeFieldNumberAndTyp3(w, 1, Typ3_8Byte)
+	if err != nil {
+		return
+	}
+	err = EncodeInt64(w, s)
+	if err != nil {
+		return
+	}
+
+	err = encodeFieldNumberAndTyp3(w, 2, Typ3_4Byte)
+	if err != nil {
+		return
+	}
+	err = EncodeInt32(w, ns)
+	if err != nil {
+		return
+	}
+
+	err = EncodeByte(w, byte(0x04)) // StructTerm
+	return
+}
+
+func EncodeByteSlice(w io.Writer, bz []byte) (err error) {
+	err = EncodeUvarint(w, uint64(len(bz)))
+	if err != nil {
+		return
+	}
+	_, err = w.Write(bz)
+	return
+}
+
+func ByteSliceSize(bz []byte) int {
+	return UvarintSize(uint64(len(bz))) + len(bz)
+}
+
+func EncodeString(w io.Writer, s string) (err error) {
+	return EncodeByteSlice(w, []byte(s))
+}
diff --git a/vendor/github.com/tendermint/go-amino/json-decode.go b/vendor/github.com/tendermint/go-amino/json-decode.go
new file mode 100644
index 0000000000000000000000000000000000000000..15b70f80946d74505cae721a4faf2a3ba742a9fd
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/json-decode.go
@@ -0,0 +1,533 @@
+package amino
+
+import (
+	"bytes"
+	"encoding/hex"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"reflect"
+
+	"github.com/davecgh/go-spew/spew"
+)
+
+//----------------------------------------
+// cdc.decodeReflectJSON
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectJSON(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if info.Type.Kind() == reflect.Interface && rv.Kind() == reflect.Ptr {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(D) decodeReflectJSON(bz: %s, info: %v, rv: %#v (%v), opts: %v)\n",
+			bz, info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(D) -> err: %v\n", err)
+		}()
+	}
+
+	// Read disfix bytes if registered.
+	if info.Registered {
+		// Strip the disfix bytes after checking it.
+		var disfix DisfixBytes
+		disfix, bz, err = decodeDisfixJSON(bz)
+		if err != nil {
+			return
+		}
+		if !info.GetDisfix().EqualBytes(disfix[:]) {
+			err = fmt.Errorf("Expected disfix bytes %X but got %X", info.GetDisfix(), disfix)
+			return
+		}
+	}
+
+	err = cdc._decodeReflectJSON(bz, info, rv, opts)
+	return
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) _decodeReflectJSON(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if info.Type.Kind() == reflect.Interface && rv.Kind() == reflect.Ptr {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(_) _decodeReflectJSON(bz: %s, info: %v, rv: %#v (%v), opts: %v)\n",
+			bz, info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(_) -> err: %v\n", err)
+		}()
+	}
+
+	// Special case for null for either interface, pointer, slice
+	// NOTE: This doesn't match the binary implementation completely.
+	if nullBytes(bz) {
+		switch rv.Kind() {
+		case reflect.Ptr, reflect.Interface, reflect.Slice, reflect.Array:
+			rv.Set(reflect.Zero(rv.Type()))
+			return
+		}
+	}
+
+	// Dereference-and-construct pointers all the way.
+	// This works for pointer-pointers.
+	for rv.Kind() == reflect.Ptr {
+		if rv.IsNil() {
+			newPtr := reflect.New(rv.Type().Elem())
+			rv.Set(newPtr)
+		}
+		rv = rv.Elem()
+	}
+
+	// Handle override if a pointer to rv implements json.Unmarshaler.
+	if rv.Addr().Type().Implements(jsonUnmarshalerType) {
+		err = rv.Addr().Interface().(json.Unmarshaler).UnmarshalJSON(bz)
+		return
+	}
+
+	// Handle override if a pointer to rv implements UnmarshalAmino.
+	if info.IsAminoUnmarshaler {
+		// First, decode repr instance from bytes.
+		rrv, rinfo := reflect.New(info.AminoUnmarshalReprType).Elem(), (*TypeInfo)(nil)
+		rinfo, err = cdc.getTypeInfo_wlock(info.AminoUnmarshalReprType)
+		if err != nil {
+			return
+		}
+		err = cdc._decodeReflectJSON(bz, rinfo, rrv, opts)
+		if err != nil {
+			return
+		}
+		// Then, decode from repr instance.
+		uwrm := rv.Addr().MethodByName("UnmarshalAmino")
+		uwouts := uwrm.Call([]reflect.Value{rrv})
+		erri := uwouts[0].Interface()
+		if erri != nil {
+			err = erri.(error)
+		}
+		return
+	}
+
+	switch ikind := info.Type.Kind(); ikind {
+
+	//----------------------------------------
+	// Complex
+
+	case reflect.Interface:
+		err = cdc.decodeReflectJSONInterface(bz, info, rv, opts)
+
+	case reflect.Array:
+		err = cdc.decodeReflectJSONArray(bz, info, rv, opts)
+
+	case reflect.Slice:
+		err = cdc.decodeReflectJSONSlice(bz, info, rv, opts)
+
+	case reflect.Struct:
+		err = cdc.decodeReflectJSONStruct(bz, info, rv, opts)
+
+	case reflect.Map:
+		err = cdc.decodeReflectJSONMap(bz, info, rv, opts)
+
+	//----------------------------------------
+	// Signed, Unsigned
+
+	case reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int,
+		reflect.Uint64, reflect.Uint32, reflect.Uint16, reflect.Uint8, reflect.Uint:
+		err = invokeStdlibJSONUnmarshal(bz, rv, opts)
+
+	//----------------------------------------
+	// Misc
+
+	case reflect.Float32, reflect.Float64:
+		if !opts.Unsafe {
+			return errors.New("Amino.JSON float* support requires `amino:\"unsafe\"`.")
+		}
+		fallthrough
+	case reflect.Bool, reflect.String:
+		err = invokeStdlibJSONUnmarshal(bz, rv, opts)
+
+	//----------------------------------------
+	// Default
+
+	default:
+		panic(fmt.Sprintf("unsupported type %v", info.Type.Kind()))
+	}
+
+	return
+}
+
+func invokeStdlibJSONUnmarshal(bz []byte, rv reflect.Value, opts FieldOptions) error {
+	if !rv.CanAddr() && rv.Kind() != reflect.Ptr {
+		panic("rv not addressable nor pointer")
+	}
+
+	var rrv reflect.Value = rv
+	if rv.Kind() != reflect.Ptr {
+		rrv = reflect.New(rv.Type())
+	}
+
+	if err := json.Unmarshal(bz, rrv.Interface()); err != nil {
+		return err
+	}
+	rv.Set(rrv.Elem())
+	return nil
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectJSONInterface(bz []byte, iinfo *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectJSONInterface")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+
+	/*
+		We don't make use of user-provided interface values because there are a
+		lot of edge cases.
+
+		* What if the type is mismatched?
+		* What if the JSON field entry is missing?
+		* Circular references?
+	*/
+	if !rv.IsNil() {
+		// We don't strictly need to set it nil, but lets keep it here for a
+		// while in case we forget, for defensive purposes.
+		rv.Set(iinfo.ZeroValue)
+	}
+
+	// Consume disambiguation / prefix info.
+	disfix, bz, err := decodeDisfixJSON(bz)
+	if err != nil {
+		return
+	}
+
+	// XXX: Check disfix against interface to make sure that it actually
+	// matches, and return an error if it doesn't.
+
+	// NOTE: Unlike decodeReflectBinaryInterface, we already dealt with nil in _decodeReflectJSON.
+	// NOTE: We also "consumed" the disfix wrapper by replacing `bz` above.
+
+	// Get concrete type info.
+	// NOTE: Unlike decodeReflectBinaryInterface, always disfix.
+	var cinfo *TypeInfo
+	cinfo, err = cdc.getTypeInfoFromDisfix_rlock(disfix)
+	if err != nil {
+		return
+	}
+
+	// Construct the concrete type.
+	var crv, irvSet = constructConcreteType(cinfo)
+
+	// Decode into the concrete type.
+	err = cdc._decodeReflectJSON(bz, cinfo, crv, opts)
+	if err != nil {
+		rv.Set(irvSet) // Helps with debugging
+		return
+	}
+
+	// We need to set here, for when !PointerPreferred and the type
+	// is say, an array of bytes (e.g. [32]byte), then we must call
+	// rv.Set() *after* the value was acquired.
+	rv.Set(irvSet)
+	return
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectJSONArray(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectJSONArray")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+	ert := info.Type.Elem()
+	length := info.Type.Len()
+
+	switch ert.Kind() {
+
+	case reflect.Uint8: // Special case: byte array
+		var buf []byte
+		err = json.Unmarshal(bz, &buf)
+		if err != nil {
+			return
+		}
+		if len(buf) != length {
+			err = fmt.Errorf("decodeReflectJSONArray: byte-length mismatch, got %v want %v",
+				len(buf), length)
+		}
+		reflect.Copy(rv, reflect.ValueOf(buf))
+		return
+
+	default: // General case.
+		var einfo *TypeInfo
+		einfo, err = cdc.getTypeInfo_wlock(ert)
+		if err != nil {
+			return
+		}
+
+		// Read into rawSlice.
+		var rawSlice []json.RawMessage
+		if err = json.Unmarshal(bz, &rawSlice); err != nil {
+			return
+		}
+		if len(rawSlice) != length {
+			err = fmt.Errorf("decodeReflectJSONArray: length mismatch, got %v want %v", len(rawSlice), length)
+			return
+		}
+
+		// Decode each item in rawSlice.
+		for i := 0; i < length; i++ {
+			erv := rv.Index(i)
+			ebz := rawSlice[i]
+			err = cdc.decodeReflectJSON(ebz, einfo, erv, opts)
+			if err != nil {
+				return
+			}
+		}
+		return
+	}
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectJSONSlice(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectJSONSlice")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+
+	var ert = info.Type.Elem()
+
+	switch ert.Kind() {
+
+	case reflect.Uint8: // Special case: byte slice
+		err = json.Unmarshal(bz, rv.Addr().Interface())
+		if err != nil {
+			return
+		}
+		if rv.Len() == 0 {
+			// Special case when length is 0.
+			// NOTE: We prefer nil slices.
+			rv.Set(info.ZeroValue)
+		} else {
+			// NOTE: Already set via json.Unmarshal() above.
+		}
+		return
+
+	default: // General case.
+		var einfo *TypeInfo
+		einfo, err = cdc.getTypeInfo_wlock(ert)
+		if err != nil {
+			return
+		}
+
+		// Read into rawSlice.
+		var rawSlice []json.RawMessage
+		if err = json.Unmarshal(bz, &rawSlice); err != nil {
+			return
+		}
+
+		// Special case when length is 0.
+		// NOTE: We prefer nil slices.
+		var length = len(rawSlice)
+		if length == 0 {
+			rv.Set(info.ZeroValue)
+			return
+		}
+
+		// Read into a new slice.
+		var esrt = reflect.SliceOf(ert) // TODO could be optimized.
+		var srv = reflect.MakeSlice(esrt, length, length)
+		for i := 0; i < length; i++ {
+			erv := srv.Index(i)
+			ebz := rawSlice[i]
+			err = cdc.decodeReflectJSON(ebz, einfo, erv, opts)
+			if err != nil {
+				return
+			}
+		}
+
+		// TODO do we need this extra step?
+		rv.Set(srv)
+		return
+	}
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectJSONStruct(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectJSONStruct")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+
+	// Map all the fields(keys) to their blobs/bytes.
+	// NOTE: In decodeReflectBinaryStruct, we don't need to do this,
+	// since fields are encoded in order.
+	var rawMap = make(map[string]json.RawMessage)
+	err = json.Unmarshal(bz, &rawMap)
+	if err != nil {
+		return
+	}
+
+	for _, field := range info.Fields {
+
+		// Get field rv and info.
+		var frv = rv.Field(field.Index)
+		var finfo *TypeInfo
+		finfo, err = cdc.getTypeInfo_wlock(field.Type)
+		if err != nil {
+			return
+		}
+
+		// Get value from rawMap.
+		var valueBytes = rawMap[field.JSONName]
+		if len(valueBytes) == 0 {
+			// TODO: Since the Go stdlib's JSON codec allows case-insensitive
+			// keys perhaps we need to also do case-insensitive lookups here.
+			// So "Vanilla" and "vanilla" would both match to the same field.
+			// It is actually a security flaw with encoding/json library
+			// - See https://github.com/golang/go/issues/14750
+			// but perhaps we are aiming for as much compatibility here.
+			// JAE: I vote we depart from encoding/json, than carry a vuln.
+
+			// Set nil/zero on frv.
+			frv.Set(reflect.Zero(frv.Type()))
+			continue
+		}
+
+		// Decode into field rv.
+		err = cdc.decodeReflectJSON(valueBytes, finfo, frv, opts)
+		if err != nil {
+			return
+		}
+	}
+
+	return nil
+}
+
+// CONTRACT: rv.CanAddr() is true.
+func (cdc *Codec) decodeReflectJSONMap(bz []byte, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.CanAddr() {
+		panic("rv not addressable")
+	}
+	if printLog {
+		fmt.Println("(d) decodeReflectJSONMap")
+		defer func() {
+			fmt.Printf("(d) -> err: %v\n", err)
+		}()
+	}
+
+	// Map all the fields(keys) to their blobs/bytes.
+	// NOTE: In decodeReflectBinaryMap, we don't need to do this,
+	// since fields are encoded in order.
+	var rawMap = make(map[string]json.RawMessage)
+	err = json.Unmarshal(bz, &rawMap)
+	if err != nil {
+		return
+	}
+
+	var krt = rv.Type().Key()
+	if krt.Kind() != reflect.String {
+		err = fmt.Errorf("decodeReflectJSONMap: key type must be string") // TODO also support []byte and maybe others
+		return
+	}
+	var vinfo *TypeInfo
+	vinfo, err = cdc.getTypeInfo_wlock(rv.Type().Elem())
+	if err != nil {
+		return
+	}
+
+	var mrv = reflect.MakeMapWithSize(rv.Type(), len(rawMap))
+	for key, valueBytes := range rawMap {
+
+		// Get map value rv.
+		vrv := reflect.New(mrv.Type().Elem()).Elem()
+
+		// Decode valueBytes into vrv.
+		err = cdc.decodeReflectJSON(valueBytes, vinfo, vrv, opts)
+		if err != nil {
+			return
+		}
+
+		// And set.
+		krv := reflect.New(reflect.TypeOf("")).Elem()
+		krv.SetString(key)
+		mrv.SetMapIndex(krv, vrv)
+	}
+	rv.Set(mrv)
+
+	return nil
+}
+
+//----------------------------------------
+// Misc.
+
+type disfixWrapper struct {
+	Disfix string          `json:"type"`
+	Data   json.RawMessage `json:"value"`
+}
+
+// decodeDisfixJSON helps unravel the disfix and
+// the stored data, which are expected in the form:
+// {
+//    "type": "XXXXXXXXXXXXXXXXX",
+//    "value":  {}
+// }
+func decodeDisfixJSON(bz []byte) (df DisfixBytes, data []byte, err error) {
+	if string(bz) == "null" {
+		panic("yay")
+	}
+	dfw := new(disfixWrapper)
+	err = json.Unmarshal(bz, dfw)
+	if err != nil {
+		err = fmt.Errorf("Cannot parse disfix JSON wrapper: %v", err)
+		return
+	}
+	dfBytes, err := hex.DecodeString(dfw.Disfix)
+	if err != nil {
+		return
+	}
+
+	// Get disfix.
+	if g, w := len(dfBytes), DisfixBytesLen; g != w {
+		err = fmt.Errorf("Disfix length got=%d want=%d data=%s", g, w, bz)
+		return
+	}
+	copy(df[:], dfBytes)
+	if (DisfixBytes{}).EqualBytes(df[:]) {
+		err = errors.New("Unexpected zero disfix in JSON")
+		return
+	}
+
+	// Get data.
+	if len(dfw.Data) == 0 {
+		err = errors.New("Disfix JSON wrapper should have non-empty value field")
+		return
+	}
+	data = dfw.Data
+	return
+}
+
+func nullBytes(b []byte) bool {
+	return bytes.Equal(b, []byte(`null`))
+}
diff --git a/vendor/github.com/tendermint/go-amino/json-encode.go b/vendor/github.com/tendermint/go-amino/json-encode.go
new file mode 100644
index 0000000000000000000000000000000000000000..4ae11f1c207c7b9ec1e0e5931f5c9368c6af35e5
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/json-encode.go
@@ -0,0 +1,478 @@
+package amino
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io"
+	"reflect"
+
+	"github.com/davecgh/go-spew/spew"
+)
+
+//----------------------------------------
+// cdc.encodeReflectJSON
+
+// This is the main entrypoint for encoding all types in json form.  This
+// function calls encodeReflectJSON*, and generally those functions should
+// only call this one, for the disfix wrapper is only written here.
+// NOTE: Unlike encodeReflectBinary, rv may be a pointer.
+// CONTRACT: rv is valid.
+func (cdc *Codec) encodeReflectJSON(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.IsValid() {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(E) encodeReflectJSON(info: %v, rv: %#v (%v), opts: %v)\n",
+			info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(E) -> err: %v\n", err)
+		}()
+	}
+
+	// Write the disfix wrapper if it is a registered concrete type.
+	if info.Registered {
+		// Part 1:
+		disfix := toDisfix(info.Disamb, info.Prefix)
+		err = writeStr(w, _fmt(`{"type":"%X","value":`, disfix))
+		if err != nil {
+			return
+		}
+		// Part 2:
+		defer func() {
+			if err != nil {
+				return
+			}
+			err = writeStr(w, `}`)
+		}()
+	}
+
+	err = cdc._encodeReflectJSON(w, info, rv, opts)
+	return
+}
+
+// NOTE: Unlike _encodeReflectBinary, rv may be a pointer.
+// CONTRACT: rv is valid.
+// CONTRACT: any disfix wrapper has already been written.
+func (cdc *Codec) _encodeReflectJSON(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if !rv.IsValid() {
+		panic("should not happen")
+	}
+	if printLog {
+		spew.Printf("(_) _encodeReflectJSON(info: %v, rv: %#v (%v), opts: %v)\n",
+			info, rv.Interface(), rv.Type(), opts)
+		defer func() {
+			fmt.Printf("(_) -> err: %v\n", err)
+		}()
+	}
+
+	// Dereference value if pointer.
+	var isNilPtr bool
+	rv, _, isNilPtr = derefPointers(rv)
+
+	// Write null if necessary.
+	if isNilPtr {
+		err = writeStr(w, `null`)
+		return
+	}
+
+	// Handle override if rv implements json.Marshaler.
+	if rv.CanAddr() { // Try pointer first.
+		if rv.Addr().Type().Implements(jsonMarshalerType) {
+			err = invokeMarshalJSON(w, rv.Addr())
+			return
+		}
+	} else if rv.Type().Implements(jsonMarshalerType) {
+		err = invokeMarshalJSON(w, rv)
+		return
+	}
+
+	// Handle override if rv implements json.Marshaler.
+	if info.IsAminoMarshaler {
+		// First, encode rv into repr instance.
+		var rrv, rinfo = reflect.Value{}, (*TypeInfo)(nil)
+		rrv, err = toReprObject(rv)
+		if err != nil {
+			return
+		}
+		rinfo, err = cdc.getTypeInfo_wlock(info.AminoMarshalReprType)
+		if err != nil {
+			return
+		}
+		// Then, encode the repr instance.
+		err = cdc._encodeReflectJSON(w, rinfo, rrv, opts)
+		return
+	}
+
+	switch info.Type.Kind() {
+
+	//----------------------------------------
+	// Complex
+
+	case reflect.Interface:
+		return cdc.encodeReflectJSONInterface(w, info, rv, opts)
+
+	case reflect.Array, reflect.Slice:
+		return cdc.encodeReflectJSONList(w, info, rv, opts)
+
+	case reflect.Struct:
+		return cdc.encodeReflectJSONStruct(w, info, rv, opts)
+
+	case reflect.Map:
+		return cdc.encodeReflectJSONMap(w, info, rv, opts)
+
+	//----------------------------------------
+	// Signed, Unsigned
+
+	case reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int,
+		reflect.Uint64, reflect.Uint32, reflect.Uint16, reflect.Uint8, reflect.Uint:
+		return invokeStdlibJSONMarshal(w, rv.Interface())
+
+	//----------------------------------------
+	// Misc
+
+	case reflect.Float64, reflect.Float32:
+		if !opts.Unsafe {
+			return errors.New("Amino.JSON float* support requires `amino:\"unsafe\"`.")
+		}
+		fallthrough
+	case reflect.Bool, reflect.String:
+		return invokeStdlibJSONMarshal(w, rv.Interface())
+
+	//----------------------------------------
+	// Default
+
+	default:
+		panic(fmt.Sprintf("unsupported type %v", info.Type.Kind()))
+	}
+}
+
+func (cdc *Codec) encodeReflectJSONInterface(w io.Writer, iinfo *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectJSONInterface")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+
+	// Special case when rv is nil, just write "null".
+	if rv.IsNil() {
+		err = writeStr(w, `null`)
+		return
+	}
+
+	// Get concrete non-pointer reflect value & type.
+	var crv, isPtr, isNilPtr = derefPointers(rv.Elem())
+	if isPtr && crv.Kind() == reflect.Interface {
+		// See "MARKER: No interface-pointers" in codec.go
+		panic("should not happen")
+	}
+	if isNilPtr {
+		panic(fmt.Sprintf("Illegal nil-pointer of type %v for registered interface %v. "+
+			"For compatibility with other languages, nil-pointer interface values are forbidden.", crv.Type(), iinfo.Type))
+	}
+	var crt = crv.Type()
+
+	// Get *TypeInfo for concrete type.
+	var cinfo *TypeInfo
+	cinfo, err = cdc.getTypeInfo_wlock(crt)
+	if err != nil {
+		return
+	}
+	if !cinfo.Registered {
+		err = fmt.Errorf("Cannot encode unregistered concrete type %v.", crt)
+		return
+	}
+
+	// Write disfix wrapper.
+	// Part 1:
+	disfix := toDisfix(cinfo.Disamb, cinfo.Prefix)
+	err = writeStr(w, _fmt(`{"type":"%X","value":`, disfix))
+	if err != nil {
+		return
+	}
+	// Part 2:
+	defer func() {
+		if err != nil {
+			return
+		}
+		err = writeStr(w, `}`)
+	}()
+
+	// NOTE: In the future, we may write disambiguation bytes
+	// here, if it is only to be written for interface values.
+	// Currently, go-amino JSON *always* writes disfix bytes for
+	// all registered concrete types.
+
+	err = cdc._encodeReflectJSON(w, cinfo, crv, opts)
+	return
+}
+
+func (cdc *Codec) encodeReflectJSONList(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectJSONList")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+
+	// Special case when list is a nil slice, just write "null".
+	// Empty slices and arrays are not encoded as "null".
+	if rv.Kind() == reflect.Slice && rv.IsNil() {
+		err = writeStr(w, `null`)
+		return
+	}
+
+	ert := info.Type.Elem()
+	length := rv.Len()
+
+	switch ert.Kind() {
+
+	case reflect.Uint8: // Special case: byte array
+		// Write bytes in base64.
+		// NOTE: Base64 encoding preserves the exact original number of bytes.
+		// Get readable slice of bytes.
+		bz := []byte(nil)
+		if rv.CanAddr() {
+			bz = rv.Slice(0, length).Bytes()
+		} else {
+			bz = make([]byte, length)
+			reflect.Copy(reflect.ValueOf(bz), rv) // XXX: looks expensive!
+		}
+		jsonBytes := []byte(nil)
+		jsonBytes, err = json.Marshal(bz) // base64 encode
+		if err != nil {
+			return
+		}
+		_, err = w.Write(jsonBytes)
+		return
+
+	default:
+		// Open square bracket.
+		err = writeStr(w, `[`)
+		if err != nil {
+			return
+		}
+
+		// Write elements with comma.
+		var einfo *TypeInfo
+		einfo, err = cdc.getTypeInfo_wlock(ert)
+		if err != nil {
+			return
+		}
+		for i := 0; i < length; i++ {
+			// Get dereferenced element value and info.
+			var erv, _, isNil = derefPointers(rv.Index(i))
+			if isNil {
+				err = writeStr(w, `null`)
+			} else {
+				err = cdc.encodeReflectJSON(w, einfo, erv, opts)
+			}
+			if err != nil {
+				return
+			}
+			// Add a comma if it isn't the last item.
+			if i != length-1 {
+				err = writeStr(w, `,`)
+				if err != nil {
+					return
+				}
+			}
+		}
+
+		// Close square bracket.
+		defer func() {
+			err = writeStr(w, `]`)
+		}()
+		return
+	}
+}
+
+func (cdc *Codec) encodeReflectJSONStruct(w io.Writer, info *TypeInfo, rv reflect.Value, _ FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectJSONStruct")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+
+	// Part 1.
+	err = writeStr(w, `{`)
+	if err != nil {
+		return
+	}
+	// Part 2.
+	defer func() {
+		if err == nil {
+			err = writeStr(w, `}`)
+		}
+	}()
+
+	var writeComma = false
+	for _, field := range info.Fields {
+		// Get dereferenced field value and info.
+		var frv, _, isNil = derefPointers(rv.Field(field.Index))
+		var finfo *TypeInfo
+		finfo, err = cdc.getTypeInfo_wlock(field.Type)
+		if err != nil {
+			return
+		}
+		// If frv is empty and omitempty, skip it.
+		// NOTE: Unlike Amino:binary, we don't skip null fields unless "omitempty".
+		if field.JSONOmitEmpty && isEmpty(frv, field.ZeroValue) {
+			continue
+		}
+		// Now we know we're going to write something.
+		// Add a comma if we need to.
+		if writeComma {
+			err = writeStr(w, `,`)
+			if err != nil {
+				return
+			}
+			writeComma = false
+		}
+		// Write field JSON name.
+		err = invokeStdlibJSONMarshal(w, field.JSONName)
+		if err != nil {
+			return
+		}
+		// Write colon.
+		err = writeStr(w, `:`)
+		if err != nil {
+			return
+		}
+		// Write field value.
+		if isNil {
+			err = writeStr(w, `null`)
+		} else {
+			err = cdc.encodeReflectJSON(w, finfo, frv, field.FieldOptions)
+		}
+		if err != nil {
+			return
+		}
+		writeComma = true
+	}
+	return
+}
+
+// TODO: TEST
+func (cdc *Codec) encodeReflectJSONMap(w io.Writer, info *TypeInfo, rv reflect.Value, opts FieldOptions) (err error) {
+	if printLog {
+		fmt.Println("(e) encodeReflectJSONMap")
+		defer func() {
+			fmt.Printf("(e) -> err: %v\n", err)
+		}()
+	}
+
+	// Part 1.
+	err = writeStr(w, `{`)
+	if err != nil {
+		return
+	}
+	// Part 2.
+	defer func() {
+		if err == nil {
+			err = writeStr(w, `}`)
+		}
+	}()
+
+	// Ensure that the map key type is a string.
+	if rv.Type().Key().Kind() != reflect.String {
+		err = errors.New("encodeReflectJSONMap: map key type must be a string")
+		return
+	}
+
+	var writeComma = false
+	for _, krv := range rv.MapKeys() {
+		// Get dereferenced object value and info.
+		var vrv, _, isNil = derefPointers(rv.MapIndex(krv))
+
+		// Add a comma if we need to.
+		if writeComma {
+			err = writeStr(w, `,`)
+			if err != nil {
+				return
+			}
+			writeComma = false
+		}
+		// Write field name.
+		err = invokeStdlibJSONMarshal(w, krv.Interface())
+		if err != nil {
+			return
+		}
+		// Write colon.
+		err = writeStr(w, `:`)
+		if err != nil {
+			return
+		}
+		// Write field value.
+		if isNil {
+			err = writeStr(w, `null`)
+		} else {
+			var vinfo *TypeInfo
+			vinfo, err = cdc.getTypeInfo_wlock(vrv.Type())
+			if err != nil {
+				return
+			}
+			err = cdc.encodeReflectJSON(w, vinfo, vrv, opts) // pass through opts
+		}
+		if err != nil {
+			return
+		}
+		writeComma = true
+	}
+	return
+
+}
+
+//----------------------------------------
+// Misc.
+
+// CONTRACT: rv implements json.Marshaler.
+func invokeMarshalJSON(w io.Writer, rv reflect.Value) error {
+	blob, err := rv.Interface().(json.Marshaler).MarshalJSON()
+	if err != nil {
+		return err
+	}
+	_, err = w.Write(blob)
+	return err
+}
+
+func invokeStdlibJSONMarshal(w io.Writer, v interface{}) error {
+	// Note: Please don't stream out the output because that adds a newline
+	// using json.NewEncoder(w).Encode(data)
+	// as per https://golang.org/pkg/encoding/json/#Encoder.Encode
+	blob, err := json.Marshal(v)
+	if err != nil {
+		return err
+	}
+	_, err = w.Write(blob)
+	return err
+}
+
+func writeStr(w io.Writer, s string) (err error) {
+	_, err = w.Write([]byte(s))
+	return
+}
+
+func _fmt(s string, args ...interface{}) string {
+	return fmt.Sprintf(s, args...)
+}
+
+// For json:",omitempty".
+// Returns true for zero values, but also non-nil zero-length slices and strings.
+func isEmpty(rv reflect.Value, zrv reflect.Value) bool {
+	if !rv.IsValid() {
+		return true
+	}
+	if reflect.DeepEqual(rv.Interface(), zrv.Interface()) {
+		return true
+	}
+	switch rv.Kind() {
+	case reflect.Slice, reflect.Array, reflect.String:
+		if rv.Len() == 0 {
+			return true
+		}
+	}
+	return false
+}
diff --git a/vendor/github.com/tendermint/go-amino/reflect.go b/vendor/github.com/tendermint/go-amino/reflect.go
new file mode 100644
index 0000000000000000000000000000000000000000..981575239847d5eb44ad51a198a7ab6250226938
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/reflect.go
@@ -0,0 +1,192 @@
+package amino
+
+import (
+	"encoding/json"
+	"fmt"
+	"reflect"
+	"time"
+)
+
+//----------------------------------------
+// Constants
+
+const printLog = false
+const RFC3339Millis = "2006-01-02T15:04:05.000Z" // forced microseconds
+
+var (
+	timeType            = reflect.TypeOf(time.Time{})
+	jsonMarshalerType   = reflect.TypeOf(new(json.Marshaler)).Elem()
+	jsonUnmarshalerType = reflect.TypeOf(new(json.Unmarshaler)).Elem()
+	errorType           = reflect.TypeOf(new(error)).Elem()
+)
+
+//----------------------------------------
+// encode: see binary-encode.go and json-encode.go
+// decode: see binary-decode.go and json-decode.go
+
+//----------------------------------------
+// Misc.
+
+func getTypeFromPointer(ptr interface{}) reflect.Type {
+	rt := reflect.TypeOf(ptr)
+	if rt.Kind() != reflect.Ptr {
+		panic(fmt.Sprintf("expected pointer, got %v", rt))
+	}
+	return rt.Elem()
+}
+
+func checkUnsafe(field FieldInfo) {
+	if field.Unsafe {
+		return
+	}
+	switch field.Type.Kind() {
+	case reflect.Float32, reflect.Float64:
+		panic("floating point types are unsafe for go-amino")
+	}
+}
+
+// CONTRACT: by the time this is called, len(bz) >= _n
+// Returns true so you can write one-liners.
+func slide(bz *[]byte, n *int, _n int) bool {
+	if _n < 0 || _n > len(*bz) {
+		panic(fmt.Sprintf("impossible slide: len:%v _n:%v", len(*bz), _n))
+	}
+	*bz = (*bz)[_n:]
+	*n += _n
+	return true
+}
+
+// Dereference pointer recursively.
+// drv: the final non-pointer value (which may be invalid).
+// isPtr: whether rv.Kind() == reflect.Ptr.
+// isNilPtr: whether a nil pointer at any level.
+func derefPointers(rv reflect.Value) (drv reflect.Value, isPtr bool, isNilPtr bool) {
+	for rv.Kind() == reflect.Ptr {
+		isPtr = true
+		if rv.IsNil() {
+			isNilPtr = true
+			return
+		}
+		rv = rv.Elem()
+	}
+	drv = rv
+	return
+}
+
+// Returns isVoid=true iff is ultimately nil or empty after (recursive) dereferencing.
+// If isVoid=false, erv is set to the non-nil non-empty valid dereferenced value.
+func isVoid(rv reflect.Value) (erv reflect.Value, isVoid bool) {
+	rv, _, isNilPtr := derefPointers(rv)
+	if isNilPtr {
+		return rv, true
+	} else {
+		switch rv.Kind() {
+		case reflect.String:
+			return rv, rv.Len() == 0
+		case reflect.Chan, reflect.Map, reflect.Slice:
+			return rv, rv.IsNil() || rv.Len() == 0
+		case reflect.Func, reflect.Interface:
+			return rv, rv.IsNil()
+		default:
+			return rv, false
+		}
+	}
+}
+
+func isNil(rv reflect.Value) bool {
+	switch rv.Kind() {
+	case reflect.Interface, reflect.Chan, reflect.Func, reflect.Map, reflect.Ptr, reflect.Slice:
+		return rv.IsNil()
+	default:
+		return false
+	}
+}
+
+// constructConcreteType creates the concrete value as
+// well as the corresponding settable value for it.
+// Return irvSet which should be set on caller's interface rv.
+func constructConcreteType(cinfo *TypeInfo) (crv, irvSet reflect.Value) {
+	// Construct new concrete type.
+	if cinfo.PointerPreferred {
+		cPtrRv := reflect.New(cinfo.Type)
+		crv = cPtrRv.Elem()
+		irvSet = cPtrRv
+	} else {
+		crv = reflect.New(cinfo.Type).Elem()
+		irvSet = crv
+	}
+	return
+}
+
+// Like typeToTyp4 but include a pointer bit.
+func typeToTyp4(rt reflect.Type, opts FieldOptions) (typ Typ4) {
+
+	// Dereference pointer type.
+	var pointer = false
+	for rt.Kind() == reflect.Ptr {
+		pointer = true
+		rt = rt.Elem()
+	}
+
+	// Call actual logic.
+	typ = Typ4(typeToTyp3(rt, opts))
+
+	// Set pointer bit to 1 if pointer.
+	if pointer {
+		typ |= Typ4_Pointer
+	}
+	return
+}
+
+// CONTRACT: rt.Kind() != reflect.Ptr
+func typeToTyp3(rt reflect.Type, opts FieldOptions) Typ3 {
+	switch rt.Kind() {
+	case reflect.Interface:
+		return Typ3_Interface
+	case reflect.Array, reflect.Slice:
+		ert := rt.Elem()
+		switch ert.Kind() {
+		case reflect.Uint8:
+			return Typ3_ByteLength
+		default:
+			return Typ3_List
+		}
+	case reflect.String:
+		return Typ3_ByteLength
+	case reflect.Struct, reflect.Map:
+		return Typ3_Struct
+	case reflect.Int64, reflect.Uint64:
+		if opts.BinVarint {
+			return Typ3_Varint
+		}
+		return Typ3_8Byte
+	case reflect.Float64:
+		return Typ3_8Byte
+	case reflect.Int32, reflect.Uint32, reflect.Float32:
+		return Typ3_4Byte
+	case reflect.Int16, reflect.Int8, reflect.Int,
+		reflect.Uint16, reflect.Uint8, reflect.Uint, reflect.Bool:
+		return Typ3_Varint
+	default:
+		panic(fmt.Sprintf("unsupported field type %v", rt))
+	}
+}
+
+func toReprObject(rv reflect.Value) (rrv reflect.Value, err error) {
+	var mwrm reflect.Value
+	if rv.CanAddr() {
+		mwrm = rv.Addr().MethodByName("MarshalAmino")
+	} else {
+		mwrm = rv.MethodByName("MarshalAmino")
+	}
+	mwouts := mwrm.Call(nil)
+	if !mwouts[1].IsNil() {
+		erri := mwouts[1].Interface()
+		if erri != nil {
+			err = erri.(error)
+			return
+		}
+	}
+	rrv = mwouts[0]
+	return
+}
diff --git a/vendor/github.com/tendermint/go-amino/version.go b/vendor/github.com/tendermint/go-amino/version.go
new file mode 100644
index 0000000000000000000000000000000000000000..7f84d3a4a87bea146463abfc74b7f95bd5908460
--- /dev/null
+++ b/vendor/github.com/tendermint/go-amino/version.go
@@ -0,0 +1,4 @@
+package amino
+
+// Version
+const Version = "0.9.9"
\ No newline at end of file
diff --git a/vendor/github.com/tendermint/go-crypto/amino.go b/vendor/github.com/tendermint/go-crypto/amino.go
new file mode 100644
index 0000000000000000000000000000000000000000..89636895ad5c2247325075baf7b850add469458a
--- /dev/null
+++ b/vendor/github.com/tendermint/go-crypto/amino.go
@@ -0,0 +1,36 @@
+package crypto
+
+import (
+	amino "github.com/tendermint/go-amino"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	// NOTE: It's important that there be no conflicts here,
+	// as that would change the canonical representations,
+	// and therefore change the address.
+	// TODO: Add feature to go-amino to ensure that there
+	// are no conflicts.
+	RegisterAmino(cdc)
+}
+
+func RegisterAmino(cdc *amino.Codec) {
+	cdc.RegisterInterface((*PubKey)(nil), nil)
+	cdc.RegisterConcrete(PubKeyEd25519{},
+		"tendermint/PubKeyEd25519", nil)
+	cdc.RegisterConcrete(PubKeySecp256k1{},
+		"tendermint/PubKeySecp256k1", nil)
+
+	cdc.RegisterInterface((*PrivKey)(nil), nil)
+	cdc.RegisterConcrete(PrivKeyEd25519{},
+		"tendermint/PrivKeyEd25519", nil)
+	cdc.RegisterConcrete(PrivKeySecp256k1{},
+		"tendermint/PrivKeySecp256k1", nil)
+
+	cdc.RegisterInterface((*Signature)(nil), nil)
+	cdc.RegisterConcrete(SignatureEd25519{},
+		"tendermint/SignatureKeyEd25519", nil)
+	cdc.RegisterConcrete(SignatureSecp256k1{},
+		"tendermint/SignatureKeySecp256k1", nil)
+}
diff --git a/vendor/github.com/tendermint/go-crypto/crypto.go b/vendor/github.com/tendermint/go-crypto/crypto.go
deleted file mode 100644
index d9caf1ad9073dab15f5900518ae9c3b0111b0175..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/go-crypto/crypto.go
+++ /dev/null
@@ -1,9 +0,0 @@
-package crypto
-
-// Types of implementations
-const (
-	TypeEd25519   = byte(0x01)
-	TypeSecp256k1 = byte(0x02)
-	NameEd25519   = "ed25519"
-	NameSecp256k1 = "secp256k1"
-)
diff --git a/vendor/github.com/tendermint/go-crypto/priv_key.go b/vendor/github.com/tendermint/go-crypto/priv_key.go
index 11dcb686fda5386d0029f800e761f7b36731c64c..61d373f60c6fa737769a97683b203d68d31b8775 100644
--- a/vendor/github.com/tendermint/go-crypto/priv_key.go
+++ b/vendor/github.com/tendermint/go-crypto/priv_key.go
@@ -6,90 +6,60 @@ import (
 	secp256k1 "github.com/btcsuite/btcd/btcec"
 	"github.com/tendermint/ed25519"
 	"github.com/tendermint/ed25519/extra25519"
-	"github.com/tendermint/go-wire"
-	data "github.com/tendermint/go-wire/data"
 	. "github.com/tendermint/tmlibs/common"
 )
 
 func PrivKeyFromBytes(privKeyBytes []byte) (privKey PrivKey, err error) {
-	err = wire.ReadBinaryBytes(privKeyBytes, &privKey)
-	if err == nil {
-		// add support for a ValidateKey method on PrivKeys
-		// to make sure they load correctly
-		val, ok := privKey.Unwrap().(validatable)
-		if ok {
-			err = val.ValidateKey()
-		}
-	}
+	err = cdc.UnmarshalBinaryBare(privKeyBytes, &privKey)
 	return
 }
 
-// validatable is an optional interface for keys that want to
-// check integrity
-type validatable interface {
-	ValidateKey() error
-}
-
 //----------------------------------------
 
-// DO NOT USE THIS INTERFACE.
-// You probably want to use PrivKey
-// +gen wrapper:"PrivKey,Impl[PrivKeyEd25519,PrivKeySecp256k1],ed25519,secp256k1"
-type PrivKeyInner interface {
-	AssertIsPrivKeyInner()
+type PrivKey interface {
 	Bytes() []byte
 	Sign(msg []byte) Signature
 	PubKey() PubKey
 	Equals(PrivKey) bool
-	Wrap() PrivKey
 }
 
 //-------------------------------------
 
-var _ PrivKeyInner = PrivKeyEd25519{}
+var _ PrivKey = PrivKeyEd25519{}
 
 // Implements PrivKey
 type PrivKeyEd25519 [64]byte
 
-func (privKey PrivKeyEd25519) AssertIsPrivKeyInner() {}
-
 func (privKey PrivKeyEd25519) Bytes() []byte {
-	return wire.BinaryBytes(PrivKey{privKey})
+	bz, err := cdc.MarshalBinaryBare(privKey)
+	if err != nil {
+		panic(err)
+	}
+	return bz
 }
 
 func (privKey PrivKeyEd25519) Sign(msg []byte) Signature {
 	privKeyBytes := [64]byte(privKey)
 	signatureBytes := ed25519.Sign(&privKeyBytes, msg)
-	return SignatureEd25519(*signatureBytes).Wrap()
+	return SignatureEd25519(*signatureBytes)
 }
 
 func (privKey PrivKeyEd25519) PubKey() PubKey {
 	privKeyBytes := [64]byte(privKey)
 	pubBytes := *ed25519.MakePublicKey(&privKeyBytes)
-	return PubKeyEd25519(pubBytes).Wrap()
+	return PubKeyEd25519(pubBytes)
 }
 
 // Equals - you probably don't need to use this.
 // Runs in constant time based on length of the keys.
 func (privKey PrivKeyEd25519) Equals(other PrivKey) bool {
-	if otherEd, ok := other.Unwrap().(PrivKeyEd25519); ok {
+	if otherEd, ok := other.(PrivKeyEd25519); ok {
 		return subtle.ConstantTimeCompare(privKey[:], otherEd[:]) == 1
 	} else {
 		return false
 	}
 }
 
-func (p PrivKeyEd25519) MarshalJSON() ([]byte, error) {
-	return data.Encoder.Marshal(p[:])
-}
-
-func (p *PrivKeyEd25519) UnmarshalJSON(enc []byte) error {
-	var ref []byte
-	err := data.Encoder.Unmarshal(&ref, enc)
-	copy(p[:], ref)
-	return err
-}
-
 func (privKey PrivKeyEd25519) ToCurve25519() *[32]byte {
 	keyCurve25519 := new([32]byte)
 	privKeyBytes := [64]byte(privKey)
@@ -97,16 +67,22 @@ func (privKey PrivKeyEd25519) ToCurve25519() *[32]byte {
 	return keyCurve25519
 }
 
+/*
 func (privKey PrivKeyEd25519) String() string {
 	return Fmt("PrivKeyEd25519{*****}")
 }
+*/
 
 // Deterministically generates new priv-key bytes from key.
 func (privKey PrivKeyEd25519) Generate(index int) PrivKeyEd25519 {
-	newBytes := wire.BinarySha256(struct {
+	bz, err := cdc.MarshalBinaryBare(struct {
 		PrivKey [64]byte
 		Index   int
 	}{privKey, index})
+	if err != nil {
+		panic(err)
+	}
+	newBytes := Sha256(bz)
 	var newKey [64]byte
 	copy(newKey[:], newBytes)
 	return PrivKeyEd25519(newKey)
@@ -131,15 +107,17 @@ func GenPrivKeyEd25519FromSecret(secret []byte) PrivKeyEd25519 {
 
 //-------------------------------------
 
-var _ PrivKeyInner = PrivKeySecp256k1{}
+var _ PrivKey = PrivKeySecp256k1{}
 
 // Implements PrivKey
 type PrivKeySecp256k1 [32]byte
 
-func (privKey PrivKeySecp256k1) AssertIsPrivKeyInner() {}
-
 func (privKey PrivKeySecp256k1) Bytes() []byte {
-	return wire.BinaryBytes(PrivKey{privKey})
+	bz, err := cdc.MarshalBinaryBare(privKey)
+	if err != nil {
+		panic(err)
+	}
+	return bz
 }
 
 func (privKey PrivKeySecp256k1) Sign(msg []byte) Signature {
@@ -148,45 +126,36 @@ func (privKey PrivKeySecp256k1) Sign(msg []byte) Signature {
 	if err != nil {
 		PanicSanity(err)
 	}
-	return SignatureSecp256k1(sig__.Serialize()).Wrap()
+	return SignatureSecp256k1(sig__.Serialize())
 }
 
 func (privKey PrivKeySecp256k1) PubKey() PubKey {
 	_, pub__ := secp256k1.PrivKeyFromBytes(secp256k1.S256(), privKey[:])
 	var pub PubKeySecp256k1
 	copy(pub[:], pub__.SerializeCompressed())
-	return pub.Wrap()
+	return pub
 }
 
 // Equals - you probably don't need to use this.
 // Runs in constant time based on length of the keys.
 func (privKey PrivKeySecp256k1) Equals(other PrivKey) bool {
-	if otherSecp, ok := other.Unwrap().(PrivKeySecp256k1); ok {
+	if otherSecp, ok := other.(PrivKeySecp256k1); ok {
 		return subtle.ConstantTimeCompare(privKey[:], otherSecp[:]) == 1
 	} else {
 		return false
 	}
 }
 
-func (p PrivKeySecp256k1) MarshalJSON() ([]byte, error) {
-	return data.Encoder.Marshal(p[:])
-}
-
-func (p *PrivKeySecp256k1) UnmarshalJSON(enc []byte) error {
-	var ref []byte
-	err := data.Encoder.Unmarshal(&ref, enc)
-	copy(p[:], ref)
-	return err
-}
-
+/*
 func (privKey PrivKeySecp256k1) String() string {
 	return Fmt("PrivKeySecp256k1{*****}")
 }
+*/
 
 /*
 // Deterministically generates new priv-key bytes from key.
 func (key PrivKeySecp256k1) Generate(index int) PrivKeySecp256k1 {
-	newBytes := wire.BinarySha256(struct {
+	newBytes := cdc.BinarySha256(struct {
 		PrivKey [64]byte
 		Index   int
 	}{key, index})
diff --git a/vendor/github.com/tendermint/go-crypto/privkeyinner_wrapper.go b/vendor/github.com/tendermint/go-crypto/privkeyinner_wrapper.go
deleted file mode 100644
index 05ce69672190ee9a5b9fa77d7c25eccf62a92bf3..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/go-crypto/privkeyinner_wrapper.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Generated by: main
-// TypeWriter: wrapper
-// Directive: +gen on PrivKeyInner
-
-package crypto
-
-import (
-	"github.com/tendermint/go-wire/data"
-)
-
-// Auto-generated adapters for happily unmarshaling interfaces
-// Apache License 2.0
-// Copyright (c) 2017 Ethan Frey (ethan.frey@tendermint.com)
-
-type PrivKey struct {
-	PrivKeyInner "json:\"unwrap\""
-}
-
-var PrivKeyMapper = data.NewMapper(PrivKey{})
-
-func (h PrivKey) MarshalJSON() ([]byte, error) {
-	return PrivKeyMapper.ToJSON(h.PrivKeyInner)
-}
-
-func (h *PrivKey) UnmarshalJSON(data []byte) (err error) {
-	parsed, err := PrivKeyMapper.FromJSON(data)
-	if err == nil && parsed != nil {
-		h.PrivKeyInner = parsed.(PrivKeyInner)
-	}
-	return err
-}
-
-// Unwrap recovers the concrete interface safely (regardless of levels of embeds)
-func (h PrivKey) Unwrap() PrivKeyInner {
-	hi := h.PrivKeyInner
-	for wrap, ok := hi.(PrivKey); ok; wrap, ok = hi.(PrivKey) {
-		hi = wrap.PrivKeyInner
-	}
-	return hi
-}
-
-func (h PrivKey) Empty() bool {
-	return h.PrivKeyInner == nil
-}
-
-/*** below are bindings for each implementation ***/
-
-func init() {
-	PrivKeyMapper.RegisterImplementation(PrivKeyEd25519{}, "ed25519", 0x1)
-}
-
-func (hi PrivKeyEd25519) Wrap() PrivKey {
-	return PrivKey{hi}
-}
-
-func init() {
-	PrivKeyMapper.RegisterImplementation(PrivKeySecp256k1{}, "secp256k1", 0x2)
-}
-
-func (hi PrivKeySecp256k1) Wrap() PrivKey {
-	return PrivKey{hi}
-}
diff --git a/vendor/github.com/tendermint/go-crypto/pub_key.go b/vendor/github.com/tendermint/go-crypto/pub_key.go
index 32c0b32379058da4b21cd0298323b683a9d389d1..9be64acdf49d16ea2cf5e997bd68e1b9f0d6dc9b 100644
--- a/vendor/github.com/tendermint/go-crypto/pub_key.go
+++ b/vendor/github.com/tendermint/go-crypto/pub_key.go
@@ -8,8 +8,6 @@ import (
 	secp256k1 "github.com/btcsuite/btcd/btcec"
 	"github.com/tendermint/ed25519"
 	"github.com/tendermint/ed25519/extra25519"
-	"github.com/tendermint/go-wire"
-	data "github.com/tendermint/go-wire/data"
 	cmn "github.com/tendermint/tmlibs/common"
 	"golang.org/x/crypto/ripemd160"
 )
@@ -20,56 +18,44 @@ import (
 type Address = cmn.HexBytes
 
 func PubKeyFromBytes(pubKeyBytes []byte) (pubKey PubKey, err error) {
-	if err := wire.ReadBinaryBytes(pubKeyBytes, &pubKey); err != nil {
-		return PubKey{}, err
-	}
-	return pubKey, nil
+	err = cdc.UnmarshalBinaryBare(pubKeyBytes, &pubKey)
+	return
 }
 
 //----------------------------------------
 
-// DO NOT USE THIS INTERFACE.
-// You probably want to use PubKey
-// +gen wrapper:"PubKey,Impl[PubKeyEd25519,PubKeySecp256k1],ed25519,secp256k1"
-type PubKeyInner interface {
-	AssertIsPubKeyInner()
+type PubKey interface {
 	Address() Address
 	Bytes() []byte
-	KeyString() string
 	VerifyBytes(msg []byte, sig Signature) bool
 	Equals(PubKey) bool
-	Wrap() PubKey
 }
 
 //-------------------------------------
 
-var _ PubKeyInner = PubKeyEd25519{}
+var _ PubKey = PubKeyEd25519{}
 
 // Implements PubKeyInner
 type PubKeyEd25519 [32]byte
 
-func (pubKey PubKeyEd25519) AssertIsPubKeyInner() {}
-
 func (pubKey PubKeyEd25519) Address() Address {
-	w, n, err := new(bytes.Buffer), new(int), new(error)
-	wire.WriteBinary(pubKey[:], w, n, err)
-	if *err != nil {
-		panic(*err)
-	}
 	// append type byte
-	encodedPubkey := append([]byte{TypeEd25519}, w.Bytes()...)
 	hasher := ripemd160.New()
-	hasher.Write(encodedPubkey) // does not error
+	hasher.Write(pubKey.Bytes()) // does not error
 	return Address(hasher.Sum(nil))
 }
 
 func (pubKey PubKeyEd25519) Bytes() []byte {
-	return wire.BinaryBytes(PubKey{pubKey})
+	bz, err := cdc.MarshalBinaryBare(pubKey)
+	if err != nil {
+		panic(err)
+	}
+	return bz
 }
 
 func (pubKey PubKeyEd25519) VerifyBytes(msg []byte, sig_ Signature) bool {
 	// make sure we use the same algorithm to sign
-	sig, ok := sig_.Unwrap().(SignatureEd25519)
+	sig, ok := sig_.(SignatureEd25519)
 	if !ok {
 		return false
 	}
@@ -78,17 +64,6 @@ func (pubKey PubKeyEd25519) VerifyBytes(msg []byte, sig_ Signature) bool {
 	return ed25519.Verify(&pubKeyBytes, msg, &sigBytes)
 }
 
-func (p PubKeyEd25519) MarshalJSON() ([]byte, error) {
-	return data.Encoder.Marshal(p[:])
-}
-
-func (p *PubKeyEd25519) UnmarshalJSON(enc []byte) error {
-	var ref []byte
-	err := data.Encoder.Unmarshal(&ref, enc)
-	copy(p[:], ref)
-	return err
-}
-
 // For use with golang/crypto/nacl/box
 // If error, returns nil.
 func (pubKey PubKeyEd25519) ToCurve25519() *[32]byte {
@@ -104,14 +79,8 @@ func (pubKey PubKeyEd25519) String() string {
 	return fmt.Sprintf("PubKeyEd25519{%X}", pubKey[:])
 }
 
-// Must return the full bytes in hex.
-// Used for map keying, etc.
-func (pubKey PubKeyEd25519) KeyString() string {
-	return fmt.Sprintf("%X", pubKey[:])
-}
-
 func (pubKey PubKeyEd25519) Equals(other PubKey) bool {
-	if otherEd, ok := other.Unwrap().(PubKeyEd25519); ok {
+	if otherEd, ok := other.(PubKeyEd25519); ok {
 		return bytes.Equal(pubKey[:], otherEd[:])
 	} else {
 		return false
@@ -120,15 +89,13 @@ func (pubKey PubKeyEd25519) Equals(other PubKey) bool {
 
 //-------------------------------------
 
-var _ PubKeyInner = PubKeySecp256k1{}
+var _ PubKey = PubKeySecp256k1{}
 
 // Implements PubKey.
 // Compressed pubkey (just the x-cord),
 // prefixed with 0x02 or 0x03, depending on the y-cord.
 type PubKeySecp256k1 [33]byte
 
-func (pubKey PubKeySecp256k1) AssertIsPubKeyInner() {}
-
 // Implements Bitcoin style addresses: RIPEMD160(SHA256(pubkey))
 func (pubKey PubKeySecp256k1) Address() Address {
 	hasherSHA256 := sha256.New()
@@ -141,12 +108,16 @@ func (pubKey PubKeySecp256k1) Address() Address {
 }
 
 func (pubKey PubKeySecp256k1) Bytes() []byte {
-	return wire.BinaryBytes(PubKey{pubKey})
+	bz, err := cdc.MarshalBinaryBare(pubKey)
+	if err != nil {
+		panic(err)
+	}
+	return bz
 }
 
 func (pubKey PubKeySecp256k1) VerifyBytes(msg []byte, sig_ Signature) bool {
 	// and assert same algorithm to sign and verify
-	sig, ok := sig_.Unwrap().(SignatureSecp256k1)
+	sig, ok := sig_.(SignatureSecp256k1)
 	if !ok {
 		return false
 	}
@@ -162,29 +133,12 @@ func (pubKey PubKeySecp256k1) VerifyBytes(msg []byte, sig_ Signature) bool {
 	return sig__.Verify(Sha256(msg), pub__)
 }
 
-func (p PubKeySecp256k1) MarshalJSON() ([]byte, error) {
-	return data.Encoder.Marshal(p[:])
-}
-
-func (p *PubKeySecp256k1) UnmarshalJSON(enc []byte) error {
-	var ref []byte
-	err := data.Encoder.Unmarshal(&ref, enc)
-	copy(p[:], ref)
-	return err
-}
-
 func (pubKey PubKeySecp256k1) String() string {
 	return fmt.Sprintf("PubKeySecp256k1{%X}", pubKey[:])
 }
 
-// Must return the full bytes in hex.
-// Used for map keying, etc.
-func (pubKey PubKeySecp256k1) KeyString() string {
-	return fmt.Sprintf("%X", pubKey[:])
-}
-
 func (pubKey PubKeySecp256k1) Equals(other PubKey) bool {
-	if otherSecp, ok := other.Unwrap().(PubKeySecp256k1); ok {
+	if otherSecp, ok := other.(PubKeySecp256k1); ok {
 		return bytes.Equal(pubKey[:], otherSecp[:])
 	} else {
 		return false
diff --git a/vendor/github.com/tendermint/go-crypto/pubkeyinner_wrapper.go b/vendor/github.com/tendermint/go-crypto/pubkeyinner_wrapper.go
deleted file mode 100644
index 7b36c324d52ad265cf8dc263f9d1099369cb3251..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/go-crypto/pubkeyinner_wrapper.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Generated by: main
-// TypeWriter: wrapper
-// Directive: +gen on PubKeyInner
-
-package crypto
-
-import (
-	"github.com/tendermint/go-wire/data"
-)
-
-// Auto-generated adapters for happily unmarshaling interfaces
-// Apache License 2.0
-// Copyright (c) 2017 Ethan Frey (ethan.frey@tendermint.com)
-
-type PubKey struct {
-	PubKeyInner "json:\"unwrap\""
-}
-
-var PubKeyMapper = data.NewMapper(PubKey{})
-
-func (h PubKey) MarshalJSON() ([]byte, error) {
-	return PubKeyMapper.ToJSON(h.PubKeyInner)
-}
-
-func (h *PubKey) UnmarshalJSON(data []byte) (err error) {
-	parsed, err := PubKeyMapper.FromJSON(data)
-	if err == nil && parsed != nil {
-		h.PubKeyInner = parsed.(PubKeyInner)
-	}
-	return err
-}
-
-// Unwrap recovers the concrete interface safely (regardless of levels of embeds)
-func (h PubKey) Unwrap() PubKeyInner {
-	hi := h.PubKeyInner
-	for wrap, ok := hi.(PubKey); ok; wrap, ok = hi.(PubKey) {
-		hi = wrap.PubKeyInner
-	}
-	return hi
-}
-
-func (h PubKey) Empty() bool {
-	return h.PubKeyInner == nil
-}
-
-/*** below are bindings for each implementation ***/
-
-func init() {
-	PubKeyMapper.RegisterImplementation(PubKeyEd25519{}, "ed25519", 0x1)
-}
-
-func (hi PubKeyEd25519) Wrap() PubKey {
-	return PubKey{hi}
-}
-
-func init() {
-	PubKeyMapper.RegisterImplementation(PubKeySecp256k1{}, "secp256k1", 0x2)
-}
-
-func (hi PubKeySecp256k1) Wrap() PubKey {
-	return PubKey{hi}
-}
diff --git a/vendor/github.com/tendermint/go-crypto/signature.go b/vendor/github.com/tendermint/go-crypto/signature.go
index cd40331cfe94ecd67dbce00f5033e6121cef89d4..cfe9271379e1e64f926f74cf10f5b9f765bb3703 100644
--- a/vendor/github.com/tendermint/go-crypto/signature.go
+++ b/vendor/github.com/tendermint/go-crypto/signature.go
@@ -4,40 +4,35 @@ import (
 	"bytes"
 	"fmt"
 
-	"github.com/tendermint/go-wire"
-	data "github.com/tendermint/go-wire/data"
 	. "github.com/tendermint/tmlibs/common"
 )
 
-func SignatureFromBytes(sigBytes []byte) (sig Signature, err error) {
-	err = wire.ReadBinaryBytes(sigBytes, &sig)
+func SignatureFromBytes(pubKeyBytes []byte) (pubKey Signature, err error) {
+	err = cdc.UnmarshalBinaryBare(pubKeyBytes, &pubKey)
 	return
 }
 
 //----------------------------------------
 
-// DO NOT USE THIS INTERFACE.
-// You probably want to use Signature.
-// +gen wrapper:"Signature,Impl[SignatureEd25519,SignatureSecp256k1],ed25519,secp256k1"
-type SignatureInner interface {
-	AssertIsSignatureInner()
+type Signature interface {
 	Bytes() []byte
 	IsZero() bool
 	Equals(Signature) bool
-	Wrap() Signature
 }
 
 //-------------------------------------
 
-var _ SignatureInner = SignatureEd25519{}
+var _ Signature = SignatureEd25519{}
 
 // Implements Signature
 type SignatureEd25519 [64]byte
 
-func (sig SignatureEd25519) AssertIsSignatureInner() {}
-
 func (sig SignatureEd25519) Bytes() []byte {
-	return wire.BinaryBytes(Signature{sig})
+	bz, err := cdc.MarshalBinaryBare(sig)
+	if err != nil {
+		panic(err)
+	}
+	return bz
 }
 
 func (sig SignatureEd25519) IsZero() bool { return len(sig) == 0 }
@@ -45,41 +40,32 @@ func (sig SignatureEd25519) IsZero() bool { return len(sig) == 0 }
 func (sig SignatureEd25519) String() string { return fmt.Sprintf("/%X.../", Fingerprint(sig[:])) }
 
 func (sig SignatureEd25519) Equals(other Signature) bool {
-	if otherEd, ok := other.Unwrap().(SignatureEd25519); ok {
+	if otherEd, ok := other.(SignatureEd25519); ok {
 		return bytes.Equal(sig[:], otherEd[:])
 	} else {
 		return false
 	}
 }
 
-func (sig SignatureEd25519) MarshalJSON() ([]byte, error) {
-	return data.Encoder.Marshal(sig[:])
-}
-
-func (sig *SignatureEd25519) UnmarshalJSON(enc []byte) error {
-	var ref []byte
-	err := data.Encoder.Unmarshal(&ref, enc)
-	copy(sig[:], ref)
-	return err
-}
-
 func SignatureEd25519FromBytes(data []byte) Signature {
 	var sig SignatureEd25519
 	copy(sig[:], data)
-	return sig.Wrap()
+	return sig
 }
 
 //-------------------------------------
 
-var _ SignatureInner = SignatureSecp256k1{}
+var _ Signature = SignatureSecp256k1{}
 
 // Implements Signature
 type SignatureSecp256k1 []byte
 
-func (sig SignatureSecp256k1) AssertIsSignatureInner() {}
-
 func (sig SignatureSecp256k1) Bytes() []byte {
-	return wire.BinaryBytes(Signature{sig})
+	bz, err := cdc.MarshalBinaryBare(sig)
+	if err != nil {
+		panic(err)
+	}
+	return bz
 }
 
 func (sig SignatureSecp256k1) IsZero() bool { return len(sig) == 0 }
@@ -87,17 +73,9 @@ func (sig SignatureSecp256k1) IsZero() bool { return len(sig) == 0 }
 func (sig SignatureSecp256k1) String() string { return fmt.Sprintf("/%X.../", Fingerprint(sig[:])) }
 
 func (sig SignatureSecp256k1) Equals(other Signature) bool {
-	if otherSecp, ok := other.Unwrap().(SignatureSecp256k1); ok {
+	if otherSecp, ok := other.(SignatureSecp256k1); ok {
 		return bytes.Equal(sig[:], otherSecp[:])
 	} else {
 		return false
 	}
 }
-
-func (sig SignatureSecp256k1) MarshalJSON() ([]byte, error) {
-	return data.Encoder.Marshal(sig)
-}
-
-func (sig *SignatureSecp256k1) UnmarshalJSON(enc []byte) error {
-	return data.Encoder.Unmarshal((*[]byte)(sig), enc)
-}
diff --git a/vendor/github.com/tendermint/go-crypto/signatureinner_wrapper.go b/vendor/github.com/tendermint/go-crypto/signatureinner_wrapper.go
deleted file mode 100644
index 1fdd790d6017017893c80e8a656084a5100e1138..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/go-crypto/signatureinner_wrapper.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Generated by: main
-// TypeWriter: wrapper
-// Directive: +gen on SignatureInner
-
-package crypto
-
-import (
-	"github.com/tendermint/go-wire/data"
-)
-
-// Auto-generated adapters for happily unmarshaling interfaces
-// Apache License 2.0
-// Copyright (c) 2017 Ethan Frey (ethan.frey@tendermint.com)
-
-type Signature struct {
-	SignatureInner "json:\"unwrap\""
-}
-
-var SignatureMapper = data.NewMapper(Signature{})
-
-func (h Signature) MarshalJSON() ([]byte, error) {
-	return SignatureMapper.ToJSON(h.SignatureInner)
-}
-
-func (h *Signature) UnmarshalJSON(data []byte) (err error) {
-	parsed, err := SignatureMapper.FromJSON(data)
-	if err == nil && parsed != nil {
-		h.SignatureInner = parsed.(SignatureInner)
-	}
-	return err
-}
-
-// Unwrap recovers the concrete interface safely (regardless of levels of embeds)
-func (h Signature) Unwrap() SignatureInner {
-	hi := h.SignatureInner
-	for wrap, ok := hi.(Signature); ok; wrap, ok = hi.(Signature) {
-		hi = wrap.SignatureInner
-	}
-	return hi
-}
-
-func (h Signature) Empty() bool {
-	return h.SignatureInner == nil
-}
-
-/*** below are bindings for each implementation ***/
-
-func init() {
-	SignatureMapper.RegisterImplementation(SignatureEd25519{}, "ed25519", 0x1)
-}
-
-func (hi SignatureEd25519) Wrap() Signature {
-	return Signature{hi}
-}
-
-func init() {
-	SignatureMapper.RegisterImplementation(SignatureSecp256k1{}, "secp256k1", 0x2)
-}
-
-func (hi SignatureSecp256k1) Wrap() Signature {
-	return Signature{hi}
-}
diff --git a/vendor/github.com/tendermint/go-crypto/version.go b/vendor/github.com/tendermint/go-crypto/version.go
index 0281a5ea2804d83f3df5750de9e42139ab1b01e3..aac87c4f347a08d6481c600d3d1e82e87e1c06dc 100644
--- a/vendor/github.com/tendermint/go-crypto/version.go
+++ b/vendor/github.com/tendermint/go-crypto/version.go
@@ -1,3 +1,3 @@
 package crypto
 
-const Version = "0.5.0"
+const Version = "0.6.2"
diff --git a/vendor/github.com/tendermint/tendermint/blockchain/pool.go b/vendor/github.com/tendermint/tendermint/blockchain/pool.go
index 603b4bf2a9f57d6c3ae91835d612ff409f5e974f..8b964e81ad4a98961042ab50bef23e2e51dd3502 100644
--- a/vendor/github.com/tendermint/tendermint/blockchain/pool.go
+++ b/vendor/github.com/tendermint/tendermint/blockchain/pool.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 	"math"
 	"sync"
+	"sync/atomic"
 	"time"
 
 	cmn "github.com/tendermint/tmlibs/common"
@@ -66,11 +67,13 @@ type BlockPool struct {
 	// block requests
 	requesters map[int64]*bpRequester
 	height     int64 // the lowest key in requesters.
-	numPending int32 // number of requests pending assignment or block response
 	// peers
 	peers         map[p2p.ID]*bpPeer
 	maxPeerHeight int64
 
+	// atomic
+	numPending int32 // number of requests pending assignment or block response
+
 	requestsCh chan<- BlockRequest
 	errorsCh   chan<- peerError
 }
@@ -151,7 +154,7 @@ func (pool *BlockPool) GetStatus() (height int64, numPending int32, lenRequester
 	pool.mtx.Lock()
 	defer pool.mtx.Unlock()
 
-	return pool.height, pool.numPending, len(pool.requesters)
+	return pool.height, atomic.LoadInt32(&pool.numPending), len(pool.requesters)
 }
 
 // TODO: relax conditions, prevent abuse.
@@ -245,7 +248,7 @@ func (pool *BlockPool) AddBlock(peerID p2p.ID, block *types.Block, blockSize int
 	}
 
 	if requester.setBlock(block, peerID) {
-		pool.numPending--
+		atomic.AddInt32(&pool.numPending, -1)
 		peer := pool.peers[peerID]
 		if peer != nil {
 			peer.decrPending(blockSize)
@@ -291,10 +294,7 @@ func (pool *BlockPool) RemovePeer(peerID p2p.ID) {
 func (pool *BlockPool) removePeer(peerID p2p.ID) {
 	for _, requester := range pool.requesters {
 		if requester.getPeerID() == peerID {
-			if requester.getBlock() != nil {
-				pool.numPending++
-			}
-			go requester.redo() // pick another peer and ...
+			requester.redo()
 		}
 	}
 	delete(pool.peers, peerID)
@@ -332,7 +332,7 @@ func (pool *BlockPool) makeNextRequester() {
 	// request.SetLogger(pool.Logger.With("height", nextHeight))
 
 	pool.requesters[nextHeight] = request
-	pool.numPending++
+	atomic.AddInt32(&pool.numPending, 1)
 
 	err := request.Start()
 	if err != nil {
@@ -360,7 +360,7 @@ func (pool *BlockPool) sendError(err error, peerID p2p.ID) {
 
 // unused by tendermint; left for debugging purposes
 func (pool *BlockPool) debug() string {
-	pool.mtx.Lock() // Lock
+	pool.mtx.Lock()
 	defer pool.mtx.Unlock()
 
 	str := ""
@@ -466,8 +466,8 @@ func newBPRequester(pool *BlockPool, height int64) *bpRequester {
 	bpr := &bpRequester{
 		pool:       pool,
 		height:     height,
-		gotBlockCh: make(chan struct{}),
-		redoCh:     make(chan struct{}),
+		gotBlockCh: make(chan struct{}, 1),
+		redoCh:     make(chan struct{}, 1),
 
 		peerID: "",
 		block:  nil,
@@ -481,7 +481,7 @@ func (bpr *bpRequester) OnStart() error {
 	return nil
 }
 
-// Returns true if the peer matches
+// Returns true if the peer matches and block doesn't already exist.
 func (bpr *bpRequester) setBlock(block *types.Block, peerID p2p.ID) bool {
 	bpr.mtx.Lock()
 	if bpr.block != nil || bpr.peerID != peerID {
@@ -491,7 +491,10 @@ func (bpr *bpRequester) setBlock(block *types.Block, peerID p2p.ID) bool {
 	bpr.block = block
 	bpr.mtx.Unlock()
 
-	bpr.gotBlockCh <- struct{}{}
+	select {
+	case bpr.gotBlockCh <- struct{}{}:
+	default:
+	}
 	return true
 }
 
@@ -507,17 +510,27 @@ func (bpr *bpRequester) getPeerID() p2p.ID {
 	return bpr.peerID
 }
 
+// This is called from the requestRoutine, upon redo().
 func (bpr *bpRequester) reset() {
 	bpr.mtx.Lock()
+	defer bpr.mtx.Unlock()
+
+	if bpr.block != nil {
+		atomic.AddInt32(&bpr.pool.numPending, 1)
+	}
+
 	bpr.peerID = ""
 	bpr.block = nil
-	bpr.mtx.Unlock()
 }
 
 // Tells bpRequester to pick another peer and try again.
-// NOTE: blocking
+// NOTE: Nonblocking, and does nothing if another redo
+// was already requested.
 func (bpr *bpRequester) redo() {
-	bpr.redoCh <- struct{}{}
+	select {
+	case bpr.redoCh <- struct{}{}:
+	default:
+	}
 }
 
 // Responsible for making more requests as necessary
@@ -546,17 +559,8 @@ OUTER_LOOP:
 
 		// Send request and wait.
 		bpr.pool.sendRequest(bpr.height, peer.id)
-		select {
-		case <-bpr.pool.Quit():
-			bpr.Stop()
-			return
-		case <-bpr.Quit():
-			return
-		case <-bpr.redoCh:
-			bpr.reset()
-			continue OUTER_LOOP // When peer is removed
-		case <-bpr.gotBlockCh:
-			// We got the block, now see if it's good.
+	WAIT_LOOP:
+		for {
 			select {
 			case <-bpr.pool.Quit():
 				bpr.Stop()
@@ -566,6 +570,10 @@ OUTER_LOOP:
 			case <-bpr.redoCh:
 				bpr.reset()
 				continue OUTER_LOOP
+			case <-bpr.gotBlockCh:
+				// We got a block!
+				// Continue the for-loop and wait til Quit.
+				continue WAIT_LOOP
 			}
 		}
 	}
diff --git a/vendor/github.com/tendermint/tendermint/blockchain/reactor.go b/vendor/github.com/tendermint/tendermint/blockchain/reactor.go
index 3c25eed2fad6ddc99f9c7a2f5d30b558688f24fb..33dfdd288eb74d77faa685463ab0742cf300d31b 100644
--- a/vendor/github.com/tendermint/tendermint/blockchain/reactor.go
+++ b/vendor/github.com/tendermint/tendermint/blockchain/reactor.go
@@ -1,21 +1,16 @@
 package blockchain
 
 import (
-	"bytes"
-	"errors"
 	"fmt"
 	"reflect"
-	"sync"
 	"time"
 
-	wire "github.com/tendermint/go-wire"
-
-	cmn "github.com/tendermint/tmlibs/common"
-	"github.com/tendermint/tmlibs/log"
-
+	"github.com/tendermint/go-amino"
 	"github.com/tendermint/tendermint/p2p"
 	sm "github.com/tendermint/tendermint/state"
 	"github.com/tendermint/tendermint/types"
+	cmn "github.com/tendermint/tmlibs/common"
+	"github.com/tendermint/tmlibs/log"
 )
 
 const (
@@ -31,6 +26,13 @@ const (
 	statusUpdateIntervalSeconds = 10
 	// check if we should switch to consensus reactor
 	switchToConsensusIntervalSeconds = 1
+
+	// NOTE: keep up to date with bcBlockResponseMessage
+	bcBlockResponseMessagePrefixSize   = 4
+	bcBlockResponseMessageFieldKeySize = 1
+	maxMsgSize                         = types.MaxBlockSizeBytes +
+		bcBlockResponseMessagePrefixSize +
+		bcBlockResponseMessageFieldKeySize
 )
 
 type consensusReactor interface {
@@ -52,9 +54,6 @@ func (e peerError) Error() string {
 type BlockchainReactor struct {
 	p2p.BaseReactor
 
-	mtx    sync.Mutex
-	params types.ConsensusParams
-
 	// immutable
 	initialState sm.State
 
@@ -87,7 +86,6 @@ func NewBlockchainReactor(state sm.State, blockExec *sm.BlockExecutor, store *Bl
 	)
 
 	bcR := &BlockchainReactor{
-		params:       state.ConsensusParams,
 		initialState: state,
 		blockExec:    blockExec,
 		store:        store,
@@ -131,17 +129,19 @@ func (bcR *BlockchainReactor) OnStop() {
 func (bcR *BlockchainReactor) GetChannels() []*p2p.ChannelDescriptor {
 	return []*p2p.ChannelDescriptor{
 		{
-			ID:                BlockchainChannel,
-			Priority:          10,
-			SendQueueCapacity: 1000,
+			ID:                  BlockchainChannel,
+			Priority:            10,
+			SendQueueCapacity:   1000,
+			RecvBufferCapacity:  50 * 4096,
+			RecvMessageCapacity: maxMsgSize,
 		},
 	}
 }
 
 // AddPeer implements Reactor by sending our state to peer.
 func (bcR *BlockchainReactor) AddPeer(peer p2p.Peer) {
-	if !peer.Send(BlockchainChannel,
-		struct{ BlockchainMessage }{&bcStatusResponseMessage{bcR.store.Height()}}) {
+	msgBytes := cdc.MustMarshalBinaryBare(&bcStatusResponseMessage{bcR.store.Height()})
+	if !peer.Send(BlockchainChannel, msgBytes) {
 		// doing nothing, will try later in `poolRoutine`
 	}
 	// peer is added to the pool once we receive the first
@@ -162,20 +162,19 @@ func (bcR *BlockchainReactor) respondToPeer(msg *bcBlockRequestMessage,
 
 	block := bcR.store.LoadBlock(msg.Height)
 	if block != nil {
-		msg := &bcBlockResponseMessage{Block: block}
-		return src.TrySend(BlockchainChannel, struct{ BlockchainMessage }{msg})
+		msgBytes := cdc.MustMarshalBinaryBare(&bcBlockResponseMessage{Block: block})
+		return src.TrySend(BlockchainChannel, msgBytes)
 	}
 
 	bcR.Logger.Info("Peer asking for a block we don't have", "src", src, "height", msg.Height)
 
-	return src.TrySend(BlockchainChannel, struct{ BlockchainMessage }{
-		&bcNoBlockResponseMessage{Height: msg.Height},
-	})
+	msgBytes := cdc.MustMarshalBinaryBare(&bcNoBlockResponseMessage{Height: msg.Height})
+	return src.TrySend(BlockchainChannel, msgBytes)
 }
 
 // Receive implements Reactor by handling 4 types of messages (look below).
 func (bcR *BlockchainReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte) {
-	_, msg, err := DecodeMessage(msgBytes, bcR.maxMsgSize())
+	msg, err := DecodeMessage(msgBytes)
 	if err != nil {
 		bcR.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes)
 		bcR.Switch.StopPeerForError(src, err)
@@ -194,8 +193,8 @@ func (bcR *BlockchainReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte)
 		bcR.pool.AddBlock(src.ID(), msg.Block, len(msgBytes))
 	case *bcStatusRequestMessage:
 		// Send peer our state.
-		queued := src.TrySend(BlockchainChannel,
-			struct{ BlockchainMessage }{&bcStatusResponseMessage{bcR.store.Height()}})
+		msgBytes := cdc.MustMarshalBinaryBare(&bcStatusResponseMessage{bcR.store.Height()})
+		queued := src.TrySend(BlockchainChannel, msgBytes)
 		if !queued {
 			// sorry
 		}
@@ -207,21 +206,6 @@ func (bcR *BlockchainReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte)
 	}
 }
 
-// maxMsgSize returns the maximum allowable size of a
-// message on the blockchain reactor.
-func (bcR *BlockchainReactor) maxMsgSize() int {
-	bcR.mtx.Lock()
-	defer bcR.mtx.Unlock()
-	return bcR.params.BlockSize.MaxBytes + 2
-}
-
-// updateConsensusParams updates the internal consensus params
-func (bcR *BlockchainReactor) updateConsensusParams(params types.ConsensusParams) {
-	bcR.mtx.Lock()
-	defer bcR.mtx.Unlock()
-	bcR.params = params
-}
-
 // Handle messages from the poolReactor telling the reactor what to do.
 // NOTE: Don't sleep in the FOR_LOOP or otherwise slow it down!
 // (Except for the SYNC_LOOP, which is the primary purpose and must be synchronous.)
@@ -247,8 +231,8 @@ FOR_LOOP:
 			if peer == nil {
 				continue FOR_LOOP // Peer has since been disconnected.
 			}
-			msg := &bcBlockRequestMessage{request.Height}
-			queued := peer.TrySend(BlockchainChannel, struct{ BlockchainMessage }{msg})
+			msgBytes := cdc.MustMarshalBinaryBare(&bcBlockRequestMessage{request.Height})
+			queued := peer.TrySend(BlockchainChannel, msgBytes)
 			if !queued {
 				// We couldn't make the request, send-queue full.
 				// The pool handles timeouts, just let it go.
@@ -321,9 +305,6 @@ FOR_LOOP:
 					}
 					blocksSynced++
 
-					// update the consensus params
-					bcR.updateConsensusParams(state.ConsensusParams)
-
 					if blocksSynced%100 == 0 {
 						lastRate = 0.9*lastRate + 0.1*(100/time.Since(lastHundred).Seconds())
 						bcR.Logger.Info("Fast Sync Rate", "height", bcR.pool.height,
@@ -341,43 +322,36 @@ FOR_LOOP:
 
 // BroadcastStatusRequest broadcasts `BlockStore` height.
 func (bcR *BlockchainReactor) BroadcastStatusRequest() error {
-	bcR.Switch.Broadcast(BlockchainChannel,
-		struct{ BlockchainMessage }{&bcStatusRequestMessage{bcR.store.Height()}})
+	msgBytes := cdc.MustMarshalBinaryBare(&bcStatusRequestMessage{bcR.store.Height()})
+	bcR.Switch.Broadcast(BlockchainChannel, msgBytes)
 	return nil
 }
 
 //-----------------------------------------------------------------------------
 // Messages
 
-const (
-	msgTypeBlockRequest    = byte(0x10)
-	msgTypeBlockResponse   = byte(0x11)
-	msgTypeNoBlockResponse = byte(0x12)
-	msgTypeStatusResponse  = byte(0x20)
-	msgTypeStatusRequest   = byte(0x21)
-)
-
 // BlockchainMessage is a generic message for this reactor.
 type BlockchainMessage interface{}
 
-var _ = wire.RegisterInterface(
-	struct{ BlockchainMessage }{},
-	wire.ConcreteType{&bcBlockRequestMessage{}, msgTypeBlockRequest},
-	wire.ConcreteType{&bcBlockResponseMessage{}, msgTypeBlockResponse},
-	wire.ConcreteType{&bcNoBlockResponseMessage{}, msgTypeNoBlockResponse},
-	wire.ConcreteType{&bcStatusResponseMessage{}, msgTypeStatusResponse},
-	wire.ConcreteType{&bcStatusRequestMessage{}, msgTypeStatusRequest},
-)
+func RegisterBlockchainMessages(cdc *amino.Codec) {
+	cdc.RegisterInterface((*BlockchainMessage)(nil), nil)
+	cdc.RegisterConcrete(&bcBlockRequestMessage{}, "tendermint/mempool/BlockRequest", nil)
+	cdc.RegisterConcrete(&bcBlockResponseMessage{}, "tendermint/mempool/BlockResponse", nil)
+	cdc.RegisterConcrete(&bcNoBlockResponseMessage{}, "tendermint/mempool/NoBlockResponse", nil)
+	cdc.RegisterConcrete(&bcStatusResponseMessage{}, "tendermint/mempool/StatusResponse", nil)
+	cdc.RegisterConcrete(&bcStatusRequestMessage{}, "tendermint/mempool/StatusRequest", nil)
+}
 
 // DecodeMessage decodes BlockchainMessage.
 // TODO: ensure that bz is completely read.
-func DecodeMessage(bz []byte, maxSize int) (msgType byte, msg BlockchainMessage, err error) {
-	msgType = bz[0]
-	n := int(0)
-	r := bytes.NewReader(bz)
-	msg = wire.ReadBinary(struct{ BlockchainMessage }{}, r, maxSize, &n, &err).(struct{ BlockchainMessage }).BlockchainMessage
-	if err != nil && n != len(bz) {
-		err = errors.New("DecodeMessage() had bytes left over")
+func DecodeMessage(bz []byte) (msg BlockchainMessage, err error) {
+	if len(bz) > maxMsgSize {
+		return msg, fmt.Errorf("Msg exceeds max size (%d > %d)",
+			len(bz), maxMsgSize)
+	}
+	err = cdc.UnmarshalBinaryBare(bz, &msg)
+	if err != nil {
+		err = cmn.ErrorWrap(err, "DecodeMessage() had bytes left over")
 	}
 	return
 }
@@ -402,7 +376,6 @@ func (brm *bcNoBlockResponseMessage) String() string {
 
 //-------------------------------------
 
-// NOTE: keep up-to-date with maxBlockchainResponseSize
 type bcBlockResponseMessage struct {
 	Block *types.Block
 }
diff --git a/vendor/github.com/tendermint/tendermint/blockchain/store.go b/vendor/github.com/tendermint/tendermint/blockchain/store.go
index b949bc904616317e278a8763495d5e4742a794de..e7608b2ccae6cd21e9d7111fce7d9df74c43e0c0 100644
--- a/vendor/github.com/tendermint/tendermint/blockchain/store.go
+++ b/vendor/github.com/tendermint/tendermint/blockchain/store.go
@@ -1,14 +1,9 @@
 package blockchain
 
 import (
-	"bytes"
-	"encoding/json"
 	"fmt"
-	"io"
 	"sync"
 
-	wire "github.com/tendermint/go-wire"
-
 	cmn "github.com/tendermint/tmlibs/common"
 	dbm "github.com/tendermint/tmlibs/db"
 
@@ -54,38 +49,25 @@ func (bs *BlockStore) Height() int64 {
 	return bs.height
 }
 
-// GetReader returns the value associated with the given key wrapped in an io.Reader.
-// If no value is found, it returns nil.
-// It's mainly for use with wire.ReadBinary.
-func (bs *BlockStore) GetReader(key []byte) io.Reader {
-	bytez := bs.db.Get(key)
-	if bytez == nil {
-		return nil
-	}
-	return bytes.NewReader(bytez)
-}
-
 // LoadBlock returns the block with the given height.
 // If no block is found for that height, it returns nil.
 func (bs *BlockStore) LoadBlock(height int64) *types.Block {
-	var n int
-	var err error
-	r := bs.GetReader(calcBlockMetaKey(height))
-	if r == nil {
+	var blockMeta = bs.LoadBlockMeta(height)
+	if blockMeta == nil {
 		return nil
 	}
-	blockMeta := wire.ReadBinary(&types.BlockMeta{}, r, 0, &n, &err).(*types.BlockMeta)
-	if err != nil {
-		panic(fmt.Sprintf("Error reading block meta: %v", err))
-	}
-	bytez := []byte{}
+
+	var block = new(types.Block)
+	buf := []byte{}
 	for i := 0; i < blockMeta.BlockID.PartsHeader.Total; i++ {
 		part := bs.LoadBlockPart(height, i)
-		bytez = append(bytez, part.Bytes...)
+		buf = append(buf, part.Bytes...)
 	}
-	block := wire.ReadBinary(&types.Block{}, bytes.NewReader(bytez), 0, &n, &err).(*types.Block)
+	err := cdc.UnmarshalBinary(buf, block)
 	if err != nil {
-		panic(fmt.Sprintf("Error reading block: %v", err))
+		// NOTE: The existence of meta should imply the existence of the
+		// block. So, make sure meta is only saved after blocks are saved.
+		panic(cmn.ErrorWrap(err, "Error reading block"))
 	}
 	return block
 }
@@ -94,15 +76,14 @@ func (bs *BlockStore) LoadBlock(height int64) *types.Block {
 // from the block at the given height.
 // If no part is found for the given height and index, it returns nil.
 func (bs *BlockStore) LoadBlockPart(height int64, index int) *types.Part {
-	var n int
-	var err error
-	r := bs.GetReader(calcBlockPartKey(height, index))
-	if r == nil {
+	var part = new(types.Part)
+	bz := bs.db.Get(calcBlockPartKey(height, index))
+	if len(bz) == 0 {
 		return nil
 	}
-	part := wire.ReadBinary(&types.Part{}, r, 0, &n, &err).(*types.Part)
+	err := cdc.UnmarshalBinaryBare(bz, part)
 	if err != nil {
-		panic(fmt.Sprintf("Error reading block part: %v", err))
+		panic(cmn.ErrorWrap(err, "Error reading block part"))
 	}
 	return part
 }
@@ -110,15 +91,14 @@ func (bs *BlockStore) LoadBlockPart(height int64, index int) *types.Part {
 // LoadBlockMeta returns the BlockMeta for the given height.
 // If no block is found for the given height, it returns nil.
 func (bs *BlockStore) LoadBlockMeta(height int64) *types.BlockMeta {
-	var n int
-	var err error
-	r := bs.GetReader(calcBlockMetaKey(height))
-	if r == nil {
+	var blockMeta = new(types.BlockMeta)
+	bz := bs.db.Get(calcBlockMetaKey(height))
+	if len(bz) == 0 {
 		return nil
 	}
-	blockMeta := wire.ReadBinary(&types.BlockMeta{}, r, 0, &n, &err).(*types.BlockMeta)
+	err := cdc.UnmarshalBinaryBare(bz, blockMeta)
 	if err != nil {
-		panic(fmt.Sprintf("Error reading block meta: %v", err))
+		panic(cmn.ErrorWrap(err, "Error reading block meta"))
 	}
 	return blockMeta
 }
@@ -128,15 +108,14 @@ func (bs *BlockStore) LoadBlockMeta(height int64) *types.BlockMeta {
 // and it comes from the block.LastCommit for `height+1`.
 // If no commit is found for the given height, it returns nil.
 func (bs *BlockStore) LoadBlockCommit(height int64) *types.Commit {
-	var n int
-	var err error
-	r := bs.GetReader(calcBlockCommitKey(height))
-	if r == nil {
+	var commit = new(types.Commit)
+	bz := bs.db.Get(calcBlockCommitKey(height))
+	if len(bz) == 0 {
 		return nil
 	}
-	commit := wire.ReadBinary(&types.Commit{}, r, 0, &n, &err).(*types.Commit)
+	err := cdc.UnmarshalBinaryBare(bz, commit)
 	if err != nil {
-		panic(fmt.Sprintf("Error reading commit: %v", err))
+		panic(cmn.ErrorWrap(err, "Error reading block commit"))
 	}
 	return commit
 }
@@ -145,15 +124,14 @@ func (bs *BlockStore) LoadBlockCommit(height int64) *types.Commit {
 // This is useful when we've seen a commit, but there has not yet been
 // a new block at `height + 1` that includes this commit in its block.LastCommit.
 func (bs *BlockStore) LoadSeenCommit(height int64) *types.Commit {
-	var n int
-	var err error
-	r := bs.GetReader(calcSeenCommitKey(height))
-	if r == nil {
+	var commit = new(types.Commit)
+	bz := bs.db.Get(calcSeenCommitKey(height))
+	if len(bz) == 0 {
 		return nil
 	}
-	commit := wire.ReadBinary(&types.Commit{}, r, 0, &n, &err).(*types.Commit)
+	err := cdc.UnmarshalBinaryBare(bz, commit)
 	if err != nil {
-		panic(fmt.Sprintf("Error reading commit: %v", err))
+		panic(cmn.ErrorWrap(err, "Error reading block seen commit"))
 	}
 	return commit
 }
@@ -178,21 +156,22 @@ func (bs *BlockStore) SaveBlock(block *types.Block, blockParts *types.PartSet, s
 
 	// Save block meta
 	blockMeta := types.NewBlockMeta(block, blockParts)
-	metaBytes := wire.BinaryBytes(blockMeta)
+	metaBytes := cdc.MustMarshalBinaryBare(blockMeta)
 	bs.db.Set(calcBlockMetaKey(height), metaBytes)
 
 	// Save block parts
 	for i := 0; i < blockParts.Total(); i++ {
-		bs.saveBlockPart(height, i, blockParts.GetPart(i))
+		part := blockParts.GetPart(i)
+		bs.saveBlockPart(height, i, part)
 	}
 
 	// Save block commit (duplicate and separate from the Block)
-	blockCommitBytes := wire.BinaryBytes(block.LastCommit)
+	blockCommitBytes := cdc.MustMarshalBinaryBare(block.LastCommit)
 	bs.db.Set(calcBlockCommitKey(height-1), blockCommitBytes)
 
 	// Save seen commit (seen +2/3 precommits for block)
 	// NOTE: we can delete this at a later height
-	seenCommitBytes := wire.BinaryBytes(seenCommit)
+	seenCommitBytes := cdc.MustMarshalBinaryBare(seenCommit)
 	bs.db.Set(calcSeenCommitKey(height), seenCommitBytes)
 
 	// Save new BlockStoreStateJSON descriptor
@@ -211,7 +190,7 @@ func (bs *BlockStore) saveBlockPart(height int64, index int, part *types.Part) {
 	if height != bs.Height()+1 {
 		cmn.PanicSanity(cmn.Fmt("BlockStore can only save contiguous blocks. Wanted %v, got %v", bs.Height()+1, height))
 	}
-	partBytes := wire.BinaryBytes(part)
+	partBytes := cdc.MustMarshalBinaryBare(part)
 	bs.db.Set(calcBlockPartKey(height, index), partBytes)
 }
 
@@ -238,12 +217,12 @@ func calcSeenCommitKey(height int64) []byte {
 var blockStoreKey = []byte("blockStore")
 
 type BlockStoreStateJSON struct {
-	Height int64
+	Height int64 `json:"height"`
 }
 
 // Save persists the blockStore state to the database as JSON.
 func (bsj BlockStoreStateJSON) Save(db dbm.DB) {
-	bytes, err := json.Marshal(bsj)
+	bytes, err := cdc.MarshalJSON(bsj)
 	if err != nil {
 		cmn.PanicSanity(cmn.Fmt("Could not marshal state bytes: %v", err))
 	}
@@ -260,7 +239,7 @@ func LoadBlockStoreStateJSON(db dbm.DB) BlockStoreStateJSON {
 		}
 	}
 	bsj := BlockStoreStateJSON{}
-	err := json.Unmarshal(bytes, &bsj)
+	err := cdc.UnmarshalJSON(bytes, &bsj)
 	if err != nil {
 		panic(fmt.Sprintf("Could not unmarshal bytes: %X", bytes))
 	}
diff --git a/vendor/github.com/tendermint/tendermint/blockchain/wire.go b/vendor/github.com/tendermint/tendermint/blockchain/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..55b4e60ae38f9c4d8a8b83ec0ccad1b21e6bf77d
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/blockchain/wire.go
@@ -0,0 +1,13 @@
+package blockchain
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	RegisterBlockchainMessages(cdc)
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/config/config.go b/vendor/github.com/tendermint/tendermint/config/config.go
index c87d56b3d52bfcd344a4d0b17fcb4f99e98da285..5765548091b1ad696751a548868baaeea2de37d0 100644
--- a/vendor/github.com/tendermint/tendermint/config/config.go
+++ b/vendor/github.com/tendermint/tendermint/config/config.go
@@ -270,7 +270,7 @@ type P2PConfig struct {
 	FlushThrottleTimeout int `mapstructure:"flush_throttle_timeout"`
 
 	// Maximum size of a message packet payload, in bytes
-	MaxMsgPacketPayloadSize int `mapstructure:"max_msg_packet_payload_size"`
+	MaxPacketMsgPayloadSize int `mapstructure:"max_packet_msg_payload_size"`
 
 	// Rate at which packets can be sent, in bytes/second
 	SendRate int64 `mapstructure:"send_rate"`
@@ -287,11 +287,11 @@ type P2PConfig struct {
 	// Does not work if the peer-exchange reactor is disabled.
 	SeedMode bool `mapstructure:"seed_mode"`
 
-	// Authenticated encryption
-	AuthEnc bool `mapstructure:"auth_enc"`
-
 	// Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
 	PrivatePeerIDs string `mapstructure:"private_peer_ids"`
+
+	// Toggle to disable guard against peers connecting from the same ip.
+	AllowDuplicateIP bool `mapstructure:"allow_duplicate_ip"`
 }
 
 // DefaultP2PConfig returns a default configuration for the peer-to-peer layer
@@ -302,12 +302,12 @@ func DefaultP2PConfig() *P2PConfig {
 		AddrBookStrict:          true,
 		MaxNumPeers:             50,
 		FlushThrottleTimeout:    100,
-		MaxMsgPacketPayloadSize: 1024,   // 1 kB
+		MaxPacketMsgPayloadSize: 1024,   // 1 kB
 		SendRate:                512000, // 500 kB/s
 		RecvRate:                512000, // 500 kB/s
 		PexReactor:              true,
 		SeedMode:                false,
-		AuthEnc:                 true,
+		AllowDuplicateIP:        true, // so non-breaking yet
 	}
 }
 
@@ -317,6 +317,7 @@ func TestP2PConfig() *P2PConfig {
 	cfg.ListenAddress = "tcp://0.0.0.0:36656"
 	cfg.SkipUPNP = true
 	cfg.FlushThrottleTimeout = 10
+	cfg.AllowDuplicateIP = true
 	return cfg
 }
 
@@ -335,6 +336,7 @@ type MempoolConfig struct {
 	RecheckEmpty bool   `mapstructure:"recheck_empty"`
 	Broadcast    bool   `mapstructure:"broadcast"`
 	WalPath      string `mapstructure:"wal_dir"`
+	Size         int    `mapstructure:"size"`
 	CacheSize    int    `mapstructure:"cache_size"`
 }
 
@@ -345,6 +347,7 @@ func DefaultMempoolConfig() *MempoolConfig {
 		RecheckEmpty: true,
 		Broadcast:    true,
 		WalPath:      filepath.Join(defaultDataDir, "mempool.wal"),
+		Size:         100000,
 		CacheSize:    100000,
 	}
 }
@@ -367,10 +370,9 @@ func (cfg *MempoolConfig) WalDir() string {
 // ConsensusConfig defines the confuguration for the Tendermint consensus service,
 // including timeouts and details about the WAL and the block structure.
 type ConsensusConfig struct {
-	RootDir  string `mapstructure:"home"`
-	WalPath  string `mapstructure:"wal_file"`
-	WalLight bool   `mapstructure:"wal_light"`
-	walFile  string // overrides WalPath if set
+	RootDir string `mapstructure:"home"`
+	WalPath string `mapstructure:"wal_file"`
+	walFile string // overrides WalPath if set
 
 	// All timeouts are in milliseconds
 	TimeoutPropose        int `mapstructure:"timeout_propose"`
@@ -401,7 +403,6 @@ type ConsensusConfig struct {
 func DefaultConsensusConfig() *ConsensusConfig {
 	return &ConsensusConfig{
 		WalPath:                     filepath.Join(defaultDataDir, "cs.wal", "wal"),
-		WalLight:                    false,
 		TimeoutPropose:              3000,
 		TimeoutProposeDelta:         500,
 		TimeoutPrevote:              1000,
diff --git a/vendor/github.com/tendermint/tendermint/config/toml.go b/vendor/github.com/tendermint/tendermint/config/toml.go
index 13f71db86d8fd81c2d17ca7da0abaf260ee908bc..69356ff66f38bbbc02d9dbc08dadd5250ddcbdbb 100644
--- a/vendor/github.com/tendermint/tendermint/config/toml.go
+++ b/vendor/github.com/tendermint/tendermint/config/toml.go
@@ -37,16 +37,21 @@ func EnsureRoot(rootDir string) {
 
 	// Write default config file if missing.
 	if !cmn.FileExists(configFilePath) {
-		writeConfigFile(configFilePath)
+		writeDefaultConfigFile(configFilePath)
 	}
 }
 
 // XXX: this func should probably be called by cmd/tendermint/commands/init.go
 // alongside the writing of the genesis.json and priv_validator.json
-func writeConfigFile(configFilePath string) {
+func writeDefaultConfigFile(configFilePath string) {
+	WriteConfigFile(configFilePath, DefaultConfig())
+}
+
+// WriteConfigFile renders config using the template and writes it to configFilePath.
+func WriteConfigFile(configFilePath string, config *Config) {
 	var buffer bytes.Buffer
 
-	if err := configTemplate.Execute(&buffer, DefaultConfig()); err != nil {
+	if err := configTemplate.Execute(&buffer, config); err != nil {
 		panic(err)
 	}
 
@@ -124,11 +129,11 @@ unsafe = {{ .RPC.Unsafe }}
 laddr = "{{ .P2P.ListenAddress }}"
 
 # Comma separated list of seed nodes to connect to
-seeds = ""
+seeds = "{{ .P2P.Seeds }}"
 
 # Comma separated list of nodes to keep persistent connections to
 # Do not add private peers to this list if you don't want them advertised
-persistent_peers = ""
+persistent_peers = "{{ .P2P.PersistentPeers }}"
 
 # Path to address book
 addr_book_file = "{{ .P2P.AddrBook }}"
@@ -143,7 +148,7 @@ flush_throttle_timeout = {{ .P2P.FlushThrottleTimeout }}
 max_num_peers = {{ .P2P.MaxNumPeers }}
 
 # Maximum size of a message packet payload, in bytes
-max_msg_packet_payload_size = {{ .P2P.MaxMsgPacketPayloadSize }}
+max_packet_msg_payload_size = {{ .P2P.MaxPacketMsgPayloadSize }}
 
 # Rate at which packets can be sent, in bytes/second
 send_rate = {{ .P2P.SendRate }}
@@ -160,9 +165,6 @@ pex = {{ .P2P.PexReactor }}
 # Does not work if the peer-exchange reactor is disabled.
 seed_mode = {{ .P2P.SeedMode }}
 
-# Authenticated encryption
-auth_enc = {{ .P2P.AuthEnc }}
-
 # Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
 private_peer_ids = "{{ .P2P.PrivatePeerIDs }}"
 
@@ -174,11 +176,16 @@ recheck_empty = {{ .Mempool.RecheckEmpty }}
 broadcast = {{ .Mempool.Broadcast }}
 wal_dir = "{{ .Mempool.WalPath }}"
 
+# size of the mempool
+size = {{ .Mempool.Size }}
+
+# size of the cache (used to filter transactions we saw earlier)
+cache_size = {{ .Mempool.CacheSize }}
+
 ##### consensus configuration options #####
 [consensus]
 
 wal_file = "{{ .Consensus.WalPath }}"
-wal_light = {{ .Consensus.WalLight }}
 
 # All timeouts are in milliseconds
 timeout_propose = {{ .Consensus.TimeoutPropose }}
@@ -262,7 +269,7 @@ func ResetTestRoot(testName string) *Config {
 
 	// Write default config file if missing.
 	if !cmn.FileExists(configFilePath) {
-		writeConfigFile(configFilePath)
+		writeDefaultConfigFile(configFilePath)
 	}
 	if !cmn.FileExists(genesisFilePath) {
 		cmn.MustWriteFile(genesisFilePath, []byte(testGenesis), 0644)
@@ -280,8 +287,8 @@ var testGenesis = `{
   "validators": [
     {
       "pub_key": {
-        "type": "ed25519",
-        "data":"3B3069C422E19688B45CBFAE7BB009FC0FA1B1EA86593519318B7214853803C8"
+        "type": "AC26791624DE60",
+        "value":"AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="
       },
       "power": 10,
       "name": ""
@@ -291,14 +298,14 @@ var testGenesis = `{
 }`
 
 var testPrivValidator = `{
-  "address": "D028C9981F7A87F3093672BF0D5B0E2A1B3ED456",
+  "address": "849CB2C877F87A20925F35D00AE6688342D25B47",
   "pub_key": {
-    "type": "ed25519",
-    "data": "3B3069C422E19688B45CBFAE7BB009FC0FA1B1EA86593519318B7214853803C8"
+    "type": "AC26791624DE60",
+    "value": "AT/+aaL1eB0477Mud9JMm8Sh8BIvOYlPGC9KkIUmFaE="
   },
   "priv_key": {
-    "type": "ed25519",
-    "data": "27F82582AEFAE7AB151CFB01C48BB6C1A0DA78F9BDDA979A9F70A84D074EB07D3B3069C422E19688B45CBFAE7BB009FC0FA1B1EA86593519318B7214853803C8"
+    "type": "954568A3288910",
+    "value": "EVkqJO/jIXp3rkASXfh9YnyToYXRXhBr6g9cQVxPFnQBP/5povV4HTjvsy530kybxKHwEi85iU8YL0qQhSYVoQ=="
   },
   "last_height": 0,
   "last_round": 0,
diff --git a/vendor/github.com/tendermint/tendermint/consensus/reactor.go b/vendor/github.com/tendermint/tendermint/consensus/reactor.go
index 70a79d86a980e606b5704a025172ae98b3937013..2034ad3441e274ce79d145b8a471794bd1d2b92d 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/reactor.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/reactor.go
@@ -1,8 +1,6 @@
 package consensus
 
 import (
-	"bytes"
-	"context"
 	"fmt"
 	"reflect"
 	"sync"
@@ -10,11 +8,12 @@ import (
 
 	"github.com/pkg/errors"
 
-	wire "github.com/tendermint/go-wire"
+	amino "github.com/tendermint/go-amino"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/log"
 
 	cstypes "github.com/tendermint/tendermint/consensus/types"
+	tmevents "github.com/tendermint/tendermint/libs/events"
 	"github.com/tendermint/tendermint/p2p"
 	sm "github.com/tendermint/tendermint/state"
 	"github.com/tendermint/tendermint/types"
@@ -26,7 +25,7 @@ const (
 	VoteChannel        = byte(0x22)
 	VoteSetBitsChannel = byte(0x23)
 
-	maxConsensusMessageSize = 1048576 // 1MB; NOTE/TODO: keep in sync with types.PartSet sizes.
+	maxMsgSize = 1048576 // 1MB; NOTE/TODO: keep in sync with types.PartSet sizes.
 
 	blocksToContributeToBecomeGoodPeer = 10000
 )
@@ -44,7 +43,8 @@ type ConsensusReactor struct {
 	eventBus *types.EventBus
 }
 
-// NewConsensusReactor returns a new ConsensusReactor with the given consensusState.
+// NewConsensusReactor returns a new ConsensusReactor with the given
+// consensusState.
 func NewConsensusReactor(consensusState *ConsensusState, fastSync bool) *ConsensusReactor {
 	conR := &ConsensusReactor{
 		conS:     consensusState,
@@ -54,17 +54,15 @@ func NewConsensusReactor(consensusState *ConsensusState, fastSync bool) *Consens
 	return conR
 }
 
-// OnStart implements BaseService.
+// OnStart implements BaseService by subscribing to events, which later will be
+// broadcasted to other peers and starting state if we're not in fast sync.
 func (conR *ConsensusReactor) OnStart() error {
 	conR.Logger.Info("ConsensusReactor ", "fastSync", conR.FastSync())
 	if err := conR.BaseReactor.OnStart(); err != nil {
 		return err
 	}
 
-	err := conR.startBroadcastRoutine()
-	if err != nil {
-		return err
-	}
+	conR.subscribeToBroadcastEvents()
 
 	if !conR.FastSync() {
 		err := conR.conS.Start()
@@ -76,9 +74,11 @@ func (conR *ConsensusReactor) OnStart() error {
 	return nil
 }
 
-// OnStop implements BaseService
+// OnStop implements BaseService by unsubscribing from events and stopping
+// state.
 func (conR *ConsensusReactor) OnStop() {
 	conR.BaseReactor.OnStop()
+	conR.unsubscribeFromBroadcastEvents()
 	conR.conS.Stop()
 }
 
@@ -102,6 +102,7 @@ func (conR *ConsensusReactor) SwitchToConsensus(state sm.State, blocksSynced int
 	err := conR.conS.Start()
 	if err != nil {
 		conR.Logger.Error("Error starting conS", "err", err)
+		return
 	}
 }
 
@@ -110,27 +111,31 @@ func (conR *ConsensusReactor) GetChannels() []*p2p.ChannelDescriptor {
 	// TODO optimize
 	return []*p2p.ChannelDescriptor{
 		{
-			ID:                StateChannel,
-			Priority:          5,
-			SendQueueCapacity: 100,
+			ID:                  StateChannel,
+			Priority:            5,
+			SendQueueCapacity:   100,
+			RecvMessageCapacity: maxMsgSize,
 		},
 		{
-			ID:                 DataChannel, // maybe split between gossiping current block and catchup stuff
-			Priority:           10,          // once we gossip the whole block there's nothing left to send until next height or round
-			SendQueueCapacity:  100,
-			RecvBufferCapacity: 50 * 4096,
+			ID:                  DataChannel, // maybe split between gossiping current block and catchup stuff
+			Priority:            10,          // once we gossip the whole block there's nothing left to send until next height or round
+			SendQueueCapacity:   100,
+			RecvBufferCapacity:  50 * 4096,
+			RecvMessageCapacity: maxMsgSize,
 		},
 		{
-			ID:                 VoteChannel,
-			Priority:           5,
-			SendQueueCapacity:  100,
-			RecvBufferCapacity: 100 * 100,
+			ID:                  VoteChannel,
+			Priority:            5,
+			SendQueueCapacity:   100,
+			RecvBufferCapacity:  100 * 100,
+			RecvMessageCapacity: maxMsgSize,
 		},
 		{
-			ID:                 VoteSetBitsChannel,
-			Priority:           1,
-			SendQueueCapacity:  2,
-			RecvBufferCapacity: 1024,
+			ID:                  VoteSetBitsChannel,
+			Priority:            1,
+			SendQueueCapacity:   2,
+			RecvBufferCapacity:  1024,
+			RecvMessageCapacity: maxMsgSize,
 		},
 	}
 }
@@ -178,7 +183,7 @@ func (conR *ConsensusReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte)
 		return
 	}
 
-	_, msg, err := DecodeMessage(msgBytes)
+	msg, err := DecodeMessage(msgBytes)
 	if err != nil {
 		conR.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes)
 		conR.Switch.StopPeerForError(src, err)
@@ -207,7 +212,7 @@ func (conR *ConsensusReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte)
 				return
 			}
 			// Peer claims to have a maj23 for some BlockID at H,R,S,
-			err := votes.SetPeerMaj23(msg.Round, msg.Type, ps.Peer.ID(), msg.BlockID)
+			err := votes.SetPeerMaj23(msg.Round, msg.Type, ps.peer.ID(), msg.BlockID)
 			if err != nil {
 				conR.Switch.StopPeerForError(src, err)
 				return
@@ -224,13 +229,13 @@ func (conR *ConsensusReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte)
 				conR.Logger.Error("Bad VoteSetBitsMessage field Type")
 				return
 			}
-			src.TrySend(VoteSetBitsChannel, struct{ ConsensusMessage }{&VoteSetBitsMessage{
+			src.TrySend(VoteSetBitsChannel, cdc.MustMarshalBinaryBare(&VoteSetBitsMessage{
 				Height:  msg.Height,
 				Round:   msg.Round,
 				Type:    msg.Type,
 				BlockID: msg.BlockID,
 				Votes:   ourVotes,
-			}})
+			}))
 		case *ProposalHeartbeatMessage:
 			hb := msg.Heartbeat
 			conR.Logger.Debug("Received proposal heartbeat message",
@@ -342,83 +347,46 @@ func (conR *ConsensusReactor) FastSync() bool {
 
 //--------------------------------------
 
-// startBroadcastRoutine subscribes for new round steps, votes and proposal
-// heartbeats using the event bus and starts a go routine to broadcasts events
-// to peers upon receiving them.
-func (conR *ConsensusReactor) startBroadcastRoutine() error {
+// subscribeToBroadcastEvents subscribes for new round steps, votes and
+// proposal heartbeats using internal pubsub defined on state to broadcast
+// them to peers upon receiving.
+func (conR *ConsensusReactor) subscribeToBroadcastEvents() {
 	const subscriber = "consensus-reactor"
-	ctx := context.Background()
+	conR.conS.evsw.AddListenerForEvent(subscriber, types.EventNewRoundStep,
+		func(data tmevents.EventData) {
+			conR.broadcastNewRoundStepMessages(data.(*cstypes.RoundState))
+		})
 
-	// new round steps
-	stepsCh := make(chan interface{})
-	err := conR.eventBus.Subscribe(ctx, subscriber, types.EventQueryNewRoundStep, stepsCh)
-	if err != nil {
-		return errors.Wrapf(err, "failed to subscribe %s to %s", subscriber, types.EventQueryNewRoundStep)
-	}
+	conR.conS.evsw.AddListenerForEvent(subscriber, types.EventVote,
+		func(data tmevents.EventData) {
+			conR.broadcastHasVoteMessage(data.(*types.Vote))
+		})
 
-	// votes
-	votesCh := make(chan interface{})
-	err = conR.eventBus.Subscribe(ctx, subscriber, types.EventQueryVote, votesCh)
-	if err != nil {
-		return errors.Wrapf(err, "failed to subscribe %s to %s", subscriber, types.EventQueryVote)
-	}
-
-	// proposal heartbeats
-	heartbeatsCh := make(chan interface{})
-	err = conR.eventBus.Subscribe(ctx, subscriber, types.EventQueryProposalHeartbeat, heartbeatsCh)
-	if err != nil {
-		return errors.Wrapf(err, "failed to subscribe %s to %s", subscriber, types.EventQueryProposalHeartbeat)
-	}
-
-	go func() {
-		var data interface{}
-		var ok bool
-		for {
-			select {
-			case data, ok = <-stepsCh:
-				if ok { // a receive from a closed channel returns the zero value immediately
-					edrs := data.(types.TMEventData).Unwrap().(types.EventDataRoundState)
-					conR.broadcastNewRoundStep(edrs.RoundState.(*cstypes.RoundState))
-				}
-			case data, ok = <-votesCh:
-				if ok {
-					edv := data.(types.TMEventData).Unwrap().(types.EventDataVote)
-					conR.broadcastHasVoteMessage(edv.Vote)
-				}
-			case data, ok = <-heartbeatsCh:
-				if ok {
-					edph := data.(types.TMEventData).Unwrap().(types.EventDataProposalHeartbeat)
-					conR.broadcastProposalHeartbeatMessage(edph)
-				}
-			case <-conR.Quit():
-				conR.eventBus.UnsubscribeAll(ctx, subscriber)
-				return
-			}
-			if !ok {
-				conR.eventBus.UnsubscribeAll(ctx, subscriber)
-				return
-			}
-		}
-	}()
+	conR.conS.evsw.AddListenerForEvent(subscriber, types.EventProposalHeartbeat,
+		func(data tmevents.EventData) {
+			conR.broadcastProposalHeartbeatMessage(data.(*types.Heartbeat))
+		})
+}
 
-	return nil
+func (conR *ConsensusReactor) unsubscribeFromBroadcastEvents() {
+	const subscriber = "consensus-reactor"
+	conR.conS.evsw.RemoveListener(subscriber)
 }
 
-func (conR *ConsensusReactor) broadcastProposalHeartbeatMessage(heartbeat types.EventDataProposalHeartbeat) {
-	hb := heartbeat.Heartbeat
+func (conR *ConsensusReactor) broadcastProposalHeartbeatMessage(hb *types.Heartbeat) {
 	conR.Logger.Debug("Broadcasting proposal heartbeat message",
 		"height", hb.Height, "round", hb.Round, "sequence", hb.Sequence)
 	msg := &ProposalHeartbeatMessage{hb}
-	conR.Switch.Broadcast(StateChannel, struct{ ConsensusMessage }{msg})
+	conR.Switch.Broadcast(StateChannel, cdc.MustMarshalBinaryBare(msg))
 }
 
-func (conR *ConsensusReactor) broadcastNewRoundStep(rs *cstypes.RoundState) {
+func (conR *ConsensusReactor) broadcastNewRoundStepMessages(rs *cstypes.RoundState) {
 	nrsMsg, csMsg := makeRoundStepMessages(rs)
 	if nrsMsg != nil {
-		conR.Switch.Broadcast(StateChannel, struct{ ConsensusMessage }{nrsMsg})
+		conR.Switch.Broadcast(StateChannel, cdc.MustMarshalBinaryBare(nrsMsg))
 	}
 	if csMsg != nil {
-		conR.Switch.Broadcast(StateChannel, struct{ ConsensusMessage }{csMsg})
+		conR.Switch.Broadcast(StateChannel, cdc.MustMarshalBinaryBare(csMsg))
 	}
 }
 
@@ -430,7 +398,7 @@ func (conR *ConsensusReactor) broadcastHasVoteMessage(vote *types.Vote) {
 		Type:   vote.Type,
 		Index:  vote.ValidatorIndex,
 	}
-	conR.Switch.Broadcast(StateChannel, struct{ ConsensusMessage }{msg})
+	conR.Switch.Broadcast(StateChannel, cdc.MustMarshalBinaryBare(msg))
 	/*
 		// TODO: Make this broadcast more selective.
 		for _, peer := range conR.Switch.Peers().List() {
@@ -470,10 +438,10 @@ func (conR *ConsensusReactor) sendNewRoundStepMessages(peer p2p.Peer) {
 	rs := conR.conS.GetRoundState()
 	nrsMsg, csMsg := makeRoundStepMessages(rs)
 	if nrsMsg != nil {
-		peer.Send(StateChannel, struct{ ConsensusMessage }{nrsMsg})
+		peer.Send(StateChannel, cdc.MustMarshalBinaryBare(nrsMsg))
 	}
 	if csMsg != nil {
-		peer.Send(StateChannel, struct{ ConsensusMessage }{csMsg})
+		peer.Send(StateChannel, cdc.MustMarshalBinaryBare(csMsg))
 	}
 }
 
@@ -500,7 +468,7 @@ OUTER_LOOP:
 					Part:   part,
 				}
 				logger.Debug("Sending block part", "height", prs.Height, "round", prs.Round)
-				if peer.Send(DataChannel, struct{ ConsensusMessage }{msg}) {
+				if peer.Send(DataChannel, cdc.MustMarshalBinaryBare(msg)) {
 					ps.SetHasProposalBlockPart(prs.Height, prs.Round, index)
 				}
 				continue OUTER_LOOP
@@ -544,7 +512,7 @@ OUTER_LOOP:
 			{
 				msg := &ProposalMessage{Proposal: rs.Proposal}
 				logger.Debug("Sending proposal", "height", prs.Height, "round", prs.Round)
-				if peer.Send(DataChannel, struct{ ConsensusMessage }{msg}) {
+				if peer.Send(DataChannel, cdc.MustMarshalBinaryBare(msg)) {
 					ps.SetHasProposal(rs.Proposal)
 				}
 			}
@@ -559,7 +527,7 @@ OUTER_LOOP:
 					ProposalPOL:      rs.Votes.Prevotes(rs.Proposal.POLRound).BitArray(),
 				}
 				logger.Debug("Sending POL", "height", prs.Height, "round", prs.Round)
-				peer.Send(DataChannel, struct{ ConsensusMessage }{msg})
+				peer.Send(DataChannel, cdc.MustMarshalBinaryBare(msg))
 			}
 			continue OUTER_LOOP
 		}
@@ -602,7 +570,7 @@ func (conR *ConsensusReactor) gossipDataForCatchup(logger log.Logger, rs *cstype
 			Part:   part,
 		}
 		logger.Debug("Sending block part for catchup", "round", prs.Round, "index", index)
-		if peer.Send(DataChannel, struct{ ConsensusMessage }{msg}) {
+		if peer.Send(DataChannel, cdc.MustMarshalBinaryBare(msg)) {
 			ps.SetHasProposalBlockPart(prs.Height, prs.Round, index)
 		} else {
 			logger.Debug("Sending block part for catchup failed")
@@ -693,20 +661,37 @@ func (conR *ConsensusReactor) gossipVotesForHeight(logger log.Logger, rs *cstype
 			return true
 		}
 	}
+	// If there are POL prevotes to send...
+	if prs.Step <= cstypes.RoundStepPropose && prs.Round != -1 && prs.Round <= rs.Round && prs.ProposalPOLRound != -1 {
+		if polPrevotes := rs.Votes.Prevotes(prs.ProposalPOLRound); polPrevotes != nil {
+			if ps.PickSendVote(polPrevotes) {
+				logger.Debug("Picked rs.Prevotes(prs.ProposalPOLRound) to send",
+					"round", prs.ProposalPOLRound)
+				return true
+			}
+		}
+	}
 	// If there are prevotes to send...
-	if prs.Step <= cstypes.RoundStepPrevote && prs.Round != -1 && prs.Round <= rs.Round {
+	if prs.Step <= cstypes.RoundStepPrevoteWait && prs.Round != -1 && prs.Round <= rs.Round {
 		if ps.PickSendVote(rs.Votes.Prevotes(prs.Round)) {
 			logger.Debug("Picked rs.Prevotes(prs.Round) to send", "round", prs.Round)
 			return true
 		}
 	}
 	// If there are precommits to send...
-	if prs.Step <= cstypes.RoundStepPrecommit && prs.Round != -1 && prs.Round <= rs.Round {
+	if prs.Step <= cstypes.RoundStepPrecommitWait && prs.Round != -1 && prs.Round <= rs.Round {
 		if ps.PickSendVote(rs.Votes.Precommits(prs.Round)) {
 			logger.Debug("Picked rs.Precommits(prs.Round) to send", "round", prs.Round)
 			return true
 		}
 	}
+	// If there are prevotes to send...Needed because of validBlock mechanism
+	if prs.Round != -1 && prs.Round <= rs.Round {
+		if ps.PickSendVote(rs.Votes.Prevotes(prs.Round)) {
+			logger.Debug("Picked rs.Prevotes(prs.Round) to send", "round", prs.Round)
+			return true
+		}
+	}
 	// If there are POLPrevotes to send...
 	if prs.ProposalPOLRound != -1 {
 		if polPrevotes := rs.Votes.Prevotes(prs.ProposalPOLRound); polPrevotes != nil {
@@ -717,6 +702,7 @@ func (conR *ConsensusReactor) gossipVotesForHeight(logger log.Logger, rs *cstype
 			}
 		}
 	}
+
 	return false
 }
 
@@ -739,12 +725,12 @@ OUTER_LOOP:
 			prs := ps.GetRoundState()
 			if rs.Height == prs.Height {
 				if maj23, ok := rs.Votes.Prevotes(prs.Round).TwoThirdsMajority(); ok {
-					peer.TrySend(StateChannel, struct{ ConsensusMessage }{&VoteSetMaj23Message{
+					peer.TrySend(StateChannel, cdc.MustMarshalBinaryBare(&VoteSetMaj23Message{
 						Height:  prs.Height,
 						Round:   prs.Round,
 						Type:    types.VoteTypePrevote,
 						BlockID: maj23,
-					}})
+					}))
 					time.Sleep(conR.conS.config.PeerQueryMaj23Sleep())
 				}
 			}
@@ -756,12 +742,12 @@ OUTER_LOOP:
 			prs := ps.GetRoundState()
 			if rs.Height == prs.Height {
 				if maj23, ok := rs.Votes.Precommits(prs.Round).TwoThirdsMajority(); ok {
-					peer.TrySend(StateChannel, struct{ ConsensusMessage }{&VoteSetMaj23Message{
+					peer.TrySend(StateChannel, cdc.MustMarshalBinaryBare(&VoteSetMaj23Message{
 						Height:  prs.Height,
 						Round:   prs.Round,
 						Type:    types.VoteTypePrecommit,
 						BlockID: maj23,
-					}})
+					}))
 					time.Sleep(conR.conS.config.PeerQueryMaj23Sleep())
 				}
 			}
@@ -773,12 +759,12 @@ OUTER_LOOP:
 			prs := ps.GetRoundState()
 			if rs.Height == prs.Height && prs.ProposalPOLRound >= 0 {
 				if maj23, ok := rs.Votes.Prevotes(prs.ProposalPOLRound).TwoThirdsMajority(); ok {
-					peer.TrySend(StateChannel, struct{ ConsensusMessage }{&VoteSetMaj23Message{
+					peer.TrySend(StateChannel, cdc.MustMarshalBinaryBare(&VoteSetMaj23Message{
 						Height:  prs.Height,
 						Round:   prs.ProposalPOLRound,
 						Type:    types.VoteTypePrevote,
 						BlockID: maj23,
-					}})
+					}))
 					time.Sleep(conR.conS.config.PeerQueryMaj23Sleep())
 				}
 			}
@@ -792,12 +778,12 @@ OUTER_LOOP:
 			prs := ps.GetRoundState()
 			if prs.CatchupCommitRound != -1 && 0 < prs.Height && prs.Height <= conR.conS.blockStore.Height() {
 				commit := conR.conS.LoadCommit(prs.Height)
-				peer.TrySend(StateChannel, struct{ ConsensusMessage }{&VoteSetMaj23Message{
+				peer.TrySend(StateChannel, cdc.MustMarshalBinaryBare(&VoteSetMaj23Message{
 					Height:  prs.Height,
 					Round:   commit.Round(),
 					Type:    types.VoteTypePrecommit,
 					BlockID: commit.BlockID,
-				}})
+				}))
 				time.Sleep(conR.conS.config.PeerQueryMaj23Sleep())
 			}
 		}
@@ -835,67 +821,78 @@ var (
 	ErrPeerStateInvalidStartTime = errors.New("Error peer state invalid startTime")
 )
 
-// PeerState contains the known state of a peer, including its connection
-// and threadsafe access to its PeerRoundState.
+// PeerState contains the known state of a peer, including its connection and
+// threadsafe access to its PeerRoundState.
+// NOTE: THIS GETS DUMPED WITH rpc/core/consensus.go.
+// Be mindful of what you Expose.
 type PeerState struct {
-	Peer   p2p.Peer
+	peer   p2p.Peer
 	logger log.Logger
 
-	mtx sync.Mutex
-	cstypes.PeerRoundState
-
-	stats *peerStateStats
+	mtx   sync.Mutex             `json:"-"`           // NOTE: Modify below using setters, never directly.
+	PRS   cstypes.PeerRoundState `json:"round_state"` // Exposed.
+	Stats *peerStateStats        `json:"stats"`       // Exposed.
 }
 
 // peerStateStats holds internal statistics for a peer.
 type peerStateStats struct {
-	lastVoteHeight int64
-	votes          int
-
-	lastBlockPartHeight int64
-	blockParts          int
+	LastVoteHeight      int64 `json:"last_vote_height"`
+	Votes               int   `json:"votes"`
+	LastBlockPartHeight int64 `json:"last_block_part_height"`
+	BlockParts          int   `json:"block_parts"`
 }
 
 func (pss peerStateStats) String() string {
-	return fmt.Sprintf("peerStateStats{votes: %d, blockParts: %d}", pss.votes, pss.blockParts)
+	return fmt.Sprintf("peerStateStats{lvh: %d, votes: %d, lbph: %d, blockParts: %d}",
+		pss.LastVoteHeight, pss.Votes, pss.LastBlockPartHeight, pss.BlockParts)
 }
 
 // NewPeerState returns a new PeerState for the given Peer
 func NewPeerState(peer p2p.Peer) *PeerState {
 	return &PeerState{
-		Peer:   peer,
+		peer:   peer,
 		logger: log.NewNopLogger(),
-		PeerRoundState: cstypes.PeerRoundState{
+		PRS: cstypes.PeerRoundState{
 			Round:              -1,
 			ProposalPOLRound:   -1,
 			LastCommitRound:    -1,
 			CatchupCommitRound: -1,
 		},
-		stats: &peerStateStats{},
+		Stats: &peerStateStats{},
 	}
 }
 
+// SetLogger allows to set a logger on the peer state. Returns the peer state
+// itself.
 func (ps *PeerState) SetLogger(logger log.Logger) *PeerState {
 	ps.logger = logger
 	return ps
 }
 
-// GetRoundState returns an atomic snapshot of the PeerRoundState.
+// GetRoundState returns an shallow copy of the PeerRoundState.
 // There's no point in mutating it since it won't change PeerState.
 func (ps *PeerState) GetRoundState() *cstypes.PeerRoundState {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	prs := ps.PeerRoundState // copy
+	prs := ps.PRS // copy
 	return &prs
 }
 
+// ToJSON returns a json of PeerState, marshalled using go-amino.
+func (ps *PeerState) ToJSON() ([]byte, error) {
+	ps.mtx.Lock()
+	defer ps.mtx.Unlock()
+
+	return cdc.MarshalJSON(ps)
+}
+
 // GetHeight returns an atomic snapshot of the PeerRoundState's height
 // used by the mempool to ensure peers are caught up before broadcasting new txs
 func (ps *PeerState) GetHeight() int64 {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
-	return ps.PeerRoundState.Height
+	return ps.PRS.Height
 }
 
 // SetHasProposal sets the given proposal as known for the peer.
@@ -903,18 +900,18 @@ func (ps *PeerState) SetHasProposal(proposal *types.Proposal) {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.Height != proposal.Height || ps.Round != proposal.Round {
+	if ps.PRS.Height != proposal.Height || ps.PRS.Round != proposal.Round {
 		return
 	}
-	if ps.Proposal {
+	if ps.PRS.Proposal {
 		return
 	}
 
-	ps.Proposal = true
-	ps.ProposalBlockPartsHeader = proposal.BlockPartsHeader
-	ps.ProposalBlockParts = cmn.NewBitArray(proposal.BlockPartsHeader.Total)
-	ps.ProposalPOLRound = proposal.POLRound
-	ps.ProposalPOL = nil // Nil until ProposalPOLMessage received.
+	ps.PRS.Proposal = true
+	ps.PRS.ProposalBlockPartsHeader = proposal.BlockPartsHeader
+	ps.PRS.ProposalBlockParts = cmn.NewBitArray(proposal.BlockPartsHeader.Total)
+	ps.PRS.ProposalPOLRound = proposal.POLRound
+	ps.PRS.ProposalPOL = nil // Nil until ProposalPOLMessage received.
 }
 
 // InitProposalBlockParts initializes the peer's proposal block parts header and bit array.
@@ -922,12 +919,12 @@ func (ps *PeerState) InitProposalBlockParts(partsHeader types.PartSetHeader) {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.ProposalBlockParts != nil {
+	if ps.PRS.ProposalBlockParts != nil {
 		return
 	}
 
-	ps.ProposalBlockPartsHeader = partsHeader
-	ps.ProposalBlockParts = cmn.NewBitArray(partsHeader.Total)
+	ps.PRS.ProposalBlockPartsHeader = partsHeader
+	ps.PRS.ProposalBlockParts = cmn.NewBitArray(partsHeader.Total)
 }
 
 // SetHasProposalBlockPart sets the given block part index as known for the peer.
@@ -935,11 +932,11 @@ func (ps *PeerState) SetHasProposalBlockPart(height int64, round int, index int)
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.Height != height || ps.Round != round {
+	if ps.PRS.Height != height || ps.PRS.Round != round {
 		return
 	}
 
-	ps.ProposalBlockParts.SetIndex(index, true)
+	ps.PRS.ProposalBlockParts.SetIndex(index, true)
 }
 
 // PickSendVote picks a vote and sends it to the peer.
@@ -948,7 +945,7 @@ func (ps *PeerState) PickSendVote(votes types.VoteSetReader) bool {
 	if vote, ok := ps.PickVoteToSend(votes); ok {
 		msg := &VoteMessage{vote}
 		ps.logger.Debug("Sending vote message", "ps", ps, "vote", vote)
-		return ps.Peer.Send(VoteChannel, struct{ ConsensusMessage }{msg})
+		return ps.peer.Send(VoteChannel, cdc.MustMarshalBinaryBare(msg))
 	}
 	return false
 }
@@ -988,40 +985,40 @@ func (ps *PeerState) getVoteBitArray(height int64, round int, type_ byte) *cmn.B
 		return nil
 	}
 
-	if ps.Height == height {
-		if ps.Round == round {
+	if ps.PRS.Height == height {
+		if ps.PRS.Round == round {
 			switch type_ {
 			case types.VoteTypePrevote:
-				return ps.Prevotes
+				return ps.PRS.Prevotes
 			case types.VoteTypePrecommit:
-				return ps.Precommits
+				return ps.PRS.Precommits
 			}
 		}
-		if ps.CatchupCommitRound == round {
+		if ps.PRS.CatchupCommitRound == round {
 			switch type_ {
 			case types.VoteTypePrevote:
 				return nil
 			case types.VoteTypePrecommit:
-				return ps.CatchupCommit
+				return ps.PRS.CatchupCommit
 			}
 		}
-		if ps.ProposalPOLRound == round {
+		if ps.PRS.ProposalPOLRound == round {
 			switch type_ {
 			case types.VoteTypePrevote:
-				return ps.ProposalPOL
+				return ps.PRS.ProposalPOL
 			case types.VoteTypePrecommit:
 				return nil
 			}
 		}
 		return nil
 	}
-	if ps.Height == height+1 {
-		if ps.LastCommitRound == round {
+	if ps.PRS.Height == height+1 {
+		if ps.PRS.LastCommitRound == round {
 			switch type_ {
 			case types.VoteTypePrevote:
 				return nil
 			case types.VoteTypePrecommit:
-				return ps.LastCommit
+				return ps.PRS.LastCommit
 			}
 		}
 		return nil
@@ -1031,7 +1028,7 @@ func (ps *PeerState) getVoteBitArray(height int64, round int, type_ byte) *cmn.B
 
 // 'round': A round for which we have a +2/3 commit.
 func (ps *PeerState) ensureCatchupCommitRound(height int64, round int, numValidators int) {
-	if ps.Height != height {
+	if ps.PRS.Height != height {
 		return
 	}
 	/*
@@ -1041,18 +1038,18 @@ func (ps *PeerState) ensureCatchupCommitRound(height int64, round int, numValida
 			cmn.PanicSanity(cmn.Fmt("Conflicting CatchupCommitRound. Height: %v, Orig: %v, New: %v", height, ps.CatchupCommitRound, round))
 		}
 	*/
-	if ps.CatchupCommitRound == round {
+	if ps.PRS.CatchupCommitRound == round {
 		return // Nothing to do!
 	}
-	ps.CatchupCommitRound = round
-	if round == ps.Round {
-		ps.CatchupCommit = ps.Precommits
+	ps.PRS.CatchupCommitRound = round
+	if round == ps.PRS.Round {
+		ps.PRS.CatchupCommit = ps.PRS.Precommits
 	} else {
-		ps.CatchupCommit = cmn.NewBitArray(numValidators)
+		ps.PRS.CatchupCommit = cmn.NewBitArray(numValidators)
 	}
 }
 
-// EnsureVoteVitArrays ensures the bit-arrays have been allocated for tracking
+// EnsureVoteBitArrays ensures the bit-arrays have been allocated for tracking
 // what votes this peer has received.
 // NOTE: It's important to make sure that numValidators actually matches
 // what the node sees as the number of validators for height.
@@ -1063,22 +1060,22 @@ func (ps *PeerState) EnsureVoteBitArrays(height int64, numValidators int) {
 }
 
 func (ps *PeerState) ensureVoteBitArrays(height int64, numValidators int) {
-	if ps.Height == height {
-		if ps.Prevotes == nil {
-			ps.Prevotes = cmn.NewBitArray(numValidators)
+	if ps.PRS.Height == height {
+		if ps.PRS.Prevotes == nil {
+			ps.PRS.Prevotes = cmn.NewBitArray(numValidators)
 		}
-		if ps.Precommits == nil {
-			ps.Precommits = cmn.NewBitArray(numValidators)
+		if ps.PRS.Precommits == nil {
+			ps.PRS.Precommits = cmn.NewBitArray(numValidators)
 		}
-		if ps.CatchupCommit == nil {
-			ps.CatchupCommit = cmn.NewBitArray(numValidators)
+		if ps.PRS.CatchupCommit == nil {
+			ps.PRS.CatchupCommit = cmn.NewBitArray(numValidators)
 		}
-		if ps.ProposalPOL == nil {
-			ps.ProposalPOL = cmn.NewBitArray(numValidators)
+		if ps.PRS.ProposalPOL == nil {
+			ps.PRS.ProposalPOL = cmn.NewBitArray(numValidators)
 		}
-	} else if ps.Height == height+1 {
-		if ps.LastCommit == nil {
-			ps.LastCommit = cmn.NewBitArray(numValidators)
+	} else if ps.PRS.Height == height+1 {
+		if ps.PRS.LastCommit == nil {
+			ps.PRS.LastCommit = cmn.NewBitArray(numValidators)
 		}
 	}
 }
@@ -1090,12 +1087,12 @@ func (ps *PeerState) RecordVote(vote *types.Vote) int {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.stats.lastVoteHeight >= vote.Height {
-		return ps.stats.votes
+	if ps.Stats.LastVoteHeight >= vote.Height {
+		return ps.Stats.Votes
 	}
-	ps.stats.lastVoteHeight = vote.Height
-	ps.stats.votes++
-	return ps.stats.votes
+	ps.Stats.LastVoteHeight = vote.Height
+	ps.Stats.Votes++
+	return ps.Stats.Votes
 }
 
 // VotesSent returns the number of blocks for which peer has been sending us
@@ -1104,7 +1101,7 @@ func (ps *PeerState) VotesSent() int {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	return ps.stats.votes
+	return ps.Stats.Votes
 }
 
 // RecordBlockPart updates internal statistics for this peer by recording the
@@ -1115,13 +1112,13 @@ func (ps *PeerState) RecordBlockPart(bp *BlockPartMessage) int {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.stats.lastBlockPartHeight >= bp.Height {
-		return ps.stats.blockParts
+	if ps.Stats.LastBlockPartHeight >= bp.Height {
+		return ps.Stats.BlockParts
 	}
 
-	ps.stats.lastBlockPartHeight = bp.Height
-	ps.stats.blockParts++
-	return ps.stats.blockParts
+	ps.Stats.LastBlockPartHeight = bp.Height
+	ps.Stats.BlockParts++
+	return ps.Stats.BlockParts
 }
 
 // BlockPartsSent returns the number of blocks for which peer has been sending
@@ -1130,7 +1127,7 @@ func (ps *PeerState) BlockPartsSent() int {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	return ps.stats.blockParts
+	return ps.Stats.BlockParts
 }
 
 // SetHasVote sets the given vote as known by the peer
@@ -1142,7 +1139,7 @@ func (ps *PeerState) SetHasVote(vote *types.Vote) {
 }
 
 func (ps *PeerState) setHasVote(height int64, round int, type_ byte, index int) {
-	logger := ps.logger.With("peerH/R", cmn.Fmt("%d/%d", ps.Height, ps.Round), "H/R", cmn.Fmt("%d/%d", height, round))
+	logger := ps.logger.With("peerH/R", cmn.Fmt("%d/%d", ps.PRS.Height, ps.PRS.Round), "H/R", cmn.Fmt("%d/%d", height, round))
 	logger.Debug("setHasVote", "type", type_, "index", index)
 
 	// NOTE: some may be nil BitArrays -> no side effects.
@@ -1158,51 +1155,51 @@ func (ps *PeerState) ApplyNewRoundStepMessage(msg *NewRoundStepMessage) {
 	defer ps.mtx.Unlock()
 
 	// Ignore duplicates or decreases
-	if CompareHRS(msg.Height, msg.Round, msg.Step, ps.Height, ps.Round, ps.Step) <= 0 {
+	if CompareHRS(msg.Height, msg.Round, msg.Step, ps.PRS.Height, ps.PRS.Round, ps.PRS.Step) <= 0 {
 		return
 	}
 
 	// Just remember these values.
-	psHeight := ps.Height
-	psRound := ps.Round
-	//psStep := ps.Step
-	psCatchupCommitRound := ps.CatchupCommitRound
-	psCatchupCommit := ps.CatchupCommit
+	psHeight := ps.PRS.Height
+	psRound := ps.PRS.Round
+	//psStep := ps.PRS.Step
+	psCatchupCommitRound := ps.PRS.CatchupCommitRound
+	psCatchupCommit := ps.PRS.CatchupCommit
 
 	startTime := time.Now().Add(-1 * time.Duration(msg.SecondsSinceStartTime) * time.Second)
-	ps.Height = msg.Height
-	ps.Round = msg.Round
-	ps.Step = msg.Step
-	ps.StartTime = startTime
+	ps.PRS.Height = msg.Height
+	ps.PRS.Round = msg.Round
+	ps.PRS.Step = msg.Step
+	ps.PRS.StartTime = startTime
 	if psHeight != msg.Height || psRound != msg.Round {
-		ps.Proposal = false
-		ps.ProposalBlockPartsHeader = types.PartSetHeader{}
-		ps.ProposalBlockParts = nil
-		ps.ProposalPOLRound = -1
-		ps.ProposalPOL = nil
+		ps.PRS.Proposal = false
+		ps.PRS.ProposalBlockPartsHeader = types.PartSetHeader{}
+		ps.PRS.ProposalBlockParts = nil
+		ps.PRS.ProposalPOLRound = -1
+		ps.PRS.ProposalPOL = nil
 		// We'll update the BitArray capacity later.
-		ps.Prevotes = nil
-		ps.Precommits = nil
+		ps.PRS.Prevotes = nil
+		ps.PRS.Precommits = nil
 	}
 	if psHeight == msg.Height && psRound != msg.Round && msg.Round == psCatchupCommitRound {
 		// Peer caught up to CatchupCommitRound.
 		// Preserve psCatchupCommit!
 		// NOTE: We prefer to use prs.Precommits if
 		// pr.Round matches pr.CatchupCommitRound.
-		ps.Precommits = psCatchupCommit
+		ps.PRS.Precommits = psCatchupCommit
 	}
 	if psHeight != msg.Height {
 		// Shift Precommits to LastCommit.
 		if psHeight+1 == msg.Height && psRound == msg.LastCommitRound {
-			ps.LastCommitRound = msg.LastCommitRound
-			ps.LastCommit = ps.Precommits
+			ps.PRS.LastCommitRound = msg.LastCommitRound
+			ps.PRS.LastCommit = ps.PRS.Precommits
 		} else {
-			ps.LastCommitRound = msg.LastCommitRound
-			ps.LastCommit = nil
+			ps.PRS.LastCommitRound = msg.LastCommitRound
+			ps.PRS.LastCommit = nil
 		}
 		// We'll update the BitArray capacity later.
-		ps.CatchupCommitRound = -1
-		ps.CatchupCommit = nil
+		ps.PRS.CatchupCommitRound = -1
+		ps.PRS.CatchupCommit = nil
 	}
 }
 
@@ -1211,12 +1208,12 @@ func (ps *PeerState) ApplyCommitStepMessage(msg *CommitStepMessage) {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.Height != msg.Height {
+	if ps.PRS.Height != msg.Height {
 		return
 	}
 
-	ps.ProposalBlockPartsHeader = msg.BlockPartsHeader
-	ps.ProposalBlockParts = msg.BlockParts
+	ps.PRS.ProposalBlockPartsHeader = msg.BlockPartsHeader
+	ps.PRS.ProposalBlockParts = msg.BlockParts
 }
 
 // ApplyProposalPOLMessage updates the peer state for the new proposal POL.
@@ -1224,16 +1221,16 @@ func (ps *PeerState) ApplyProposalPOLMessage(msg *ProposalPOLMessage) {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.Height != msg.Height {
+	if ps.PRS.Height != msg.Height {
 		return
 	}
-	if ps.ProposalPOLRound != msg.ProposalPOLRound {
+	if ps.PRS.ProposalPOLRound != msg.ProposalPOLRound {
 		return
 	}
 
-	// TODO: Merge onto existing ps.ProposalPOL?
+	// TODO: Merge onto existing ps.PRS.ProposalPOL?
 	// We might have sent some prevotes in the meantime.
-	ps.ProposalPOL = msg.ProposalPOL
+	ps.PRS.ProposalPOL = msg.ProposalPOL
 }
 
 // ApplyHasVoteMessage updates the peer state for the new vote.
@@ -1241,7 +1238,7 @@ func (ps *PeerState) ApplyHasVoteMessage(msg *HasVoteMessage) {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
-	if ps.Height != msg.Height {
+	if ps.PRS.Height != msg.Height {
 		return
 	}
 
@@ -1279,58 +1276,43 @@ func (ps *PeerState) StringIndented(indent string) string {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 	return fmt.Sprintf(`PeerState{
-%s  Key   %v
-%s  PRS   %v
-%s  Stats %v
+%s  Key        %v
+%s  RoundState %v
+%s  Stats      %v
 %s}`,
-		indent, ps.Peer.ID(),
-		indent, ps.PeerRoundState.StringIndented(indent+"  "),
-		indent, ps.stats,
+		indent, ps.peer.ID(),
+		indent, ps.PRS.StringIndented(indent+"  "),
+		indent, ps.Stats,
 		indent)
 }
 
 //-----------------------------------------------------------------------------
 // Messages
 
-const (
-	msgTypeNewRoundStep = byte(0x01)
-	msgTypeCommitStep   = byte(0x02)
-	msgTypeProposal     = byte(0x11)
-	msgTypeProposalPOL  = byte(0x12)
-	msgTypeBlockPart    = byte(0x13) // both block & POL
-	msgTypeVote         = byte(0x14)
-	msgTypeHasVote      = byte(0x15)
-	msgTypeVoteSetMaj23 = byte(0x16)
-	msgTypeVoteSetBits  = byte(0x17)
-
-	msgTypeProposalHeartbeat = byte(0x20)
-)
-
 // ConsensusMessage is a message that can be sent and received on the ConsensusReactor
 type ConsensusMessage interface{}
 
-var _ = wire.RegisterInterface(
-	struct{ ConsensusMessage }{},
-	wire.ConcreteType{&NewRoundStepMessage{}, msgTypeNewRoundStep},
-	wire.ConcreteType{&CommitStepMessage{}, msgTypeCommitStep},
-	wire.ConcreteType{&ProposalMessage{}, msgTypeProposal},
-	wire.ConcreteType{&ProposalPOLMessage{}, msgTypeProposalPOL},
-	wire.ConcreteType{&BlockPartMessage{}, msgTypeBlockPart},
-	wire.ConcreteType{&VoteMessage{}, msgTypeVote},
-	wire.ConcreteType{&HasVoteMessage{}, msgTypeHasVote},
-	wire.ConcreteType{&VoteSetMaj23Message{}, msgTypeVoteSetMaj23},
-	wire.ConcreteType{&VoteSetBitsMessage{}, msgTypeVoteSetBits},
-	wire.ConcreteType{&ProposalHeartbeatMessage{}, msgTypeProposalHeartbeat},
-)
+func RegisterConsensusMessages(cdc *amino.Codec) {
+	cdc.RegisterInterface((*ConsensusMessage)(nil), nil)
+	cdc.RegisterConcrete(&NewRoundStepMessage{}, "tendermint/NewRoundStepMessage", nil)
+	cdc.RegisterConcrete(&CommitStepMessage{}, "tendermint/CommitStep", nil)
+	cdc.RegisterConcrete(&ProposalMessage{}, "tendermint/Proposal", nil)
+	cdc.RegisterConcrete(&ProposalPOLMessage{}, "tendermint/ProposalPOL", nil)
+	cdc.RegisterConcrete(&BlockPartMessage{}, "tendermint/BlockPart", nil)
+	cdc.RegisterConcrete(&VoteMessage{}, "tendermint/Vote", nil)
+	cdc.RegisterConcrete(&HasVoteMessage{}, "tendermint/HasVote", nil)
+	cdc.RegisterConcrete(&VoteSetMaj23Message{}, "tendermint/VoteSetMaj23", nil)
+	cdc.RegisterConcrete(&VoteSetBitsMessage{}, "tendermint/VoteSetBits", nil)
+	cdc.RegisterConcrete(&ProposalHeartbeatMessage{}, "tendermint/ProposalHeartbeat", nil)
+}
 
 // DecodeMessage decodes the given bytes into a ConsensusMessage.
-// TODO: check for unnecessary extra bytes at the end.
-func DecodeMessage(bz []byte) (msgType byte, msg ConsensusMessage, err error) {
-	msgType = bz[0]
-	n := new(int)
-	r := bytes.NewReader(bz)
-	msgI := wire.ReadBinary(struct{ ConsensusMessage }{}, r, maxConsensusMessageSize, n, &err)
-	msg = msgI.(struct{ ConsensusMessage }).ConsensusMessage
+func DecodeMessage(bz []byte) (msg ConsensusMessage, err error) {
+	if len(bz) > maxMsgSize {
+		return msg, fmt.Errorf("Msg exceeds max size (%d > %d)",
+			len(bz), maxMsgSize)
+	}
+	err = cdc.UnmarshalBinaryBare(bz, &msg)
 	return
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/consensus/replay.go b/vendor/github.com/tendermint/tendermint/consensus/replay.go
index 5b5a48425ede29ed16f054eee3617747348b3f3b..1df7a912286c56b122d84169ddee9801871243e2 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/replay.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/replay.go
@@ -2,7 +2,6 @@ package consensus
 
 import (
 	"bytes"
-	"encoding/json"
 	"fmt"
 	"hash/crc32"
 	"io"
@@ -26,20 +25,24 @@ import (
 var crc32c = crc32.MakeTable(crc32.Castagnoli)
 
 // Functionality to replay blocks and messages on recovery from a crash.
-// There are two general failure scenarios: failure during consensus, and failure while applying the block.
-// The former is handled by the WAL, the latter by the proxyApp Handshake on restart,
-// which ultimately hands off the work to the WAL.
+// There are two general failure scenarios:
+//
+//  1. failure during consensus
+//  2. failure while applying the block
+//
+// The former is handled by the WAL, the latter by the proxyApp Handshake on
+// restart, which ultimately hands off the work to the WAL.
 
 //-----------------------------------------
-// recover from failure during consensus
-// by replaying messages from the WAL
+// 1. Recover from failure during consensus
+// (by replaying messages from the WAL)
+//-----------------------------------------
 
-// Unmarshal and apply a single message to the consensus state
-// as if it were received in receiveRoutine
-// Lines that start with "#" are ignored.
-// NOTE: receiveRoutine should not be running
+// Unmarshal and apply a single message to the consensus state as if it were
+// received in receiveRoutine.  Lines that start with "#" are ignored.
+// NOTE: receiveRoutine should not be running.
 func (cs *ConsensusState) readReplayMessage(msg *TimedWALMessage, newStepCh chan interface{}) error {
-	// skip meta messages
+	// Skip meta messages which exist for demarcating boundaries.
 	if _, ok := msg.Msg.(EndHeightMessage); ok {
 		return nil
 	}
@@ -89,17 +92,18 @@ func (cs *ConsensusState) readReplayMessage(msg *TimedWALMessage, newStepCh chan
 	return nil
 }
 
-// replay only those messages since the last block.
-// timeoutRoutine should run concurrently to read off tickChan
+// Replay only those messages since the last block.  `timeoutRoutine` should
+// run concurrently to read off tickChan.
 func (cs *ConsensusState) catchupReplay(csHeight int64) error {
-	// set replayMode
+
+	// Set replayMode to true so we don't log signing errors.
 	cs.replayMode = true
 	defer func() { cs.replayMode = false }()
 
-	// Ensure that ENDHEIGHT for this height doesn't exist.
+	// Ensure that #ENDHEIGHT for this height doesn't exist.
 	// NOTE: This is just a sanity check. As far as we know things work fine
 	// without it, and Handshake could reuse ConsensusState if it weren't for
-	// this check (since we can crash after writing ENDHEIGHT).
+	// this check (since we can crash after writing #ENDHEIGHT).
 	//
 	// Ignore data corruption errors since this is a sanity check.
 	gr, found, err := cs.wal.SearchForEndHeight(csHeight, &WALSearchOptions{IgnoreDataCorruptionErrors: true})
@@ -115,7 +119,7 @@ func (cs *ConsensusState) catchupReplay(csHeight int64) error {
 		return fmt.Errorf("WAL should not contain #ENDHEIGHT %d", csHeight)
 	}
 
-	// Search for last height marker
+	// Search for last height marker.
 	//
 	// Ignore data corruption errors in previous heights because we only care about last height
 	gr, found, err = cs.wal.SearchForEndHeight(csHeight-1, &WALSearchOptions{IgnoreDataCorruptionErrors: true})
@@ -182,29 +186,30 @@ func makeHeightSearchFunc(height int64) auto.SearchFunc {
 	}
 }*/
 
-//----------------------------------------------
-// Recover from failure during block processing
-// by handshaking with the app to figure out where
-// we were last and using the WAL to recover there
+//---------------------------------------------------
+// 2. Recover from failure while applying the block.
+// (by handshaking with the app to figure out where
+// we were last, and using the WAL to recover there.)
+//---------------------------------------------------
 
 type Handshaker struct {
 	stateDB      dbm.DB
 	initialState sm.State
 	store        types.BlockStore
-	appState     json.RawMessage
+	genDoc       *types.GenesisDoc
 	logger       log.Logger
 
 	nBlocks int // number of blocks applied to the state
 }
 
 func NewHandshaker(stateDB dbm.DB, state sm.State,
-	store types.BlockStore, appState json.RawMessage) *Handshaker {
+	store types.BlockStore, genDoc *types.GenesisDoc) *Handshaker {
 
 	return &Handshaker{
 		stateDB:      stateDB,
 		initialState: state,
 		store:        store,
-		appState:     appState,
+		genDoc:       genDoc,
 		logger:       log.NewNopLogger(),
 		nBlocks:      0,
 	}
@@ -220,7 +225,8 @@ func (h *Handshaker) NBlocks() int {
 
 // TODO: retry the handshake/replay if it fails ?
 func (h *Handshaker) Handshake(proxyApp proxy.AppConns) error {
-	// handshake is done via info request on the query conn
+
+	// Handshake is done via ABCI Info on the query conn.
 	res, err := proxyApp.Query().InfoSync(abci.RequestInfo{version.Version})
 	if err != nil {
 		return fmt.Errorf("Error calling Info: %v", err)
@@ -234,15 +240,16 @@ func (h *Handshaker) Handshake(proxyApp proxy.AppConns) error {
 
 	h.logger.Info("ABCI Handshake", "appHeight", blockHeight, "appHash", fmt.Sprintf("%X", appHash))
 
-	// TODO: check version
+	// TODO: check app version.
 
-	// replay blocks up to the latest in the blockstore
+	// Replay blocks up to the latest in the blockstore.
 	_, err = h.ReplayBlocks(h.initialState, appHash, blockHeight, proxyApp)
 	if err != nil {
 		return fmt.Errorf("Error on replay: %v", err)
 	}
 
-	h.logger.Info("Completed ABCI Handshake - Tendermint and App are synced", "appHeight", blockHeight, "appHash", fmt.Sprintf("%X", appHash))
+	h.logger.Info("Completed ABCI Handshake - Tendermint and App are synced",
+		"appHeight", blockHeight, "appHash", fmt.Sprintf("%X", appHash))
 
 	// TODO: (on restart) replay mempool
 
@@ -250,7 +257,7 @@ func (h *Handshaker) Handshake(proxyApp proxy.AppConns) error {
 }
 
 // Replay all blocks since appBlockHeight and ensure the result matches the current state.
-// Returns the final AppHash or an error
+// Returns the final AppHash or an error.
 func (h *Handshaker) ReplayBlocks(state sm.State, appHash []byte, appBlockHeight int64, proxyApp proxy.AppConns) ([]byte, error) {
 
 	storeBlockHeight := h.store.Height()
@@ -261,8 +268,11 @@ func (h *Handshaker) ReplayBlocks(state sm.State, appHash []byte, appBlockHeight
 	if appBlockHeight == 0 {
 		validators := types.TM2PB.Validators(state.Validators)
 		req := abci.RequestInitChain{
-			Validators:    validators,
-			AppStateBytes: h.appState,
+			Time:            h.genDoc.GenesisTime.Unix(), // TODO
+			ChainId:         h.genDoc.ChainID,
+			ConsensusParams: types.TM2PB.ConsensusParams(h.genDoc.ConsensusParams),
+			Validators:      validators,
+			AppStateBytes:   h.genDoc.AppStateJSON,
 		}
 		_, err := proxyApp.Consensus().InitChainSync(req)
 		if err != nil {
@@ -314,7 +324,7 @@ func (h *Handshaker) ReplayBlocks(state sm.State, appHash []byte, appBlockHeight
 			// We haven't run Commit (both the state and app are one block behind),
 			// so replayBlock with the real app.
 			// NOTE: We could instead use the cs.WAL on cs.Start,
-			// but we'd have to allow the WAL to replay a block that wrote it's ENDHEIGHT
+			// but we'd have to allow the WAL to replay a block that wrote it's #ENDHEIGHT
 			h.logger.Info("Replay last block using real app")
 			state, err = h.replayBlock(state, storeBlockHeight, proxyApp.Consensus())
 			return state.AppHash, err
@@ -357,7 +367,7 @@ func (h *Handshaker) replayBlocks(state sm.State, proxyApp proxy.AppConns, appBl
 	for i := appBlockHeight + 1; i <= finalBlock; i++ {
 		h.logger.Info("Applying block", "height", i)
 		block := h.store.LoadBlock(i)
-		appHash, err = sm.ExecCommitBlock(proxyApp.Consensus(), block, h.logger)
+		appHash, err = sm.ExecCommitBlock(proxyApp.Consensus(), block, h.logger, state.LastValidators, h.stateDB)
 		if err != nil {
 			return nil, err
 		}
diff --git a/vendor/github.com/tendermint/tendermint/consensus/replay_file.go b/vendor/github.com/tendermint/tendermint/consensus/replay_file.go
index 1fd4f415d8461e8cb12cf55dffbddb15d9734918..e5c36a3ef62c7e2aea527dd3fa86f7a062301de1 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/replay_file.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/replay_file.go
@@ -29,6 +29,7 @@ const (
 //--------------------------------------------------------
 // replay messages interactively or all at once
 
+// replay the wal file
 func RunReplayFile(config cfg.BaseConfig, csConfig *cfg.ConsensusConfig, console bool) {
 	consensusState := newConsensusStateForReplay(config, csConfig)
 
@@ -262,7 +263,7 @@ func (pb *playback) replayConsoleLoop() int {
 				case "locked_block":
 					fmt.Printf("%v %v\n", rs.LockedBlockParts.StringShort(), rs.LockedBlock.StringShort())
 				case "votes":
-					fmt.Println(rs.Votes.StringIndented("    "))
+					fmt.Println(rs.Votes.StringIndented("  "))
 
 				default:
 					fmt.Println("Unknown option", tokens[1])
@@ -298,7 +299,7 @@ func newConsensusStateForReplay(config cfg.BaseConfig, csConfig *cfg.ConsensusCo
 	// Create proxyAppConn connection (consensus, mempool, query)
 	clientCreator := proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir())
 	proxyApp := proxy.NewAppConns(clientCreator,
-		NewHandshaker(stateDB, state, blockStore, gdoc.AppState()))
+		NewHandshaker(stateDB, state, blockStore, gdoc))
 	err = proxyApp.Start()
 	if err != nil {
 		cmn.Exit(cmn.Fmt("Error starting proxy app conns: %v", err))
diff --git a/vendor/github.com/tendermint/tendermint/consensus/state.go b/vendor/github.com/tendermint/tendermint/consensus/state.go
index 57c7b32f0bc44c591edd1d5c08461c60554a6ddc..3b713e2ec116003817de8a23f41094c16c373068 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/state.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/state.go
@@ -10,13 +10,12 @@ import (
 	"time"
 
 	fail "github.com/ebuchman/fail-test"
-
-	wire "github.com/tendermint/go-wire"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/log"
 
 	cfg "github.com/tendermint/tendermint/config"
 	cstypes "github.com/tendermint/tendermint/consensus/types"
+	tmevents "github.com/tendermint/tendermint/libs/events"
 	"github.com/tendermint/tendermint/p2p"
 	sm "github.com/tendermint/tendermint/state"
 	"github.com/tendermint/tendermint/types"
@@ -112,6 +111,10 @@ type ConsensusState struct {
 
 	// closed when we finish shutting down
 	done chan struct{}
+
+	// synchronous pubsub between consensus state and reactor.
+	// state only emits EventNewRoundStep, EventVote and EventProposalHeartbeat
+	evsw tmevents.EventSwitch
 }
 
 // NewConsensusState returns a new ConsensusState.
@@ -128,6 +131,7 @@ func NewConsensusState(config *cfg.ConsensusConfig, state sm.State, blockExec *s
 		doWALCatchup:     true,
 		wal:              nilWAL{},
 		evpool:           evpool,
+		evsw:             tmevents.NewEventSwitch(),
 	}
 	// set function defaults (may be overwritten before calling Start)
 	cs.decideProposal = cs.defaultDecideProposal
@@ -170,18 +174,31 @@ func (cs *ConsensusState) GetState() sm.State {
 	return cs.state.Copy()
 }
 
-// GetRoundState returns a copy of the internal consensus state.
+// GetRoundState returns a shallow copy of the internal consensus state.
 func (cs *ConsensusState) GetRoundState() *cstypes.RoundState {
 	cs.mtx.Lock()
 	defer cs.mtx.Unlock()
-	return cs.getRoundState()
-}
 
-func (cs *ConsensusState) getRoundState() *cstypes.RoundState {
 	rs := cs.RoundState // copy
 	return &rs
 }
 
+// GetRoundStateJSON returns a json of RoundState, marshalled using go-amino.
+func (cs *ConsensusState) GetRoundStateJSON() ([]byte, error) {
+	cs.mtx.Lock()
+	defer cs.mtx.Unlock()
+
+	return cdc.MarshalJSON(cs.RoundState)
+}
+
+// GetRoundStateSimpleJSON returns a json of RoundStateSimple, marshalled using go-amino.
+func (cs *ConsensusState) GetRoundStateSimpleJSON() ([]byte, error) {
+	cs.mtx.Lock()
+	defer cs.mtx.Unlock()
+
+	return cdc.MarshalJSON(cs.RoundState.RoundStateSimple())
+}
+
 // GetValidators returns a copy of the current validators.
 func (cs *ConsensusState) GetValidators() (int64, []*types.Validator) {
 	cs.mtx.Lock()
@@ -216,6 +233,10 @@ func (cs *ConsensusState) LoadCommit(height int64) *types.Commit {
 // OnStart implements cmn.Service.
 // It loads the latest state via the WAL, and starts the timeout and receive routines.
 func (cs *ConsensusState) OnStart() error {
+	if err := cs.evsw.Start(); err != nil {
+		return err
+	}
+
 	// we may set the WAL in testing before calling Start,
 	// so only OpenWAL if its still the nilWAL
 	if _, ok := cs.wal.(nilWAL); ok {
@@ -233,8 +254,7 @@ func (cs *ConsensusState) OnStart() error {
 	// NOTE: we will get a build up of garbage go routines
 	// firing on the tockChan until the receiveRoutine is started
 	// to deal with them (by that point, at most one will be valid)
-	err := cs.timeoutTicker.Start()
-	if err != nil {
+	if err := cs.timeoutTicker.Start(); err != nil {
 		return err
 	}
 
@@ -273,6 +293,8 @@ func (cs *ConsensusState) startRoutines(maxSteps int) {
 func (cs *ConsensusState) OnStop() {
 	cs.BaseService.OnStop()
 
+	cs.evsw.Stop()
+
 	cs.timeoutTicker.Stop()
 
 	// Make BaseService.Wait() wait until cs.wal.Wait()
@@ -290,7 +312,7 @@ func (cs *ConsensusState) Wait() {
 
 // OpenWAL opens a file to log all consensus messages and timeouts for deterministic accountability
 func (cs *ConsensusState) OpenWAL(walFile string) (WAL, error) {
-	wal, err := NewWAL(walFile, cs.config.WalLight)
+	wal, err := NewWAL(walFile)
 	if err != nil {
 		cs.Logger.Error("Failed to open WAL for consensus state", "wal", walFile, "err", err)
 		return nil, err
@@ -493,11 +515,12 @@ func (cs *ConsensusState) updateToState(state sm.State) {
 
 func (cs *ConsensusState) newStep() {
 	rs := cs.RoundStateEvent()
-	cs.wal.Save(rs)
+	cs.wal.Write(rs)
 	cs.nSteps++
 	// newStep is called by updateToStep in NewConsensusState before the eventBus is set!
 	if cs.eventBus != nil {
 		cs.eventBus.PublishEventNewRoundStep(rs)
+		cs.evsw.FireEvent(types.EventNewRoundStep, &cs.RoundState)
 	}
 }
 
@@ -531,16 +554,16 @@ func (cs *ConsensusState) receiveRoutine(maxSteps int) {
 		case height := <-cs.mempool.TxsAvailable():
 			cs.handleTxsAvailable(height)
 		case mi = <-cs.peerMsgQueue:
-			cs.wal.Save(mi)
+			cs.wal.Write(mi)
 			// handles proposals, block parts, votes
 			// may generate internal events (votes, complete proposals, 2/3 majorities)
 			cs.handleMsg(mi)
 		case mi = <-cs.internalMsgQueue:
-			cs.wal.Save(mi)
+			cs.wal.WriteSync(mi) // NOTE: fsync
 			// handles proposals, block parts, votes
 			cs.handleMsg(mi)
 		case ti := <-cs.timeoutTicker.Chan(): // tockChan:
-			cs.wal.Save(ti)
+			cs.wal.Write(ti)
 			// if the timeout is relevant to the rs
 			// go to the next step
 			cs.handleTimeout(ti, rs)
@@ -573,8 +596,9 @@ func (cs *ConsensusState) handleMsg(mi msgInfo) {
 		err = cs.setProposal(msg.Proposal)
 	case *BlockPartMessage:
 		// if the proposal is complete, we'll enterPrevote or tryFinalizeCommit
-		_, err = cs.addProposalBlockPart(msg.Height, msg.Part, peerID != "")
+		_, err = cs.addProposalBlockPart(msg.Height, msg.Part)
 		if err != nil && msg.Round != cs.Round {
+			cs.Logger.Debug("Received block part from wrong round", "height", cs.Height, "csRound", cs.Round, "blockRound", msg.Round)
 			err = nil
 		}
 	case *VoteMessage:
@@ -599,7 +623,7 @@ func (cs *ConsensusState) handleMsg(mi msgInfo) {
 		cs.Logger.Error("Unknown msg type", reflect.TypeOf(msg))
 	}
 	if err != nil {
-		cs.Logger.Error("Error with msg", "type", reflect.TypeOf(msg), "peer", peerID, "err", err, "msg", msg)
+		cs.Logger.Error("Error with msg", "height", cs.Height, "round", cs.Round, "type", reflect.TypeOf(msg), "peer", peerID, "err", err, "msg", msg)
 	}
 }
 
@@ -656,16 +680,18 @@ func (cs *ConsensusState) handleTxsAvailable(height int64) {
 // Enter: +2/3 prevotes any or +2/3 precommits for block or any from (height, round)
 // NOTE: cs.StartTime was already set for height.
 func (cs *ConsensusState) enterNewRound(height int64, round int) {
+	logger := cs.Logger.With("height", height, "round", round)
+
 	if cs.Height != height || round < cs.Round || (cs.Round == round && cs.Step != cstypes.RoundStepNewHeight) {
-		cs.Logger.Debug(cmn.Fmt("enterNewRound(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+		logger.Debug(cmn.Fmt("enterNewRound(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 		return
 	}
 
 	if now := time.Now(); cs.StartTime.After(now) {
-		cs.Logger.Info("Need to set a buffer and log message here for sanity.", "startTime", cs.StartTime, "now", now)
+		logger.Info("Need to set a buffer and log message here for sanity.", "startTime", cs.StartTime, "now", now)
 	}
 
-	cs.Logger.Info(cmn.Fmt("enterNewRound(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+	logger.Info(cmn.Fmt("enterNewRound(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 
 	// Increment validators if necessary
 	validators := cs.Validators
@@ -684,6 +710,7 @@ func (cs *ConsensusState) enterNewRound(height int64, round int) {
 		// and meanwhile we might have received a proposal
 		// for round 0.
 	} else {
+		logger.Info("Resetting Proposal info")
 		cs.Proposal = nil
 		cs.ProposalBlock = nil
 		cs.ProposalBlockParts = nil
@@ -737,6 +764,7 @@ func (cs *ConsensusState) proposalHeartbeat(height int64, round int) {
 		}
 		cs.privValidator.SignHeartbeat(chainID, heartbeat)
 		cs.eventBus.PublishEventProposalHeartbeat(types.EventDataProposalHeartbeat{heartbeat})
+		cs.evsw.FireEvent(types.EventProposalHeartbeat, heartbeat)
 		counter++
 		time.Sleep(proposalHeartbeatIntervalSeconds * time.Second)
 	}
@@ -746,11 +774,13 @@ func (cs *ConsensusState) proposalHeartbeat(height int64, round int) {
 // Enter (CreateEmptyBlocks, CreateEmptyBlocksInterval > 0 ): after enterNewRound(height,round), after timeout of CreateEmptyBlocksInterval
 // Enter (!CreateEmptyBlocks) : after enterNewRound(height,round), once txs are in the mempool
 func (cs *ConsensusState) enterPropose(height int64, round int) {
+	logger := cs.Logger.With("height", height, "round", round)
+
 	if cs.Height != height || round < cs.Round || (cs.Round == round && cstypes.RoundStepPropose <= cs.Step) {
-		cs.Logger.Debug(cmn.Fmt("enterPropose(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+		logger.Debug(cmn.Fmt("enterPropose(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 		return
 	}
-	cs.Logger.Info(cmn.Fmt("enterPropose(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+	logger.Info(cmn.Fmt("enterPropose(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 
 	defer func() {
 		// Done enterPropose:
@@ -770,22 +800,22 @@ func (cs *ConsensusState) enterPropose(height int64, round int) {
 
 	// Nothing more to do if we're not a validator
 	if cs.privValidator == nil {
-		cs.Logger.Debug("This node is not a validator")
+		logger.Debug("This node is not a validator")
 		return
 	}
 
 	// if not a validator, we're done
 	if !cs.Validators.HasAddress(cs.privValidator.GetAddress()) {
-		cs.Logger.Debug("This node is not a validator")
+		logger.Debug("This node is not a validator", "addr", cs.privValidator.GetAddress(), "vals", cs.Validators)
 		return
 	}
-	cs.Logger.Debug("This node is a validator")
+	logger.Debug("This node is a validator")
 
 	if cs.isProposer() {
-		cs.Logger.Info("enterPropose: Our turn to propose", "proposer", cs.Validators.GetProposer().Address, "privValidator", cs.privValidator)
+		logger.Info("enterPropose: Our turn to propose", "proposer", cs.Validators.GetProposer().Address, "privValidator", cs.privValidator)
 		cs.decideProposal(height, round)
 	} else {
-		cs.Logger.Info("enterPropose: Not our turn to propose", "proposer", cs.Validators.GetProposer().Address, "privValidator", cs.privValidator)
+		logger.Info("enterPropose: Not our turn to propose", "proposer", cs.Validators.GetProposer().Address, "privValidator", cs.privValidator)
 	}
 }
 
@@ -948,14 +978,16 @@ func (cs *ConsensusState) defaultDoPrevote(height int64, round int) {
 
 // Enter: any +2/3 prevotes at next round.
 func (cs *ConsensusState) enterPrevoteWait(height int64, round int) {
+	logger := cs.Logger.With("height", height, "round", round)
+
 	if cs.Height != height || round < cs.Round || (cs.Round == round && cstypes.RoundStepPrevoteWait <= cs.Step) {
-		cs.Logger.Debug(cmn.Fmt("enterPrevoteWait(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+		logger.Debug(cmn.Fmt("enterPrevoteWait(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 		return
 	}
 	if !cs.Votes.Prevotes(round).HasTwoThirdsAny() {
 		cmn.PanicSanity(cmn.Fmt("enterPrevoteWait(%v/%v), but Prevotes does not have any +2/3 votes", height, round))
 	}
-	cs.Logger.Info(cmn.Fmt("enterPrevoteWait(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+	logger.Info(cmn.Fmt("enterPrevoteWait(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 
 	defer func() {
 		// Done enterPrevoteWait:
@@ -974,12 +1006,14 @@ func (cs *ConsensusState) enterPrevoteWait(height int64, round int) {
 // else, unlock an existing lock and precommit nil if +2/3 of prevotes were nil,
 // else, precommit nil otherwise.
 func (cs *ConsensusState) enterPrecommit(height int64, round int) {
+	logger := cs.Logger.With("height", height, "round", round)
+
 	if cs.Height != height || round < cs.Round || (cs.Round == round && cstypes.RoundStepPrecommit <= cs.Step) {
-		cs.Logger.Debug(cmn.Fmt("enterPrecommit(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+		logger.Debug(cmn.Fmt("enterPrecommit(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 		return
 	}
 
-	cs.Logger.Info(cmn.Fmt("enterPrecommit(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+	logger.Info(cmn.Fmt("enterPrecommit(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 
 	defer func() {
 		// Done enterPrecommit:
@@ -987,23 +1021,24 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
 		cs.newStep()
 	}()
 
+	// check for a polka
 	blockID, ok := cs.Votes.Prevotes(round).TwoThirdsMajority()
 
-	// If we don't have a polka, we must precommit nil
+	// If we don't have a polka, we must precommit nil.
 	if !ok {
 		if cs.LockedBlock != nil {
-			cs.Logger.Info("enterPrecommit: No +2/3 prevotes during enterPrecommit while we're locked. Precommitting nil")
+			logger.Info("enterPrecommit: No +2/3 prevotes during enterPrecommit while we're locked. Precommitting nil")
 		} else {
-			cs.Logger.Info("enterPrecommit: No +2/3 prevotes during enterPrecommit. Precommitting nil.")
+			logger.Info("enterPrecommit: No +2/3 prevotes during enterPrecommit. Precommitting nil.")
 		}
 		cs.signAddVote(types.VoteTypePrecommit, nil, types.PartSetHeader{})
 		return
 	}
 
-	// At this point +2/3 prevoted for a particular block or nil
+	// At this point +2/3 prevoted for a particular block or nil.
 	cs.eventBus.PublishEventPolka(cs.RoundStateEvent())
 
-	// the latest POLRound should be this round
+	// the latest POLRound should be this round.
 	polRound, _ := cs.Votes.POLInfo()
 	if polRound < round {
 		cmn.PanicSanity(cmn.Fmt("This POLRound should be %v but got %", round, polRound))
@@ -1012,9 +1047,9 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
 	// +2/3 prevoted nil. Unlock and precommit nil.
 	if len(blockID.Hash) == 0 {
 		if cs.LockedBlock == nil {
-			cs.Logger.Info("enterPrecommit: +2/3 prevoted for nil.")
+			logger.Info("enterPrecommit: +2/3 prevoted for nil.")
 		} else {
-			cs.Logger.Info("enterPrecommit: +2/3 prevoted for nil. Unlocking")
+			logger.Info("enterPrecommit: +2/3 prevoted for nil. Unlocking")
 			cs.LockedRound = 0
 			cs.LockedBlock = nil
 			cs.LockedBlockParts = nil
@@ -1028,7 +1063,7 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
 
 	// If we're already locked on that block, precommit it, and update the LockedRound
 	if cs.LockedBlock.HashesTo(blockID.Hash) {
-		cs.Logger.Info("enterPrecommit: +2/3 prevoted locked block. Relocking")
+		logger.Info("enterPrecommit: +2/3 prevoted locked block. Relocking")
 		cs.LockedRound = round
 		cs.eventBus.PublishEventRelock(cs.RoundStateEvent())
 		cs.signAddVote(types.VoteTypePrecommit, blockID.Hash, blockID.PartsHeader)
@@ -1037,7 +1072,7 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
 
 	// If +2/3 prevoted for proposal block, stage and precommit it
 	if cs.ProposalBlock.HashesTo(blockID.Hash) {
-		cs.Logger.Info("enterPrecommit: +2/3 prevoted proposal block. Locking", "hash", blockID.Hash)
+		logger.Info("enterPrecommit: +2/3 prevoted proposal block. Locking", "hash", blockID.Hash)
 		// Validate the block.
 		if err := cs.blockExec.ValidateBlock(cs.state, cs.ProposalBlock); err != nil {
 			cmn.PanicConsensus(cmn.Fmt("enterPrecommit: +2/3 prevoted for an invalid block: %v", err))
@@ -1067,14 +1102,16 @@ func (cs *ConsensusState) enterPrecommit(height int64, round int) {
 
 // Enter: any +2/3 precommits for next round.
 func (cs *ConsensusState) enterPrecommitWait(height int64, round int) {
+	logger := cs.Logger.With("height", height, "round", round)
+
 	if cs.Height != height || round < cs.Round || (cs.Round == round && cstypes.RoundStepPrecommitWait <= cs.Step) {
-		cs.Logger.Debug(cmn.Fmt("enterPrecommitWait(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+		logger.Debug(cmn.Fmt("enterPrecommitWait(%v/%v): Invalid args. Current step: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 		return
 	}
 	if !cs.Votes.Precommits(round).HasTwoThirdsAny() {
 		cmn.PanicSanity(cmn.Fmt("enterPrecommitWait(%v/%v), but Precommits does not have any +2/3 votes", height, round))
 	}
-	cs.Logger.Info(cmn.Fmt("enterPrecommitWait(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
+	logger.Info(cmn.Fmt("enterPrecommitWait(%v/%v). Current: %v/%v/%v", height, round, cs.Height, cs.Round, cs.Step))
 
 	defer func() {
 		// Done enterPrecommitWait:
@@ -1089,11 +1126,13 @@ func (cs *ConsensusState) enterPrecommitWait(height int64, round int) {
 
 // Enter: +2/3 precommits for block
 func (cs *ConsensusState) enterCommit(height int64, commitRound int) {
+	logger := cs.Logger.With("height", height, "commitRound", commitRound)
+
 	if cs.Height != height || cstypes.RoundStepCommit <= cs.Step {
-		cs.Logger.Debug(cmn.Fmt("enterCommit(%v/%v): Invalid args. Current step: %v/%v/%v", height, commitRound, cs.Height, cs.Round, cs.Step))
+		logger.Debug(cmn.Fmt("enterCommit(%v/%v): Invalid args. Current step: %v/%v/%v", height, commitRound, cs.Height, cs.Round, cs.Step))
 		return
 	}
-	cs.Logger.Info(cmn.Fmt("enterCommit(%v/%v). Current: %v/%v/%v", height, commitRound, cs.Height, cs.Round, cs.Step))
+	logger.Info(cmn.Fmt("enterCommit(%v/%v). Current: %v/%v/%v", height, commitRound, cs.Height, cs.Round, cs.Step))
 
 	defer func() {
 		// Done enterCommit:
@@ -1116,6 +1155,7 @@ func (cs *ConsensusState) enterCommit(height int64, commitRound int) {
 	// Move them over to ProposalBlock if they match the commit hash,
 	// otherwise they'll be cleared in updateToState.
 	if cs.LockedBlock.HashesTo(blockID.Hash) {
+		logger.Info("Commit is for locked block. Set ProposalBlock=LockedBlock", "blockHash", blockID.Hash)
 		cs.ProposalBlock = cs.LockedBlock
 		cs.ProposalBlockParts = cs.LockedBlockParts
 	}
@@ -1123,6 +1163,7 @@ func (cs *ConsensusState) enterCommit(height int64, commitRound int) {
 	// If we don't have the block being committed, set up to get it.
 	if !cs.ProposalBlock.HashesTo(blockID.Hash) {
 		if !cs.ProposalBlockParts.HasHeader(blockID.PartsHeader) {
+			logger.Info("Commit is for a block we don't know about. Set ProposalBlock=nil", "proposal", cs.ProposalBlock.Hash(), "commit", blockID.Hash)
 			// We're getting the wrong block.
 			// Set up ProposalBlockParts and keep waiting.
 			cs.ProposalBlock = nil
@@ -1135,19 +1176,21 @@ func (cs *ConsensusState) enterCommit(height int64, commitRound int) {
 
 // If we have the block AND +2/3 commits for it, finalize.
 func (cs *ConsensusState) tryFinalizeCommit(height int64) {
+	logger := cs.Logger.With("height", height)
+
 	if cs.Height != height {
 		cmn.PanicSanity(cmn.Fmt("tryFinalizeCommit() cs.Height: %v vs height: %v", cs.Height, height))
 	}
 
 	blockID, ok := cs.Votes.Precommits(cs.CommitRound).TwoThirdsMajority()
 	if !ok || len(blockID.Hash) == 0 {
-		cs.Logger.Error("Attempt to finalize failed. There was no +2/3 majority, or +2/3 was for <nil>.", "height", height)
+		logger.Error("Attempt to finalize failed. There was no +2/3 majority, or +2/3 was for <nil>.")
 		return
 	}
 	if !cs.ProposalBlock.HashesTo(blockID.Hash) {
 		// TODO: this happens every time if we're not a validator (ugly logs)
 		// TODO: ^^ wait, why does it matter that we're a validator?
-		cs.Logger.Info("Attempt to finalize failed. We don't have the commit block.", "height", height, "proposal-block", cs.ProposalBlock.Hash(), "commit-block", blockID.Hash)
+		logger.Info("Attempt to finalize failed. We don't have the commit block.", "proposal-block", cs.ProposalBlock.Hash(), "commit-block", blockID.Hash)
 		return
 	}
 
@@ -1198,23 +1241,28 @@ func (cs *ConsensusState) finalizeCommit(height int64) {
 
 	fail.Fail() // XXX
 
-	// Finish writing to the WAL for this height.
-	// NOTE: If we fail before writing this, we'll never write it,
-	// and just recover by running ApplyBlock in the Handshake.
-	// If we moved it before persisting the block, we'd have to allow
-	// WAL replay for blocks with an #ENDHEIGHT
-	// As is, ConsensusState should not be started again
-	// until we successfully call ApplyBlock (ie. here or in Handshake after restart)
-	cs.wal.Save(EndHeightMessage{height})
+	// Write EndHeightMessage{} for this height, implying that the blockstore
+	// has saved the block.
+	//
+	// If we crash before writing this EndHeightMessage{}, we will recover by
+	// running ApplyBlock during the ABCI handshake when we restart.  If we
+	// didn't save the block to the blockstore before writing
+	// EndHeightMessage{}, we'd have to change WAL replay -- currently it
+	// complains about replaying for heights where an #ENDHEIGHT entry already
+	// exists.
+	//
+	// Either way, the ConsensusState should not be resumed until we
+	// successfully call ApplyBlock (ie. later here, or in Handshake after
+	// restart).
+	cs.wal.WriteSync(EndHeightMessage{height}) // NOTE: fsync
 
 	fail.Fail() // XXX
 
-	// Create a copy of the state for staging
-	// and an event cache for txs
+	// Create a copy of the state for staging and an event cache for txs.
 	stateCopy := cs.state.Copy()
 
 	// Execute and commit the block, update and save the state, and update the mempool.
-	// NOTE: the block.AppHash wont reflect these txs until the next block
+	// NOTE The block.AppHash wont reflect these txs until the next block.
 	var err error
 	stateCopy, err = cs.blockExec.ApplyBlock(stateCopy, types.BlockID{block.Hash(), blockParts.Header()}, block)
 	if err != nil {
@@ -1275,34 +1323,56 @@ func (cs *ConsensusState) defaultSetProposal(proposal *types.Proposal) error {
 
 	cs.Proposal = proposal
 	cs.ProposalBlockParts = types.NewPartSetFromHeader(proposal.BlockPartsHeader)
+	cs.Logger.Info("Received proposal", "proposal", proposal)
 	return nil
 }
 
 // NOTE: block is not necessarily valid.
 // Asynchronously triggers either enterPrevote (before we timeout of propose) or tryFinalizeCommit, once we have the full block.
-func (cs *ConsensusState) addProposalBlockPart(height int64, part *types.Part, verify bool) (added bool, err error) {
+func (cs *ConsensusState) addProposalBlockPart(height int64, part *types.Part) (added bool, err error) {
 	// Blocks might be reused, so round mismatch is OK
 	if cs.Height != height {
+		cs.Logger.Debug("Received block part from wrong height", "height", height)
 		return false, nil
 	}
 
 	// We're not expecting a block part.
 	if cs.ProposalBlockParts == nil {
+		cs.Logger.Info("Received a block part when we're not expecting any", "height", height)
 		return false, nil // TODO: bad peer? Return error?
 	}
 
-	added, err = cs.ProposalBlockParts.AddPart(part, verify)
+	added, err = cs.ProposalBlockParts.AddPart(part)
 	if err != nil {
 		return added, err
 	}
 	if added && cs.ProposalBlockParts.IsComplete() {
 		// Added and completed!
-		var n int
-		var err error
-		cs.ProposalBlock = wire.ReadBinary(&types.Block{}, cs.ProposalBlockParts.GetReader(),
-			cs.state.ConsensusParams.BlockSize.MaxBytes, &n, &err).(*types.Block)
+		_, err = cdc.UnmarshalBinaryReader(cs.ProposalBlockParts.GetReader(), &cs.ProposalBlock, int64(cs.state.ConsensusParams.BlockSize.MaxBytes))
+		if err != nil {
+			return true, err
+		}
 		// NOTE: it's possible to receive complete proposal blocks for future rounds without having the proposal
 		cs.Logger.Info("Received complete proposal block", "height", cs.ProposalBlock.Height, "hash", cs.ProposalBlock.Hash())
+
+		// Update Valid* if we can.
+		prevotes := cs.Votes.Prevotes(cs.Round)
+		blockID, hasTwoThirds := prevotes.TwoThirdsMajority()
+		if hasTwoThirds && !blockID.IsZero() && (cs.ValidRound < cs.Round) {
+			if cs.ProposalBlock.HashesTo(blockID.Hash) {
+				cs.Logger.Info("Updating valid block to new proposal block",
+					"valid-round", cs.Round, "valid-block-hash", cs.ProposalBlock.Hash())
+				cs.ValidRound = cs.Round
+				cs.ValidBlock = cs.ProposalBlock
+				cs.ValidBlockParts = cs.ProposalBlockParts
+			}
+			// TODO: In case there is +2/3 majority in Prevotes set for some
+			// block and cs.ProposalBlock contains different block, either
+			// proposer is faulty or voting power of faulty processes is more
+			// than 1/3. We should trigger in the future accountability
+			// procedure at this point.
+		}
+
 		if cs.Step == cstypes.RoundStepPropose && cs.isProposalComplete() {
 			// Move onto the next step
 			cs.enterPrevote(height, cs.Round)
@@ -1310,7 +1380,7 @@ func (cs *ConsensusState) addProposalBlockPart(height int64, part *types.Part, v
 			// If we're waiting on the proposal block...
 			cs.tryFinalizeCommit(height)
 		}
-		return true, err
+		return true, nil
 	}
 	return added, nil
 }
@@ -1361,6 +1431,7 @@ func (cs *ConsensusState) addVote(vote *types.Vote, peerID p2p.ID) (added bool,
 
 		cs.Logger.Info(cmn.Fmt("Added to lastPrecommits: %v", cs.LastCommit.StringShort()))
 		cs.eventBus.PublishEventVote(types.EventDataVote{vote})
+		cs.evsw.FireEvent(types.EventVote, vote)
 
 		// if we can skip timeoutCommit and have all the votes now,
 		if cs.config.SkipTimeoutCommit && cs.LastCommit.HasAll() {
@@ -1388,38 +1459,50 @@ func (cs *ConsensusState) addVote(vote *types.Vote, peerID p2p.ID) (added bool,
 	}
 
 	cs.eventBus.PublishEventVote(types.EventDataVote{vote})
+	cs.evsw.FireEvent(types.EventVote, vote)
 
 	switch vote.Type {
 	case types.VoteTypePrevote:
 		prevotes := cs.Votes.Prevotes(vote.Round)
 		cs.Logger.Info("Added to prevote", "vote", vote, "prevotes", prevotes.StringShort())
-		blockID, ok := prevotes.TwoThirdsMajority()
-		// First, unlock if prevotes is a valid POL.
-		// >> lockRound < POLRound <= unlockOrChangeLockRound (see spec)
-		// NOTE: If (lockRound < POLRound) but !(POLRound <= unlockOrChangeLockRound),
-		// we'll still enterNewRound(H,vote.R) and enterPrecommit(H,vote.R) to process it
-		// there.
-		if (cs.LockedBlock != nil) && (cs.LockedRound < vote.Round) && (vote.Round <= cs.Round) {
-			if ok && !cs.LockedBlock.HashesTo(blockID.Hash) {
+
+		// If +2/3 prevotes for a block or nil for *any* round:
+		if blockID, ok := prevotes.TwoThirdsMajority(); ok {
+
+			// There was a polka!
+			// If we're locked but this is a recent polka, unlock.
+			// If it matches our ProposalBlock, update the ValidBlock
+
+			// Unlock if `cs.LockedRound < vote.Round <= cs.Round`
+			// NOTE: If vote.Round > cs.Round, we'll deal with it when we get to vote.Round
+			if (cs.LockedBlock != nil) &&
+				(cs.LockedRound < vote.Round) &&
+				(vote.Round <= cs.Round) &&
+				!cs.LockedBlock.HashesTo(blockID.Hash) {
+
 				cs.Logger.Info("Unlocking because of POL.", "lockedRound", cs.LockedRound, "POLRound", vote.Round)
 				cs.LockedRound = 0
 				cs.LockedBlock = nil
 				cs.LockedBlockParts = nil
 				cs.eventBus.PublishEventUnlock(cs.RoundStateEvent())
 			}
-		}
-		// Update ValidBlock
-		if ok && !blockID.IsZero() && !cs.ValidBlock.HashesTo(blockID.Hash) && vote.Round > cs.ValidRound {
-			// update valid value
-			if cs.ProposalBlock.HashesTo(blockID.Hash) {
+
+			// Update Valid* if we can.
+			// NOTE: our proposal block may be nil or not what received a polka..
+			// TODO: we may want to still update the ValidBlock and obtain it via gossipping
+			if !blockID.IsZero() &&
+				(cs.ValidRound < vote.Round) &&
+				(vote.Round <= cs.Round) &&
+				cs.ProposalBlock.HashesTo(blockID.Hash) {
+
+				cs.Logger.Info("Updating ValidBlock because of POL.", "validRound", cs.ValidRound, "POLRound", vote.Round)
 				cs.ValidRound = vote.Round
 				cs.ValidBlock = cs.ProposalBlock
 				cs.ValidBlockParts = cs.ProposalBlockParts
 			}
-			//TODO: We might want to update ValidBlock also in case we don't have that block yet,
-			// and obtain the required block using gossiping
 		}
 
+		// If +2/3 prevotes for *anything* for this or future round:
 		if cs.Round <= vote.Round && prevotes.HasTwoThirdsAny() {
 			// Round-skip over to PrevoteWait or goto Precommit.
 			cs.enterNewRound(height, vote.Round) // if the vote is ahead of us
@@ -1435,6 +1518,7 @@ func (cs *ConsensusState) addVote(vote *types.Vote, peerID p2p.ID) (added bool,
 				cs.enterPrevote(height, cs.Round)
 			}
 		}
+
 	case types.VoteTypePrecommit:
 		precommits := cs.Votes.Precommits(vote.Round)
 		cs.Logger.Info("Added to precommit", "vote", vote, "precommits", precommits.StringShort())
diff --git a/vendor/github.com/tendermint/tendermint/consensus/types/height_vote_set.go b/vendor/github.com/tendermint/tendermint/consensus/types/height_vote_set.go
index a155bce080de7cf303ced7fad3beecd016599e34..3c9867940b7a9cf69025f8fa4e684cfee822bd35 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/types/height_vote_set.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/types/height_vote_set.go
@@ -174,6 +174,26 @@ func (hvs *HeightVoteSet) getVoteSet(round int, type_ byte) *types.VoteSet {
 	}
 }
 
+// If a peer claims that it has 2/3 majority for given blockKey, call this.
+// NOTE: if there are too many peers, or too much peer churn,
+// this can cause memory issues.
+// TODO: implement ability to remove peers too
+func (hvs *HeightVoteSet) SetPeerMaj23(round int, type_ byte, peerID p2p.ID, blockID types.BlockID) error {
+	hvs.mtx.Lock()
+	defer hvs.mtx.Unlock()
+	if !types.IsVoteTypeValid(type_) {
+		return fmt.Errorf("SetPeerMaj23: Invalid vote type %v", type_)
+	}
+	voteSet := hvs.getVoteSet(round, type_)
+	if voteSet == nil {
+		return nil // something we don't know about yet
+	}
+	return voteSet.SetPeerMaj23(types.P2PID(peerID), blockID)
+}
+
+//---------------------------------------------------------
+// string and json
+
 func (hvs *HeightVoteSet) String() string {
 	return hvs.StringIndented("")
 }
@@ -207,19 +227,35 @@ func (hvs *HeightVoteSet) StringIndented(indent string) string {
 		indent)
 }
 
-// If a peer claims that it has 2/3 majority for given blockKey, call this.
-// NOTE: if there are too many peers, or too much peer churn,
-// this can cause memory issues.
-// TODO: implement ability to remove peers too
-func (hvs *HeightVoteSet) SetPeerMaj23(round int, type_ byte, peerID p2p.ID, blockID types.BlockID) error {
+func (hvs *HeightVoteSet) MarshalJSON() ([]byte, error) {
 	hvs.mtx.Lock()
 	defer hvs.mtx.Unlock()
-	if !types.IsVoteTypeValid(type_) {
-		return fmt.Errorf("SetPeerMaj23: Invalid vote type %v", type_)
-	}
-	voteSet := hvs.getVoteSet(round, type_)
-	if voteSet == nil {
-		return nil // something we don't know about yet
+
+	allVotes := hvs.toAllRoundVotes()
+	return cdc.MarshalJSON(allVotes)
+}
+
+func (hvs *HeightVoteSet) toAllRoundVotes() []roundVotes {
+	totalRounds := hvs.round + 1
+	allVotes := make([]roundVotes, totalRounds)
+	// rounds 0 ~ hvs.round inclusive
+	for round := 0; round < totalRounds; round++ {
+		allVotes[round] = roundVotes{
+			Round:              round,
+			Prevotes:           hvs.roundVoteSets[round].Prevotes.VoteStrings(),
+			PrevotesBitArray:   hvs.roundVoteSets[round].Prevotes.BitArrayString(),
+			Precommits:         hvs.roundVoteSets[round].Precommits.VoteStrings(),
+			PrecommitsBitArray: hvs.roundVoteSets[round].Precommits.BitArrayString(),
+		}
 	}
-	return voteSet.SetPeerMaj23(types.P2PID(peerID), blockID)
+	// TODO: all other peer catchup rounds
+	return allVotes
+}
+
+type roundVotes struct {
+	Round              int      `json:"round"`
+	Prevotes           []string `json:"prevotes"`
+	PrevotesBitArray   string   `json:"prevotes_bit_array"`
+	Precommits         []string `json:"precommits"`
+	PrecommitsBitArray string   `json:"precommits_bit_array"`
 }
diff --git a/vendor/github.com/tendermint/tendermint/consensus/types/peer_round_state.go b/vendor/github.com/tendermint/tendermint/consensus/types/peer_round_state.go
new file mode 100644
index 0000000000000000000000000000000000000000..dcb6c8e020756e5eae5f04d7739d770710506ad6
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/consensus/types/peer_round_state.go
@@ -0,0 +1,57 @@
+package types
+
+import (
+	"fmt"
+	"time"
+
+	"github.com/tendermint/tendermint/types"
+	cmn "github.com/tendermint/tmlibs/common"
+)
+
+//-----------------------------------------------------------------------------
+
+// PeerRoundState contains the known state of a peer.
+// NOTE: Read-only when returned by PeerState.GetRoundState().
+type PeerRoundState struct {
+	Height                   int64               `json:"height"`                      // Height peer is at
+	Round                    int                 `json:"round"`                       // Round peer is at, -1 if unknown.
+	Step                     RoundStepType       `json:"step"`                        // Step peer is at
+	StartTime                time.Time           `json:"start_time"`                  // Estimated start of round 0 at this height
+	Proposal                 bool                `json:"proposal"`                    // True if peer has proposal for this round
+	ProposalBlockPartsHeader types.PartSetHeader `json:"proposal_block_parts_header"` //
+	ProposalBlockParts       *cmn.BitArray       `json:"proposal_block_parts"`        //
+	ProposalPOLRound         int                 `json:"proposal_pol_round"`          // Proposal's POL round. -1 if none.
+	ProposalPOL              *cmn.BitArray       `json:"proposal_pol"`                // nil until ProposalPOLMessage received.
+	Prevotes                 *cmn.BitArray       `json:"prevotes"`                    // All votes peer has for this round
+	Precommits               *cmn.BitArray       `json:"precommits"`                  // All precommits peer has for this round
+	LastCommitRound          int                 `json:"last_commit_round"`           // Round of commit for last height. -1 if none.
+	LastCommit               *cmn.BitArray       `json:"last_commit"`                 // All commit precommits of commit for last height.
+	CatchupCommitRound       int                 `json:"catchup_commit_round"`        // Round that we have commit for. Not necessarily unique. -1 if none.
+	CatchupCommit            *cmn.BitArray       `json:"catchup_commit"`              // All commit precommits peer has for this height & CatchupCommitRound
+}
+
+// String returns a string representation of the PeerRoundState
+func (prs PeerRoundState) String() string {
+	return prs.StringIndented("")
+}
+
+// StringIndented returns a string representation of the PeerRoundState
+func (prs PeerRoundState) StringIndented(indent string) string {
+	return fmt.Sprintf(`PeerRoundState{
+%s  %v/%v/%v @%v
+%s  Proposal %v -> %v
+%s  POL      %v (round %v)
+%s  Prevotes   %v
+%s  Precommits %v
+%s  LastCommit %v (round %v)
+%s  Catchup    %v (round %v)
+%s}`,
+		indent, prs.Height, prs.Round, prs.Step, prs.StartTime,
+		indent, prs.ProposalBlockPartsHeader, prs.ProposalBlockParts,
+		indent, prs.ProposalPOL, prs.ProposalPOLRound,
+		indent, prs.Prevotes,
+		indent, prs.Precommits,
+		indent, prs.LastCommit, prs.LastCommitRound,
+		indent, prs.CatchupCommit, prs.CatchupCommitRound,
+		indent)
+}
diff --git a/vendor/github.com/tendermint/tendermint/consensus/types/reactor.go b/vendor/github.com/tendermint/tendermint/consensus/types/reactor.go
deleted file mode 100644
index 7dfeed92393dd7c2338f4b1350028911630244ff..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/consensus/types/reactor.go
+++ /dev/null
@@ -1,57 +0,0 @@
-package types
-
-import (
-	"fmt"
-	"time"
-
-	"github.com/tendermint/tendermint/types"
-	cmn "github.com/tendermint/tmlibs/common"
-)
-
-//-----------------------------------------------------------------------------
-
-// PeerRoundState contains the known state of a peer.
-// NOTE: Read-only when returned by PeerState.GetRoundState().
-type PeerRoundState struct {
-	Height                   int64               // Height peer is at
-	Round                    int                 // Round peer is at, -1 if unknown.
-	Step                     RoundStepType       // Step peer is at
-	StartTime                time.Time           // Estimated start of round 0 at this height
-	Proposal                 bool                // True if peer has proposal for this round
-	ProposalBlockPartsHeader types.PartSetHeader //
-	ProposalBlockParts       *cmn.BitArray       //
-	ProposalPOLRound         int                 // Proposal's POL round. -1 if none.
-	ProposalPOL              *cmn.BitArray       // nil until ProposalPOLMessage received.
-	Prevotes                 *cmn.BitArray       // All votes peer has for this round
-	Precommits               *cmn.BitArray       // All precommits peer has for this round
-	LastCommitRound          int                 // Round of commit for last height. -1 if none.
-	LastCommit               *cmn.BitArray       // All commit precommits of commit for last height.
-	CatchupCommitRound       int                 // Round that we have commit for. Not necessarily unique. -1 if none.
-	CatchupCommit            *cmn.BitArray       // All commit precommits peer has for this height & CatchupCommitRound
-}
-
-// String returns a string representation of the PeerRoundState
-func (prs PeerRoundState) String() string {
-	return prs.StringIndented("")
-}
-
-// StringIndented returns a string representation of the PeerRoundState
-func (prs PeerRoundState) StringIndented(indent string) string {
-	return fmt.Sprintf(`PeerRoundState{
-%s  %v/%v/%v @%v
-%s  Proposal %v -> %v
-%s  POL      %v (round %v)
-%s  Prevotes   %v
-%s  Precommits %v
-%s  LastCommit %v (round %v)
-%s  Catchup    %v (round %v)
-%s}`,
-		indent, prs.Height, prs.Round, prs.Step, prs.StartTime,
-		indent, prs.ProposalBlockPartsHeader, prs.ProposalBlockParts,
-		indent, prs.ProposalPOL, prs.ProposalPOLRound,
-		indent, prs.Prevotes,
-		indent, prs.Precommits,
-		indent, prs.LastCommit, prs.LastCommitRound,
-		indent, prs.CatchupCommit, prs.CatchupCommitRound,
-		indent)
-}
diff --git a/vendor/github.com/tendermint/tendermint/consensus/types/state.go b/vendor/github.com/tendermint/tendermint/consensus/types/round_state.go
similarity index 56%
rename from vendor/github.com/tendermint/tendermint/consensus/types/state.go
rename to vendor/github.com/tendermint/tendermint/consensus/types/round_state.go
index 8e79f10d2c43231da356278185ff57f5e653b6c0..14da1f149e223eb2208b9defd0dad84511662644 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/types/state.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/types/round_state.go
@@ -1,10 +1,12 @@
 package types
 
 import (
+	"encoding/json"
 	"fmt"
 	"time"
 
 	"github.com/tendermint/tendermint/types"
+	cmn "github.com/tendermint/tmlibs/common"
 )
 
 //-----------------------------------------------------------------------------
@@ -13,6 +15,7 @@ import (
 // RoundStepType enumerates the state of the consensus state machine
 type RoundStepType uint8 // These must be numeric, ordered.
 
+// RoundStepType
 const (
 	RoundStepNewHeight     = RoundStepType(0x01) // Wait til CommitTime + timeoutCommit
 	RoundStepNewRound      = RoundStepType(0x02) // Setup new round and go to RoundStepPropose
@@ -52,43 +55,66 @@ func (rs RoundStepType) String() string {
 //-----------------------------------------------------------------------------
 
 // RoundState defines the internal consensus state.
-// It is Immutable when returned from ConsensusState.GetRoundState()
-// TODO: Actually, only the top pointer is copied,
-// so access to field pointers is still racey
 // NOTE: Not thread safe. Should only be manipulated by functions downstream
 // of the cs.receiveRoutine
 type RoundState struct {
-	Height             int64 // Height we are working on
-	Round              int
-	Step               RoundStepType
-	StartTime          time.Time
-	CommitTime         time.Time // Subjective time when +2/3 precommits for Block at Round were found
-	Validators         *types.ValidatorSet
-	Proposal           *types.Proposal
-	ProposalBlock      *types.Block
-	ProposalBlockParts *types.PartSet
-	LockedRound        int
-	LockedBlock        *types.Block
-	LockedBlockParts   *types.PartSet
-	ValidRound         int
-	ValidBlock         *types.Block
-	ValidBlockParts    *types.PartSet
-	Votes              *HeightVoteSet
-	CommitRound        int            //
-	LastCommit         *types.VoteSet // Last precommits at Height-1
-	LastValidators     *types.ValidatorSet
+	Height             int64               `json:"height"` // Height we are working on
+	Round              int                 `json:"round"`
+	Step               RoundStepType       `json:"step"`
+	StartTime          time.Time           `json:"start_time"`
+	CommitTime         time.Time           `json:"commit_time"` // Subjective time when +2/3 precommits for Block at Round were found
+	Validators         *types.ValidatorSet `json:"validators"`
+	Proposal           *types.Proposal     `json:"proposal"`
+	ProposalBlock      *types.Block        `json:"proposal_block"`
+	ProposalBlockParts *types.PartSet      `json:"proposal_block_parts"`
+	LockedRound        int                 `json:"locked_round"`
+	LockedBlock        *types.Block        `json:"locked_block"`
+	LockedBlockParts   *types.PartSet      `json:"locked_block_parts"`
+	ValidRound         int                 `json:"valid_round"`       // Last known round with POL for non-nil valid block.
+	ValidBlock         *types.Block        `json:"valid_block"`       // Last known block of POL mentioned above.
+	ValidBlockParts    *types.PartSet      `json:"valid_block_parts"` // Last known block parts of POL metnioned above.
+	Votes              *HeightVoteSet      `json:"votes"`
+	CommitRound        int                 `json:"commit_round"` //
+	LastCommit         *types.VoteSet      `json:"last_commit"`  // Last precommits at Height-1
+	LastValidators     *types.ValidatorSet `json:"last_validators"`
+}
+
+// Compressed version of the RoundState for use in RPC
+type RoundStateSimple struct {
+	HeightRoundStep   string          `json:"height/round/step"`
+	StartTime         time.Time       `json:"start_time"`
+	ProposalBlockHash cmn.HexBytes    `json:"proposal_block_hash"`
+	LockedBlockHash   cmn.HexBytes    `json:"locked_block_hash"`
+	ValidBlockHash    cmn.HexBytes    `json:"valid_block_hash"`
+	Votes             json.RawMessage `json:"height_vote_set"`
+}
+
+// Compress the RoundState to RoundStateSimple
+func (rs *RoundState) RoundStateSimple() RoundStateSimple {
+	votesJSON, err := rs.Votes.MarshalJSON()
+	if err != nil {
+		panic(err)
+	}
+	return RoundStateSimple{
+		HeightRoundStep:   fmt.Sprintf("%d/%d/%d", rs.Height, rs.Round, rs.Step),
+		StartTime:         rs.StartTime,
+		ProposalBlockHash: rs.ProposalBlock.Hash(),
+		LockedBlockHash:   rs.LockedBlock.Hash(),
+		ValidBlockHash:    rs.ValidBlock.Hash(),
+		Votes:             votesJSON,
+	}
 }
 
 // RoundStateEvent returns the H/R/S of the RoundState as an event.
 func (rs *RoundState) RoundStateEvent() types.EventDataRoundState {
 	// XXX: copy the RoundState
 	// if we want to avoid this, we may need synchronous events after all
-	rs_ := *rs
+	rsCopy := *rs
 	edrs := types.EventDataRoundState{
 		Height:     rs.Height,
 		Round:      rs.Round,
 		Step:       rs.Step.String(),
-		RoundState: &rs_,
+		RoundState: &rsCopy,
 	}
 	return edrs
 }
@@ -118,16 +144,16 @@ func (rs *RoundState) StringIndented(indent string) string {
 		indent, rs.Height, rs.Round, rs.Step,
 		indent, rs.StartTime,
 		indent, rs.CommitTime,
-		indent, rs.Validators.StringIndented(indent+"    "),
+		indent, rs.Validators.StringIndented(indent+"  "),
 		indent, rs.Proposal,
 		indent, rs.ProposalBlockParts.StringShort(), rs.ProposalBlock.StringShort(),
 		indent, rs.LockedRound,
 		indent, rs.LockedBlockParts.StringShort(), rs.LockedBlock.StringShort(),
 		indent, rs.ValidRound,
 		indent, rs.ValidBlockParts.StringShort(), rs.ValidBlock.StringShort(),
-		indent, rs.Votes.StringIndented(indent+"    "),
+		indent, rs.Votes.StringIndented(indent+"  "),
 		indent, rs.LastCommit.StringShort(),
-		indent, rs.LastValidators.StringIndented(indent+"    "),
+		indent, rs.LastValidators.StringIndented(indent+"  "),
 		indent)
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/consensus/types/wire.go b/vendor/github.com/tendermint/tendermint/consensus/types/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..bd5c4497d06fdf1a1ae942e6c55bbc7dbeac6632
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/consensus/types/wire.go
@@ -0,0 +1,12 @@
+package types
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/consensus/wal.go b/vendor/github.com/tendermint/tendermint/consensus/wal.go
index 88218940d8aceeb05e497fbb9880a9658067d046..80cb8fc3c19c43c2be75e9a5d68073e0fdbcb462 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/wal.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/wal.go
@@ -1,7 +1,6 @@
 package consensus
 
 import (
-	"bytes"
 	"encoding/binary"
 	"fmt"
 	"hash/crc32"
@@ -11,7 +10,7 @@ import (
 
 	"github.com/pkg/errors"
 
-	wire "github.com/tendermint/go-wire"
+	amino "github.com/tendermint/go-amino"
 	"github.com/tendermint/tendermint/types"
 	auto "github.com/tendermint/tmlibs/autofile"
 	cmn "github.com/tendermint/tmlibs/common"
@@ -38,20 +37,21 @@ type EndHeightMessage struct {
 
 type WALMessage interface{}
 
-var _ = wire.RegisterInterface(
-	struct{ WALMessage }{},
-	wire.ConcreteType{types.EventDataRoundState{}, 0x01},
-	wire.ConcreteType{msgInfo{}, 0x02},
-	wire.ConcreteType{timeoutInfo{}, 0x03},
-	wire.ConcreteType{EndHeightMessage{}, 0x04},
-)
+func RegisterWALMessages(cdc *amino.Codec) {
+	cdc.RegisterInterface((*WALMessage)(nil), nil)
+	cdc.RegisterConcrete(types.EventDataRoundState{}, "tendermint/wal/EventDataRoundState", nil)
+	cdc.RegisterConcrete(msgInfo{}, "tendermint/wal/MsgInfo", nil)
+	cdc.RegisterConcrete(timeoutInfo{}, "tendermint/wal/TimeoutInfo", nil)
+	cdc.RegisterConcrete(EndHeightMessage{}, "tendermint/wal/EndHeightMessage", nil)
+}
 
 //--------------------------------------------------------
 // Simple write-ahead logger
 
 // WAL is an interface for any write-ahead logger.
 type WAL interface {
-	Save(WALMessage)
+	Write(WALMessage)
+	WriteSync(WALMessage)
 	Group() *auto.Group
 	SearchForEndHeight(height int64, options *WALSearchOptions) (gr *auto.GroupReader, found bool, err error)
 
@@ -68,12 +68,11 @@ type baseWAL struct {
 	cmn.BaseService
 
 	group *auto.Group
-	light bool // ignore block parts
 
 	enc *WALEncoder
 }
 
-func NewWAL(walFile string, light bool) (*baseWAL, error) {
+func NewWAL(walFile string) (*baseWAL, error) {
 	err := cmn.EnsureDir(filepath.Dir(walFile), 0700)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to ensure WAL directory is in place")
@@ -85,7 +84,6 @@ func NewWAL(walFile string, light bool) (*baseWAL, error) {
 	}
 	wal := &baseWAL{
 		group: group,
-		light: light,
 		enc:   NewWALEncoder(group),
 	}
 	wal.BaseService = *cmn.NewBaseService(nil, "baseWAL", wal)
@@ -101,7 +99,7 @@ func (wal *baseWAL) OnStart() error {
 	if err != nil {
 		return err
 	} else if size == 0 {
-		wal.Save(EndHeightMessage{0})
+		wal.WriteSync(EndHeightMessage{0})
 	}
 	err = wal.group.Start()
 	return err
@@ -112,29 +110,31 @@ func (wal *baseWAL) OnStop() {
 	wal.group.Stop()
 }
 
-// called in newStep and for each pass in receiveRoutine
-func (wal *baseWAL) Save(msg WALMessage) {
+// Write is called in newStep and for each receive on the
+// peerMsgQueue and the timeoutTicker.
+// NOTE: does not call fsync()
+func (wal *baseWAL) Write(msg WALMessage) {
 	if wal == nil {
 		return
 	}
 
-	if wal.light {
-		// in light mode we only write new steps, timeouts, and our own votes (no proposals, block parts)
-		if mi, ok := msg.(msgInfo); ok {
-			if mi.PeerID != "" {
-				return
-			}
-		}
-	}
-
 	// Write the wal message
 	if err := wal.enc.Encode(&TimedWALMessage{time.Now(), msg}); err != nil {
-		cmn.PanicQ(cmn.Fmt("Error writing msg to consensus wal: %v \n\nMessage: %v", err, msg))
+		panic(cmn.Fmt("Error writing msg to consensus wal: %v \n\nMessage: %v", err, msg))
+	}
+}
+
+// WriteSync is called when we receive a msg from ourselves
+// so that we write to disk before sending signed messages.
+// NOTE: calls fsync()
+func (wal *baseWAL) WriteSync(msg WALMessage) {
+	if wal == nil {
+		return
 	}
 
-	// TODO: only flush when necessary
+	wal.Write(msg)
 	if err := wal.group.Flush(); err != nil {
-		cmn.PanicQ(cmn.Fmt("Error flushing consensus wal buf to file. Error: %v \n", err))
+		panic(cmn.Fmt("Error flushing consensus wal buf to file. Error: %v \n", err))
 	}
 }
 
@@ -144,13 +144,14 @@ type WALSearchOptions struct {
 	IgnoreDataCorruptionErrors bool
 }
 
-// SearchForEndHeight searches for the EndHeightMessage with the height and
-// returns an auto.GroupReader, whenever it was found or not and an error.
+// SearchForEndHeight searches for the EndHeightMessage with the given height
+// and returns an auto.GroupReader, whenever it was found or not and an error.
 // Group reader will be nil if found equals false.
 //
 // CONTRACT: caller must close group reader.
 func (wal *baseWAL) SearchForEndHeight(height int64, options *WALSearchOptions) (gr *auto.GroupReader, found bool, err error) {
 	var msg *TimedWALMessage
+	lastHeightFound := int64(-1)
 
 	// NOTE: starting from the last file in the group because we're usually
 	// searching for the last height. See replay.go
@@ -166,17 +167,25 @@ func (wal *baseWAL) SearchForEndHeight(height int64, options *WALSearchOptions)
 		for {
 			msg, err = dec.Decode()
 			if err == io.EOF {
+				// OPTIMISATION: no need to look for height in older files if we've seen h < height
+				if lastHeightFound > 0 && lastHeightFound < height {
+					gr.Close()
+					return nil, false, nil
+				}
 				// check next file
 				break
 			}
 			if options.IgnoreDataCorruptionErrors && IsDataCorruptionError(err) {
+				wal.Logger.Debug("Corrupted entry. Skipping...", "err", err)
 				// do nothing
+				continue
 			} else if err != nil {
 				gr.Close()
 				return nil, false, err
 			}
 
 			if m, ok := msg.Msg.(EndHeightMessage); ok {
+				lastHeightFound = m.Height
 				if m.Height == height { // found
 					wal.Logger.Debug("Found", "height", height, "index", index)
 					return gr, true, nil
@@ -193,7 +202,7 @@ func (wal *baseWAL) SearchForEndHeight(height int64, options *WALSearchOptions)
 
 // A WALEncoder writes custom-encoded WAL messages to an output stream.
 //
-// Format: 4 bytes CRC sum + 4 bytes length + arbitrary-length value (go-wire encoded)
+// Format: 4 bytes CRC sum + 4 bytes length + arbitrary-length value (go-amino encoded)
 type WALEncoder struct {
 	wr io.Writer
 }
@@ -205,7 +214,7 @@ func NewWALEncoder(wr io.Writer) *WALEncoder {
 
 // Encode writes the custom encoding of v to the stream.
 func (enc *WALEncoder) Encode(v *TimedWALMessage) error {
-	data := wire.BinaryBytes(v)
+	data := cdc.MustMarshalBinaryBare(v)
 
 	crc := crc32.Checksum(data, crc32c)
 	length := uint32(len(data))
@@ -271,23 +280,17 @@ func (dec *WALDecoder) Decode() (*TimedWALMessage, error) {
 
 	b = make([]byte, 4)
 	_, err = dec.rd.Read(b)
-	if err == io.EOF {
-		return nil, err
-	}
 	if err != nil {
 		return nil, fmt.Errorf("failed to read length: %v", err)
 	}
 	length := binary.BigEndian.Uint32(b)
 
 	if length > maxMsgSizeBytes {
-		return nil, DataCorruptionError{fmt.Errorf("length %d exceeded maximum possible value of %d bytes", length, maxMsgSizeBytes)}
+		return nil, fmt.Errorf("length %d exceeded maximum possible value of %d bytes", length, maxMsgSizeBytes)
 	}
 
 	data := make([]byte, length)
 	_, err = dec.rd.Read(data)
-	if err == io.EOF {
-		return nil, err
-	}
 	if err != nil {
 		return nil, fmt.Errorf("failed to read data: %v", err)
 	}
@@ -298,9 +301,8 @@ func (dec *WALDecoder) Decode() (*TimedWALMessage, error) {
 		return nil, DataCorruptionError{fmt.Errorf("checksums do not match: (read: %v, actual: %v)", crc, actualCRC)}
 	}
 
-	var nn int
-	var res *TimedWALMessage // nolint: gosimple
-	res = wire.ReadBinary(&TimedWALMessage{}, bytes.NewBuffer(data), int(length), &nn, &err).(*TimedWALMessage)
+	var res = new(TimedWALMessage) // nolint: gosimple
+	err = cdc.UnmarshalBinaryBare(data, res)
 	if err != nil {
 		return nil, DataCorruptionError{fmt.Errorf("failed to decode data: %v", err)}
 	}
@@ -310,8 +312,9 @@ func (dec *WALDecoder) Decode() (*TimedWALMessage, error) {
 
 type nilWAL struct{}
 
-func (nilWAL) Save(m WALMessage)  {}
-func (nilWAL) Group() *auto.Group { return nil }
+func (nilWAL) Write(m WALMessage)     {}
+func (nilWAL) WriteSync(m WALMessage) {}
+func (nilWAL) Group() *auto.Group     { return nil }
 func (nilWAL) SearchForEndHeight(height int64, options *WALSearchOptions) (gr *auto.GroupReader, found bool, err error) {
 	return nil, false, nil
 }
diff --git a/vendor/github.com/tendermint/tendermint/consensus/wal_generator.go b/vendor/github.com/tendermint/tendermint/consensus/wal_generator.go
index de41d40182188c8094377ac370e74474ad674cf7..713697dbdecf5e8a9502d95cb65eeea18114c90f 100644
--- a/vendor/github.com/tendermint/tendermint/consensus/wal_generator.go
+++ b/vendor/github.com/tendermint/tendermint/consensus/wal_generator.go
@@ -4,7 +4,6 @@ import (
 	"bufio"
 	"bytes"
 	"fmt"
-	"math/rand"
 	"os"
 	"path/filepath"
 	"strings"
@@ -17,6 +16,7 @@ import (
 	"github.com/tendermint/tendermint/proxy"
 	sm "github.com/tendermint/tendermint/state"
 	"github.com/tendermint/tendermint/types"
+	pvm "github.com/tendermint/tendermint/types/priv_validator"
 	auto "github.com/tendermint/tmlibs/autofile"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/db"
@@ -40,7 +40,7 @@ func WALWithNBlocks(numBlocks int) (data []byte, err error) {
 	// COPY PASTE FROM node.go WITH A FEW MODIFICATIONS
 	// NOTE: we can't import node package because of circular dependency
 	privValidatorFile := config.PrivValidatorFile()
-	privValidator := types.LoadOrGenPrivValidatorFS(privValidatorFile)
+	privValidator := pvm.LoadOrGenFilePV(privValidatorFile)
 	genDoc, err := types.GenesisDocFromFile(config.GenesisFile())
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to read genesis file")
@@ -52,7 +52,7 @@ func WALWithNBlocks(numBlocks int) (data []byte, err error) {
 		return nil, errors.Wrap(err, "failed to make genesis state")
 	}
 	blockStore := bc.NewBlockStore(blockStoreDB)
-	handshaker := NewHandshaker(stateDB, state, blockStore, genDoc.AppState())
+	handshaker := NewHandshaker(stateDB, state, blockStore, genDoc)
 	proxyApp := proxy.NewAppConns(proxy.NewLocalClientCreator(app), handshaker)
 	proxyApp.SetLogger(logger.With("module", "proxy"))
 	if err := proxyApp.Start(); err != nil {
@@ -83,7 +83,7 @@ func WALWithNBlocks(numBlocks int) (data []byte, err error) {
 	numBlocksWritten := make(chan struct{})
 	wal := newByteBufferWAL(logger, NewWALEncoder(wr), int64(numBlocks), numBlocksWritten)
 	// see wal.go#103
-	wal.Save(EndHeightMessage{0})
+	wal.Write(EndHeightMessage{0})
 	consensusState.wal = wal
 
 	if err := consensusState.Start(); err != nil {
@@ -116,7 +116,7 @@ func makePathname() string {
 func randPort() int {
 	// returns between base and base + spread
 	base, spread := 20000, 20000
-	return base + rand.Intn(spread)
+	return base + cmn.RandIntn(spread)
 }
 
 func makeAddrs() (string, string, string) {
@@ -166,7 +166,7 @@ func newByteBufferWAL(logger log.Logger, enc *WALEncoder, nBlocks int64, signalS
 // Save writes message to the internal buffer except when heightToStop is
 // reached, in which case it will signal the caller via signalWhenStopsTo and
 // skip writing.
-func (w *byteBufferWAL) Save(m WALMessage) {
+func (w *byteBufferWAL) Write(m WALMessage) {
 	if w.stopped {
 		w.logger.Debug("WAL already stopped. Not writing message", "msg", m)
 		return
@@ -189,6 +189,10 @@ func (w *byteBufferWAL) Save(m WALMessage) {
 	}
 }
 
+func (w *byteBufferWAL) WriteSync(m WALMessage) {
+	w.Write(m)
+}
+
 func (w *byteBufferWAL) Group() *auto.Group {
 	panic("not implemented")
 }
diff --git a/vendor/github.com/tendermint/tendermint/consensus/wire.go b/vendor/github.com/tendermint/tendermint/consensus/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..81223c6895fbcf0aa1811f5ba20e6d5e332c0763
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/consensus/wire.go
@@ -0,0 +1,14 @@
+package consensus
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	RegisterConsensusMessages(cdc)
+	RegisterWALMessages(cdc)
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/evidence/reactor.go b/vendor/github.com/tendermint/tendermint/evidence/reactor.go
index 6647db9691cd06b38842801856fb064c20c92c3d..a6aa66b1f1c05a2ca3ef79657314a90ea8b57634 100644
--- a/vendor/github.com/tendermint/tendermint/evidence/reactor.go
+++ b/vendor/github.com/tendermint/tendermint/evidence/reactor.go
@@ -1,12 +1,11 @@
 package evidence
 
 import (
-	"bytes"
 	"fmt"
 	"reflect"
 	"time"
 
-	wire "github.com/tendermint/go-wire"
+	"github.com/tendermint/go-amino"
 	"github.com/tendermint/tmlibs/log"
 
 	"github.com/tendermint/tendermint/p2p"
@@ -16,7 +15,7 @@ import (
 const (
 	EvidenceChannel = byte(0x38)
 
-	maxEvidenceMessageSize     = 1048576 // 1MB TODO make it configurable
+	maxMsgSize                 = 1048576 // 1MB TODO make it configurable
 	broadcastEvidenceIntervalS = 60      // broadcast uncommitted evidence this often
 )
 
@@ -68,7 +67,7 @@ func (evR *EvidenceReactor) AddPeer(peer p2p.Peer) {
 	// the rest will be sent by the broadcastRoutine
 	evidences := evR.evpool.PriorityEvidence()
 	msg := &EvidenceListMessage{evidences}
-	success := peer.Send(EvidenceChannel, struct{ EvidenceMessage }{msg})
+	success := peer.Send(EvidenceChannel, cdc.MustMarshalBinaryBare(msg))
 	if !success {
 		// TODO: remove peer ?
 	}
@@ -82,7 +81,7 @@ func (evR *EvidenceReactor) RemovePeer(peer p2p.Peer, reason interface{}) {
 // Receive implements Reactor.
 // It adds any received evidence to the evpool.
 func (evR *EvidenceReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte) {
-	_, msg, err := DecodeMessage(msgBytes)
+	msg, err := DecodeMessage(msgBytes)
 	if err != nil {
 		evR.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes)
 		evR.Switch.StopPeerForError(src, err)
@@ -119,7 +118,7 @@ func (evR *EvidenceReactor) broadcastRoutine() {
 		case evidence := <-evR.evpool.EvidenceChan():
 			// broadcast some new evidence
 			msg := &EvidenceListMessage{[]types.Evidence{evidence}}
-			evR.Switch.Broadcast(EvidenceChannel, struct{ EvidenceMessage }{msg})
+			evR.Switch.Broadcast(EvidenceChannel, cdc.MustMarshalBinaryBare(msg))
 
 			// TODO: Broadcast runs asynchronously, so this should wait on the successChan
 			// in another routine before marking to be proper.
@@ -127,7 +126,7 @@ func (evR *EvidenceReactor) broadcastRoutine() {
 		case <-ticker.C:
 			// broadcast all pending evidence
 			msg := &EvidenceListMessage{evR.evpool.PendingEvidence()}
-			evR.Switch.Broadcast(EvidenceChannel, struct{ EvidenceMessage }{msg})
+			evR.Switch.Broadcast(EvidenceChannel, cdc.MustMarshalBinaryBare(msg))
 		case <-evR.Quit():
 			return
 		}
@@ -137,24 +136,22 @@ func (evR *EvidenceReactor) broadcastRoutine() {
 //-----------------------------------------------------------------------------
 // Messages
 
-const (
-	msgTypeEvidence = byte(0x01)
-)
-
 // EvidenceMessage is a message sent or received by the EvidenceReactor.
 type EvidenceMessage interface{}
 
-var _ = wire.RegisterInterface(
-	struct{ EvidenceMessage }{},
-	wire.ConcreteType{&EvidenceListMessage{}, msgTypeEvidence},
-)
+func RegisterEvidenceMessages(cdc *amino.Codec) {
+	cdc.RegisterInterface((*EvidenceMessage)(nil), nil)
+	cdc.RegisterConcrete(&EvidenceListMessage{},
+		"tendermint/evidence/EvidenceListMessage", nil)
+}
 
 // DecodeMessage decodes a byte-array into a EvidenceMessage.
-func DecodeMessage(bz []byte) (msgType byte, msg EvidenceMessage, err error) {
-	msgType = bz[0]
-	n := new(int)
-	r := bytes.NewReader(bz)
-	msg = wire.ReadBinary(struct{ EvidenceMessage }{}, r, maxEvidenceMessageSize, n, &err).(struct{ EvidenceMessage }).EvidenceMessage
+func DecodeMessage(bz []byte) (msg EvidenceMessage, err error) {
+	if len(bz) > maxMsgSize {
+		return msg, fmt.Errorf("Msg exceeds max size (%d > %d)",
+			len(bz), maxMsgSize)
+	}
+	err = cdc.UnmarshalBinaryBare(bz, &msg)
 	return
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/evidence/store.go b/vendor/github.com/tendermint/tendermint/evidence/store.go
index 7c8becd02c1eba4c791330a01ab28be3c94d767a..081715e3c92b4b807faaec92cc69548193e2af5b 100644
--- a/vendor/github.com/tendermint/tendermint/evidence/store.go
+++ b/vendor/github.com/tendermint/tendermint/evidence/store.go
@@ -3,7 +3,6 @@ package evidence
 import (
 	"fmt"
 
-	wire "github.com/tendermint/go-wire"
 	"github.com/tendermint/tendermint/types"
 	dbm "github.com/tendermint/tmlibs/db"
 )
@@ -104,7 +103,10 @@ func (store *EvidenceStore) ListEvidence(prefixKey string) (evidence []types.Evi
 		val := iter.Value()
 
 		var ei EvidenceInfo
-		wire.ReadBinaryBytes(val, &ei)
+		err := cdc.UnmarshalBinaryBare(val, &ei)
+		if err != nil {
+			panic(err)
+		}
 		evidence = append(evidence, ei.Evidence)
 	}
 	return evidence
@@ -119,7 +121,10 @@ func (store *EvidenceStore) GetEvidence(height int64, hash []byte) *EvidenceInfo
 		return nil
 	}
 	var ei EvidenceInfo
-	wire.ReadBinaryBytes(val, &ei)
+	err := cdc.UnmarshalBinaryBare(val, &ei)
+	if err != nil {
+		panic(err)
+	}
 	return &ei
 }
 
@@ -137,7 +142,7 @@ func (store *EvidenceStore) AddNewEvidence(evidence types.Evidence, priority int
 		Priority:  priority,
 		Evidence:  evidence,
 	}
-	eiBytes := wire.BinaryBytes(ei)
+	eiBytes := cdc.MustMarshalBinaryBare(ei)
 
 	// add it to the store
 	key := keyOutqueue(evidence, priority)
@@ -171,7 +176,7 @@ func (store *EvidenceStore) MarkEvidenceAsCommitted(evidence types.Evidence) {
 	ei.Committed = true
 
 	lookupKey := keyLookup(evidence)
-	store.db.SetSync(lookupKey, wire.BinaryBytes(ei))
+	store.db.SetSync(lookupKey, cdc.MustMarshalBinaryBare(ei))
 }
 
 //---------------------------------------------------
@@ -181,6 +186,9 @@ func (store *EvidenceStore) getEvidenceInfo(evidence types.Evidence) EvidenceInf
 	key := keyLookup(evidence)
 	var ei EvidenceInfo
 	b := store.db.Get(key)
-	wire.ReadBinaryBytes(b, &ei)
+	err := cdc.UnmarshalBinaryBare(b, &ei)
+	if err != nil {
+		panic(err)
+	}
 	return ei
 }
diff --git a/vendor/github.com/tendermint/tendermint/evidence/wire.go b/vendor/github.com/tendermint/tendermint/evidence/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..842e0707a8eda58b2a581d8244312672a3cec881
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/evidence/wire.go
@@ -0,0 +1,25 @@
+package evidence
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+	"github.com/tendermint/tendermint/types"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	RegisterEvidenceMessages(cdc)
+	crypto.RegisterAmino(cdc)
+	types.RegisterEvidences(cdc)
+	RegisterMockEvidences(cdc) // For testing
+}
+
+//-------------------------------------------
+
+func RegisterMockEvidences(cdc *amino.Codec) {
+	cdc.RegisterConcrete(types.MockGoodEvidence{},
+		"tendermint/MockGoodEvidence", nil)
+	cdc.RegisterConcrete(types.MockBadEvidence{},
+		"tendermint/MockBadEvidence", nil)
+}
diff --git a/vendor/github.com/tendermint/tendermint/libs/events/event_cache.go b/vendor/github.com/tendermint/tendermint/libs/events/event_cache.go
new file mode 100644
index 0000000000000000000000000000000000000000..f508e873da00913d90e8215960fbaccda6cc193c
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/libs/events/event_cache.go
@@ -0,0 +1,37 @@
+package events
+
+// An EventCache buffers events for a Fireable
+// All events are cached. Filtering happens on Flush
+type EventCache struct {
+	evsw   Fireable
+	events []eventInfo
+}
+
+// Create a new EventCache with an EventSwitch as backend
+func NewEventCache(evsw Fireable) *EventCache {
+	return &EventCache{
+		evsw: evsw,
+	}
+}
+
+// a cached event
+type eventInfo struct {
+	event string
+	data  EventData
+}
+
+// Cache an event to be fired upon finality.
+func (evc *EventCache) FireEvent(event string, data EventData) {
+	// append to list (go will grow our backing array exponentially)
+	evc.events = append(evc.events, eventInfo{event, data})
+}
+
+// Fire events by running evsw.FireEvent on all cached events. Blocks.
+// Clears cached events
+func (evc *EventCache) Flush() {
+	for _, ei := range evc.events {
+		evc.evsw.FireEvent(ei.event, ei.data)
+	}
+	// Clear the buffer, since we only add to it with append it's safe to just set it to nil and maybe safe an allocation
+	evc.events = nil
+}
diff --git a/vendor/github.com/tendermint/tendermint/libs/events/events.go b/vendor/github.com/tendermint/tendermint/libs/events/events.go
new file mode 100644
index 0000000000000000000000000000000000000000..075f9b42b16accfedf4d975757d8372d80be4216
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/libs/events/events.go
@@ -0,0 +1,220 @@
+/*
+Pub-Sub in go with event caching
+*/
+package events
+
+import (
+	"sync"
+
+	cmn "github.com/tendermint/tmlibs/common"
+)
+
+// Generic event data can be typed and registered with tendermint/go-amino
+// via concrete implementation of this interface
+type EventData interface {
+	//AssertIsEventData()
+}
+
+// reactors and other modules should export
+// this interface to become eventable
+type Eventable interface {
+	SetEventSwitch(evsw EventSwitch)
+}
+
+// an event switch or cache implements fireable
+type Fireable interface {
+	FireEvent(event string, data EventData)
+}
+
+type EventSwitch interface {
+	cmn.Service
+	Fireable
+
+	AddListenerForEvent(listenerID, event string, cb EventCallback)
+	RemoveListenerForEvent(event string, listenerID string)
+	RemoveListener(listenerID string)
+}
+
+type eventSwitch struct {
+	cmn.BaseService
+
+	mtx        sync.RWMutex
+	eventCells map[string]*eventCell
+	listeners  map[string]*eventListener
+}
+
+func NewEventSwitch() EventSwitch {
+	evsw := &eventSwitch{
+		eventCells: make(map[string]*eventCell),
+		listeners:  make(map[string]*eventListener),
+	}
+	evsw.BaseService = *cmn.NewBaseService(nil, "EventSwitch", evsw)
+	return evsw
+}
+
+func (evsw *eventSwitch) OnStart() error {
+	return nil
+}
+
+func (evsw *eventSwitch) OnStop() {}
+
+func (evsw *eventSwitch) AddListenerForEvent(listenerID, event string, cb EventCallback) {
+	// Get/Create eventCell and listener
+	evsw.mtx.Lock()
+	eventCell := evsw.eventCells[event]
+	if eventCell == nil {
+		eventCell = newEventCell()
+		evsw.eventCells[event] = eventCell
+	}
+	listener := evsw.listeners[listenerID]
+	if listener == nil {
+		listener = newEventListener(listenerID)
+		evsw.listeners[listenerID] = listener
+	}
+	evsw.mtx.Unlock()
+
+	// Add event and listener
+	eventCell.AddListener(listenerID, cb)
+	listener.AddEvent(event)
+}
+
+func (evsw *eventSwitch) RemoveListener(listenerID string) {
+	// Get and remove listener
+	evsw.mtx.RLock()
+	listener := evsw.listeners[listenerID]
+	evsw.mtx.RUnlock()
+	if listener == nil {
+		return
+	}
+
+	evsw.mtx.Lock()
+	delete(evsw.listeners, listenerID)
+	evsw.mtx.Unlock()
+
+	// Remove callback for each event.
+	listener.SetRemoved()
+	for _, event := range listener.GetEvents() {
+		evsw.RemoveListenerForEvent(event, listenerID)
+	}
+}
+
+func (evsw *eventSwitch) RemoveListenerForEvent(event string, listenerID string) {
+	// Get eventCell
+	evsw.mtx.Lock()
+	eventCell := evsw.eventCells[event]
+	evsw.mtx.Unlock()
+
+	if eventCell == nil {
+		return
+	}
+
+	// Remove listenerID from eventCell
+	numListeners := eventCell.RemoveListener(listenerID)
+
+	// Maybe garbage collect eventCell.
+	if numListeners == 0 {
+		// Lock again and double check.
+		evsw.mtx.Lock()      // OUTER LOCK
+		eventCell.mtx.Lock() // INNER LOCK
+		if len(eventCell.listeners) == 0 {
+			delete(evsw.eventCells, event)
+		}
+		eventCell.mtx.Unlock() // INNER LOCK
+		evsw.mtx.Unlock()      // OUTER LOCK
+	}
+}
+
+func (evsw *eventSwitch) FireEvent(event string, data EventData) {
+	// Get the eventCell
+	evsw.mtx.RLock()
+	eventCell := evsw.eventCells[event]
+	evsw.mtx.RUnlock()
+
+	if eventCell == nil {
+		return
+	}
+
+	// Fire event for all listeners in eventCell
+	eventCell.FireEvent(data)
+}
+
+//-----------------------------------------------------------------------------
+
+// eventCell handles keeping track of listener callbacks for a given event.
+type eventCell struct {
+	mtx       sync.RWMutex
+	listeners map[string]EventCallback
+}
+
+func newEventCell() *eventCell {
+	return &eventCell{
+		listeners: make(map[string]EventCallback),
+	}
+}
+
+func (cell *eventCell) AddListener(listenerID string, cb EventCallback) {
+	cell.mtx.Lock()
+	cell.listeners[listenerID] = cb
+	cell.mtx.Unlock()
+}
+
+func (cell *eventCell) RemoveListener(listenerID string) int {
+	cell.mtx.Lock()
+	delete(cell.listeners, listenerID)
+	numListeners := len(cell.listeners)
+	cell.mtx.Unlock()
+	return numListeners
+}
+
+func (cell *eventCell) FireEvent(data EventData) {
+	cell.mtx.RLock()
+	for _, listener := range cell.listeners {
+		listener(data)
+	}
+	cell.mtx.RUnlock()
+}
+
+//-----------------------------------------------------------------------------
+
+type EventCallback func(data EventData)
+
+type eventListener struct {
+	id string
+
+	mtx     sync.RWMutex
+	removed bool
+	events  []string
+}
+
+func newEventListener(id string) *eventListener {
+	return &eventListener{
+		id:      id,
+		removed: false,
+		events:  nil,
+	}
+}
+
+func (evl *eventListener) AddEvent(event string) {
+	evl.mtx.Lock()
+	defer evl.mtx.Unlock()
+
+	if evl.removed {
+		return
+	}
+	evl.events = append(evl.events, event)
+}
+
+func (evl *eventListener) GetEvents() []string {
+	evl.mtx.RLock()
+	defer evl.mtx.RUnlock()
+
+	events := make([]string, len(evl.events))
+	copy(events, evl.events)
+	return events
+}
+
+func (evl *eventListener) SetRemoved() {
+	evl.mtx.Lock()
+	defer evl.mtx.Unlock()
+	evl.removed = true
+}
diff --git a/vendor/github.com/tendermint/tmlibs/pubsub/pubsub.go b/vendor/github.com/tendermint/tendermint/libs/pubsub/pubsub.go
similarity index 87%
rename from vendor/github.com/tendermint/tmlibs/pubsub/pubsub.go
rename to vendor/github.com/tendermint/tendermint/libs/pubsub/pubsub.go
index 90f6e4ae64d7b4237a8354c9024beb233c9b937c..684ff358aeb65657d79c1cb1ca65ed813a72862a 100644
--- a/vendor/github.com/tendermint/tmlibs/pubsub/pubsub.go
+++ b/vendor/github.com/tendermint/tendermint/libs/pubsub/pubsub.go
@@ -44,12 +44,12 @@ type cmd struct {
 	ch       chan<- interface{}
 	clientID string
 	msg      interface{}
-	tags     map[string]interface{}
+	tags     TagMap
 }
 
 // Query defines an interface for a query to be used for subscribing.
 type Query interface {
-	Matches(tags map[string]interface{}) bool
+	Matches(tags TagMap) bool
 	String() string
 }
 
@@ -68,6 +68,37 @@ type Server struct {
 // Option sets a parameter for the server.
 type Option func(*Server)
 
+// TagMap is used to associate tags to a message.
+// They can be queried by subscribers to choose messages they will received.
+type TagMap interface {
+	// Get returns the value for a key, or nil if no value is present.
+	// The ok result indicates whether value was found in the tags.
+	Get(key string) (value string, ok bool)
+	// Len returns the number of tags.
+	Len() int
+}
+
+type tagMap map[string]string
+
+var _ TagMap = (*tagMap)(nil)
+
+// NewTagMap constructs a new immutable tag set from a map.
+func NewTagMap(data map[string]string) TagMap {
+	return tagMap(data)
+}
+
+// Get returns the value for a key, or nil if no value is present.
+// The ok result indicates whether value was found in the tags.
+func (ts tagMap) Get(key string) (value string, ok bool) {
+	value, ok = ts[key]
+	return
+}
+
+// Len returns the number of tags.
+func (ts tagMap) Len() int {
+	return len(ts)
+}
+
 // NewServer returns a new server. See the commentary on the Option functions
 // for a detailed description of how to configure buffering. If no options are
 // provided, the resulting server's queue is unbuffered.
@@ -184,13 +215,13 @@ func (s *Server) UnsubscribeAll(ctx context.Context, clientID string) error {
 // Publish publishes the given message. An error will be returned to the caller
 // if the context is canceled.
 func (s *Server) Publish(ctx context.Context, msg interface{}) error {
-	return s.PublishWithTags(ctx, msg, make(map[string]interface{}))
+	return s.PublishWithTags(ctx, msg, NewTagMap(make(map[string]string)))
 }
 
 // PublishWithTags publishes the given message with the set of tags. The set is
 // matched with clients queries. If there is a match, the message is sent to
 // the client.
-func (s *Server) PublishWithTags(ctx context.Context, msg interface{}, tags map[string]interface{}) error {
+func (s *Server) PublishWithTags(ctx context.Context, msg interface{}, tags TagMap) error {
 	select {
 	case s.cmds <- cmd{op: pub, msg: msg, tags: tags}:
 		return nil
@@ -302,7 +333,7 @@ func (state *state) removeAll(clientID string) {
 	delete(state.clients, clientID)
 }
 
-func (state *state) send(msg interface{}, tags map[string]interface{}) {
+func (state *state) send(msg interface{}, tags TagMap) {
 	for q, clientToChannelMap := range state.queries {
 		if q.Matches(tags) {
 			for _, ch := range clientToChannelMap {
diff --git a/vendor/github.com/tendermint/tmlibs/pubsub/query/empty.go b/vendor/github.com/tendermint/tendermint/libs/pubsub/query/empty.go
similarity index 62%
rename from vendor/github.com/tendermint/tmlibs/pubsub/query/empty.go
rename to vendor/github.com/tendermint/tendermint/libs/pubsub/query/empty.go
index 2d60a8923bc7f34f678c8d1b968b4f09c5934836..17d7acefa081dbdead193f2b54d1254835889f89 100644
--- a/vendor/github.com/tendermint/tmlibs/pubsub/query/empty.go
+++ b/vendor/github.com/tendermint/tendermint/libs/pubsub/query/empty.go
@@ -1,11 +1,13 @@
 package query
 
+import "github.com/tendermint/tendermint/libs/pubsub"
+
 // Empty query matches any set of tags.
 type Empty struct {
 }
 
 // Matches always returns true.
-func (Empty) Matches(tags map[string]interface{}) bool {
+func (Empty) Matches(tags pubsub.TagMap) bool {
 	return true
 }
 
diff --git a/vendor/github.com/tendermint/tmlibs/pubsub/query/query.go b/vendor/github.com/tendermint/tendermint/libs/pubsub/query/query.go
similarity index 82%
rename from vendor/github.com/tendermint/tmlibs/pubsub/query/query.go
rename to vendor/github.com/tendermint/tendermint/libs/pubsub/query/query.go
index 56f2829d20bd27688d4ec5f30d73c97f976f8264..ec187486e72920359d36e401e308935d829ee92c 100644
--- a/vendor/github.com/tendermint/tmlibs/pubsub/query/query.go
+++ b/vendor/github.com/tendermint/tendermint/libs/pubsub/query/query.go
@@ -14,6 +14,8 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/tendermint/tendermint/libs/pubsub"
 )
 
 // Query holds the query string and the query parser.
@@ -75,6 +77,13 @@ const (
 	OpContains
 )
 
+const (
+	// DateLayout defines a layout for all dates (`DATE date`)
+	DateLayout = "2006-01-02"
+	// TimeLayout defines a layout for all times (`TIME time`)
+	TimeLayout = time.RFC3339
+)
+
 // Conditions returns a list of conditions.
 func (q *Query) Conditions() []Condition {
 	conditions := make([]Condition, 0)
@@ -110,7 +119,7 @@ func (q *Query) Conditions() []Condition {
 			conditions = append(conditions, Condition{tag, op, valueWithoutSingleQuotes})
 		case rulenumber:
 			number := buffer[begin:end]
-			if strings.Contains(number, ".") { // if it looks like a floating-point number
+			if strings.ContainsAny(number, ".") { // if it looks like a floating-point number
 				value, err := strconv.ParseFloat(number, 64)
 				if err != nil {
 					panic(fmt.Sprintf("got %v while trying to parse %s as float64 (should never happen if the grammar is correct)", err, number))
@@ -124,7 +133,7 @@ func (q *Query) Conditions() []Condition {
 				conditions = append(conditions, Condition{tag, op, value})
 			}
 		case ruletime:
-			value, err := time.Parse(time.RFC3339, buffer[begin:end])
+			value, err := time.Parse(TimeLayout, buffer[begin:end])
 			if err != nil {
 				panic(fmt.Sprintf("got %v while trying to parse %s as time.Time / RFC3339 (should never happen if the grammar is correct)", err, buffer[begin:end]))
 			}
@@ -145,8 +154,8 @@ func (q *Query) Conditions() []Condition {
 //
 // For example, query "name=John" matches tags = {"name": "John"}. More
 // examples could be found in parser_test.go and query_test.go.
-func (q *Query) Matches(tags map[string]interface{}) bool {
-	if len(tags) == 0 {
+func (q *Query) Matches(tags pubsub.TagMap) bool {
+	if tags.Len() == 0 {
 		return false
 	}
 
@@ -186,7 +195,7 @@ func (q *Query) Matches(tags map[string]interface{}) bool {
 			}
 		case rulenumber:
 			number := buffer[begin:end]
-			if strings.Contains(number, ".") { // if it looks like a floating-point number
+			if strings.ContainsAny(number, ".") { // if it looks like a floating-point number
 				value, err := strconv.ParseFloat(number, 64)
 				if err != nil {
 					panic(fmt.Sprintf("got %v while trying to parse %s as float64 (should never happen if the grammar is correct)", err, number))
@@ -204,7 +213,7 @@ func (q *Query) Matches(tags map[string]interface{}) bool {
 				}
 			}
 		case ruletime:
-			value, err := time.Parse(time.RFC3339, buffer[begin:end])
+			value, err := time.Parse(TimeLayout, buffer[begin:end])
 			if err != nil {
 				panic(fmt.Sprintf("got %v while trying to parse %s as time.Time / RFC3339 (should never happen if the grammar is correct)", err, buffer[begin:end]))
 			}
@@ -231,18 +240,27 @@ func (q *Query) Matches(tags map[string]interface{}) bool {
 // value from it to the operand using the operator.
 //
 // "tx.gas", "=", "7", { "tx.gas": 7, "tx.ID": "4AE393495334" }
-func match(tag string, op Operator, operand reflect.Value, tags map[string]interface{}) bool {
+func match(tag string, op Operator, operand reflect.Value, tags pubsub.TagMap) bool {
 	// look up the tag from the query in tags
-	value, ok := tags[tag]
+	value, ok := tags.Get(tag)
 	if !ok {
 		return false
 	}
 	switch operand.Kind() {
 	case reflect.Struct: // time
 		operandAsTime := operand.Interface().(time.Time)
-		v, ok := value.(time.Time)
-		if !ok { // if value from tags is not time.Time
-			return false
+		// try our best to convert value from tags to time.Time
+		var (
+			v   time.Time
+			err error
+		)
+		if strings.ContainsAny(value, "T") {
+			v, err = time.Parse(TimeLayout, value)
+		} else {
+			v, err = time.Parse(DateLayout, value)
+		}
+		if err != nil {
+			panic(fmt.Sprintf("Failed to convert value %v from tag to time.Time: %v", value, err))
 		}
 		switch op {
 		case OpLessEqual:
@@ -260,23 +278,9 @@ func match(tag string, op Operator, operand reflect.Value, tags map[string]inter
 		operandFloat64 := operand.Interface().(float64)
 		var v float64
 		// try our best to convert value from tags to float64
-		switch vt := value.(type) {
-		case float64:
-			v = vt
-		case float32:
-			v = float64(vt)
-		case int:
-			v = float64(vt)
-		case int8:
-			v = float64(vt)
-		case int16:
-			v = float64(vt)
-		case int32:
-			v = float64(vt)
-		case int64:
-			v = float64(vt)
-		default: // fail for all other types
-			panic(fmt.Sprintf("Incomparable types: %T (%v) vs float64 (%v)", value, value, operandFloat64))
+		v, err := strconv.ParseFloat(value, 64)
+		if err != nil {
+			panic(fmt.Sprintf("Failed to convert value %v from tag to float64: %v", value, err))
 		}
 		switch op {
 		case OpLessEqual:
@@ -293,24 +297,20 @@ func match(tag string, op Operator, operand reflect.Value, tags map[string]inter
 	case reflect.Int64:
 		operandInt := operand.Interface().(int64)
 		var v int64
-		// try our best to convert value from tags to int64
-		switch vt := value.(type) {
-		case int64:
-			v = vt
-		case int8:
-			v = int64(vt)
-		case int16:
-			v = int64(vt)
-		case int32:
-			v = int64(vt)
-		case int:
-			v = int64(vt)
-		case float64:
-			v = int64(vt)
-		case float32:
-			v = int64(vt)
-		default: // fail for all other types
-			panic(fmt.Sprintf("Incomparable types: %T (%v) vs int64 (%v)", value, value, operandInt))
+		// if value looks like float, we try to parse it as float
+		if strings.ContainsAny(value, ".") {
+			v1, err := strconv.ParseFloat(value, 64)
+			if err != nil {
+				panic(fmt.Sprintf("Failed to convert value %v from tag to float64: %v", value, err))
+			}
+			v = int64(v1)
+		} else {
+			var err error
+			// try our best to convert value from tags to int64
+			v, err = strconv.ParseInt(value, 10, 64)
+			if err != nil {
+				panic(fmt.Sprintf("Failed to convert value %v from tag to int64: %v", value, err))
+			}
 		}
 		switch op {
 		case OpLessEqual:
@@ -325,15 +325,11 @@ func match(tag string, op Operator, operand reflect.Value, tags map[string]inter
 			return v == operandInt
 		}
 	case reflect.String:
-		v, ok := value.(string)
-		if !ok { // if value from tags is not string
-			return false
-		}
 		switch op {
 		case OpEqual:
-			return v == operand.String()
+			return value == operand.String()
 		case OpContains:
-			return strings.Contains(v, operand.String())
+			return strings.Contains(value, operand.String())
 		}
 	default:
 		panic(fmt.Sprintf("Unknown kind of operand %v", operand.Kind()))
diff --git a/vendor/github.com/tendermint/tmlibs/pubsub/query/query.peg.go b/vendor/github.com/tendermint/tendermint/libs/pubsub/query/query.peg.go
similarity index 100%
rename from vendor/github.com/tendermint/tmlibs/pubsub/query/query.peg.go
rename to vendor/github.com/tendermint/tendermint/libs/pubsub/query/query.peg.go
diff --git a/vendor/github.com/tendermint/tendermint/mempool/mempool.go b/vendor/github.com/tendermint/tendermint/mempool/mempool.go
index ec4f98478bc4dee7fef181480f4c2288c38b51c0..938fb2a7d36bb63b05eb55568cca4a899ced3808 100644
--- a/vendor/github.com/tendermint/tendermint/mempool/mempool.go
+++ b/vendor/github.com/tendermint/tendermint/mempool/mempool.go
@@ -3,6 +3,7 @@ package mempool
 import (
 	"bytes"
 	"container/list"
+	"fmt"
 	"sync"
 	"sync/atomic"
 	"time"
@@ -48,7 +49,13 @@ TODO: Better handle abci client errors. (make it automatically handle connection
 
 */
 
-var ErrTxInCache = errors.New("Tx already exists in cache")
+var (
+	// ErrTxInCache is returned to the client if we saw tx earlier
+	ErrTxInCache = errors.New("Tx already exists in cache")
+
+	// ErrMempoolIsFull means Tendermint & an application can't handle that much load
+	ErrMempoolIsFull = errors.New("Mempool is full")
+)
 
 // Mempool is an ordered in-memory pool for transactions before they are proposed in a consensus
 // round. Transaction validity is checked using the CheckTx abci message before the transaction is
@@ -79,7 +86,6 @@ type Mempool struct {
 }
 
 // NewMempool returns a new Mempool with the given configuration and connection to an application.
-// TODO: Extract logger into arguments.
 func NewMempool(config *cfg.MempoolConfig, proxyAppConn proxy.AppConnMempool, height int64) *Mempool {
 	mempool := &Mempool{
 		config:        config,
@@ -201,11 +207,14 @@ func (mem *Mempool) CheckTx(tx types.Tx, cb func(*abci.Response)) (err error) {
 	mem.proxyMtx.Lock()
 	defer mem.proxyMtx.Unlock()
 
+	if mem.Size() >= mem.config.Size {
+		return ErrMempoolIsFull
+	}
+
 	// CACHE
-	if mem.cache.Exists(tx) {
+	if !mem.cache.Push(tx) {
 		return ErrTxInCache
 	}
-	mem.cache.Push(tx)
 	// END CACHE
 
 	// WAL
@@ -255,16 +264,14 @@ func (mem *Mempool) resCbNormal(req *abci.Request, res *abci.Response) {
 				tx:      tx,
 			}
 			mem.txs.PushBack(memTx)
-			mem.logger.Info("Added good transaction", "tx", tx, "res", r)
+			mem.logger.Info("Added good transaction", "tx", fmt.Sprintf("%X", types.Tx(tx).Hash()), "res", r)
 			mem.notifyTxsAvailable()
 		} else {
 			// ignore bad transaction
-			mem.logger.Info("Rejected bad transaction", "tx", tx, "res", r)
+			mem.logger.Info("Rejected bad transaction", "tx", fmt.Sprintf("%X", types.Tx(tx).Hash()), "res", r)
 
 			// remove from cache (it might be good later)
 			mem.cache.Remove(tx)
-
-			// TODO: handle other retcodes
 		}
 	default:
 		// ignore other messages
@@ -462,14 +469,6 @@ func (cache *txCache) Reset() {
 	cache.mtx.Unlock()
 }
 
-// Exists returns true if the given tx is cached.
-func (cache *txCache) Exists(tx types.Tx) bool {
-	cache.mtx.Lock()
-	_, exists := cache.map_[string(tx)]
-	cache.mtx.Unlock()
-	return exists
-}
-
 // Push adds the given tx to the txCache. It returns false if tx is already in the cache.
 func (cache *txCache) Push(tx types.Tx) bool {
 	cache.mtx.Lock()
diff --git a/vendor/github.com/tendermint/tendermint/mempool/reactor.go b/vendor/github.com/tendermint/tendermint/mempool/reactor.go
index 514347e9405a475388b38516fb037f5e6c173f7d..54a3c32feacd25cf5f6d67ad49d3d1d3fa5c1e70 100644
--- a/vendor/github.com/tendermint/tendermint/mempool/reactor.go
+++ b/vendor/github.com/tendermint/tendermint/mempool/reactor.go
@@ -1,13 +1,12 @@
 package mempool
 
 import (
-	"bytes"
 	"fmt"
 	"reflect"
 	"time"
 
 	abci "github.com/tendermint/abci/types"
-	wire "github.com/tendermint/go-wire"
+	"github.com/tendermint/go-amino"
 	"github.com/tendermint/tmlibs/clist"
 	"github.com/tendermint/tmlibs/log"
 
@@ -19,7 +18,7 @@ import (
 const (
 	MempoolChannel = byte(0x30)
 
-	maxMempoolMessageSize      = 1048576 // 1MB TODO make it configurable
+	maxMsgSize                 = 1048576 // 1MB TODO make it configurable
 	peerCatchupSleepIntervalMS = 100     // If peer is behind, sleep this amount
 )
 
@@ -71,7 +70,7 @@ func (memR *MempoolReactor) RemovePeer(peer p2p.Peer, reason interface{}) {
 // Receive implements Reactor.
 // It adds any received transactions to the mempool.
 func (memR *MempoolReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte) {
-	_, msg, err := DecodeMessage(msgBytes)
+	msg, err := DecodeMessage(msgBytes)
 	if err != nil {
 		memR.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes)
 		memR.Switch.StopPeerForError(src, err)
@@ -137,7 +136,7 @@ func (memR *MempoolReactor) broadcastTxRoutine(peer p2p.Peer) {
 		}
 		// send memTx
 		msg := &TxMessage{Tx: memTx.tx}
-		success := peer.Send(MempoolChannel, struct{ MempoolMessage }{msg})
+		success := peer.Send(MempoolChannel, cdc.MustMarshalBinaryBare(msg))
 		if !success {
 			time.Sleep(peerCatchupSleepIntervalMS * time.Millisecond)
 			continue
@@ -158,24 +157,21 @@ func (memR *MempoolReactor) broadcastTxRoutine(peer p2p.Peer) {
 //-----------------------------------------------------------------------------
 // Messages
 
-const (
-	msgTypeTx = byte(0x01)
-)
-
 // MempoolMessage is a message sent or received by the MempoolReactor.
 type MempoolMessage interface{}
 
-var _ = wire.RegisterInterface(
-	struct{ MempoolMessage }{},
-	wire.ConcreteType{&TxMessage{}, msgTypeTx},
-)
+func RegisterMempoolMessages(cdc *amino.Codec) {
+	cdc.RegisterInterface((*MempoolMessage)(nil), nil)
+	cdc.RegisterConcrete(&TxMessage{}, "tendermint/mempool/TxMessage", nil)
+}
 
 // DecodeMessage decodes a byte-array into a MempoolMessage.
-func DecodeMessage(bz []byte) (msgType byte, msg MempoolMessage, err error) {
-	msgType = bz[0]
-	n := new(int)
-	r := bytes.NewReader(bz)
-	msg = wire.ReadBinary(struct{ MempoolMessage }{}, r, maxMempoolMessageSize, n, &err).(struct{ MempoolMessage }).MempoolMessage
+func DecodeMessage(bz []byte) (msg MempoolMessage, err error) {
+	if len(bz) > maxMsgSize {
+		return msg, fmt.Errorf("Msg exceeds max size (%d > %d)",
+			len(bz), maxMsgSize)
+	}
+	err = cdc.UnmarshalBinaryBare(bz, &msg)
 	return
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/mempool/wire.go b/vendor/github.com/tendermint/tendermint/mempool/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..ed08972687adbecd09fcd02866409a6b4a01cbc8
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/mempool/wire.go
@@ -0,0 +1,11 @@
+package mempool
+
+import (
+	"github.com/tendermint/go-amino"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	RegisterMempoolMessages(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/networks/remote/ansible/inventory/COPYING b/vendor/github.com/tendermint/tendermint/networks/remote/ansible/inventory/COPYING
new file mode 100644
index 0000000000000000000000000000000000000000..10926e87f113fb026c366866d6fa466061562870
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/networks/remote/ansible/inventory/COPYING
@@ -0,0 +1,675 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/vendor/github.com/tendermint/tendermint/node/node.go b/vendor/github.com/tendermint/tendermint/node/node.go
index acde2e48229a09055d51704e77c30bde03a615ca..b21f2db28ff4e881b40d619d6a1d61ebe8ed5a3d 100644
--- a/vendor/github.com/tendermint/tendermint/node/node.go
+++ b/vendor/github.com/tendermint/tendermint/node/node.go
@@ -2,15 +2,14 @@ package node
 
 import (
 	"bytes"
-	"encoding/json"
 	"errors"
 	"fmt"
 	"net"
 	"net/http"
 
 	abci "github.com/tendermint/abci/types"
+	amino "github.com/tendermint/go-amino"
 	crypto "github.com/tendermint/go-crypto"
-	wire "github.com/tendermint/go-wire"
 	cmn "github.com/tendermint/tmlibs/common"
 	dbm "github.com/tendermint/tmlibs/db"
 	"github.com/tendermint/tmlibs/log"
@@ -22,9 +21,9 @@ import (
 	mempl "github.com/tendermint/tendermint/mempool"
 	"github.com/tendermint/tendermint/p2p"
 	"github.com/tendermint/tendermint/p2p/pex"
-	"github.com/tendermint/tendermint/p2p/trust"
 	"github.com/tendermint/tendermint/proxy"
 	rpccore "github.com/tendermint/tendermint/rpc/core"
+	ctypes "github.com/tendermint/tendermint/rpc/core/types"
 	grpccore "github.com/tendermint/tendermint/rpc/grpc"
 	rpc "github.com/tendermint/tendermint/rpc/lib"
 	rpcserver "github.com/tendermint/tendermint/rpc/lib/server"
@@ -33,7 +32,7 @@ import (
 	"github.com/tendermint/tendermint/state/txindex/kv"
 	"github.com/tendermint/tendermint/state/txindex/null"
 	"github.com/tendermint/tendermint/types"
-	priv_val "github.com/tendermint/tendermint/types/priv_validator"
+	pvm "github.com/tendermint/tendermint/types/priv_validator"
 	"github.com/tendermint/tendermint/version"
 
 	_ "net/http/pprof"
@@ -78,7 +77,7 @@ type NodeProvider func(*cfg.Config, log.Logger) (*Node, error)
 // It implements NodeProvider.
 func DefaultNewNode(config *cfg.Config, logger log.Logger) (*Node, error) {
 	return NewNode(config,
-		types.LoadOrGenPrivValidatorFS(config.PrivValidatorFile()),
+		pvm.LoadOrGenFilePV(config.PrivValidatorFile()),
 		proxy.DefaultClientCreator(config.ProxyApp, config.ABCI, config.DBDir()),
 		DefaultGenesisDocProviderFunc(config),
 		DefaultDBProvider,
@@ -99,9 +98,8 @@ type Node struct {
 	privValidator types.PrivValidator // local node's validator key
 
 	// network
-	sw               *p2p.Switch             // p2p connections
-	addrBook         pex.AddrBook            // known peers
-	trustMetricStore *trust.TrustMetricStore // trust metrics for all peers
+	sw       *p2p.Switch  // p2p connections
+	addrBook pex.AddrBook // known peers
 
 	// services
 	eventBus         *types.EventBus // pub/sub for services
@@ -161,7 +159,7 @@ func NewNode(config *cfg.Config,
 	// and sync tendermint and the app by performing a handshake
 	// and replaying any necessary blocks
 	consensusLogger := logger.With("module", "consensus")
-	handshaker := cs.NewHandshaker(stateDB, state, blockStore, genDoc.AppState())
+	handshaker := cs.NewHandshaker(stateDB, state, blockStore, genDoc)
 	handshaker.SetLogger(consensusLogger)
 	proxyApp := proxy.NewAppConns(clientCreator, handshaker)
 	proxyApp.SetLogger(logger.With("module", "proxy"))
@@ -179,8 +177,8 @@ func NewNode(config *cfg.Config,
 			// TODO: persist this key so external signer
 			// can actually authenticate us
 			privKey = crypto.GenPrivKeyEd25519()
-			pvsc    = priv_val.NewSocketClient(
-				logger.With("module", "priv_val"),
+			pvsc    = pvm.NewSocketPV(
+				logger.With("module", "pvm"),
 				config.PrivValidatorListenAddr,
 				privKey,
 			)
@@ -262,20 +260,21 @@ func NewNode(config *cfg.Config,
 	sw.AddReactor("EVIDENCE", evidenceReactor)
 
 	// Optionally, start the pex reactor
-	var addrBook pex.AddrBook
-	var trustMetricStore *trust.TrustMetricStore
+	//
+	// TODO:
+	//
+	// We need to set Seeds and PersistentPeers on the switch,
+	// since it needs to be able to use these (and their DNS names)
+	// even if the PEX is off. We can include the DNS name in the NetAddress,
+	// but it would still be nice to have a clear list of the current "PersistentPeers"
+	// somewhere that we can return with net_info.
+	//
+	// If PEX is on, it should handle dialing the seeds. Otherwise the switch does it.
+	// Note we currently use the addrBook regardless at least for AddOurAddress
+	addrBook := pex.NewAddrBook(config.P2P.AddrBookFile(), config.P2P.AddrBookStrict)
+	addrBook.SetLogger(p2pLogger.With("book", config.P2P.AddrBookFile()))
 	if config.P2P.PexReactor {
-		addrBook = pex.NewAddrBook(config.P2P.AddrBookFile(), config.P2P.AddrBookStrict)
-		addrBook.SetLogger(p2pLogger.With("book", config.P2P.AddrBookFile()))
-
-		// Get the trust metric history data
-		trustHistoryDB, err := dbProvider(&DBContext{"trusthistory", config})
-		if err != nil {
-			return nil, err
-		}
-		trustMetricStore = trust.NewTrustMetricStore(trustHistoryDB, trust.DefaultConfig())
-		trustMetricStore.SetLogger(p2pLogger)
-
+		// TODO persistent peers ? so we can have their DNS addrs saved
 		pexReactor := pex.NewPEXReactor(addrBook,
 			&pex.PEXReactorConfig{
 				Seeds:          cmn.SplitAndTrim(config.P2P.Seeds, ",", " "),
@@ -341,6 +340,7 @@ func NewNode(config *cfg.Config,
 	}
 
 	indexerService := txindex.NewIndexerService(txIndexer, eventBus)
+	indexerService.SetLogger(logger.With("module", "txindex"))
 
 	// run the profile server
 	profileHost := config.ProfListenAddress
@@ -355,9 +355,8 @@ func NewNode(config *cfg.Config,
 		genesisDoc:    genDoc,
 		privValidator: privValidator,
 
-		sw:               sw,
-		addrBook:         addrBook,
-		trustMetricStore: trustMetricStore,
+		sw:       sw,
+		addrBook: addrBook,
 
 		stateDB:          stateDB,
 		blockStore:       blockStore,
@@ -382,16 +381,6 @@ func (n *Node) OnStart() error {
 		return err
 	}
 
-	// Run the RPC server first
-	// so we can eg. receive txs for the first block
-	if n.config.RPC.ListenAddress != "" {
-		listeners, err := n.startRPC()
-		if err != nil {
-			return err
-		}
-		n.rpcListeners = listeners
-	}
-
 	// Create & add listener
 	protocol, address := cmn.ProtocolAndAddress(n.config.P2P.ListenAddress)
 	l := p2p.NewDefaultListener(protocol, address, n.config.P2P.SkipUPNP, n.Logger.With("module", "p2p"))
@@ -405,14 +394,24 @@ func (n *Node) OnStart() error {
 	}
 	n.Logger.Info("P2P Node ID", "ID", nodeKey.ID(), "file", n.config.NodeKeyFile())
 
-	nodeInfo := n.makeNodeInfo(nodeKey.PubKey())
+	nodeInfo := n.makeNodeInfo(nodeKey.ID())
 	n.sw.SetNodeInfo(nodeInfo)
 	n.sw.SetNodeKey(nodeKey)
 
 	// Add ourselves to addrbook to prevent dialing ourselves
 	n.addrBook.AddOurAddress(nodeInfo.NetAddress())
 
-	// Start the switch
+	// Start the RPC server before the P2P server
+	// so we can eg. receive txs for the first block
+	if n.config.RPC.ListenAddress != "" {
+		listeners, err := n.startRPC()
+		if err != nil {
+			return err
+		}
+		n.rpcListeners = listeners
+	}
+
+	// Start the switch (the P2P server).
 	err = n.sw.Start()
 	if err != nil {
 		return err
@@ -448,7 +447,7 @@ func (n *Node) OnStop() {
 	n.eventBus.Stop()
 	n.indexerService.Stop()
 
-	if pvsc, ok := n.privValidator.(*priv_val.SocketClient); ok {
+	if pvsc, ok := n.privValidator.(*pvm.SocketPV); ok {
 		if err := pvsc.Stop(); err != nil {
 			n.Logger.Error("Error stopping priv validator socket client", "err", err)
 		}
@@ -492,6 +491,8 @@ func (n *Node) ConfigureRPC() {
 func (n *Node) startRPC() ([]net.Listener, error) {
 	n.ConfigureRPC()
 	listenAddrs := cmn.SplitAndTrim(n.config.RPC.ListenAddress, ",", " ")
+	coreCodec := amino.NewCodec()
+	ctypes.RegisterAmino(coreCodec)
 
 	if n.config.RPC.Unsafe {
 		rpccore.AddUnsafeRoutes()
@@ -502,10 +503,10 @@ func (n *Node) startRPC() ([]net.Listener, error) {
 	for i, listenAddr := range listenAddrs {
 		mux := http.NewServeMux()
 		rpcLogger := n.Logger.With("module", "rpc-server")
-		wm := rpcserver.NewWebsocketManager(rpccore.Routes, rpcserver.EventSubscriber(n.eventBus))
+		wm := rpcserver.NewWebsocketManager(rpccore.Routes, coreCodec, rpcserver.EventSubscriber(n.eventBus))
 		wm.SetLogger(rpcLogger.With("protocol", "websocket"))
 		mux.HandleFunc("/websocket", wm.WebsocketHandler)
-		rpcserver.RegisterRPCFuncs(mux, rpccore.Routes, rpcLogger)
+		rpcserver.RegisterRPCFuncs(mux, rpccore.Routes, coreCodec, rpcLogger)
 		listener, err := rpcserver.StartHTTPServer(listenAddr, mux, rpcLogger)
 		if err != nil {
 			return nil, err
@@ -577,13 +578,13 @@ func (n *Node) ProxyApp() proxy.AppConns {
 	return n.proxyApp
 }
 
-func (n *Node) makeNodeInfo(pubKey crypto.PubKey) p2p.NodeInfo {
+func (n *Node) makeNodeInfo(nodeID p2p.ID) p2p.NodeInfo {
 	txIndexerStatus := "on"
 	if _, ok := n.txIndexer.(*null.TxIndex); ok {
 		txIndexerStatus = "off"
 	}
 	nodeInfo := p2p.NodeInfo{
-		PubKey:  pubKey,
+		ID:      nodeID,
 		Network: n.genesisDoc.ChainID,
 		Version: version.Version,
 		Channels: []byte{
@@ -594,7 +595,7 @@ func (n *Node) makeNodeInfo(pubKey crypto.PubKey) p2p.NodeInfo {
 		},
 		Moniker: n.config.Moniker,
 		Other: []string{
-			cmn.Fmt("wire_version=%v", wire.Version),
+			cmn.Fmt("amino_version=%v", amino.Version),
 			cmn.Fmt("p2p_version=%v", p2p.Version),
 			cmn.Fmt("consensus_version=%v", cs.Version),
 			cmn.Fmt("rpc_version=%v/%v", rpc.Version, rpccore.Version),
@@ -641,7 +642,7 @@ func loadGenesisDoc(db dbm.DB) (*types.GenesisDoc, error) {
 		return nil, errors.New("Genesis doc not found")
 	}
 	var genDoc *types.GenesisDoc
-	err := json.Unmarshal(bytes, &genDoc)
+	err := cdc.UnmarshalJSON(bytes, &genDoc)
 	if err != nil {
 		cmn.PanicCrisis(fmt.Sprintf("Failed to load genesis doc due to unmarshaling error: %v (bytes: %X)", err, bytes))
 	}
@@ -650,7 +651,7 @@ func loadGenesisDoc(db dbm.DB) (*types.GenesisDoc, error) {
 
 // panics if failed to marshal the given genesis document
 func saveGenesisDoc(db dbm.DB, genDoc *types.GenesisDoc) {
-	bytes, err := json.Marshal(genDoc)
+	bytes, err := cdc.MarshalJSON(genDoc)
 	if err != nil {
 		cmn.PanicCrisis(fmt.Sprintf("Failed to save genesis doc due to marshaling error: %v", err))
 	}
diff --git a/vendor/github.com/tendermint/tendermint/node/wire.go b/vendor/github.com/tendermint/tendermint/node/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..a0d7677df3d1b184f5e3e29b46e3c65e7e945365
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/node/wire.go
@@ -0,0 +1,12 @@
+package node
+
+import (
+	amino "github.com/tendermint/go-amino"
+	crypto "github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/conn/connection.go b/vendor/github.com/tendermint/tendermint/p2p/conn/connection.go
index 9a3360f2db4c5eb7d49ff2b2984d08f4bedcf75f..6e08c67f98cdac840bc3b9cd149f67b37ff1c903 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/conn/connection.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/conn/connection.go
@@ -7,17 +7,21 @@ import (
 	"io"
 	"math"
 	"net"
+	"reflect"
 	"sync/atomic"
 	"time"
 
-	wire "github.com/tendermint/go-wire"
+	amino "github.com/tendermint/go-amino"
 	cmn "github.com/tendermint/tmlibs/common"
 	flow "github.com/tendermint/tmlibs/flowrate"
 	"github.com/tendermint/tmlibs/log"
 )
 
 const (
-	numBatchMsgPackets = 10
+	maxPacketMsgPayloadSizeDefault = 1024 // NOTE: Must be below 16,384 bytes for 14 below.
+	maxPacketMsgOverheadSize       = 14   // NOTE: See connection_test for derivation.
+
+	numBatchPacketMsgs = 10
 	minReadBufferSize  = 1024
 	minWriteBufferSize = 65536
 	updateStats        = 2 * time.Second
@@ -52,35 +56,34 @@ The byte id and the relative priorities of each `Channel` are configured upon
 initialization of the connection.
 
 There are two methods for sending messages:
-	func (m MConnection) Send(chID byte, msg interface{}) bool {}
-	func (m MConnection) TrySend(chID byte, msg interface{}) bool {}
+	func (m MConnection) Send(chID byte, msgBytes []byte) bool {}
+	func (m MConnection) TrySend(chID byte, msgBytes []byte}) bool {}
 
-`Send(chID, msg)` is a blocking call that waits until `msg` is successfully queued
-for the channel with the given id byte `chID`, or until the request times out.
-The message `msg` is serialized using the `tendermint/wire` submodule's
-`WriteBinary()` reflection routine.
+`Send(chID, msgBytes)` is a blocking call that waits until `msg` is
+successfully queued for the channel with the given id byte `chID`, or until the
+request times out.  The message `msg` is serialized using Go-Amino.
 
-`TrySend(chID, msg)` is a nonblocking call that returns false if the channel's
-queue is full.
+`TrySend(chID, msgBytes)` is a nonblocking call that returns false if the
+channel's queue is full.
 
 Inbound message bytes are handled with an onReceive callback function.
 */
 type MConnection struct {
 	cmn.BaseService
 
-	conn        net.Conn
-	bufReader   *bufio.Reader
-	bufWriter   *bufio.Writer
-	sendMonitor *flow.Monitor
-	recvMonitor *flow.Monitor
-	send        chan struct{}
-	pong        chan struct{}
-	channels    []*Channel
-	channelsIdx map[byte]*Channel
-	onReceive   receiveCbFunc
-	onError     errorCbFunc
-	errored     uint32
-	config      *MConnConfig
+	conn          net.Conn
+	bufConnReader *bufio.Reader
+	bufConnWriter *bufio.Writer
+	sendMonitor   *flow.Monitor
+	recvMonitor   *flow.Monitor
+	send          chan struct{}
+	pong          chan struct{}
+	channels      []*Channel
+	channelsIdx   map[byte]*Channel
+	onReceive     receiveCbFunc
+	onError       errorCbFunc
+	errored       uint32
+	config        *MConnConfig
 
 	quit       chan struct{}
 	flushTimer *cmn.ThrottleTimer // flush writes as necessary but throttled.
@@ -101,7 +104,7 @@ type MConnConfig struct {
 	RecvRate int64 `mapstructure:"recv_rate"`
 
 	// Maximum payload size
-	MaxMsgPacketPayloadSize int `mapstructure:"max_msg_packet_payload_size"`
+	MaxPacketMsgPayloadSize int `mapstructure:"max_packet_msg_payload_size"`
 
 	// Interval to flush writes (throttled)
 	FlushThrottle time.Duration `mapstructure:"flush_throttle"`
@@ -113,8 +116,8 @@ type MConnConfig struct {
 	PongTimeout time.Duration `mapstructure:"pong_timeout"`
 }
 
-func (cfg *MConnConfig) maxMsgPacketTotalSize() int {
-	return cfg.MaxMsgPacketPayloadSize + maxMsgPacketOverheadSize
+func (cfg *MConnConfig) maxPacketMsgTotalSize() int {
+	return cfg.MaxPacketMsgPayloadSize + maxPacketMsgOverheadSize
 }
 
 // DefaultMConnConfig returns the default config.
@@ -122,7 +125,7 @@ func DefaultMConnConfig() *MConnConfig {
 	return &MConnConfig{
 		SendRate:                defaultSendRate,
 		RecvRate:                defaultRecvRate,
-		MaxMsgPacketPayloadSize: defaultMaxMsgPacketPayloadSize,
+		MaxPacketMsgPayloadSize: maxPacketMsgPayloadSizeDefault,
 		FlushThrottle:           defaultFlushThrottle,
 		PingInterval:            defaultPingInterval,
 		PongTimeout:             defaultPongTimeout,
@@ -146,16 +149,16 @@ func NewMConnectionWithConfig(conn net.Conn, chDescs []*ChannelDescriptor, onRec
 	}
 
 	mconn := &MConnection{
-		conn:        conn,
-		bufReader:   bufio.NewReaderSize(conn, minReadBufferSize),
-		bufWriter:   bufio.NewWriterSize(conn, minWriteBufferSize),
-		sendMonitor: flow.New(0, 0),
-		recvMonitor: flow.New(0, 0),
-		send:        make(chan struct{}, 1),
-		pong:        make(chan struct{}, 1),
-		onReceive:   onReceive,
-		onError:     onError,
-		config:      config,
+		conn:          conn,
+		bufConnReader: bufio.NewReaderSize(conn, minReadBufferSize),
+		bufConnWriter: bufio.NewWriterSize(conn, minWriteBufferSize),
+		sendMonitor:   flow.New(0, 0),
+		recvMonitor:   flow.New(0, 0),
+		send:          make(chan struct{}, 1),
+		pong:          make(chan struct{}, 1),
+		onReceive:     onReceive,
+		onError:       onError,
+		config:        config,
 	}
 
 	// Create channels
@@ -220,7 +223,7 @@ func (c *MConnection) String() string {
 
 func (c *MConnection) flush() {
 	c.Logger.Debug("Flush", "conn", c)
-	err := c.bufWriter.Flush()
+	err := c.bufConnWriter.Flush()
 	if err != nil {
 		c.Logger.Error("MConnection flush failed", "err", err)
 	}
@@ -229,7 +232,7 @@ func (c *MConnection) flush() {
 // Catch panics, usually caused by remote disconnects.
 func (c *MConnection) _recover() {
 	if r := recover(); r != nil {
-		err := cmn.ErrorWrap(r, "recovered from panic")
+		err := cmn.ErrorWrap(r, "recovered panic in MConnection")
 		c.stopForError(err)
 	}
 }
@@ -244,12 +247,12 @@ func (c *MConnection) stopForError(r interface{}) {
 }
 
 // Queues a message to be sent to channel.
-func (c *MConnection) Send(chID byte, msg interface{}) bool {
+func (c *MConnection) Send(chID byte, msgBytes []byte) bool {
 	if !c.IsRunning() {
 		return false
 	}
 
-	c.Logger.Debug("Send", "channel", chID, "conn", c, "msg", msg) //, "bytes", wire.BinaryBytes(msg))
+	c.Logger.Debug("Send", "channel", chID, "conn", c, "msgBytes", fmt.Sprintf("%X", msgBytes))
 
 	// Send message to channel.
 	channel, ok := c.channelsIdx[chID]
@@ -258,7 +261,7 @@ func (c *MConnection) Send(chID byte, msg interface{}) bool {
 		return false
 	}
 
-	success := channel.sendBytes(wire.BinaryBytes(msg))
+	success := channel.sendBytes(msgBytes)
 	if success {
 		// Wake up sendRoutine if necessary
 		select {
@@ -266,19 +269,19 @@ func (c *MConnection) Send(chID byte, msg interface{}) bool {
 		default:
 		}
 	} else {
-		c.Logger.Error("Send failed", "channel", chID, "conn", c, "msg", msg)
+		c.Logger.Error("Send failed", "channel", chID, "conn", c, "msgBytes", fmt.Sprintf("%X", msgBytes))
 	}
 	return success
 }
 
 // Queues a message to be sent to channel.
 // Nonblocking, returns true if successful.
-func (c *MConnection) TrySend(chID byte, msg interface{}) bool {
+func (c *MConnection) TrySend(chID byte, msgBytes []byte) bool {
 	if !c.IsRunning() {
 		return false
 	}
 
-	c.Logger.Debug("TrySend", "channel", chID, "conn", c, "msg", msg)
+	c.Logger.Debug("TrySend", "channel", chID, "conn", c, "msgBytes", fmt.Sprintf("%X", msgBytes))
 
 	// Send message to channel.
 	channel, ok := c.channelsIdx[chID]
@@ -287,7 +290,7 @@ func (c *MConnection) TrySend(chID byte, msg interface{}) bool {
 		return false
 	}
 
-	ok = channel.trySendBytes(wire.BinaryBytes(msg))
+	ok = channel.trySendBytes(msgBytes)
 	if ok {
 		// Wake up sendRoutine if necessary
 		select {
@@ -320,12 +323,13 @@ func (c *MConnection) sendRoutine() {
 
 FOR_LOOP:
 	for {
-		var n int
+		var _n int64
 		var err error
+	SELECTION:
 		select {
 		case <-c.flushTimer.Ch:
 			// NOTE: flushTimer.Set() must be called every time
-			// something is written to .bufWriter.
+			// something is written to .bufConnWriter.
 			c.flush()
 		case <-c.chStatsTimer.Chan():
 			for _, channel := range c.channels {
@@ -333,8 +337,11 @@ FOR_LOOP:
 			}
 		case <-c.pingTimer.Chan():
 			c.Logger.Debug("Send Ping")
-			wire.WriteByte(packetTypePing, c.bufWriter, &n, &err)
-			c.sendMonitor.Update(int(n))
+			_n, err = cdc.MarshalBinaryWriter(c.bufConnWriter, PacketPing{})
+			if err != nil {
+				break SELECTION
+			}
+			c.sendMonitor.Update(int(_n))
 			c.Logger.Debug("Starting pong timer", "dur", c.config.PongTimeout)
 			c.pongTimer = time.AfterFunc(c.config.PongTimeout, func() {
 				select {
@@ -352,14 +359,17 @@ FOR_LOOP:
 			}
 		case <-c.pong:
 			c.Logger.Debug("Send Pong")
-			wire.WriteByte(packetTypePong, c.bufWriter, &n, &err)
-			c.sendMonitor.Update(int(n))
+			_n, err = cdc.MarshalBinaryWriter(c.bufConnWriter, PacketPong{})
+			if err != nil {
+				break SELECTION
+			}
+			c.sendMonitor.Update(int(_n))
 			c.flush()
 		case <-c.quit:
 			break FOR_LOOP
 		case <-c.send:
-			// Send some msgPackets
-			eof := c.sendSomeMsgPackets()
+			// Send some PacketMsgs
+			eof := c.sendSomePacketMsgs()
 			if !eof {
 				// Keep sendRoutine awake.
 				select {
@@ -385,15 +395,15 @@ FOR_LOOP:
 
 // Returns true if messages from channels were exhausted.
 // Blocks in accordance to .sendMonitor throttling.
-func (c *MConnection) sendSomeMsgPackets() bool {
+func (c *MConnection) sendSomePacketMsgs() bool {
 	// Block until .sendMonitor says we can write.
 	// Once we're ready we send more than we asked for,
 	// but amortized it should even out.
-	c.sendMonitor.Limit(c.config.maxMsgPacketTotalSize(), atomic.LoadInt64(&c.config.SendRate), true)
+	c.sendMonitor.Limit(c.config.maxPacketMsgTotalSize(), atomic.LoadInt64(&c.config.SendRate), true)
 
-	// Now send some msgPackets.
-	for i := 0; i < numBatchMsgPackets; i++ {
-		if c.sendMsgPacket() {
+	// Now send some PacketMsgs.
+	for i := 0; i < numBatchPacketMsgs; i++ {
+		if c.sendPacketMsg() {
 			return true
 		}
 	}
@@ -401,8 +411,8 @@ func (c *MConnection) sendSomeMsgPackets() bool {
 }
 
 // Returns true if messages from channels were exhausted.
-func (c *MConnection) sendMsgPacket() bool {
-	// Choose a channel to create a msgPacket from.
+func (c *MConnection) sendPacketMsg() bool {
+	// Choose a channel to create a PacketMsg from.
 	// The chosen channel will be the one whose recentlySent/priority is the least.
 	var leastRatio float32 = math.MaxFloat32
 	var leastChannel *Channel
@@ -425,19 +435,19 @@ func (c *MConnection) sendMsgPacket() bool {
 	}
 	// c.Logger.Info("Found a msgPacket to send")
 
-	// Make & send a msgPacket from this channel
-	n, err := leastChannel.writeMsgPacketTo(c.bufWriter)
+	// Make & send a PacketMsg from this channel
+	_n, err := leastChannel.writePacketMsgTo(c.bufConnWriter)
 	if err != nil {
-		c.Logger.Error("Failed to write msgPacket", "err", err)
+		c.Logger.Error("Failed to write PacketMsg", "err", err)
 		c.stopForError(err)
 		return true
 	}
-	c.sendMonitor.Update(int(n))
+	c.sendMonitor.Update(int(_n))
 	c.flushTimer.Set()
 	return false
 }
 
-// recvRoutine reads msgPackets and reconstructs the message using the channels' "recving" buffer.
+// recvRoutine reads PacketMsgs and reconstructs the message using the channels' "recving" buffer.
 // After a whole message has been assembled, it's pushed to onReceive().
 // Blocks depending on how the connection is throttled.
 // Otherwise, it never blocks.
@@ -447,28 +457,28 @@ func (c *MConnection) recvRoutine() {
 FOR_LOOP:
 	for {
 		// Block until .recvMonitor says we can read.
-		c.recvMonitor.Limit(c.config.maxMsgPacketTotalSize(), atomic.LoadInt64(&c.config.RecvRate), true)
+		c.recvMonitor.Limit(c.config.maxPacketMsgTotalSize(), atomic.LoadInt64(&c.config.RecvRate), true)
 
+		// Peek into bufConnReader for debugging
 		/*
-			// Peek into bufReader for debugging
-			if numBytes := c.bufReader.Buffered(); numBytes > 0 {
-				log.Info("Peek connection buffer", "numBytes", numBytes, "bytes", log15.Lazy{func() []byte {
-					bytes, err := c.bufReader.Peek(cmn.MinInt(numBytes, 100))
-					if err == nil {
-						return bytes
-					} else {
-						log.Warn("Error peeking connection buffer", "err", err)
-						return nil
-					}
-				}})
+			if numBytes := c.bufConnReader.Buffered(); numBytes > 0 {
+				bz, err := c.bufConnReader.Peek(cmn.MinInt(numBytes, 100))
+				if err == nil {
+					// return
+				} else {
+					c.Logger.Debug("Error peeking connection buffer", "err", err)
+					// return nil
+				}
+				c.Logger.Info("Peek connection buffer", "numBytes", numBytes, "bz", bz)
 			}
 		*/
 
 		// Read packet type
-		var n int
+		var packet Packet
+		var _n int64
 		var err error
-		pktType := wire.ReadByte(c.bufReader, &n, &err)
-		c.recvMonitor.Update(int(n))
+		_n, err = cdc.UnmarshalBinaryReader(c.bufConnReader, &packet, int64(c.config.maxPacketMsgTotalSize()))
+		c.recvMonitor.Update(int(_n))
 		if err != nil {
 			if c.IsRunning() {
 				c.Logger.Error("Connection failed @ recvRoutine (reading byte)", "conn", c, "err", err)
@@ -478,8 +488,8 @@ FOR_LOOP:
 		}
 
 		// Read more depending on packet type.
-		switch pktType {
-		case packetTypePing:
+		switch pkt := packet.(type) {
+		case PacketPing:
 			// TODO: prevent abuse, as they cause flush()'s.
 			// https://github.com/tendermint/tendermint/issues/1190
 			c.Logger.Debug("Receive Ping")
@@ -488,24 +498,14 @@ FOR_LOOP:
 			default:
 				// never block
 			}
-		case packetTypePong:
+		case PacketPong:
 			c.Logger.Debug("Receive Pong")
 			select {
 			case c.pongTimeoutCh <- false:
 			default:
 				// never block
 			}
-		case packetTypeMsg:
-			pkt, n, err := msgPacket{}, int(0), error(nil)
-			wire.ReadBinaryPtr(&pkt, c.bufReader, c.config.maxMsgPacketTotalSize(), &n, &err)
-			c.recvMonitor.Update(int(n))
-			if err != nil {
-				if c.IsRunning() {
-					c.Logger.Error("Connection failed @ recvRoutine", "conn", c, "err", err)
-					c.stopForError(err)
-				}
-				break FOR_LOOP
-			}
+		case PacketMsg:
 			channel, ok := c.channelsIdx[pkt.ChannelID]
 			if !ok || channel == nil {
 				err := fmt.Errorf("Unknown channel %X", pkt.ChannelID)
@@ -514,7 +514,7 @@ FOR_LOOP:
 				break FOR_LOOP
 			}
 
-			msgBytes, err := channel.recvMsgPacket(pkt)
+			msgBytes, err := channel.recvPacketMsg(pkt)
 			if err != nil {
 				if c.IsRunning() {
 					c.Logger.Error("Connection failed @ recvRoutine", "conn", c, "err", err)
@@ -523,12 +523,12 @@ FOR_LOOP:
 				break FOR_LOOP
 			}
 			if msgBytes != nil {
-				c.Logger.Debug("Received bytes", "chID", pkt.ChannelID, "msgBytes", msgBytes)
+				c.Logger.Debug("Received bytes", "chID", pkt.ChannelID, "msgBytes", fmt.Sprintf("%X", msgBytes))
 				// NOTE: This means the reactor.Receive runs in the same thread as the p2p recv routine
 				c.onReceive(pkt.ChannelID, msgBytes)
 			}
 		default:
-			err := fmt.Errorf("Unknown message type %X", pktType)
+			err := fmt.Errorf("Unknown message type %v", reflect.TypeOf(packet))
 			c.Logger.Error("Connection failed @ recvRoutine", "conn", c, "err", err)
 			c.stopForError(err)
 			break FOR_LOOP
@@ -620,7 +620,7 @@ type Channel struct {
 	sending       []byte
 	recentlySent  int64 // exponential moving average
 
-	maxMsgPacketPayloadSize int
+	maxPacketMsgPayloadSize int
 
 	Logger log.Logger
 }
@@ -635,7 +635,7 @@ func newChannel(conn *MConnection, desc ChannelDescriptor) *Channel {
 		desc:                    desc,
 		sendQueue:               make(chan []byte, desc.SendQueueCapacity),
 		recving:                 make([]byte, 0, desc.RecvBufferCapacity),
-		maxMsgPacketPayloadSize: conn.config.MaxMsgPacketPayloadSize,
+		maxPacketMsgPayloadSize: conn.config.MaxPacketMsgPayloadSize,
 	}
 }
 
@@ -680,8 +680,8 @@ func (ch *Channel) canSend() bool {
 	return ch.loadSendQueueSize() < defaultSendQueueCapacity
 }
 
-// Returns true if any msgPackets are pending to be sent.
-// Call before calling nextMsgPacket()
+// Returns true if any PacketMsgs are pending to be sent.
+// Call before calling nextPacketMsg()
 // Goroutine-safe
 func (ch *Channel) isSendPending() bool {
 	if len(ch.sending) == 0 {
@@ -693,12 +693,12 @@ func (ch *Channel) isSendPending() bool {
 	return true
 }
 
-// Creates a new msgPacket to send.
+// Creates a new PacketMsg to send.
 // Not goroutine-safe
-func (ch *Channel) nextMsgPacket() msgPacket {
-	packet := msgPacket{}
+func (ch *Channel) nextPacketMsg() PacketMsg {
+	packet := PacketMsg{}
 	packet.ChannelID = byte(ch.desc.ID)
-	maxSize := ch.maxMsgPacketPayloadSize
+	maxSize := ch.maxPacketMsgPayloadSize
 	packet.Bytes = ch.sending[:cmn.MinInt(maxSize, len(ch.sending))]
 	if len(ch.sending) <= maxSize {
 		packet.EOF = byte(0x01)
@@ -711,30 +711,23 @@ func (ch *Channel) nextMsgPacket() msgPacket {
 	return packet
 }
 
-// Writes next msgPacket to w.
+// Writes next PacketMsg to w and updates c.recentlySent.
 // Not goroutine-safe
-func (ch *Channel) writeMsgPacketTo(w io.Writer) (n int, err error) {
-	packet := ch.nextMsgPacket()
-	ch.Logger.Debug("Write Msg Packet", "conn", ch.conn, "packet", packet)
-	writeMsgPacketTo(packet, w, &n, &err)
-	if err == nil {
-		ch.recentlySent += int64(n)
-	}
+func (ch *Channel) writePacketMsgTo(w io.Writer) (n int64, err error) {
+	var packet = ch.nextPacketMsg()
+	n, err = cdc.MarshalBinaryWriter(w, packet)
+	ch.recentlySent += n
 	return
 }
 
-func writeMsgPacketTo(packet msgPacket, w io.Writer, n *int, err *error) {
-	wire.WriteByte(packetTypeMsg, w, n, err)
-	wire.WriteBinary(packet, w, n, err)
-}
-
-// Handles incoming msgPackets. It returns a message bytes if message is
-// complete. NOTE message bytes may change on next call to recvMsgPacket.
+// Handles incoming PacketMsgs. It returns a message bytes if message is
+// complete. NOTE message bytes may change on next call to recvPacketMsg.
 // Not goroutine-safe
-func (ch *Channel) recvMsgPacket(packet msgPacket) ([]byte, error) {
-	ch.Logger.Debug("Read Msg Packet", "conn", ch.conn, "packet", packet)
-	if ch.desc.RecvMessageCapacity < len(ch.recving)+len(packet.Bytes) {
-		return nil, wire.ErrBinaryReadOverflow
+func (ch *Channel) recvPacketMsg(packet PacketMsg) ([]byte, error) {
+	ch.Logger.Debug("Read PacketMsg", "conn", ch.conn, "packet", packet)
+	var recvCap, recvReceived = ch.desc.RecvMessageCapacity, len(ch.recving) + len(packet.Bytes)
+	if recvCap < recvReceived {
+		return nil, fmt.Errorf("Received message exceeds available capacity: %v < %v", recvCap, recvReceived)
 	}
 	ch.recving = append(ch.recving, packet.Bytes...)
 	if packet.EOF == byte(0x01) {
@@ -758,24 +751,36 @@ func (ch *Channel) updateStats() {
 	ch.recentlySent = int64(float64(ch.recentlySent) * 0.8)
 }
 
-//-----------------------------------------------------------------------------
+//----------------------------------------
+// Packet
 
-const (
-	defaultMaxMsgPacketPayloadSize = 1024
+type Packet interface {
+	AssertIsPacket()
+}
 
-	maxMsgPacketOverheadSize = 10 // It's actually lower but good enough
-	packetTypePing           = byte(0x01)
-	packetTypePong           = byte(0x02)
-	packetTypeMsg            = byte(0x03)
-)
+func RegisterPacket(cdc *amino.Codec) {
+	cdc.RegisterInterface((*Packet)(nil), nil)
+	cdc.RegisterConcrete(PacketPing{}, "tendermint/p2p/PacketPing", nil)
+	cdc.RegisterConcrete(PacketPong{}, "tendermint/p2p/PacketPong", nil)
+	cdc.RegisterConcrete(PacketMsg{}, "tendermint/p2p/PacketMsg", nil)
+}
+
+func (_ PacketPing) AssertIsPacket() {}
+func (_ PacketPong) AssertIsPacket() {}
+func (_ PacketMsg) AssertIsPacket()  {}
+
+type PacketPing struct {
+}
+
+type PacketPong struct {
+}
 
-// Messages in channels are chopped into smaller msgPackets for multiplexing.
-type msgPacket struct {
+type PacketMsg struct {
 	ChannelID byte
 	EOF       byte // 1 means message ends here.
 	Bytes     []byte
 }
 
-func (p msgPacket) String() string {
-	return fmt.Sprintf("MsgPacket{%X:%X T:%X}", p.ChannelID, p.Bytes, p.EOF)
+func (mp PacketMsg) String() string {
+	return fmt.Sprintf("PacketMsg{%X:%X T:%X}", mp.ChannelID, mp.Bytes, mp.EOF)
 }
diff --git a/vendor/github.com/tendermint/tendermint/p2p/conn/secret_connection.go b/vendor/github.com/tendermint/tendermint/p2p/conn/secret_connection.go
index bc67abf3addd2ef6ef3bf34c1763dd5d77e82967..2a507f8821023c5d721bfc0de76dbc38a78bd174 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/conn/secret_connection.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/conn/secret_connection.go
@@ -20,17 +20,15 @@ import (
 	"golang.org/x/crypto/nacl/secretbox"
 	"golang.org/x/crypto/ripemd160"
 
-	crypto "github.com/tendermint/go-crypto"
-	wire "github.com/tendermint/go-wire"
+	"github.com/tendermint/go-crypto"
 	cmn "github.com/tendermint/tmlibs/common"
 )
 
-// 2 + 1024 == 1026 total frame size
-const dataLenSize = 2 // uint16 to describe the length, is <= dataMaxSize
+// 4 + 1024 == 1028 total frame size
+const dataLenSize = 4
 const dataMaxSize = 1024
 const totalFrameSize = dataMaxSize + dataLenSize
 const sealedFrameSize = totalFrameSize + secretbox.Overhead
-const authSigMsgSize = (32 + 1) + (64 + 1) // fixed size (length prefixed) byte arrays
 
 // Implements net.Conn
 type SecretConnection struct {
@@ -123,7 +121,7 @@ func (sc *SecretConnection) Write(data []byte) (n int, err error) {
 			data = nil
 		}
 		chunkLength := len(chunk)
-		binary.BigEndian.PutUint16(frame, uint16(chunkLength))
+		binary.BigEndian.PutUint32(frame, uint32(chunkLength))
 		copy(frame[dataLenSize:], chunk)
 
 		// encrypt the frame
@@ -145,8 +143,8 @@ func (sc *SecretConnection) Write(data []byte) (n int, err error) {
 // CONTRACT: data smaller than dataMaxSize is read atomically.
 func (sc *SecretConnection) Read(data []byte) (n int, err error) {
 	if 0 < len(sc.recvBuffer) {
-		n_ := copy(data, sc.recvBuffer)
-		sc.recvBuffer = sc.recvBuffer[n_:]
+		n = copy(data, sc.recvBuffer)
+		sc.recvBuffer = sc.recvBuffer[n:]
 		return
 	}
 
@@ -166,7 +164,7 @@ func (sc *SecretConnection) Read(data []byte) (n int, err error) {
 	incr2Nonce(sc.recvNonce)
 	// end decryption
 
-	var chunkLength = binary.BigEndian.Uint16(frame) // read the first two bytes
+	var chunkLength = binary.BigEndian.Uint32(frame) // read the first two bytes
 	if chunkLength > dataMaxSize {
 		return 0, errors.New("chunkLength is greater than dataMaxSize")
 	}
@@ -193,16 +191,17 @@ func genEphKeys() (ephPub, ephPriv *[32]byte) {
 	var err error
 	ephPub, ephPriv, err = box.GenerateKey(crand.Reader)
 	if err != nil {
-		cmn.PanicCrisis("Could not generate ephemeral keypairs")
+		panic("Could not generate ephemeral keypairs")
 	}
 	return
 }
 
 func shareEphPubKey(conn io.ReadWriteCloser, locEphPub *[32]byte) (remEphPub *[32]byte, err error) {
+
 	// Send our pubkey and receive theirs in tandem.
 	var trs, _ = cmn.Parallel(
 		func(_ int) (val interface{}, err error, abort bool) {
-			var _, err1 = conn.Write(locEphPub[:])
+			var _, err1 = cdc.MarshalBinaryWriter(conn, locEphPub)
 			if err1 != nil {
 				return nil, err1, true // abort
 			} else {
@@ -211,7 +210,7 @@ func shareEphPubKey(conn io.ReadWriteCloser, locEphPub *[32]byte) (remEphPub *[3
 		},
 		func(_ int) (val interface{}, err error, abort bool) {
 			var _remEphPub [32]byte
-			var _, err2 = io.ReadFull(conn, _remEphPub[:])
+			var _, err2 = cdc.UnmarshalBinaryReader(conn, &_remEphPub, 1024*1024) // TODO
 			if err2 != nil {
 				return nil, err2, true // abort
 			} else {
@@ -277,12 +276,12 @@ type authSigMessage struct {
 	Sig crypto.Signature
 }
 
-func shareAuthSignature(sc *SecretConnection, pubKey crypto.PubKey, signature crypto.Signature) (recvMsg *authSigMessage, err error) {
+func shareAuthSignature(sc *SecretConnection, pubKey crypto.PubKey, signature crypto.Signature) (recvMsg authSigMessage, err error) {
+
 	// Send our info and receive theirs in tandem.
 	var trs, _ = cmn.Parallel(
 		func(_ int) (val interface{}, err error, abort bool) {
-			msgBytes := wire.BinaryBytes(authSigMessage{pubKey.Wrap(), signature.Wrap()})
-			var _, err1 = sc.Write(msgBytes)
+			var _, err1 = cdc.MarshalBinaryWriter(sc, authSigMessage{pubKey, signature})
 			if err1 != nil {
 				return nil, err1, true // abort
 			} else {
@@ -290,13 +289,8 @@ func shareAuthSignature(sc *SecretConnection, pubKey crypto.PubKey, signature cr
 			}
 		},
 		func(_ int) (val interface{}, err error, abort bool) {
-			readBuffer := make([]byte, authSigMsgSize)
-			var _, err2 = io.ReadFull(sc, readBuffer)
-			if err2 != nil {
-				return nil, err2, true // abort
-			}
-			n := int(0) // not used.
-			var _recvMsg = wire.ReadBinary(authSigMessage{}, bytes.NewBuffer(readBuffer), authSigMsgSize, &n, &err2).(authSigMessage)
+			var _recvMsg authSigMessage
+			var _, err2 = cdc.UnmarshalBinaryReader(sc, &_recvMsg, 1024*1024) // TODO
 			if err2 != nil {
 				return nil, err2, true // abort
 			} else {
@@ -312,7 +306,7 @@ func shareAuthSignature(sc *SecretConnection, pubKey crypto.PubKey, signature cr
 	}
 
 	var _recvMsg = trs.FirstValue().(authSigMessage)
-	return &_recvMsg, nil
+	return _recvMsg, nil
 }
 
 //--------------------------------------------------------------------------------
diff --git a/vendor/github.com/tendermint/tendermint/p2p/conn/wire.go b/vendor/github.com/tendermint/tendermint/p2p/conn/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..02d67f6fb6b4ba461b251ef01293ec60b1c5087e
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/p2p/conn/wire.go
@@ -0,0 +1,13 @@
+package conn
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc *amino.Codec = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+	RegisterPacket(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/errors.go b/vendor/github.com/tendermint/tendermint/p2p/errors.go
index cb6a7051a823ac76a40601e2d19c7078fabdbf71..fc477d1c2f02986652bcf6f43cda420f3a18d5ba 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/errors.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/errors.go
@@ -1,14 +1,38 @@
 package p2p
 
 import (
-	"errors"
 	"fmt"
+	"net"
 )
 
-var (
-	ErrSwitchDuplicatePeer = errors.New("Duplicate peer")
-	ErrSwitchConnectToSelf = errors.New("Connect to self")
-)
+// ErrSwitchDuplicatePeerID to be raised when a peer is connecting with a known
+// ID.
+type ErrSwitchDuplicatePeerID struct {
+	ID ID
+}
+
+func (e ErrSwitchDuplicatePeerID) Error() string {
+	return fmt.Sprintf("Duplicate peer ID %v", e.ID)
+}
+
+// ErrSwitchDuplicatePeerIP to be raised whena a peer is connecting with a known
+// IP.
+type ErrSwitchDuplicatePeerIP struct {
+	IP net.IP
+}
+
+func (e ErrSwitchDuplicatePeerIP) Error() string {
+	return fmt.Sprintf("Duplicate peer IP %v", e.IP.String())
+}
+
+// ErrSwitchConnectToSelf to be raised when trying to connect to itself.
+type ErrSwitchConnectToSelf struct {
+	Addr *NetAddress
+}
+
+func (e ErrSwitchConnectToSelf) Error() string {
+	return fmt.Sprintf("Connect to self: %v", e.Addr)
+}
 
 type ErrSwitchAuthenticationFailure struct {
 	Dialed *NetAddress
@@ -16,5 +40,37 @@ type ErrSwitchAuthenticationFailure struct {
 }
 
 func (e ErrSwitchAuthenticationFailure) Error() string {
-	return fmt.Sprintf("Failed to authenticate peer. Dialed %v, but got peer with ID %s", e.Dialed, e.Got)
+	return fmt.Sprintf(
+		"Failed to authenticate peer. Dialed %v, but got peer with ID %s",
+		e.Dialed,
+		e.Got,
+	)
+}
+
+//-------------------------------------------------------------------
+
+type ErrNetAddressNoID struct {
+	Addr string
+}
+
+func (e ErrNetAddressNoID) Error() string {
+	return fmt.Sprintf("Address (%s) does not contain ID", e.Addr)
+}
+
+type ErrNetAddressInvalid struct {
+	Addr string
+	Err  error
+}
+
+func (e ErrNetAddressInvalid) Error() string {
+	return fmt.Sprintf("Invalid address (%s): %v", e.Addr, e.Err)
+}
+
+type ErrNetAddressLookup struct {
+	Addr string
+	Err  error
+}
+
+func (e ErrNetAddressLookup) Error() string {
+	return fmt.Sprintf("Error looking up host (%s): %v", e.Addr, e.Err)
 }
diff --git a/vendor/github.com/tendermint/tendermint/p2p/fuzz.go b/vendor/github.com/tendermint/tendermint/p2p/fuzz.go
index fa16e4a2684c825a6d73fe463866158c65b5f655..6bfadc29d8e3bcb92f2b25e3f17b60a557645b57 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/fuzz.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/fuzz.go
@@ -1,10 +1,11 @@
 package p2p
 
 import (
-	"math/rand"
 	"net"
 	"sync"
 	"time"
+
+	cmn "github.com/tendermint/tmlibs/common"
 )
 
 const (
@@ -124,7 +125,7 @@ func (fc *FuzzedConnection) SetWriteDeadline(t time.Time) error {
 
 func (fc *FuzzedConnection) randomDuration() time.Duration {
 	maxDelayMillis := int(fc.config.MaxDelay.Nanoseconds() / 1000)
-	return time.Millisecond * time.Duration(rand.Int()%maxDelayMillis) // nolint: gas
+	return time.Millisecond * time.Duration(cmn.RandInt()%maxDelayMillis) // nolint: gas
 }
 
 // implements the fuzz (delay, kill conn)
@@ -137,7 +138,7 @@ func (fc *FuzzedConnection) fuzz() bool {
 	switch fc.config.Mode {
 	case FuzzModeDrop:
 		// randomly drop the r/w, drop the conn, or sleep
-		r := rand.Float64()
+		r := cmn.RandFloat64()
 		if r <= fc.config.ProbDropRW {
 			return true
 		} else if r < fc.config.ProbDropRW+fc.config.ProbDropConn {
diff --git a/vendor/github.com/tendermint/tendermint/p2p/key.go b/vendor/github.com/tendermint/tendermint/p2p/key.go
index 6d0f285861c421e5e2d2fa71047d57662dc6087d..73103ebd42242113062bc3cc216e7cc0b175043e 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/key.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/key.go
@@ -3,7 +3,6 @@ package p2p
 import (
 	"bytes"
 	"encoding/hex"
-	"encoding/json"
 	"fmt"
 	"io/ioutil"
 
@@ -48,7 +47,7 @@ func PubKeyToID(pubKey crypto.PubKey) ID {
 // If the file does not exist, it generates and saves a new NodeKey.
 func LoadOrGenNodeKey(filePath string) (*NodeKey, error) {
 	if cmn.FileExists(filePath) {
-		nodeKey, err := loadNodeKey(filePath)
+		nodeKey, err := LoadNodeKey(filePath)
 		if err != nil {
 			return nil, err
 		}
@@ -57,13 +56,13 @@ func LoadOrGenNodeKey(filePath string) (*NodeKey, error) {
 	return genNodeKey(filePath)
 }
 
-func loadNodeKey(filePath string) (*NodeKey, error) {
+func LoadNodeKey(filePath string) (*NodeKey, error) {
 	jsonBytes, err := ioutil.ReadFile(filePath)
 	if err != nil {
 		return nil, err
 	}
 	nodeKey := new(NodeKey)
-	err = json.Unmarshal(jsonBytes, nodeKey)
+	err = cdc.UnmarshalJSON(jsonBytes, nodeKey)
 	if err != nil {
 		return nil, fmt.Errorf("Error reading NodeKey from %v: %v", filePath, err)
 	}
@@ -71,12 +70,12 @@ func loadNodeKey(filePath string) (*NodeKey, error) {
 }
 
 func genNodeKey(filePath string) (*NodeKey, error) {
-	privKey := crypto.GenPrivKeyEd25519().Wrap()
+	privKey := crypto.GenPrivKeyEd25519()
 	nodeKey := &NodeKey{
 		PrivKey: privKey,
 	}
 
-	jsonBytes, err := json.Marshal(nodeKey)
+	jsonBytes, err := cdc.MarshalJSON(nodeKey)
 	if err != nil {
 		return nil, err
 	}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/netaddress.go b/vendor/github.com/tendermint/tendermint/p2p/netaddress.go
index a77090a78b95c678030049c0edb3fb576a78d755..3e0d99d69f67c037aaf02f5601aee0e516aba6aa 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/netaddress.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/netaddress.go
@@ -13,17 +13,21 @@ import (
 	"strings"
 	"time"
 
-	"github.com/pkg/errors"
 	cmn "github.com/tendermint/tmlibs/common"
 )
 
 // NetAddress defines information about a peer on the network
 // including its ID, IP address, and port.
 type NetAddress struct {
-	ID   ID
-	IP   net.IP
-	Port uint16
-	str  string
+	ID   ID     `json:"id"`
+	IP   net.IP `json:"ip"`
+	Port uint16 `json:"port"`
+
+	// TODO:
+	// Name string `json:"name"` // optional DNS name
+
+	// memoize .String()
+	str string
 }
 
 // IDAddressString returns id@hostPort.
@@ -57,10 +61,11 @@ func NewNetAddress(id ID, addr net.Addr) *NetAddress {
 // NewNetAddressString returns a new NetAddress using the provided address in
 // the form of "ID@IP:Port".
 // Also resolves the host if host is not an IP.
+// Errors are of type ErrNetAddressXxx where Xxx is in (NoID, Invalid, Lookup)
 func NewNetAddressString(addr string) (*NetAddress, error) {
 	spl := strings.Split(addr, "@")
 	if len(spl) < 2 {
-		return nil, fmt.Errorf("Address (%s) does not contain ID", addr)
+		return nil, ErrNetAddressNoID{addr}
 	}
 	return NewNetAddressStringWithOptionalID(addr)
 }
@@ -77,11 +82,12 @@ func NewNetAddressStringWithOptionalID(addr string) (*NetAddress, error) {
 		idStr := spl[0]
 		idBytes, err := hex.DecodeString(idStr)
 		if err != nil {
-			return nil, errors.Wrapf(err, "Address (%s) contains invalid ID", addrWithoutProtocol)
+			return nil, ErrNetAddressInvalid{addrWithoutProtocol, err}
 		}
 		if len(idBytes) != IDByteLength {
-			return nil, fmt.Errorf("Address (%s) contains ID of invalid length (%d). Should be %d hex-encoded bytes",
-				addrWithoutProtocol, len(idBytes), IDByteLength)
+			return nil, ErrNetAddressInvalid{
+				addrWithoutProtocol,
+				fmt.Errorf("invalid hex length - got %d, expected %d", len(idBytes), IDByteLength)}
 		}
 
 		id, addrWithoutProtocol = ID(idStr), spl[1]
@@ -89,7 +95,7 @@ func NewNetAddressStringWithOptionalID(addr string) (*NetAddress, error) {
 
 	host, portStr, err := net.SplitHostPort(addrWithoutProtocol)
 	if err != nil {
-		return nil, err
+		return nil, ErrNetAddressInvalid{addrWithoutProtocol, err}
 	}
 
 	ip := net.ParseIP(host)
@@ -97,7 +103,7 @@ func NewNetAddressStringWithOptionalID(addr string) (*NetAddress, error) {
 		if len(host) > 0 {
 			ips, err := net.LookupIP(host)
 			if err != nil {
-				return nil, err
+				return nil, ErrNetAddressLookup{host, err}
 			}
 			ip = ips[0]
 		}
@@ -105,7 +111,7 @@ func NewNetAddressStringWithOptionalID(addr string) (*NetAddress, error) {
 
 	port, err := strconv.ParseUint(portStr, 10, 16)
 	if err != nil {
-		return nil, err
+		return nil, ErrNetAddressInvalid{portStr, err}
 	}
 
 	na := NewNetAddressIPPort(ip, uint16(port))
@@ -121,7 +127,7 @@ func NewNetAddressStrings(addrs []string) ([]*NetAddress, []error) {
 	for _, addr := range addrs {
 		netAddr, err := NewNetAddressString(addr)
 		if err != nil {
-			errs = append(errs, fmt.Errorf("Error in address %s: %v", addr, err))
+			errs = append(errs, err)
 		} else {
 			netAddrs = append(netAddrs, netAddr)
 		}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/node_info.go b/vendor/github.com/tendermint/tendermint/p2p/node_info.go
index 346de37d3e4a6f7d9660778c5b7afbbad25969a1..60383bc5e2a850ee58215d9ad48ad50950fb52f3 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/node_info.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/node_info.go
@@ -2,9 +2,8 @@ package p2p
 
 import (
 	"fmt"
+	cmn "github.com/tendermint/tmlibs/common"
 	"strings"
-
-	crypto "github.com/tendermint/go-crypto"
 )
 
 const (
@@ -12,6 +11,7 @@ const (
 	maxNumChannels  = 16    // plenty of room for upgrades, for now
 )
 
+// Max size of the NodeInfo struct
 func MaxNodeInfoSize() int {
 	return maxNodeInfoSize
 }
@@ -20,28 +20,49 @@ func MaxNodeInfoSize() int {
 // between two peers during the Tendermint P2P handshake.
 type NodeInfo struct {
 	// Authenticate
-	PubKey     crypto.PubKey `json:"pub_key"`     // authenticated pubkey
-	ListenAddr string        `json:"listen_addr"` // accepting incoming
+	// TODO: replace with NetAddress
+	ID         ID     `json:"id"`          // authenticated identifier
+	ListenAddr string `json:"listen_addr"` // accepting incoming
 
-	// Check compatibility
-	Network  string `json:"network"`  // network/chain ID
-	Version  string `json:"version"`  // major.minor.revision
-	Channels []byte `json:"channels"` // channels this node knows about
+	// Check compatibility.
+	// Channels are HexBytes so easier to read as JSON
+	Network  string       `json:"network"`  // network/chain ID
+	Version  string       `json:"version"`  // major.minor.revision
+	Channels cmn.HexBytes `json:"channels"` // channels this node knows about
 
-	// Sanitize
+	// ASCIIText fields
 	Moniker string   `json:"moniker"` // arbitrary moniker
 	Other   []string `json:"other"`   // other application specific data
 }
 
 // Validate checks the self-reported NodeInfo is safe.
 // It returns an error if there
-// are too many Channels or any duplicate Channels.
+// are too many Channels, if there are any duplicate Channels,
+// if the ListenAddr is malformed, or if the ListenAddr is a host name
+// that can not be resolved to some IP.
 // TODO: constraints for Moniker/Other? Or is that for the UI ?
+// JAE: It needs to be done on the client, but to prevent ambiguous
+// unicode characters, maybe it's worth sanitizing it here.
+// In the future we might want to validate these, once we have a
+// name-resolution system up.
+// International clients could then use punycode (or we could use
+// url-encoding), and we just need to be careful with how we handle that in our
+// clients. (e.g. off by default).
 func (info NodeInfo) Validate() error {
 	if len(info.Channels) > maxNumChannels {
 		return fmt.Errorf("info.Channels is too long (%v). Max is %v", len(info.Channels), maxNumChannels)
 	}
 
+	// Sanitize ASCII text fields.
+	if !cmn.IsASCIIText(info.Moniker) || cmn.ASCIITrim(info.Moniker) == "" {
+		return fmt.Errorf("info.Moniker must be valid non-empty ASCII text without tabs, but got %v.", info.Moniker)
+	}
+	for i, s := range info.Other {
+		if !cmn.IsASCIIText(s) || cmn.ASCIITrim(s) == "" {
+			return fmt.Errorf("info.Other[%v] must be valid non-empty ASCII text without tabs, but got %v.", i, s)
+		}
+	}
+
 	channels := make(map[byte]struct{})
 	for _, ch := range info.Channels {
 		_, ok := channels[ch]
@@ -50,11 +71,14 @@ func (info NodeInfo) Validate() error {
 		}
 		channels[ch] = struct{}{}
 	}
-	return nil
+
+	// ensure ListenAddr is good
+	_, err := NewNetAddressString(IDAddressString(info.ID, info.ListenAddr))
+	return err
 }
 
 // CompatibleWith checks if two NodeInfo are compatible with eachother.
-// CONTRACT: two nodes are compatible if the major/minor versions match and network match
+// CONTRACT: two nodes are compatible if the major version matches and network match
 // and they have at least one channel in common.
 func (info NodeInfo) CompatibleWith(other NodeInfo) error {
 	iMajor, iMinor, _, iErr := splitVersion(info.Version)
@@ -75,9 +99,9 @@ func (info NodeInfo) CompatibleWith(other NodeInfo) error {
 		return fmt.Errorf("Peer is on a different major version. Got %v, expected %v", oMajor, iMajor)
 	}
 
-	// minor version must match
+	// minor version can differ
 	if iMinor != oMinor {
-		return fmt.Errorf("Peer is on a different minor version. Got %v, expected %v", oMinor, iMinor)
+		// ok
 	}
 
 	// nodes must be on the same network
@@ -107,27 +131,28 @@ OUTER_LOOP:
 	return nil
 }
 
-// ID returns node's ID.
-func (info NodeInfo) ID() ID {
-	return PubKeyToID(info.PubKey)
-}
-
 // NetAddress returns a NetAddress derived from the NodeInfo -
 // it includes the authenticated peer ID and the self-reported
 // ListenAddr. Note that the ListenAddr is not authenticated and
 // may not match that address actually dialed if its an outbound peer.
 func (info NodeInfo) NetAddress() *NetAddress {
-	id := PubKeyToID(info.PubKey)
-	addr := info.ListenAddr
-	netAddr, err := NewNetAddressString(IDAddressString(id, addr))
+	netAddr, err := NewNetAddressString(IDAddressString(info.ID, info.ListenAddr))
 	if err != nil {
-		panic(err) // everything should be well formed by now
+		switch err.(type) {
+		case ErrNetAddressLookup:
+			// XXX If the peer provided a host name  and the lookup fails here
+			// we're out of luck.
+			// TODO: use a NetAddress in NodeInfo
+		default:
+			panic(err) // everything should be well formed by now
+		}
 	}
 	return netAddr
 }
 
 func (info NodeInfo) String() string {
-	return fmt.Sprintf("NodeInfo{pk: %v, moniker: %v, network: %v [listen %v], version: %v (%v)}", info.PubKey, info.Moniker, info.Network, info.ListenAddr, info.Version, info.Other)
+	return fmt.Sprintf("NodeInfo{id: %v, moniker: %v, network: %v [listen %v], version: %v (%v)}",
+		info.ID, info.Moniker, info.Network, info.ListenAddr, info.Version, info.Other)
 }
 
 func splitVersion(version string) (string, string, string, error) {
diff --git a/vendor/github.com/tendermint/tendermint/p2p/peer.go b/vendor/github.com/tendermint/tendermint/p2p/peer.go
index 0fa7ca0349e1f436d54cdba6dbb69dfe4ca4bdc0..29f4246531d448fe9e7c45a6bfb4393ba4e5d16c 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/peer.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/peer.go
@@ -3,30 +3,31 @@ package p2p
 import (
 	"fmt"
 	"net"
+	"sync/atomic"
 	"time"
 
-	"github.com/pkg/errors"
-
 	crypto "github.com/tendermint/go-crypto"
-	wire "github.com/tendermint/go-wire"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/log"
 
 	tmconn "github.com/tendermint/tendermint/p2p/conn"
 )
 
+var testIPSuffix uint32 = 0
+
 // Peer is an interface representing a peer connected on a reactor.
 type Peer interface {
 	cmn.Service
 
 	ID() ID             // peer's cryptographic ID
+	RemoteIP() net.IP   // remote IP of the connection
 	IsOutbound() bool   // did we dial the peer
 	IsPersistent() bool // do we redial this peer when we disconnect
 	NodeInfo() NodeInfo // peer's info
 	Status() tmconn.ConnectionStatus
 
-	Send(byte, interface{}) bool
-	TrySend(byte, interface{}) bool
+	Send(byte, []byte) bool
+	TrySend(byte, []byte) bool
 
 	Set(string, interface{})
 	Get(string) interface{}
@@ -40,6 +41,7 @@ type peerConn struct {
 	persistent bool
 	config     *PeerConfig
 	conn       net.Conn // source connection
+	ip         net.IP
 }
 
 // ID only exists for SecretConnection.
@@ -48,6 +50,35 @@ func (pc peerConn) ID() ID {
 	return PubKeyToID(pc.conn.(*tmconn.SecretConnection).RemotePubKey())
 }
 
+// Return the IP from the connection RemoteAddr
+func (pc peerConn) RemoteIP() net.IP {
+	if pc.ip != nil {
+		return pc.ip
+	}
+
+	// In test cases a conn could not be present at all or be an in-memory
+	// implementation where we want to return a fake ip.
+	if pc.conn == nil || pc.conn.RemoteAddr().String() == "pipe" {
+		pc.ip = net.IP{172, 16, 0, byte(atomic.AddUint32(&testIPSuffix, 1))}
+
+		return pc.ip
+	}
+
+	host, _, err := net.SplitHostPort(pc.conn.RemoteAddr().String())
+	if err != nil {
+		panic(err)
+	}
+
+	ips, err := net.LookupIP(host)
+	if err != nil {
+		panic(err)
+	}
+
+	pc.ip = ips[0]
+
+	return pc.ip
+}
+
 // peer implements Peer.
 //
 // Before using a peer, you will need to perform a handshake on connection.
@@ -85,25 +116,24 @@ func newPeer(pc peerConn, nodeInfo NodeInfo,
 
 // PeerConfig is a Peer configuration.
 type PeerConfig struct {
-	AuthEnc bool `mapstructure:"auth_enc"` // authenticated encryption
-
 	// times are in seconds
 	HandshakeTimeout time.Duration `mapstructure:"handshake_timeout"`
 	DialTimeout      time.Duration `mapstructure:"dial_timeout"`
 
 	MConfig *tmconn.MConnConfig `mapstructure:"connection"`
 
-	Fuzz       bool            `mapstructure:"fuzz"` // fuzz connection (for testing)
+	DialFail   bool            `mapstructure:"dial_fail"` // for testing
+	Fuzz       bool            `mapstructure:"fuzz"`      // fuzz connection (for testing)
 	FuzzConfig *FuzzConnConfig `mapstructure:"fuzz_config"`
 }
 
 // DefaultPeerConfig returns the default config.
 func DefaultPeerConfig() *PeerConfig {
 	return &PeerConfig{
-		AuthEnc:          true,
 		HandshakeTimeout: 20, // * time.Second,
 		DialTimeout:      3,  // * time.Second,
 		MConfig:          tmconn.DefaultMConnConfig(),
+		DialFail:         false,
 		Fuzz:             false,
 		FuzzConfig:       DefaultFuzzConnConfig(),
 	}
@@ -114,21 +144,21 @@ func newOutboundPeerConn(addr *NetAddress, config *PeerConfig, persistent bool,
 
 	conn, err := dial(addr, config)
 	if err != nil {
-		return pc, errors.Wrap(err, "Error creating peer")
+		return pc, cmn.ErrorWrap(err, "Error creating peer")
 	}
 
 	pc, err = newPeerConn(conn, config, true, persistent, ourNodePrivKey)
 	if err != nil {
 		if err2 := conn.Close(); err2 != nil {
-			return pc, errors.Wrap(err, err2.Error())
+			return pc, cmn.ErrorWrap(err, err2.Error())
 		}
 		return pc, err
 	}
 
 	// ensure dialed ID matches connection ID
-	if config.AuthEnc && addr.ID != pc.ID() {
+	if addr.ID != pc.ID() {
 		if err2 := conn.Close(); err2 != nil {
-			return pc, errors.Wrap(err, err2.Error())
+			return pc, cmn.ErrorWrap(err, err2.Error())
 		}
 		return pc, ErrSwitchAuthenticationFailure{addr, pc.ID()}
 	}
@@ -154,17 +184,15 @@ func newPeerConn(rawConn net.Conn,
 		conn = FuzzConnAfterFromConfig(conn, 10*time.Second, config.FuzzConfig)
 	}
 
-	if config.AuthEnc {
-		// Set deadline for secret handshake
-		if err := conn.SetDeadline(time.Now().Add(config.HandshakeTimeout * time.Second)); err != nil {
-			return pc, errors.Wrap(err, "Error setting deadline while encrypting connection")
-		}
+	// Set deadline for secret handshake
+	if err := conn.SetDeadline(time.Now().Add(config.HandshakeTimeout * time.Second)); err != nil {
+		return pc, cmn.ErrorWrap(err, "Error setting deadline while encrypting connection")
+	}
 
-		// Encrypt connection
-		conn, err = tmconn.MakeSecretConnection(conn, ourNodePrivKey)
-		if err != nil {
-			return pc, errors.Wrap(err, "Error creating peer")
-		}
+	// Encrypt connection
+	conn, err = tmconn.MakeSecretConnection(conn, ourNodePrivKey)
+	if err != nil {
+		return pc, cmn.ErrorWrap(err, "Error creating peer")
 	}
 
 	// Only the information we already have
@@ -205,7 +233,7 @@ func (p *peer) OnStop() {
 
 // ID returns the peer's ID - the hex encoded hash of its pubkey.
 func (p *peer) ID() ID {
-	return p.nodeInfo.ID()
+	return p.nodeInfo.ID
 }
 
 // IsOutbound returns true if the connection is outbound, false otherwise.
@@ -228,9 +256,9 @@ func (p *peer) Status() tmconn.ConnectionStatus {
 	return p.mconn.Status()
 }
 
-// Send msg to the channel identified by chID byte. Returns false if the send
-// queue is full after timeout, specified by MConnection.
-func (p *peer) Send(chID byte, msg interface{}) bool {
+// Send msg bytes to the channel identified by chID byte. Returns false if the
+// send queue is full after timeout, specified by MConnection.
+func (p *peer) Send(chID byte, msgBytes []byte) bool {
 	if !p.IsRunning() {
 		// see Switch#Broadcast, where we fetch the list of peers and loop over
 		// them - while we're looping, one peer may be removed and stopped.
@@ -238,18 +266,18 @@ func (p *peer) Send(chID byte, msg interface{}) bool {
 	} else if !p.hasChannel(chID) {
 		return false
 	}
-	return p.mconn.Send(chID, msg)
+	return p.mconn.Send(chID, msgBytes)
 }
 
-// TrySend msg to the channel identified by chID byte. Immediately returns
+// TrySend msg bytes to the channel identified by chID byte. Immediately returns
 // false if the send queue is full.
-func (p *peer) TrySend(chID byte, msg interface{}) bool {
+func (p *peer) TrySend(chID byte, msgBytes []byte) bool {
 	if !p.IsRunning() {
 		return false
 	} else if !p.hasChannel(chID) {
 		return false
 	}
-	return p.mconn.TrySend(chID, msg)
+	return p.mconn.TrySend(chID, msgBytes)
 }
 
 // Get the data for a given key.
@@ -290,28 +318,26 @@ func (pc *peerConn) CloseConn() {
 func (pc *peerConn) HandshakeTimeout(ourNodeInfo NodeInfo, timeout time.Duration) (peerNodeInfo NodeInfo, err error) {
 	// Set deadline for handshake so we don't block forever on conn.ReadFull
 	if err := pc.conn.SetDeadline(time.Now().Add(timeout)); err != nil {
-		return peerNodeInfo, errors.Wrap(err, "Error setting deadline")
+		return peerNodeInfo, cmn.ErrorWrap(err, "Error setting deadline")
 	}
 
 	var trs, _ = cmn.Parallel(
 		func(_ int) (val interface{}, err error, abort bool) {
-			var n int
-			wire.WriteBinary(&ourNodeInfo, pc.conn, &n, &err)
+			_, err = cdc.MarshalBinaryWriter(pc.conn, ourNodeInfo)
 			return
 		},
 		func(_ int) (val interface{}, err error, abort bool) {
-			var n int
-			wire.ReadBinary(&peerNodeInfo, pc.conn, MaxNodeInfoSize(), &n, &err)
+			_, err = cdc.UnmarshalBinaryReader(pc.conn, &peerNodeInfo, int64(MaxNodeInfoSize()))
 			return
 		},
 	)
 	if err := trs.FirstError(); err != nil {
-		return peerNodeInfo, errors.Wrap(err, "Error during handshake")
+		return peerNodeInfo, cmn.ErrorWrap(err, "Error during handshake")
 	}
 
 	// Remove deadline
 	if err := pc.conn.SetDeadline(time.Time{}); err != nil {
-		return peerNodeInfo, errors.Wrap(err, "Error removing deadline")
+		return peerNodeInfo, cmn.ErrorWrap(err, "Error removing deadline")
 	}
 
 	return peerNodeInfo, nil
@@ -343,6 +369,10 @@ func (p *peer) String() string {
 // helper funcs
 
 func dial(addr *NetAddress, config *PeerConfig) (net.Conn, error) {
+	if config.DialFail {
+		return nil, fmt.Errorf("dial err (peerConfig.DialFail == true)")
+	}
+
 	conn, err := addr.DialTimeout(config.DialTimeout * time.Second)
 	if err != nil {
 		return nil, err
diff --git a/vendor/github.com/tendermint/tendermint/p2p/peer_set.go b/vendor/github.com/tendermint/tendermint/p2p/peer_set.go
index a4565ea1d97db258da83f85808441202ef4c9c27..e048cf4e30bb25c2ed8cf062fa42cd3c2a933e27 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/peer_set.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/peer_set.go
@@ -1,12 +1,14 @@
 package p2p
 
 import (
+	"net"
 	"sync"
 )
 
 // IPeerSet has a (immutable) subset of the methods of PeerSet.
 type IPeerSet interface {
 	Has(key ID) bool
+	HasIP(ip net.IP) bool
 	Get(key ID) Peer
 	List() []Peer
 	Size() int
@@ -36,12 +38,13 @@ func NewPeerSet() *PeerSet {
 }
 
 // Add adds the peer to the PeerSet.
-// It returns ErrSwitchDuplicatePeer if the peer is already present.
+// It returns an error carrying the reason, if the peer is already present.
 func (ps *PeerSet) Add(peer Peer) error {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
+
 	if ps.lookup[peer.ID()] != nil {
-		return ErrSwitchDuplicatePeer
+		return ErrSwitchDuplicatePeerID{peer.ID()}
 	}
 
 	index := len(ps.list)
@@ -61,6 +64,27 @@ func (ps *PeerSet) Has(peerKey ID) bool {
 	return ok
 }
 
+// HasIP returns true if the PeerSet contains the peer referred to by this IP
+// address.
+func (ps *PeerSet) HasIP(peerIP net.IP) bool {
+	ps.mtx.Lock()
+	defer ps.mtx.Unlock()
+
+	return ps.hasIP(peerIP)
+}
+
+// hasIP does not acquire a lock so it can be used in public methods which
+// already lock.
+func (ps *PeerSet) hasIP(peerIP net.IP) bool {
+	for _, item := range ps.lookup {
+		if item.peer.RemoteIP().Equal(peerIP) {
+			return true
+		}
+	}
+
+	return false
+}
+
 // Get looks up a peer by the provided peerKey.
 func (ps *PeerSet) Get(peerKey ID) Peer {
 	ps.mtx.Lock()
@@ -76,6 +100,7 @@ func (ps *PeerSet) Get(peerKey ID) Peer {
 func (ps *PeerSet) Remove(peer Peer) {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
+
 	item := ps.lookup[peer.ID()]
 	if item == nil {
 		return
diff --git a/vendor/github.com/tendermint/tendermint/p2p/pex/addrbook.go b/vendor/github.com/tendermint/tendermint/p2p/pex/addrbook.go
index a8462f3751dfbdbd884c09110dbdb21d310346e8..dc51761fefaf9258279984280fdb9d1d03c39b73 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/pex/addrbook.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/pex/addrbook.go
@@ -7,9 +7,7 @@ package pex
 import (
 	"crypto/sha256"
 	"encoding/binary"
-	"fmt"
 	"math"
-	"math/rand"
 	"net"
 	"sync"
 	"time"
@@ -82,7 +80,7 @@ type addrBook struct {
 
 	// accessed concurrently
 	mtx        sync.Mutex
-	rand       *rand.Rand
+	rand       *cmn.Rand
 	ourAddrs   map[string]struct{}
 	addrLookup map[p2p.ID]*knownAddress // new & old
 	bucketsOld []map[string]*knownAddress
@@ -97,7 +95,7 @@ type addrBook struct {
 // Use Start to begin processing asynchronous address updates.
 func NewAddrBook(filePath string, routabilityStrict bool) *addrBook {
 	am := &addrBook{
-		rand:              rand.New(rand.NewSource(time.Now().UnixNano())), // TODO: seed from outside
+		rand:              cmn.NewRand(),
 		ourAddrs:          make(map[string]struct{}),
 		addrLookup:        make(map[p2p.ID]*knownAddress),
 		filePath:          filePath,
@@ -170,7 +168,9 @@ func (a *addrBook) OurAddress(addr *p2p.NetAddress) bool {
 	return ok
 }
 
-// AddAddress implements AddrBook - adds the given address as received from the given source.
+// AddAddress implements AddrBook
+// Add address to a "new" bucket. If it's already in one, only add it probabilistically.
+// Returns error if the addr is non-routable. Does not add self.
 // NOTE: addr must not be nil
 func (a *addrBook) AddAddress(addr *p2p.NetAddress, src *p2p.NetAddress) error {
 	a.mtx.Lock()
@@ -186,7 +186,7 @@ func (a *addrBook) RemoveAddress(addr *p2p.NetAddress) {
 	if ka == nil {
 		return
 	}
-	a.Logger.Info("Remove address from book", "addr", ka.Addr, "ID", ka.ID)
+	a.Logger.Info("Remove address from book", "addr", ka.Addr, "ID", ka.ID())
 	a.removeFromAllBuckets(ka)
 }
 
@@ -221,7 +221,11 @@ func (a *addrBook) PickAddress(biasTowardsNewAddrs int) *p2p.NetAddress {
 	a.mtx.Lock()
 	defer a.mtx.Unlock()
 
-	if a.size() == 0 {
+	bookSize := a.size()
+	if bookSize <= 0 {
+		if bookSize < 0 {
+			a.Logger.Error("Addrbook size less than 0", "nNew", a.nNew, "nOld", a.nOld)
+		}
 		return nil
 	}
 	if biasTowardsNewAddrs > 100 {
@@ -295,32 +299,38 @@ func (a *addrBook) MarkBad(addr *p2p.NetAddress) {
 
 // GetSelection implements AddrBook.
 // It randomly selects some addresses (old & new). Suitable for peer-exchange protocols.
+// Must never return a nil address.
 func (a *addrBook) GetSelection() []*p2p.NetAddress {
 	a.mtx.Lock()
 	defer a.mtx.Unlock()
 
-	if a.size() == 0 {
+	bookSize := a.size()
+	if bookSize <= 0 {
+		if bookSize < 0 {
+			a.Logger.Error("Addrbook size less than 0", "nNew", a.nNew, "nOld", a.nOld)
+		}
 		return nil
 	}
 
-	allAddr := make([]*p2p.NetAddress, a.size())
+	numAddresses := cmn.MaxInt(
+		cmn.MinInt(minGetSelection, bookSize),
+		bookSize*getSelectionPercent/100)
+	numAddresses = cmn.MinInt(maxGetSelection, numAddresses)
+
+	// XXX: instead of making a list of all addresses, shuffling, and slicing a random chunk,
+	// could we just select a random numAddresses of indexes?
+	allAddr := make([]*p2p.NetAddress, bookSize)
 	i := 0
 	for _, ka := range a.addrLookup {
 		allAddr[i] = ka.Addr
 		i++
 	}
 
-	numAddresses := cmn.MaxInt(
-		cmn.MinInt(minGetSelection, len(allAddr)),
-		len(allAddr)*getSelectionPercent/100)
-	numAddresses = cmn.MinInt(maxGetSelection, numAddresses)
-
 	// Fisher-Yates shuffle the array. We only need to do the first
 	// `numAddresses' since we are throwing the rest.
-	// XXX: What's the point of this if we already loop randomly through addrLookup ?
 	for i := 0; i < numAddresses; i++ {
 		// pick a number between current index and the end
-		j := rand.Intn(len(allAddr)-i) + i
+		j := cmn.RandIntn(len(allAddr)-i) + i
 		allAddr[i], allAddr[j] = allAddr[j], allAddr[i]
 	}
 
@@ -330,6 +340,7 @@ func (a *addrBook) GetSelection() []*p2p.NetAddress {
 
 // GetSelectionWithBias implements AddrBook.
 // It randomly selects some addresses (old & new). Suitable for peer-exchange protocols.
+// Must never return a nil address.
 //
 // Each address is picked randomly from an old or new bucket according to the
 // biasTowardsNewAddrs argument, which must be between [0, 100] (or else is truncated to
@@ -339,7 +350,11 @@ func (a *addrBook) GetSelectionWithBias(biasTowardsNewAddrs int) []*p2p.NetAddre
 	a.mtx.Lock()
 	defer a.mtx.Unlock()
 
-	if a.size() == 0 {
+	bookSize := a.size()
+	if bookSize <= 0 {
+		if bookSize < 0 {
+			a.Logger.Error("Addrbook size less than 0", "nNew", a.nNew, "nOld", a.nOld)
+		}
 		return nil
 	}
 
@@ -351,8 +366,8 @@ func (a *addrBook) GetSelectionWithBias(biasTowardsNewAddrs int) []*p2p.NetAddre
 	}
 
 	numAddresses := cmn.MaxInt(
-		cmn.MinInt(minGetSelection, a.size()),
-		a.size()*getSelectionPercent/100)
+		cmn.MinInt(minGetSelection, bookSize),
+		bookSize*getSelectionPercent/100)
 	numAddresses = cmn.MinInt(maxGetSelection, numAddresses)
 
 	selection := make([]*p2p.NetAddress, numAddresses)
@@ -488,11 +503,11 @@ func (a *addrBook) getBucket(bucketType byte, bucketIdx int) map[string]*knownAd
 
 // Adds ka to new bucket. Returns false if it couldn't do it cuz buckets full.
 // NOTE: currently it always returns true.
-func (a *addrBook) addToNewBucket(ka *knownAddress, bucketIdx int) bool {
+func (a *addrBook) addToNewBucket(ka *knownAddress, bucketIdx int) {
 	// Sanity check
 	if ka.isOld() {
-		a.Logger.Error(cmn.Fmt("Cannot add address already in old bucket to a new bucket: %v", ka))
-		return false
+		a.Logger.Error("Failed Sanity Check! Cant add old address to new bucket", "ka", ka, "bucket", bucketIdx)
+		return
 	}
 
 	addrStr := ka.Addr.String()
@@ -500,7 +515,7 @@ func (a *addrBook) addToNewBucket(ka *knownAddress, bucketIdx int) bool {
 
 	// Already exists?
 	if _, ok := bucket[addrStr]; ok {
-		return true
+		return
 	}
 
 	// Enforce max addresses.
@@ -518,8 +533,6 @@ func (a *addrBook) addToNewBucket(ka *knownAddress, bucketIdx int) bool {
 
 	// Add it to addrLookup
 	a.addrLookup[ka.ID()] = ka
-
-	return true
 }
 
 // Adds ka to old bucket. Returns false if it couldn't do it cuz buckets full.
@@ -606,19 +619,22 @@ func (a *addrBook) pickOldest(bucketType byte, bucketIdx int) *knownAddress {
 // adds the address to a "new" bucket. if its already in one,
 // it only adds it probabilistically
 func (a *addrBook) addAddress(addr, src *p2p.NetAddress) error {
+	if addr == nil || src == nil {
+		return ErrAddrBookNilAddr{addr, src}
+	}
+
 	if a.routabilityStrict && !addr.Routable() {
-		return fmt.Errorf("Cannot add non-routable address %v", addr)
+		return ErrAddrBookNonRoutable{addr}
 	}
+	// TODO: we should track ourAddrs by ID and by IP:PORT and refuse both.
 	if _, ok := a.ourAddrs[addr.String()]; ok {
-		// Ignore our own listener address.
-		return fmt.Errorf("Cannot add ourselves with address %v", addr)
+		return ErrAddrBookSelf{addr}
 	}
 
 	ka := a.addrLookup[addr.ID]
-
 	if ka != nil {
-		// Already old.
-		if ka.isOld() {
+		// If its already old and the addr is the same, ignore it.
+		if ka.isOld() && ka.Addr.Equals(addr) {
 			return nil
 		}
 		// Already in max new buckets.
@@ -635,12 +651,7 @@ func (a *addrBook) addAddress(addr, src *p2p.NetAddress) error {
 	}
 
 	bucket := a.calcNewBucket(addr, src)
-	added := a.addToNewBucket(ka, bucket)
-	if !added {
-		a.Logger.Info("Can't add new address, addr book is full", "address", addr, "total", a.size())
-	}
-
-	a.Logger.Info("Added new address", "address", addr, "total", a.size())
+	a.addToNewBucket(ka, bucket)
 	return nil
 }
 
@@ -675,8 +686,6 @@ func (a *addrBook) moveToOld(ka *knownAddress) {
 		return
 	}
 
-	// Remember one of the buckets in which ka is in.
-	freedBucket := ka.Buckets[0]
 	// Remove from all (new) buckets.
 	a.removeFromAllBuckets(ka)
 	// It's officially old now.
@@ -686,20 +695,13 @@ func (a *addrBook) moveToOld(ka *knownAddress) {
 	oldBucketIdx := a.calcOldBucket(ka.Addr)
 	added := a.addToOldBucket(ka, oldBucketIdx)
 	if !added {
-		// No room, must evict something
+		// No room; move the oldest to a new bucket
 		oldest := a.pickOldest(bucketTypeOld, oldBucketIdx)
 		a.removeFromBucket(oldest, bucketTypeOld, oldBucketIdx)
-		// Find new bucket to put oldest in
 		newBucketIdx := a.calcNewBucket(oldest.Addr, oldest.Src)
-		added := a.addToNewBucket(oldest, newBucketIdx)
-		// No space in newBucket either, just put it in freedBucket from above.
-		if !added {
-			added := a.addToNewBucket(oldest, freedBucket)
-			if !added {
-				a.Logger.Error(cmn.Fmt("Could not migrate oldest %v to freedBucket %v", oldest, freedBucket))
-			}
-		}
-		// Finally, add to bucket again.
+		a.addToNewBucket(oldest, newBucketIdx)
+
+		// Finally, add our ka to old bucket again.
 		added = a.addToOldBucket(ka, oldBucketIdx)
 		if !added {
 			a.Logger.Error(cmn.Fmt("Could not re-add ka %v to oldBucketIdx %v", ka, oldBucketIdx))
diff --git a/vendor/github.com/tendermint/tendermint/p2p/pex/errors.go b/vendor/github.com/tendermint/tendermint/p2p/pex/errors.go
new file mode 100644
index 0000000000000000000000000000000000000000..0b8bf471560989eb21ddb5736a7f821c8f251274
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/p2p/pex/errors.go
@@ -0,0 +1,32 @@
+package pex
+
+import (
+	"fmt"
+
+	"github.com/tendermint/tendermint/p2p"
+)
+
+type ErrAddrBookNonRoutable struct {
+	Addr *p2p.NetAddress
+}
+
+func (err ErrAddrBookNonRoutable) Error() string {
+	return fmt.Sprintf("Cannot add non-routable address %v", err.Addr)
+}
+
+type ErrAddrBookSelf struct {
+	Addr *p2p.NetAddress
+}
+
+func (err ErrAddrBookSelf) Error() string {
+	return fmt.Sprintf("Cannot add ourselves with address %v", err.Addr)
+}
+
+type ErrAddrBookNilAddr struct {
+	Addr *p2p.NetAddress
+	Src  *p2p.NetAddress
+}
+
+func (err ErrAddrBookNilAddr) Error() string {
+	return fmt.Sprintf("Cannot add a nil address. Got (addr, src) = (%v, %v)", err.Addr, err.Src)
+}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/pex/known_address.go b/vendor/github.com/tendermint/tendermint/p2p/pex/known_address.go
index 0261e4902849d4b4904d17883df38228509b8e3a..5673dec1197bd3f4d0c2885593075386de4bff00 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/pex/known_address.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/pex/known_address.go
@@ -106,7 +106,6 @@ func (ka *knownAddress) removeBucketRef(bucketIdx int) int {
    All addresses that meet these criteria are assumed to be worthless and not
    worth keeping hold of.
 
-   XXX: so a good peer needs us to call MarkGood before the conditions above are reached!
 */
 func (ka *knownAddress) isBad() bool {
 	// Is Old --> good
@@ -115,14 +114,15 @@ func (ka *knownAddress) isBad() bool {
 	}
 
 	// Has been attempted in the last minute --> good
-	if ka.LastAttempt.Before(time.Now().Add(-1 * time.Minute)) {
+	if ka.LastAttempt.After(time.Now().Add(-1 * time.Minute)) {
 		return false
 	}
 
+	// TODO: From the future?
+
 	// Too old?
-	// XXX: does this mean if we've kept a connection up for this long we'll disconnect?!
-	// and shouldn't it be .Before ?
-	if ka.LastAttempt.After(time.Now().Add(-1 * numMissingDays * time.Hour * 24)) {
+	// TODO: should be a timestamp of last seen, not just last attempt
+	if ka.LastAttempt.Before(time.Now().Add(-1 * numMissingDays * time.Hour * 24)) {
 		return true
 	}
 
@@ -132,7 +132,6 @@ func (ka *knownAddress) isBad() bool {
 	}
 
 	// Hasn't succeeded in too long?
-	// XXX: does this mean if we've kept a connection up for this long we'll disconnect?!
 	if ka.LastSuccess.Before(time.Now().Add(-1*minBadDays*time.Hour*24)) &&
 		ka.Attempts >= maxFailures {
 		return true
diff --git a/vendor/github.com/tendermint/tendermint/p2p/pex/params.go b/vendor/github.com/tendermint/tendermint/p2p/pex/params.go
index f94e1021cb5d41d155a176bec530dcc3eac5dcda..29b4d45ab2792d590895aa0e3edb00f089e67474 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/pex/params.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/pex/params.go
@@ -50,6 +50,6 @@ const (
 	minGetSelection = 32
 
 	// max addresses returned by GetSelection
-	// NOTE: this must match "maxPexMessageSize"
+	// NOTE: this must match "maxMsgSize"
 	maxGetSelection = 250
 )
diff --git a/vendor/github.com/tendermint/tendermint/p2p/pex/pex_reactor.go b/vendor/github.com/tendermint/tendermint/p2p/pex/pex_reactor.go
index 1bcc493dd985232cfc410ae3c02dea73b2ee3a07..457e542788eadd69f61ca966519483869f94f693 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/pex/pex_reactor.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/pex/pex_reactor.go
@@ -1,16 +1,13 @@
 package pex
 
 import (
-	"bytes"
 	"fmt"
-	"math/rand"
 	"reflect"
 	"sort"
 	"sync"
 	"time"
 
-	"github.com/pkg/errors"
-	wire "github.com/tendermint/go-wire"
+	amino "github.com/tendermint/go-amino"
 	cmn "github.com/tendermint/tmlibs/common"
 
 	"github.com/tendermint/tendermint/p2p"
@@ -23,11 +20,18 @@ const (
 	// PexChannel is a channel for PEX messages
 	PexChannel = byte(0x00)
 
-	maxPexMessageSize = 1048576 // 1MB
+	// over-estimate of max NetAddress size
+	// hexID (40) + IP (16) + Port (2) + Name (100) ...
+	// NOTE: dont use massive DNS name ..
+	maxAddressSize = 256
+
+	// NOTE: amplificaiton factor!
+	// small request results in up to maxMsgSize response
+	maxMsgSize = maxAddressSize * maxGetSelection
 
 	// ensure we have enough peers
 	defaultEnsurePeersPeriod   = 30 * time.Second
-	defaultMinNumOutboundPeers = 10
+	defaultMinNumOutboundPeers = p2p.DefaultMinNumOutboundPeers
 
 	// Seed/Crawler constants
 
@@ -64,7 +68,7 @@ type PEXReactor struct {
 
 	book              AddrBook
 	config            *PEXReactorConfig
-	ensurePeersPeriod time.Duration
+	ensurePeersPeriod time.Duration // TODO: should go in the config
 
 	// maps to prevent abuse
 	requestsSent         *cmn.CMap // ID->struct{}: unanswered send requests
@@ -73,6 +77,12 @@ type PEXReactor struct {
 	attemptsToDial sync.Map // address (string) -> {number of attempts (int), last time dialed (time.Time)}
 }
 
+func (pexR *PEXReactor) minReceiveRequestInterval() time.Duration {
+	// NOTE: must be less than ensurePeersPeriod, otherwise we'll request
+	// peers too quickly from others and they'll think we're bad!
+	return pexR.ensurePeersPeriod / 3
+}
+
 // PEXReactorConfig holds reactor specific configuration data.
 type PEXReactorConfig struct {
 	// Seed/Crawler mode
@@ -116,6 +126,7 @@ func (r *PEXReactor) OnStart() error {
 	}
 
 	// return err if user provided a bad seed address
+	// or a host name that we cant resolve
 	if err := r.checkSeeds(); err != nil {
 		return err
 	}
@@ -158,16 +169,30 @@ func (r *PEXReactor) AddPeer(p Peer) {
 			r.RequestAddrs(p)
 		}
 	} else {
-		// For inbound peers, the peer is its own source,
-		// and its NodeInfo has already been validated.
-		// Let the ensurePeersRoutine handle asking for more
-		// peers when we need - we don't trust inbound peers as much.
+		// inbound peer is its own source
 		addr := p.NodeInfo().NetAddress()
-		if !isAddrPrivate(addr, r.config.PrivatePeerIDs) {
-			err := r.book.AddAddress(addr, addr)
-			if err != nil {
-				r.Logger.Error("Failed to add new address", "err", err)
-			}
+		src := addr
+
+		// ignore private addrs
+		if isAddrPrivate(addr, r.config.PrivatePeerIDs) {
+			return
+		}
+
+		// add to book. dont RequestAddrs right away because
+		// we don't trust inbound as much - let ensurePeersRoutine handle it.
+		err := r.book.AddAddress(addr, src)
+		r.logErrAddrBook(err)
+	}
+}
+
+func (r *PEXReactor) logErrAddrBook(err error) {
+	if err != nil {
+		switch err.(type) {
+		case ErrAddrBookNilAddr:
+			r.Logger.Error("Failed to add new address", "err", err)
+		default:
+			// non-routable, self, full book, etc.
+			r.Logger.Debug("Failed to add new address", "err", err)
 		}
 	}
 }
@@ -181,7 +206,7 @@ func (r *PEXReactor) RemovePeer(p Peer, reason interface{}) {
 
 // Receive implements Reactor by handling incoming PEX messages.
 func (r *PEXReactor) Receive(chID byte, src Peer, msgBytes []byte) {
-	_, msg, err := DecodeMessage(msgBytes)
+	msg, err := DecodeMessage(msgBytes)
 	if err != nil {
 		r.Logger.Error("Error decoding message", "src", src, "chId", chID, "msg", msg, "err", err, "bytes", msgBytes)
 		r.Switch.StopPeerForError(src, err)
@@ -198,6 +223,10 @@ func (r *PEXReactor) Receive(chID byte, src Peer, msgBytes []byte) {
 		}
 
 		// Seeds disconnect after sending a batch of addrs
+		// NOTE: this is a prime candidate for amplification attacks
+		// so it's important we
+		// 1) restrict how frequently peers can request
+		// 2) limit the output size
 		if r.config.SeedMode {
 			r.SendAddrs(src, r.book.GetSelectionWithBias(biasToSelectNewPeers))
 			r.Switch.StopPeerGracefully(src)
@@ -216,6 +245,7 @@ func (r *PEXReactor) Receive(chID byte, src Peer, msgBytes []byte) {
 	}
 }
 
+// enforces a minimum amount of time between requests
 func (r *PEXReactor) receiveRequest(src Peer) error {
 	id := string(src.ID())
 	v := r.lastReceivedRequests.Get(id)
@@ -235,8 +265,14 @@ func (r *PEXReactor) receiveRequest(src Peer) error {
 	}
 
 	now := time.Now()
-	if now.Sub(lastReceived) < r.ensurePeersPeriod/3 {
-		return fmt.Errorf("Peer (%v) is sending too many PEX requests. Disconnecting", src.ID())
+	minInterval := r.minReceiveRequestInterval()
+	if now.Sub(lastReceived) < minInterval {
+		return fmt.Errorf("Peer (%v) send next PEX request too soon. lastReceived: %v, now: %v, minInterval: %v. Disconnecting",
+			src.ID(),
+			lastReceived,
+			now,
+			minInterval,
+		)
 	}
 	r.lastReceivedRequests.Set(id, now)
 	return nil
@@ -245,41 +281,50 @@ func (r *PEXReactor) receiveRequest(src Peer) error {
 // RequestAddrs asks peer for more addresses if we do not already
 // have a request out for this peer.
 func (r *PEXReactor) RequestAddrs(p Peer) {
+	r.Logger.Debug("Request addrs", "from", p)
 	id := string(p.ID())
 	if r.requestsSent.Has(id) {
 		return
 	}
 	r.requestsSent.Set(id, struct{}{})
-	p.Send(PexChannel, struct{ PexMessage }{&pexRequestMessage{}})
+	p.Send(PexChannel, cdc.MustMarshalBinary(&pexRequestMessage{}))
 }
 
 // ReceiveAddrs adds the given addrs to the addrbook if theres an open
 // request for this peer and deletes the open request.
 // If there's no open request for the src peer, it returns an error.
 func (r *PEXReactor) ReceiveAddrs(addrs []*p2p.NetAddress, src Peer) error {
-	id := string(src.ID())
 
+	id := string(src.ID())
 	if !r.requestsSent.Has(id) {
-		return errors.New("Received unsolicited pexAddrsMessage")
+		return cmn.NewError("Received unsolicited pexAddrsMessage")
 	}
-
 	r.requestsSent.Delete(id)
 
 	srcAddr := src.NodeInfo().NetAddress()
 	for _, netAddr := range addrs {
-		if netAddr != nil && !isAddrPrivate(netAddr, r.config.PrivatePeerIDs) {
-			err := r.book.AddAddress(netAddr, srcAddr)
-			if err != nil {
-				r.Logger.Error("Failed to add new address", "err", err)
-			}
+		// NOTE: GetSelection methods should never return nil addrs
+		if netAddr == nil {
+			return cmn.NewError("received nil addr")
 		}
+
+		// ignore private peers
+		// TODO: give private peers to AddrBook so it can enforce this on AddAddress.
+		// We'd then have to check for ErrPrivatePeer on AddAddress here, which is
+		// an error we just ignore (maybe peer is probing us for our private peers :P)
+		if isAddrPrivate(netAddr, r.config.PrivatePeerIDs) {
+			continue
+		}
+
+		err := r.book.AddAddress(netAddr, srcAddr)
+		r.logErrAddrBook(err)
 	}
 	return nil
 }
 
 // SendAddrs sends addrs to the peer.
 func (r *PEXReactor) SendAddrs(p Peer, netAddrs []*p2p.NetAddress) {
-	p.Send(PexChannel, struct{ PexMessage }{&pexAddrsMessage{Addrs: netAddrs}})
+	p.Send(PexChannel, cdc.MustMarshalBinary(&pexAddrsMessage{Addrs: netAddrs}))
 }
 
 // SetEnsurePeersPeriod sets period to ensure peers connected.
@@ -290,7 +335,7 @@ func (r *PEXReactor) SetEnsurePeersPeriod(d time.Duration) {
 // Ensures that sufficient peers are connected. (continuous)
 func (r *PEXReactor) ensurePeersRoutine() {
 	var (
-		seed   = rand.New(rand.NewSource(time.Now().UnixNano()))
+		seed   = cmn.NewRand()
 		jitter = seed.Int63n(r.ensurePeersPeriod.Nanoseconds())
 	)
 
@@ -363,6 +408,9 @@ func (r *PEXReactor) ensurePeers() {
 		if connected := r.Switch.Peers().Has(try.ID); connected {
 			continue
 		}
+		// TODO: consider moving some checks from toDial into here
+		// so we don't even consider dialing peers that we want to wait
+		// before dialling again, or have dialed too many times already
 		r.Logger.Info("Will dial address", "addr", try)
 		toDial[try.ID] = try
 	}
@@ -377,7 +425,7 @@ func (r *PEXReactor) ensurePeers() {
 		peers := r.Switch.Peers().List()
 		peersCount := len(peers)
 		if peersCount > 0 {
-			peer := peers[rand.Int()%peersCount] // nolint: gas
+			peer := peers[cmn.RandInt()%peersCount] // nolint: gas
 			r.Logger.Info("We need more addresses. Sending pexRequest to random peer", "peer", peer)
 			r.RequestAddrs(peer)
 		}
@@ -390,13 +438,17 @@ func (r *PEXReactor) ensurePeers() {
 	}
 }
 
-func (r *PEXReactor) dialPeer(addr *p2p.NetAddress) {
-	var attempts int
-	var lastDialed time.Time
-	if lAttempts, attempted := r.attemptsToDial.Load(addr.DialString()); attempted {
-		attempts = lAttempts.(_attemptsToDial).number
-		lastDialed = lAttempts.(_attemptsToDial).lastDialed
+func (r *PEXReactor) dialAttemptsInfo(addr *p2p.NetAddress) (attempts int, lastDialed time.Time) {
+	_attempts, ok := r.attemptsToDial.Load(addr.DialString())
+	if !ok {
+		return
 	}
+	atd := _attempts.(_attemptsToDial)
+	return atd.number, atd.lastDialed
+}
+
+func (r *PEXReactor) dialPeer(addr *p2p.NetAddress) {
+	attempts, lastDialed := r.dialAttemptsInfo(addr)
 
 	if attempts > maxAttemptsToDial {
 		r.Logger.Error("Reached max attempts to dial", "addr", addr, "attempts", attempts)
@@ -406,7 +458,7 @@ func (r *PEXReactor) dialPeer(addr *p2p.NetAddress) {
 
 	// exponential backoff if it's not our first attempt to dial given address
 	if attempts > 0 {
-		jitterSeconds := time.Duration(rand.Float64() * float64(time.Second)) // 1s == (1e9 ns)
+		jitterSeconds := time.Duration(cmn.RandFloat64() * float64(time.Second)) // 1s == (1e9 ns)
 		backoffDuration := jitterSeconds + ((1 << uint(attempts)) * time.Second)
 		sinceLastDialed := time.Since(lastDialed)
 		if sinceLastDialed < backoffDuration {
@@ -459,7 +511,7 @@ func (r *PEXReactor) dialSeeds() {
 	}
 	seedAddrs, _ := p2p.NewNetAddressStrings(r.config.Seeds)
 
-	perm := rand.Perm(lSeeds)
+	perm := cmn.RandPerm(lSeeds)
 	// perm := r.Switch.rng.Perm(lSeeds)
 	for _, i := range perm {
 		// dial a random seed
@@ -593,7 +645,7 @@ func (r *PEXReactor) attemptDisconnects() {
 	}
 }
 
-// isAddrPrivate returns true if addr is private.
+// isAddrPrivate returns true if addr.ID is a private ID.
 func isAddrPrivate(addr *p2p.NetAddress, privatePeerIDs []string) bool {
 	for _, id := range privatePeerIDs {
 		if string(addr.ID) == id {
@@ -606,27 +658,23 @@ func isAddrPrivate(addr *p2p.NetAddress, privatePeerIDs []string) bool {
 //-----------------------------------------------------------------------------
 // Messages
 
-const (
-	msgTypeRequest = byte(0x01)
-	msgTypeAddrs   = byte(0x02)
-)
-
 // PexMessage is a primary type for PEX messages. Underneath, it could contain
 // either pexRequestMessage, or pexAddrsMessage messages.
 type PexMessage interface{}
 
-var _ = wire.RegisterInterface(
-	struct{ PexMessage }{},
-	wire.ConcreteType{&pexRequestMessage{}, msgTypeRequest},
-	wire.ConcreteType{&pexAddrsMessage{}, msgTypeAddrs},
-)
+func RegisterPexMessage(cdc *amino.Codec) {
+	cdc.RegisterInterface((*PexMessage)(nil), nil)
+	cdc.RegisterConcrete(&pexRequestMessage{}, "tendermint/p2p/PexRequestMessage", nil)
+	cdc.RegisterConcrete(&pexAddrsMessage{}, "tendermint/p2p/PexAddrsMessage", nil)
+}
 
 // DecodeMessage implements interface registered above.
-func DecodeMessage(bz []byte) (msgType byte, msg PexMessage, err error) {
-	msgType = bz[0]
-	n := new(int)
-	r := bytes.NewReader(bz)
-	msg = wire.ReadBinary(struct{ PexMessage }{}, r, maxPexMessageSize, n, &err).(struct{ PexMessage }).PexMessage
+func DecodeMessage(bz []byte) (msg PexMessage, err error) {
+	if len(bz) > maxMsgSize {
+		return msg, fmt.Errorf("Msg exceeds max size (%d > %d)",
+			len(bz), maxMsgSize)
+	}
+	err = cdc.UnmarshalBinary(bz, &msg)
 	return
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/p2p/pex/wire.go b/vendor/github.com/tendermint/tendermint/p2p/pex/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..57fc938582c3bd37314d330ba02e1ce496437716
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/p2p/pex/wire.go
@@ -0,0 +1,11 @@
+package pex
+
+import (
+	"github.com/tendermint/go-amino"
+)
+
+var cdc *amino.Codec = amino.NewCodec()
+
+func init() {
+	RegisterPexMessage(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/switch.go b/vendor/github.com/tendermint/tendermint/p2p/switch.go
index e412d3cc95b3cec4535a66c80a85dc4f273168b2..939af0bbfc96b7d177085dfa95e7229d749cf498 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/switch.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/switch.go
@@ -3,13 +3,10 @@ package p2p
 import (
 	"fmt"
 	"math"
-	"math/rand"
 	"net"
 	"sync"
 	"time"
 
-	"github.com/pkg/errors"
-
 	cfg "github.com/tendermint/tendermint/config"
 	"github.com/tendermint/tendermint/p2p/conn"
 	cmn "github.com/tendermint/tmlibs/common"
@@ -29,6 +26,10 @@ const (
 	// ie. 3**10 = 16hrs
 	reconnectBackOffAttempts    = 10
 	reconnectBackOffBaseSeconds = 3
+
+	// keep at least this many outbound peers
+	// TODO: move to config
+	DefaultMinNumOutboundPeers = 10
 )
 
 //-----------------------------------------------------------------------------
@@ -62,6 +63,7 @@ type Switch struct {
 	reactorsByCh map[byte]Reactor
 	peers        *PeerSet
 	dialing      *cmn.CMap
+	reconnecting *cmn.CMap
 	nodeInfo     NodeInfo // our node info
 	nodeKey      *NodeKey // our node privkey
 	addrBook     AddrBook
@@ -69,7 +71,7 @@ type Switch struct {
 	filterConnByAddr func(net.Addr) error
 	filterConnByID   func(ID) error
 
-	rng *rand.Rand // seed for randomizing dial times and orders
+	rng *cmn.Rand // seed for randomizing dial times and orders
 }
 
 // NewSwitch creates a new Switch with the given config.
@@ -82,18 +84,17 @@ func NewSwitch(config *cfg.P2PConfig) *Switch {
 		reactorsByCh: make(map[byte]Reactor),
 		peers:        NewPeerSet(),
 		dialing:      cmn.NewCMap(),
+		reconnecting: cmn.NewCMap(),
 	}
 
-	// Ensure we have a completely undeterministic PRNG. cmd.RandInt64() draws
-	// from a seed that's initialized with OS entropy on process start.
-	sw.rng = rand.New(rand.NewSource(cmn.RandInt64()))
+	// Ensure we have a completely undeterministic PRNG.
+	sw.rng = cmn.NewRand()
 
 	// TODO: collapse the peerConfig into the config ?
 	sw.peerConfig.MConfig.FlushThrottle = time.Duration(config.FlushThrottleTimeout) * time.Millisecond
 	sw.peerConfig.MConfig.SendRate = config.SendRate
 	sw.peerConfig.MConfig.RecvRate = config.RecvRate
-	sw.peerConfig.MConfig.MaxMsgPacketPayloadSize = config.MaxMsgPacketPayloadSize
-	sw.peerConfig.AuthEnc = config.AuthEnc
+	sw.peerConfig.MConfig.MaxPacketMsgPayloadSize = config.MaxPacketMsgPayloadSize
 
 	sw.BaseService = *cmn.NewBaseService(nil, "P2P Switch", sw)
 	return sw
@@ -178,7 +179,7 @@ func (sw *Switch) OnStart() error {
 	for _, reactor := range sw.reactors {
 		err := reactor.Start()
 		if err != nil {
-			return errors.Wrapf(err, "failed to start %v", reactor)
+			return cmn.ErrorWrap(err, "failed to start %v", reactor)
 		}
 	}
 	// Start listeners
@@ -213,18 +214,18 @@ func (sw *Switch) OnStop() {
 // Broadcast runs a go routine for each attempted send, which will block trying
 // to send for defaultSendTimeoutSeconds. Returns a channel which receives
 // success values for each attempted send (false if times out). Channel will be
-// closed once msg send to all peers.
+// closed once msg bytes are sent to all peers (or time out).
 //
 // NOTE: Broadcast uses goroutines, so order of broadcast may not be preserved.
-func (sw *Switch) Broadcast(chID byte, msg interface{}) chan bool {
+func (sw *Switch) Broadcast(chID byte, msgBytes []byte) chan bool {
 	successChan := make(chan bool, len(sw.peers.List()))
-	sw.Logger.Debug("Broadcast", "channel", chID, "msg", msg)
+	sw.Logger.Debug("Broadcast", "channel", chID, "msgBytes", fmt.Sprintf("%X", msgBytes))
 	var wg sync.WaitGroup
 	for _, peer := range sw.peers.List() {
 		wg.Add(1)
 		go func(peer Peer) {
 			defer wg.Done()
-			success := peer.Send(chID, msg)
+			success := peer.Send(chID, msgBytes)
 			successChan <- success
 		}(peer)
 	}
@@ -262,7 +263,8 @@ func (sw *Switch) StopPeerForError(peer Peer, reason interface{}) {
 	sw.stopAndRemovePeer(peer, reason)
 
 	if peer.IsPersistent() {
-		go sw.reconnectToPeer(peer)
+		// NOTE: this is the self-reported addr, not the original we dialed
+		go sw.reconnectToPeer(peer.NodeInfo().NetAddress())
 	}
 }
 
@@ -281,34 +283,41 @@ func (sw *Switch) stopAndRemovePeer(peer Peer, reason interface{}) {
 	}
 }
 
-// reconnectToPeer tries to reconnect to the peer, first repeatedly
+// reconnectToPeer tries to reconnect to the addr, first repeatedly
 // with a fixed interval, then with exponential backoff.
 // If no success after all that, it stops trying, and leaves it
-// to the PEX/Addrbook to find the peer again
-func (sw *Switch) reconnectToPeer(peer Peer) {
-	// NOTE this will connect to the self reported address,
-	// not necessarily the original we dialed
-	netAddr := peer.NodeInfo().NetAddress()
+// to the PEX/Addrbook to find the peer with the addr again
+// NOTE: this will keep trying even if the handshake or auth fails.
+// TODO: be more explicit with error types so we only retry on certain failures
+//  - ie. if we're getting ErrDuplicatePeer we can stop
+//  	because the addrbook got us the peer back already
+func (sw *Switch) reconnectToPeer(addr *NetAddress) {
+	if sw.reconnecting.Has(string(addr.ID)) {
+		return
+	}
+	sw.reconnecting.Set(string(addr.ID), addr)
+	defer sw.reconnecting.Delete(string(addr.ID))
+
 	start := time.Now()
-	sw.Logger.Info("Reconnecting to peer", "peer", peer)
+	sw.Logger.Info("Reconnecting to peer", "addr", addr)
 	for i := 0; i < reconnectAttempts; i++ {
 		if !sw.IsRunning() {
 			return
 		}
 
-		err := sw.DialPeerWithAddress(netAddr, true)
-		if err != nil {
-			sw.Logger.Info("Error reconnecting to peer. Trying again", "tries", i, "err", err, "peer", peer)
-			// sleep a set amount
-			sw.randomSleep(reconnectInterval)
-			continue
-		} else {
-			return
+		err := sw.DialPeerWithAddress(addr, true)
+		if err == nil {
+			return // success
 		}
+
+		sw.Logger.Info("Error reconnecting to peer. Trying again", "tries", i, "err", err, "addr", addr)
+		// sleep a set amount
+		sw.randomSleep(reconnectInterval)
+		continue
 	}
 
 	sw.Logger.Error("Failed to reconnect to peer. Beginning exponential backoff",
-		"peer", peer, "elapsed", time.Since(start))
+		"addr", addr, "elapsed", time.Since(start))
 	for i := 0; i < reconnectBackOffAttempts; i++ {
 		if !sw.IsRunning() {
 			return
@@ -317,13 +326,13 @@ func (sw *Switch) reconnectToPeer(peer Peer) {
 		// sleep an exponentially increasing amount
 		sleepIntervalSeconds := math.Pow(reconnectBackOffBaseSeconds, float64(i))
 		sw.randomSleep(time.Duration(sleepIntervalSeconds) * time.Second)
-		err := sw.DialPeerWithAddress(netAddr, true)
+		err := sw.DialPeerWithAddress(addr, true)
 		if err == nil {
 			return // success
 		}
-		sw.Logger.Info("Error reconnecting to peer. Trying again", "tries", i, "err", err, "peer", peer)
+		sw.Logger.Info("Error reconnecting to peer. Trying again", "tries", i, "err", err, "addr", addr)
 	}
-	sw.Logger.Error("Failed to reconnect to peer. Giving up", "peer", peer, "elapsed", time.Since(start))
+	sw.Logger.Error("Failed to reconnect to peer. Giving up", "addr", addr, "elapsed", time.Since(start))
 }
 
 // SetAddrBook allows to set address book on Switch.
@@ -348,6 +357,8 @@ func (sw *Switch) IsDialing(id ID) bool {
 }
 
 // DialPeersAsync dials a list of peers asynchronously in random order (optionally, making them persistent).
+// Used to dial peers from config on startup or from unsafe-RPC (trusted sources).
+// TODO: remove addrBook arg since it's now set on the switch
 func (sw *Switch) DialPeersAsync(addrBook AddrBook, peers []string, persistent bool) error {
 	netAddrs, errs := NewNetAddressStrings(peers)
 	// only log errors, dial correct addresses
@@ -357,13 +368,18 @@ func (sw *Switch) DialPeersAsync(addrBook AddrBook, peers []string, persistent b
 
 	ourAddr := sw.nodeInfo.NetAddress()
 
-	// TODO: move this out of here ?
+	// TODO: this code feels like it's in the wrong place.
+	// The integration tests depend on the addrBook being saved
+	// right away but maybe we can change that. Recall that
+	// the addrBook is only written to disk every 2min
 	if addrBook != nil {
 		// add peers to `addrBook`
 		for _, netAddr := range netAddrs {
 			// do not add our address or ID
 			if !netAddr.Same(ourAddr) {
-				addrBook.AddAddress(netAddr, ourAddr)
+				if err := addrBook.AddAddress(netAddr, ourAddr); err != nil {
+					sw.Logger.Error("Can't add peer's address to addrbook", "err", err)
+				}
 			}
 		}
 		// Persist some peers to disk right away.
@@ -377,15 +393,21 @@ func (sw *Switch) DialPeersAsync(addrBook AddrBook, peers []string, persistent b
 		go func(i int) {
 			j := perm[i]
 
+			addr := netAddrs[j]
 			// do not dial ourselves
-			if netAddrs[j].Same(ourAddr) {
+			if addr.Same(ourAddr) {
 				return
 			}
 
 			sw.randomSleep(0)
-			err := sw.DialPeerWithAddress(netAddrs[j], persistent)
+			err := sw.DialPeerWithAddress(addr, persistent)
 			if err != nil {
-				sw.Logger.Error("Error dialing peer", "err", err)
+				switch err.(type) {
+				case ErrSwitchConnectToSelf, ErrSwitchDuplicatePeerID:
+					sw.Logger.Debug("Error dialing peer", "err", err)
+				default:
+					sw.Logger.Error("Error dialing peer", "err", err)
+				}
 			}
 		}(i)
 	}
@@ -446,7 +468,8 @@ func (sw *Switch) listenerRoutine(l Listener) {
 		}
 
 		// ignore connection if we already have enough
-		maxPeers := sw.config.MaxNumPeers
+		// leave room for MinNumOutboundPeers
+		maxPeers := sw.config.MaxNumPeers - DefaultMinNumOutboundPeers
 		if maxPeers <= sw.peers.Size() {
 			sw.Logger.Info("Ignoring inbound connection: already have enough peers", "address", inConn.RemoteAddr().String(), "numPeers", sw.peers.Size(), "max", maxPeers)
 			continue
@@ -479,16 +502,19 @@ func (sw *Switch) addInboundPeerWithConfig(conn net.Conn, config *PeerConfig) er
 
 // dial the peer; make secret connection; authenticate against the dialed ID;
 // add the peer.
+// if dialing fails, start the reconnect loop. If handhsake fails, its over.
+// If peer is started succesffuly, reconnectLoop will start when StopPeerForError is called
 func (sw *Switch) addOutboundPeerWithConfig(addr *NetAddress, config *PeerConfig, persistent bool) error {
 	sw.Logger.Info("Dialing peer", "address", addr)
 	peerConn, err := newOutboundPeerConn(addr, config, persistent, sw.nodeKey.PrivKey)
 	if err != nil {
-		sw.Logger.Error("Failed to dial peer", "address", addr, "err", err)
+		if persistent {
+			go sw.reconnectToPeer(addr)
+		}
 		return err
 	}
 
 	if err := sw.addPeer(peerConn); err != nil {
-		sw.Logger.Error("Failed to add peer", "address", addr, "err", err)
 		peerConn.CloseConn()
 		return err
 	}
@@ -507,26 +533,23 @@ func (sw *Switch) addPeer(pc peerConn) error {
 		return err
 	}
 
-	// NOTE: if AuthEnc==false, we don't have a peerID until after the handshake.
-	// If AuthEnc==true then we already know the ID and could do the checks first before the handshake,
-	// but it's simple to just deal with both cases the same after the handshake.
-
 	// Exchange NodeInfo on the conn
 	peerNodeInfo, err := pc.HandshakeTimeout(sw.nodeInfo, time.Duration(sw.peerConfig.HandshakeTimeout*time.Second))
 	if err != nil {
 		return err
 	}
 
-	peerID := peerNodeInfo.ID()
+	peerID := peerNodeInfo.ID
 
 	// ensure connection key matches self reported key
-	if pc.config.AuthEnc {
-		connID := pc.ID()
+	connID := pc.ID()
 
-		if peerID != connID {
-			return fmt.Errorf("nodeInfo.ID() (%v) doesn't match conn.ID() (%v)",
-				peerID, connID)
-		}
+	if peerID != connID {
+		return fmt.Errorf(
+			"nodeInfo.ID() (%v) doesn't match conn.ID() (%v)",
+			peerID,
+			connID,
+		)
 	}
 
 	// Validate the peers nodeInfo
@@ -537,20 +560,23 @@ func (sw *Switch) addPeer(pc peerConn) error {
 	// Avoid self
 	if sw.nodeKey.ID() == peerID {
 		addr := peerNodeInfo.NetAddress()
-
-		// remove the given address from the address book if we're added it earlier
+		// remove the given address from the address book
+		// and add to our addresses to avoid dialing again
 		sw.addrBook.RemoveAddress(addr)
-
-		// add the given address to the address book to avoid dialing ourselves
-		// again this is our public address
 		sw.addrBook.AddOurAddress(addr)
-
-		return ErrSwitchConnectToSelf
+		return ErrSwitchConnectToSelf{addr}
 	}
 
 	// Avoid duplicate
 	if sw.peers.Has(peerID) {
-		return ErrSwitchDuplicatePeer
+		return ErrSwitchDuplicatePeerID{peerID}
+	}
+
+	// Check for duplicate connection or peer info IP.
+	if !sw.config.AllowDuplicateIP &&
+		(sw.peers.HasIP(pc.RemoteIP()) ||
+			sw.peers.HasIP(peerNodeInfo.NetAddress().IP)) {
+		return ErrSwitchDuplicatePeerIP{pc.RemoteIP()}
 	}
 
 	// Filter peer against ID white list
diff --git a/vendor/github.com/tendermint/tendermint/p2p/test_util.go b/vendor/github.com/tendermint/tendermint/p2p/test_util.go
index 535b0bd0b207c2ee907be8fe03d6804b3c61ce4c..b5b739af94eb8ac03b046378892e97836c921111 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/test_util.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/test_util.go
@@ -1,7 +1,7 @@
 package p2p
 
 import (
-	"math/rand"
+	"fmt"
 	"net"
 
 	crypto "github.com/tendermint/go-crypto"
@@ -23,8 +23,8 @@ func CreateRandomPeer(outbound bool) *peer {
 			outbound: outbound,
 		},
 		nodeInfo: NodeInfo{
+			ID:         netAddr.ID,
 			ListenAddr: netAddr.DialString(),
-			PubKey:     crypto.GenPrivKeyEd25519().Wrap().PubKey(),
 		},
 		mconn: &conn.MConnection{},
 	}
@@ -35,7 +35,7 @@ func CreateRandomPeer(outbound bool) *peer {
 func CreateRoutableAddr() (addr string, netAddr *NetAddress) {
 	for {
 		var err error
-		addr = cmn.Fmt("%X@%v.%v.%v.%v:46656", cmn.RandBytes(20), rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%256)
+		addr = cmn.Fmt("%X@%v.%v.%v.%v:46656", cmn.RandBytes(20), cmn.RandInt()%256, cmn.RandInt()%256, cmn.RandInt()%256, cmn.RandInt()%256)
 		netAddr, err = NewNetAddressString(addr)
 		if err != nil {
 			panic(err)
@@ -50,6 +50,8 @@ func CreateRoutableAddr() (addr string, netAddr *NetAddress) {
 //------------------------------------------------------------------
 // Connects switches via arbitrary net.Conn. Used for testing.
 
+const TEST_HOST = "localhost"
+
 // MakeConnectedSwitches returns n switches, connected according to the connect func.
 // If connect==Connect2Switches, the switches will be fully connected.
 // initSwitch defines how the i'th switch should be initialized (ie. with what reactors).
@@ -57,7 +59,7 @@ func CreateRoutableAddr() (addr string, netAddr *NetAddress) {
 func MakeConnectedSwitches(cfg *cfg.P2PConfig, n int, initSwitch func(int, *Switch) *Switch, connect func([]*Switch, int, int)) []*Switch {
 	switches := make([]*Switch, n)
 	for i := 0; i < n; i++ {
-		switches[i] = MakeSwitch(cfg, i, "testing", "123.123.123", initSwitch)
+		switches[i] = MakeSwitch(cfg, i, TEST_HOST, "123.123.123", initSwitch)
 	}
 
 	if err := StartSwitches(switches); err != nil {
@@ -79,7 +81,9 @@ func MakeConnectedSwitches(cfg *cfg.P2PConfig, n int, initSwitch func(int, *Swit
 func Connect2Switches(switches []*Switch, i, j int) {
 	switchI := switches[i]
 	switchJ := switches[j]
+
 	c1, c2 := conn.NetPipe()
+
 	doneCh := make(chan struct{})
 	go func() {
 		err := switchI.addPeerWithConnection(c1)
@@ -131,17 +135,17 @@ func MakeSwitch(cfg *cfg.P2PConfig, i int, network, version string, initSwitch f
 	// new switch, add reactors
 	// TODO: let the config be passed in?
 	nodeKey := &NodeKey{
-		PrivKey: crypto.GenPrivKeyEd25519().Wrap(),
+		PrivKey: crypto.GenPrivKeyEd25519(),
 	}
 	sw := NewSwitch(cfg)
 	sw.SetLogger(log.TestingLogger())
 	sw = initSwitch(i, sw)
 	ni := NodeInfo{
-		PubKey:     nodeKey.PubKey(),
+		ID:         nodeKey.ID(),
 		Moniker:    cmn.Fmt("switch%d", i),
 		Network:    network,
 		Version:    version,
-		ListenAddr: cmn.Fmt("%v:%v", network, rand.Intn(64512)+1023),
+		ListenAddr: fmt.Sprintf("127.0.0.1:%d", cmn.RandIntn(64512)+1023),
 	}
 	for ch := range sw.reactorsByCh {
 		ni.Channels = append(ni.Channels, ch)
diff --git a/vendor/github.com/tendermint/tendermint/p2p/trust/config.go b/vendor/github.com/tendermint/tendermint/p2p/trust/config.go
deleted file mode 100644
index b20a8b2cbdaefb284cedb2c605145c725139cae1..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/p2p/trust/config.go
+++ /dev/null
@@ -1,55 +0,0 @@
-package trust
-
-import "time"
-
-// TrustMetricConfig - Configures the weight functions and time intervals for the metric
-type TrustMetricConfig struct {
-	// Determines the percentage given to current behavior
-	ProportionalWeight float64
-
-	// Determines the percentage given to prior behavior
-	IntegralWeight float64
-
-	// The window of time that the trust metric will track events across.
-	// This can be set to cover many days without issue
-	TrackingWindow time.Duration
-
-	// Each interval should be short for adapability.
-	// Less than 30 seconds is too sensitive,
-	// and greater than 5 minutes will make the metric numb
-	IntervalLength time.Duration
-}
-
-// DefaultConfig returns a config with values that have been tested and produce desirable results
-func DefaultConfig() TrustMetricConfig {
-	return TrustMetricConfig{
-		ProportionalWeight: 0.4,
-		IntegralWeight:     0.6,
-		TrackingWindow:     (time.Minute * 60 * 24) * 14, // 14 days.
-		IntervalLength:     1 * time.Minute,
-	}
-}
-
-// Ensures that all configuration elements have valid values
-func customConfig(tmc TrustMetricConfig) TrustMetricConfig {
-	config := DefaultConfig()
-
-	// Check the config for set values, and setup appropriately
-	if tmc.ProportionalWeight > 0 {
-		config.ProportionalWeight = tmc.ProportionalWeight
-	}
-
-	if tmc.IntegralWeight > 0 {
-		config.IntegralWeight = tmc.IntegralWeight
-	}
-
-	if tmc.IntervalLength > time.Duration(0) {
-		config.IntervalLength = tmc.IntervalLength
-	}
-
-	if tmc.TrackingWindow > time.Duration(0) &&
-		tmc.TrackingWindow >= config.IntervalLength {
-		config.TrackingWindow = tmc.TrackingWindow
-	}
-	return config
-}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/trust/metric.go b/vendor/github.com/tendermint/tendermint/p2p/trust/metric.go
deleted file mode 100644
index 5770b4208dbc97a2972aceb39afd88b6b651f6c2..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/p2p/trust/metric.go
+++ /dev/null
@@ -1,411 +0,0 @@
-// Copyright 2017 Tendermint. All rights reserved.
-// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
-
-package trust
-
-import (
-	"math"
-	"sync"
-	"time"
-
-	cmn "github.com/tendermint/tmlibs/common"
-)
-
-//---------------------------------------------------------------------------------------
-
-const (
-	// The weight applied to the derivative when current behavior is >= previous behavior
-	defaultDerivativeGamma1 = 0
-
-	// The weight applied to the derivative when current behavior is less than previous behavior
-	defaultDerivativeGamma2 = 1.0
-
-	// The weight applied to history data values when calculating the history value
-	defaultHistoryDataWeight = 0.8
-)
-
-// MetricHistoryJSON - history data necessary to save the trust metric
-type MetricHistoryJSON struct {
-	NumIntervals int       `json:"intervals"`
-	History      []float64 `json:"history"`
-}
-
-// TrustMetric - keeps track of peer reliability
-// See tendermint/docs/architecture/adr-006-trust-metric.md for details
-type TrustMetric struct {
-	cmn.BaseService
-
-	// Mutex that protects the metric from concurrent access
-	mtx sync.Mutex
-
-	// Determines the percentage given to current behavior
-	proportionalWeight float64
-
-	// Determines the percentage given to prior behavior
-	integralWeight float64
-
-	// Count of how many time intervals this metric has been tracking
-	numIntervals int
-
-	// Size of the time interval window for this trust metric
-	maxIntervals int
-
-	// The time duration for a single time interval
-	intervalLen time.Duration
-
-	// Stores the trust history data for this metric
-	history []float64
-
-	// Weights applied to the history data when calculating the history value
-	historyWeights []float64
-
-	// The sum of the history weights used when calculating the history value
-	historyWeightSum float64
-
-	// The current number of history data elements
-	historySize int
-
-	// The maximum number of history data elements
-	historyMaxSize int
-
-	// The calculated history value for the current time interval
-	historyValue float64
-
-	// The number of recorded good and bad events for the current time interval
-	bad, good float64
-
-	// While true, history data is not modified
-	paused bool
-
-	// Used during testing in order to control the passing of time intervals
-	testTicker MetricTicker
-}
-
-// NewMetric returns a trust metric with the default configuration.
-// Use Start to begin tracking the quality of peer behavior over time
-func NewMetric() *TrustMetric {
-	return NewMetricWithConfig(DefaultConfig())
-}
-
-// NewMetricWithConfig returns a trust metric with a custom configuration.
-// Use Start to begin tracking the quality of peer behavior over time
-func NewMetricWithConfig(tmc TrustMetricConfig) *TrustMetric {
-	tm := new(TrustMetric)
-	config := customConfig(tmc)
-
-	// Setup using the configuration values
-	tm.proportionalWeight = config.ProportionalWeight
-	tm.integralWeight = config.IntegralWeight
-	tm.intervalLen = config.IntervalLength
-	// The maximum number of time intervals is the tracking window / interval length
-	tm.maxIntervals = int(config.TrackingWindow / tm.intervalLen)
-	// The history size will be determined by the maximum number of time intervals
-	tm.historyMaxSize = intervalToHistoryOffset(tm.maxIntervals) + 1
-	// This metric has a perfect history so far
-	tm.historyValue = 1.0
-
-	tm.BaseService = *cmn.NewBaseService(nil, "TrustMetric", tm)
-	return tm
-}
-
-// OnStart implements Service
-func (tm *TrustMetric) OnStart() error {
-	if err := tm.BaseService.OnStart(); err != nil {
-		return err
-	}
-	go tm.processRequests()
-	return nil
-}
-
-// OnStop implements Service
-// Nothing to do since the goroutine shuts down by itself via BaseService.Quit()
-func (tm *TrustMetric) OnStop() {}
-
-// Returns a snapshot of the trust metric history data
-func (tm *TrustMetric) HistoryJSON() MetricHistoryJSON {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-
-	return MetricHistoryJSON{
-		NumIntervals: tm.numIntervals,
-		History:      tm.history,
-	}
-}
-
-// Instantiates a trust metric by loading the history data for a single peer.
-// This is called only once and only right after creation, which is why the
-// lock is not held while accessing the trust metric struct members
-func (tm *TrustMetric) Init(hist MetricHistoryJSON) {
-	// Restore the number of time intervals we have previously tracked
-	if hist.NumIntervals > tm.maxIntervals {
-		hist.NumIntervals = tm.maxIntervals
-	}
-	tm.numIntervals = hist.NumIntervals
-	// Restore the history and its current size
-	if len(hist.History) > tm.historyMaxSize {
-		// Keep the history no larger than historyMaxSize
-		last := len(hist.History) - tm.historyMaxSize
-		hist.History = hist.History[last:]
-	}
-	tm.history = hist.History
-	tm.historySize = len(tm.history)
-	// Create the history weight values and weight sum
-	for i := 1; i <= tm.numIntervals; i++ {
-		x := math.Pow(defaultHistoryDataWeight, float64(i)) // Optimistic weight
-		tm.historyWeights = append(tm.historyWeights, x)
-	}
-
-	for _, v := range tm.historyWeights {
-		tm.historyWeightSum += v
-	}
-	// Calculate the history value based on the loaded history data
-	tm.historyValue = tm.calcHistoryValue()
-}
-
-// Pause tells the metric to pause recording data over time intervals.
-// All method calls that indicate events will unpause the metric
-func (tm *TrustMetric) Pause() {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-
-	// Pause the metric for now
-	tm.paused = true
-}
-
-// BadEvents indicates that an undesirable event(s) took place
-func (tm *TrustMetric) BadEvents(num int) {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-
-	tm.unpause()
-	tm.bad += float64(num)
-}
-
-// GoodEvents indicates that a desirable event(s) took place
-func (tm *TrustMetric) GoodEvents(num int) {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-
-	tm.unpause()
-	tm.good += float64(num)
-}
-
-// TrustValue gets the dependable trust value; always between 0 and 1
-func (tm *TrustMetric) TrustValue() float64 {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-
-	return tm.calcTrustValue()
-}
-
-// TrustScore gets a score based on the trust value always between 0 and 100
-func (tm *TrustMetric) TrustScore() int {
-	score := tm.TrustValue() * 100
-
-	return int(math.Floor(score))
-}
-
-// NextTimeInterval saves current time interval data and prepares for the following interval
-func (tm *TrustMetric) NextTimeInterval() {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-
-	if tm.paused {
-		// Do not prepare for the next time interval while paused
-		return
-	}
-
-	// Add the current trust value to the history data
-	newHist := tm.calcTrustValue()
-	tm.history = append(tm.history, newHist)
-
-	// Update history and interval counters
-	if tm.historySize < tm.historyMaxSize {
-		tm.historySize++
-	} else {
-		// Keep the history no larger than historyMaxSize
-		last := len(tm.history) - tm.historyMaxSize
-		tm.history = tm.history[last:]
-	}
-
-	if tm.numIntervals < tm.maxIntervals {
-		tm.numIntervals++
-		// Add the optimistic weight for the new time interval
-		wk := math.Pow(defaultHistoryDataWeight, float64(tm.numIntervals))
-		tm.historyWeights = append(tm.historyWeights, wk)
-		tm.historyWeightSum += wk
-	}
-
-	// Update the history data using Faded Memories
-	tm.updateFadedMemory()
-	// Calculate the history value for the upcoming time interval
-	tm.historyValue = tm.calcHistoryValue()
-	tm.good = 0
-	tm.bad = 0
-}
-
-// SetTicker allows a TestTicker to be provided that will manually control
-// the passing of time from the perspective of the TrustMetric.
-// The ticker must be set before Start is called on the metric
-func (tm *TrustMetric) SetTicker(ticker MetricTicker) {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-
-	tm.testTicker = ticker
-}
-
-// Copy returns a new trust metric with members containing the same values
-func (tm *TrustMetric) Copy() *TrustMetric {
-	tm.mtx.Lock()
-	defer tm.mtx.Unlock()
-	if tm == nil {
-		return nil
-	}
-
-	return &TrustMetric{
-		proportionalWeight: tm.proportionalWeight,
-		integralWeight:     tm.integralWeight,
-		numIntervals:       tm.numIntervals,
-		maxIntervals:       tm.maxIntervals,
-		intervalLen:        tm.intervalLen,
-		history:            tm.history,
-		historyWeights:     tm.historyWeights,
-		historyWeightSum:   tm.historyWeightSum,
-		historySize:        tm.historySize,
-		historyMaxSize:     tm.historyMaxSize,
-		historyValue:       tm.historyValue,
-		good:               tm.good,
-		bad:                tm.bad,
-		paused:             tm.paused,
-	}
-
-}
-
-/* Private methods */
-
-// This method is for a goroutine that handles all requests on the metric
-func (tm *TrustMetric) processRequests() {
-	t := tm.testTicker
-	if t == nil {
-		// No test ticker was provided, so we create a normal ticker
-		t = NewTicker(tm.intervalLen)
-	}
-	defer t.Stop()
-	// Obtain the raw channel
-	tick := t.GetChannel()
-loop:
-	for {
-		select {
-		case <-tick:
-			tm.NextTimeInterval()
-		case <-tm.Quit():
-			// Stop all further tracking for this metric
-			break loop
-		}
-	}
-}
-
-// Wakes the trust metric up if it is currently paused
-// This method needs to be called with the mutex locked
-func (tm *TrustMetric) unpause() {
-	// Check if this is the first experience with
-	// what we are tracking since being paused
-	if tm.paused {
-		tm.good = 0
-		tm.bad = 0
-		// New events cause us to unpause the metric
-		tm.paused = false
-	}
-}
-
-// Calculates the trust value for the request processing
-func (tm *TrustMetric) calcTrustValue() float64 {
-	weightedP := tm.proportionalWeight * tm.proportionalValue()
-	weightedI := tm.integralWeight * tm.historyValue
-	weightedD := tm.weightedDerivative()
-
-	tv := weightedP + weightedI + weightedD
-	// Do not return a negative value.
-	if tv < 0 {
-		tv = 0
-	}
-	return tv
-}
-
-// Calculates the current score for good/bad experiences
-func (tm *TrustMetric) proportionalValue() float64 {
-	value := 1.0
-
-	total := tm.good + tm.bad
-	if total > 0 {
-		value = tm.good / total
-	}
-	return value
-}
-
-// Strengthens the derivative component when the change is negative
-func (tm *TrustMetric) weightedDerivative() float64 {
-	var weight float64 = defaultDerivativeGamma1
-
-	d := tm.derivativeValue()
-	if d < 0 {
-		weight = defaultDerivativeGamma2
-	}
-	return weight * d
-}
-
-// Calculates the derivative component
-func (tm *TrustMetric) derivativeValue() float64 {
-	return tm.proportionalValue() - tm.historyValue
-}
-
-// Calculates the integral (history) component of the trust value
-func (tm *TrustMetric) calcHistoryValue() float64 {
-	var hv float64
-
-	for i := 0; i < tm.numIntervals; i++ {
-		hv += tm.fadedMemoryValue(i) * tm.historyWeights[i]
-	}
-
-	return hv / tm.historyWeightSum
-}
-
-// Retrieves the actual history data value that represents the requested time interval
-func (tm *TrustMetric) fadedMemoryValue(interval int) float64 {
-	first := tm.historySize - 1
-
-	if interval == 0 {
-		// Base case
-		return tm.history[first]
-	}
-
-	offset := intervalToHistoryOffset(interval)
-	return tm.history[first-offset]
-}
-
-// Performs the update for our Faded Memories process, which allows the
-// trust metric tracking window to be large while maintaining a small
-// number of history data values
-func (tm *TrustMetric) updateFadedMemory() {
-	if tm.historySize < 2 {
-		return
-	}
-
-	end := tm.historySize - 1
-	// Keep the most recent history element
-	for count := 1; count < tm.historySize; count++ {
-		i := end - count
-		// The older the data is, the more we spread it out
-		x := math.Pow(2, float64(count))
-		// Two history data values are merged into a single value
-		tm.history[i] = ((tm.history[i] * (x - 1)) + tm.history[i+1]) / x
-	}
-}
-
-// Map the interval value down to an offset from the beginning of history
-func intervalToHistoryOffset(interval int) int {
-	// The system maintains 2^m interval values in the form of m history
-	// data values. Therefore, we access the ith interval by obtaining
-	// the history data index = the floor of log2(i)
-	return int(math.Floor(math.Log2(float64(interval))))
-}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/trust/store.go b/vendor/github.com/tendermint/tendermint/p2p/trust/store.go
deleted file mode 100644
index bbb4592a4574855007d2ccd1b6bc24882e7e9ec4..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/p2p/trust/store.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright 2017 Tendermint. All rights reserved.
-// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
-
-package trust
-
-import (
-	"encoding/json"
-	"sync"
-	"time"
-
-	cmn "github.com/tendermint/tmlibs/common"
-	dbm "github.com/tendermint/tmlibs/db"
-)
-
-const defaultStorePeriodicSaveInterval = 1 * time.Minute
-
-var trustMetricKey = []byte("trustMetricStore")
-
-// TrustMetricStore - Manages all trust metrics for peers
-type TrustMetricStore struct {
-	cmn.BaseService
-
-	// Maps a Peer.Key to that peer's TrustMetric
-	peerMetrics map[string]*TrustMetric
-
-	// Mutex that protects the map and history data file
-	mtx sync.Mutex
-
-	// The db where peer trust metric history data will be stored
-	db dbm.DB
-
-	// This configuration will be used when creating new TrustMetrics
-	config TrustMetricConfig
-}
-
-// NewTrustMetricStore returns a store that saves data to the DB
-// and uses the config when creating new trust metrics.
-// Use Start to to initialize the trust metric store
-func NewTrustMetricStore(db dbm.DB, tmc TrustMetricConfig) *TrustMetricStore {
-	tms := &TrustMetricStore{
-		peerMetrics: make(map[string]*TrustMetric),
-		db:          db,
-		config:      tmc,
-	}
-
-	tms.BaseService = *cmn.NewBaseService(nil, "TrustMetricStore", tms)
-	return tms
-}
-
-// OnStart implements Service
-func (tms *TrustMetricStore) OnStart() error {
-	if err := tms.BaseService.OnStart(); err != nil {
-		return err
-	}
-
-	tms.mtx.Lock()
-	defer tms.mtx.Unlock()
-
-	tms.loadFromDB()
-	go tms.saveRoutine()
-	return nil
-}
-
-// OnStop implements Service
-func (tms *TrustMetricStore) OnStop() {
-	tms.BaseService.OnStop()
-
-	tms.mtx.Lock()
-	defer tms.mtx.Unlock()
-
-	// Stop all trust metric go-routines
-	for _, tm := range tms.peerMetrics {
-		tm.Stop()
-	}
-
-	// Make the final trust history data save
-	tms.saveToDB()
-}
-
-// Size returns the number of entries in the trust metric store
-func (tms *TrustMetricStore) Size() int {
-	tms.mtx.Lock()
-	defer tms.mtx.Unlock()
-
-	return tms.size()
-}
-
-// AddPeerTrustMetric takes an existing trust metric and associates it with a peer key.
-// The caller is expected to call Start on the TrustMetric being added
-func (tms *TrustMetricStore) AddPeerTrustMetric(key string, tm *TrustMetric) {
-	tms.mtx.Lock()
-	defer tms.mtx.Unlock()
-
-	if key == "" || tm == nil {
-		return
-	}
-	tms.peerMetrics[key] = tm
-}
-
-// GetPeerTrustMetric returns a trust metric by peer key
-func (tms *TrustMetricStore) GetPeerTrustMetric(key string) *TrustMetric {
-	tms.mtx.Lock()
-	defer tms.mtx.Unlock()
-
-	tm, ok := tms.peerMetrics[key]
-	if !ok {
-		// If the metric is not available, we will create it
-		tm = NewMetricWithConfig(tms.config)
-		tm.Start()
-		// The metric needs to be in the map
-		tms.peerMetrics[key] = tm
-	}
-	return tm
-}
-
-// PeerDisconnected pauses the trust metric associated with the peer identified by the key
-func (tms *TrustMetricStore) PeerDisconnected(key string) {
-	tms.mtx.Lock()
-	defer tms.mtx.Unlock()
-
-	// If the Peer that disconnected has a metric, pause it
-	if tm, ok := tms.peerMetrics[key]; ok {
-		tm.Pause()
-	}
-}
-
-// Saves the history data for all peers to the store DB.
-// This public method acquires the trust metric store lock
-func (tms *TrustMetricStore) SaveToDB() {
-	tms.mtx.Lock()
-	defer tms.mtx.Unlock()
-
-	tms.saveToDB()
-}
-
-/* Private methods */
-
-// size returns the number of entries in the store without acquiring the mutex
-func (tms *TrustMetricStore) size() int {
-	return len(tms.peerMetrics)
-}
-
-/* Loading & Saving */
-/* Both loadFromDB and savetoDB assume the mutex has been acquired */
-
-// Loads the history data for all peers from the store DB
-// cmn.Panics if file is corrupt
-func (tms *TrustMetricStore) loadFromDB() bool {
-	// Obtain the history data we have so far
-	bytes := tms.db.Get(trustMetricKey)
-	if bytes == nil {
-		return false
-	}
-
-	peers := make(map[string]MetricHistoryJSON)
-	err := json.Unmarshal(bytes, &peers)
-	if err != nil {
-		cmn.PanicCrisis(cmn.Fmt("Could not unmarshal Trust Metric Store DB data: %v", err))
-	}
-
-	// If history data exists in the file,
-	// load it into trust metric
-	for key, p := range peers {
-		tm := NewMetricWithConfig(tms.config)
-
-		tm.Start()
-		tm.Init(p)
-		// Load the peer trust metric into the store
-		tms.peerMetrics[key] = tm
-	}
-	return true
-}
-
-// Saves the history data for all peers to the store DB
-func (tms *TrustMetricStore) saveToDB() {
-	tms.Logger.Debug("Saving TrustHistory to DB", "size", tms.size())
-
-	peers := make(map[string]MetricHistoryJSON)
-
-	for key, tm := range tms.peerMetrics {
-		// Add an entry for the peer identified by key
-		peers[key] = tm.HistoryJSON()
-	}
-
-	// Write all the data back to the DB
-	bytes, err := json.Marshal(peers)
-	if err != nil {
-		tms.Logger.Error("Failed to encode the TrustHistory", "err", err)
-		return
-	}
-	tms.db.SetSync(trustMetricKey, bytes)
-}
-
-// Periodically saves the trust history data to the DB
-func (tms *TrustMetricStore) saveRoutine() {
-	t := time.NewTicker(defaultStorePeriodicSaveInterval)
-	defer t.Stop()
-loop:
-	for {
-		select {
-		case <-t.C:
-			tms.SaveToDB()
-		case <-tms.Quit():
-			break loop
-		}
-	}
-}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/trust/ticker.go b/vendor/github.com/tendermint/tendermint/p2p/trust/ticker.go
deleted file mode 100644
index 3f0f3091928217c6b8569751f6a64e7027ebebab..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/p2p/trust/ticker.go
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2017 Tendermint. All rights reserved.
-// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
-
-package trust
-
-import (
-	"time"
-)
-
-// MetricTicker provides a single ticker interface for the trust metric
-type MetricTicker interface {
-	// GetChannel returns the receive only channel that fires at each time interval
-	GetChannel() <-chan time.Time
-
-	// Stop will halt further activity on the ticker channel
-	Stop()
-}
-
-// The ticker used during testing that provides manual control over time intervals
-type TestTicker struct {
-	C       chan time.Time
-	stopped bool
-}
-
-// NewTestTicker returns our ticker used within test routines
-func NewTestTicker() *TestTicker {
-	c := make(chan time.Time)
-	return &TestTicker{
-		C: c,
-	}
-}
-
-func (t *TestTicker) GetChannel() <-chan time.Time {
-	return t.C
-}
-
-func (t *TestTicker) Stop() {
-	t.stopped = true
-}
-
-// NextInterval manually sends Time on the ticker channel
-func (t *TestTicker) NextTick() {
-	if t.stopped {
-		return
-	}
-	t.C <- time.Now()
-}
-
-// Ticker is just a wrap around time.Ticker that allows it
-// to meet the requirements of our interface
-type Ticker struct {
-	*time.Ticker
-}
-
-// NewTicker returns a normal time.Ticker wrapped to meet our interface
-func NewTicker(d time.Duration) *Ticker {
-	return &Ticker{time.NewTicker(d)}
-}
-
-func (t *Ticker) GetChannel() <-chan time.Time {
-	return t.C
-}
diff --git a/vendor/github.com/tendermint/tendermint/p2p/upnp/probe.go b/vendor/github.com/tendermint/tendermint/p2p/upnp/probe.go
index d2338b95e8d775007ba007af83ed6c92954db9d8..55479415f08c8d6589acd1a4c268d539b2dfc2b6 100644
--- a/vendor/github.com/tendermint/tendermint/p2p/upnp/probe.go
+++ b/vendor/github.com/tendermint/tendermint/p2p/upnp/probe.go
@@ -5,8 +5,6 @@ import (
 	"net"
 	"time"
 
-	"github.com/pkg/errors"
-
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/log"
 )
@@ -19,26 +17,26 @@ type UPNPCapabilities struct {
 func makeUPNPListener(intPort int, extPort int, logger log.Logger) (NAT, net.Listener, net.IP, error) {
 	nat, err := Discover()
 	if err != nil {
-		return nil, nil, nil, errors.Errorf("NAT upnp could not be discovered: %v", err)
+		return nil, nil, nil, fmt.Errorf("NAT upnp could not be discovered: %v", err)
 	}
 	logger.Info(cmn.Fmt("ourIP: %v", nat.(*upnpNAT).ourIP))
 
 	ext, err := nat.GetExternalAddress()
 	if err != nil {
-		return nat, nil, nil, errors.Errorf("External address error: %v", err)
+		return nat, nil, nil, fmt.Errorf("External address error: %v", err)
 	}
 	logger.Info(cmn.Fmt("External address: %v", ext))
 
 	port, err := nat.AddPortMapping("tcp", extPort, intPort, "Tendermint UPnP Probe", 0)
 	if err != nil {
-		return nat, nil, ext, errors.Errorf("Port mapping error: %v", err)
+		return nat, nil, ext, fmt.Errorf("Port mapping error: %v", err)
 	}
 	logger.Info(cmn.Fmt("Port mapping mapped: %v", port))
 
 	// also run the listener, open for all remote addresses.
 	listener, err := net.Listen("tcp", fmt.Sprintf(":%v", intPort))
 	if err != nil {
-		return nat, nil, ext, errors.Errorf("Error establishing listener: %v", err)
+		return nat, nil, ext, fmt.Errorf("Error establishing listener: %v", err)
 	}
 	return nat, listener, ext, nil
 }
diff --git a/vendor/github.com/tendermint/tendermint/p2p/wire.go b/vendor/github.com/tendermint/tendermint/p2p/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..a90ac851cc304637900c88e250abdce8fa56fc1d
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/p2p/wire.go
@@ -0,0 +1,12 @@
+package p2p
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/abci.go b/vendor/github.com/tendermint/tendermint/rpc/core/abci.go
index 874becae3c1635f4488e57947fa44073c1cf9caf..1607b6cce8d6eea55035bd59f51febd72fb44fe2 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/abci.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/abci.go
@@ -10,7 +10,7 @@ import (
 // Query the application for some information.
 //
 // ```shell
-// curl 'localhost:46657/abci_query?path=""&data="abcd"&prove=true'
+// curl 'localhost:46657/abci_query?path=""&data="abcd"&trusted=false'
 // ```
 //
 // ```go
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/consensus.go b/vendor/github.com/tendermint/tendermint/rpc/core/consensus.go
index 25b67925cbbbc3a7cc1267913df7c9cf4f5a948f..68e25c1e694af9478fc05721c8cc8fc3a44c0791 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/consensus.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/consensus.go
@@ -2,8 +2,7 @@ package core
 
 import (
 	cm "github.com/tendermint/tendermint/consensus"
-	cstypes "github.com/tendermint/tendermint/consensus/types"
-	p2p "github.com/tendermint/tendermint/p2p"
+	"github.com/tendermint/tendermint/p2p"
 	ctypes "github.com/tendermint/tendermint/rpc/core/types"
 	sm "github.com/tendermint/tendermint/state"
 	"github.com/tendermint/tendermint/types"
@@ -21,7 +20,7 @@ import (
 // state, err := client.Validators()
 // ```
 //
-// > The above command returns JSON structured like this:
+// The above command returns JSON structured like this:
 //
 // ```json
 // {
@@ -58,7 +57,8 @@ func Validators(heightPtr *int64) (*ctypes.ResultValidators, error) {
 	return &ctypes.ResultValidators{height, validators.Validators}, nil
 }
 
-// Dump consensus state.
+// DumpConsensusState dumps consensus state.
+// UNSTABLE
 //
 // ```shell
 // curl 'localhost:46657/dump_consensus_state'
@@ -69,25 +69,193 @@ func Validators(heightPtr *int64) (*ctypes.ResultValidators, error) {
 // state, err := client.DumpConsensusState()
 // ```
 //
-// > The above command returns JSON structured like this:
+// The above command returns JSON structured like this:
 //
 // ```json
 // {
-// 	"error": "",
-// 	"result": {
-// 		"peer_round_states": [],
-// 		"round_state": "RoundState{\n  H:3537 R:0 S:RoundStepNewHeight\n  StartTime:     2017-05-31 12:32:31.178653883 +0000 UTC\n  CommitTime:    2017-05-31 12:32:30.178653883 +0000 UTC\n  Validators:    ValidatorSet{\n      Proposer: Validator{E89A51D60F68385E09E716D353373B11F8FACD62 {PubKeyEd25519{68DFDA7E50F82946E7E8546BED37944A422CD1B831E70DF66BA3B8430593944D}} VP:10 A:0}\n      Validators:\n        Validator{E89A51D60F68385E09E716D353373B11F8FACD62 {PubKeyEd25519{68DFDA7E50F82946E7E8546BED37944A422CD1B831E70DF66BA3B8430593944D}} VP:10 A:0}\n    }\n  Proposal:      <nil>\n  ProposalBlock: nil-PartSet nil-Block\n  LockedRound:   0\n  LockedBlock:   nil-PartSet nil-Block\n  Votes:         HeightVoteSet{H:3537 R:0~0\n      VoteSet{H:3537 R:0 T:1 +2/3:<nil> BA{1:_} map[]}\n      VoteSet{H:3537 R:0 T:2 +2/3:<nil> BA{1:_} map[]}\n    }\n  LastCommit: VoteSet{H:3536 R:0 T:2 +2/3:B7F988FBCDC68F9320E346EECAA76E32F6054654:1:673BE7C01F74 BA{1:X} map[]}\n  LastValidators:    ValidatorSet{\n      Proposer: Validator{E89A51D60F68385E09E716D353373B11F8FACD62 {PubKeyEd25519{68DFDA7E50F82946E7E8546BED37944A422CD1B831E70DF66BA3B8430593944D}} VP:10 A:0}\n      Validators:\n        Validator{E89A51D60F68385E09E716D353373B11F8FACD62 {PubKeyEd25519{68DFDA7E50F82946E7E8546BED37944A422CD1B831E70DF66BA3B8430593944D}} VP:10 A:0}\n    }\n}"
-// 	},
-// 	"id": "",
-// 	"jsonrpc": "2.0"
+//   "jsonrpc": "2.0",
+//   "id": "",
+//   "result": {
+//     "round_state": {
+//       "height": 7185,
+//       "round": 0,
+//       "step": 1,
+//       "start_time": "2018-05-12T13:57:28.440293621-07:00",
+//       "commit_time": "2018-05-12T13:57:27.440293621-07:00",
+//       "validators": {
+//         "validators": [
+//           {
+//             "address": "B5B3D40BE53982AD294EF99FF5A34C0C3E5A3244",
+//             "pub_key": {
+//               "type": "AC26791624DE60",
+//               "value": "SBctdhRBcXtBgdI/8a/alTsUhGXqGs9k5ylV1u5iKHg="
+//             },
+//             "voting_power": 10,
+//             "accum": 0
+//           }
+//         ],
+//         "proposer": {
+//           "address": "B5B3D40BE53982AD294EF99FF5A34C0C3E5A3244",
+//           "pub_key": {
+//             "type": "AC26791624DE60",
+//             "value": "SBctdhRBcXtBgdI/8a/alTsUhGXqGs9k5ylV1u5iKHg="
+//           },
+//           "voting_power": 10,
+//           "accum": 0
+//         }
+//       },
+//       "proposal": null,
+//       "proposal_block": null,
+//       "proposal_block_parts": null,
+//       "locked_round": 0,
+//       "locked_block": null,
+//       "locked_block_parts": null,
+//       "valid_round": 0,
+//       "valid_block": null,
+//       "valid_block_parts": null,
+//       "votes": [
+//         {
+//           "round": 0,
+//           "prevotes": "_",
+//           "precommits": "_"
+//         }
+//       ],
+//       "commit_round": -1,
+//       "last_commit": {
+//         "votes": [
+//           "Vote{0:B5B3D40BE539 7184/00/2(Precommit) 14F946FA7EF0 /702B1B1A602A.../ @ 2018-05-12T20:57:27.342Z}"
+//         ],
+//         "votes_bit_array": "x",
+//         "peer_maj_23s": {}
+//       },
+//       "last_validators": {
+//         "validators": [
+//           {
+//             "address": "B5B3D40BE53982AD294EF99FF5A34C0C3E5A3244",
+//             "pub_key": {
+//               "type": "AC26791624DE60",
+//               "value": "SBctdhRBcXtBgdI/8a/alTsUhGXqGs9k5ylV1u5iKHg="
+//             },
+//             "voting_power": 10,
+//             "accum": 0
+//           }
+//         ],
+//         "proposer": {
+//           "address": "B5B3D40BE53982AD294EF99FF5A34C0C3E5A3244",
+//           "pub_key": {
+//             "type": "AC26791624DE60",
+//             "value": "SBctdhRBcXtBgdI/8a/alTsUhGXqGs9k5ylV1u5iKHg="
+//           },
+//           "voting_power": 10,
+//           "accum": 0
+//         }
+//       }
+//     },
+//     "peers": [
+//       {
+//         "node_address": "30ad1854af22506383c3f0e57fb3c7f90984c5e8@172.16.63.221:46656",
+//         "peer_state": {
+//           "round_state": {
+//             "height": 7185,
+//             "round": 0,
+//             "step": 1,
+//             "start_time": "2018-05-12T13:57:27.438039872-07:00",
+//             "proposal": false,
+//             "proposal_block_parts_header": {
+//               "total": 0,
+//               "hash": ""
+//             },
+//             "proposal_block_parts": null,
+//             "proposal_pol_round": -1,
+//             "proposal_pol": "_",
+//             "prevotes": "_",
+//             "precommits": "_",
+//             "last_commit_round": 0,
+//             "last_commit": "x",
+//             "catchup_commit_round": -1,
+//             "catchup_commit": "_"
+//           },
+//           "stats": {
+//             "last_vote_height": 7184,
+//             "votes": 255,
+//             "last_block_part_height": 7184,
+//             "block_parts": 255
+//           }
+//         }
+//       }
+//     ]
+//   }
 // }
 // ```
 func DumpConsensusState() (*ctypes.ResultDumpConsensusState, error) {
-	peerRoundStates := make(map[p2p.ID]*cstypes.PeerRoundState)
-	for _, peer := range p2pSwitch.Peers().List() {
+	// Get Peer consensus states.
+	peers := p2pSwitch.Peers().List()
+	peerStates := make([]ctypes.PeerStateInfo, len(peers))
+	for i, peer := range peers {
 		peerState := peer.Get(types.PeerStateKey).(*cm.PeerState)
-		peerRoundState := peerState.GetRoundState()
-		peerRoundStates[peer.ID()] = peerRoundState
+		peerStateJSON, err := peerState.ToJSON()
+		if err != nil {
+			return nil, err
+		}
+		peerStates[i] = ctypes.PeerStateInfo{
+			// Peer basic info.
+			NodeAddress: p2p.IDAddressString(peer.ID(), peer.NodeInfo().ListenAddr),
+			// Peer consensus state.
+			PeerState: peerStateJSON,
+		}
 	}
-	return &ctypes.ResultDumpConsensusState{consensusState.GetRoundState(), peerRoundStates}, nil
+	// Get self round state.
+	roundState, err := consensusState.GetRoundStateJSON()
+	if err != nil {
+		return nil, err
+	}
+	return &ctypes.ResultDumpConsensusState{roundState, peerStates}, nil
+}
+
+// ConsensusState returns a concise summary of the consensus state.
+// UNSTABLE
+//
+// ```shell
+// curl 'localhost:46657/consensus_state'
+// ```
+//
+// ```go
+// client := client.NewHTTP("tcp://0.0.0.0:46657", "/websocket")
+// state, err := client.ConsensusState()
+// ```
+//
+// The above command returns JSON structured like this:
+//
+// ```json
+//{
+//  "jsonrpc": "2.0",
+//  "id": "",
+//  "result": {
+//    "round_state": {
+//      "height/round/step": "9336/0/1",
+//      "start_time": "2018-05-14T10:25:45.72595357-04:00",
+//      "proposal_block_hash": "",
+//      "locked_block_hash": "",
+//      "valid_block_hash": "",
+//      "height_vote_set": [
+//        {
+//          "round": 0,
+//          "prevotes": [
+//            "nil-Vote"
+//          ],
+//          "prevotes_bit_array": "BA{1:_} 0/10 = 0.00",
+//          "precommits": [
+//            "nil-Vote"
+//          ],
+//          "precommits_bit_array": "BA{1:_} 0/10 = 0.00"
+//        }
+//      ]
+//    }
+//  }
+//}
+//```
+func ConsensusState() (*ctypes.ResultConsensusState, error) {
+	// Get self round state.
+	bz, err := consensusState.GetRoundStateSimpleJSON()
+	return &ctypes.ResultConsensusState{bz}, err
 }
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/doc.go b/vendor/github.com/tendermint/tendermint/rpc/core/doc.go
index b479482c4530d0b93632f50b9aefcc840d0b83d0..d18cda6ac9f951ab987f02b5d05b18d539fa235a 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/doc.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/doc.go
@@ -7,7 +7,7 @@ Tendermint supports the following RPC protocols:
 * JSONRPC over HTTP
 * JSONRPC over websockets
 
-Tendermint RPC is built using [our own RPC library](https://github.com/tendermint/tendermint/tree/master/rpc/lib). Documentation and tests for that library could be found at `tendermint/rpc/lib` directory.
+Tendermint RPC is built using [our own RPC library](https://github.com/tendermint/tendermint/tree/master/rpc/lib) which contains its own set of documentation and tests.
 
 ## Configuration
 
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/events.go b/vendor/github.com/tendermint/tendermint/rpc/core/events.go
index 9353ace6a4b73b1d565152d6c3d3a103e0ad1cc9..36722fcf924f48950d4f8463cec8e3005401b217 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/events.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/events.go
@@ -5,10 +5,10 @@ import (
 
 	"github.com/pkg/errors"
 
+	tmquery "github.com/tendermint/tendermint/libs/pubsub/query"
 	ctypes "github.com/tendermint/tendermint/rpc/core/types"
 	rpctypes "github.com/tendermint/tendermint/rpc/lib/types"
 	tmtypes "github.com/tendermint/tendermint/types"
-	tmquery "github.com/tendermint/tmlibs/pubsub/query"
 )
 
 // Subscribe for events via WebSocket.
@@ -46,10 +46,10 @@ import (
 // https://godoc.org/github.com/tendermint/tendermint/types#pkg-constants
 //
 // For complete query syntax, check out
-// https://godoc.org/github.com/tendermint/tmlibs/pubsub/query.
+// https://godoc.org/github.com/tendermint/tendermint/libs/pubsub/query.
 //
 // ```go
-// import "github.com/tendermint/tmlibs/pubsub/query"
+// import "github.com/tendermint/tendermint/libs/pubsub/query"
 // import "github.com/tendermint/tendermint/types"
 //
 // client := client.NewHTTP("tcp://0.0.0.0:46657", "/websocket")
@@ -61,7 +61,7 @@ import (
 //
 // go func() {
 //   for e := range txs {
-//     fmt.Println("got ", e.(types.TMEventData).Unwrap().(types.EventDataTx))
+//     fmt.Println("got ", e.(types.EventDataTx))
 //	 }
 // }()
 // ```
@@ -104,7 +104,7 @@ func Subscribe(wsCtx rpctypes.WSRPCContext, query string) (*ctypes.ResultSubscri
 	go func() {
 		for event := range ch {
 			tmResult := &ctypes.ResultEvent{query, event.(tmtypes.TMEventData)}
-			wsCtx.TryWriteRPCResponse(rpctypes.NewRPCSuccessResponse(wsCtx.Request.ID+"#event", tmResult))
+			wsCtx.TryWriteRPCResponse(rpctypes.NewRPCSuccessResponse(wsCtx.Codec(), wsCtx.Request.ID+"#event", tmResult))
 		}
 	}()
 
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/mempool.go b/vendor/github.com/tendermint/tendermint/rpc/core/mempool.go
index 1dbdd80129a35a8b52cb436383d25191a77daa16..0e477243431b38fdb1c74f928d47e5c577c30ebc 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/mempool.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/mempool.go
@@ -189,7 +189,7 @@ func BroadcastTxCommit(tx types.Tx) (*ctypes.ResultBroadcastTxCommit, error) {
 	timer := time.NewTimer(60 * 2 * time.Second)
 	select {
 	case deliverTxResMsg := <-deliverTxResCh:
-		deliverTxRes := deliverTxResMsg.(types.TMEventData).Unwrap().(types.EventDataTx)
+		deliverTxRes := deliverTxResMsg.(types.EventDataTx)
 		// The tx was included in a block.
 		deliverTxR := deliverTxRes.Result
 		logger.Info("DeliverTx passed ", "tx", cmn.HexBytes(tx), "response", deliverTxR)
@@ -209,7 +209,7 @@ func BroadcastTxCommit(tx types.Tx) (*ctypes.ResultBroadcastTxCommit, error) {
 	}
 }
 
-// Get unconfirmed transactions including their number.
+// Get unconfirmed transactions (maximum ?limit entries) including their number.
 //
 // ```shell
 // curl 'localhost:46657/unconfirmed_txs'
@@ -232,9 +232,18 @@ func BroadcastTxCommit(tx types.Tx) (*ctypes.ResultBroadcastTxCommit, error) {
 //   "id": "",
 //   "jsonrpc": "2.0"
 // }
+//
+// ### Query Parameters
+//
+// | Parameter | Type | Default | Required | Description                          |
+// |-----------+------+---------+----------+--------------------------------------|
+// | limit     | int  | 30      | false    | Maximum number of entries (max: 100) |
 // ```
-func UnconfirmedTxs() (*ctypes.ResultUnconfirmedTxs, error) {
-	txs := mempool.Reap(-1)
+func UnconfirmedTxs(limit int) (*ctypes.ResultUnconfirmedTxs, error) {
+	// reuse per_page validator
+	limit = validatePerPage(limit)
+
+	txs := mempool.Reap(limit)
 	return &ctypes.ResultUnconfirmedTxs{len(txs), txs}, nil
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/net.go b/vendor/github.com/tendermint/tendermint/rpc/core/net.go
index 1918abf11cfd1cf141c7ff724b43baff5c66fb38..2e931d067f4a42c6c59042bdbc7b68266340f001 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/net.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/net.go
@@ -23,6 +23,7 @@ import (
 // {
 // 	"error": "",
 // 	"result": {
+//		"n_peers": 0,
 // 		"peers": [],
 // 		"listeners": [
 // 			"Listener(@10.0.2.15:46656)"
@@ -43,14 +44,17 @@ func NetInfo() (*ctypes.ResultNetInfo, error) {
 	for _, peer := range p2pSwitch.Peers().List() {
 		peers = append(peers, ctypes.Peer{
 			NodeInfo:         peer.NodeInfo(),
-			ID:               peer.ID(),
 			IsOutbound:       peer.IsOutbound(),
 			ConnectionStatus: peer.Status(),
 		})
 	}
+	// TODO: Should we include PersistentPeers and Seeds in here?
+	// PRO: useful info
+	// CON: privacy
 	return &ctypes.ResultNetInfo{
 		Listening: listening,
 		Listeners: listeners,
+		NPeers:    len(peers),
 		Peers:     peers,
 	}, nil
 }
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/pipe.go b/vendor/github.com/tendermint/tendermint/rpc/core/pipe.go
index 1eb00ceeb57c526f84bad7dd37c06fe79b0e676a..e4bb5a294efa45b0f24bc0ac6e1e4b72034c397f 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/pipe.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/pipe.go
@@ -3,9 +3,8 @@ package core
 import (
 	"time"
 
-	"github.com/tendermint/go-crypto"
+	crypto "github.com/tendermint/go-crypto"
 	"github.com/tendermint/tendermint/consensus"
-	cstypes "github.com/tendermint/tendermint/consensus/types"
 	"github.com/tendermint/tendermint/p2p"
 	"github.com/tendermint/tendermint/proxy"
 	sm "github.com/tendermint/tendermint/state"
@@ -15,6 +14,12 @@ import (
 	"github.com/tendermint/tmlibs/log"
 )
 
+const (
+	// see README
+	defaultPerPage = 30
+	maxPerPage     = 100
+)
+
 var subscribeTimeout = 5 * time.Second
 
 //----------------------------------------------
@@ -23,7 +28,8 @@ var subscribeTimeout = 5 * time.Second
 type Consensus interface {
 	GetState() sm.State
 	GetValidators() (int64, []*types.Validator)
-	GetRoundState() *cstypes.RoundState
+	GetRoundStateJSON() ([]byte, error)
+	GetRoundStateSimpleJSON() ([]byte, error)
 }
 
 type P2P interface {
@@ -117,3 +123,21 @@ func SetLogger(l log.Logger) {
 func SetEventBus(b *types.EventBus) {
 	eventBus = b
 }
+
+func validatePage(page, perPage, totalCount int) int {
+	pages := ((totalCount - 1) / perPage) + 1
+	if page < 1 {
+		page = 1
+	} else if page > pages {
+		page = pages
+	}
+
+	return page
+}
+
+func validatePerPage(perPage int) int {
+	if perPage < 1 || perPage > maxPerPage {
+		return defaultPerPage
+	}
+	return perPage
+}
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/routes.go b/vendor/github.com/tendermint/tendermint/rpc/core/routes.go
index 0e10cefee9e10003843de77e62cc06c365990a63..f26fadb62a71f70c36f4100c22f21f46830c203f 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/routes.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/routes.go
@@ -5,6 +5,7 @@ import (
 )
 
 // TODO: better system than "unsafe" prefix
+// NOTE: Amino is registered in rpc/core/types/wire.go.
 var Routes = map[string]*rpc.RPCFunc{
 	// subscribe/unsubscribe are reserved for websocket events.
 	"subscribe":       rpc.NewWSRPCFunc(Subscribe, "query"),
@@ -21,10 +22,11 @@ var Routes = map[string]*rpc.RPCFunc{
 	"block_results":        rpc.NewRPCFunc(BlockResults, "height"),
 	"commit":               rpc.NewRPCFunc(Commit, "height"),
 	"tx":                   rpc.NewRPCFunc(Tx, "hash,prove"),
-	"tx_search":            rpc.NewRPCFunc(TxSearch, "query,prove"),
+	"tx_search":            rpc.NewRPCFunc(TxSearch, "query,prove,page,per_page"),
 	"validators":           rpc.NewRPCFunc(Validators, "height"),
 	"dump_consensus_state": rpc.NewRPCFunc(DumpConsensusState, ""),
-	"unconfirmed_txs":      rpc.NewRPCFunc(UnconfirmedTxs, ""),
+	"consensus_state":      rpc.NewRPCFunc(ConsensusState, ""),
+	"unconfirmed_txs":      rpc.NewRPCFunc(UnconfirmedTxs, "limit"),
 	"num_unconfirmed_txs":  rpc.NewRPCFunc(NumUnconfirmedTxs, ""),
 
 	// broadcast API
@@ -33,7 +35,7 @@ var Routes = map[string]*rpc.RPCFunc{
 	"broadcast_tx_async":  rpc.NewRPCFunc(BroadcastTxAsync, "tx"),
 
 	// abci API
-	"abci_query": rpc.NewRPCFunc(ABCIQuery, "path,data,height,prove"),
+	"abci_query": rpc.NewRPCFunc(ABCIQuery, "path,data,height,trusted"),
 	"abci_info":  rpc.NewRPCFunc(ABCIInfo, ""),
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/status.go b/vendor/github.com/tendermint/tendermint/rpc/core/status.go
index b4543a61cfebc6109d12d06b69458bd1360d753b..4b2ceca2df15b3571ee72757b15fc8bff3225430 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/status.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/status.go
@@ -25,40 +25,43 @@ import (
 // > The above command returns JSON structured like this:
 //
 // ```json
-// {
-// 	"result": {
-// 		"syncing": false,
-// 		"latest_block_time": "2017-12-07T18:19:47.617Z",
-// 		"latest_block_height": 6,
-// 		"latest_app_hash": "",
-// 		"latest_block_hash": "A63D0C3307DEDCCFCC82ED411AE9108B70B29E02",
-// 		"pub_key": {
-// 			"data": "8C9A68070CBE33F9C445862BA1E9D96A75CEB68C0CF6ADD3652D07DCAC5D0380",
-// 			"type": "ed25519"
-// 		},
-// 		"node_info": {
-// 			"other": [
-// 				"wire_version=0.7.2",
-// 				"p2p_version=0.5.0",
-// 				"consensus_version=v1/0.2.2",
-// 				"rpc_version=0.7.0/3",
-// 				"tx_index=on",
-// 				"rpc_addr=tcp://0.0.0.0:46657"
-// 			],
-// 			"version": "0.13.0-14ccc8b",
-// 			"listen_addr": "10.0.2.15:46656",
-// 			"remote_addr": "",
-// 			"network": "test-chain-qhVCa2",
-// 			"moniker": "vagrant-ubuntu-trusty-64",
-// 			"pub_key": "844981FE99ABB19F7816F2D5E94E8A74276AB1153760A7799E925C75401856C6",
-//			"validator_status": {
-//				"voting_power": 10
-//			}
-// 		}
-// 	},
-// 	"id": "",
-// 	"jsonrpc": "2.0"
-// }
+//{
+//  "jsonrpc": "2.0",
+//  "id": "",
+//  "result": {
+//    "node_info": {
+//      "id": "562dd7f579f0ecee8c94a11a3c1e378c1876f433",
+//      "listen_addr": "192.168.1.2:46656",
+//      "network": "test-chain-I6zScH",
+//      "version": "0.19.0",
+//      "channels": "4020212223303800",
+//      "moniker": "Ethans-MacBook-Pro.local",
+//      "other": [
+//        "amino_version=0.9.8",
+//        "p2p_version=0.5.0",
+//        "consensus_version=v1/0.2.2",
+//        "rpc_version=0.7.0/3",
+//        "tx_index=on",
+//        "rpc_addr=tcp://0.0.0.0:46657"
+//      ]
+//    },
+//    "sync_info": {
+//      "latest_block_hash": "2D4D7055BE685E3CB2410603C92AD37AE557AC59",
+//      "latest_app_hash": "0000000000000000",
+//      "latest_block_height": 231,
+//      "latest_block_time": "2018-04-27T23:18:08.459766485-04:00",
+//      "syncing": false
+//    },
+//    "validator_info": {
+//      "address": "5875562FF0FFDECC895C20E32FC14988952E99E7",
+//      "pub_key": {
+//        "type": "AC26791624DE60",
+//        "value": "PpDJRUrLG2RgFqYYjawfn/AcAgacSXpLFrmfYYQnuzE="
+//      },
+//      "voting_power": 10
+//    }
+//  }
+//}
 // ```
 func Status() (*ctypes.ResultStatus, error) {
 	latestHeight := blockStore.Height()
@@ -77,21 +80,25 @@ func Status() (*ctypes.ResultStatus, error) {
 
 	latestBlockTime := time.Unix(0, latestBlockTimeNano)
 
-	result := &ctypes.ResultStatus{
-		NodeInfo:          p2pSwitch.NodeInfo(),
-		PubKey:            pubKey,
-		LatestBlockHash:   latestBlockHash,
-		LatestAppHash:     latestAppHash,
-		LatestBlockHeight: latestHeight,
-		LatestBlockTime:   latestBlockTime,
-		Syncing:           consensusReactor.FastSync(),
+	var votingPower int64
+	if val := validatorAtHeight(latestHeight); val != nil {
+		votingPower = val.VotingPower
 	}
 
-	// add ValidatorStatus if node is a validator
-	if val := validatorAtHeight(latestHeight); val != nil {
-		result.ValidatorStatus = ctypes.ValidatorStatus{
-			VotingPower: val.VotingPower,
-		}
+	result := &ctypes.ResultStatus{
+		NodeInfo: p2pSwitch.NodeInfo(),
+		SyncInfo: ctypes.SyncInfo{
+			LatestBlockHash:   latestBlockHash,
+			LatestAppHash:     latestAppHash,
+			LatestBlockHeight: latestHeight,
+			LatestBlockTime:   latestBlockTime,
+			Syncing:           consensusReactor.FastSync(),
+		},
+		ValidatorInfo: ctypes.ValidatorInfo{
+			Address:     pubKey.Address(),
+			PubKey:      pubKey,
+			VotingPower: votingPower,
+		},
 	}
 
 	return result, nil
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/tx.go b/vendor/github.com/tendermint/tendermint/rpc/core/tx.go
index 7ddc70809d7ca96e1c44acb4db53b58050efbcfd..615136a920ce8ae017cfa121bd9ca50c4e1c48bc 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/tx.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/tx.go
@@ -3,10 +3,12 @@ package core
 import (
 	"fmt"
 
+	cmn "github.com/tendermint/tmlibs/common"
+
+	tmquery "github.com/tendermint/tendermint/libs/pubsub/query"
 	ctypes "github.com/tendermint/tendermint/rpc/core/types"
 	"github.com/tendermint/tendermint/state/txindex/null"
 	"github.com/tendermint/tendermint/types"
-	tmquery "github.com/tendermint/tmlibs/pubsub/query"
 )
 
 // Tx allows you to query the transaction results. `nil` could mean the
@@ -104,7 +106,8 @@ func Tx(hash []byte, prove bool) (*ctypes.ResultTx, error) {
 	}, nil
 }
 
-// TxSearch allows you to query for multiple transactions results.
+// TxSearch allows you to query for multiple transactions results. It returns a
+// list of transactions (maximum ?per_page entries) and the total count.
 //
 // ```shell
 // curl "localhost:46657/tx_search?query=\"account.owner='Ivan'\"&prove=true"
@@ -120,43 +123,46 @@ func Tx(hash []byte, prove bool) (*ctypes.ResultTx, error) {
 //
 // ```json
 // {
-//   "result": [
-//     {
-//       "proof": {
-//         "Proof": {
-//           "aunts": [
-//             "J3LHbizt806uKnABNLwG4l7gXCA=",
-//             "iblMO/M1TnNtlAefJyNCeVhjAb0=",
-//             "iVk3ryurVaEEhdeS0ohAJZ3wtB8=",
-//             "5hqMkTeGqpct51ohX0lZLIdsn7Q=",
-//             "afhsNxFnLlZgFDoyPpdQSe0bR8g="
-//           ]
-//         },
-//         "Data": "mvZHHa7HhZ4aRT0xMDA=",
-//         "RootHash": "F6541223AA46E428CB1070E9840D2C3DF3B6D776",
-//         "Total": 32,
-//         "Index": 31
-//       },
-//       "tx": "mvZHHa7HhZ4aRT0xMDA=",
-//       "tx_result": {},
-//       "index": 31,
-//       "height": 12,
-//       "hash": "2B8EC32BA2579B3B8606E42C06DE2F7AFA2556EF"
-//     }
-//   ],
+//   "jsonrpc": "2.0",
 //   "id": "",
-//   "jsonrpc": "2.0"
+//   "result": {
+// 	   "txs": [
+//       {
+//         "proof": {
+//           "Proof": {
+//             "aunts": [
+//               "J3LHbizt806uKnABNLwG4l7gXCA=",
+//               "iblMO/M1TnNtlAefJyNCeVhjAb0=",
+//               "iVk3ryurVaEEhdeS0ohAJZ3wtB8=",
+//               "5hqMkTeGqpct51ohX0lZLIdsn7Q=",
+//               "afhsNxFnLlZgFDoyPpdQSe0bR8g="
+//             ]
+//           },
+//           "Data": "mvZHHa7HhZ4aRT0xMDA=",
+//           "RootHash": "F6541223AA46E428CB1070E9840D2C3DF3B6D776",
+//           "Total": 32,
+//           "Index": 31
+//         },
+//         "tx": "mvZHHa7HhZ4aRT0xMDA=",
+//         "tx_result": {},
+//         "index": 31,
+//         "height": 12,
+//         "hash": "2B8EC32BA2579B3B8606E42C06DE2F7AFA2556EF"
+//       }
+//     ],
+//     "total_count": 1
+//   }
 // }
 // ```
 //
-// Returns transactions matching the given query.
-//
 // ### Query Parameters
 //
 // | Parameter | Type   | Default | Required | Description                                               |
 // |-----------+--------+---------+----------+-----------------------------------------------------------|
 // | query     | string | ""      | true     | Query                                                     |
 // | prove     | bool   | false   | false    | Include proofs of the transactions inclusion in the block |
+// | page      | int    | 1       | false    | Page number (1-based)                                     |
+// | per_page  | int    | 30      | false    | Number of entries per page (max: 100)                     |
 //
 // ### Returns
 //
@@ -166,7 +172,7 @@ func Tx(hash []byte, prove bool) (*ctypes.ResultTx, error) {
 // - `index`: `int` - index of the transaction
 // - `height`: `int` - height of the block where this transaction was in
 // - `hash`: `[]byte` - hash of the transaction
-func TxSearch(query string, prove bool) ([]*ctypes.ResultTx, error) {
+func TxSearch(query string, prove bool, page, perPage int) (*ctypes.ResultTxSearch, error) {
 	// if index is disabled, return error
 	if _, ok := txIndexer.(*null.TxIndex); ok {
 		return nil, fmt.Errorf("Transaction indexing is disabled")
@@ -182,11 +188,15 @@ func TxSearch(query string, prove bool) ([]*ctypes.ResultTx, error) {
 		return nil, err
 	}
 
-	// TODO: we may want to consider putting a maximum on this length and somehow
-	// informing the user that things were truncated.
-	apiResults := make([]*ctypes.ResultTx, len(results))
+	totalCount := len(results)
+	page = validatePage(page, perPage, totalCount)
+	perPage = validatePerPage(perPage)
+	skipCount := (page - 1) * perPage
+
+	apiResults := make([]*ctypes.ResultTx, cmn.MinInt(perPage, totalCount-skipCount))
 	var proof types.TxProof
-	for i, r := range results {
+	for i := 0; i < len(apiResults); i++ {
+		r := results[skipCount+i]
 		height := r.Height
 		index := r.Index
 
@@ -205,5 +215,5 @@ func TxSearch(query string, prove bool) ([]*ctypes.ResultTx, error) {
 		}
 	}
 
-	return apiResults, nil
+	return &ctypes.ResultTxSearch{Txs: apiResults, TotalCount: totalCount}, nil
 }
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/types/responses.go b/vendor/github.com/tendermint/tendermint/rpc/core/types/responses.go
index 8a6fff63c71817430a94d152432e823c0b427cd8..5b001d7d3cbd12913d89749a75953a41b42a5959 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/core/types/responses.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/types/responses.go
@@ -1,6 +1,7 @@
 package core_types
 
 import (
+	"encoding/json"
 	"strings"
 	"time"
 
@@ -8,26 +9,29 @@ import (
 	crypto "github.com/tendermint/go-crypto"
 	cmn "github.com/tendermint/tmlibs/common"
 
-	cstypes "github.com/tendermint/tendermint/consensus/types"
 	"github.com/tendermint/tendermint/p2p"
 	"github.com/tendermint/tendermint/state"
 	"github.com/tendermint/tendermint/types"
 )
 
+// List of blocks
 type ResultBlockchainInfo struct {
 	LastHeight int64              `json:"last_height"`
 	BlockMetas []*types.BlockMeta `json:"block_metas"`
 }
 
+// Genesis file
 type ResultGenesis struct {
 	Genesis *types.GenesisDoc `json:"genesis"`
 }
 
+// Single block (with meta)
 type ResultBlock struct {
 	BlockMeta *types.BlockMeta `json:"block_meta"`
 	Block     *types.Block     `json:"block"`
 }
 
+// Commit and Header
 type ResultCommit struct {
 	// SignedHeader is header and commit, embedded so we only have
 	// one level in the json output
@@ -35,6 +39,7 @@ type ResultCommit struct {
 	CanonicalCommit bool `json:"canonical"`
 }
 
+// ABCI results from a block
 type ResultBlockResults struct {
 	Height  int64                `json:"height"`
 	Results *state.ABCIResponses `json:"results"`
@@ -54,21 +59,30 @@ func NewResultCommit(header *types.Header, commit *types.Commit,
 	}
 }
 
-type ValidatorStatus struct {
-	VotingPower int64 `json:"voting_power"`
+// Info about the node's syncing state
+type SyncInfo struct {
+	LatestBlockHash   cmn.HexBytes `json:"latest_block_hash"`
+	LatestAppHash     cmn.HexBytes `json:"latest_app_hash"`
+	LatestBlockHeight int64        `json:"latest_block_height"`
+	LatestBlockTime   time.Time    `json:"latest_block_time"`
+	Syncing           bool         `json:"syncing"`
 }
 
+// Info about the node's validator
+type ValidatorInfo struct {
+	Address     cmn.HexBytes  `json:"address"`
+	PubKey      crypto.PubKey `json:"pub_key"`
+	VotingPower int64         `json:"voting_power"`
+}
+
+// Node Status
 type ResultStatus struct {
-	NodeInfo          p2p.NodeInfo    `json:"node_info"`
-	PubKey            crypto.PubKey   `json:"pub_key"`
-	LatestBlockHash   cmn.HexBytes    `json:"latest_block_hash"`
-	LatestAppHash     cmn.HexBytes    `json:"latest_app_hash"`
-	LatestBlockHeight int64           `json:"latest_block_height"`
-	LatestBlockTime   time.Time       `json:"latest_block_time"`
-	Syncing           bool            `json:"syncing"`
-	ValidatorStatus   ValidatorStatus `json:"validator_status,omitempty"`
+	NodeInfo      p2p.NodeInfo  `json:"node_info"`
+	SyncInfo      SyncInfo      `json:"sync_info"`
+	ValidatorInfo ValidatorInfo `json:"validator_info"`
 }
 
+// Is TxIndexing enabled
 func (s *ResultStatus) TxIndexEnabled() bool {
 	if s == nil {
 		return false
@@ -82,37 +96,56 @@ func (s *ResultStatus) TxIndexEnabled() bool {
 	return false
 }
 
+// Info about peer connections
 type ResultNetInfo struct {
 	Listening bool     `json:"listening"`
 	Listeners []string `json:"listeners"`
+	NPeers    int      `json:"n_peers"`
 	Peers     []Peer   `json:"peers"`
 }
 
+// Log from dialing seeds
 type ResultDialSeeds struct {
 	Log string `json:"log"`
 }
 
+// Log from dialing peers
 type ResultDialPeers struct {
 	Log string `json:"log"`
 }
 
+// A peer
 type Peer struct {
 	p2p.NodeInfo     `json:"node_info"`
-	p2p.ID           `json:"node_id"`
 	IsOutbound       bool                 `json:"is_outbound"`
 	ConnectionStatus p2p.ConnectionStatus `json:"connection_status"`
 }
 
+// Validators for a height
 type ResultValidators struct {
 	BlockHeight int64              `json:"block_height"`
 	Validators  []*types.Validator `json:"validators"`
 }
 
+// Info about the consensus state.
+// UNSTABLE
 type ResultDumpConsensusState struct {
-	RoundState      *cstypes.RoundState                `json:"round_state"`
-	PeerRoundStates map[p2p.ID]*cstypes.PeerRoundState `json:"peer_round_states"`
+	RoundState json.RawMessage `json:"round_state"`
+	Peers      []PeerStateInfo `json:"peers"`
+}
+
+// UNSTABLE
+type PeerStateInfo struct {
+	NodeAddress string          `json:"node_address"`
+	PeerState   json.RawMessage `json:"peer_state"`
 }
 
+// UNSTABLE
+type ResultConsensusState struct {
+	RoundState json.RawMessage `json:"round_state"`
+}
+
+// CheckTx result
 type ResultBroadcastTx struct {
 	Code uint32       `json:"code"`
 	Data cmn.HexBytes `json:"data"`
@@ -121,6 +154,7 @@ type ResultBroadcastTx struct {
 	Hash cmn.HexBytes `json:"hash"`
 }
 
+// CheckTx and DeliverTx results
 type ResultBroadcastTxCommit struct {
 	CheckTx   abci.ResponseCheckTx   `json:"check_tx"`
 	DeliverTx abci.ResponseDeliverTx `json:"deliver_tx"`
@@ -128,6 +162,7 @@ type ResultBroadcastTxCommit struct {
 	Height    int64                  `json:"height"`
 }
 
+// Result of querying for a tx
 type ResultTx struct {
 	Hash     cmn.HexBytes           `json:"hash"`
 	Height   int64                  `json:"height"`
@@ -137,30 +172,39 @@ type ResultTx struct {
 	Proof    types.TxProof          `json:"proof,omitempty"`
 }
 
+// Result of searching for txs
+type ResultTxSearch struct {
+	Txs        []*ResultTx `json:"txs"`
+	TotalCount int         `json:"total_count"`
+}
+
+// List of mempool txs
 type ResultUnconfirmedTxs struct {
 	N   int        `json:"n_txs"`
 	Txs []types.Tx `json:"txs"`
 }
 
+// Info abci msg
 type ResultABCIInfo struct {
 	Response abci.ResponseInfo `json:"response"`
 }
 
+// Query abci msg
 type ResultABCIQuery struct {
 	Response abci.ResponseQuery `json:"response"`
 }
 
-type ResultUnsafeFlushMempool struct{}
-
-type ResultUnsafeProfile struct{}
-
-type ResultSubscribe struct{}
-
-type ResultUnsubscribe struct{}
+// empty results
+type (
+	ResultUnsafeFlushMempool struct{}
+	ResultUnsafeProfile      struct{}
+	ResultSubscribe          struct{}
+	ResultUnsubscribe        struct{}
+	ResultHealth             struct{}
+)
 
+// Event data from a subscription
 type ResultEvent struct {
 	Query string            `json:"query"`
 	Data  types.TMEventData `json:"data"`
 }
-
-type ResultHealth struct{}
diff --git a/vendor/github.com/tendermint/tendermint/rpc/core/types/wire.go b/vendor/github.com/tendermint/tendermint/rpc/core/types/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..6648364b10f09c7040740647d94270f43e4d74c2
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/rpc/core/types/wire.go
@@ -0,0 +1,13 @@
+package core_types
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+	"github.com/tendermint/tendermint/types"
+)
+
+func RegisterAmino(cdc *amino.Codec) {
+	types.RegisterEventDatas(cdc)
+	types.RegisterEvidences(cdc)
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/rpc/lib/server/handlers.go b/vendor/github.com/tendermint/tendermint/rpc/lib/server/handlers.go
index 19fc0f6e47c916a21b07797a82fbb64b01139a12..07ccfb6f3839bf49a08c5c995c1d67df92eb2bb7 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/lib/server/handlers.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/lib/server/handlers.go
@@ -17,6 +17,7 @@ import (
 	"github.com/gorilla/websocket"
 	"github.com/pkg/errors"
 
+	"github.com/tendermint/go-amino"
 	types "github.com/tendermint/tendermint/rpc/lib/types"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/log"
@@ -24,14 +25,14 @@ import (
 
 // RegisterRPCFuncs adds a route for each function in the funcMap, as well as general jsonrpc and websocket handlers for all functions.
 // "result" is the interface on which the result objects are registered, and is popualted with every RPCResponse
-func RegisterRPCFuncs(mux *http.ServeMux, funcMap map[string]*RPCFunc, logger log.Logger) {
+func RegisterRPCFuncs(mux *http.ServeMux, funcMap map[string]*RPCFunc, cdc *amino.Codec, logger log.Logger) {
 	// HTTP endpoints
 	for funcName, rpcFunc := range funcMap {
-		mux.HandleFunc("/"+funcName, makeHTTPHandler(rpcFunc, logger))
+		mux.HandleFunc("/"+funcName, makeHTTPHandler(rpcFunc, cdc, logger))
 	}
 
 	// JSONRPC endpoints
-	mux.HandleFunc("/", makeJSONRPCHandler(funcMap, logger))
+	mux.HandleFunc("/", makeJSONRPCHandler(funcMap, cdc, logger))
 }
 
 //-------------------------------------
@@ -98,7 +99,7 @@ func funcReturnTypes(f interface{}) []reflect.Type {
 // rpc.json
 
 // jsonrpc calls grab the given method's function info and runs reflect.Call
-func makeJSONRPCHandler(funcMap map[string]*RPCFunc, logger log.Logger) http.HandlerFunc {
+func makeJSONRPCHandler(funcMap map[string]*RPCFunc, cdc *amino.Codec, logger log.Logger) http.HandlerFunc {
 	return func(w http.ResponseWriter, r *http.Request) {
 		b, err := ioutil.ReadAll(r.Body)
 		if err != nil {
@@ -135,7 +136,7 @@ func makeJSONRPCHandler(funcMap map[string]*RPCFunc, logger log.Logger) http.Han
 		}
 		var args []reflect.Value
 		if len(request.Params) > 0 {
-			args, err = jsonParamsToArgsRPC(rpcFunc, request.Params)
+			args, err = jsonParamsToArgsRPC(rpcFunc, cdc, request.Params)
 			if err != nil {
 				WriteRPCResponseHTTP(w, types.RPCInvalidParamsError(request.ID, errors.Wrap(err, "Error converting json params to arguments")))
 				return
@@ -148,18 +149,18 @@ func makeJSONRPCHandler(funcMap map[string]*RPCFunc, logger log.Logger) http.Han
 			WriteRPCResponseHTTP(w, types.RPCInternalError(request.ID, err))
 			return
 		}
-		WriteRPCResponseHTTP(w, types.NewRPCSuccessResponse(request.ID, result))
+		WriteRPCResponseHTTP(w, types.NewRPCSuccessResponse(cdc, request.ID, result))
 	}
 }
 
-func mapParamsToArgs(rpcFunc *RPCFunc, params map[string]*json.RawMessage, argsOffset int) ([]reflect.Value, error) {
+func mapParamsToArgs(rpcFunc *RPCFunc, cdc *amino.Codec, params map[string]json.RawMessage, argsOffset int) ([]reflect.Value, error) {
 	values := make([]reflect.Value, len(rpcFunc.argNames))
 	for i, argName := range rpcFunc.argNames {
 		argType := rpcFunc.args[i+argsOffset]
 
-		if p, ok := params[argName]; ok && p != nil && len(*p) > 0 {
+		if p, ok := params[argName]; ok && p != nil && len(p) > 0 {
 			val := reflect.New(argType)
-			err := json.Unmarshal(*p, val.Interface())
+			err := cdc.UnmarshalJSON(p, val.Interface())
 			if err != nil {
 				return nil, err
 			}
@@ -172,7 +173,7 @@ func mapParamsToArgs(rpcFunc *RPCFunc, params map[string]*json.RawMessage, argsO
 	return values, nil
 }
 
-func arrayParamsToArgs(rpcFunc *RPCFunc, params []*json.RawMessage, argsOffset int) ([]reflect.Value, error) {
+func arrayParamsToArgs(rpcFunc *RPCFunc, cdc *amino.Codec, params []json.RawMessage, argsOffset int) ([]reflect.Value, error) {
 	if len(rpcFunc.argNames) != len(params) {
 		return nil, errors.Errorf("Expected %v parameters (%v), got %v (%v)",
 			len(rpcFunc.argNames), rpcFunc.argNames, len(params), params)
@@ -182,7 +183,7 @@ func arrayParamsToArgs(rpcFunc *RPCFunc, params []*json.RawMessage, argsOffset i
 	for i, p := range params {
 		argType := rpcFunc.args[i+argsOffset]
 		val := reflect.New(argType)
-		err := json.Unmarshal(*p, val.Interface())
+		err := cdc.UnmarshalJSON(p, val.Interface())
 		if err != nil {
 			return nil, err
 		}
@@ -191,39 +192,41 @@ func arrayParamsToArgs(rpcFunc *RPCFunc, params []*json.RawMessage, argsOffset i
 	return values, nil
 }
 
-// raw is unparsed json (from json.RawMessage) encoding either a map or an array.
+// `raw` is unparsed json (from json.RawMessage) encoding either a map or an array.
+// `argsOffset` should be 0 for RPC calls, and 1 for WS requests, where len(rpcFunc.args) != len(rpcFunc.argNames).
 //
-// argsOffset should be 0 for RPC calls, and 1 for WS requests, where len(rpcFunc.args) != len(rpcFunc.argNames).
 // Example:
 //   rpcFunc.args = [rpctypes.WSRPCContext string]
 //   rpcFunc.argNames = ["arg"]
-func jsonParamsToArgs(rpcFunc *RPCFunc, raw []byte, argsOffset int) ([]reflect.Value, error) {
-	// first, try to get the map..
-	var m map[string]*json.RawMessage
+func jsonParamsToArgs(rpcFunc *RPCFunc, cdc *amino.Codec, raw []byte, argsOffset int) ([]reflect.Value, error) {
+
+	// TODO: Make more efficient, perhaps by checking the first character for '{' or '['?
+	// First, try to get the map.
+	var m map[string]json.RawMessage
 	err := json.Unmarshal(raw, &m)
 	if err == nil {
-		return mapParamsToArgs(rpcFunc, m, argsOffset)
+		return mapParamsToArgs(rpcFunc, cdc, m, argsOffset)
 	}
 
-	// otherwise, try an array
-	var a []*json.RawMessage
+	// Otherwise, try an array.
+	var a []json.RawMessage
 	err = json.Unmarshal(raw, &a)
 	if err == nil {
-		return arrayParamsToArgs(rpcFunc, a, argsOffset)
+		return arrayParamsToArgs(rpcFunc, cdc, a, argsOffset)
 	}
 
-	// otherwise, bad format, we cannot parse
+	// Otherwise, bad format, we cannot parse
 	return nil, errors.Errorf("Unknown type for JSON params: %v. Expected map or array", err)
 }
 
 // Convert a []interface{} OR a map[string]interface{} to properly typed values
-func jsonParamsToArgsRPC(rpcFunc *RPCFunc, params json.RawMessage) ([]reflect.Value, error) {
-	return jsonParamsToArgs(rpcFunc, params, 0)
+func jsonParamsToArgsRPC(rpcFunc *RPCFunc, cdc *amino.Codec, params json.RawMessage) ([]reflect.Value, error) {
+	return jsonParamsToArgs(rpcFunc, cdc, params, 0)
 }
 
 // Same as above, but with the first param the websocket connection
-func jsonParamsToArgsWS(rpcFunc *RPCFunc, params json.RawMessage, wsCtx types.WSRPCContext) ([]reflect.Value, error) {
-	values, err := jsonParamsToArgs(rpcFunc, params, 1)
+func jsonParamsToArgsWS(rpcFunc *RPCFunc, cdc *amino.Codec, params json.RawMessage, wsCtx types.WSRPCContext) ([]reflect.Value, error) {
+	values, err := jsonParamsToArgs(rpcFunc, cdc, params, 1)
 	if err != nil {
 		return nil, err
 	}
@@ -235,7 +238,7 @@ func jsonParamsToArgsWS(rpcFunc *RPCFunc, params json.RawMessage, wsCtx types.WS
 // rpc.http
 
 // convert from a function name to the http handler
-func makeHTTPHandler(rpcFunc *RPCFunc, logger log.Logger) func(http.ResponseWriter, *http.Request) {
+func makeHTTPHandler(rpcFunc *RPCFunc, cdc *amino.Codec, logger log.Logger) func(http.ResponseWriter, *http.Request) {
 	// Exception for websocket endpoints
 	if rpcFunc.ws {
 		return func(w http.ResponseWriter, r *http.Request) {
@@ -245,7 +248,7 @@ func makeHTTPHandler(rpcFunc *RPCFunc, logger log.Logger) func(http.ResponseWrit
 	// All other endpoints
 	return func(w http.ResponseWriter, r *http.Request) {
 		logger.Debug("HTTP HANDLER", "req", r)
-		args, err := httpParamsToArgs(rpcFunc, r)
+		args, err := httpParamsToArgs(rpcFunc, cdc, r)
 		if err != nil {
 			WriteRPCResponseHTTP(w, types.RPCInvalidParamsError("", errors.Wrap(err, "Error converting http params to arguments")))
 			return
@@ -257,13 +260,13 @@ func makeHTTPHandler(rpcFunc *RPCFunc, logger log.Logger) func(http.ResponseWrit
 			WriteRPCResponseHTTP(w, types.RPCInternalError("", err))
 			return
 		}
-		WriteRPCResponseHTTP(w, types.NewRPCSuccessResponse("", result))
+		WriteRPCResponseHTTP(w, types.NewRPCSuccessResponse(cdc, "", result))
 	}
 }
 
 // Covert an http query to a list of properly typed values.
 // To be properly decoded the arg must be a concrete type from tendermint (if its an interface).
-func httpParamsToArgs(rpcFunc *RPCFunc, r *http.Request) ([]reflect.Value, error) {
+func httpParamsToArgs(rpcFunc *RPCFunc, cdc *amino.Codec, r *http.Request) ([]reflect.Value, error) {
 	values := make([]reflect.Value, len(rpcFunc.args))
 
 	for i, name := range rpcFunc.argNames {
@@ -278,7 +281,7 @@ func httpParamsToArgs(rpcFunc *RPCFunc, r *http.Request) ([]reflect.Value, error
 			continue
 		}
 
-		v, err, ok := nonJsonToArg(argType, arg)
+		v, err, ok := nonJSONToArg(cdc, argType, arg)
 		if err != nil {
 			return nil, err
 		}
@@ -287,7 +290,7 @@ func httpParamsToArgs(rpcFunc *RPCFunc, r *http.Request) ([]reflect.Value, error
 			continue
 		}
 
-		values[i], err = _jsonStringToArg(argType, arg)
+		values[i], err = _jsonStringToArg(cdc, argType, arg)
 		if err != nil {
 			return nil, err
 		}
@@ -296,9 +299,9 @@ func httpParamsToArgs(rpcFunc *RPCFunc, r *http.Request) ([]reflect.Value, error
 	return values, nil
 }
 
-func _jsonStringToArg(ty reflect.Type, arg string) (reflect.Value, error) {
+func _jsonStringToArg(cdc *amino.Codec, ty reflect.Type, arg string) (reflect.Value, error) {
 	v := reflect.New(ty)
-	err := json.Unmarshal([]byte(arg), v.Interface())
+	err := cdc.UnmarshalJSON([]byte(arg), v.Interface())
 	if err != nil {
 		return v, err
 	}
@@ -306,7 +309,7 @@ func _jsonStringToArg(ty reflect.Type, arg string) (reflect.Value, error) {
 	return v, nil
 }
 
-func nonJsonToArg(ty reflect.Type, arg string) (reflect.Value, error, bool) {
+func nonJSONToArg(cdc *amino.Codec, ty reflect.Type, arg string) (reflect.Value, error, bool) {
 	isQuotedString := strings.HasPrefix(arg, `"`) && strings.HasSuffix(arg, `"`)
 	isHexString := strings.HasPrefix(strings.ToLower(arg), "0x")
 	expectingString := ty.Kind() == reflect.String
@@ -332,7 +335,7 @@ func nonJsonToArg(ty reflect.Type, arg string) (reflect.Value, error, bool) {
 
 	if isQuotedString && expectingByteSlice {
 		v := reflect.New(reflect.TypeOf(""))
-		err := json.Unmarshal([]byte(arg), v.Interface())
+		err := cdc.UnmarshalJSON([]byte(arg), v.Interface())
 		if err != nil {
 			return reflect.ValueOf(nil), err, false
 		}
@@ -354,7 +357,7 @@ const (
 	defaultWSPingPeriod        = (defaultWSReadWait * 9) / 10
 )
 
-// a single websocket connection contains listener id, underlying ws
+// A single websocket connection contains listener id, underlying ws
 // connection, and the event switch for subscribing to events.
 //
 // In case of an error, the connection is stopped.
@@ -366,6 +369,7 @@ type wsConnection struct {
 	writeChan  chan types.RPCResponse
 
 	funcMap map[string]*RPCFunc
+	cdc     *amino.Codec
 
 	// write channel capacity
 	writeChanCapacity int
@@ -389,11 +393,12 @@ type wsConnection struct {
 // description of how to configure ping period and pong wait time. NOTE: if the
 // write buffer is full, pongs may be dropped, which may cause clients to
 // disconnect. see https://github.com/gorilla/websocket/issues/97
-func NewWSConnection(baseConn *websocket.Conn, funcMap map[string]*RPCFunc, options ...func(*wsConnection)) *wsConnection {
+func NewWSConnection(baseConn *websocket.Conn, funcMap map[string]*RPCFunc, cdc *amino.Codec, options ...func(*wsConnection)) *wsConnection {
 	wsc := &wsConnection{
 		remoteAddr:        baseConn.RemoteAddr().String(),
 		baseConn:          baseConn,
 		funcMap:           funcMap,
+		cdc:               cdc,
 		writeWait:         defaultWSWriteWait,
 		writeChanCapacity: defaultWSWriteChanCapacity,
 		readWait:          defaultWSReadWait,
@@ -503,6 +508,12 @@ func (wsc *wsConnection) TryWriteRPCResponse(resp types.RPCResponse) bool {
 	}
 }
 
+// Codec returns an amino codec used to decode parameters and encode results.
+// It implements WSRPCConnection.
+func (wsc *wsConnection) Codec() *amino.Codec {
+	return wsc.cdc
+}
+
 // Read from the socket and subscribe to or unsubscribe from events
 func (wsc *wsConnection) readRoutine() {
 	defer func() {
@@ -569,11 +580,11 @@ func (wsc *wsConnection) readRoutine() {
 			if rpcFunc.ws {
 				wsCtx := types.WSRPCContext{Request: request, WSRPCConnection: wsc}
 				if len(request.Params) > 0 {
-					args, err = jsonParamsToArgsWS(rpcFunc, request.Params, wsCtx)
+					args, err = jsonParamsToArgsWS(rpcFunc, wsc.cdc, request.Params, wsCtx)
 				}
 			} else {
 				if len(request.Params) > 0 {
-					args, err = jsonParamsToArgsRPC(rpcFunc, request.Params)
+					args, err = jsonParamsToArgsRPC(rpcFunc, wsc.cdc, request.Params)
 				}
 			}
 			if err != nil {
@@ -590,7 +601,7 @@ func (wsc *wsConnection) readRoutine() {
 				wsc.WriteRPCResponse(types.RPCInternalError(request.ID, err))
 				continue
 			} else {
-				wsc.WriteRPCResponse(types.NewRPCSuccessResponse(request.ID, result))
+				wsc.WriteRPCResponse(types.NewRPCSuccessResponse(wsc.cdc, request.ID, result))
 				continue
 			}
 
@@ -666,6 +677,7 @@ func (wsc *wsConnection) writeMessageWithDeadline(msgType int, msg []byte) error
 type WebsocketManager struct {
 	websocket.Upgrader
 	funcMap       map[string]*RPCFunc
+	cdc           *amino.Codec
 	logger        log.Logger
 	wsConnOptions []func(*wsConnection)
 }
@@ -673,9 +685,10 @@ type WebsocketManager struct {
 // NewWebsocketManager returns a new WebsocketManager that routes according to
 // the given funcMap and connects to the server with the given connection
 // options.
-func NewWebsocketManager(funcMap map[string]*RPCFunc, wsConnOptions ...func(*wsConnection)) *WebsocketManager {
+func NewWebsocketManager(funcMap map[string]*RPCFunc, cdc *amino.Codec, wsConnOptions ...func(*wsConnection)) *WebsocketManager {
 	return &WebsocketManager{
 		funcMap: funcMap,
+		cdc:     cdc,
 		Upgrader: websocket.Upgrader{
 			CheckOrigin: func(r *http.Request) bool {
 				// TODO ???
@@ -702,7 +715,7 @@ func (wm *WebsocketManager) WebsocketHandler(w http.ResponseWriter, r *http.Requ
 	}
 
 	// register connection
-	con := NewWSConnection(wsConn, wm.funcMap, wm.wsConnOptions...)
+	con := NewWSConnection(wsConn, wm.funcMap, wm.cdc, wm.wsConnOptions...)
 	con.SetLogger(wm.logger.With("remote", wsConn.RemoteAddr()))
 	wm.logger.Info("New websocket connection", "remote", con.remoteAddr)
 	err = con.Start() // Blocking
diff --git a/vendor/github.com/tendermint/tendermint/rpc/lib/types/types.go b/vendor/github.com/tendermint/tendermint/rpc/lib/types/types.go
index e4b02c58fc3943ec97162505ecf9c30b0b6781cf..1eeb19ea858fd4170d886f9feed804e378ef06b7 100644
--- a/vendor/github.com/tendermint/tendermint/rpc/lib/types/types.go
+++ b/vendor/github.com/tendermint/tendermint/rpc/lib/types/types.go
@@ -7,7 +7,8 @@ import (
 	"strings"
 
 	"github.com/pkg/errors"
-	tmpubsub "github.com/tendermint/tmlibs/pubsub"
+	"github.com/tendermint/go-amino"
+	tmpubsub "github.com/tendermint/tendermint/libs/pubsub"
 )
 
 //----------------------------------------
@@ -33,8 +34,16 @@ func (req RPCRequest) String() string {
 	return fmt.Sprintf("[%s %s]", req.ID, req.Method)
 }
 
-func MapToRequest(id string, method string, params map[string]interface{}) (RPCRequest, error) {
-	payload, err := json.Marshal(params)
+func MapToRequest(cdc *amino.Codec, id string, method string, params map[string]interface{}) (RPCRequest, error) {
+	var params_ = make(map[string]json.RawMessage, len(params))
+	for name, value := range params {
+		valueJSON, err := cdc.MarshalJSON(value)
+		if err != nil {
+			return RPCRequest{}, err
+		}
+		params_[name] = valueJSON
+	}
+	payload, err := json.Marshal(params_) // NOTE: Amino doesn't handle maps yet.
 	if err != nil {
 		return RPCRequest{}, err
 	}
@@ -42,8 +51,16 @@ func MapToRequest(id string, method string, params map[string]interface{}) (RPCR
 	return request, nil
 }
 
-func ArrayToRequest(id string, method string, params []interface{}) (RPCRequest, error) {
-	payload, err := json.Marshal(params)
+func ArrayToRequest(cdc *amino.Codec, id string, method string, params []interface{}) (RPCRequest, error) {
+	var params_ = make([]json.RawMessage, len(params))
+	for i, value := range params {
+		valueJSON, err := cdc.MarshalJSON(value)
+		if err != nil {
+			return RPCRequest{}, err
+		}
+		params_[i] = valueJSON
+	}
+	payload, err := json.Marshal(params_) // NOTE: Amino doesn't handle maps yet.
 	if err != nil {
 		return RPCRequest{}, err
 	}
@@ -75,12 +92,12 @@ type RPCResponse struct {
 	Error   *RPCError       `json:"error,omitempty"`
 }
 
-func NewRPCSuccessResponse(id string, res interface{}) RPCResponse {
+func NewRPCSuccessResponse(cdc *amino.Codec, id string, res interface{}) RPCResponse {
 	var rawMsg json.RawMessage
 
 	if res != nil {
 		var js []byte
-		js, err := json.Marshal(res)
+		js, err := cdc.MarshalJSON(res)
 		if err != nil {
 			return RPCInternalError(id, errors.Wrap(err, "Error marshalling response"))
 		}
@@ -137,6 +154,7 @@ type WSRPCConnection interface {
 	WriteRPCResponse(resp RPCResponse)
 	TryWriteRPCResponse(resp RPCResponse) bool
 	GetEventSubscriber() EventSubscriber
+	Codec() *amino.Codec
 }
 
 // EventSubscriber mirros tendermint/tendermint/types.EventBusSubscriber
diff --git a/vendor/github.com/tendermint/tendermint/state/execution.go b/vendor/github.com/tendermint/tendermint/state/execution.go
index 64db9f31adbd57856f3dfb00a074a59872eafd9e..1915f6b9062341a6486e5c74af91fb2f415448dd 100644
--- a/vendor/github.com/tendermint/tendermint/state/execution.go
+++ b/vendor/github.com/tendermint/tendermint/state/execution.go
@@ -5,7 +5,6 @@ import (
 
 	fail "github.com/ebuchman/fail-test"
 	abci "github.com/tendermint/abci/types"
-	crypto "github.com/tendermint/go-crypto"
 	"github.com/tendermint/tendermint/proxy"
 	"github.com/tendermint/tendermint/types"
 	dbm "github.com/tendermint/tmlibs/db"
@@ -74,7 +73,7 @@ func (blockExec *BlockExecutor) ApplyBlock(s State, blockID types.BlockID, block
 		return s, ErrInvalidBlock(err)
 	}
 
-	abciResponses, err := execBlockOnProxyApp(blockExec.logger, blockExec.proxyApp, block)
+	abciResponses, err := execBlockOnProxyApp(blockExec.logger, blockExec.proxyApp, block, s.LastValidators, blockExec.db)
 	if err != nil {
 		return s, ErrProxyAppConn(err)
 	}
@@ -160,7 +159,8 @@ func (blockExec *BlockExecutor) Commit(block *types.Block) ([]byte, error) {
 
 // Executes block's transactions on proxyAppConn.
 // Returns a list of transaction results and updates to the validator set
-func execBlockOnProxyApp(logger log.Logger, proxyAppConn proxy.AppConnConsensus, block *types.Block) (*ABCIResponses, error) {
+func execBlockOnProxyApp(logger log.Logger, proxyAppConn proxy.AppConnConsensus,
+	block *types.Block, lastValSet *types.ValidatorSet, stateDB dbm.DB) (*ABCIResponses, error) {
 	var validTxs, invalidTxs = 0, 0
 
 	txIndex := 0
@@ -186,29 +186,14 @@ func execBlockOnProxyApp(logger log.Logger, proxyAppConn proxy.AppConnConsensus,
 	}
 	proxyAppConn.SetResponseCallback(proxyCb)
 
-	// determine which validators did not sign last block
-	absentVals := make([]int32, 0)
-	for valI, vote := range block.LastCommit.Precommits {
-		if vote == nil {
-			absentVals = append(absentVals, int32(valI))
-		}
-	}
-
-	// TODO: determine which validators were byzantine
-	byzantineVals := make([]abci.Evidence, len(block.Evidence.Evidence))
-	for i, ev := range block.Evidence.Evidence {
-		byzantineVals[i] = abci.Evidence{
-			PubKey: ev.Address(), // XXX
-			Height: ev.Height(),
-		}
-	}
+	signVals, byzVals := getBeginBlockValidatorInfo(block, lastValSet, stateDB)
 
 	// Begin block
 	_, err := proxyAppConn.BeginBlockSync(abci.RequestBeginBlock{
 		Hash:                block.Hash(),
 		Header:              types.TM2PB.Header(block.Header),
-		AbsentValidators:    absentVals,
-		ByzantineValidators: byzantineVals,
+		Validators:          signVals,
+		ByzantineValidators: byzVals,
 	})
 	if err != nil {
 		logger.Error("Error in proxyAppConn.BeginBlock", "err", err)
@@ -240,12 +225,56 @@ func execBlockOnProxyApp(logger log.Logger, proxyAppConn proxy.AppConnConsensus,
 	return abciResponses, nil
 }
 
+func getBeginBlockValidatorInfo(block *types.Block, lastValSet *types.ValidatorSet, stateDB dbm.DB) ([]abci.SigningValidator, []abci.Evidence) {
+
+	// Sanity check that commit length matches validator set size -
+	// only applies after first block
+	if block.Height > 1 {
+		precommitLen := len(block.LastCommit.Precommits)
+		valSetLen := len(lastValSet.Validators)
+		if precommitLen != valSetLen {
+			// sanity check
+			panic(fmt.Sprintf("precommit length (%d) doesn't match valset length (%d) at height %d\n\n%v\n\n%v",
+				precommitLen, valSetLen, block.Height, block.LastCommit.Precommits, lastValSet.Validators))
+		}
+	}
+
+	// determine which validators did not sign last block.
+	signVals := make([]abci.SigningValidator, len(lastValSet.Validators))
+	for i, val := range lastValSet.Validators {
+		var vote *types.Vote
+		if i < len(block.LastCommit.Precommits) {
+			vote = block.LastCommit.Precommits[i]
+		}
+		val := abci.SigningValidator{
+			Validator:       types.TM2PB.Validator(val),
+			SignedLastBlock: vote != nil,
+		}
+		signVals[i] = val
+	}
+
+	byzVals := make([]abci.Evidence, len(block.Evidence.Evidence))
+	for i, ev := range block.Evidence.Evidence {
+		// We need the validator set. We already did this in validateBlock.
+		// TODO: Should we instead cache the valset in the evidence itself and add
+		// `SetValidatorSet()` and `ToABCI` methods ?
+		valset, err := LoadValidators(stateDB, ev.Height())
+		if err != nil {
+			panic(err) // shoudn't happen
+		}
+		byzVals[i] = types.TM2PB.Evidence(ev, valset, block.Time)
+	}
+
+	return signVals, byzVals
+
+}
+
 // If more or equal than 1/3 of total voting power changed in one block, then
 // a light client could never prove the transition externally. See
 // ./lite/doc.go for details on how a light client tracks validators.
 func updateValidators(currentSet *types.ValidatorSet, updates []abci.Validator) error {
 	for _, v := range updates {
-		pubkey, err := crypto.PubKeyFromBytes(v.PubKey) // NOTE: expects go-wire encoded pubkey
+		pubkey, err := types.PB2TM.PubKey(v.PubKey)
 		if err != nil {
 			return err
 		}
@@ -341,23 +370,17 @@ func updateState(s State, blockID types.BlockID, header *types.Header,
 // Fire TxEvent for every tx.
 // NOTE: if Tendermint crashes before commit, some or all of these events may be published again.
 func fireEvents(logger log.Logger, eventBus types.BlockEventPublisher, block *types.Block, abciResponses *ABCIResponses) {
-	// NOTE: do we still need this buffer ?
-	txEventBuffer := types.NewTxEventBuffer(eventBus, int(block.NumTxs))
+	eventBus.PublishEventNewBlock(types.EventDataNewBlock{block})
+	eventBus.PublishEventNewBlockHeader(types.EventDataNewBlockHeader{block.Header})
+
 	for i, tx := range block.Data.Txs {
-		txEventBuffer.PublishEventTx(types.EventDataTx{types.TxResult{
+		eventBus.PublishEventTx(types.EventDataTx{types.TxResult{
 			Height: block.Height,
 			Index:  uint32(i),
 			Tx:     tx,
 			Result: *(abciResponses.DeliverTx[i]),
 		}})
 	}
-
-	eventBus.PublishEventNewBlock(types.EventDataNewBlock{block})
-	eventBus.PublishEventNewBlockHeader(types.EventDataNewBlockHeader{block.Header})
-	err := txEventBuffer.Flush()
-	if err != nil {
-		logger.Error("Failed to flush event buffer", "err", err)
-	}
 }
 
 //----------------------------------------------------------------------------------------------------
@@ -365,8 +388,9 @@ func fireEvents(logger log.Logger, eventBus types.BlockEventPublisher, block *ty
 
 // ExecCommitBlock executes and commits a block on the proxyApp without validating or mutating the state.
 // It returns the application root hash (result of abci.Commit).
-func ExecCommitBlock(appConnConsensus proxy.AppConnConsensus, block *types.Block, logger log.Logger) ([]byte, error) {
-	_, err := execBlockOnProxyApp(logger, appConnConsensus, block)
+func ExecCommitBlock(appConnConsensus proxy.AppConnConsensus, block *types.Block,
+	logger log.Logger, lastValSet *types.ValidatorSet, stateDB dbm.DB) ([]byte, error) {
+	_, err := execBlockOnProxyApp(logger, appConnConsensus, block, lastValSet, stateDB)
 	if err != nil {
 		logger.Error("Error executing block on proxy app", "height", block.Height, "err", err)
 		return nil, err
diff --git a/vendor/github.com/tendermint/tendermint/state/state.go b/vendor/github.com/tendermint/tendermint/state/state.go
index fb5d78c47b3dee341f7f31c95505854735291148..aa6e04b66089b60429291740ad526a0addb692f6 100644
--- a/vendor/github.com/tendermint/tendermint/state/state.go
+++ b/vendor/github.com/tendermint/tendermint/state/state.go
@@ -6,8 +6,6 @@ import (
 	"io/ioutil"
 	"time"
 
-	wire "github.com/tendermint/go-wire"
-
 	"github.com/tendermint/tendermint/types"
 )
 
@@ -81,16 +79,13 @@ func (s State) Copy() State {
 
 // Equals returns true if the States are identical.
 func (s State) Equals(s2 State) bool {
-	return bytes.Equal(s.Bytes(), s2.Bytes())
+	sbz, s2bz := s.Bytes(), s2.Bytes()
+	return bytes.Equal(sbz, s2bz)
 }
 
-// Bytes serializes the State using go-wire.
+// Bytes serializes the State using go-amino.
 func (s State) Bytes() []byte {
-	bz, err := wire.MarshalBinary(s)
-	if err != nil {
-		panic(err)
-	}
-	return bz
+	return cdc.MustMarshalBinaryBare(s)
 }
 
 // IsEmpty returns true if the State is equal to the empty State.
diff --git a/vendor/github.com/tendermint/tendermint/state/store.go b/vendor/github.com/tendermint/tendermint/state/store.go
index df07ec54019bc2acb7c63c2531d8c8241fb54a0d..8d749c59d94776a14e06ea9311d82cb1166d21cf 100644
--- a/vendor/github.com/tendermint/tendermint/state/store.go
+++ b/vendor/github.com/tendermint/tendermint/state/store.go
@@ -4,7 +4,6 @@ import (
 	"fmt"
 
 	abci "github.com/tendermint/abci/types"
-	wire "github.com/tendermint/go-wire"
 	"github.com/tendermint/tendermint/types"
 	cmn "github.com/tendermint/tmlibs/common"
 	dbm "github.com/tendermint/tmlibs/db"
@@ -69,7 +68,7 @@ func loadState(db dbm.DB, key []byte) (state State) {
 		return state
 	}
 
-	err := wire.UnmarshalBinary(buf, &state)
+	err := cdc.UnmarshalBinaryBare(buf, &state)
 	if err != nil {
 		// DATA HAS BEEN CORRUPTED OR THE SPEC HAS CHANGED
 		cmn.Exit(cmn.Fmt(`LoadState: Data has been corrupted or its spec has changed:
@@ -104,22 +103,23 @@ type ABCIResponses struct {
 
 // NewABCIResponses returns a new ABCIResponses
 func NewABCIResponses(block *types.Block) *ABCIResponses {
+	resDeliverTxs := make([]*abci.ResponseDeliverTx, block.NumTxs)
+	if block.NumTxs == 0 {
+		// This makes Amino encoding/decoding consistent.
+		resDeliverTxs = nil
+	}
 	return &ABCIResponses{
-		DeliverTx: make([]*abci.ResponseDeliverTx, block.NumTxs),
+		DeliverTx: resDeliverTxs,
 	}
 }
 
-// Bytes serializes the ABCIResponse using go-wire
-func (a *ABCIResponses) Bytes() []byte {
-	bz, err := wire.MarshalBinary(*a)
-	if err != nil {
-		panic(err)
-	}
-	return bz
+// Bytes serializes the ABCIResponse using go-amino.
+func (arz *ABCIResponses) Bytes() []byte {
+	return cdc.MustMarshalBinaryBare(arz)
 }
 
-func (a *ABCIResponses) ResultsHash() []byte {
-	results := types.NewResults(a.DeliverTx)
+func (arz *ABCIResponses) ResultsHash() []byte {
+	results := types.NewResults(arz.DeliverTx)
 	return results.Hash()
 }
 
@@ -133,7 +133,7 @@ func LoadABCIResponses(db dbm.DB, height int64) (*ABCIResponses, error) {
 	}
 
 	abciResponses := new(ABCIResponses)
-	err := wire.UnmarshalBinary(buf, abciResponses)
+	err := cdc.UnmarshalBinaryBare(buf, abciResponses)
 	if err != nil {
 		// DATA HAS BEEN CORRUPTED OR THE SPEC HAS CHANGED
 		cmn.Exit(cmn.Fmt(`LoadABCIResponses: Data has been corrupted or its spec has
@@ -159,13 +159,9 @@ type ValidatorsInfo struct {
 	LastHeightChanged int64
 }
 
-// Bytes serializes the ValidatorsInfo using go-wire
+// Bytes serializes the ValidatorsInfo using go-amino.
 func (valInfo *ValidatorsInfo) Bytes() []byte {
-	bz, err := wire.MarshalBinary(*valInfo)
-	if err != nil {
-		panic(err)
-	}
-	return bz
+	return cdc.MustMarshalBinaryBare(valInfo)
 }
 
 // LoadValidators loads the ValidatorSet for a given height.
@@ -177,11 +173,12 @@ func LoadValidators(db dbm.DB, height int64) (*types.ValidatorSet, error) {
 	}
 
 	if valInfo.ValidatorSet == nil {
-		valInfo = loadValidatorsInfo(db, valInfo.LastHeightChanged)
-		if valInfo == nil {
+		valInfo2 := loadValidatorsInfo(db, valInfo.LastHeightChanged)
+		if valInfo2 == nil {
 			cmn.PanicSanity(fmt.Sprintf(`Couldn't find validators at height %d as
                         last changed from height %d`, valInfo.LastHeightChanged, height))
 		}
+		valInfo = valInfo2
 	}
 
 	return valInfo.ValidatorSet, nil
@@ -194,7 +191,7 @@ func loadValidatorsInfo(db dbm.DB, height int64) *ValidatorsInfo {
 	}
 
 	v := new(ValidatorsInfo)
-	err := wire.UnmarshalBinary(buf, v)
+	err := cdc.UnmarshalBinaryBare(buf, v)
 	if err != nil {
 		// DATA HAS BEEN CORRUPTED OR THE SPEC HAS CHANGED
 		cmn.Exit(cmn.Fmt(`LoadValidators: Data has been corrupted or its spec has changed:
@@ -227,13 +224,9 @@ type ConsensusParamsInfo struct {
 	LastHeightChanged int64
 }
 
-// Bytes serializes the ConsensusParamsInfo using go-wire
+// Bytes serializes the ConsensusParamsInfo using go-amino.
 func (params ConsensusParamsInfo) Bytes() []byte {
-	bz, err := wire.MarshalBinary(params)
-	if err != nil {
-		panic(err)
-	}
-	return bz
+	return cdc.MustMarshalBinaryBare(params)
 }
 
 // LoadConsensusParams loads the ConsensusParams for a given height.
@@ -263,7 +256,7 @@ func loadConsensusParamsInfo(db dbm.DB, height int64) *ConsensusParamsInfo {
 	}
 
 	paramsInfo := new(ConsensusParamsInfo)
-	err := wire.UnmarshalBinary(buf, paramsInfo)
+	err := cdc.UnmarshalBinaryBare(buf, paramsInfo)
 	if err != nil {
 		// DATA HAS BEEN CORRUPTED OR THE SPEC HAS CHANGED
 		cmn.Exit(cmn.Fmt(`LoadConsensusParams: Data has been corrupted or its spec has changed:
diff --git a/vendor/github.com/tendermint/tendermint/state/txindex/indexer.go b/vendor/github.com/tendermint/tendermint/state/txindex/indexer.go
index bd51fbb2927f79beb9bdf7036c98cb4dfcd2cd1a..bf7760fc86b1e83f147ced323d44c9eb8177049d 100644
--- a/vendor/github.com/tendermint/tendermint/state/txindex/indexer.go
+++ b/vendor/github.com/tendermint/tendermint/state/txindex/indexer.go
@@ -4,7 +4,7 @@ import (
 	"errors"
 
 	"github.com/tendermint/tendermint/types"
-	"github.com/tendermint/tmlibs/pubsub/query"
+	"github.com/tendermint/tendermint/libs/pubsub/query"
 )
 
 // TxIndexer interface defines methods to index and search transactions.
@@ -34,7 +34,7 @@ type Batch struct {
 }
 
 // NewBatch creates a new Batch.
-func NewBatch(n int) *Batch {
+func NewBatch(n int64) *Batch {
 	return &Batch{
 		Ops: make([]*types.TxResult, n),
 	}
diff --git a/vendor/github.com/tendermint/tendermint/state/txindex/indexer_service.go b/vendor/github.com/tendermint/tendermint/state/txindex/indexer_service.go
index 3e5fab1278a84a77cefd471ff427bd1548153ce0..264be1fd893ddb0aaa1c5a397e52fc538b63fa8a 100644
--- a/vendor/github.com/tendermint/tendermint/state/txindex/indexer_service.go
+++ b/vendor/github.com/tendermint/tendermint/state/txindex/indexer_service.go
@@ -3,14 +3,17 @@ package txindex
 import (
 	"context"
 
-	"github.com/tendermint/tendermint/types"
 	cmn "github.com/tendermint/tmlibs/common"
+
+	"github.com/tendermint/tendermint/types"
 )
 
 const (
 	subscriber = "IndexerService"
 )
 
+// IndexerService connects event bus and transaction indexer together in order
+// to index transactions coming from event bus.
 type IndexerService struct {
 	cmn.BaseService
 
@@ -18,6 +21,7 @@ type IndexerService struct {
 	eventBus *types.EventBus
 }
 
+// NewIndexerService returns a new service instance.
 func NewIndexerService(idr TxIndexer, eventBus *types.EventBus) *IndexerService {
 	is := &IndexerService{idr: idr, eventBus: eventBus}
 	is.BaseService = *cmn.NewBaseService(nil, "IndexerService", is)
@@ -27,15 +31,35 @@ func NewIndexerService(idr TxIndexer, eventBus *types.EventBus) *IndexerService
 // OnStart implements cmn.Service by subscribing for all transactions
 // and indexing them by tags.
 func (is *IndexerService) OnStart() error {
-	ch := make(chan interface{})
-	if err := is.eventBus.Subscribe(context.Background(), subscriber, types.EventQueryTx, ch); err != nil {
+	blockHeadersCh := make(chan interface{})
+	if err := is.eventBus.Subscribe(context.Background(), subscriber, types.EventQueryNewBlockHeader, blockHeadersCh); err != nil {
 		return err
 	}
+
+	txsCh := make(chan interface{})
+	if err := is.eventBus.Subscribe(context.Background(), subscriber, types.EventQueryTx, txsCh); err != nil {
+		return err
+	}
+
 	go func() {
-		for event := range ch {
-			// TODO: may be not perfomant to write one event at a time
-			txResult := event.(types.TMEventData).Unwrap().(types.EventDataTx).TxResult
-			is.idr.Index(&txResult)
+		for {
+			e, ok := <-blockHeadersCh
+			if !ok {
+				return
+			}
+			header := e.(types.EventDataNewBlockHeader).Header
+			batch := NewBatch(header.NumTxs)
+			for i := int64(0); i < header.NumTxs; i++ {
+				e, ok := <-txsCh
+				if !ok {
+					is.Logger.Error("Failed to index all transactions due to closed transactions channel", "height", header.Height, "numTxs", header.NumTxs, "numProcessed", i)
+					return
+				}
+				txResult := e.(types.EventDataTx).TxResult
+				batch.Add(&txResult)
+			}
+			is.idr.AddBatch(batch)
+			is.Logger.Info("Indexed block", "height", header.Height)
 		}
 	}()
 	return nil
diff --git a/vendor/github.com/tendermint/tendermint/state/txindex/kv/kv.go b/vendor/github.com/tendermint/tendermint/state/txindex/kv/kv.go
index 74bf4843b6eb76828d24b56afabb93cbae080e07..718a55d15133c53ceceefc5a11e1a45b9a3c47fc 100644
--- a/vendor/github.com/tendermint/tendermint/state/txindex/kv/kv.go
+++ b/vendor/github.com/tendermint/tendermint/state/txindex/kv/kv.go
@@ -10,12 +10,10 @@ import (
 	"time"
 
 	"github.com/pkg/errors"
-
-	wire "github.com/tendermint/go-wire"
 	cmn "github.com/tendermint/tmlibs/common"
 	dbm "github.com/tendermint/tmlibs/db"
-	"github.com/tendermint/tmlibs/pubsub/query"
 
+	"github.com/tendermint/tendermint/libs/pubsub/query"
 	"github.com/tendermint/tendermint/state/txindex"
 	"github.com/tendermint/tendermint/types"
 )
@@ -69,7 +67,7 @@ func (txi *TxIndex) Get(hash []byte) (*types.TxResult, error) {
 	}
 
 	txResult := new(types.TxResult)
-	err := wire.UnmarshalBinary(rawBytes, &txResult)
+	err := cdc.UnmarshalBinaryBare(rawBytes, &txResult)
 	if err != nil {
 		return nil, fmt.Errorf("Error reading TxResult: %v", err)
 	}
@@ -92,7 +90,7 @@ func (txi *TxIndex) AddBatch(b *txindex.Batch) error {
 		}
 
 		// index tx by hash
-		rawBytes, err := wire.MarshalBinary(result)
+		rawBytes, err := cdc.MarshalBinaryBare(result)
 		if err != nil {
 			return err
 		}
@@ -117,7 +115,7 @@ func (txi *TxIndex) Index(result *types.TxResult) error {
 	}
 
 	// index tx by hash
-	rawBytes, err := wire.MarshalBinary(result)
+	rawBytes, err := cdc.MarshalBinaryBare(result)
 	if err != nil {
 		return err
 	}
diff --git a/vendor/github.com/tendermint/tendermint/state/txindex/kv/wire.go b/vendor/github.com/tendermint/tendermint/state/txindex/kv/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..ccca75254f9cf55b3aa4d9b87be3427411358dcf
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/state/txindex/kv/wire.go
@@ -0,0 +1,10 @@
+package kv
+
+import (
+	"github.com/tendermint/go-amino"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+}
diff --git a/vendor/github.com/tendermint/tendermint/state/txindex/null/null.go b/vendor/github.com/tendermint/tendermint/state/txindex/null/null.go
index 0764faa9e997ea2c8f176754a5fabb7200f950fc..2d3961e6bd29d997b47aebc63d7ceff2badd996f 100644
--- a/vendor/github.com/tendermint/tendermint/state/txindex/null/null.go
+++ b/vendor/github.com/tendermint/tendermint/state/txindex/null/null.go
@@ -5,7 +5,7 @@ import (
 
 	"github.com/tendermint/tendermint/state/txindex"
 	"github.com/tendermint/tendermint/types"
-	"github.com/tendermint/tmlibs/pubsub/query"
+	"github.com/tendermint/tendermint/libs/pubsub/query"
 )
 
 var _ txindex.TxIndexer = (*TxIndex)(nil)
diff --git a/vendor/github.com/tendermint/tendermint/state/validation.go b/vendor/github.com/tendermint/tendermint/state/validation.go
index fb3e8d13dc379dcb2bfb0ea7c28170c4b706be3a..5da91cb2d754b19e0c5a35e9ffecd210a8fbcda5 100644
--- a/vendor/github.com/tendermint/tendermint/state/validation.go
+++ b/vendor/github.com/tendermint/tendermint/state/validation.go
@@ -73,6 +73,9 @@ func validateBlock(stateDB dbm.DB, s State, b *types.Block) error {
 		}
 	}
 
+	// TODO: Each check requires loading an old validator set.
+	// We should cap the amount of evidence per block
+	// to prevent potential proposer DoS.
 	for _, ev := range b.Evidence.Evidence {
 		if err := VerifyEvidence(stateDB, s, ev); err != nil {
 			return types.NewEvidenceInvalidErr(ev, err)
@@ -82,11 +85,11 @@ func validateBlock(stateDB dbm.DB, s State, b *types.Block) error {
 	return nil
 }
 
-// XXX: What's cheaper (ie. what should be checked first):
-//  evidence internal validity (ie. sig checks) or validator existed (fetch historical val set from db)
-
-// VerifyEvidence verifies the evidence fully by checking it is internally
-// consistent and sufficiently recent.
+// VerifyEvidence verifies the evidence fully by checking:
+// - it is sufficiently recent (MaxAge)
+// - it is from a key who was a validator at the given height
+// - it is internally consistent
+// - it was properly signed by the alleged equivocator
 func VerifyEvidence(stateDB dbm.DB, s State, evidence types.Evidence) error {
 	height := s.LastBlockHeight
 
@@ -97,10 +100,6 @@ func VerifyEvidence(stateDB dbm.DB, s State, evidence types.Evidence) error {
 			evidence.Height(), height-maxAge)
 	}
 
-	if err := evidence.Verify(s.ChainID); err != nil {
-		return err
-	}
-
 	valset, err := LoadValidators(stateDB, evidence.Height())
 	if err != nil {
 		// TODO: if err is just that we cant find it cuz we pruned, ignore.
@@ -108,14 +107,18 @@ func VerifyEvidence(stateDB dbm.DB, s State, evidence types.Evidence) error {
 		return err
 	}
 
-	// The address must have been an active validator at the height
+	// The address must have been an active validator at the height.
+	// NOTE: we will ignore evidence from H if the key was not a validator
+	// at H, even if it is a validator at some nearby H'
 	ev := evidence
-	height, addr, idx := ev.Height(), ev.Address(), ev.Index()
-	valIdx, val := valset.GetByAddress(addr)
+	height, addr := ev.Height(), ev.Address()
+	_, val := valset.GetByAddress(addr)
 	if val == nil {
 		return fmt.Errorf("Address %X was not a validator at height %d", addr, height)
-	} else if idx != valIdx {
-		return fmt.Errorf("Address %X was validator %d at height %d, not %d", addr, valIdx, height, idx)
+	}
+
+	if err := evidence.Verify(s.ChainID, val.PubKey); err != nil {
+		return err
 	}
 
 	return nil
diff --git a/vendor/github.com/tendermint/tendermint/state/wire.go b/vendor/github.com/tendermint/tendermint/state/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..3e8b544d98763f37324af4d2a265d1503a806f97
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/state/wire.go
@@ -0,0 +1,12 @@
+package state
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/types/block.go b/vendor/github.com/tendermint/tendermint/types/block.go
index 22d605d666329d1db3fb11cc33bf808d4a7b0650..3004672c89972ccf71286b6c880405f6cf44cf05 100644
--- a/vendor/github.com/tendermint/tendermint/types/block.go
+++ b/vendor/github.com/tendermint/tendermint/types/block.go
@@ -5,9 +5,9 @@ import (
 	"errors"
 	"fmt"
 	"strings"
+	"sync"
 	"time"
 
-	wire "github.com/tendermint/tendermint/wire"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/merkle"
 	"golang.org/x/crypto/ripemd160"
@@ -16,6 +16,7 @@ import (
 // Block defines the atomic unit of a Tendermint blockchain.
 // TODO: add Version byte
 type Block struct {
+	mtx        sync.Mutex
 	*Header    `json:"header"`
 	*Data      `json:"data"`
 	Evidence   EvidenceData `json:"evidence"`
@@ -36,7 +37,7 @@ func MakeBlock(height int64, txs []Tx, commit *Commit) *Block {
 			Txs: txs,
 		},
 	}
-	block.FillHeader()
+	block.fillHeader()
 	return block
 }
 
@@ -48,6 +49,12 @@ func (b *Block) AddEvidence(evidence []Evidence) {
 // ValidateBasic performs basic validation that doesn't involve state data.
 // It checks the internal consistency of the block.
 func (b *Block) ValidateBasic() error {
+	if b == nil {
+		return errors.New("Nil blocks are invalid")
+	}
+	b.mtx.Lock()
+	defer b.mtx.Unlock()
+
 	newTxs := int64(len(b.Data.Txs))
 	if b.NumTxs != newTxs {
 		return fmt.Errorf("Wrong Block.Header.NumTxs. Expected %v, got %v", newTxs, b.NumTxs)
@@ -69,8 +76,8 @@ func (b *Block) ValidateBasic() error {
 	return nil
 }
 
-// FillHeader fills in any remaining header fields that are a function of the block data
-func (b *Block) FillHeader() {
+// fillHeader fills in any remaining header fields that are a function of the block data
+func (b *Block) fillHeader() {
 	if b.LastCommitHash == nil {
 		b.LastCommitHash = b.LastCommit.Hash()
 	}
@@ -85,17 +92,31 @@ func (b *Block) FillHeader() {
 // Hash computes and returns the block hash.
 // If the block is incomplete, block hash is nil for safety.
 func (b *Block) Hash() cmn.HexBytes {
+	if b == nil {
+		return nil
+	}
+	b.mtx.Lock()
+	defer b.mtx.Unlock()
+
 	if b == nil || b.Header == nil || b.Data == nil || b.LastCommit == nil {
 		return nil
 	}
-	b.FillHeader()
+	b.fillHeader()
 	return b.Header.Hash()
 }
 
 // MakePartSet returns a PartSet containing parts of a serialized block.
 // This is the form in which the block is gossipped to peers.
 func (b *Block) MakePartSet(partSize int) *PartSet {
-	bz, err := wire.MarshalBinary(b)
+	if b == nil {
+		return nil
+	}
+	b.mtx.Lock()
+	defer b.mtx.Unlock()
+
+	// We prefix the byte length, so that unmarshaling
+	// can easily happen via a reader.
+	bz, err := cdc.MarshalBinary(b)
 	if err != nil {
 		panic(err)
 	}
@@ -103,7 +124,7 @@ func (b *Block) MakePartSet(partSize int) *PartSet {
 }
 
 // HashesTo is a convenience function that checks if a block hashes to the given argument.
-// A nil block never hashes to anything, and nothing hashes to a nil hash.
+// Returns false if the block is nil or the hash is empty.
 func (b *Block) HashesTo(hash []byte) bool {
 	if len(hash) == 0 {
 		return false
@@ -184,19 +205,19 @@ func (h *Header) Hash() cmn.HexBytes {
 		return nil
 	}
 	return merkle.SimpleHashFromMap(map[string]merkle.Hasher{
-		"ChainID":     wireHasher(h.ChainID),
-		"Height":      wireHasher(h.Height),
-		"Time":        wireHasher(h.Time),
-		"NumTxs":      wireHasher(h.NumTxs),
-		"TotalTxs":    wireHasher(h.TotalTxs),
-		"LastBlockID": wireHasher(h.LastBlockID),
-		"LastCommit":  wireHasher(h.LastCommitHash),
-		"Data":        wireHasher(h.DataHash),
-		"Validators":  wireHasher(h.ValidatorsHash),
-		"App":         wireHasher(h.AppHash),
-		"Consensus":   wireHasher(h.ConsensusHash),
-		"Results":     wireHasher(h.LastResultsHash),
-		"Evidence":    wireHasher(h.EvidenceHash),
+		"ChainID":     aminoHasher(h.ChainID),
+		"Height":      aminoHasher(h.Height),
+		"Time":        aminoHasher(h.Time),
+		"NumTxs":      aminoHasher(h.NumTxs),
+		"TotalTxs":    aminoHasher(h.TotalTxs),
+		"LastBlockID": aminoHasher(h.LastBlockID),
+		"LastCommit":  aminoHasher(h.LastCommitHash),
+		"Data":        aminoHasher(h.DataHash),
+		"Validators":  aminoHasher(h.ValidatorsHash),
+		"App":         aminoHasher(h.AppHash),
+		"Consensus":   aminoHasher(h.ConsensusHash),
+		"Results":     aminoHasher(h.LastResultsHash),
+		"Evidence":    aminoHasher(h.EvidenceHash),
 	})
 }
 
@@ -244,7 +265,7 @@ type Commit struct {
 	// NOTE: The Precommits are in order of address to preserve the bonded ValidatorSet order.
 	// Any peer with a block can gossip precommits by index with a peer without recalculating the
 	// active ValidatorSet.
-	BlockID    BlockID `json:"blockID"`
+	BlockID    BlockID `json:"block_id"`
 	Precommits []*Vote `json:"precommits"`
 
 	// Volatile
@@ -365,7 +386,7 @@ func (commit *Commit) Hash() cmn.HexBytes {
 	if commit.hash == nil {
 		bs := make([]merkle.Hasher, len(commit.Precommits))
 		for i, precommit := range commit.Precommits {
-			bs[i] = wireHasher(precommit)
+			bs[i] = aminoHasher(precommit)
 		}
 		commit.hash = merkle.SimpleHashFromHashers(bs)
 	}
@@ -503,7 +524,7 @@ func (blockID BlockID) Equals(other BlockID) bool {
 
 // Key returns a machine-readable string representation of the BlockID
 func (blockID BlockID) Key() string {
-	bz, err := wire.MarshalBinary(blockID.PartsHeader)
+	bz, err := cdc.MarshalBinaryBare(blockID.PartsHeader)
 	if err != nil {
 		panic(err)
 	}
@@ -523,23 +544,25 @@ type hasher struct {
 
 func (h hasher) Hash() []byte {
 	hasher := ripemd160.New()
-	bz, err := wire.MarshalBinary(h.item)
-	if err != nil {
-		panic(err)
-	}
-	_, err = hasher.Write(bz)
-	if err != nil {
-		panic(err)
+	if h.item != nil && !cmn.IsTypedNil(h.item) && !cmn.IsEmpty(h.item) {
+		bz, err := cdc.MarshalBinaryBare(h.item)
+		if err != nil {
+			panic(err)
+		}
+		_, err = hasher.Write(bz)
+		if err != nil {
+			panic(err)
+		}
 	}
 	return hasher.Sum(nil)
 
 }
 
-func tmHash(item interface{}) []byte {
+func aminoHash(item interface{}) []byte {
 	h := hasher{item}
 	return h.Hash()
 }
 
-func wireHasher(item interface{}) merkle.Hasher {
+func aminoHasher(item interface{}) merkle.Hasher {
 	return hasher{item}
 }
diff --git a/vendor/github.com/tendermint/tendermint/types/canonical_json.go b/vendor/github.com/tendermint/tendermint/types/canonical_json.go
index 4eeeb20640487b4fa4d0515c233c1556209b15ab..95ade9c67bba1cb96598e2e6fc0fab4746986653 100644
--- a/vendor/github.com/tendermint/tendermint/types/canonical_json.go
+++ b/vendor/github.com/tendermint/tendermint/types/canonical_json.go
@@ -3,14 +3,14 @@ package types
 import (
 	"time"
 
-	wire "github.com/tendermint/tendermint/wire"
+	"github.com/tendermint/go-amino"
 	cmn "github.com/tendermint/tmlibs/common"
 )
 
-// canonical json is wire's json for structs with fields in alphabetical order
+// Canonical json is amino's json for structs with fields in alphabetical order
 
 // TimeFormat is used for generating the sigs
-const TimeFormat = wire.RFC3339Millis
+const TimeFormat = amino.RFC3339Millis
 
 type CanonicalJSONBlockID struct {
 	Hash        cmn.HexBytes               `json:"hash,omitempty"`
@@ -18,11 +18,13 @@ type CanonicalJSONBlockID struct {
 }
 
 type CanonicalJSONPartSetHeader struct {
-	Hash  cmn.HexBytes `json:"hash"`
-	Total int          `json:"total"`
+	Hash  cmn.HexBytes `json:"hash,omitempty"`
+	Total int          `json:"total,omitempty"`
 }
 
 type CanonicalJSONProposal struct {
+	ChainID          string                     `json:"@chain_id"`
+	Type             string                     `json:"@type"`
 	BlockPartsHeader CanonicalJSONPartSetHeader `json:"block_parts_header"`
 	Height           int64                      `json:"height"`
 	POLBlockID       CanonicalJSONBlockID       `json:"pol_block_id"`
@@ -32,14 +34,18 @@ type CanonicalJSONProposal struct {
 }
 
 type CanonicalJSONVote struct {
+	ChainID   string               `json:"@chain_id"`
+	Type      string               `json:"@type"`
 	BlockID   CanonicalJSONBlockID `json:"block_id"`
 	Height    int64                `json:"height"`
 	Round     int                  `json:"round"`
 	Timestamp string               `json:"timestamp"`
-	Type      byte                 `json:"type"`
+	VoteType  byte                 `json:"type"`
 }
 
 type CanonicalJSONHeartbeat struct {
+	ChainID          string  `json:"@chain_id"`
+	Type             string  `json:"@type"`
 	Height           int64   `json:"height"`
 	Round            int     `json:"round"`
 	Sequence         int     `json:"sequence"`
@@ -47,24 +53,6 @@ type CanonicalJSONHeartbeat struct {
 	ValidatorIndex   int     `json:"validator_index"`
 }
 
-//------------------------------------
-// Messages including a "chain id" can only be applied to one chain, hence "Once"
-
-type CanonicalJSONOnceProposal struct {
-	ChainID  string                `json:"chain_id"`
-	Proposal CanonicalJSONProposal `json:"proposal"`
-}
-
-type CanonicalJSONOnceVote struct {
-	ChainID string            `json:"chain_id"`
-	Vote    CanonicalJSONVote `json:"vote"`
-}
-
-type CanonicalJSONOnceHeartbeat struct {
-	ChainID   string                 `json:"chain_id"`
-	Heartbeat CanonicalJSONHeartbeat `json:"heartbeat"`
-}
-
 //-----------------------------------
 // Canonicalize the structs
 
@@ -82,8 +70,10 @@ func CanonicalPartSetHeader(psh PartSetHeader) CanonicalJSONPartSetHeader {
 	}
 }
 
-func CanonicalProposal(proposal *Proposal) CanonicalJSONProposal {
+func CanonicalProposal(chainID string, proposal *Proposal) CanonicalJSONProposal {
 	return CanonicalJSONProposal{
+		ChainID:          chainID,
+		Type:             "proposal",
 		BlockPartsHeader: CanonicalPartSetHeader(proposal.BlockPartsHeader),
 		Height:           proposal.Height,
 		Timestamp:        CanonicalTime(proposal.Timestamp),
@@ -93,28 +83,32 @@ func CanonicalProposal(proposal *Proposal) CanonicalJSONProposal {
 	}
 }
 
-func CanonicalVote(vote *Vote) CanonicalJSONVote {
+func CanonicalVote(chainID string, vote *Vote) CanonicalJSONVote {
 	return CanonicalJSONVote{
+		ChainID:   chainID,
+		Type:      "vote",
 		BlockID:   CanonicalBlockID(vote.BlockID),
 		Height:    vote.Height,
 		Round:     vote.Round,
 		Timestamp: CanonicalTime(vote.Timestamp),
-		Type:      vote.Type,
+		VoteType:  vote.Type,
 	}
 }
 
-func CanonicalHeartbeat(heartbeat *Heartbeat) CanonicalJSONHeartbeat {
+func CanonicalHeartbeat(chainID string, heartbeat *Heartbeat) CanonicalJSONHeartbeat {
 	return CanonicalJSONHeartbeat{
-		heartbeat.Height,
-		heartbeat.Round,
-		heartbeat.Sequence,
-		heartbeat.ValidatorAddress,
-		heartbeat.ValidatorIndex,
+		ChainID:          chainID,
+		Type:             "heartbeat",
+		Height:           heartbeat.Height,
+		Round:            heartbeat.Round,
+		Sequence:         heartbeat.Sequence,
+		ValidatorAddress: heartbeat.ValidatorAddress,
+		ValidatorIndex:   heartbeat.ValidatorIndex,
 	}
 }
 
 func CanonicalTime(t time.Time) string {
-	// note that sending time over wire resets it to
+	// Note that sending time over amino resets it to
 	// local time, we need to force UTC here, so the
 	// signatures match
 	return t.UTC().Format(TimeFormat)
diff --git a/vendor/github.com/tendermint/tendermint/types/event_bus.go b/vendor/github.com/tendermint/tendermint/types/event_bus.go
index 37bd5619de5da43a7f1652f420271327df6116be..2bc339da7fa38ed2364500301b1483f27052497f 100644
--- a/vendor/github.com/tendermint/tendermint/types/event_bus.go
+++ b/vendor/github.com/tendermint/tendermint/types/event_bus.go
@@ -6,7 +6,7 @@ import (
 
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/log"
-	tmpubsub "github.com/tendermint/tmlibs/pubsub"
+	tmpubsub "github.com/tendermint/tendermint/libs/pubsub"
 )
 
 const defaultCapacity = 1000
@@ -67,22 +67,22 @@ func (b *EventBus) UnsubscribeAll(ctx context.Context, subscriber string) error
 func (b *EventBus) Publish(eventType string, eventData TMEventData) error {
 	// no explicit deadline for publishing events
 	ctx := context.Background()
-	b.pubsub.PublishWithTags(ctx, eventData, map[string]interface{}{EventTypeKey: eventType})
+	b.pubsub.PublishWithTags(ctx, eventData, tmpubsub.NewTagMap(map[string]string{EventTypeKey: eventType}))
 	return nil
 }
 
 //--- block, tx, and vote events
 
 func (b *EventBus) PublishEventNewBlock(event EventDataNewBlock) error {
-	return b.Publish(EventNewBlock, TMEventData{event})
+	return b.Publish(EventNewBlock, event)
 }
 
 func (b *EventBus) PublishEventNewBlockHeader(event EventDataNewBlockHeader) error {
-	return b.Publish(EventNewBlockHeader, TMEventData{event})
+	return b.Publish(EventNewBlockHeader, event)
 }
 
 func (b *EventBus) PublishEventVote(event EventDataVote) error {
-	return b.Publish(EventVote, TMEventData{event})
+	return b.Publish(EventVote, event)
 }
 
 // PublishEventTx publishes tx event with tags from Result. Note it will add
@@ -92,7 +92,7 @@ func (b *EventBus) PublishEventTx(event EventDataTx) error {
 	// no explicit deadline for publishing events
 	ctx := context.Background()
 
-	tags := make(map[string]interface{})
+	tags := make(map[string]string)
 
 	// validate and fill tags from tx result
 	for _, tag := range event.Result.Tags {
@@ -112,55 +112,55 @@ func (b *EventBus) PublishEventTx(event EventDataTx) error {
 	tags[TxHashKey] = fmt.Sprintf("%X", event.Tx.Hash())
 
 	logIfTagExists(TxHeightKey, tags, b.Logger)
-	tags[TxHeightKey] = event.Height
+	tags[TxHeightKey] = fmt.Sprintf("%d", event.Height)
 
-	b.pubsub.PublishWithTags(ctx, TMEventData{event}, tags)
+	b.pubsub.PublishWithTags(ctx, event, tmpubsub.NewTagMap(tags))
 	return nil
 }
 
 func (b *EventBus) PublishEventProposalHeartbeat(event EventDataProposalHeartbeat) error {
-	return b.Publish(EventProposalHeartbeat, TMEventData{event})
+	return b.Publish(EventProposalHeartbeat, event)
 }
 
 //--- EventDataRoundState events
 
 func (b *EventBus) PublishEventNewRoundStep(event EventDataRoundState) error {
-	return b.Publish(EventNewRoundStep, TMEventData{event})
+	return b.Publish(EventNewRoundStep, event)
 }
 
 func (b *EventBus) PublishEventTimeoutPropose(event EventDataRoundState) error {
-	return b.Publish(EventTimeoutPropose, TMEventData{event})
+	return b.Publish(EventTimeoutPropose, event)
 }
 
 func (b *EventBus) PublishEventTimeoutWait(event EventDataRoundState) error {
-	return b.Publish(EventTimeoutWait, TMEventData{event})
+	return b.Publish(EventTimeoutWait, event)
 }
 
 func (b *EventBus) PublishEventNewRound(event EventDataRoundState) error {
-	return b.Publish(EventNewRound, TMEventData{event})
+	return b.Publish(EventNewRound, event)
 }
 
 func (b *EventBus) PublishEventCompleteProposal(event EventDataRoundState) error {
-	return b.Publish(EventCompleteProposal, TMEventData{event})
+	return b.Publish(EventCompleteProposal, event)
 }
 
 func (b *EventBus) PublishEventPolka(event EventDataRoundState) error {
-	return b.Publish(EventPolka, TMEventData{event})
+	return b.Publish(EventPolka, event)
 }
 
 func (b *EventBus) PublishEventUnlock(event EventDataRoundState) error {
-	return b.Publish(EventUnlock, TMEventData{event})
+	return b.Publish(EventUnlock, event)
 }
 
 func (b *EventBus) PublishEventRelock(event EventDataRoundState) error {
-	return b.Publish(EventRelock, TMEventData{event})
+	return b.Publish(EventRelock, event)
 }
 
 func (b *EventBus) PublishEventLock(event EventDataRoundState) error {
-	return b.Publish(EventLock, TMEventData{event})
+	return b.Publish(EventLock, event)
 }
 
-func logIfTagExists(tag string, tags map[string]interface{}, logger log.Logger) {
+func logIfTagExists(tag string, tags map[string]string, logger log.Logger) {
 	if value, ok := tags[tag]; ok {
 		logger.Error("Found predefined tag (value will be overwritten)", "tag", tag, "value", value)
 	}
diff --git a/vendor/github.com/tendermint/tendermint/types/events.go b/vendor/github.com/tendermint/tendermint/types/events.go
index d6f7b012ca820f5a87491a3dec2740e77d57d92d..2b87297cdcee4ac9928c6ef787d6459d83d24d90 100644
--- a/vendor/github.com/tendermint/tendermint/types/events.go
+++ b/vendor/github.com/tendermint/tendermint/types/events.go
@@ -3,9 +3,9 @@ package types
 import (
 	"fmt"
 
-	"github.com/tendermint/go-wire/data"
-	tmpubsub "github.com/tendermint/tmlibs/pubsub"
-	tmquery "github.com/tendermint/tmlibs/pubsub/query"
+	amino "github.com/tendermint/go-amino"
+	tmpubsub "github.com/tendermint/tendermint/libs/pubsub"
+	tmquery "github.com/tendermint/tendermint/libs/pubsub/query"
 )
 
 // Reserved event types
@@ -35,66 +35,31 @@ const (
 // ENCODING / DECODING
 ///////////////////////////////////////////////////////////////////////////////
 
-var (
-	EventDataNameNewBlock          = "new_block"
-	EventDataNameNewBlockHeader    = "new_block_header"
-	EventDataNameTx                = "tx"
-	EventDataNameRoundState        = "round_state"
-	EventDataNameVote              = "vote"
-	EventDataNameProposalHeartbeat = "proposal_heartbeat"
-)
-
 // implements events.EventData
-type TMEventDataInner interface {
+type TMEventData interface {
+	AssertIsTMEventData()
 	// empty interface
 }
 
-type TMEventData struct {
-	TMEventDataInner `json:"unwrap"`
-}
-
-func (tmr TMEventData) MarshalJSON() ([]byte, error) {
-	return tmEventDataMapper.ToJSON(tmr.TMEventDataInner)
-}
-
-func (tmr *TMEventData) UnmarshalJSON(data []byte) (err error) {
-	parsed, err := tmEventDataMapper.FromJSON(data)
-	if err == nil && parsed != nil {
-		tmr.TMEventDataInner = parsed.(TMEventDataInner)
-	}
-	return
-}
+func (_ EventDataNewBlock) AssertIsTMEventData()          {}
+func (_ EventDataNewBlockHeader) AssertIsTMEventData()    {}
+func (_ EventDataTx) AssertIsTMEventData()                {}
+func (_ EventDataRoundState) AssertIsTMEventData()        {}
+func (_ EventDataVote) AssertIsTMEventData()              {}
+func (_ EventDataProposalHeartbeat) AssertIsTMEventData() {}
+func (_ EventDataString) AssertIsTMEventData()            {}
 
-func (tmr TMEventData) Unwrap() TMEventDataInner {
-	tmrI := tmr.TMEventDataInner
-	for wrap, ok := tmrI.(TMEventData); ok; wrap, ok = tmrI.(TMEventData) {
-		tmrI = wrap.TMEventDataInner
-	}
-	return tmrI
+func RegisterEventDatas(cdc *amino.Codec) {
+	cdc.RegisterInterface((*TMEventData)(nil), nil)
+	cdc.RegisterConcrete(EventDataNewBlock{}, "tendermint/event/NewBlock", nil)
+	cdc.RegisterConcrete(EventDataNewBlockHeader{}, "tendermint/event/NewBlockHeader", nil)
+	cdc.RegisterConcrete(EventDataTx{}, "tendermint/event/Tx", nil)
+	cdc.RegisterConcrete(EventDataRoundState{}, "tendermint/event/RoundState", nil)
+	cdc.RegisterConcrete(EventDataVote{}, "tendermint/event/Vote", nil)
+	cdc.RegisterConcrete(EventDataProposalHeartbeat{}, "tendermint/event/ProposalHeartbeat", nil)
+	cdc.RegisterConcrete(EventDataString(""), "tendermint/event/ProposalString", nil)
 }
 
-func (tmr TMEventData) Empty() bool {
-	return tmr.TMEventDataInner == nil
-}
-
-const (
-	EventDataTypeNewBlock          = byte(0x01)
-	EventDataTypeFork              = byte(0x02)
-	EventDataTypeTx                = byte(0x03)
-	EventDataTypeNewBlockHeader    = byte(0x04)
-	EventDataTypeRoundState        = byte(0x11)
-	EventDataTypeVote              = byte(0x12)
-	EventDataTypeProposalHeartbeat = byte(0x20)
-)
-
-var tmEventDataMapper = data.NewMapper(TMEventData{}).
-	RegisterImplementation(EventDataNewBlock{}, EventDataNameNewBlock, EventDataTypeNewBlock).
-	RegisterImplementation(EventDataNewBlockHeader{}, EventDataNameNewBlockHeader, EventDataTypeNewBlockHeader).
-	RegisterImplementation(EventDataTx{}, EventDataNameTx, EventDataTypeTx).
-	RegisterImplementation(EventDataRoundState{}, EventDataNameRoundState, EventDataTypeRoundState).
-	RegisterImplementation(EventDataVote{}, EventDataNameVote, EventDataTypeVote).
-	RegisterImplementation(EventDataProposalHeartbeat{}, EventDataNameProposalHeartbeat, EventDataTypeProposalHeartbeat)
-
 // Most event messages are basic types (a block, a transaction)
 // but some (an input to a call tx or a receive) are more exotic
 
@@ -130,6 +95,8 @@ type EventDataVote struct {
 	Vote *Vote
 }
 
+type EventDataString string
+
 ///////////////////////////////////////////////////////////////////////////////
 // PUBSUB
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/vendor/github.com/tendermint/tendermint/types/evidence.go b/vendor/github.com/tendermint/tendermint/types/evidence.go
index 0b34960457972c2f64fe2bc50c3993b064c745dc..10907869e0f0c0d793c8d20067dc245cb3fa4db6 100644
--- a/vendor/github.com/tendermint/tendermint/types/evidence.go
+++ b/vendor/github.com/tendermint/tendermint/types/evidence.go
@@ -4,8 +4,8 @@ import (
 	"bytes"
 	"fmt"
 
+	"github.com/tendermint/go-amino"
 	"github.com/tendermint/go-crypto"
-	wire "github.com/tendermint/tendermint/wire"
 	"github.com/tendermint/tmlibs/merkle"
 )
 
@@ -28,68 +28,22 @@ func (err *ErrEvidenceInvalid) Error() string {
 
 // Evidence represents any provable malicious activity by a validator
 type Evidence interface {
-	Height() int64               // height of the equivocation
-	Address() []byte             // address of the equivocating validator
-	Index() int                  // index of the validator in the validator set
-	Hash() []byte                // hash of the evidence
-	Verify(chainID string) error // verify the evidence
-	Equal(Evidence) bool         // check equality of evidence
+	Height() int64                                     // height of the equivocation
+	Address() []byte                                   // address of the equivocating validator
+	Hash() []byte                                      // hash of the evidence
+	Verify(chainID string, pubKey crypto.PubKey) error // verify the evidence
+	Equal(Evidence) bool                               // check equality of evidence
 
 	String() string
 }
 
-//-------------------------------------------
-
-// EvidenceList is a list of Evidence. Evidences is not a word.
-type EvidenceList []Evidence
-
-// Hash returns the simple merkle root hash of the EvidenceList.
-func (evl EvidenceList) Hash() []byte {
-	// Recursive impl.
-	// Copied from tmlibs/merkle to avoid allocations
-	switch len(evl) {
-	case 0:
-		return nil
-	case 1:
-		return evl[0].Hash()
-	default:
-		left := EvidenceList(evl[:(len(evl)+1)/2]).Hash()
-		right := EvidenceList(evl[(len(evl)+1)/2:]).Hash()
-		return merkle.SimpleHashFromTwoHashes(left, right)
-	}
-}
-
-func (evl EvidenceList) String() string {
-	s := ""
-	for _, e := range evl {
-		s += fmt.Sprintf("%s\t\t", e)
-	}
-	return s
-}
-
-// Has returns true if the evidence is in the EvidenceList.
-func (evl EvidenceList) Has(evidence Evidence) bool {
-	for _, ev := range evl {
-		if ev.Equal(evidence) {
-			return true
-		}
-	}
-	return false
+func RegisterEvidences(cdc *amino.Codec) {
+	cdc.RegisterInterface((*Evidence)(nil), nil)
+	cdc.RegisterConcrete(&DuplicateVoteEvidence{}, "tendermint/DuplicateVoteEvidence", nil)
 }
 
 //-------------------------------------------
 
-const (
-	evidenceTypeDuplicateVote = byte(0x01)
-)
-
-var _ = wire.RegisterInterface(
-	struct{ Evidence }{},
-	wire.ConcreteType{&DuplicateVoteEvidence{}, evidenceTypeDuplicateVote},
-)
-
-//-------------------------------------------
-
 // DuplicateVoteEvidence contains evidence a validator signed two conflicting votes.
 type DuplicateVoteEvidence struct {
 	PubKey crypto.PubKey
@@ -113,19 +67,14 @@ func (dve *DuplicateVoteEvidence) Address() []byte {
 	return dve.PubKey.Address()
 }
 
-// Index returns the index of the validator.
-func (dve *DuplicateVoteEvidence) Index() int {
-	return dve.VoteA.ValidatorIndex
-}
-
 // Hash returns the hash of the evidence.
 func (dve *DuplicateVoteEvidence) Hash() []byte {
-	return wireHasher(dve).Hash()
+	return aminoHasher(dve).Hash()
 }
 
 // Verify returns an error if the two votes aren't conflicting.
 // To be conflicting, they must be from the same validator, for the same H/R/S, but for different blocks.
-func (dve *DuplicateVoteEvidence) Verify(chainID string) error {
+func (dve *DuplicateVoteEvidence) Verify(chainID string, pubKey crypto.PubKey) error {
 	// H/R/S must be the same
 	if dve.VoteA.Height != dve.VoteB.Height ||
 		dve.VoteA.Round != dve.VoteB.Round ||
@@ -137,7 +86,8 @@ func (dve *DuplicateVoteEvidence) Verify(chainID string) error {
 	if !bytes.Equal(dve.VoteA.ValidatorAddress, dve.VoteB.ValidatorAddress) {
 		return fmt.Errorf("DuplicateVoteEvidence Error: Validator addresses do not match. Got %X and %X", dve.VoteA.ValidatorAddress, dve.VoteB.ValidatorAddress)
 	}
-	// XXX: Should we enforce index is the same ?
+
+	// Index must be the same
 	if dve.VoteA.ValidatorIndex != dve.VoteB.ValidatorIndex {
 		return fmt.Errorf("DuplicateVoteEvidence Error: Validator indices do not match. Got %d and %d", dve.VoteA.ValidatorIndex, dve.VoteB.ValidatorIndex)
 	}
@@ -147,11 +97,18 @@ func (dve *DuplicateVoteEvidence) Verify(chainID string) error {
 		return fmt.Errorf("DuplicateVoteEvidence Error: BlockIDs are the same (%v) - not a real duplicate vote", dve.VoteA.BlockID)
 	}
 
+	// pubkey must match address (this should already be true, sanity check)
+	addr := dve.VoteA.ValidatorAddress
+	if !bytes.Equal(pubKey.Address(), addr) {
+		return fmt.Errorf("DuplicateVoteEvidence FAILED SANITY CHECK - address (%X) doesn't match pubkey (%v - %X)",
+			addr, pubKey, pubKey.Address())
+	}
+
 	// Signatures must be valid
-	if !dve.PubKey.VerifyBytes(dve.VoteA.SignBytes(chainID), dve.VoteA.Signature) {
+	if !pubKey.VerifyBytes(dve.VoteA.SignBytes(chainID), dve.VoteA.Signature) {
 		return fmt.Errorf("DuplicateVoteEvidence Error verifying VoteA: %v", ErrVoteInvalidSignature)
 	}
-	if !dve.PubKey.VerifyBytes(dve.VoteB.SignBytes(chainID), dve.VoteB.Signature) {
+	if !pubKey.VerifyBytes(dve.VoteB.SignBytes(chainID), dve.VoteB.Signature) {
 		return fmt.Errorf("DuplicateVoteEvidence Error verifying VoteB: %v", ErrVoteInvalidSignature)
 	}
 
@@ -165,8 +122,8 @@ func (dve *DuplicateVoteEvidence) Equal(ev Evidence) bool {
 	}
 
 	// just check their hashes
-	dveHash := wireHasher(dve).Hash()
-	evHash := wireHasher(ev).Hash()
+	dveHash := aminoHasher(dve).Hash()
+	evHash := aminoHasher(ev).Hash()
 	return bytes.Equal(dveHash, evHash)
 }
 
@@ -176,29 +133,26 @@ func (dve *DuplicateVoteEvidence) Equal(ev Evidence) bool {
 type MockGoodEvidence struct {
 	Height_  int64
 	Address_ []byte
-	Index_   int
 }
 
 // UNSTABLE
-func NewMockGoodEvidence(height int64, index int, address []byte) MockGoodEvidence {
-	return MockGoodEvidence{height, address, index}
+func NewMockGoodEvidence(height int64, idx int, address []byte) MockGoodEvidence {
+	return MockGoodEvidence{height, address}
 }
 
 func (e MockGoodEvidence) Height() int64   { return e.Height_ }
 func (e MockGoodEvidence) Address() []byte { return e.Address_ }
-func (e MockGoodEvidence) Index() int      { return e.Index_ }
 func (e MockGoodEvidence) Hash() []byte {
-	return []byte(fmt.Sprintf("%d-%d", e.Height_, e.Index_))
+	return []byte(fmt.Sprintf("%d-%x", e.Height_, e.Address_))
 }
-func (e MockGoodEvidence) Verify(chainID string) error { return nil }
+func (e MockGoodEvidence) Verify(chainID string, pubKey crypto.PubKey) error { return nil }
 func (e MockGoodEvidence) Equal(ev Evidence) bool {
 	e2 := ev.(MockGoodEvidence)
 	return e.Height_ == e2.Height_ &&
-		bytes.Equal(e.Address_, e2.Address_) &&
-		e.Index_ == e2.Index_
+		bytes.Equal(e.Address_, e2.Address_)
 }
 func (e MockGoodEvidence) String() string {
-	return fmt.Sprintf("GoodEvidence: %d/%s/%d", e.Height_, e.Address_, e.Index_)
+	return fmt.Sprintf("GoodEvidence: %d/%s", e.Height_, e.Address_)
 }
 
 // UNSTABLE
@@ -206,13 +160,53 @@ type MockBadEvidence struct {
 	MockGoodEvidence
 }
 
-func (e MockBadEvidence) Verify(chainID string) error { return fmt.Errorf("MockBadEvidence") }
+func (e MockBadEvidence) Verify(chainID string, pubKey crypto.PubKey) error {
+	return fmt.Errorf("MockBadEvidence")
+}
 func (e MockBadEvidence) Equal(ev Evidence) bool {
 	e2 := ev.(MockBadEvidence)
 	return e.Height_ == e2.Height_ &&
-		bytes.Equal(e.Address_, e2.Address_) &&
-		e.Index_ == e2.Index_
+		bytes.Equal(e.Address_, e2.Address_)
 }
 func (e MockBadEvidence) String() string {
-	return fmt.Sprintf("BadEvidence: %d/%s/%d", e.Height_, e.Address_, e.Index_)
+	return fmt.Sprintf("BadEvidence: %d/%s", e.Height_, e.Address_)
+}
+
+//-------------------------------------------
+
+// EvidenceList is a list of Evidence. Evidences is not a word.
+type EvidenceList []Evidence
+
+// Hash returns the simple merkle root hash of the EvidenceList.
+func (evl EvidenceList) Hash() []byte {
+	// Recursive impl.
+	// Copied from tmlibs/merkle to avoid allocations
+	switch len(evl) {
+	case 0:
+		return nil
+	case 1:
+		return evl[0].Hash()
+	default:
+		left := EvidenceList(evl[:(len(evl)+1)/2]).Hash()
+		right := EvidenceList(evl[(len(evl)+1)/2:]).Hash()
+		return merkle.SimpleHashFromTwoHashes(left, right)
+	}
+}
+
+func (evl EvidenceList) String() string {
+	s := ""
+	for _, e := range evl {
+		s += fmt.Sprintf("%s\t\t", e)
+	}
+	return s
+}
+
+// Has returns true if the evidence is in the EvidenceList.
+func (evl EvidenceList) Has(evidence Evidence) bool {
+	for _, ev := range evl {
+		if ev.Equal(evidence) {
+			return true
+		}
+	}
+	return false
 }
diff --git a/vendor/github.com/tendermint/tendermint/types/genesis.go b/vendor/github.com/tendermint/tendermint/types/genesis.go
index 21c61806a955ce64cfff723347bba6b742f7fcf2..aee8e07670f97d2b4451fcfc0678401cfeae97fc 100644
--- a/vendor/github.com/tendermint/tendermint/types/genesis.go
+++ b/vendor/github.com/tendermint/tendermint/types/genesis.go
@@ -5,9 +5,7 @@ import (
 	"io/ioutil"
 	"time"
 
-	"github.com/pkg/errors"
-
-	crypto "github.com/tendermint/go-crypto"
+	"github.com/tendermint/go-crypto"
 	cmn "github.com/tendermint/tmlibs/common"
 )
 
@@ -43,7 +41,7 @@ func (genDoc *GenesisDoc) AppState() json.RawMessage {
 
 // SaveAs is a utility method for saving GenensisDoc as a JSON file.
 func (genDoc *GenesisDoc) SaveAs(file string) error {
-	genDocBytes, err := json.Marshal(genDoc)
+	genDocBytes, err := cdc.MarshalJSONIndent(genDoc, "", "  ")
 	if err != nil {
 		return err
 	}
@@ -65,7 +63,7 @@ func (genDoc *GenesisDoc) ValidatorHash() []byte {
 func (genDoc *GenesisDoc) ValidateAndComplete() error {
 
 	if genDoc.ChainID == "" {
-		return errors.Errorf("Genesis doc must include non-empty chain_id")
+		return cmn.NewError("Genesis doc must include non-empty chain_id")
 	}
 
 	if genDoc.ConsensusParams == nil {
@@ -77,12 +75,12 @@ func (genDoc *GenesisDoc) ValidateAndComplete() error {
 	}
 
 	if len(genDoc.Validators) == 0 {
-		return errors.Errorf("The genesis file must have at least one validator")
+		return cmn.NewError("The genesis file must have at least one validator")
 	}
 
 	for _, v := range genDoc.Validators {
 		if v.Power == 0 {
-			return errors.Errorf("The genesis file cannot contain validators with no voting power: %v", v)
+			return cmn.NewError("The genesis file cannot contain validators with no voting power: %v", v)
 		}
 	}
 
@@ -99,7 +97,7 @@ func (genDoc *GenesisDoc) ValidateAndComplete() error {
 // GenesisDocFromJSON unmarshalls JSON data into a GenesisDoc.
 func GenesisDocFromJSON(jsonBlob []byte) (*GenesisDoc, error) {
 	genDoc := GenesisDoc{}
-	err := json.Unmarshal(jsonBlob, &genDoc)
+	err := cdc.UnmarshalJSON(jsonBlob, &genDoc)
 	if err != nil {
 		return nil, err
 	}
@@ -115,11 +113,11 @@ func GenesisDocFromJSON(jsonBlob []byte) (*GenesisDoc, error) {
 func GenesisDocFromFile(genDocFile string) (*GenesisDoc, error) {
 	jsonBlob, err := ioutil.ReadFile(genDocFile)
 	if err != nil {
-		return nil, errors.Wrap(err, "Couldn't read GenesisDoc file")
+		return nil, cmn.ErrorWrap(err, "Couldn't read GenesisDoc file")
 	}
 	genDoc, err := GenesisDocFromJSON(jsonBlob)
 	if err != nil {
-		return nil, errors.Wrap(err, cmn.Fmt("Error reading GenesisDoc at %v", genDocFile))
+		return nil, cmn.ErrorWrap(err, cmn.Fmt("Error reading GenesisDoc at %v", genDocFile))
 	}
 	return genDoc, nil
 }
diff --git a/vendor/github.com/tendermint/tendermint/types/heartbeat.go b/vendor/github.com/tendermint/tendermint/types/heartbeat.go
index 8b86a15bae3bf41acfc70399a1042e3e4ef8b4af..097dd22db7a93b110432c3f2b7070cec55f070da 100644
--- a/vendor/github.com/tendermint/tendermint/types/heartbeat.go
+++ b/vendor/github.com/tendermint/tendermint/types/heartbeat.go
@@ -4,7 +4,6 @@ import (
 	"fmt"
 
 	"github.com/tendermint/go-crypto"
-	"github.com/tendermint/tendermint/wire"
 	cmn "github.com/tendermint/tmlibs/common"
 )
 
@@ -25,10 +24,7 @@ type Heartbeat struct {
 // SignBytes returns the Heartbeat bytes for signing.
 // It panics if the Heartbeat is nil.
 func (heartbeat *Heartbeat) SignBytes(chainID string) []byte {
-	bz, err := wire.MarshalJSON(CanonicalJSONOnceHeartbeat{
-		chainID,
-		CanonicalHeartbeat(heartbeat),
-	})
+	bz, err := cdc.MarshalJSON(CanonicalHeartbeat(chainID, heartbeat))
 	if err != nil {
 		panic(err)
 	}
diff --git a/vendor/github.com/tendermint/tendermint/types/nop_event_bus.go b/vendor/github.com/tendermint/tendermint/types/nop_event_bus.go
index 06b70987de9a94a7ffdeaa75b3ab8b04c33cdd84..cd1eab8cd36d0cdbd8687edf12ca38d7d42895e6 100644
--- a/vendor/github.com/tendermint/tendermint/types/nop_event_bus.go
+++ b/vendor/github.com/tendermint/tendermint/types/nop_event_bus.go
@@ -3,7 +3,7 @@ package types
 import (
 	"context"
 
-	tmpubsub "github.com/tendermint/tmlibs/pubsub"
+	tmpubsub "github.com/tendermint/tendermint/libs/pubsub"
 )
 
 type NopEventBus struct{}
diff --git a/vendor/github.com/tendermint/tendermint/types/params.go b/vendor/github.com/tendermint/tendermint/types/params.go
index 0e8ac577f47af922fe76782c49e6c4a86625359d..2df092d62ad5d3dd857fc45b6470c330c714f8c1 100644
--- a/vendor/github.com/tendermint/tendermint/types/params.go
+++ b/vendor/github.com/tendermint/tendermint/types/params.go
@@ -1,14 +1,13 @@
 package types
 
 import (
-	"github.com/pkg/errors"
-
 	abci "github.com/tendermint/abci/types"
+	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/merkle"
 )
 
 const (
-	maxBlockSizeBytes = 104857600 // 100MB
+	MaxBlockSizeBytes = 104857600 // 100MB
 )
 
 // ConsensusParams contains consensus critical parameters
@@ -89,16 +88,16 @@ func DefaultEvidenceParams() EvidenceParams {
 func (params *ConsensusParams) Validate() error {
 	// ensure some values are greater than 0
 	if params.BlockSize.MaxBytes <= 0 {
-		return errors.Errorf("BlockSize.MaxBytes must be greater than 0. Got %d", params.BlockSize.MaxBytes)
+		return cmn.NewError("BlockSize.MaxBytes must be greater than 0. Got %d", params.BlockSize.MaxBytes)
 	}
 	if params.BlockGossip.BlockPartSizeBytes <= 0 {
-		return errors.Errorf("BlockGossip.BlockPartSizeBytes must be greater than 0. Got %d", params.BlockGossip.BlockPartSizeBytes)
+		return cmn.NewError("BlockGossip.BlockPartSizeBytes must be greater than 0. Got %d", params.BlockGossip.BlockPartSizeBytes)
 	}
 
 	// ensure blocks aren't too big
-	if params.BlockSize.MaxBytes > maxBlockSizeBytes {
-		return errors.Errorf("BlockSize.MaxBytes is too big. %d > %d",
-			params.BlockSize.MaxBytes, maxBlockSizeBytes)
+	if params.BlockSize.MaxBytes > MaxBlockSizeBytes {
+		return cmn.NewError("BlockSize.MaxBytes is too big. %d > %d",
+			params.BlockSize.MaxBytes, MaxBlockSizeBytes)
 	}
 	return nil
 }
@@ -107,12 +106,12 @@ func (params *ConsensusParams) Validate() error {
 // in the block header
 func (params *ConsensusParams) Hash() []byte {
 	return merkle.SimpleHashFromMap(map[string]merkle.Hasher{
-		"block_gossip_part_size_bytes": wireHasher(params.BlockGossip.BlockPartSizeBytes),
-		"block_size_max_bytes":         wireHasher(params.BlockSize.MaxBytes),
-		"block_size_max_gas":           wireHasher(params.BlockSize.MaxGas),
-		"block_size_max_txs":           wireHasher(params.BlockSize.MaxTxs),
-		"tx_size_max_bytes":            wireHasher(params.TxSize.MaxBytes),
-		"tx_size_max_gas":              wireHasher(params.TxSize.MaxGas),
+		"block_gossip_part_size_bytes": aminoHasher(params.BlockGossip.BlockPartSizeBytes),
+		"block_size_max_bytes":         aminoHasher(params.BlockSize.MaxBytes),
+		"block_size_max_gas":           aminoHasher(params.BlockSize.MaxGas),
+		"block_size_max_txs":           aminoHasher(params.BlockSize.MaxTxs),
+		"tx_size_max_bytes":            aminoHasher(params.TxSize.MaxBytes),
+		"tx_size_max_gas":              aminoHasher(params.TxSize.MaxGas),
 	})
 }
 
diff --git a/vendor/github.com/tendermint/tendermint/types/part_set.go b/vendor/github.com/tendermint/tendermint/types/part_set.go
index 74994329188f2504558c763a34eb7b785ae9f06b..18cfe802c564f5a4f30da782ce664d32aff20f08 100644
--- a/vendor/github.com/tendermint/tendermint/types/part_set.go
+++ b/vendor/github.com/tendermint/tendermint/types/part_set.go
@@ -176,7 +176,7 @@ func (ps *PartSet) Total() int {
 	return ps.total
 }
 
-func (ps *PartSet) AddPart(part *Part, verify bool) (bool, error) {
+func (ps *PartSet) AddPart(part *Part) (bool, error) {
 	ps.mtx.Lock()
 	defer ps.mtx.Unlock()
 
@@ -191,10 +191,8 @@ func (ps *PartSet) AddPart(part *Part, verify bool) (bool, error) {
 	}
 
 	// Check hash proof
-	if verify {
-		if !part.Proof.Verify(part.Index, ps.total, part.Hash(), ps.Hash()) {
-			return false, ErrPartSetInvalidProof
-		}
+	if !part.Proof.Verify(part.Index, ps.total, part.Hash(), ps.Hash()) {
+		return false, ErrPartSetInvalidProof
 	}
 
 	// Add part
@@ -264,3 +262,20 @@ func (ps *PartSet) StringShort() string {
 	defer ps.mtx.Unlock()
 	return fmt.Sprintf("(%v of %v)", ps.Count(), ps.Total())
 }
+
+func (ps *PartSet) MarshalJSON() ([]byte, error) {
+	if ps == nil {
+		return []byte("{}"), nil
+	}
+
+	ps.mtx.Lock()
+	defer ps.mtx.Unlock()
+
+	return cdc.MarshalJSON(struct {
+		CountTotal    string        `json:"count/total"`
+		PartsBitArray *cmn.BitArray `json:"parts_bit_array"`
+	}{
+		fmt.Sprintf("%d/%d", ps.Count(), ps.Total()),
+		ps.partsBitArray,
+	})
+}
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator.go b/vendor/github.com/tendermint/tendermint/types/priv_validator.go
index 052ace978a32b140bc8d6d57226b26a2ffaaa9b3..8759d3f99f70d501c11686665b3ce4d244c38bcb 100644
--- a/vendor/github.com/tendermint/tendermint/types/priv_validator.go
+++ b/vendor/github.com/tendermint/tendermint/types/priv_validator.go
@@ -2,88 +2,11 @@ package types
 
 import (
 	"bytes"
-	"encoding/json"
-	"errors"
 	"fmt"
-	"io/ioutil"
-	"sync"
-	"time"
 
-	crypto "github.com/tendermint/go-crypto"
-	cmn "github.com/tendermint/tmlibs/common"
+	"github.com/tendermint/go-crypto"
 )
 
-// TODO: type ?
-const (
-	stepNone      int8 = 0 // Used to distinguish the initial state
-	stepPropose   int8 = 1
-	stepPrevote   int8 = 2
-	stepPrecommit int8 = 3
-)
-
-func voteToStep(vote *Vote) int8 {
-	switch vote.Type {
-	case VoteTypePrevote:
-		return stepPrevote
-	case VoteTypePrecommit:
-		return stepPrecommit
-	default:
-		cmn.PanicSanity("Unknown vote type")
-		return 0
-	}
-}
-
-//--------------------------------------------------------------
-// PrivValidator is being upgraded! See types/priv_validator/
-
-// ValidatorID contains the identity of the validator.
-type ValidatorID struct {
-	Address cmn.HexBytes  `json:"address"`
-	PubKey  crypto.PubKey `json:"pub_key"`
-}
-
-// PrivValidator defines the functionality of a local Tendermint validator
-// that signs votes, proposals, and heartbeats, and never double signs.
-type PrivValidator2 interface {
-	Address() (Address, error) // redundant since .PubKey().Address()
-	PubKey() (crypto.PubKey, error)
-
-	SignVote(chainID string, vote *Vote) error
-	SignProposal(chainID string, proposal *Proposal) error
-	SignHeartbeat(chainID string, heartbeat *Heartbeat) error
-}
-
-type TestSigner interface {
-	Address() cmn.HexBytes
-	PubKey() crypto.PubKey
-	Sign([]byte) (crypto.Signature, error)
-}
-
-func GenSigner() TestSigner {
-	return &DefaultTestSigner{
-		crypto.GenPrivKeyEd25519().Wrap(),
-	}
-}
-
-type DefaultTestSigner struct {
-	crypto.PrivKey
-}
-
-func (ds *DefaultTestSigner) Address() cmn.HexBytes {
-	return ds.PubKey().Address()
-}
-
-func (ds *DefaultTestSigner) PubKey() crypto.PubKey {
-	return ds.PrivKey.PubKey()
-}
-
-func (ds *DefaultTestSigner) Sign(msg []byte) (crypto.Signature, error) {
-	return ds.PrivKey.Sign(msg), nil
-}
-
-//--------------------------------------------------------------
-// TODO: Deprecate!
-
 // PrivValidator defines the functionality of a local Tendermint validator
 // that signs votes, proposals, and heartbeats, and never double signs.
 type PrivValidator interface {
@@ -95,378 +18,78 @@ type PrivValidator interface {
 	SignHeartbeat(chainID string, heartbeat *Heartbeat) error
 }
 
-// PrivValidatorFS implements PrivValidator using data persisted to disk
-// to prevent double signing. The Signer itself can be mutated to use
-// something besides the default, for instance a hardware signer.
-// NOTE: the directory containing the privVal.filePath must already exist.
-type PrivValidatorFS struct {
-	Address       Address          `json:"address"`
-	PubKey        crypto.PubKey    `json:"pub_key"`
-	LastHeight    int64            `json:"last_height"`
-	LastRound     int              `json:"last_round"`
-	LastStep      int8             `json:"last_step"`
-	LastSignature crypto.Signature `json:"last_signature,omitempty"` // so we dont lose signatures
-	LastSignBytes cmn.HexBytes     `json:"last_signbytes,omitempty"` // so we dont lose signatures
+//----------------------------------------
+// Misc.
 
-	// PrivKey should be empty if a Signer other than the default is being used.
-	PrivKey crypto.PrivKey `json:"priv_key"`
-	Signer  `json:"-"`
+type PrivValidatorsByAddress []PrivValidator
 
-	// For persistence.
-	// Overloaded for testing.
-	filePath string
-	mtx      sync.Mutex
+func (pvs PrivValidatorsByAddress) Len() int {
+	return len(pvs)
 }
 
-// Signer is an interface that defines how to sign messages.
-// It is the caller's duty to verify the msg before calling Sign,
-// eg. to avoid double signing.
-// Currently, the only callers are SignVote, SignProposal, and SignHeartbeat.
-type Signer interface {
-	Sign(msg []byte) (crypto.Signature, error)
+func (pvs PrivValidatorsByAddress) Less(i, j int) bool {
+	return bytes.Compare(pvs[i].GetAddress(), pvs[j].GetAddress()) == -1
 }
 
-// DefaultSigner implements Signer.
-// It uses a standard, unencrypted crypto.PrivKey.
-type DefaultSigner struct {
-	PrivKey crypto.PrivKey `json:"priv_key"`
+func (pvs PrivValidatorsByAddress) Swap(i, j int) {
+	it := pvs[i]
+	pvs[i] = pvs[j]
+	pvs[j] = it
 }
 
-// NewDefaultSigner returns an instance of DefaultSigner.
-func NewDefaultSigner(priv crypto.PrivKey) *DefaultSigner {
-	return &DefaultSigner{
-		PrivKey: priv,
-	}
-}
+//----------------------------------------
+// MockPV
 
-// Sign implements Signer. It signs the byte slice with a private key.
-func (ds *DefaultSigner) Sign(msg []byte) (crypto.Signature, error) {
-	return ds.PrivKey.Sign(msg), nil
+// MockPV implements PrivValidator without any safety or persistence.
+// Only use it for testing.
+type MockPV struct {
+	privKey crypto.PrivKey
 }
 
-// GetAddress returns the address of the validator.
-// Implements PrivValidator.
-func (pv *PrivValidatorFS) GetAddress() Address {
-	return pv.Address
+func NewMockPV() *MockPV {
+	return &MockPV{crypto.GenPrivKeyEd25519()}
 }
 
-// GetPubKey returns the public key of the validator.
 // Implements PrivValidator.
-func (pv *PrivValidatorFS) GetPubKey() crypto.PubKey {
-	return pv.PubKey
-}
-
-// GenPrivValidatorFS generates a new validator with randomly generated private key
-// and sets the filePath, but does not call Save().
-func GenPrivValidatorFS(filePath string) *PrivValidatorFS {
-	privKey := crypto.GenPrivKeyEd25519().Wrap()
-	return &PrivValidatorFS{
-		Address:  privKey.PubKey().Address(),
-		PubKey:   privKey.PubKey(),
-		PrivKey:  privKey,
-		LastStep: stepNone,
-		Signer:   NewDefaultSigner(privKey),
-		filePath: filePath,
-	}
-}
-
-// LoadPrivValidatorFS loads a PrivValidatorFS from the filePath.
-func LoadPrivValidatorFS(filePath string) *PrivValidatorFS {
-	return LoadPrivValidatorFSWithSigner(filePath, func(privVal PrivValidator) Signer {
-		return NewDefaultSigner(privVal.(*PrivValidatorFS).PrivKey)
-	})
-}
-
-// LoadOrGenPrivValidatorFS loads a PrivValidatorFS from the given filePath
-// or else generates a new one and saves it to the filePath.
-func LoadOrGenPrivValidatorFS(filePath string) *PrivValidatorFS {
-	var privVal *PrivValidatorFS
-	if cmn.FileExists(filePath) {
-		privVal = LoadPrivValidatorFS(filePath)
-	} else {
-		privVal = GenPrivValidatorFS(filePath)
-		privVal.Save()
-	}
-	return privVal
-}
-
-// LoadPrivValidatorWithSigner loads a PrivValidatorFS with a custom
-// signer object. The PrivValidatorFS handles double signing prevention by persisting
-// data to the filePath, while the Signer handles the signing.
-// If the filePath does not exist, the PrivValidatorFS must be created manually and saved.
-func LoadPrivValidatorFSWithSigner(filePath string, signerFunc func(PrivValidator) Signer) *PrivValidatorFS {
-	privValJSONBytes, err := ioutil.ReadFile(filePath)
-	if err != nil {
-		cmn.Exit(err.Error())
-	}
-	privVal := &PrivValidatorFS{}
-	err = json.Unmarshal(privValJSONBytes, &privVal)
-	if err != nil {
-		cmn.Exit(cmn.Fmt("Error reading PrivValidator from %v: %v\n", filePath, err))
-	}
-
-	privVal.filePath = filePath
-	privVal.Signer = signerFunc(privVal)
-	return privVal
-}
-
-// Save persists the PrivValidatorFS to disk.
-func (pv *PrivValidatorFS) Save() {
-	pv.mtx.Lock()
-	defer pv.mtx.Unlock()
-	pv.save()
-}
-
-func (pv *PrivValidatorFS) save() {
-	outFile := pv.filePath
-	if outFile == "" {
-		panic("Cannot save PrivValidator: filePath not set")
-	}
-	jsonBytes, err := json.Marshal(pv)
-	if err != nil {
-		panic(err)
-	}
-	err = cmn.WriteFileAtomic(outFile, jsonBytes, 0600)
-	if err != nil {
-		panic(err)
-	}
-}
-
-// Reset resets all fields in the PrivValidatorFS.
-// NOTE: Unsafe!
-func (pv *PrivValidatorFS) Reset() {
-	var sig crypto.Signature
-	pv.LastHeight = 0
-	pv.LastRound = 0
-	pv.LastStep = 0
-	pv.LastSignature = sig
-	pv.LastSignBytes = nil
-	pv.Save()
+func (pv *MockPV) GetAddress() Address {
+	return pv.privKey.PubKey().Address()
 }
 
-// SignVote signs a canonical representation of the vote, along with the
-// chainID. Implements PrivValidator.
-func (pv *PrivValidatorFS) SignVote(chainID string, vote *Vote) error {
-	pv.mtx.Lock()
-	defer pv.mtx.Unlock()
-	if err := pv.signVote(chainID, vote); err != nil {
-		return errors.New(cmn.Fmt("Error signing vote: %v", err))
-	}
-	return nil
-}
-
-// SignProposal signs a canonical representation of the proposal, along with
-// the chainID. Implements PrivValidator.
-func (pv *PrivValidatorFS) SignProposal(chainID string, proposal *Proposal) error {
-	pv.mtx.Lock()
-	defer pv.mtx.Unlock()
-	if err := pv.signProposal(chainID, proposal); err != nil {
-		return fmt.Errorf("Error signing proposal: %v", err)
-	}
-	return nil
-}
-
-// returns error if HRS regression or no LastSignBytes. returns true if HRS is unchanged
-func (pv *PrivValidatorFS) checkHRS(height int64, round int, step int8) (bool, error) {
-	if pv.LastHeight > height {
-		return false, errors.New("Height regression")
-	}
-
-	if pv.LastHeight == height {
-		if pv.LastRound > round {
-			return false, errors.New("Round regression")
-		}
-
-		if pv.LastRound == round {
-			if pv.LastStep > step {
-				return false, errors.New("Step regression")
-			} else if pv.LastStep == step {
-				if pv.LastSignBytes != nil {
-					if pv.LastSignature.Empty() {
-						panic("privVal: LastSignature is nil but LastSignBytes is not!")
-					}
-					return true, nil
-				}
-				return false, errors.New("No LastSignature found")
-			}
-		}
-	}
-	return false, nil
+// Implements PrivValidator.
+func (pv *MockPV) GetPubKey() crypto.PubKey {
+	return pv.privKey.PubKey()
 }
 
-// signVote checks if the vote is good to sign and sets the vote signature.
-// It may need to set the timestamp as well if the vote is otherwise the same as
-// a previously signed vote (ie. we crashed after signing but before the vote hit the WAL).
-func (pv *PrivValidatorFS) signVote(chainID string, vote *Vote) error {
-	height, round, step := vote.Height, vote.Round, voteToStep(vote)
+// Implements PrivValidator.
+func (pv *MockPV) SignVote(chainID string, vote *Vote) error {
 	signBytes := vote.SignBytes(chainID)
-
-	sameHRS, err := pv.checkHRS(height, round, step)
-	if err != nil {
-		return err
-	}
-
-	// We might crash before writing to the wal,
-	// causing us to try to re-sign for the same HRS.
-	// If signbytes are the same, use the last signature.
-	// If they only differ by timestamp, use last timestamp and signature
-	// Otherwise, return error
-	if sameHRS {
-		if bytes.Equal(signBytes, pv.LastSignBytes) {
-			vote.Signature = pv.LastSignature
-		} else if timestamp, ok := checkVotesOnlyDifferByTimestamp(pv.LastSignBytes, signBytes); ok {
-			vote.Timestamp = timestamp
-			vote.Signature = pv.LastSignature
-		} else {
-			err = fmt.Errorf("Conflicting data")
-		}
-		return err
-	}
-
-	// It passed the checks. Sign the vote
-	sig, err := pv.Sign(signBytes)
-	if err != nil {
-		return err
-	}
-	pv.saveSigned(height, round, step, signBytes, sig)
+	sig := pv.privKey.Sign(signBytes)
 	vote.Signature = sig
 	return nil
 }
 
-// signProposal checks if the proposal is good to sign and sets the proposal signature.
-// It may need to set the timestamp as well if the proposal is otherwise the same as
-// a previously signed proposal ie. we crashed after signing but before the proposal hit the WAL).
-func (pv *PrivValidatorFS) signProposal(chainID string, proposal *Proposal) error {
-	height, round, step := proposal.Height, proposal.Round, stepPropose
+// Implements PrivValidator.
+func (pv *MockPV) SignProposal(chainID string, proposal *Proposal) error {
 	signBytes := proposal.SignBytes(chainID)
-
-	sameHRS, err := pv.checkHRS(height, round, step)
-	if err != nil {
-		return err
-	}
-
-	// We might crash before writing to the wal,
-	// causing us to try to re-sign for the same HRS.
-	// If signbytes are the same, use the last signature.
-	// If they only differ by timestamp, use last timestamp and signature
-	// Otherwise, return error
-	if sameHRS {
-		if bytes.Equal(signBytes, pv.LastSignBytes) {
-			proposal.Signature = pv.LastSignature
-		} else if timestamp, ok := checkProposalsOnlyDifferByTimestamp(pv.LastSignBytes, signBytes); ok {
-			proposal.Timestamp = timestamp
-			proposal.Signature = pv.LastSignature
-		} else {
-			err = fmt.Errorf("Conflicting data")
-		}
-		return err
-	}
-
-	// It passed the checks. Sign the proposal
-	sig, err := pv.Sign(signBytes)
-	if err != nil {
-		return err
-	}
-	pv.saveSigned(height, round, step, signBytes, sig)
+	sig := pv.privKey.Sign(signBytes)
 	proposal.Signature = sig
 	return nil
 }
 
-// Persist height/round/step and signature
-func (pv *PrivValidatorFS) saveSigned(height int64, round int, step int8,
-	signBytes []byte, sig crypto.Signature) {
-
-	pv.LastHeight = height
-	pv.LastRound = round
-	pv.LastStep = step
-	pv.LastSignature = sig
-	pv.LastSignBytes = signBytes
-	pv.save()
-}
-
-// SignHeartbeat signs a canonical representation of the heartbeat, along with the chainID.
-// Implements PrivValidator.
-func (pv *PrivValidatorFS) SignHeartbeat(chainID string, heartbeat *Heartbeat) error {
-	pv.mtx.Lock()
-	defer pv.mtx.Unlock()
-	var err error
-	heartbeat.Signature, err = pv.Sign(heartbeat.SignBytes(chainID))
-	return err
-}
-
-// String returns a string representation of the PrivValidatorFS.
-func (pv *PrivValidatorFS) String() string {
-	return fmt.Sprintf("PrivValidator{%v LH:%v, LR:%v, LS:%v}", pv.GetAddress(), pv.LastHeight, pv.LastRound, pv.LastStep)
-}
-
-//-------------------------------------
-
-type PrivValidatorsByAddress []*PrivValidatorFS
-
-func (pvs PrivValidatorsByAddress) Len() int {
-	return len(pvs)
-}
-
-func (pvs PrivValidatorsByAddress) Less(i, j int) bool {
-	return bytes.Compare(pvs[i].GetAddress(), pvs[j].GetAddress()) == -1
-}
-
-func (pvs PrivValidatorsByAddress) Swap(i, j int) {
-	it := pvs[i]
-	pvs[i] = pvs[j]
-	pvs[j] = it
+// signHeartbeat signs the heartbeat without any checking.
+func (pv *MockPV) SignHeartbeat(chainID string, heartbeat *Heartbeat) error {
+	sig := pv.privKey.Sign(heartbeat.SignBytes(chainID))
+	heartbeat.Signature = sig
+	return nil
 }
 
-//-------------------------------------
-
-// returns the timestamp from the lastSignBytes.
-// returns true if the only difference in the votes is their timestamp.
-func checkVotesOnlyDifferByTimestamp(lastSignBytes, newSignBytes []byte) (time.Time, bool) {
-	var lastVote, newVote CanonicalJSONOnceVote
-	if err := json.Unmarshal(lastSignBytes, &lastVote); err != nil {
-		panic(fmt.Sprintf("LastSignBytes cannot be unmarshalled into vote: %v", err))
-	}
-	if err := json.Unmarshal(newSignBytes, &newVote); err != nil {
-		panic(fmt.Sprintf("signBytes cannot be unmarshalled into vote: %v", err))
-	}
-
-	lastTime, err := time.Parse(TimeFormat, lastVote.Vote.Timestamp)
-	if err != nil {
-		panic(err)
-	}
-
-	// set the times to the same value and check equality
-	now := CanonicalTime(time.Now())
-	lastVote.Vote.Timestamp = now
-	newVote.Vote.Timestamp = now
-	lastVoteBytes, _ := json.Marshal(lastVote)
-	newVoteBytes, _ := json.Marshal(newVote)
-
-	return lastTime, bytes.Equal(newVoteBytes, lastVoteBytes)
+// String returns a string representation of the MockPV.
+func (pv *MockPV) String() string {
+	return fmt.Sprintf("MockPV{%v}", pv.GetAddress())
 }
 
-// returns the timestamp from the lastSignBytes.
-// returns true if the only difference in the proposals is their timestamp
-func checkProposalsOnlyDifferByTimestamp(lastSignBytes, newSignBytes []byte) (time.Time, bool) {
-	var lastProposal, newProposal CanonicalJSONOnceProposal
-	if err := json.Unmarshal(lastSignBytes, &lastProposal); err != nil {
-		panic(fmt.Sprintf("LastSignBytes cannot be unmarshalled into proposal: %v", err))
-	}
-	if err := json.Unmarshal(newSignBytes, &newProposal); err != nil {
-		panic(fmt.Sprintf("signBytes cannot be unmarshalled into proposal: %v", err))
-	}
-
-	lastTime, err := time.Parse(TimeFormat, lastProposal.Proposal.Timestamp)
-	if err != nil {
-		panic(err)
-	}
-
-	// set the times to the same value and check equality
-	now := CanonicalTime(time.Now())
-	lastProposal.Proposal.Timestamp = now
-	newProposal.Proposal.Timestamp = now
-	lastProposalBytes, _ := json.Marshal(lastProposal)
-	newProposalBytes, _ := json.Marshal(newProposal)
-
-	return lastTime, bytes.Equal(newProposalBytes, lastProposalBytes)
+// XXX: Implement.
+func (pv *MockPV) DisableChecks() {
+	// Currently this does nothing,
+	// as MockPV has no safety checks at all.
 }
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/json.go b/vendor/github.com/tendermint/tendermint/types/priv_validator/json.go
deleted file mode 100644
index 5c0849ebd02524557a9401d21f3bc58695c29e86..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/types/priv_validator/json.go
+++ /dev/null
@@ -1,197 +0,0 @@
-package types
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"io/ioutil"
-
-	crypto "github.com/tendermint/go-crypto"
-	"github.com/tendermint/tendermint/types"
-	cmn "github.com/tendermint/tmlibs/common"
-)
-
-// PrivValidator aliases types.PrivValidator
-type PrivValidator = types.PrivValidator2
-
-//-----------------------------------------------------
-
-// PrivKey implements Signer
-type PrivKey crypto.PrivKey
-
-// Sign - Implements Signer
-func (pk PrivKey) Sign(msg []byte) (crypto.Signature, error) {
-	return crypto.PrivKey(pk).Sign(msg), nil
-}
-
-// MarshalJSON satisfies json.Marshaler.
-func (pk PrivKey) MarshalJSON() ([]byte, error) {
-	return crypto.PrivKey(pk).MarshalJSON()
-}
-
-// UnmarshalJSON satisfies json.Unmarshaler.
-func (pk *PrivKey) UnmarshalJSON(b []byte) error {
-	cpk := new(crypto.PrivKey)
-	if err := cpk.UnmarshalJSON(b); err != nil {
-		return err
-	}
-	*pk = (PrivKey)(*cpk)
-	return nil
-}
-
-//-----------------------------------------------------
-
-var _ types.PrivValidator2 = (*PrivValidatorJSON)(nil)
-
-// PrivValidatorJSON wraps PrivValidatorUnencrypted
-// and persists it to disk after every SignVote and SignProposal.
-type PrivValidatorJSON struct {
-	*PrivValidatorUnencrypted
-
-	filePath string
-}
-
-// SignVote implements PrivValidator. It persists to disk.
-func (pvj *PrivValidatorJSON) SignVote(chainID string, vote *types.Vote) error {
-	err := pvj.PrivValidatorUnencrypted.SignVote(chainID, vote)
-	if err != nil {
-		return err
-	}
-	pvj.Save()
-	return nil
-}
-
-// SignProposal implements PrivValidator. It persists to disk.
-func (pvj *PrivValidatorJSON) SignProposal(chainID string, proposal *types.Proposal) error {
-	err := pvj.PrivValidatorUnencrypted.SignProposal(chainID, proposal)
-	if err != nil {
-		return err
-	}
-	pvj.Save()
-	return nil
-}
-
-//-------------------------------------------------------
-
-// String returns a string representation of the PrivValidatorJSON.
-func (pvj *PrivValidatorJSON) String() string {
-	addr, err := pvj.Address()
-	if err != nil {
-		panic(err)
-	}
-
-	return fmt.Sprintf("PrivValidator{%v %v}", addr, pvj.PrivValidatorUnencrypted.String())
-}
-
-// Save persists the PrivValidatorJSON to disk.
-func (pvj *PrivValidatorJSON) Save() {
-	pvj.save()
-}
-
-func (pvj *PrivValidatorJSON) save() {
-	if pvj.filePath == "" {
-		panic("Cannot save PrivValidator: filePath not set")
-	}
-	jsonBytes, err := json.Marshal(pvj)
-	if err != nil {
-		// ; BOOM!!!
-		panic(err)
-	}
-	err = cmn.WriteFileAtomic(pvj.filePath, jsonBytes, 0600)
-	if err != nil {
-		// ; BOOM!!!
-		panic(err)
-	}
-}
-
-// Reset resets the PrivValidatorUnencrypted. Panics if the Signer is the wrong type.
-// NOTE: Unsafe!
-func (pvj *PrivValidatorJSON) Reset() {
-	pvj.PrivValidatorUnencrypted.LastSignedInfo.Reset()
-	pvj.Save()
-}
-
-//----------------------------------------------------------------
-
-// GenPrivValidatorJSON generates a new validator with randomly generated private key
-// and the given filePath. It does not persist to file.
-func GenPrivValidatorJSON(filePath string) *PrivValidatorJSON {
-	privKey := crypto.GenPrivKeyEd25519().Wrap()
-	return &PrivValidatorJSON{
-		PrivValidatorUnencrypted: NewPrivValidatorUnencrypted(privKey),
-		filePath:                 filePath,
-	}
-}
-
-// LoadPrivValidatorJSON loads a PrivValidatorJSON from the filePath.
-func LoadPrivValidatorJSON(filePath string) *PrivValidatorJSON {
-	pvJSONBytes, err := ioutil.ReadFile(filePath)
-	if err != nil {
-		cmn.Exit(err.Error())
-	}
-	pvj := PrivValidatorJSON{}
-	err = json.Unmarshal(pvJSONBytes, &pvj)
-	if err != nil {
-		cmn.Exit(cmn.Fmt("Error reading PrivValidatorJSON from %v: %v\n", filePath, err))
-	}
-
-	// enable persistence
-	pvj.filePath = filePath
-	return &pvj
-}
-
-// LoadOrGenPrivValidatorJSON loads a PrivValidatorJSON from the given filePath
-// or else generates a new one and saves it to the filePath.
-func LoadOrGenPrivValidatorJSON(filePath string) *PrivValidatorJSON {
-	var pvj *PrivValidatorJSON
-	if cmn.FileExists(filePath) {
-		pvj = LoadPrivValidatorJSON(filePath)
-	} else {
-		pvj = GenPrivValidatorJSON(filePath)
-		pvj.Save()
-	}
-	return pvj
-}
-
-//--------------------------------------------------------------
-
-// NewTestPrivValidator returns a PrivValidatorJSON with a tempfile
-// for the file path.
-func NewTestPrivValidator(signer types.TestSigner) *PrivValidatorJSON {
-	_, tempFilePath := cmn.Tempfile("priv_validator_")
-	pv := &PrivValidatorJSON{
-		PrivValidatorUnencrypted: NewPrivValidatorUnencrypted(signer.(*types.DefaultTestSigner).PrivKey),
-		filePath:                 tempFilePath,
-	}
-	return pv
-}
-
-//------------------------------------------------------
-
-// PrivValidatorsByAddress is a list of PrivValidatorJSON ordered by their
-// addresses.
-type PrivValidatorsByAddress []*PrivValidatorJSON
-
-func (pvs PrivValidatorsByAddress) Len() int {
-	return len(pvs)
-}
-
-func (pvs PrivValidatorsByAddress) Less(i, j int) bool {
-	iaddr, err := pvs[j].Address()
-	if err != nil {
-		panic(err)
-	}
-
-	jaddr, err := pvs[i].Address()
-	if err != nil {
-		panic(err)
-	}
-
-	return bytes.Compare(iaddr, jaddr) == -1
-}
-
-func (pvs PrivValidatorsByAddress) Swap(i, j int) {
-	it := pvs[i]
-	pvs[i] = pvs[j]
-	pvs[j] = it
-}
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/priv_validator.go b/vendor/github.com/tendermint/tendermint/types/priv_validator/priv_validator.go
new file mode 100644
index 0000000000000000000000000000000000000000..2bb5ef323d09c9aa074a4e58ea9353855b97222d
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/types/priv_validator/priv_validator.go
@@ -0,0 +1,345 @@
+package privval
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"sync"
+	"time"
+
+	"github.com/tendermint/go-crypto"
+	"github.com/tendermint/tendermint/types"
+	cmn "github.com/tendermint/tmlibs/common"
+)
+
+// TODO: type ?
+const (
+	stepNone      int8 = 0 // Used to distinguish the initial state
+	stepPropose   int8 = 1
+	stepPrevote   int8 = 2
+	stepPrecommit int8 = 3
+)
+
+func voteToStep(vote *types.Vote) int8 {
+	switch vote.Type {
+	case types.VoteTypePrevote:
+		return stepPrevote
+	case types.VoteTypePrecommit:
+		return stepPrecommit
+	default:
+		cmn.PanicSanity("Unknown vote type")
+		return 0
+	}
+}
+
+// FilePV implements PrivValidator using data persisted to disk
+// to prevent double signing.
+// NOTE: the directory containing the pv.filePath must already exist.
+type FilePV struct {
+	Address       types.Address    `json:"address"`
+	PubKey        crypto.PubKey    `json:"pub_key"`
+	LastHeight    int64            `json:"last_height"`
+	LastRound     int              `json:"last_round"`
+	LastStep      int8             `json:"last_step"`
+	LastSignature crypto.Signature `json:"last_signature,omitempty"` // so we dont lose signatures XXX Why would we lose signatures?
+	LastSignBytes cmn.HexBytes     `json:"last_signbytes,omitempty"` // so we dont lose signatures XXX Why would we lose signatures?
+	PrivKey       crypto.PrivKey   `json:"priv_key"`
+
+	// For persistence.
+	// Overloaded for testing.
+	filePath string
+	mtx      sync.Mutex
+}
+
+// GetAddress returns the address of the validator.
+// Implements PrivValidator.
+func (pv *FilePV) GetAddress() types.Address {
+	return pv.Address
+}
+
+// GetPubKey returns the public key of the validator.
+// Implements PrivValidator.
+func (pv *FilePV) GetPubKey() crypto.PubKey {
+	return pv.PubKey
+}
+
+// GenFilePV generates a new validator with randomly generated private key
+// and sets the filePath, but does not call Save().
+func GenFilePV(filePath string) *FilePV {
+	privKey := crypto.GenPrivKeyEd25519()
+	return &FilePV{
+		Address:  privKey.PubKey().Address(),
+		PubKey:   privKey.PubKey(),
+		PrivKey:  privKey,
+		LastStep: stepNone,
+		filePath: filePath,
+	}
+}
+
+// LoadFilePV loads a FilePV from the filePath.  The FilePV handles double
+// signing prevention by persisting data to the filePath.  If the filePath does
+// not exist, the FilePV must be created manually and saved.
+func LoadFilePV(filePath string) *FilePV {
+	pvJSONBytes, err := ioutil.ReadFile(filePath)
+	if err != nil {
+		cmn.Exit(err.Error())
+	}
+	pv := &FilePV{}
+	err = cdc.UnmarshalJSON(pvJSONBytes, &pv)
+	if err != nil {
+		cmn.Exit(cmn.Fmt("Error reading PrivValidator from %v: %v\n", filePath, err))
+	}
+
+	pv.filePath = filePath
+	return pv
+}
+
+// LoadOrGenFilePV loads a FilePV from the given filePath
+// or else generates a new one and saves it to the filePath.
+func LoadOrGenFilePV(filePath string) *FilePV {
+	var pv *FilePV
+	if cmn.FileExists(filePath) {
+		pv = LoadFilePV(filePath)
+	} else {
+		pv = GenFilePV(filePath)
+		pv.Save()
+	}
+	return pv
+}
+
+// Save persists the FilePV to disk.
+func (pv *FilePV) Save() {
+	pv.mtx.Lock()
+	defer pv.mtx.Unlock()
+	pv.save()
+}
+
+func (pv *FilePV) save() {
+	outFile := pv.filePath
+	if outFile == "" {
+		panic("Cannot save PrivValidator: filePath not set")
+	}
+	jsonBytes, err := cdc.MarshalJSONIndent(pv, "", "  ")
+	if err != nil {
+		panic(err)
+	}
+	err = cmn.WriteFileAtomic(outFile, jsonBytes, 0600)
+	if err != nil {
+		panic(err)
+	}
+}
+
+// Reset resets all fields in the FilePV.
+// NOTE: Unsafe!
+func (pv *FilePV) Reset() {
+	var sig crypto.Signature
+	pv.LastHeight = 0
+	pv.LastRound = 0
+	pv.LastStep = 0
+	pv.LastSignature = sig
+	pv.LastSignBytes = nil
+	pv.Save()
+}
+
+// SignVote signs a canonical representation of the vote, along with the
+// chainID. Implements PrivValidator.
+func (pv *FilePV) SignVote(chainID string, vote *types.Vote) error {
+	pv.mtx.Lock()
+	defer pv.mtx.Unlock()
+	if err := pv.signVote(chainID, vote); err != nil {
+		return errors.New(cmn.Fmt("Error signing vote: %v", err))
+	}
+	return nil
+}
+
+// SignProposal signs a canonical representation of the proposal, along with
+// the chainID. Implements PrivValidator.
+func (pv *FilePV) SignProposal(chainID string, proposal *types.Proposal) error {
+	pv.mtx.Lock()
+	defer pv.mtx.Unlock()
+	if err := pv.signProposal(chainID, proposal); err != nil {
+		return fmt.Errorf("Error signing proposal: %v", err)
+	}
+	return nil
+}
+
+// returns error if HRS regression or no LastSignBytes. returns true if HRS is unchanged
+func (pv *FilePV) checkHRS(height int64, round int, step int8) (bool, error) {
+	if pv.LastHeight > height {
+		return false, errors.New("Height regression")
+	}
+
+	if pv.LastHeight == height {
+		if pv.LastRound > round {
+			return false, errors.New("Round regression")
+		}
+
+		if pv.LastRound == round {
+			if pv.LastStep > step {
+				return false, errors.New("Step regression")
+			} else if pv.LastStep == step {
+				if pv.LastSignBytes != nil {
+					if pv.LastSignature == nil {
+						panic("pv: LastSignature is nil but LastSignBytes is not!")
+					}
+					return true, nil
+				}
+				return false, errors.New("No LastSignature found")
+			}
+		}
+	}
+	return false, nil
+}
+
+// signVote checks if the vote is good to sign and sets the vote signature.
+// It may need to set the timestamp as well if the vote is otherwise the same as
+// a previously signed vote (ie. we crashed after signing but before the vote hit the WAL).
+func (pv *FilePV) signVote(chainID string, vote *types.Vote) error {
+	height, round, step := vote.Height, vote.Round, voteToStep(vote)
+	signBytes := vote.SignBytes(chainID)
+
+	sameHRS, err := pv.checkHRS(height, round, step)
+	if err != nil {
+		return err
+	}
+
+	// We might crash before writing to the wal,
+	// causing us to try to re-sign for the same HRS.
+	// If signbytes are the same, use the last signature.
+	// If they only differ by timestamp, use last timestamp and signature
+	// Otherwise, return error
+	if sameHRS {
+		if bytes.Equal(signBytes, pv.LastSignBytes) {
+			vote.Signature = pv.LastSignature
+		} else if timestamp, ok := checkVotesOnlyDifferByTimestamp(pv.LastSignBytes, signBytes); ok {
+			vote.Timestamp = timestamp
+			vote.Signature = pv.LastSignature
+		} else {
+			err = fmt.Errorf("Conflicting data")
+		}
+		return err
+	}
+
+	// It passed the checks. Sign the vote
+	sig := pv.PrivKey.Sign(signBytes)
+	pv.saveSigned(height, round, step, signBytes, sig)
+	vote.Signature = sig
+	return nil
+}
+
+// signProposal checks if the proposal is good to sign and sets the proposal signature.
+// It may need to set the timestamp as well if the proposal is otherwise the same as
+// a previously signed proposal ie. we crashed after signing but before the proposal hit the WAL).
+func (pv *FilePV) signProposal(chainID string, proposal *types.Proposal) error {
+	height, round, step := proposal.Height, proposal.Round, stepPropose
+	signBytes := proposal.SignBytes(chainID)
+
+	sameHRS, err := pv.checkHRS(height, round, step)
+	if err != nil {
+		return err
+	}
+
+	// We might crash before writing to the wal,
+	// causing us to try to re-sign for the same HRS.
+	// If signbytes are the same, use the last signature.
+	// If they only differ by timestamp, use last timestamp and signature
+	// Otherwise, return error
+	if sameHRS {
+		if bytes.Equal(signBytes, pv.LastSignBytes) {
+			proposal.Signature = pv.LastSignature
+		} else if timestamp, ok := checkProposalsOnlyDifferByTimestamp(pv.LastSignBytes, signBytes); ok {
+			proposal.Timestamp = timestamp
+			proposal.Signature = pv.LastSignature
+		} else {
+			err = fmt.Errorf("Conflicting data")
+		}
+		return err
+	}
+
+	// It passed the checks. Sign the proposal
+	sig := pv.PrivKey.Sign(signBytes)
+	pv.saveSigned(height, round, step, signBytes, sig)
+	proposal.Signature = sig
+	return nil
+}
+
+// Persist height/round/step and signature
+func (pv *FilePV) saveSigned(height int64, round int, step int8,
+	signBytes []byte, sig crypto.Signature) {
+
+	pv.LastHeight = height
+	pv.LastRound = round
+	pv.LastStep = step
+	pv.LastSignature = sig
+	pv.LastSignBytes = signBytes
+	pv.save()
+}
+
+// SignHeartbeat signs a canonical representation of the heartbeat, along with the chainID.
+// Implements PrivValidator.
+func (pv *FilePV) SignHeartbeat(chainID string, heartbeat *types.Heartbeat) error {
+	pv.mtx.Lock()
+	defer pv.mtx.Unlock()
+	heartbeat.Signature = pv.PrivKey.Sign(heartbeat.SignBytes(chainID))
+	return nil
+}
+
+// String returns a string representation of the FilePV.
+func (pv *FilePV) String() string {
+	return fmt.Sprintf("PrivValidator{%v LH:%v, LR:%v, LS:%v}", pv.GetAddress(), pv.LastHeight, pv.LastRound, pv.LastStep)
+}
+
+//-------------------------------------
+
+// returns the timestamp from the lastSignBytes.
+// returns true if the only difference in the votes is their timestamp.
+func checkVotesOnlyDifferByTimestamp(lastSignBytes, newSignBytes []byte) (time.Time, bool) {
+	var lastVote, newVote types.CanonicalJSONVote
+	if err := cdc.UnmarshalJSON(lastSignBytes, &lastVote); err != nil {
+		panic(fmt.Sprintf("LastSignBytes cannot be unmarshalled into vote: %v", err))
+	}
+	if err := cdc.UnmarshalJSON(newSignBytes, &newVote); err != nil {
+		panic(fmt.Sprintf("signBytes cannot be unmarshalled into vote: %v", err))
+	}
+
+	lastTime, err := time.Parse(types.TimeFormat, lastVote.Timestamp)
+	if err != nil {
+		panic(err)
+	}
+
+	// set the times to the same value and check equality
+	now := types.CanonicalTime(time.Now())
+	lastVote.Timestamp = now
+	newVote.Timestamp = now
+	lastVoteBytes, _ := cdc.MarshalJSON(lastVote)
+	newVoteBytes, _ := cdc.MarshalJSON(newVote)
+
+	return lastTime, bytes.Equal(newVoteBytes, lastVoteBytes)
+}
+
+// returns the timestamp from the lastSignBytes.
+// returns true if the only difference in the proposals is their timestamp
+func checkProposalsOnlyDifferByTimestamp(lastSignBytes, newSignBytes []byte) (time.Time, bool) {
+	var lastProposal, newProposal types.CanonicalJSONProposal
+	if err := cdc.UnmarshalJSON(lastSignBytes, &lastProposal); err != nil {
+		panic(fmt.Sprintf("LastSignBytes cannot be unmarshalled into proposal: %v", err))
+	}
+	if err := cdc.UnmarshalJSON(newSignBytes, &newProposal); err != nil {
+		panic(fmt.Sprintf("signBytes cannot be unmarshalled into proposal: %v", err))
+	}
+
+	lastTime, err := time.Parse(types.TimeFormat, lastProposal.Timestamp)
+	if err != nil {
+		panic(err)
+	}
+
+	// set the times to the same value and check equality
+	now := types.CanonicalTime(time.Now())
+	lastProposal.Timestamp = now
+	newProposal.Timestamp = now
+	lastProposalBytes, _ := cdc.MarshalJSON(lastProposal)
+	newProposalBytes, _ := cdc.MarshalJSON(newProposal)
+
+	return lastTime, bytes.Equal(newProposalBytes, lastProposalBytes)
+}
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/socket.go b/vendor/github.com/tendermint/tendermint/types/priv_validator/socket.go
index 26cab72b99cf5112845a542390fbbba090ba4375..9f59a8152e90f5463cb43b4f341ed390e95e4cc8 100644
--- a/vendor/github.com/tendermint/tendermint/types/priv_validator/socket.go
+++ b/vendor/github.com/tendermint/tendermint/types/priv_validator/socket.go
@@ -1,14 +1,14 @@
-package types
+package privval
 
 import (
+	"errors"
 	"fmt"
 	"io"
 	"net"
 	"time"
 
-	"github.com/pkg/errors"
-	crypto "github.com/tendermint/go-crypto"
-	wire "github.com/tendermint/go-wire"
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/log"
 
@@ -37,36 +37,36 @@ var (
 	connHeartbeat  = time.Second * defaultConnHeartBeatSeconds
 )
 
-// SocketClientOption sets an optional parameter on the SocketClient.
-type SocketClientOption func(*SocketClient)
+// SocketPVOption sets an optional parameter on the SocketPV.
+type SocketPVOption func(*SocketPV)
 
-// SocketClientAcceptDeadline sets the deadline for the SocketClient listener.
+// SocketPVAcceptDeadline sets the deadline for the SocketPV listener.
 // A zero time value disables the deadline.
-func SocketClientAcceptDeadline(deadline time.Duration) SocketClientOption {
-	return func(sc *SocketClient) { sc.acceptDeadline = deadline }
+func SocketPVAcceptDeadline(deadline time.Duration) SocketPVOption {
+	return func(sc *SocketPV) { sc.acceptDeadline = deadline }
 }
 
-// SocketClientConnDeadline sets the read and write deadline for connections
+// SocketPVConnDeadline sets the read and write deadline for connections
 // from external signing processes.
-func SocketClientConnDeadline(deadline time.Duration) SocketClientOption {
-	return func(sc *SocketClient) { sc.connDeadline = deadline }
+func SocketPVConnDeadline(deadline time.Duration) SocketPVOption {
+	return func(sc *SocketPV) { sc.connDeadline = deadline }
 }
 
-// SocketClientHeartbeat sets the period on which to check the liveness of the
+// SocketPVHeartbeat sets the period on which to check the liveness of the
 // connected Signer connections.
-func SocketClientHeartbeat(period time.Duration) SocketClientOption {
-	return func(sc *SocketClient) { sc.connHeartbeat = period }
+func SocketPVHeartbeat(period time.Duration) SocketPVOption {
+	return func(sc *SocketPV) { sc.connHeartbeat = period }
 }
 
-// SocketClientConnWait sets the timeout duration before connection of external
+// SocketPVConnWait sets the timeout duration before connection of external
 // signing processes are considered to be unsuccessful.
-func SocketClientConnWait(timeout time.Duration) SocketClientOption {
-	return func(sc *SocketClient) { sc.connWaitTimeout = timeout }
+func SocketPVConnWait(timeout time.Duration) SocketPVOption {
+	return func(sc *SocketPV) { sc.connWaitTimeout = timeout }
 }
 
-// SocketClient implements PrivValidator, it uses a socket to request signatures
+// SocketPV implements PrivValidator, it uses a socket to request signatures
 // from an external process.
-type SocketClient struct {
+type SocketPV struct {
 	cmn.BaseService
 
 	addr            string
@@ -80,16 +80,16 @@ type SocketClient struct {
 	listener net.Listener
 }
 
-// Check that SocketClient implements PrivValidator2.
-var _ types.PrivValidator2 = (*SocketClient)(nil)
+// Check that SocketPV implements PrivValidator.
+var _ types.PrivValidator = (*SocketPV)(nil)
 
-// NewSocketClient returns an instance of SocketClient.
-func NewSocketClient(
+// NewSocketPV returns an instance of SocketPV.
+func NewSocketPV(
 	logger log.Logger,
 	socketAddr string,
 	privKey crypto.PrivKeyEd25519,
-) *SocketClient {
-	sc := &SocketClient{
+) *SocketPV {
+	sc := &SocketPV{
 		addr:            socketAddr,
 		acceptDeadline:  acceptDeadline,
 		connDeadline:    connDeadline,
@@ -98,15 +98,14 @@ func NewSocketClient(
 		privKey:         privKey,
 	}
 
-	sc.BaseService = *cmn.NewBaseService(logger, "SocketClient", sc)
+	sc.BaseService = *cmn.NewBaseService(logger, "SocketPV", sc)
 
 	return sc
 }
 
 // GetAddress implements PrivValidator.
-// TODO(xla): Remove when PrivValidator2 replaced PrivValidator.
-func (sc *SocketClient) GetAddress() types.Address {
-	addr, err := sc.Address()
+func (sc *SocketPV) GetAddress() types.Address {
+	addr, err := sc.getAddress()
 	if err != nil {
 		panic(err)
 	}
@@ -115,8 +114,8 @@ func (sc *SocketClient) GetAddress() types.Address {
 }
 
 // Address is an alias for PubKey().Address().
-func (sc *SocketClient) Address() (cmn.HexBytes, error) {
-	p, err := sc.PubKey()
+func (sc *SocketPV) getAddress() (cmn.HexBytes, error) {
+	p, err := sc.getPubKey()
 	if err != nil {
 		return nil, err
 	}
@@ -125,9 +124,8 @@ func (sc *SocketClient) Address() (cmn.HexBytes, error) {
 }
 
 // GetPubKey implements PrivValidator.
-// TODO(xla): Remove when PrivValidator2 replaced PrivValidator.
-func (sc *SocketClient) GetPubKey() crypto.PubKey {
-	pubKey, err := sc.PubKey()
+func (sc *SocketPV) GetPubKey() crypto.PubKey {
+	pubKey, err := sc.getPubKey()
 	if err != nil {
 		panic(err)
 	}
@@ -135,23 +133,22 @@ func (sc *SocketClient) GetPubKey() crypto.PubKey {
 	return pubKey
 }
 
-// PubKey implements PrivValidator2.
-func (sc *SocketClient) PubKey() (crypto.PubKey, error) {
+func (sc *SocketPV) getPubKey() (crypto.PubKey, error) {
 	err := writeMsg(sc.conn, &PubKeyMsg{})
 	if err != nil {
-		return crypto.PubKey{}, err
+		return nil, err
 	}
 
 	res, err := readMsg(sc.conn)
 	if err != nil {
-		return crypto.PubKey{}, err
+		return nil, err
 	}
 
 	return res.(*PubKeyMsg).PubKey, nil
 }
 
-// SignVote implements PrivValidator2.
-func (sc *SocketClient) SignVote(chainID string, vote *types.Vote) error {
+// SignVote implements PrivValidator.
+func (sc *SocketPV) SignVote(chainID string, vote *types.Vote) error {
 	err := writeMsg(sc.conn, &SignVoteMsg{Vote: vote})
 	if err != nil {
 		return err
@@ -167,8 +164,8 @@ func (sc *SocketClient) SignVote(chainID string, vote *types.Vote) error {
 	return nil
 }
 
-// SignProposal implements PrivValidator2.
-func (sc *SocketClient) SignProposal(
+// SignProposal implements PrivValidator.
+func (sc *SocketPV) SignProposal(
 	chainID string,
 	proposal *types.Proposal,
 ) error {
@@ -187,8 +184,8 @@ func (sc *SocketClient) SignProposal(
 	return nil
 }
 
-// SignHeartbeat implements PrivValidator2.
-func (sc *SocketClient) SignHeartbeat(
+// SignHeartbeat implements PrivValidator.
+func (sc *SocketPV) SignHeartbeat(
 	chainID string,
 	heartbeat *types.Heartbeat,
 ) error {
@@ -208,21 +205,22 @@ func (sc *SocketClient) SignHeartbeat(
 }
 
 // OnStart implements cmn.Service.
-func (sc *SocketClient) OnStart() error {
+func (sc *SocketPV) OnStart() error {
 	if err := sc.listen(); err != nil {
+		err = cmn.ErrorWrap(err, "failed to listen")
 		sc.Logger.Error(
 			"OnStart",
-			"err", errors.Wrap(err, "failed to listen"),
+			"err", err,
 		)
-
 		return err
 	}
 
 	conn, err := sc.waitConnection()
 	if err != nil {
+		err = cmn.ErrorWrap(err, "failed to accept connection")
 		sc.Logger.Error(
 			"OnStart",
-			"err", errors.Wrap(err, "failed to accept connection"),
+			"err", err,
 		)
 
 		return err
@@ -234,27 +232,29 @@ func (sc *SocketClient) OnStart() error {
 }
 
 // OnStop implements cmn.Service.
-func (sc *SocketClient) OnStop() {
+func (sc *SocketPV) OnStop() {
 	if sc.conn != nil {
 		if err := sc.conn.Close(); err != nil {
+			err = cmn.ErrorWrap(err, "failed to close connection")
 			sc.Logger.Error(
 				"OnStop",
-				"err", errors.Wrap(err, "failed to close connection"),
+				"err", err,
 			)
 		}
 	}
 
 	if sc.listener != nil {
 		if err := sc.listener.Close(); err != nil {
+			err = cmn.ErrorWrap(err, "failed to close listener")
 			sc.Logger.Error(
 				"OnStop",
-				"err", errors.Wrap(err, "failed to close listener"),
+				"err", err,
 			)
 		}
 	}
 }
 
-func (sc *SocketClient) acceptConnection() (net.Conn, error) {
+func (sc *SocketPV) acceptConnection() (net.Conn, error) {
 	conn, err := sc.listener.Accept()
 	if err != nil {
 		if !sc.IsRunning() {
@@ -264,7 +264,7 @@ func (sc *SocketClient) acceptConnection() (net.Conn, error) {
 
 	}
 
-	conn, err = p2pconn.MakeSecretConnection(conn, sc.privKey.Wrap())
+	conn, err = p2pconn.MakeSecretConnection(conn, sc.privKey)
 	if err != nil {
 		return nil, err
 	}
@@ -272,7 +272,7 @@ func (sc *SocketClient) acceptConnection() (net.Conn, error) {
 	return conn, nil
 }
 
-func (sc *SocketClient) listen() error {
+func (sc *SocketPV) listen() error {
 	ln, err := net.Listen(cmn.ProtocolAndAddress(sc.addr))
 	if err != nil {
 		return err
@@ -290,7 +290,7 @@ func (sc *SocketClient) listen() error {
 
 // waitConnection uses the configured wait timeout to error if no external
 // process connects in the time period.
-func (sc *SocketClient) waitConnection() (net.Conn, error) {
+func (sc *SocketPV) waitConnection() (net.Conn, error) {
 	var (
 		connc = make(chan net.Conn, 1)
 		errc  = make(chan error, 1)
@@ -311,7 +311,7 @@ func (sc *SocketClient) waitConnection() (net.Conn, error) {
 		return conn, nil
 	case err := <-errc:
 		if _, ok := err.(timeoutError); ok {
-			return nil, errors.Wrap(ErrConnWaitTimeout, err.Error())
+			return nil, cmn.ErrorWrap(ErrConnWaitTimeout, err.Error())
 		}
 		return nil, err
 	case <-time.After(sc.connWaitTimeout):
@@ -344,7 +344,7 @@ type RemoteSigner struct {
 	connDeadline time.Duration
 	connRetries  int
 	privKey      crypto.PrivKeyEd25519
-	privVal      PrivValidator
+	privVal      types.PrivValidator
 
 	conn net.Conn
 }
@@ -353,7 +353,7 @@ type RemoteSigner struct {
 func NewRemoteSigner(
 	logger log.Logger,
 	chainID, socketAddr string,
-	privVal PrivValidator,
+	privVal types.PrivValidator,
 	privKey crypto.PrivKeyEd25519,
 ) *RemoteSigner {
 	rs := &RemoteSigner{
@@ -374,8 +374,8 @@ func NewRemoteSigner(
 func (rs *RemoteSigner) OnStart() error {
 	conn, err := rs.connect()
 	if err != nil {
-		rs.Logger.Error("OnStart", "err", errors.Wrap(err, "connect"))
-
+		err = cmn.ErrorWrap(err, "connect")
+		rs.Logger.Error("OnStart", "err", err)
 		return err
 	}
 
@@ -391,7 +391,7 @@ func (rs *RemoteSigner) OnStop() {
 	}
 
 	if err := rs.conn.Close(); err != nil {
-		rs.Logger.Error("OnStop", "err", errors.Wrap(err, "closing listener failed"))
+		rs.Logger.Error("OnStop", "err", cmn.ErrorWrap(err, "closing listener failed"))
 	}
 }
 
@@ -404,28 +404,31 @@ func (rs *RemoteSigner) connect() (net.Conn, error) {
 
 		conn, err := cmn.Connect(rs.addr)
 		if err != nil {
+			err = cmn.ErrorWrap(err, "connection failed")
 			rs.Logger.Error(
 				"connect",
 				"addr", rs.addr,
-				"err", errors.Wrap(err, "connection failed"),
+				"err", err,
 			)
 
 			continue
 		}
 
 		if err := conn.SetDeadline(time.Now().Add(connDeadline)); err != nil {
+			err = cmn.ErrorWrap(err, "setting connection timeout failed")
 			rs.Logger.Error(
 				"connect",
-				"err", errors.Wrap(err, "setting connection timeout failed"),
+				"err", err,
 			)
 			continue
 		}
 
-		conn, err = p2pconn.MakeSecretConnection(conn, rs.privKey.Wrap())
+		conn, err = p2pconn.MakeSecretConnection(conn, rs.privKey)
 		if err != nil {
+			err = cmn.ErrorWrap(err, "encrypting connection failed")
 			rs.Logger.Error(
 				"connect",
-				"err", errors.Wrap(err, "encrypting connection failed"),
+				"err", err,
 			)
 
 			continue
@@ -451,13 +454,12 @@ func (rs *RemoteSigner) handleConnection(conn net.Conn) {
 			return
 		}
 
-		var res PrivValMsg
+		var res SocketPVMsg
 
 		switch r := req.(type) {
 		case *PubKeyMsg:
 			var p crypto.PubKey
-
-			p, err = rs.privVal.PubKey()
+			p = rs.privVal.GetPubKey()
 			res = &PubKeyMsg{p}
 		case *SignVoteMsg:
 			err = rs.privVal.SignVote(rs.chainID, r.Vote)
@@ -487,23 +489,16 @@ func (rs *RemoteSigner) handleConnection(conn net.Conn) {
 
 //---------------------------------------------------------
 
-const (
-	msgTypePubKey        = byte(0x01)
-	msgTypeSignVote      = byte(0x10)
-	msgTypeSignProposal  = byte(0x11)
-	msgTypeSignHeartbeat = byte(0x12)
-)
+// SocketPVMsg is sent between RemoteSigner and SocketPV.
+type SocketPVMsg interface{}
 
-// PrivValMsg is sent between RemoteSigner and SocketClient.
-type PrivValMsg interface{}
-
-var _ = wire.RegisterInterface(
-	struct{ PrivValMsg }{},
-	wire.ConcreteType{&PubKeyMsg{}, msgTypePubKey},
-	wire.ConcreteType{&SignVoteMsg{}, msgTypeSignVote},
-	wire.ConcreteType{&SignProposalMsg{}, msgTypeSignProposal},
-	wire.ConcreteType{&SignHeartbeatMsg{}, msgTypeSignHeartbeat},
-)
+func RegisterSocketPVMsg(cdc *amino.Codec) {
+	cdc.RegisterInterface((*SocketPVMsg)(nil), nil)
+	cdc.RegisterConcrete(&PubKeyMsg{}, "tendermint/socketpv/PubKeyMsg", nil)
+	cdc.RegisterConcrete(&SignVoteMsg{}, "tendermint/socketpv/SignVoteMsg", nil)
+	cdc.RegisterConcrete(&SignProposalMsg{}, "tendermint/socketpv/SignProposalMsg", nil)
+	cdc.RegisterConcrete(&SignHeartbeatMsg{}, "tendermint/socketpv/SignHeartbeatMsg", nil)
+}
 
 // PubKeyMsg is a PrivValidatorSocket message containing the public key.
 type PubKeyMsg struct {
@@ -525,40 +520,19 @@ type SignHeartbeatMsg struct {
 	Heartbeat *types.Heartbeat
 }
 
-func readMsg(r io.Reader) (PrivValMsg, error) {
-	var (
-		n   int
-		err error
-	)
-
-	read := wire.ReadBinary(struct{ PrivValMsg }{}, r, 0, &n, &err)
-	if err != nil {
-		if _, ok := err.(timeoutError); ok {
-			return nil, errors.Wrap(ErrConnTimeout, err.Error())
-		}
-
-		return nil, err
-	}
-
-	w, ok := read.(struct{ PrivValMsg })
-	if !ok {
-		return nil, errors.New("unknown type")
+func readMsg(r io.Reader) (msg SocketPVMsg, err error) {
+	const maxSocketPVMsgSize = 1024 * 10
+	_, err = cdc.UnmarshalBinaryReader(r, &msg, maxSocketPVMsgSize)
+	if _, ok := err.(timeoutError); ok {
+		err = cmn.ErrorWrap(ErrConnTimeout, err.Error())
 	}
-
-	return w.PrivValMsg, nil
+	return
 }
 
-func writeMsg(w io.Writer, msg interface{}) error {
-	var (
-		err error
-		n   int
-	)
-
-	// TODO(xla): This extra wrap should be gone with the sdk-2 update.
-	wire.WriteBinary(struct{ PrivValMsg }{msg}, w, &n, &err)
+func writeMsg(w io.Writer, msg interface{}) (err error) {
+	_, err = cdc.MarshalBinaryWriter(w, msg)
 	if _, ok := err.(timeoutError); ok {
-		return errors.Wrap(ErrConnTimeout, err.Error())
+		err = cmn.ErrorWrap(ErrConnTimeout, err.Error())
 	}
-
-	return err
+	return
 }
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/socket_tcp.go b/vendor/github.com/tendermint/tendermint/types/priv_validator/socket_tcp.go
index 2421eb9f4e9907f1bb5134866a931400bd3c66bb..b26db00c27d094448a5a729fb2ade8466753f9de 100644
--- a/vendor/github.com/tendermint/tendermint/types/priv_validator/socket_tcp.go
+++ b/vendor/github.com/tendermint/tendermint/types/priv_validator/socket_tcp.go
@@ -1,4 +1,4 @@
-package types
+package privval
 
 import (
 	"net"
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/unencrypted.go b/vendor/github.com/tendermint/tendermint/types/priv_validator/unencrypted.go
deleted file mode 100644
index 10a304d9e533c7a21d8be67f904c9ce1134b59d8..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/types/priv_validator/unencrypted.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package types
-
-import (
-	"fmt"
-
-	crypto "github.com/tendermint/go-crypto"
-	"github.com/tendermint/tendermint/types"
-	cmn "github.com/tendermint/tmlibs/common"
-)
-
-//-----------------------------------------------------------------
-
-var _ types.PrivValidator2 = (*PrivValidatorUnencrypted)(nil)
-
-// PrivValidatorUnencrypted implements PrivValidator.
-// It uses an in-memory crypto.PrivKey that is
-// persisted to disk unencrypted.
-type PrivValidatorUnencrypted struct {
-	ID             types.ValidatorID `json:"id"`
-	PrivKey        PrivKey           `json:"priv_key"`
-	LastSignedInfo *LastSignedInfo   `json:"last_signed_info"`
-}
-
-// NewPrivValidatorUnencrypted returns an instance of PrivValidatorUnencrypted.
-func NewPrivValidatorUnencrypted(priv crypto.PrivKey) *PrivValidatorUnencrypted {
-	return &PrivValidatorUnencrypted{
-		ID: types.ValidatorID{
-			Address: priv.PubKey().Address(),
-			PubKey:  priv.PubKey(),
-		},
-		PrivKey:        PrivKey(priv),
-		LastSignedInfo: NewLastSignedInfo(),
-	}
-}
-
-// String returns a string representation of the PrivValidatorUnencrypted
-func (upv *PrivValidatorUnencrypted) String() string {
-	addr, err := upv.Address()
-	if err != nil {
-		panic(err)
-	}
-
-	return fmt.Sprintf("PrivValidator{%v %v}", addr, upv.LastSignedInfo.String())
-}
-
-func (upv *PrivValidatorUnencrypted) Address() (cmn.HexBytes, error) {
-	return upv.PrivKey.PubKey().Address(), nil
-}
-
-func (upv *PrivValidatorUnencrypted) PubKey() (crypto.PubKey, error) {
-	return upv.PrivKey.PubKey(), nil
-}
-
-func (upv *PrivValidatorUnencrypted) SignVote(chainID string, vote *types.Vote) error {
-	return upv.LastSignedInfo.SignVote(upv.PrivKey, chainID, vote)
-}
-
-func (upv *PrivValidatorUnencrypted) SignProposal(chainID string, proposal *types.Proposal) error {
-	return upv.LastSignedInfo.SignProposal(upv.PrivKey, chainID, proposal)
-}
-
-func (upv *PrivValidatorUnencrypted) SignHeartbeat(chainID string, heartbeat *types.Heartbeat) error {
-	var err error
-	heartbeat.Signature, err = upv.PrivKey.Sign(heartbeat.SignBytes(chainID))
-	return err
-}
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/upgrade.go b/vendor/github.com/tendermint/tendermint/types/priv_validator/upgrade.go
deleted file mode 100644
index 063655421c824f0a00af9c05875838987f8c9272..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/types/priv_validator/upgrade.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package types
-
-import (
-	"encoding/json"
-	"io/ioutil"
-
-	crypto "github.com/tendermint/go-crypto"
-	"github.com/tendermint/tendermint/types"
-	cmn "github.com/tendermint/tmlibs/common"
-)
-
-type PrivValidatorV1 struct {
-	Address       cmn.HexBytes     `json:"address"`
-	PubKey        crypto.PubKey    `json:"pub_key"`
-	LastHeight    int64            `json:"last_height"`
-	LastRound     int              `json:"last_round"`
-	LastStep      int8             `json:"last_step"`
-	LastSignature crypto.Signature `json:"last_signature,omitempty"` // so we dont lose signatures
-	LastSignBytes cmn.HexBytes     `json:"last_signbytes,omitempty"` // so we dont lose signatures
-	PrivKey       crypto.PrivKey   `json:"priv_key"`
-}
-
-func UpgradePrivValidator(filePath string) (*PrivValidatorJSON, error) {
-	b, err := ioutil.ReadFile(filePath)
-	if err != nil {
-		return nil, err
-	}
-
-	pv := new(PrivValidatorV1)
-	err = json.Unmarshal(b, pv)
-	if err != nil {
-		return nil, err
-	}
-
-	pvNew := &PrivValidatorJSON{
-		PrivValidatorUnencrypted: &PrivValidatorUnencrypted{
-			ID: types.ValidatorID{
-				Address: pv.Address,
-				PubKey:  pv.PubKey,
-			},
-			PrivKey: PrivKey(pv.PrivKey),
-			LastSignedInfo: &LastSignedInfo{
-				Height:    pv.LastHeight,
-				Round:     pv.LastRound,
-				Step:      pv.LastStep,
-				SignBytes: pv.LastSignBytes,
-				Signature: pv.LastSignature,
-			},
-		},
-	}
-
-	b, err = json.MarshalIndent(pvNew, "", "  ")
-	if err != nil {
-		return nil, err
-	}
-
-	err = ioutil.WriteFile(filePath, b, 0600)
-	return pvNew, err
-}
diff --git a/vendor/github.com/tendermint/tendermint/types/priv_validator/wire.go b/vendor/github.com/tendermint/tendermint/types/priv_validator/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..688910834eb9e0bef89bfd4b24bc9cf48a401bf6
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/types/priv_validator/wire.go
@@ -0,0 +1,13 @@
+package privval
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+	RegisterSocketPVMsg(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/types/proposal.go b/vendor/github.com/tendermint/tendermint/types/proposal.go
index c240756bbfab40ceb97f662fab1513dc2b98367f..95008897b8b10d29b637063662bc66ca546f07c4 100644
--- a/vendor/github.com/tendermint/tendermint/types/proposal.go
+++ b/vendor/github.com/tendermint/tendermint/types/proposal.go
@@ -6,7 +6,6 @@ import (
 	"time"
 
 	"github.com/tendermint/go-crypto"
-	"github.com/tendermint/tendermint/wire"
 )
 
 var (
@@ -51,10 +50,7 @@ func (p *Proposal) String() string {
 
 // SignBytes returns the Proposal bytes for signing
 func (p *Proposal) SignBytes(chainID string) []byte {
-	bz, err := wire.MarshalJSON(CanonicalJSONOnceProposal{
-		ChainID:  chainID,
-		Proposal: CanonicalProposal(p),
-	})
+	bz, err := cdc.MarshalJSON(CanonicalProposal(chainID, p))
 	if err != nil {
 		panic(err)
 	}
diff --git a/vendor/github.com/tendermint/tendermint/types/protobuf.go b/vendor/github.com/tendermint/tendermint/types/protobuf.go
index e7ae20e39102f744bb2069baae1958abb0e84c01..dd9d8bb6648d8e9b7d91da2b18ce57ab12841851 100644
--- a/vendor/github.com/tendermint/tendermint/types/protobuf.go
+++ b/vendor/github.com/tendermint/tendermint/types/protobuf.go
@@ -1,71 +1,166 @@
 package types
 
 import (
-	"github.com/tendermint/abci/types"
+	"fmt"
+	"reflect"
+	"time"
+
+	abci "github.com/tendermint/abci/types"
+	crypto "github.com/tendermint/go-crypto"
+)
+
+//-------------------------------------------------------
+// Use strings to distinguish types in ABCI messages
+
+const (
+	ABCIEvidenceTypeDuplicateVote = "duplicate/vote"
+	ABCIEvidenceTypeMockGood      = "mock/good"
 )
 
-// TM2PB is used for converting Tendermint types to protobuf types.
+const (
+	ABCIPubKeyTypeEd25519   = "ed25519"
+	ABCIPubKeyTypeSecp256k1 = "secp256k1"
+)
+
+//-------------------------------------------------------
+
+// TM2PB is used for converting Tendermint ABCI to protobuf ABCI.
 // UNSTABLE
 var TM2PB = tm2pb{}
 
 type tm2pb struct{}
 
-func (tm2pb) Header(header *Header) types.Header {
-	return types.Header{
-		ChainID:        header.ChainID,
-		Height:         header.Height,
-		Time:           header.Time.Unix(),
-		NumTxs:         int32(header.NumTxs), // XXX: overflow
-		LastBlockID:    TM2PB.BlockID(header.LastBlockID),
-		LastCommitHash: header.LastCommitHash,
-		DataHash:       header.DataHash,
-		AppHash:        header.AppHash,
-	}
-}
-
-func (tm2pb) BlockID(blockID BlockID) types.BlockID {
-	return types.BlockID{
-		Hash:  blockID.Hash,
-		Parts: TM2PB.PartSetHeader(blockID.PartsHeader),
+func (tm2pb) Header(header *Header) abci.Header {
+	return abci.Header{
+		ChainID:       header.ChainID,
+		Height:        header.Height,
+		Time:          header.Time.Unix(),
+		NumTxs:        int32(header.NumTxs), // XXX: overflow
+		LastBlockHash: header.LastBlockID.Hash,
+		AppHash:       header.AppHash,
 	}
 }
 
-func (tm2pb) PartSetHeader(partSetHeader PartSetHeader) types.PartSetHeader {
-	return types.PartSetHeader{
-		Total: int32(partSetHeader.Total), // XXX: overflow
-		Hash:  partSetHeader.Hash,
+func (tm2pb) Validator(val *Validator) abci.Validator {
+	return abci.Validator{
+		PubKey: TM2PB.PubKey(val.PubKey),
+		Power:  val.VotingPower,
 	}
 }
 
-func (tm2pb) Validator(val *Validator) types.Validator {
-	return types.Validator{
-		PubKey: val.PubKey.Bytes(),
-		Power:  val.VotingPower,
+func (tm2pb) PubKey(pubKey crypto.PubKey) abci.PubKey {
+	switch pk := pubKey.(type) {
+	case crypto.PubKeyEd25519:
+		return abci.PubKey{
+			Type: "ed25519",
+			Data: pk[:],
+		}
+	case crypto.PubKeySecp256k1:
+		return abci.PubKey{
+			Type: "secp256k1",
+			Data: pk[:],
+		}
+	default:
+		panic(fmt.Sprintf("unknown pubkey type: %v %v", pubKey, reflect.TypeOf(pubKey)))
 	}
 }
 
-func (tm2pb) Validators(vals *ValidatorSet) []types.Validator {
-	validators := make([]types.Validator, len(vals.Validators))
+func (tm2pb) Validators(vals *ValidatorSet) []abci.Validator {
+	validators := make([]abci.Validator, len(vals.Validators))
 	for i, val := range vals.Validators {
 		validators[i] = TM2PB.Validator(val)
 	}
 	return validators
 }
 
-func (tm2pb) ConsensusParams(params *ConsensusParams) *types.ConsensusParams {
-	return &types.ConsensusParams{
-		BlockSize: &types.BlockSize{
+func (tm2pb) ConsensusParams(params *ConsensusParams) *abci.ConsensusParams {
+	return &abci.ConsensusParams{
+		BlockSize: &abci.BlockSize{
 
 			MaxBytes: int32(params.BlockSize.MaxBytes),
 			MaxTxs:   int32(params.BlockSize.MaxTxs),
 			MaxGas:   params.BlockSize.MaxGas,
 		},
-		TxSize: &types.TxSize{
+		TxSize: &abci.TxSize{
 			MaxBytes: int32(params.TxSize.MaxBytes),
 			MaxGas:   params.TxSize.MaxGas,
 		},
-		BlockGossip: &types.BlockGossip{
+		BlockGossip: &abci.BlockGossip{
 			BlockPartSizeBytes: int32(params.BlockGossip.BlockPartSizeBytes),
 		},
 	}
 }
+
+// ABCI Evidence includes information from the past that's not included in the evidence itself
+// so Evidence types stays compact.
+func (tm2pb) Evidence(ev Evidence, valSet *ValidatorSet, evTime time.Time) abci.Evidence {
+	_, val := valSet.GetByAddress(ev.Address())
+	if val == nil {
+		// should already have checked this
+		panic(val)
+	}
+
+	abciEvidence := abci.Evidence{
+		Validator: abci.Validator{
+			Address: ev.Address(),
+			PubKey:  TM2PB.PubKey(val.PubKey),
+			Power:   val.VotingPower,
+		},
+		Height:           ev.Height(),
+		Time:             evTime.Unix(),
+		TotalVotingPower: valSet.TotalVotingPower(),
+	}
+
+	// set type
+	switch ev.(type) {
+	case *DuplicateVoteEvidence:
+		abciEvidence.Type = ABCIEvidenceTypeDuplicateVote
+	case *MockGoodEvidence, MockGoodEvidence:
+		abciEvidence.Type = ABCIEvidenceTypeMockGood
+	default:
+		panic(fmt.Sprintf("Unknown evidence type: %v %v", ev, reflect.TypeOf(ev)))
+	}
+
+	return abciEvidence
+}
+
+func (tm2pb) ValidatorFromPubKeyAndPower(pubkey crypto.PubKey, power int64) abci.Validator {
+	pubkeyABCI := TM2PB.PubKey(pubkey)
+	return abci.Validator{
+		Address: pubkey.Address(),
+		PubKey:  pubkeyABCI,
+		Power:   power,
+	}
+}
+
+//----------------------------------------------------------------------------
+
+// PB2TM is used for converting protobuf ABCI to Tendermint ABCI.
+// UNSTABLE
+var PB2TM = pb2tm{}
+
+type pb2tm struct{}
+
+func (pb2tm) PubKey(pubKey abci.PubKey) (crypto.PubKey, error) {
+	// TODO: define these in go-crypto and use them
+	sizeEd := 32
+	sizeSecp := 33
+	switch pubKey.Type {
+	case ABCIPubKeyTypeEd25519:
+		if len(pubKey.Data) != sizeEd {
+			return nil, fmt.Errorf("Invalid size for PubKeyEd25519. Got %d, expected %d", len(pubKey.Data), sizeEd)
+		}
+		var pk crypto.PubKeyEd25519
+		copy(pk[:], pubKey.Data)
+		return pk, nil
+	case ABCIPubKeyTypeSecp256k1:
+		if len(pubKey.Data) != sizeSecp {
+			return nil, fmt.Errorf("Invalid size for PubKeyEd25519. Got %d, expected %d", len(pubKey.Data), sizeSecp)
+		}
+		var pk crypto.PubKeySecp256k1
+		copy(pk[:], pubKey.Data)
+		return pk, nil
+	default:
+		return nil, fmt.Errorf("Unknown pubkey type %v", pubKey.Type)
+	}
+}
diff --git a/vendor/github.com/tendermint/tendermint/types/results.go b/vendor/github.com/tendermint/tendermint/types/results.go
index 71834664d8a31f433014cafb7d01cdd327ea8d29..326cee48d517002be1c55ca4eb5c20f6f17f5165 100644
--- a/vendor/github.com/tendermint/tendermint/types/results.go
+++ b/vendor/github.com/tendermint/tendermint/types/results.go
@@ -2,7 +2,6 @@ package types
 
 import (
 	abci "github.com/tendermint/abci/types"
-	wire "github.com/tendermint/tendermint/wire"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/merkle"
 )
@@ -18,7 +17,8 @@ type ABCIResult struct {
 
 // Hash returns the canonical hash of the ABCIResult
 func (a ABCIResult) Hash() []byte {
-	return tmHash(a)
+	bz := aminoHash(a)
+	return bz
 }
 
 // ABCIResults wraps the deliver tx results to return a proof
@@ -42,7 +42,7 @@ func NewResultFromResponse(response *abci.ResponseDeliverTx) ABCIResult {
 
 // Bytes serializes the ABCIResponse using wire
 func (a ABCIResults) Bytes() []byte {
-	bz, err := wire.MarshalBinary(a)
+	bz, err := cdc.MarshalBinary(a)
 	if err != nil {
 		panic(err)
 	}
diff --git a/vendor/github.com/tendermint/tendermint/types/signable.go b/vendor/github.com/tendermint/tendermint/types/signable.go
index 19829ede723020a0b6e2ae06018dba50d2515233..cc6498882a69c8ce81eedd5e5daf4bcba909b84e 100644
--- a/vendor/github.com/tendermint/tendermint/types/signable.go
+++ b/vendor/github.com/tendermint/tendermint/types/signable.go
@@ -9,8 +9,3 @@ package types
 type Signable interface {
 	SignBytes(chainID string) []byte
 }
-
-// HashSignBytes is a convenience method for getting the hash of the bytes of a signable
-func HashSignBytes(chainID string, o Signable) []byte {
-	return tmHash(o.SignBytes(chainID))
-}
diff --git a/vendor/github.com/tendermint/tendermint/types/test_util.go b/vendor/github.com/tendermint/tendermint/types/test_util.go
index 73e53eb199a341acea80ca215a39ff7003b60676..f21c2831fe2d92566ec7a33f7fc3e4c30bf3a4c8 100644
--- a/vendor/github.com/tendermint/tendermint/types/test_util.go
+++ b/vendor/github.com/tendermint/tendermint/types/test_util.go
@@ -4,7 +4,7 @@ import "time"
 
 func MakeCommit(blockID BlockID, height int64, round int,
 	voteSet *VoteSet,
-	validators []*PrivValidatorFS) (*Commit, error) {
+	validators []PrivValidator) (*Commit, error) {
 
 	// all sign
 	for i := 0; i < len(validators); i++ {
@@ -28,8 +28,8 @@ func MakeCommit(blockID BlockID, height int64, round int,
 	return voteSet.MakeCommit(), nil
 }
 
-func signAddVote(privVal *PrivValidatorFS, vote *Vote, voteSet *VoteSet) (signed bool, err error) {
-	vote.Signature, err = privVal.Signer.Sign(vote.SignBytes(voteSet.ChainID()))
+func signAddVote(privVal PrivValidator, vote *Vote, voteSet *VoteSet) (signed bool, err error) {
+	err = privVal.SignVote(voteSet.ChainID(), vote)
 	if err != nil {
 		return false, err
 	}
diff --git a/vendor/github.com/tendermint/tendermint/types/tx.go b/vendor/github.com/tendermint/tendermint/types/tx.go
index fc1d272122174ac230b228105cbe29d035fb60f8..e7247693a9def8b20647a5f9e841927ddb19a920 100644
--- a/vendor/github.com/tendermint/tendermint/types/tx.go
+++ b/vendor/github.com/tendermint/tendermint/types/tx.go
@@ -18,7 +18,7 @@ type Tx []byte
 
 // Hash computes the RIPEMD160 hash of the wire encoded transaction.
 func (tx Tx) Hash() []byte {
-	return wireHasher(tx).Hash()
+	return aminoHasher(tx).Hash()
 }
 
 // String returns the hex-encoded transaction as a string.
@@ -66,9 +66,7 @@ func (txs Txs) IndexByHash(hash []byte) int {
 }
 
 // Proof returns a simple merkle proof for this node.
-//
 // Panics if i < 0 or i >= len(txs)
-//
 // TODO: optimize this!
 func (txs Txs) Proof(i int) TxProof {
 	l := len(txs)
@@ -95,7 +93,7 @@ type TxProof struct {
 	Proof        merkle.SimpleProof
 }
 
-// LeadHash returns the hash of the transaction this proof refers to.
+// LeadHash returns the hash of the this proof refers to.
 func (tp TxProof) LeafHash() []byte {
 	return tp.Data.Hash()
 }
@@ -106,7 +104,12 @@ func (tp TxProof) Validate(dataHash []byte) error {
 	if !bytes.Equal(dataHash, tp.RootHash) {
 		return errors.New("Proof matches different data hash")
 	}
-
+	if tp.Index < 0 {
+		return errors.New("Proof index cannot be negative")
+	}
+	if tp.Total <= 0 {
+		return errors.New("Proof total must be positive")
+	}
 	valid := tp.Proof.Verify(tp.Index, tp.Total, tp.LeafHash(), tp.RootHash)
 	if !valid {
 		return errors.New("Proof is not internally consistent")
diff --git a/vendor/github.com/tendermint/tendermint/types/validator.go b/vendor/github.com/tendermint/tendermint/types/validator.go
index a9b42fe8ce3e18f9a95d307c4a34316ad6926c2b..46dc61d07e866a77f6bd3670587d66258fbedc11 100644
--- a/vendor/github.com/tendermint/tendermint/types/validator.go
+++ b/vendor/github.com/tendermint/tendermint/types/validator.go
@@ -71,7 +71,7 @@ func (v *Validator) String() string {
 // Hash computes the unique ID of a validator with a given voting power.
 // It excludes the Accum value, which changes with every round.
 func (v *Validator) Hash() []byte {
-	return tmHash(struct {
+	return aminoHash(struct {
 		Address     Address
 		PubKey      crypto.PubKey
 		VotingPower int64
@@ -82,14 +82,13 @@ func (v *Validator) Hash() []byte {
 	})
 }
 
-//--------------------------------------------------------------------------------
-// For testing...
+//----------------------------------------
+// RandValidator
 
 // RandValidator returns a randomized validator, useful for testing.
 // UNSTABLE
-func RandValidator(randPower bool, minPower int64) (*Validator, *PrivValidatorFS) {
-	_, tempFilePath := cmn.Tempfile("priv_validator_")
-	privVal := GenPrivValidatorFS(tempFilePath)
+func RandValidator(randPower bool, minPower int64) (*Validator, PrivValidator) {
+	privVal := NewMockPV()
 	votePower := minPower
 	if randPower {
 		votePower += int64(cmn.RandUint32())
diff --git a/vendor/github.com/tendermint/tendermint/types/validator_set.go b/vendor/github.com/tendermint/tendermint/types/validator_set.go
index 4b84f85d773461994cc093b085586758fb33aec6..f2fac292975d66b363f45e1d4b943a62411fe1ee 100644
--- a/vendor/github.com/tendermint/tendermint/types/validator_set.go
+++ b/vendor/github.com/tendermint/tendermint/types/validator_set.go
@@ -7,7 +7,6 @@ import (
 	"sort"
 	"strings"
 
-	"github.com/pkg/errors"
 	cmn "github.com/tendermint/tmlibs/common"
 	"github.com/tendermint/tmlibs/merkle"
 )
@@ -60,16 +59,18 @@ func (valSet *ValidatorSet) IncrementAccum(times int) {
 	// Decrement the validator with most accum times times
 	for i := 0; i < times; i++ {
 		mostest := validatorsHeap.Peek().(*Validator)
+		// mind underflow
+		mostest.Accum = safeSubClip(mostest.Accum, valSet.TotalVotingPower())
+
 		if i == times-1 {
 			valSet.Proposer = mostest
+		} else {
+			validatorsHeap.Update(mostest, accumComparable{mostest})
 		}
-
-		// mind underflow
-		mostest.Accum = safeSubClip(mostest.Accum, valSet.TotalVotingPower())
-		validatorsHeap.Update(mostest, accumComparable{mostest})
 	}
 }
 
+// Copy each validator into a new ValidatorSet
 func (valSet *ValidatorSet) Copy() *ValidatorSet {
 	validators := make([]*Validator, len(valSet.Validators))
 	for i, val := range valSet.Validators {
@@ -302,10 +303,10 @@ func (valSet *ValidatorSet) VerifyCommitAny(newSet *ValidatorSet, chainID string
 	blockID BlockID, height int64, commit *Commit) error {
 
 	if newSet.Size() != len(commit.Precommits) {
-		return errors.Errorf("Invalid commit -- wrong set size: %v vs %v", newSet.Size(), len(commit.Precommits))
+		return cmn.NewError("Invalid commit -- wrong set size: %v vs %v", newSet.Size(), len(commit.Precommits))
 	}
 	if height != commit.Height() {
-		return errors.Errorf("Invalid commit -- wrong height: %v vs %v", height, commit.Height())
+		return cmn.NewError("Invalid commit -- wrong height: %v vs %v", height, commit.Height())
 	}
 
 	oldVotingPower := int64(0)
@@ -320,13 +321,13 @@ func (valSet *ValidatorSet) VerifyCommitAny(newSet *ValidatorSet, chainID string
 		}
 		if precommit.Height != height {
 			// return certerr.ErrHeightMismatch(height, precommit.Height)
-			return errors.Errorf("Blocks don't match - %d vs %d", round, precommit.Round)
+			return cmn.NewError("Blocks don't match - %d vs %d", round, precommit.Round)
 		}
 		if precommit.Round != round {
-			return errors.Errorf("Invalid commit -- wrong round: %v vs %v", round, precommit.Round)
+			return cmn.NewError("Invalid commit -- wrong round: %v vs %v", round, precommit.Round)
 		}
 		if precommit.Type != VoteTypePrecommit {
-			return errors.Errorf("Invalid commit -- not precommit @ index %v", idx)
+			return cmn.NewError("Invalid commit -- not precommit @ index %v", idx)
 		}
 		if !blockID.Equals(precommit.BlockID) {
 			continue // Not an error, but doesn't count
@@ -342,7 +343,7 @@ func (valSet *ValidatorSet) VerifyCommitAny(newSet *ValidatorSet, chainID string
 		// Validate signature old school
 		precommitSignBytes := precommit.SignBytes(chainID)
 		if !ov.PubKey.VerifyBytes(precommitSignBytes, precommit.Signature) {
-			return errors.Errorf("Invalid commit -- invalid signature: %v", precommit)
+			return cmn.NewError("Invalid commit -- invalid signature: %v", precommit)
 		}
 		// Good precommit!
 		oldVotingPower += ov.VotingPower
@@ -356,10 +357,10 @@ func (valSet *ValidatorSet) VerifyCommitAny(newSet *ValidatorSet, chainID string
 	}
 
 	if oldVotingPower <= valSet.TotalVotingPower()*2/3 {
-		return errors.Errorf("Invalid commit -- insufficient old voting power: got %v, needed %v",
+		return cmn.NewError("Invalid commit -- insufficient old voting power: got %v, needed %v",
 			oldVotingPower, (valSet.TotalVotingPower()*2/3 + 1))
 	} else if newVotingPower <= newSet.TotalVotingPower()*2/3 {
-		return errors.Errorf("Invalid commit -- insufficient cur voting power: got %v, needed %v",
+		return cmn.NewError("Invalid commit -- insufficient cur voting power: got %v, needed %v",
 			newVotingPower, (newSet.TotalVotingPower()*2/3 + 1))
 	}
 	return nil
@@ -369,6 +370,7 @@ func (valSet *ValidatorSet) String() string {
 	return valSet.StringIndented("")
 }
 
+// String
 func (valSet *ValidatorSet) StringIndented(indent string) string {
 	if valSet == nil {
 		return "nil-ValidatorSet"
@@ -385,7 +387,7 @@ func (valSet *ValidatorSet) StringIndented(indent string) string {
 %s}`,
 		indent, valSet.GetProposer().String(),
 		indent,
-		indent, strings.Join(valStrings, "\n"+indent+"    "),
+		indent, strings.Join(valStrings, "\n"+indent+"  "),
 		indent)
 
 }
@@ -393,6 +395,7 @@ func (valSet *ValidatorSet) StringIndented(indent string) string {
 //-------------------------------------
 // Implements sort for sorting validators by address.
 
+// Sort validators by address
 type ValidatorsByAddress []*Validator
 
 func (vs ValidatorsByAddress) Len() int {
@@ -429,9 +432,9 @@ func (ac accumComparable) Less(o interface{}) bool {
 // RandValidatorSet returns a randomized validator set, useful for testing.
 // NOTE: PrivValidator are in order.
 // UNSTABLE
-func RandValidatorSet(numValidators int, votingPower int64) (*ValidatorSet, []*PrivValidatorFS) {
+func RandValidatorSet(numValidators int, votingPower int64) (*ValidatorSet, []PrivValidator) {
 	vals := make([]*Validator, numValidators)
-	privValidators := make([]*PrivValidatorFS, numValidators)
+	privValidators := make([]PrivValidator, numValidators)
 	for i := 0; i < numValidators; i++ {
 		val, privValidator := RandValidator(false, votingPower)
 		vals[i] = val
diff --git a/vendor/github.com/tendermint/tendermint/types/vote.go b/vendor/github.com/tendermint/tendermint/types/vote.go
index ceb6e985e517940dc47b3b9d86cdfab69770a7b0..e4ead612a9fc8fcf6145d703021e4d2fdad75ec4 100644
--- a/vendor/github.com/tendermint/tendermint/types/vote.go
+++ b/vendor/github.com/tendermint/tendermint/types/vote.go
@@ -7,7 +7,6 @@ import (
 	"time"
 
 	crypto "github.com/tendermint/go-crypto"
-	"github.com/tendermint/tendermint/wire"
 	cmn "github.com/tendermint/tmlibs/common"
 )
 
@@ -73,10 +72,7 @@ type Vote struct {
 }
 
 func (vote *Vote) SignBytes(chainID string) []byte {
-	bz, err := wire.MarshalJSON(CanonicalJSONOnceVote{
-		chainID,
-		CanonicalVote(vote),
-	})
+	bz, err := cdc.MarshalJSON(CanonicalVote(chainID, vote))
 	if err != nil {
 		panic(err)
 	}
diff --git a/vendor/github.com/tendermint/tendermint/types/vote_set.go b/vendor/github.com/tendermint/tendermint/types/vote_set.go
index e255488d6268722bdf08aae07dd1055bda4e7071..a60d95dafd15af3ef41bc2ecad962456e1e1e685 100644
--- a/vendor/github.com/tendermint/tendermint/types/vote_set.go
+++ b/vendor/github.com/tendermint/tendermint/types/vote_set.go
@@ -56,9 +56,9 @@ type VoteSet struct {
 	height  int64
 	round   int
 	type_   byte
+	valSet  *ValidatorSet
 
 	mtx           sync.Mutex
-	valSet        *ValidatorSet
 	votesBitArray *cmn.BitArray
 	votes         []*Vote                // Primary votes to share
 	sum           int64                  // Sum of voting power for seen votes, discounting conflicts
@@ -399,11 +399,13 @@ func (voteSet *VoteSet) HasTwoThirdsAny() bool {
 }
 
 func (voteSet *VoteSet) HasAll() bool {
+	voteSet.mtx.Lock()
+	defer voteSet.mtx.Unlock()
 	return voteSet.sum == voteSet.valSet.TotalVotingPower()
 }
 
-// Returns either a blockhash (or nil) that received +2/3 majority.
-// If there exists no such majority, returns (nil, PartSetHeader{}, false).
+// If there was a +2/3 majority for blockID, return blockID and true.
+// Else, return the empty BlockID{} and false.
 func (voteSet *VoteSet) TwoThirdsMajority() (blockID BlockID, ok bool) {
 	if voteSet == nil {
 		return BlockID{}, false
@@ -416,6 +418,9 @@ func (voteSet *VoteSet) TwoThirdsMajority() (blockID BlockID, ok bool) {
 	return BlockID{}, false
 }
 
+//--------------------------------------------------------------------------------
+// Strings and JSON
+
 func (voteSet *VoteSet) String() string {
 	if voteSet == nil {
 		return "nil-VoteSet"
@@ -424,6 +429,8 @@ func (voteSet *VoteSet) String() string {
 }
 
 func (voteSet *VoteSet) StringIndented(indent string) string {
+	voteSet.mtx.Lock()
+	defer voteSet.mtx.Unlock()
 	voteStrings := make([]string, len(voteSet.votes))
 	for i, vote := range voteSet.votes {
 		if vote == nil {
@@ -445,14 +452,77 @@ func (voteSet *VoteSet) StringIndented(indent string) string {
 		indent)
 }
 
+// Marshal the VoteSet to JSON. Same as String(), just in JSON,
+// and without the height/round/type_ (since its already included in the votes).
+func (voteSet *VoteSet) MarshalJSON() ([]byte, error) {
+	voteSet.mtx.Lock()
+	defer voteSet.mtx.Unlock()
+	return cdc.MarshalJSON(VoteSetJSON{
+		voteSet.voteStrings(),
+		voteSet.bitArrayString(),
+		voteSet.peerMaj23s,
+	})
+}
+
+// More human readable JSON of the vote set
+// NOTE: insufficient for unmarshalling from (compressed votes)
+// TODO: make the peerMaj23s nicer to read (eg just the block hash)
+type VoteSetJSON struct {
+	Votes         []string          `json:"votes"`
+	VotesBitArray string            `json:"votes_bit_array"`
+	PeerMaj23s    map[P2PID]BlockID `json:"peer_maj_23s"`
+}
+
+// Return the bit-array of votes including
+// the fraction of power that has voted like:
+// "BA{29:xx__x__x_x___x__x_______xxx__} 856/1304 = 0.66"
+func (voteSet *VoteSet) BitArrayString() string {
+	voteSet.mtx.Lock()
+	defer voteSet.mtx.Unlock()
+	return voteSet.bitArrayString()
+}
+
+func (voteSet *VoteSet) bitArrayString() string {
+	bAString := voteSet.votesBitArray.String()
+	voted, total, fracVoted := voteSet.sumTotalFrac()
+	return fmt.Sprintf("%s %d/%d = %.2f", bAString, voted, total, fracVoted)
+}
+
+// Returns a list of votes compressed to more readable strings.
+func (voteSet *VoteSet) VoteStrings() []string {
+	voteSet.mtx.Lock()
+	defer voteSet.mtx.Unlock()
+	return voteSet.voteStrings()
+}
+
+func (voteSet *VoteSet) voteStrings() []string {
+	voteStrings := make([]string, len(voteSet.votes))
+	for i, vote := range voteSet.votes {
+		if vote == nil {
+			voteStrings[i] = "nil-Vote"
+		} else {
+			voteStrings[i] = vote.String()
+		}
+	}
+	return voteStrings
+}
+
 func (voteSet *VoteSet) StringShort() string {
 	if voteSet == nil {
 		return "nil-VoteSet"
 	}
 	voteSet.mtx.Lock()
 	defer voteSet.mtx.Unlock()
-	return fmt.Sprintf(`VoteSet{H:%v R:%v T:%v +2/3:%v %v %v}`,
-		voteSet.height, voteSet.round, voteSet.type_, voteSet.maj23, voteSet.votesBitArray, voteSet.peerMaj23s)
+	_, _, frac := voteSet.sumTotalFrac()
+	return fmt.Sprintf(`VoteSet{H:%v R:%v T:%v +2/3:%v(%v) %v %v}`,
+		voteSet.height, voteSet.round, voteSet.type_, voteSet.maj23, frac, voteSet.votesBitArray, voteSet.peerMaj23s)
+}
+
+// return the power voted, the total, and the fraction
+func (voteSet *VoteSet) sumTotalFrac() (int64, int64, float64) {
+	voted, total := voteSet.sum, voteSet.valSet.TotalVotingPower()
+	fracVoted := float64(voted) / float64(total)
+	return voted, total, fracVoted
 }
 
 //--------------------------------------------------------------------------------
diff --git a/vendor/github.com/tendermint/tendermint/types/wire.go b/vendor/github.com/tendermint/tendermint/types/wire.go
new file mode 100644
index 0000000000000000000000000000000000000000..bd5c4497d06fdf1a1ae942e6c55bbc7dbeac6632
--- /dev/null
+++ b/vendor/github.com/tendermint/tendermint/types/wire.go
@@ -0,0 +1,12 @@
+package types
+
+import (
+	"github.com/tendermint/go-amino"
+	"github.com/tendermint/go-crypto"
+)
+
+var cdc = amino.NewCodec()
+
+func init() {
+	crypto.RegisterAmino(cdc)
+}
diff --git a/vendor/github.com/tendermint/tendermint/version/version.go b/vendor/github.com/tendermint/tendermint/version/version.go
index a8fbfa84fa3c5cc2720b845de342e8eb2ddaf66d..32f003bb57c681fef2248974a313b8ba63ce26e3 100644
--- a/vendor/github.com/tendermint/tendermint/version/version.go
+++ b/vendor/github.com/tendermint/tendermint/version/version.go
@@ -1,13 +1,16 @@
 package version
 
-const Maj = "0"
-const Min = "18"
-const Fix = "0"
+// Version components
+const (
+	Maj = "0"
+	Min = "19"
+	Fix = "7"
+)
 
 var (
 	// Version is the current version of Tendermint
 	// Must be a string because scripts like dist.sh read this file.
-	Version = "0.18.0"
+	Version = "0.19.7-dev"
 
 	// GitCommit is the current HEAD set using ldflags.
 	GitCommit string
diff --git a/vendor/github.com/tendermint/tendermint/wire/wire.go b/vendor/github.com/tendermint/tendermint/wire/wire.go
deleted file mode 100644
index 9d0d2c2080c924e4f51c3f164d71b5e3f8de6ec0..0000000000000000000000000000000000000000
--- a/vendor/github.com/tendermint/tendermint/wire/wire.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package wire
-
-import (
-	"github.com/tendermint/go-wire"
-)
-
-/*
-// Expose access to a global wire codec
-// TODO: maybe introduce some Context object
-// containing logger, config, codec that can
-// be threaded through everything to avoid this global
-var cdc *wire.Codec
-
-func init() {
-	cdc = wire.NewCodec()
-	crypto.RegisterWire(cdc)
-}
-*/
-
-// Just a flow through to go-wire.
-// To be used later for the global codec
-
-func MarshalBinary(o interface{}) ([]byte, error) {
-	return wire.MarshalBinary(o)
-}
-
-func UnmarshalBinary(bz []byte, ptr interface{}) error {
-	return wire.UnmarshalBinary(bz, ptr)
-}
-
-func MarshalJSON(o interface{}) ([]byte, error) {
-	return wire.MarshalJSON(o)
-}
-
-func UnmarshalJSON(jsonBz []byte, ptr interface{}) error {
-	return wire.UnmarshalJSON(jsonBz, ptr)
-}
-
-type ConcreteType = wire.ConcreteType
-
-func RegisterInterface(o interface{}, ctypes ...ConcreteType) *wire.TypeInfo {
-	return wire.RegisterInterface(o, ctypes...)
-}
-
-const RFC3339Millis = wire.RFC3339Millis
-
-/*
-
-func RegisterInterface(ptr interface{}, opts *wire.InterfaceOptions) {
-	cdc.RegisterInterface(ptr, opts)
-}
-
-func RegisterConcrete(o interface{}, name string, opts *wire.ConcreteOptions) {
-	cdc.RegisterConcrete(o, name, opts)
-}
-
-//-------------------------------
-
-const RFC3339Millis = wire.RFC3339Millis
-*/
diff --git a/vendor/github.com/tendermint/tmlibs/common/async.go b/vendor/github.com/tendermint/tmlibs/common/async.go
index 49714d95e1ec18a28d7d50517283689067f3f9a3..7be09a3c1ba30791b21e5b4e000881de0b507698 100644
--- a/vendor/github.com/tendermint/tmlibs/common/async.go
+++ b/vendor/github.com/tendermint/tmlibs/common/async.go
@@ -32,7 +32,7 @@ type TaskResultSet struct {
 func newTaskResultSet(chz []TaskResultCh) *TaskResultSet {
 	return &TaskResultSet{
 		chz:     chz,
-		results: nil,
+		results: make([]taskResultOK, len(chz)),
 	}
 }
 
@@ -49,18 +49,20 @@ func (trs *TaskResultSet) LatestResult(index int) (TaskResult, bool) {
 }
 
 // NOTE: Not concurrency safe.
+// Writes results to trs.results without waiting for all tasks to complete.
 func (trs *TaskResultSet) Reap() *TaskResultSet {
-	if trs.results == nil {
-		trs.results = make([]taskResultOK, len(trs.chz))
-	}
 	for i := 0; i < len(trs.results); i++ {
 		var trch = trs.chz[i]
 		select {
-		case result := <-trch:
-			// Overwrite result.
-			trs.results[i] = taskResultOK{
-				TaskResult: result,
-				OK:         true,
+		case result, ok := <-trch:
+			if ok {
+				// Write result.
+				trs.results[i] = taskResultOK{
+					TaskResult: result,
+					OK:         true,
+				}
+			} else {
+				// We already wrote it.
 			}
 		default:
 			// Do nothing.
@@ -69,6 +71,27 @@ func (trs *TaskResultSet) Reap() *TaskResultSet {
 	return trs
 }
 
+// NOTE: Not concurrency safe.
+// Like Reap() but waits until all tasks have returned or panic'd.
+func (trs *TaskResultSet) Wait() *TaskResultSet {
+	for i := 0; i < len(trs.results); i++ {
+		var trch = trs.chz[i]
+		select {
+		case result, ok := <-trch:
+			if ok {
+				// Write result.
+				trs.results[i] = taskResultOK{
+					TaskResult: result,
+					OK:         true,
+				}
+			} else {
+				// We already wrote it.
+			}
+		}
+	}
+	return trs
+}
+
 // Returns the firstmost (by task index) error as
 // discovered by all previous Reap() calls.
 func (trs *TaskResultSet) FirstValue() interface{} {
@@ -116,7 +139,11 @@ func Parallel(tasks ...Task) (trs *TaskResultSet, ok bool) {
 			defer func() {
 				if pnk := recover(); pnk != nil {
 					atomic.AddInt32(numPanics, 1)
+					// Send panic to taskResultCh.
 					taskResultCh <- TaskResult{nil, ErrorWrap(pnk, "Panic in task")}
+					// Closing taskResultCh lets trs.Wait() work.
+					close(taskResultCh)
+					// Decrement waitgroup.
 					taskDoneCh <- false
 				}
 			}()
@@ -125,6 +152,8 @@ func Parallel(tasks ...Task) (trs *TaskResultSet, ok bool) {
 			// Send val/err to taskResultCh.
 			// NOTE: Below this line, nothing must panic/
 			taskResultCh <- TaskResult{val, err}
+			// Closing taskResultCh lets trs.Wait() work.
+			close(taskResultCh)
 			// Decrement waitgroup.
 			taskDoneCh <- abort
 		}(i, task, taskResultCh)
diff --git a/vendor/github.com/tendermint/tmlibs/common/bit_array.go b/vendor/github.com/tendermint/tmlibs/common/bit_array.go
index ea6a6ee1fbf81c230f28d845e41768040ba3a71f..0290921a6c178b9d0d174b934b76b70ece394e35 100644
--- a/vendor/github.com/tendermint/tmlibs/common/bit_array.go
+++ b/vendor/github.com/tendermint/tmlibs/common/bit_array.go
@@ -3,6 +3,7 @@ package common
 import (
 	"encoding/binary"
 	"fmt"
+	"regexp"
 	"strings"
 	"sync"
 )
@@ -249,13 +250,14 @@ func (bA *BitArray) PickRandom() (int, bool) {
 	return 0, false
 }
 
+// String returns a string representation of BitArray: BA{<bit-string>},
+// where <bit-string> is a sequence of 'x' (1) and '_' (0).
+// The <bit-string> includes spaces and newlines to help people.
+// For a simple sequence of 'x' and '_' characters with no spaces or newlines,
+// see the MarshalJSON() method.
+// Example: "BA{_x_}" or "nil-BitArray" for nil.
 func (bA *BitArray) String() string {
-	if bA == nil {
-		return "nil-BitArray"
-	}
-	bA.mtx.Lock()
-	defer bA.mtx.Unlock()
-	return bA.stringIndented("")
+	return bA.StringIndented("")
 }
 
 func (bA *BitArray) StringIndented(indent string) string {
@@ -268,12 +270,11 @@ func (bA *BitArray) StringIndented(indent string) string {
 }
 
 func (bA *BitArray) stringIndented(indent string) string {
-
 	lines := []string{}
 	bits := ""
 	for i := 0; i < bA.Bits; i++ {
 		if bA.getIndex(i) {
-			bits += "X"
+			bits += "x"
 		} else {
 			bits += "_"
 		}
@@ -282,10 +283,10 @@ func (bA *BitArray) stringIndented(indent string) string {
 			bits = ""
 		}
 		if i%10 == 9 {
-			bits += " "
+			bits += indent
 		}
 		if i%50 == 49 {
-			bits += " "
+			bits += indent
 		}
 	}
 	if len(bits) > 0 {
@@ -320,3 +321,58 @@ func (bA *BitArray) Update(o *BitArray) {
 
 	copy(bA.Elems, o.Elems)
 }
+
+// MarshalJSON implements json.Marshaler interface by marshaling bit array
+// using a custom format: a string of '-' or 'x' where 'x' denotes the 1 bit.
+func (bA *BitArray) MarshalJSON() ([]byte, error) {
+	if bA == nil {
+		return []byte("null"), nil
+	}
+
+	bA.mtx.Lock()
+	defer bA.mtx.Unlock()
+
+	bits := `"`
+	for i := 0; i < bA.Bits; i++ {
+		if bA.getIndex(i) {
+			bits += `x`
+		} else {
+			bits += `_`
+		}
+	}
+	bits += `"`
+	return []byte(bits), nil
+}
+
+var bitArrayJSONRegexp = regexp.MustCompile(`\A"([_x]*)"\z`)
+
+// UnmarshalJSON implements json.Unmarshaler interface by unmarshaling a custom
+// JSON description.
+func (bA *BitArray) UnmarshalJSON(bz []byte) error {
+	b := string(bz)
+	if b == "null" {
+		// This is required e.g. for encoding/json when decoding
+		// into a pointer with pre-allocated BitArray.
+		bA.Bits = 0
+		bA.Elems = nil
+		return nil
+	}
+
+	// Validate 'b'.
+	match := bitArrayJSONRegexp.FindStringSubmatch(b)
+	if match == nil {
+		return fmt.Errorf("BitArray in JSON should be a string of format %q but got %s", bitArrayJSONRegexp.String(), b)
+	}
+	bits := match[1]
+
+	// Construct new BitArray and copy over.
+	numBits := len(bits)
+	bA2 := NewBitArray(numBits)
+	for i := 0; i < numBits; i++ {
+		if bits[i] == 'x' {
+			bA2.SetIndex(i, true)
+		}
+	}
+	*bA = *bA2
+	return nil
+}
diff --git a/vendor/github.com/tendermint/tmlibs/common/byteslice.go b/vendor/github.com/tendermint/tmlibs/common/byteslice.go
index ceaf06bd34b01e378e937985929772b7c9ba99d4..57b3a8a2bc6798ffc1e0e00511e7480033341a64 100644
--- a/vendor/github.com/tendermint/tmlibs/common/byteslice.go
+++ b/vendor/github.com/tendermint/tmlibs/common/byteslice.go
@@ -45,3 +45,29 @@ func TrimmedString(b []byte) string {
 	return string(bytes.TrimLeft(b, trimSet))
 
 }
+
+// PrefixEndBytes returns the end byteslice for a noninclusive range
+// that would include all byte slices for which the input is the prefix
+func PrefixEndBytes(prefix []byte) []byte {
+	if prefix == nil {
+		return nil
+	}
+
+	end := make([]byte, len(prefix))
+	copy(end, prefix)
+	finished := false
+
+	for !finished {
+		if end[len(end)-1] != byte(255) {
+			end[len(end)-1]++
+			finished = true
+		} else {
+			end = end[:len(end)-1]
+			if len(end) == 0 {
+				end = nil
+				finished = true
+			}
+		}
+	}
+	return end
+}
diff --git a/vendor/github.com/tendermint/tmlibs/common/errors.go b/vendor/github.com/tendermint/tmlibs/common/errors.go
index 1ee1fb3493a8743cffe6c46d4212641256b0b94b..5992b23466d55c72d2be895962dd1fcf58a9ae3b 100644
--- a/vendor/github.com/tendermint/tmlibs/common/errors.go
+++ b/vendor/github.com/tendermint/tmlibs/common/errors.go
@@ -178,7 +178,7 @@ func (err *cmnError) Format(s fmt.State, verb rune) {
 		if s.Flag('#') {
 			s.Write([]byte("--= Error =--\n"))
 			// Write msg.
-			s.Write([]byte(fmt.Sprintf("Message: %#s\n", err.msg)))
+			s.Write([]byte(fmt.Sprintf("Message: %s\n", err.msg)))
 			// Write cause.
 			s.Write([]byte(fmt.Sprintf("Cause: %#v\n", err.cause)))
 			// Write type.
diff --git a/vendor/github.com/tendermint/tmlibs/common/string.go b/vendor/github.com/tendermint/tmlibs/common/string.go
index 0e2231e91a3f1f6abeaf5a3392a97deb44de1bbd..fac1be6c959ec5079d8a7df72ee014d5fcd41b9c 100644
--- a/vendor/github.com/tendermint/tmlibs/common/string.go
+++ b/vendor/github.com/tendermint/tmlibs/common/string.go
@@ -57,3 +57,33 @@ func SplitAndTrim(s, sep, cutset string) []string {
 	}
 	return spl
 }
+
+// Returns true if s is a non-empty printable non-tab ascii character.
+func IsASCIIText(s string) bool {
+	if len(s) == 0 {
+		return false
+	}
+	for _, b := range []byte(s) {
+		if 32 <= b && b <= 126 {
+			// good
+		} else {
+			return false
+		}
+	}
+	return true
+}
+
+// NOTE: Assumes that s is ASCII as per IsASCIIText(), otherwise panics.
+func ASCIITrim(s string) string {
+	r := make([]byte, 0, len(s))
+	for _, b := range []byte(s) {
+		if b == 32 {
+			continue // skip space
+		} else if 32 < b && b <= 126 {
+			r = append(r, b)
+		} else {
+			panic(fmt.Sprintf("non-ASCII (non-tab) char 0x%X", b))
+		}
+	}
+	return string(r)
+}
diff --git a/vendor/github.com/tendermint/tmlibs/db/debug_db.go b/vendor/github.com/tendermint/tmlibs/db/debug_db.go
index 7a15bc29412fa4bbabeffee7108decc0861d0635..7666ed9fd70e93751b8b6ec3924c0fe02d9ba55c 100644
--- a/vendor/github.com/tendermint/tmlibs/db/debug_db.go
+++ b/vendor/github.com/tendermint/tmlibs/db/debug_db.go
@@ -3,8 +3,14 @@ package db
 import (
 	"fmt"
 	"sync"
+
+	cmn "github.com/tendermint/tmlibs/common"
 )
 
+func _fmt(f string, az ...interface{}) string {
+	return fmt.Sprintf(f, az...)
+}
+
 //----------------------------------------
 // debugDB
 
@@ -26,78 +32,84 @@ func (ddb debugDB) Mutex() *sync.Mutex { return nil }
 
 // Implements DB.
 func (ddb debugDB) Get(key []byte) (value []byte) {
-	defer fmt.Printf("%v.Get(%X) %X\n", ddb.label, key, value)
+	defer func() {
+		fmt.Printf("%v.Get(%v) %v\n", ddb.label, cmn.Cyan(_fmt("%X", key)), cmn.Blue(_fmt("%X", value)))
+	}()
 	value = ddb.db.Get(key)
 	return
 }
 
 // Implements DB.
 func (ddb debugDB) Has(key []byte) (has bool) {
-	defer fmt.Printf("%v.Has(%X) %v\n", ddb.label, key, has)
+	defer func() {
+		fmt.Printf("%v.Has(%v) %v\n", ddb.label, cmn.Cyan(_fmt("%X", key)), has)
+	}()
 	return ddb.db.Has(key)
 }
 
 // Implements DB.
 func (ddb debugDB) Set(key []byte, value []byte) {
-	fmt.Printf("%v.Set(%X, %X)\n", ddb.label, key, value)
+	fmt.Printf("%v.Set(%v, %v)\n", ddb.label, cmn.Cyan(_fmt("%X", key)), cmn.Yellow(_fmt("%X", value)))
 	ddb.db.Set(key, value)
 }
 
 // Implements DB.
 func (ddb debugDB) SetSync(key []byte, value []byte) {
-	fmt.Printf("%v.SetSync(%X, %X)\n", ddb.label, key, value)
+	fmt.Printf("%v.SetSync(%v, %v)\n", ddb.label, cmn.Cyan(_fmt("%X", key)), cmn.Yellow(_fmt("%X", value)))
 	ddb.db.SetSync(key, value)
 }
 
 // Implements atomicSetDeleter.
 func (ddb debugDB) SetNoLock(key []byte, value []byte) {
-	fmt.Printf("%v.SetNoLock(%X, %X)\n", ddb.label, key, value)
-	ddb.db.Set(key, value)
+	fmt.Printf("%v.SetNoLock(%v, %v)\n", ddb.label, cmn.Cyan(_fmt("%X", key)), cmn.Yellow(_fmt("%X", value)))
+	ddb.db.(atomicSetDeleter).SetNoLock(key, value)
 }
 
 // Implements atomicSetDeleter.
 func (ddb debugDB) SetNoLockSync(key []byte, value []byte) {
-	fmt.Printf("%v.SetNoLockSync(%X, %X)\n", ddb.label, key, value)
-	ddb.db.SetSync(key, value)
+	fmt.Printf("%v.SetNoLockSync(%v, %v)\n", ddb.label, cmn.Cyan(_fmt("%X", key)), cmn.Yellow(_fmt("%X", value)))
+	ddb.db.(atomicSetDeleter).SetNoLockSync(key, value)
 }
 
 // Implements DB.
 func (ddb debugDB) Delete(key []byte) {
-	fmt.Printf("%v.Delete(%X)\n", ddb.label, key)
+	fmt.Printf("%v.Delete(%v)\n", ddb.label, cmn.Red(_fmt("%X", key)))
 	ddb.db.Delete(key)
 }
 
 // Implements DB.
 func (ddb debugDB) DeleteSync(key []byte) {
-	fmt.Printf("%v.DeleteSync(%X)\n", ddb.label, key)
+	fmt.Printf("%v.DeleteSync(%v)\n", ddb.label, cmn.Red(_fmt("%X", key)))
 	ddb.db.DeleteSync(key)
 }
 
 // Implements atomicSetDeleter.
 func (ddb debugDB) DeleteNoLock(key []byte) {
-	fmt.Printf("%v.DeleteNoLock(%X)\n", ddb.label, key)
-	ddb.db.Delete(key)
+	fmt.Printf("%v.DeleteNoLock(%v)\n", ddb.label, cmn.Red(_fmt("%X", key)))
+	ddb.db.(atomicSetDeleter).DeleteNoLock(key)
 }
 
 // Implements atomicSetDeleter.
 func (ddb debugDB) DeleteNoLockSync(key []byte) {
-	fmt.Printf("%v.DeleteNoLockSync(%X)\n", ddb.label, key)
-	ddb.db.DeleteSync(key)
+	fmt.Printf("%v.DeleteNoLockSync(%v)\n", ddb.label, cmn.Red(_fmt("%X", key)))
+	ddb.db.(atomicSetDeleter).DeleteNoLockSync(key)
 }
 
 // Implements DB.
 func (ddb debugDB) Iterator(start, end []byte) Iterator {
-	fmt.Printf("%v.Iterator(%X, %X)\n", ddb.label, start, end)
+	fmt.Printf("%v.Iterator(%v, %v)\n", ddb.label, cmn.Cyan(_fmt("%X", start)), cmn.Blue(_fmt("%X", end)))
 	return NewDebugIterator(ddb.label, ddb.db.Iterator(start, end))
 }
 
 // Implements DB.
 func (ddb debugDB) ReverseIterator(start, end []byte) Iterator {
-	fmt.Printf("%v.ReverseIterator(%X, %X)\n", ddb.label, start, end)
+	fmt.Printf("%v.ReverseIterator(%v, %v)\n", ddb.label, cmn.Cyan(_fmt("%X", start)), cmn.Blue(_fmt("%X", end)))
 	return NewDebugIterator(ddb.label, ddb.db.ReverseIterator(start, end))
 }
 
 // Implements DB.
+// Panics if the underlying db is not an
+// atomicSetDeleter.
 func (ddb debugDB) NewBatch() Batch {
 	fmt.Printf("%v.NewBatch()\n", ddb.label)
 	return NewDebugBatch(ddb.label, ddb.db.NewBatch())
@@ -137,14 +149,18 @@ func NewDebugIterator(label string, itr Iterator) debugIterator {
 
 // Implements Iterator.
 func (ditr debugIterator) Domain() (start []byte, end []byte) {
-	defer fmt.Printf("%v.itr.Domain() (%X,%X)\n", ditr.label, start, end)
+	defer func() {
+		fmt.Printf("%v.itr.Domain() (%X,%X)\n", ditr.label, start, end)
+	}()
 	start, end = ditr.itr.Domain()
 	return
 }
 
 // Implements Iterator.
 func (ditr debugIterator) Valid() (ok bool) {
-	defer fmt.Printf("%v.itr.Valid() %v\n", ditr.label, ok)
+	defer func() {
+		fmt.Printf("%v.itr.Valid() %v\n", ditr.label, ok)
+	}()
 	ok = ditr.itr.Valid()
 	return
 }
@@ -157,14 +173,14 @@ func (ditr debugIterator) Next() {
 
 // Implements Iterator.
 func (ditr debugIterator) Key() (key []byte) {
-	fmt.Printf("%v.itr.Key() %X\n", ditr.label, key)
+	fmt.Printf("%v.itr.Key() %v\n", ditr.label, cmn.Cyan(_fmt("%X", key)))
 	key = ditr.itr.Key()
 	return
 }
 
 // Implements Iterator.
 func (ditr debugIterator) Value() (value []byte) {
-	fmt.Printf("%v.itr.Value() %X\n", ditr.label, value)
+	fmt.Printf("%v.itr.Value() %v\n", ditr.label, cmn.Blue(_fmt("%X", value)))
 	value = ditr.itr.Value()
 	return
 }
@@ -193,13 +209,13 @@ func NewDebugBatch(label string, bch Batch) debugBatch {
 
 // Implements Batch.
 func (dbch debugBatch) Set(key, value []byte) {
-	fmt.Printf("%v.batch.Set(%X, %X)\n", dbch.label, key, value)
+	fmt.Printf("%v.batch.Set(%v, %v)\n", dbch.label, cmn.Cyan(_fmt("%X", key)), cmn.Yellow(_fmt("%X", value)))
 	dbch.bch.Set(key, value)
 }
 
 // Implements Batch.
 func (dbch debugBatch) Delete(key []byte) {
-	fmt.Printf("%v.batch.Delete(%X)\n", dbch.label, key)
+	fmt.Printf("%v.batch.Delete(%v)\n", dbch.label, cmn.Red(_fmt("%X", key)))
 	dbch.bch.Delete(key)
 }
 
diff --git a/vendor/github.com/tendermint/tmlibs/db/mem_batch.go b/vendor/github.com/tendermint/tmlibs/db/mem_batch.go
index 81a63d62b64df74afff745e8d6273410096be09a..5c5d0c13a86244a48adaadcd5f75271f08ee1127 100644
--- a/vendor/github.com/tendermint/tmlibs/db/mem_batch.go
+++ b/vendor/github.com/tendermint/tmlibs/db/mem_batch.go
@@ -1,6 +1,8 @@
 package db
 
-import "sync"
+import (
+	"sync"
+)
 
 type atomicSetDeleter interface {
 	Mutex() *sync.Mutex
@@ -66,6 +68,5 @@ func (mBatch *memBatch) write(doSync bool) {
 		case opTypeDelete:
 			mBatch.db.DeleteNoLock(op.key)
 		}
-
 	}
 }
diff --git a/vendor/github.com/tendermint/tmlibs/db/mem_db.go b/vendor/github.com/tendermint/tmlibs/db/mem_db.go
index 2d802947cc651d9324966497660e597c0ee04c6f..1521f87acec88dff3d07d134fd2574546a45efd4 100644
--- a/vendor/github.com/tendermint/tmlibs/db/mem_db.go
+++ b/vendor/github.com/tendermint/tmlibs/db/mem_db.go
@@ -37,7 +37,8 @@ func (db *MemDB) Get(key []byte) []byte {
 	defer db.mtx.Unlock()
 	key = nonNilBytes(key)
 
-	return db.db[string(key)]
+	value := db.db[string(key)]
+	return value
 }
 
 // Implements DB.
@@ -162,7 +163,7 @@ func (db *MemDB) ReverseIterator(start, end []byte) Iterator {
 	db.mtx.Lock()
 	defer db.mtx.Unlock()
 
-	keys := db.getSortedKeys(end, start, true)
+	keys := db.getSortedKeys(start, end, true)
 	return newMemDBIterator(db, keys, start, end)
 }
 
@@ -236,7 +237,8 @@ func (itr *memDBIterator) assertIsValid() {
 func (db *MemDB) getSortedKeys(start, end []byte, reverse bool) []string {
 	keys := []string{}
 	for key := range db.db {
-		if IsKeyInDomain([]byte(key), start, end, false) {
+		inDomain := IsKeyInDomain([]byte(key), start, end, reverse)
+		if inDomain {
 			keys = append(keys, key)
 		}
 	}
@@ -244,7 +246,9 @@ func (db *MemDB) getSortedKeys(start, end []byte, reverse bool) []string {
 	if reverse {
 		nkeys := len(keys)
 		for i := 0; i < nkeys/2; i++ {
+			temp := keys[i]
 			keys[i] = keys[nkeys-i-1]
+			keys[nkeys-i-1] = temp
 		}
 	}
 	return keys
diff --git a/vendor/github.com/tendermint/tmlibs/db/prefix_db.go b/vendor/github.com/tendermint/tmlibs/db/prefix_db.go
index 4381ce070b857e22004fc90c8f9b5a92c621de9b..5bb53ebd9d39c45f7e9816ce7c0293c21f8e608d 100644
--- a/vendor/github.com/tendermint/tmlibs/db/prefix_db.go
+++ b/vendor/github.com/tendermint/tmlibs/db/prefix_db.go
@@ -24,7 +24,8 @@ func IteratePrefix(db DB, prefix []byte) Iterator {
 TODO: Make test, maybe rename.
 // Like IteratePrefix but the iterator strips the prefix from the keys.
 func IteratePrefixStripped(db DB, prefix []byte) Iterator {
-	return newUnprefixIterator(prefix, IteratePrefix(db, prefix))
+	start, end := ...
+	return newPrefixIterator(prefix, start, end, IteratePrefix(db, prefix))
 }
 */
 
@@ -55,7 +56,9 @@ func (pdb *prefixDB) Get(key []byte) []byte {
 	pdb.mtx.Lock()
 	defer pdb.mtx.Unlock()
 
-	return pdb.db.Get(pdb.prefixed(key))
+	pkey := pdb.prefixed(key)
+	value := pdb.db.Get(pkey)
+	return value
 }
 
 // Implements DB.
@@ -71,7 +74,8 @@ func (pdb *prefixDB) Set(key []byte, value []byte) {
 	pdb.mtx.Lock()
 	defer pdb.mtx.Unlock()
 
-	pdb.db.Set(pdb.prefixed(key), value)
+	pkey := pdb.prefixed(key)
+	pdb.db.Set(pkey, value)
 }
 
 // Implements DB.
@@ -82,16 +86,6 @@ func (pdb *prefixDB) SetSync(key []byte, value []byte) {
 	pdb.db.SetSync(pdb.prefixed(key), value)
 }
 
-// Implements atomicSetDeleter.
-func (pdb *prefixDB) SetNoLock(key []byte, value []byte) {
-	pdb.db.Set(pdb.prefixed(key), value)
-}
-
-// Implements atomicSetDeleter.
-func (pdb *prefixDB) SetNoLockSync(key []byte, value []byte) {
-	pdb.db.SetSync(pdb.prefixed(key), value)
-}
-
 // Implements DB.
 func (pdb *prefixDB) Delete(key []byte) {
 	pdb.mtx.Lock()
@@ -108,28 +102,22 @@ func (pdb *prefixDB) DeleteSync(key []byte) {
 	pdb.db.DeleteSync(pdb.prefixed(key))
 }
 
-// Implements atomicSetDeleter.
-func (pdb *prefixDB) DeleteNoLock(key []byte) {
-	pdb.db.Delete(pdb.prefixed(key))
-}
-
-// Implements atomicSetDeleter.
-func (pdb *prefixDB) DeleteNoLockSync(key []byte) {
-	pdb.db.DeleteSync(pdb.prefixed(key))
-}
-
 // Implements DB.
 func (pdb *prefixDB) Iterator(start, end []byte) Iterator {
 	pdb.mtx.Lock()
 	defer pdb.mtx.Unlock()
 
-	pstart := append(pdb.prefix, start...)
-	pend := []byte(nil)
-	if end != nil {
-		pend = append(pdb.prefix, end...)
+	var pstart, pend []byte
+	pstart = append(cp(pdb.prefix), start...)
+	if end == nil {
+		pend = cpIncr(pdb.prefix)
+	} else {
+		pend = append(cp(pdb.prefix), end...)
 	}
-	return newUnprefixIterator(
+	return newPrefixIterator(
 		pdb.prefix,
+		start,
+		end,
 		pdb.db.Iterator(
 			pstart,
 			pend,
@@ -142,31 +130,68 @@ func (pdb *prefixDB) ReverseIterator(start, end []byte) Iterator {
 	pdb.mtx.Lock()
 	defer pdb.mtx.Unlock()
 
-	pstart := []byte(nil)
-	if start != nil {
-		pstart = append(pdb.prefix, start...)
+	var pstart, pend []byte
+	if start == nil {
+		// This may cause the underlying iterator to start with
+		// an item which doesn't start with prefix.  We will skip
+		// that item later in this function. See 'skipOne'.
+		pstart = cpIncr(pdb.prefix)
+	} else {
+		pstart = append(cp(pdb.prefix), start...)
+	}
+	if end == nil {
+		// This may cause the underlying iterator to end with an
+		// item which doesn't start with prefix.  The
+		// prefixIterator will terminate iteration
+		// automatically upon detecting this.
+		pend = cpDecr(pdb.prefix)
+	} else {
+		pend = append(cp(pdb.prefix), end...)
 	}
-	pend := []byte(nil)
-	if end != nil {
-		pend = append(pdb.prefix, end...)
+	ritr := pdb.db.ReverseIterator(pstart, pend)
+	if start == nil {
+		skipOne(ritr, cpIncr(pdb.prefix))
 	}
-	return newUnprefixIterator(
+	return newPrefixIterator(
 		pdb.prefix,
-		pdb.db.ReverseIterator(
-			pstart,
-			pend,
-		),
+		start,
+		end,
+		ritr,
 	)
 }
 
 // Implements DB.
+// Panics if the underlying DB is not an
+// atomicSetDeleter.
 func (pdb *prefixDB) NewBatch() Batch {
 	pdb.mtx.Lock()
 	defer pdb.mtx.Unlock()
 
-	return &memBatch{pdb, nil}
+	return newPrefixBatch(pdb.prefix, pdb.db.NewBatch())
+}
+
+/* NOTE: Uncomment to use memBatch instead of prefixBatch
+// Implements atomicSetDeleter.
+func (pdb *prefixDB) SetNoLock(key []byte, value []byte) {
+	pdb.db.(atomicSetDeleter).SetNoLock(pdb.prefixed(key), value)
 }
 
+// Implements atomicSetDeleter.
+func (pdb *prefixDB) SetNoLockSync(key []byte, value []byte) {
+	pdb.db.(atomicSetDeleter).SetNoLockSync(pdb.prefixed(key), value)
+}
+
+// Implements atomicSetDeleter.
+func (pdb *prefixDB) DeleteNoLock(key []byte) {
+	pdb.db.(atomicSetDeleter).DeleteNoLock(pdb.prefixed(key))
+}
+
+// Implements atomicSetDeleter.
+func (pdb *prefixDB) DeleteNoLockSync(key []byte) {
+	pdb.db.(atomicSetDeleter).DeleteNoLockSync(pdb.prefixed(key))
+}
+*/
+
 // Implements DB.
 func (pdb *prefixDB) Close() {
 	pdb.mtx.Lock()
@@ -201,52 +226,109 @@ func (pdb *prefixDB) Stats() map[string]string {
 }
 
 func (pdb *prefixDB) prefixed(key []byte) []byte {
-	return append(pdb.prefix, key...)
+	return append(cp(pdb.prefix), key...)
 }
 
 //----------------------------------------
+// prefixBatch
 
-// Strips prefix while iterating from Iterator.
-type unprefixIterator struct {
+type prefixBatch struct {
 	prefix []byte
-	source Iterator
+	source Batch
 }
 
-func newUnprefixIterator(prefix []byte, source Iterator) unprefixIterator {
-	return unprefixIterator{
+func newPrefixBatch(prefix []byte, source Batch) prefixBatch {
+	return prefixBatch{
 		prefix: prefix,
 		source: source,
 	}
 }
 
-func (itr unprefixIterator) Domain() (start []byte, end []byte) {
-	start, end = itr.source.Domain()
-	if len(start) > 0 {
-		start = stripPrefix(start, itr.prefix)
-	}
-	if len(end) > 0 {
-		end = stripPrefix(end, itr.prefix)
+func (pb prefixBatch) Set(key, value []byte) {
+	pkey := append(cp(pb.prefix), key...)
+	pb.source.Set(pkey, value)
+}
+
+func (pb prefixBatch) Delete(key []byte) {
+	pkey := append(cp(pb.prefix), key...)
+	pb.source.Delete(pkey)
+}
+
+func (pb prefixBatch) Write() {
+	pb.source.Write()
+}
+
+func (pb prefixBatch) WriteSync() {
+	pb.source.WriteSync()
+}
+
+//----------------------------------------
+// prefixIterator
+
+// Strips prefix while iterating from Iterator.
+type prefixIterator struct {
+	prefix []byte
+	start  []byte
+	end    []byte
+	source Iterator
+	valid  bool
+}
+
+func newPrefixIterator(prefix, start, end []byte, source Iterator) prefixIterator {
+	if !source.Valid() || !bytes.HasPrefix(source.Key(), prefix) {
+		return prefixIterator{
+			prefix: prefix,
+			start:  start,
+			end:    end,
+			source: source,
+			valid:  false,
+		}
+	} else {
+		return prefixIterator{
+			prefix: prefix,
+			start:  start,
+			end:    end,
+			source: source,
+			valid:  true,
+		}
 	}
-	return
 }
 
-func (itr unprefixIterator) Valid() bool {
-	return itr.source.Valid()
+func (itr prefixIterator) Domain() (start []byte, end []byte) {
+	return itr.start, itr.end
 }
 
-func (itr unprefixIterator) Next() {
+func (itr prefixIterator) Valid() bool {
+	return itr.valid && itr.source.Valid()
+}
+
+func (itr prefixIterator) Next() {
+	if !itr.valid {
+		panic("prefixIterator invalid, cannot call Next()")
+	}
 	itr.source.Next()
+	if !itr.source.Valid() || !bytes.HasPrefix(itr.source.Key(), itr.prefix) {
+		itr.source.Close()
+		itr.valid = false
+		return
+	}
 }
 
-func (itr unprefixIterator) Key() (key []byte) {
+func (itr prefixIterator) Key() (key []byte) {
+	if !itr.valid {
+		panic("prefixIterator invalid, cannot call Key()")
+	}
 	return stripPrefix(itr.source.Key(), itr.prefix)
 }
 
-func (itr unprefixIterator) Value() (value []byte) {
+func (itr prefixIterator) Value() (value []byte) {
+	if !itr.valid {
+		panic("prefixIterator invalid, cannot call Value()")
+	}
 	return itr.source.Value()
 }
 
-func (itr unprefixIterator) Close() {
+func (itr prefixIterator) Close() {
 	itr.source.Close()
 }
 
@@ -261,3 +343,13 @@ func stripPrefix(key []byte, prefix []byte) (stripped []byte) {
 	}
 	return key[len(prefix):]
 }
+
+// If the first iterator item is skipKey, then
+// skip it.
+func skipOne(itr Iterator, skipKey []byte) {
+	if itr.Valid() {
+		if bytes.Equal(itr.Key(), skipKey) {
+			itr.Next()
+		}
+	}
+}
diff --git a/vendor/github.com/tendermint/tmlibs/db/util.go b/vendor/github.com/tendermint/tmlibs/db/util.go
index 1ad5002d64bbef254be9ad51e7d1a76c924dad0b..51277ac42a80ddbe44c85796c39755f529b07344 100644
--- a/vendor/github.com/tendermint/tmlibs/db/util.go
+++ b/vendor/github.com/tendermint/tmlibs/db/util.go
@@ -33,6 +33,29 @@ func cpIncr(bz []byte) (ret []byte) {
 	return nil
 }
 
+// Returns a slice of the same length (big endian)
+// except decremented by one.
+// Returns nil on underflow (e.g. if bz bytes are all 0x00)
+// CONTRACT: len(bz) > 0
+func cpDecr(bz []byte) (ret []byte) {
+	if len(bz) == 0 {
+		panic("cpDecr expects non-zero bz length")
+	}
+	ret = cp(bz)
+	for i := len(bz) - 1; i >= 0; i-- {
+		if ret[i] > byte(0x00) {
+			ret[i]--
+			return
+		}
+		ret[i] = byte(0xFF)
+		if i == 0 {
+			// Underflow
+			return nil
+		}
+	}
+	return nil
+}
+
 // See DB interface documentation for more information.
 func IsKeyInDomain(key, start, end []byte, isReverse bool) bool {
 	if !isReverse {
@@ -43,12 +66,13 @@ func IsKeyInDomain(key, start, end []byte, isReverse bool) bool {
 			return false
 		}
 		return true
+	} else {
+		if start != nil && bytes.Compare(start, key) < 0 {
+			return false
+		}
+		if end != nil && bytes.Compare(key, end) <= 0 {
+			return false
+		}
+		return true
 	}
-	if start != nil && bytes.Compare(start, key) < 0 {
-		return false
-	}
-	if end != nil && bytes.Compare(key, end) <= 0 {
-		return false
-	}
-	return true
 }
diff --git a/vendor/github.com/tendermint/tmlibs/merkle/simple_map.go b/vendor/github.com/tendermint/tmlibs/merkle/simple_map.go
index b59e3b4b6ff9d1316fadff5a9ed6ff29daa699b5..cd38de7617732e1a4b30fb38800dc9e4cffbcdf6 100644
--- a/vendor/github.com/tendermint/tmlibs/merkle/simple_map.go
+++ b/vendor/github.com/tendermint/tmlibs/merkle/simple_map.go
@@ -60,9 +60,9 @@ func (sm *SimpleMap) KVPairs() cmn.KVPairs {
 //----------------------------------------
 
 // A local extension to KVPair that can be hashed.
-type kvPair cmn.KVPair
+type KVPair cmn.KVPair
 
-func (kv kvPair) Hash() []byte {
+func (kv KVPair) Hash() []byte {
 	hasher := ripemd160.New()
 	err := encodeByteSlice(hasher, kv.Key)
 	if err != nil {
@@ -78,7 +78,7 @@ func (kv kvPair) Hash() []byte {
 func hashKVPairs(kvs cmn.KVPairs) []byte {
 	kvsH := make([]Hasher, 0, len(kvs))
 	for _, kvp := range kvs {
-		kvsH = append(kvsH, kvPair(kvp))
+		kvsH = append(kvsH, KVPair(kvp))
 	}
 	return SimpleHashFromHashers(kvsH)
 }
diff --git a/vendor/github.com/tendermint/tmlibs/merkle/simple_proof.go b/vendor/github.com/tendermint/tmlibs/merkle/simple_proof.go
index c81ed674afd09bf84ee94be43a3120d60051ed60..ca6ccf37266f2baaa002a4c9f6b4d25585b85a50 100644
--- a/vendor/github.com/tendermint/tmlibs/merkle/simple_proof.go
+++ b/vendor/github.com/tendermint/tmlibs/merkle/simple_proof.go
@@ -22,6 +22,20 @@ func SimpleProofsFromHashers(items []Hasher) (rootHash []byte, proofs []*SimpleP
 	return
 }
 
+func SimpleProofsFromMap(m map[string]Hasher) (rootHash []byte, proofs []*SimpleProof) {
+	sm := NewSimpleMap()
+	for k, v := range m {
+		sm.Set(k, v)
+	}
+	sm.Sort()
+	kvs := sm.kvs
+	kvsH := make([]Hasher, 0, len(kvs))
+	for _, kvp := range kvs {
+		kvsH = append(kvsH, KVPair(kvp))
+	}
+	return SimpleProofsFromHashers(kvsH)
+}
+
 // Verify that leafHash is a leaf hash of the simple-merkle-tree
 // which hashes to rootHash.
 func (sp *SimpleProof) Verify(index int, total int, leafHash []byte, rootHash []byte) bool {
diff --git a/vendor/github.com/tmthrgd/asm/asm.go b/vendor/github.com/tmthrgd/asm/asm.go
index 02f76053cc9c215b00e0891ee68067d6df260149..f407798d6d0cebad4081d4aa876cbc8f323e449d 100644
--- a/vendor/github.com/tmthrgd/asm/asm.go
+++ b/vendor/github.com/tmthrgd/asm/asm.go
@@ -662,7 +662,7 @@ func Do(file, header string, run func(*Asm)) error {
 	return a.Flush()
 }
 
-//go:generate go run ./opcode_gen.go -i $GOROOT/src/cmd/internal/obj/x86/a.out.go -o opcode.go -p asm
+//go:generate go run ./opcode_gen.go -i $GOROOT/src/cmd/internal/obj/x86/aenum.go -o opcode.go -p asm
 //go:generate gofmt -w opcode.go
 
 // general opcodes
@@ -693,36 +693,14 @@ func (o Opcodes) JC(ops ...Operand)  { o.a.op("JC", ops...) }
 
 // faulty/incomplete opcodes
 
+// TODO: remove when go1.11 lands (see https://github.com/golang/go/commit/b80b4a23d1)
 func (o Opcodes) Pextrw(ops ...Operand) { o.a.unsupOp("PEXTRW", ops...) }
 func (o Opcodes) PEXTRW(ops ...Operand) { o.a.unsupOp("PEXTRW", ops...) }
 
 // unsupported opcodes
 
-func (o Opcodes) Ptest(ops ...Operand)       { o.a.unsupOp("PTEST", ops...) }
-func (o Opcodes) PTEST(ops ...Operand)       { o.a.unsupOp("PTEST", ops...) }
-func (o Opcodes) Vpunpckhbw(ops ...Operand)  { o.a.unsupOp("VPUNPCKHBW", ops...) }
-func (o Opcodes) VPUNPCKHBW(ops ...Operand)  { o.a.unsupOp("VPUNPCKHBW", ops...) }
-func (o Opcodes) Vpunpcklqdq(ops ...Operand) { o.a.unsupOp("VPUNPCKLQDQ", ops...) }
-func (o Opcodes) VPUNPCKLQDQ(ops ...Operand) { o.a.unsupOp("VPUNPCKLQDQ", ops...) }
-func (o Opcodes) Vpunpckhqdq(ops ...Operand) { o.a.unsupOp("VPUNPCKHQDQ", ops...) }
-func (o Opcodes) VPUNPCKHQDQ(ops ...Operand) { o.a.unsupOp("VPUNPCKHQDQ", ops...) }
-func (o Opcodes) Vpcmpgtb(ops ...Operand)    { o.a.unsupOp("VPCMPGTB", ops...) }
-func (o Opcodes) VPCMPGTB(ops ...Operand)    { o.a.unsupOp("VPCMPGTB", ops...) }
-func (o Opcodes) Vpcmpeqq(ops ...Operand)    { o.a.unsupOp("VPCMPEQQ", ops...) }
-func (o Opcodes) VPCMPEQQ(ops ...Operand)    { o.a.unsupOp("VPCMPEQQ", ops...) }
-func (o Opcodes) Pblendvb(ops ...Operand)    { o.a.unsupOp("PBLENDVB", ops...) }
-func (o Opcodes) PBLENDVB(ops ...Operand)    { o.a.unsupOp("PBLENDVB", ops...) }
-func (o Opcodes) Vinsertf128(ops ...Operand) { o.a.unsupOp("VINSERTF128", ops...) }
-func (o Opcodes) VINSERTF128(ops ...Operand) { o.a.unsupOp("VINSERTF128", ops...) }
-func (o Opcodes) Vpblendvb(ops ...Operand)   { o.a.unsupOp("VPBLENDVB", ops...) }
-func (o Opcodes) VPBLENDVB(ops ...Operand)   { o.a.unsupOp("VPBLENDVB", ops...) }
-func (o Opcodes) Vpsrad(ops ...Operand)      { o.a.unsupOp("VPSRAD", ops...) }
-func (o Opcodes) VPSRAD(ops ...Operand)      { o.a.unsupOp("VPSRAD", ops...) }
-func (o Opcodes) Pmaddubsw(ops ...Operand)   { o.a.unsupOp("PMADDUBSW", ops...) }
-func (o Opcodes) PMADDUBSW(ops ...Operand)   { o.a.unsupOp("PMADDUBSW", ops...) }
-func (o Opcodes) Vpsubb(ops ...Operand)      { o.a.unsupOp("VPSUBB", ops...) }
-func (o Opcodes) VPSUBB(ops ...Operand)      { o.a.unsupOp("VPSUBB", ops...) }
-func (o Opcodes) Pcmpeqq(ops ...Operand)     { o.a.unsupOp("PCMPEQQ", ops...) }
-func (o Opcodes) PCMPEQQ(ops ...Operand)     { o.a.unsupOp("PCMPEQQ", ops...) }
-func (o Opcodes) Cmpxchg16b(ops ...Operand)  { o.a.unsupOp("CMPXCHG16B", ops...) }
-func (o Opcodes) CMPXCHG16B(ops ...Operand)  { o.a.unsupOp("CMPXCHG16B", ops...) }
+// TODO: remove when go1.11 lands (see https://github.com/golang/go/commit/b80b4a23d1)
+func (o Opcodes) Pblendvb(ops ...Operand)   { o.a.unsupOp("PBLENDVB", ops...) }
+func (o Opcodes) PBLENDVB(ops ...Operand)   { o.a.unsupOp("PBLENDVB", ops...) }
+func (o Opcodes) Cmpxchg16b(ops ...Operand) { o.a.unsupOp("CMPXCHG16B", ops...) }
+func (o Opcodes) CMPXCHG16B(ops ...Operand) { o.a.unsupOp("CMPXCHG16B", ops...) }
diff --git a/vendor/github.com/tmthrgd/asm/opcode.go b/vendor/github.com/tmthrgd/asm/opcode.go
index d3e33066d7b296356ce7f810f5ff37c4ef6cd6d2..6bd86be5c816e1e2b5d0e507dfedbffe8472b829 100644
--- a/vendor/github.com/tmthrgd/asm/opcode.go
+++ b/vendor/github.com/tmthrgd/asm/opcode.go
@@ -1,1519 +1,2253 @@
-// Generated by opcode_gen -i /home/tom/.go/src/cmd/internal/obj/x86/a.out.go -o opcode.go -p asm
+// Generated by opcode_gen -i $GOROOT/src/cmd/internal/obj/x86/aenum.go -o opcode.go -p asm
 // Do not edit.
 
 package asm
 
-func (o Opcodes) Aad(ops ...Operand)             { o.a.op("AAD", ops...) }
-func (o Opcodes) AAD(ops ...Operand)             { o.a.op("AAD", ops...) }
-func (o Opcodes) Aam(ops ...Operand)             { o.a.op("AAM", ops...) }
-func (o Opcodes) AAM(ops ...Operand)             { o.a.op("AAM", ops...) }
-func (o Opcodes) Aas(ops ...Operand)             { o.a.op("AAS", ops...) }
-func (o Opcodes) AAS(ops ...Operand)             { o.a.op("AAS", ops...) }
-func (o Opcodes) Adcb(ops ...Operand)            { o.a.op("ADCB", ops...) }
-func (o Opcodes) ADCB(ops ...Operand)            { o.a.op("ADCB", ops...) }
-func (o Opcodes) Adcl(ops ...Operand)            { o.a.op("ADCL", ops...) }
-func (o Opcodes) ADCL(ops ...Operand)            { o.a.op("ADCL", ops...) }
-func (o Opcodes) Adcw(ops ...Operand)            { o.a.op("ADCW", ops...) }
-func (o Opcodes) ADCW(ops ...Operand)            { o.a.op("ADCW", ops...) }
-func (o Opcodes) Addb(ops ...Operand)            { o.a.op("ADDB", ops...) }
-func (o Opcodes) ADDB(ops ...Operand)            { o.a.op("ADDB", ops...) }
-func (o Opcodes) Addl(ops ...Operand)            { o.a.op("ADDL", ops...) }
-func (o Opcodes) ADDL(ops ...Operand)            { o.a.op("ADDL", ops...) }
-func (o Opcodes) Addw(ops ...Operand)            { o.a.op("ADDW", ops...) }
-func (o Opcodes) ADDW(ops ...Operand)            { o.a.op("ADDW", ops...) }
-func (o Opcodes) Adjsp(ops ...Operand)           { o.a.op("ADJSP", ops...) }
-func (o Opcodes) ADJSP(ops ...Operand)           { o.a.op("ADJSP", ops...) }
-func (o Opcodes) Andb(ops ...Operand)            { o.a.op("ANDB", ops...) }
-func (o Opcodes) ANDB(ops ...Operand)            { o.a.op("ANDB", ops...) }
-func (o Opcodes) Andl(ops ...Operand)            { o.a.op("ANDL", ops...) }
-func (o Opcodes) ANDL(ops ...Operand)            { o.a.op("ANDL", ops...) }
-func (o Opcodes) Andw(ops ...Operand)            { o.a.op("ANDW", ops...) }
-func (o Opcodes) ANDW(ops ...Operand)            { o.a.op("ANDW", ops...) }
-func (o Opcodes) Arpl(ops ...Operand)            { o.a.op("ARPL", ops...) }
-func (o Opcodes) ARPL(ops ...Operand)            { o.a.op("ARPL", ops...) }
-func (o Opcodes) Boundl(ops ...Operand)          { o.a.op("BOUNDL", ops...) }
-func (o Opcodes) BOUNDL(ops ...Operand)          { o.a.op("BOUNDL", ops...) }
-func (o Opcodes) Boundw(ops ...Operand)          { o.a.op("BOUNDW", ops...) }
-func (o Opcodes) BOUNDW(ops ...Operand)          { o.a.op("BOUNDW", ops...) }
-func (o Opcodes) Bsfl(ops ...Operand)            { o.a.op("BSFL", ops...) }
-func (o Opcodes) BSFL(ops ...Operand)            { o.a.op("BSFL", ops...) }
-func (o Opcodes) Bsfw(ops ...Operand)            { o.a.op("BSFW", ops...) }
-func (o Opcodes) BSFW(ops ...Operand)            { o.a.op("BSFW", ops...) }
-func (o Opcodes) Bsrl(ops ...Operand)            { o.a.op("BSRL", ops...) }
-func (o Opcodes) BSRL(ops ...Operand)            { o.a.op("BSRL", ops...) }
-func (o Opcodes) Bsrw(ops ...Operand)            { o.a.op("BSRW", ops...) }
-func (o Opcodes) BSRW(ops ...Operand)            { o.a.op("BSRW", ops...) }
-func (o Opcodes) Btl(ops ...Operand)             { o.a.op("BTL", ops...) }
-func (o Opcodes) BTL(ops ...Operand)             { o.a.op("BTL", ops...) }
-func (o Opcodes) Btw(ops ...Operand)             { o.a.op("BTW", ops...) }
-func (o Opcodes) BTW(ops ...Operand)             { o.a.op("BTW", ops...) }
-func (o Opcodes) Btcl(ops ...Operand)            { o.a.op("BTCL", ops...) }
-func (o Opcodes) BTCL(ops ...Operand)            { o.a.op("BTCL", ops...) }
-func (o Opcodes) Btcw(ops ...Operand)            { o.a.op("BTCW", ops...) }
-func (o Opcodes) BTCW(ops ...Operand)            { o.a.op("BTCW", ops...) }
-func (o Opcodes) Btrl(ops ...Operand)            { o.a.op("BTRL", ops...) }
-func (o Opcodes) BTRL(ops ...Operand)            { o.a.op("BTRL", ops...) }
-func (o Opcodes) Btrw(ops ...Operand)            { o.a.op("BTRW", ops...) }
-func (o Opcodes) BTRW(ops ...Operand)            { o.a.op("BTRW", ops...) }
-func (o Opcodes) Btsl(ops ...Operand)            { o.a.op("BTSL", ops...) }
-func (o Opcodes) BTSL(ops ...Operand)            { o.a.op("BTSL", ops...) }
-func (o Opcodes) Btsw(ops ...Operand)            { o.a.op("BTSW", ops...) }
-func (o Opcodes) BTSW(ops ...Operand)            { o.a.op("BTSW", ops...) }
-func (o Opcodes) Byte(ops ...Operand)            { o.a.op("BYTE", ops...) }
-func (o Opcodes) BYTE(ops ...Operand)            { o.a.op("BYTE", ops...) }
-func (o Opcodes) Clc(ops ...Operand)             { o.a.op("CLC", ops...) }
-func (o Opcodes) CLC(ops ...Operand)             { o.a.op("CLC", ops...) }
-func (o Opcodes) Cld(ops ...Operand)             { o.a.op("CLD", ops...) }
-func (o Opcodes) CLD(ops ...Operand)             { o.a.op("CLD", ops...) }
-func (o Opcodes) Cli(ops ...Operand)             { o.a.op("CLI", ops...) }
-func (o Opcodes) CLI(ops ...Operand)             { o.a.op("CLI", ops...) }
-func (o Opcodes) Clts(ops ...Operand)            { o.a.op("CLTS", ops...) }
-func (o Opcodes) CLTS(ops ...Operand)            { o.a.op("CLTS", ops...) }
-func (o Opcodes) Cmc(ops ...Operand)             { o.a.op("CMC", ops...) }
-func (o Opcodes) CMC(ops ...Operand)             { o.a.op("CMC", ops...) }
-func (o Opcodes) Cmpb(ops ...Operand)            { o.a.op("CMPB", ops...) }
-func (o Opcodes) CMPB(ops ...Operand)            { o.a.op("CMPB", ops...) }
-func (o Opcodes) Cmpl(ops ...Operand)            { o.a.op("CMPL", ops...) }
-func (o Opcodes) CMPL(ops ...Operand)            { o.a.op("CMPL", ops...) }
-func (o Opcodes) Cmpw(ops ...Operand)            { o.a.op("CMPW", ops...) }
-func (o Opcodes) CMPW(ops ...Operand)            { o.a.op("CMPW", ops...) }
-func (o Opcodes) Cmpsb(ops ...Operand)           { o.a.op("CMPSB", ops...) }
-func (o Opcodes) CMPSB(ops ...Operand)           { o.a.op("CMPSB", ops...) }
-func (o Opcodes) Cmpsl(ops ...Operand)           { o.a.op("CMPSL", ops...) }
-func (o Opcodes) CMPSL(ops ...Operand)           { o.a.op("CMPSL", ops...) }
-func (o Opcodes) Cmpsw(ops ...Operand)           { o.a.op("CMPSW", ops...) }
-func (o Opcodes) CMPSW(ops ...Operand)           { o.a.op("CMPSW", ops...) }
-func (o Opcodes) Daa(ops ...Operand)             { o.a.op("DAA", ops...) }
-func (o Opcodes) DAA(ops ...Operand)             { o.a.op("DAA", ops...) }
-func (o Opcodes) Das(ops ...Operand)             { o.a.op("DAS", ops...) }
-func (o Opcodes) DAS(ops ...Operand)             { o.a.op("DAS", ops...) }
-func (o Opcodes) Decb(ops ...Operand)            { o.a.op("DECB", ops...) }
-func (o Opcodes) DECB(ops ...Operand)            { o.a.op("DECB", ops...) }
-func (o Opcodes) Decl(ops ...Operand)            { o.a.op("DECL", ops...) }
-func (o Opcodes) DECL(ops ...Operand)            { o.a.op("DECL", ops...) }
-func (o Opcodes) Decq(ops ...Operand)            { o.a.op("DECQ", ops...) }
-func (o Opcodes) DECQ(ops ...Operand)            { o.a.op("DECQ", ops...) }
-func (o Opcodes) Decw(ops ...Operand)            { o.a.op("DECW", ops...) }
-func (o Opcodes) DECW(ops ...Operand)            { o.a.op("DECW", ops...) }
-func (o Opcodes) Divb(ops ...Operand)            { o.a.op("DIVB", ops...) }
-func (o Opcodes) DIVB(ops ...Operand)            { o.a.op("DIVB", ops...) }
-func (o Opcodes) Divl(ops ...Operand)            { o.a.op("DIVL", ops...) }
-func (o Opcodes) DIVL(ops ...Operand)            { o.a.op("DIVL", ops...) }
-func (o Opcodes) Divw(ops ...Operand)            { o.a.op("DIVW", ops...) }
-func (o Opcodes) DIVW(ops ...Operand)            { o.a.op("DIVW", ops...) }
-func (o Opcodes) Enter(ops ...Operand)           { o.a.op("ENTER", ops...) }
-func (o Opcodes) ENTER(ops ...Operand)           { o.a.op("ENTER", ops...) }
-func (o Opcodes) Haddpd(ops ...Operand)          { o.a.op("HADDPD", ops...) }
-func (o Opcodes) HADDPD(ops ...Operand)          { o.a.op("HADDPD", ops...) }
-func (o Opcodes) Haddps(ops ...Operand)          { o.a.op("HADDPS", ops...) }
-func (o Opcodes) HADDPS(ops ...Operand)          { o.a.op("HADDPS", ops...) }
-func (o Opcodes) Hlt(ops ...Operand)             { o.a.op("HLT", ops...) }
-func (o Opcodes) HLT(ops ...Operand)             { o.a.op("HLT", ops...) }
-func (o Opcodes) Hsubpd(ops ...Operand)          { o.a.op("HSUBPD", ops...) }
-func (o Opcodes) HSUBPD(ops ...Operand)          { o.a.op("HSUBPD", ops...) }
-func (o Opcodes) Hsubps(ops ...Operand)          { o.a.op("HSUBPS", ops...) }
-func (o Opcodes) HSUBPS(ops ...Operand)          { o.a.op("HSUBPS", ops...) }
-func (o Opcodes) Idivb(ops ...Operand)           { o.a.op("IDIVB", ops...) }
-func (o Opcodes) IDIVB(ops ...Operand)           { o.a.op("IDIVB", ops...) }
-func (o Opcodes) Idivl(ops ...Operand)           { o.a.op("IDIVL", ops...) }
-func (o Opcodes) IDIVL(ops ...Operand)           { o.a.op("IDIVL", ops...) }
-func (o Opcodes) Idivw(ops ...Operand)           { o.a.op("IDIVW", ops...) }
-func (o Opcodes) IDIVW(ops ...Operand)           { o.a.op("IDIVW", ops...) }
-func (o Opcodes) Imulb(ops ...Operand)           { o.a.op("IMULB", ops...) }
-func (o Opcodes) IMULB(ops ...Operand)           { o.a.op("IMULB", ops...) }
-func (o Opcodes) Imull(ops ...Operand)           { o.a.op("IMULL", ops...) }
-func (o Opcodes) IMULL(ops ...Operand)           { o.a.op("IMULL", ops...) }
-func (o Opcodes) Imulw(ops ...Operand)           { o.a.op("IMULW", ops...) }
-func (o Opcodes) IMULW(ops ...Operand)           { o.a.op("IMULW", ops...) }
-func (o Opcodes) Inb(ops ...Operand)             { o.a.op("INB", ops...) }
-func (o Opcodes) INB(ops ...Operand)             { o.a.op("INB", ops...) }
-func (o Opcodes) Inl(ops ...Operand)             { o.a.op("INL", ops...) }
-func (o Opcodes) INL(ops ...Operand)             { o.a.op("INL", ops...) }
-func (o Opcodes) Inw(ops ...Operand)             { o.a.op("INW", ops...) }
-func (o Opcodes) INW(ops ...Operand)             { o.a.op("INW", ops...) }
-func (o Opcodes) Incb(ops ...Operand)            { o.a.op("INCB", ops...) }
-func (o Opcodes) INCB(ops ...Operand)            { o.a.op("INCB", ops...) }
-func (o Opcodes) Incl(ops ...Operand)            { o.a.op("INCL", ops...) }
-func (o Opcodes) INCL(ops ...Operand)            { o.a.op("INCL", ops...) }
-func (o Opcodes) Incq(ops ...Operand)            { o.a.op("INCQ", ops...) }
-func (o Opcodes) INCQ(ops ...Operand)            { o.a.op("INCQ", ops...) }
-func (o Opcodes) Incw(ops ...Operand)            { o.a.op("INCW", ops...) }
-func (o Opcodes) INCW(ops ...Operand)            { o.a.op("INCW", ops...) }
-func (o Opcodes) Insb(ops ...Operand)            { o.a.op("INSB", ops...) }
-func (o Opcodes) INSB(ops ...Operand)            { o.a.op("INSB", ops...) }
-func (o Opcodes) Insl(ops ...Operand)            { o.a.op("INSL", ops...) }
-func (o Opcodes) INSL(ops ...Operand)            { o.a.op("INSL", ops...) }
-func (o Opcodes) Insw(ops ...Operand)            { o.a.op("INSW", ops...) }
-func (o Opcodes) INSW(ops ...Operand)            { o.a.op("INSW", ops...) }
-func (o Opcodes) Int(ops ...Operand)             { o.a.op("INT", ops...) }
-func (o Opcodes) INT(ops ...Operand)             { o.a.op("INT", ops...) }
-func (o Opcodes) Into(ops ...Operand)            { o.a.op("INTO", ops...) }
-func (o Opcodes) INTO(ops ...Operand)            { o.a.op("INTO", ops...) }
-func (o Opcodes) Iretl(ops ...Operand)           { o.a.op("IRETL", ops...) }
-func (o Opcodes) IRETL(ops ...Operand)           { o.a.op("IRETL", ops...) }
-func (o Opcodes) Iretw(ops ...Operand)           { o.a.op("IRETW", ops...) }
-func (o Opcodes) IRETW(ops ...Operand)           { o.a.op("IRETW", ops...) }
-func (o Opcodes) Jcc(ops ...Operand)             { o.a.op("JCC", ops...) }
-func (o Opcodes) JCC(ops ...Operand)             { o.a.op("JCC", ops...) }
-func (o Opcodes) Jcs(ops ...Operand)             { o.a.op("JCS", ops...) }
-func (o Opcodes) JCS(ops ...Operand)             { o.a.op("JCS", ops...) }
-func (o Opcodes) Jcxzl(ops ...Operand)           { o.a.op("JCXZL", ops...) }
-func (o Opcodes) JCXZL(ops ...Operand)           { o.a.op("JCXZL", ops...) }
-func (o Opcodes) Jeq(ops ...Operand)             { o.a.op("JEQ", ops...) }
-func (o Opcodes) JEQ(ops ...Operand)             { o.a.op("JEQ", ops...) }
-func (o Opcodes) Jge(ops ...Operand)             { o.a.op("JGE", ops...) }
-func (o Opcodes) JGE(ops ...Operand)             { o.a.op("JGE", ops...) }
-func (o Opcodes) Jgt(ops ...Operand)             { o.a.op("JGT", ops...) }
-func (o Opcodes) JGT(ops ...Operand)             { o.a.op("JGT", ops...) }
-func (o Opcodes) Jhi(ops ...Operand)             { o.a.op("JHI", ops...) }
-func (o Opcodes) JHI(ops ...Operand)             { o.a.op("JHI", ops...) }
-func (o Opcodes) Jle(ops ...Operand)             { o.a.op("JLE", ops...) }
-func (o Opcodes) JLE(ops ...Operand)             { o.a.op("JLE", ops...) }
-func (o Opcodes) Jls(ops ...Operand)             { o.a.op("JLS", ops...) }
-func (o Opcodes) JLS(ops ...Operand)             { o.a.op("JLS", ops...) }
-func (o Opcodes) Jlt(ops ...Operand)             { o.a.op("JLT", ops...) }
-func (o Opcodes) JLT(ops ...Operand)             { o.a.op("JLT", ops...) }
-func (o Opcodes) Jmi(ops ...Operand)             { o.a.op("JMI", ops...) }
-func (o Opcodes) JMI(ops ...Operand)             { o.a.op("JMI", ops...) }
-func (o Opcodes) Jne(ops ...Operand)             { o.a.op("JNE", ops...) }
-func (o Opcodes) JNE(ops ...Operand)             { o.a.op("JNE", ops...) }
-func (o Opcodes) Joc(ops ...Operand)             { o.a.op("JOC", ops...) }
-func (o Opcodes) JOC(ops ...Operand)             { o.a.op("JOC", ops...) }
-func (o Opcodes) Jos(ops ...Operand)             { o.a.op("JOS", ops...) }
-func (o Opcodes) JOS(ops ...Operand)             { o.a.op("JOS", ops...) }
-func (o Opcodes) Jpc(ops ...Operand)             { o.a.op("JPC", ops...) }
-func (o Opcodes) JPC(ops ...Operand)             { o.a.op("JPC", ops...) }
-func (o Opcodes) Jpl(ops ...Operand)             { o.a.op("JPL", ops...) }
-func (o Opcodes) JPL(ops ...Operand)             { o.a.op("JPL", ops...) }
-func (o Opcodes) Jps(ops ...Operand)             { o.a.op("JPS", ops...) }
-func (o Opcodes) JPS(ops ...Operand)             { o.a.op("JPS", ops...) }
-func (o Opcodes) Lahf(ops ...Operand)            { o.a.op("LAHF", ops...) }
-func (o Opcodes) LAHF(ops ...Operand)            { o.a.op("LAHF", ops...) }
-func (o Opcodes) Larl(ops ...Operand)            { o.a.op("LARL", ops...) }
-func (o Opcodes) LARL(ops ...Operand)            { o.a.op("LARL", ops...) }
-func (o Opcodes) Larw(ops ...Operand)            { o.a.op("LARW", ops...) }
-func (o Opcodes) LARW(ops ...Operand)            { o.a.op("LARW", ops...) }
-func (o Opcodes) Leal(ops ...Operand)            { o.a.op("LEAL", ops...) }
-func (o Opcodes) LEAL(ops ...Operand)            { o.a.op("LEAL", ops...) }
-func (o Opcodes) Leaw(ops ...Operand)            { o.a.op("LEAW", ops...) }
-func (o Opcodes) LEAW(ops ...Operand)            { o.a.op("LEAW", ops...) }
-func (o Opcodes) Leavel(ops ...Operand)          { o.a.op("LEAVEL", ops...) }
-func (o Opcodes) LEAVEL(ops ...Operand)          { o.a.op("LEAVEL", ops...) }
-func (o Opcodes) Leavew(ops ...Operand)          { o.a.op("LEAVEW", ops...) }
-func (o Opcodes) LEAVEW(ops ...Operand)          { o.a.op("LEAVEW", ops...) }
-func (o Opcodes) Lock(ops ...Operand)            { o.a.op("LOCK", ops...) }
-func (o Opcodes) LOCK(ops ...Operand)            { o.a.op("LOCK", ops...) }
-func (o Opcodes) Lodsb(ops ...Operand)           { o.a.op("LODSB", ops...) }
-func (o Opcodes) LODSB(ops ...Operand)           { o.a.op("LODSB", ops...) }
-func (o Opcodes) Lodsl(ops ...Operand)           { o.a.op("LODSL", ops...) }
-func (o Opcodes) LODSL(ops ...Operand)           { o.a.op("LODSL", ops...) }
-func (o Opcodes) Lodsw(ops ...Operand)           { o.a.op("LODSW", ops...) }
-func (o Opcodes) LODSW(ops ...Operand)           { o.a.op("LODSW", ops...) }
-func (o Opcodes) Long(ops ...Operand)            { o.a.op("LONG", ops...) }
-func (o Opcodes) LONG(ops ...Operand)            { o.a.op("LONG", ops...) }
-func (o Opcodes) Loop(ops ...Operand)            { o.a.op("LOOP", ops...) }
-func (o Opcodes) LOOP(ops ...Operand)            { o.a.op("LOOP", ops...) }
-func (o Opcodes) Loopeq(ops ...Operand)          { o.a.op("LOOPEQ", ops...) }
-func (o Opcodes) LOOPEQ(ops ...Operand)          { o.a.op("LOOPEQ", ops...) }
-func (o Opcodes) Loopne(ops ...Operand)          { o.a.op("LOOPNE", ops...) }
-func (o Opcodes) LOOPNE(ops ...Operand)          { o.a.op("LOOPNE", ops...) }
-func (o Opcodes) Lsll(ops ...Operand)            { o.a.op("LSLL", ops...) }
-func (o Opcodes) LSLL(ops ...Operand)            { o.a.op("LSLL", ops...) }
-func (o Opcodes) Lslw(ops ...Operand)            { o.a.op("LSLW", ops...) }
-func (o Opcodes) LSLW(ops ...Operand)            { o.a.op("LSLW", ops...) }
-func (o Opcodes) Movb(ops ...Operand)            { o.a.op("MOVB", ops...) }
-func (o Opcodes) MOVB(ops ...Operand)            { o.a.op("MOVB", ops...) }
-func (o Opcodes) Movl(ops ...Operand)            { o.a.op("MOVL", ops...) }
-func (o Opcodes) MOVL(ops ...Operand)            { o.a.op("MOVL", ops...) }
-func (o Opcodes) Movw(ops ...Operand)            { o.a.op("MOVW", ops...) }
-func (o Opcodes) MOVW(ops ...Operand)            { o.a.op("MOVW", ops...) }
-func (o Opcodes) Movblsx(ops ...Operand)         { o.a.op("MOVBLSX", ops...) }
-func (o Opcodes) MOVBLSX(ops ...Operand)         { o.a.op("MOVBLSX", ops...) }
-func (o Opcodes) Movblzx(ops ...Operand)         { o.a.op("MOVBLZX", ops...) }
-func (o Opcodes) MOVBLZX(ops ...Operand)         { o.a.op("MOVBLZX", ops...) }
-func (o Opcodes) Movbqsx(ops ...Operand)         { o.a.op("MOVBQSX", ops...) }
-func (o Opcodes) MOVBQSX(ops ...Operand)         { o.a.op("MOVBQSX", ops...) }
-func (o Opcodes) Movbqzx(ops ...Operand)         { o.a.op("MOVBQZX", ops...) }
-func (o Opcodes) MOVBQZX(ops ...Operand)         { o.a.op("MOVBQZX", ops...) }
-func (o Opcodes) Movbwsx(ops ...Operand)         { o.a.op("MOVBWSX", ops...) }
-func (o Opcodes) MOVBWSX(ops ...Operand)         { o.a.op("MOVBWSX", ops...) }
-func (o Opcodes) Movbwzx(ops ...Operand)         { o.a.op("MOVBWZX", ops...) }
-func (o Opcodes) MOVBWZX(ops ...Operand)         { o.a.op("MOVBWZX", ops...) }
-func (o Opcodes) Movwlsx(ops ...Operand)         { o.a.op("MOVWLSX", ops...) }
-func (o Opcodes) MOVWLSX(ops ...Operand)         { o.a.op("MOVWLSX", ops...) }
-func (o Opcodes) Movwlzx(ops ...Operand)         { o.a.op("MOVWLZX", ops...) }
-func (o Opcodes) MOVWLZX(ops ...Operand)         { o.a.op("MOVWLZX", ops...) }
-func (o Opcodes) Movwqsx(ops ...Operand)         { o.a.op("MOVWQSX", ops...) }
-func (o Opcodes) MOVWQSX(ops ...Operand)         { o.a.op("MOVWQSX", ops...) }
-func (o Opcodes) Movwqzx(ops ...Operand)         { o.a.op("MOVWQZX", ops...) }
-func (o Opcodes) MOVWQZX(ops ...Operand)         { o.a.op("MOVWQZX", ops...) }
-func (o Opcodes) Movsb(ops ...Operand)           { o.a.op("MOVSB", ops...) }
-func (o Opcodes) MOVSB(ops ...Operand)           { o.a.op("MOVSB", ops...) }
-func (o Opcodes) Movsl(ops ...Operand)           { o.a.op("MOVSL", ops...) }
-func (o Opcodes) MOVSL(ops ...Operand)           { o.a.op("MOVSL", ops...) }
-func (o Opcodes) Movsw(ops ...Operand)           { o.a.op("MOVSW", ops...) }
-func (o Opcodes) MOVSW(ops ...Operand)           { o.a.op("MOVSW", ops...) }
-func (o Opcodes) Mulb(ops ...Operand)            { o.a.op("MULB", ops...) }
-func (o Opcodes) MULB(ops ...Operand)            { o.a.op("MULB", ops...) }
-func (o Opcodes) Mull(ops ...Operand)            { o.a.op("MULL", ops...) }
-func (o Opcodes) MULL(ops ...Operand)            { o.a.op("MULL", ops...) }
-func (o Opcodes) Mulw(ops ...Operand)            { o.a.op("MULW", ops...) }
-func (o Opcodes) MULW(ops ...Operand)            { o.a.op("MULW", ops...) }
-func (o Opcodes) Negb(ops ...Operand)            { o.a.op("NEGB", ops...) }
-func (o Opcodes) NEGB(ops ...Operand)            { o.a.op("NEGB", ops...) }
-func (o Opcodes) Negl(ops ...Operand)            { o.a.op("NEGL", ops...) }
-func (o Opcodes) NEGL(ops ...Operand)            { o.a.op("NEGL", ops...) }
-func (o Opcodes) Negw(ops ...Operand)            { o.a.op("NEGW", ops...) }
-func (o Opcodes) NEGW(ops ...Operand)            { o.a.op("NEGW", ops...) }
-func (o Opcodes) Notb(ops ...Operand)            { o.a.op("NOTB", ops...) }
-func (o Opcodes) NOTB(ops ...Operand)            { o.a.op("NOTB", ops...) }
-func (o Opcodes) Notl(ops ...Operand)            { o.a.op("NOTL", ops...) }
-func (o Opcodes) NOTL(ops ...Operand)            { o.a.op("NOTL", ops...) }
-func (o Opcodes) Notw(ops ...Operand)            { o.a.op("NOTW", ops...) }
-func (o Opcodes) NOTW(ops ...Operand)            { o.a.op("NOTW", ops...) }
-func (o Opcodes) Orb(ops ...Operand)             { o.a.op("ORB", ops...) }
-func (o Opcodes) ORB(ops ...Operand)             { o.a.op("ORB", ops...) }
-func (o Opcodes) Orl(ops ...Operand)             { o.a.op("ORL", ops...) }
-func (o Opcodes) ORL(ops ...Operand)             { o.a.op("ORL", ops...) }
-func (o Opcodes) Orw(ops ...Operand)             { o.a.op("ORW", ops...) }
-func (o Opcodes) ORW(ops ...Operand)             { o.a.op("ORW", ops...) }
-func (o Opcodes) Outb(ops ...Operand)            { o.a.op("OUTB", ops...) }
-func (o Opcodes) OUTB(ops ...Operand)            { o.a.op("OUTB", ops...) }
-func (o Opcodes) Outl(ops ...Operand)            { o.a.op("OUTL", ops...) }
-func (o Opcodes) OUTL(ops ...Operand)            { o.a.op("OUTL", ops...) }
-func (o Opcodes) Outw(ops ...Operand)            { o.a.op("OUTW", ops...) }
-func (o Opcodes) OUTW(ops ...Operand)            { o.a.op("OUTW", ops...) }
-func (o Opcodes) Outsb(ops ...Operand)           { o.a.op("OUTSB", ops...) }
-func (o Opcodes) OUTSB(ops ...Operand)           { o.a.op("OUTSB", ops...) }
-func (o Opcodes) Outsl(ops ...Operand)           { o.a.op("OUTSL", ops...) }
-func (o Opcodes) OUTSL(ops ...Operand)           { o.a.op("OUTSL", ops...) }
-func (o Opcodes) Outsw(ops ...Operand)           { o.a.op("OUTSW", ops...) }
-func (o Opcodes) OUTSW(ops ...Operand)           { o.a.op("OUTSW", ops...) }
-func (o Opcodes) Pause(ops ...Operand)           { o.a.op("PAUSE", ops...) }
-func (o Opcodes) PAUSE(ops ...Operand)           { o.a.op("PAUSE", ops...) }
-func (o Opcodes) Popal(ops ...Operand)           { o.a.op("POPAL", ops...) }
-func (o Opcodes) POPAL(ops ...Operand)           { o.a.op("POPAL", ops...) }
-func (o Opcodes) Popaw(ops ...Operand)           { o.a.op("POPAW", ops...) }
-func (o Opcodes) POPAW(ops ...Operand)           { o.a.op("POPAW", ops...) }
-func (o Opcodes) Popcntw(ops ...Operand)         { o.a.op("POPCNTW", ops...) }
-func (o Opcodes) POPCNTW(ops ...Operand)         { o.a.op("POPCNTW", ops...) }
-func (o Opcodes) Popcntl(ops ...Operand)         { o.a.op("POPCNTL", ops...) }
-func (o Opcodes) POPCNTL(ops ...Operand)         { o.a.op("POPCNTL", ops...) }
-func (o Opcodes) Popcntq(ops ...Operand)         { o.a.op("POPCNTQ", ops...) }
-func (o Opcodes) POPCNTQ(ops ...Operand)         { o.a.op("POPCNTQ", ops...) }
-func (o Opcodes) Popfl(ops ...Operand)           { o.a.op("POPFL", ops...) }
-func (o Opcodes) POPFL(ops ...Operand)           { o.a.op("POPFL", ops...) }
-func (o Opcodes) Popfw(ops ...Operand)           { o.a.op("POPFW", ops...) }
-func (o Opcodes) POPFW(ops ...Operand)           { o.a.op("POPFW", ops...) }
-func (o Opcodes) Popl(ops ...Operand)            { o.a.op("POPL", ops...) }
-func (o Opcodes) POPL(ops ...Operand)            { o.a.op("POPL", ops...) }
-func (o Opcodes) Popw(ops ...Operand)            { o.a.op("POPW", ops...) }
-func (o Opcodes) POPW(ops ...Operand)            { o.a.op("POPW", ops...) }
-func (o Opcodes) Pushal(ops ...Operand)          { o.a.op("PUSHAL", ops...) }
-func (o Opcodes) PUSHAL(ops ...Operand)          { o.a.op("PUSHAL", ops...) }
-func (o Opcodes) Pushaw(ops ...Operand)          { o.a.op("PUSHAW", ops...) }
-func (o Opcodes) PUSHAW(ops ...Operand)          { o.a.op("PUSHAW", ops...) }
-func (o Opcodes) Pushfl(ops ...Operand)          { o.a.op("PUSHFL", ops...) }
-func (o Opcodes) PUSHFL(ops ...Operand)          { o.a.op("PUSHFL", ops...) }
-func (o Opcodes) Pushfw(ops ...Operand)          { o.a.op("PUSHFW", ops...) }
-func (o Opcodes) PUSHFW(ops ...Operand)          { o.a.op("PUSHFW", ops...) }
-func (o Opcodes) Pushl(ops ...Operand)           { o.a.op("PUSHL", ops...) }
-func (o Opcodes) PUSHL(ops ...Operand)           { o.a.op("PUSHL", ops...) }
-func (o Opcodes) Pushw(ops ...Operand)           { o.a.op("PUSHW", ops...) }
-func (o Opcodes) PUSHW(ops ...Operand)           { o.a.op("PUSHW", ops...) }
-func (o Opcodes) Rclb(ops ...Operand)            { o.a.op("RCLB", ops...) }
-func (o Opcodes) RCLB(ops ...Operand)            { o.a.op("RCLB", ops...) }
-func (o Opcodes) Rcll(ops ...Operand)            { o.a.op("RCLL", ops...) }
-func (o Opcodes) RCLL(ops ...Operand)            { o.a.op("RCLL", ops...) }
-func (o Opcodes) Rclw(ops ...Operand)            { o.a.op("RCLW", ops...) }
-func (o Opcodes) RCLW(ops ...Operand)            { o.a.op("RCLW", ops...) }
-func (o Opcodes) Rcrb(ops ...Operand)            { o.a.op("RCRB", ops...) }
-func (o Opcodes) RCRB(ops ...Operand)            { o.a.op("RCRB", ops...) }
-func (o Opcodes) Rcrl(ops ...Operand)            { o.a.op("RCRL", ops...) }
-func (o Opcodes) RCRL(ops ...Operand)            { o.a.op("RCRL", ops...) }
-func (o Opcodes) Rcrw(ops ...Operand)            { o.a.op("RCRW", ops...) }
-func (o Opcodes) RCRW(ops ...Operand)            { o.a.op("RCRW", ops...) }
-func (o Opcodes) Rep(ops ...Operand)             { o.a.op("REP", ops...) }
-func (o Opcodes) REP(ops ...Operand)             { o.a.op("REP", ops...) }
-func (o Opcodes) Repn(ops ...Operand)            { o.a.op("REPN", ops...) }
-func (o Opcodes) REPN(ops ...Operand)            { o.a.op("REPN", ops...) }
-func (o Opcodes) Rolb(ops ...Operand)            { o.a.op("ROLB", ops...) }
-func (o Opcodes) ROLB(ops ...Operand)            { o.a.op("ROLB", ops...) }
-func (o Opcodes) Roll(ops ...Operand)            { o.a.op("ROLL", ops...) }
-func (o Opcodes) ROLL(ops ...Operand)            { o.a.op("ROLL", ops...) }
-func (o Opcodes) Rolw(ops ...Operand)            { o.a.op("ROLW", ops...) }
-func (o Opcodes) ROLW(ops ...Operand)            { o.a.op("ROLW", ops...) }
-func (o Opcodes) Rorb(ops ...Operand)            { o.a.op("RORB", ops...) }
-func (o Opcodes) RORB(ops ...Operand)            { o.a.op("RORB", ops...) }
-func (o Opcodes) Rorl(ops ...Operand)            { o.a.op("RORL", ops...) }
-func (o Opcodes) RORL(ops ...Operand)            { o.a.op("RORL", ops...) }
-func (o Opcodes) Rorw(ops ...Operand)            { o.a.op("RORW", ops...) }
-func (o Opcodes) RORW(ops ...Operand)            { o.a.op("RORW", ops...) }
-func (o Opcodes) Sahf(ops ...Operand)            { o.a.op("SAHF", ops...) }
-func (o Opcodes) SAHF(ops ...Operand)            { o.a.op("SAHF", ops...) }
-func (o Opcodes) Salb(ops ...Operand)            { o.a.op("SALB", ops...) }
-func (o Opcodes) SALB(ops ...Operand)            { o.a.op("SALB", ops...) }
-func (o Opcodes) Sall(ops ...Operand)            { o.a.op("SALL", ops...) }
-func (o Opcodes) SALL(ops ...Operand)            { o.a.op("SALL", ops...) }
-func (o Opcodes) Salw(ops ...Operand)            { o.a.op("SALW", ops...) }
-func (o Opcodes) SALW(ops ...Operand)            { o.a.op("SALW", ops...) }
-func (o Opcodes) Sarb(ops ...Operand)            { o.a.op("SARB", ops...) }
-func (o Opcodes) SARB(ops ...Operand)            { o.a.op("SARB", ops...) }
-func (o Opcodes) Sarl(ops ...Operand)            { o.a.op("SARL", ops...) }
-func (o Opcodes) SARL(ops ...Operand)            { o.a.op("SARL", ops...) }
-func (o Opcodes) Sarw(ops ...Operand)            { o.a.op("SARW", ops...) }
-func (o Opcodes) SARW(ops ...Operand)            { o.a.op("SARW", ops...) }
-func (o Opcodes) Sbbb(ops ...Operand)            { o.a.op("SBBB", ops...) }
-func (o Opcodes) SBBB(ops ...Operand)            { o.a.op("SBBB", ops...) }
-func (o Opcodes) Sbbl(ops ...Operand)            { o.a.op("SBBL", ops...) }
-func (o Opcodes) SBBL(ops ...Operand)            { o.a.op("SBBL", ops...) }
-func (o Opcodes) Sbbw(ops ...Operand)            { o.a.op("SBBW", ops...) }
-func (o Opcodes) SBBW(ops ...Operand)            { o.a.op("SBBW", ops...) }
-func (o Opcodes) Scasb(ops ...Operand)           { o.a.op("SCASB", ops...) }
-func (o Opcodes) SCASB(ops ...Operand)           { o.a.op("SCASB", ops...) }
-func (o Opcodes) Scasl(ops ...Operand)           { o.a.op("SCASL", ops...) }
-func (o Opcodes) SCASL(ops ...Operand)           { o.a.op("SCASL", ops...) }
-func (o Opcodes) Scasw(ops ...Operand)           { o.a.op("SCASW", ops...) }
-func (o Opcodes) SCASW(ops ...Operand)           { o.a.op("SCASW", ops...) }
-func (o Opcodes) Setcc(ops ...Operand)           { o.a.op("SETCC", ops...) }
-func (o Opcodes) SETCC(ops ...Operand)           { o.a.op("SETCC", ops...) }
-func (o Opcodes) Setcs(ops ...Operand)           { o.a.op("SETCS", ops...) }
-func (o Opcodes) SETCS(ops ...Operand)           { o.a.op("SETCS", ops...) }
-func (o Opcodes) Seteq(ops ...Operand)           { o.a.op("SETEQ", ops...) }
-func (o Opcodes) SETEQ(ops ...Operand)           { o.a.op("SETEQ", ops...) }
-func (o Opcodes) Setge(ops ...Operand)           { o.a.op("SETGE", ops...) }
-func (o Opcodes) SETGE(ops ...Operand)           { o.a.op("SETGE", ops...) }
-func (o Opcodes) Setgt(ops ...Operand)           { o.a.op("SETGT", ops...) }
-func (o Opcodes) SETGT(ops ...Operand)           { o.a.op("SETGT", ops...) }
-func (o Opcodes) Sethi(ops ...Operand)           { o.a.op("SETHI", ops...) }
-func (o Opcodes) SETHI(ops ...Operand)           { o.a.op("SETHI", ops...) }
-func (o Opcodes) Setle(ops ...Operand)           { o.a.op("SETLE", ops...) }
-func (o Opcodes) SETLE(ops ...Operand)           { o.a.op("SETLE", ops...) }
-func (o Opcodes) Setls(ops ...Operand)           { o.a.op("SETLS", ops...) }
-func (o Opcodes) SETLS(ops ...Operand)           { o.a.op("SETLS", ops...) }
-func (o Opcodes) Setlt(ops ...Operand)           { o.a.op("SETLT", ops...) }
-func (o Opcodes) SETLT(ops ...Operand)           { o.a.op("SETLT", ops...) }
-func (o Opcodes) Setmi(ops ...Operand)           { o.a.op("SETMI", ops...) }
-func (o Opcodes) SETMI(ops ...Operand)           { o.a.op("SETMI", ops...) }
-func (o Opcodes) Setne(ops ...Operand)           { o.a.op("SETNE", ops...) }
-func (o Opcodes) SETNE(ops ...Operand)           { o.a.op("SETNE", ops...) }
-func (o Opcodes) Setoc(ops ...Operand)           { o.a.op("SETOC", ops...) }
-func (o Opcodes) SETOC(ops ...Operand)           { o.a.op("SETOC", ops...) }
-func (o Opcodes) Setos(ops ...Operand)           { o.a.op("SETOS", ops...) }
-func (o Opcodes) SETOS(ops ...Operand)           { o.a.op("SETOS", ops...) }
-func (o Opcodes) Setpc(ops ...Operand)           { o.a.op("SETPC", ops...) }
-func (o Opcodes) SETPC(ops ...Operand)           { o.a.op("SETPC", ops...) }
-func (o Opcodes) Setpl(ops ...Operand)           { o.a.op("SETPL", ops...) }
-func (o Opcodes) SETPL(ops ...Operand)           { o.a.op("SETPL", ops...) }
-func (o Opcodes) Setps(ops ...Operand)           { o.a.op("SETPS", ops...) }
-func (o Opcodes) SETPS(ops ...Operand)           { o.a.op("SETPS", ops...) }
-func (o Opcodes) Cdq(ops ...Operand)             { o.a.op("CDQ", ops...) }
-func (o Opcodes) CDQ(ops ...Operand)             { o.a.op("CDQ", ops...) }
-func (o Opcodes) Cwd(ops ...Operand)             { o.a.op("CWD", ops...) }
-func (o Opcodes) CWD(ops ...Operand)             { o.a.op("CWD", ops...) }
-func (o Opcodes) Shlb(ops ...Operand)            { o.a.op("SHLB", ops...) }
-func (o Opcodes) SHLB(ops ...Operand)            { o.a.op("SHLB", ops...) }
-func (o Opcodes) Shll(ops ...Operand)            { o.a.op("SHLL", ops...) }
-func (o Opcodes) SHLL(ops ...Operand)            { o.a.op("SHLL", ops...) }
-func (o Opcodes) Shlw(ops ...Operand)            { o.a.op("SHLW", ops...) }
-func (o Opcodes) SHLW(ops ...Operand)            { o.a.op("SHLW", ops...) }
-func (o Opcodes) Shrb(ops ...Operand)            { o.a.op("SHRB", ops...) }
-func (o Opcodes) SHRB(ops ...Operand)            { o.a.op("SHRB", ops...) }
-func (o Opcodes) Shrl(ops ...Operand)            { o.a.op("SHRL", ops...) }
-func (o Opcodes) SHRL(ops ...Operand)            { o.a.op("SHRL", ops...) }
-func (o Opcodes) Shrw(ops ...Operand)            { o.a.op("SHRW", ops...) }
-func (o Opcodes) SHRW(ops ...Operand)            { o.a.op("SHRW", ops...) }
-func (o Opcodes) Stc(ops ...Operand)             { o.a.op("STC", ops...) }
-func (o Opcodes) STC(ops ...Operand)             { o.a.op("STC", ops...) }
-func (o Opcodes) Std(ops ...Operand)             { o.a.op("STD", ops...) }
-func (o Opcodes) STD(ops ...Operand)             { o.a.op("STD", ops...) }
-func (o Opcodes) Sti(ops ...Operand)             { o.a.op("STI", ops...) }
-func (o Opcodes) STI(ops ...Operand)             { o.a.op("STI", ops...) }
-func (o Opcodes) Stosb(ops ...Operand)           { o.a.op("STOSB", ops...) }
-func (o Opcodes) STOSB(ops ...Operand)           { o.a.op("STOSB", ops...) }
-func (o Opcodes) Stosl(ops ...Operand)           { o.a.op("STOSL", ops...) }
-func (o Opcodes) STOSL(ops ...Operand)           { o.a.op("STOSL", ops...) }
-func (o Opcodes) Stosw(ops ...Operand)           { o.a.op("STOSW", ops...) }
-func (o Opcodes) STOSW(ops ...Operand)           { o.a.op("STOSW", ops...) }
-func (o Opcodes) Subb(ops ...Operand)            { o.a.op("SUBB", ops...) }
-func (o Opcodes) SUBB(ops ...Operand)            { o.a.op("SUBB", ops...) }
-func (o Opcodes) Subl(ops ...Operand)            { o.a.op("SUBL", ops...) }
-func (o Opcodes) SUBL(ops ...Operand)            { o.a.op("SUBL", ops...) }
-func (o Opcodes) Subw(ops ...Operand)            { o.a.op("SUBW", ops...) }
-func (o Opcodes) SUBW(ops ...Operand)            { o.a.op("SUBW", ops...) }
-func (o Opcodes) Syscall(ops ...Operand)         { o.a.op("SYSCALL", ops...) }
-func (o Opcodes) SYSCALL(ops ...Operand)         { o.a.op("SYSCALL", ops...) }
-func (o Opcodes) Testb(ops ...Operand)           { o.a.op("TESTB", ops...) }
-func (o Opcodes) TESTB(ops ...Operand)           { o.a.op("TESTB", ops...) }
-func (o Opcodes) Testl(ops ...Operand)           { o.a.op("TESTL", ops...) }
-func (o Opcodes) TESTL(ops ...Operand)           { o.a.op("TESTL", ops...) }
-func (o Opcodes) Testw(ops ...Operand)           { o.a.op("TESTW", ops...) }
-func (o Opcodes) TESTW(ops ...Operand)           { o.a.op("TESTW", ops...) }
-func (o Opcodes) Verr(ops ...Operand)            { o.a.op("VERR", ops...) }
-func (o Opcodes) VERR(ops ...Operand)            { o.a.op("VERR", ops...) }
-func (o Opcodes) Verw(ops ...Operand)            { o.a.op("VERW", ops...) }
-func (o Opcodes) VERW(ops ...Operand)            { o.a.op("VERW", ops...) }
-func (o Opcodes) Wait(ops ...Operand)            { o.a.op("WAIT", ops...) }
-func (o Opcodes) WAIT(ops ...Operand)            { o.a.op("WAIT", ops...) }
-func (o Opcodes) Word(ops ...Operand)            { o.a.op("WORD", ops...) }
-func (o Opcodes) WORD(ops ...Operand)            { o.a.op("WORD", ops...) }
-func (o Opcodes) Xchgb(ops ...Operand)           { o.a.op("XCHGB", ops...) }
-func (o Opcodes) XCHGB(ops ...Operand)           { o.a.op("XCHGB", ops...) }
-func (o Opcodes) Xchgl(ops ...Operand)           { o.a.op("XCHGL", ops...) }
-func (o Opcodes) XCHGL(ops ...Operand)           { o.a.op("XCHGL", ops...) }
-func (o Opcodes) Xchgw(ops ...Operand)           { o.a.op("XCHGW", ops...) }
-func (o Opcodes) XCHGW(ops ...Operand)           { o.a.op("XCHGW", ops...) }
-func (o Opcodes) Xlat(ops ...Operand)            { o.a.op("XLAT", ops...) }
-func (o Opcodes) XLAT(ops ...Operand)            { o.a.op("XLAT", ops...) }
-func (o Opcodes) Xorb(ops ...Operand)            { o.a.op("XORB", ops...) }
-func (o Opcodes) XORB(ops ...Operand)            { o.a.op("XORB", ops...) }
-func (o Opcodes) Xorl(ops ...Operand)            { o.a.op("XORL", ops...) }
-func (o Opcodes) XORL(ops ...Operand)            { o.a.op("XORL", ops...) }
-func (o Opcodes) Xorw(ops ...Operand)            { o.a.op("XORW", ops...) }
-func (o Opcodes) XORW(ops ...Operand)            { o.a.op("XORW", ops...) }
-func (o Opcodes) Fmovb(ops ...Operand)           { o.a.op("FMOVB", ops...) }
-func (o Opcodes) FMOVB(ops ...Operand)           { o.a.op("FMOVB", ops...) }
-func (o Opcodes) Fmovbp(ops ...Operand)          { o.a.op("FMOVBP", ops...) }
-func (o Opcodes) FMOVBP(ops ...Operand)          { o.a.op("FMOVBP", ops...) }
-func (o Opcodes) Fmovd(ops ...Operand)           { o.a.op("FMOVD", ops...) }
-func (o Opcodes) FMOVD(ops ...Operand)           { o.a.op("FMOVD", ops...) }
-func (o Opcodes) Fmovdp(ops ...Operand)          { o.a.op("FMOVDP", ops...) }
-func (o Opcodes) FMOVDP(ops ...Operand)          { o.a.op("FMOVDP", ops...) }
-func (o Opcodes) Fmovf(ops ...Operand)           { o.a.op("FMOVF", ops...) }
-func (o Opcodes) FMOVF(ops ...Operand)           { o.a.op("FMOVF", ops...) }
-func (o Opcodes) Fmovfp(ops ...Operand)          { o.a.op("FMOVFP", ops...) }
-func (o Opcodes) FMOVFP(ops ...Operand)          { o.a.op("FMOVFP", ops...) }
-func (o Opcodes) Fmovl(ops ...Operand)           { o.a.op("FMOVL", ops...) }
-func (o Opcodes) FMOVL(ops ...Operand)           { o.a.op("FMOVL", ops...) }
-func (o Opcodes) Fmovlp(ops ...Operand)          { o.a.op("FMOVLP", ops...) }
-func (o Opcodes) FMOVLP(ops ...Operand)          { o.a.op("FMOVLP", ops...) }
-func (o Opcodes) Fmovv(ops ...Operand)           { o.a.op("FMOVV", ops...) }
-func (o Opcodes) FMOVV(ops ...Operand)           { o.a.op("FMOVV", ops...) }
-func (o Opcodes) Fmovvp(ops ...Operand)          { o.a.op("FMOVVP", ops...) }
-func (o Opcodes) FMOVVP(ops ...Operand)          { o.a.op("FMOVVP", ops...) }
-func (o Opcodes) Fmovw(ops ...Operand)           { o.a.op("FMOVW", ops...) }
-func (o Opcodes) FMOVW(ops ...Operand)           { o.a.op("FMOVW", ops...) }
-func (o Opcodes) Fmovwp(ops ...Operand)          { o.a.op("FMOVWP", ops...) }
-func (o Opcodes) FMOVWP(ops ...Operand)          { o.a.op("FMOVWP", ops...) }
-func (o Opcodes) Fmovx(ops ...Operand)           { o.a.op("FMOVX", ops...) }
-func (o Opcodes) FMOVX(ops ...Operand)           { o.a.op("FMOVX", ops...) }
-func (o Opcodes) Fmovxp(ops ...Operand)          { o.a.op("FMOVXP", ops...) }
-func (o Opcodes) FMOVXP(ops ...Operand)          { o.a.op("FMOVXP", ops...) }
-func (o Opcodes) Fcomd(ops ...Operand)           { o.a.op("FCOMD", ops...) }
-func (o Opcodes) FCOMD(ops ...Operand)           { o.a.op("FCOMD", ops...) }
-func (o Opcodes) Fcomdp(ops ...Operand)          { o.a.op("FCOMDP", ops...) }
-func (o Opcodes) FCOMDP(ops ...Operand)          { o.a.op("FCOMDP", ops...) }
-func (o Opcodes) Fcomdpp(ops ...Operand)         { o.a.op("FCOMDPP", ops...) }
-func (o Opcodes) FCOMDPP(ops ...Operand)         { o.a.op("FCOMDPP", ops...) }
-func (o Opcodes) Fcomf(ops ...Operand)           { o.a.op("FCOMF", ops...) }
-func (o Opcodes) FCOMF(ops ...Operand)           { o.a.op("FCOMF", ops...) }
-func (o Opcodes) Fcomfp(ops ...Operand)          { o.a.op("FCOMFP", ops...) }
-func (o Opcodes) FCOMFP(ops ...Operand)          { o.a.op("FCOMFP", ops...) }
-func (o Opcodes) Fcoml(ops ...Operand)           { o.a.op("FCOML", ops...) }
-func (o Opcodes) FCOML(ops ...Operand)           { o.a.op("FCOML", ops...) }
-func (o Opcodes) Fcomlp(ops ...Operand)          { o.a.op("FCOMLP", ops...) }
-func (o Opcodes) FCOMLP(ops ...Operand)          { o.a.op("FCOMLP", ops...) }
-func (o Opcodes) Fcomw(ops ...Operand)           { o.a.op("FCOMW", ops...) }
-func (o Opcodes) FCOMW(ops ...Operand)           { o.a.op("FCOMW", ops...) }
-func (o Opcodes) Fcomwp(ops ...Operand)          { o.a.op("FCOMWP", ops...) }
-func (o Opcodes) FCOMWP(ops ...Operand)          { o.a.op("FCOMWP", ops...) }
-func (o Opcodes) Fucom(ops ...Operand)           { o.a.op("FUCOM", ops...) }
-func (o Opcodes) FUCOM(ops ...Operand)           { o.a.op("FUCOM", ops...) }
-func (o Opcodes) Fucomp(ops ...Operand)          { o.a.op("FUCOMP", ops...) }
-func (o Opcodes) FUCOMP(ops ...Operand)          { o.a.op("FUCOMP", ops...) }
-func (o Opcodes) Fucompp(ops ...Operand)         { o.a.op("FUCOMPP", ops...) }
-func (o Opcodes) FUCOMPP(ops ...Operand)         { o.a.op("FUCOMPP", ops...) }
-func (o Opcodes) Fadddp(ops ...Operand)          { o.a.op("FADDDP", ops...) }
-func (o Opcodes) FADDDP(ops ...Operand)          { o.a.op("FADDDP", ops...) }
-func (o Opcodes) Faddw(ops ...Operand)           { o.a.op("FADDW", ops...) }
-func (o Opcodes) FADDW(ops ...Operand)           { o.a.op("FADDW", ops...) }
-func (o Opcodes) Faddl(ops ...Operand)           { o.a.op("FADDL", ops...) }
-func (o Opcodes) FADDL(ops ...Operand)           { o.a.op("FADDL", ops...) }
-func (o Opcodes) Faddf(ops ...Operand)           { o.a.op("FADDF", ops...) }
-func (o Opcodes) FADDF(ops ...Operand)           { o.a.op("FADDF", ops...) }
-func (o Opcodes) Faddd(ops ...Operand)           { o.a.op("FADDD", ops...) }
-func (o Opcodes) FADDD(ops ...Operand)           { o.a.op("FADDD", ops...) }
-func (o Opcodes) Fmuldp(ops ...Operand)          { o.a.op("FMULDP", ops...) }
-func (o Opcodes) FMULDP(ops ...Operand)          { o.a.op("FMULDP", ops...) }
-func (o Opcodes) Fmulw(ops ...Operand)           { o.a.op("FMULW", ops...) }
-func (o Opcodes) FMULW(ops ...Operand)           { o.a.op("FMULW", ops...) }
-func (o Opcodes) Fmull(ops ...Operand)           { o.a.op("FMULL", ops...) }
-func (o Opcodes) FMULL(ops ...Operand)           { o.a.op("FMULL", ops...) }
-func (o Opcodes) Fmulf(ops ...Operand)           { o.a.op("FMULF", ops...) }
-func (o Opcodes) FMULF(ops ...Operand)           { o.a.op("FMULF", ops...) }
-func (o Opcodes) Fmuld(ops ...Operand)           { o.a.op("FMULD", ops...) }
-func (o Opcodes) FMULD(ops ...Operand)           { o.a.op("FMULD", ops...) }
-func (o Opcodes) Fsubdp(ops ...Operand)          { o.a.op("FSUBDP", ops...) }
-func (o Opcodes) FSUBDP(ops ...Operand)          { o.a.op("FSUBDP", ops...) }
-func (o Opcodes) Fsubw(ops ...Operand)           { o.a.op("FSUBW", ops...) }
-func (o Opcodes) FSUBW(ops ...Operand)           { o.a.op("FSUBW", ops...) }
-func (o Opcodes) Fsubl(ops ...Operand)           { o.a.op("FSUBL", ops...) }
-func (o Opcodes) FSUBL(ops ...Operand)           { o.a.op("FSUBL", ops...) }
-func (o Opcodes) Fsubf(ops ...Operand)           { o.a.op("FSUBF", ops...) }
-func (o Opcodes) FSUBF(ops ...Operand)           { o.a.op("FSUBF", ops...) }
-func (o Opcodes) Fsubd(ops ...Operand)           { o.a.op("FSUBD", ops...) }
-func (o Opcodes) FSUBD(ops ...Operand)           { o.a.op("FSUBD", ops...) }
-func (o Opcodes) Fsubrdp(ops ...Operand)         { o.a.op("FSUBRDP", ops...) }
-func (o Opcodes) FSUBRDP(ops ...Operand)         { o.a.op("FSUBRDP", ops...) }
-func (o Opcodes) Fsubrw(ops ...Operand)          { o.a.op("FSUBRW", ops...) }
-func (o Opcodes) FSUBRW(ops ...Operand)          { o.a.op("FSUBRW", ops...) }
-func (o Opcodes) Fsubrl(ops ...Operand)          { o.a.op("FSUBRL", ops...) }
-func (o Opcodes) FSUBRL(ops ...Operand)          { o.a.op("FSUBRL", ops...) }
-func (o Opcodes) Fsubrf(ops ...Operand)          { o.a.op("FSUBRF", ops...) }
-func (o Opcodes) FSUBRF(ops ...Operand)          { o.a.op("FSUBRF", ops...) }
-func (o Opcodes) Fsubrd(ops ...Operand)          { o.a.op("FSUBRD", ops...) }
-func (o Opcodes) FSUBRD(ops ...Operand)          { o.a.op("FSUBRD", ops...) }
-func (o Opcodes) Fdivdp(ops ...Operand)          { o.a.op("FDIVDP", ops...) }
-func (o Opcodes) FDIVDP(ops ...Operand)          { o.a.op("FDIVDP", ops...) }
-func (o Opcodes) Fdivw(ops ...Operand)           { o.a.op("FDIVW", ops...) }
-func (o Opcodes) FDIVW(ops ...Operand)           { o.a.op("FDIVW", ops...) }
-func (o Opcodes) Fdivl(ops ...Operand)           { o.a.op("FDIVL", ops...) }
-func (o Opcodes) FDIVL(ops ...Operand)           { o.a.op("FDIVL", ops...) }
-func (o Opcodes) Fdivf(ops ...Operand)           { o.a.op("FDIVF", ops...) }
-func (o Opcodes) FDIVF(ops ...Operand)           { o.a.op("FDIVF", ops...) }
-func (o Opcodes) Fdivd(ops ...Operand)           { o.a.op("FDIVD", ops...) }
-func (o Opcodes) FDIVD(ops ...Operand)           { o.a.op("FDIVD", ops...) }
-func (o Opcodes) Fdivrdp(ops ...Operand)         { o.a.op("FDIVRDP", ops...) }
-func (o Opcodes) FDIVRDP(ops ...Operand)         { o.a.op("FDIVRDP", ops...) }
-func (o Opcodes) Fdivrw(ops ...Operand)          { o.a.op("FDIVRW", ops...) }
-func (o Opcodes) FDIVRW(ops ...Operand)          { o.a.op("FDIVRW", ops...) }
-func (o Opcodes) Fdivrl(ops ...Operand)          { o.a.op("FDIVRL", ops...) }
-func (o Opcodes) FDIVRL(ops ...Operand)          { o.a.op("FDIVRL", ops...) }
-func (o Opcodes) Fdivrf(ops ...Operand)          { o.a.op("FDIVRF", ops...) }
-func (o Opcodes) FDIVRF(ops ...Operand)          { o.a.op("FDIVRF", ops...) }
-func (o Opcodes) Fdivrd(ops ...Operand)          { o.a.op("FDIVRD", ops...) }
-func (o Opcodes) FDIVRD(ops ...Operand)          { o.a.op("FDIVRD", ops...) }
-func (o Opcodes) Fxchd(ops ...Operand)           { o.a.op("FXCHD", ops...) }
-func (o Opcodes) FXCHD(ops ...Operand)           { o.a.op("FXCHD", ops...) }
-func (o Opcodes) Ffree(ops ...Operand)           { o.a.op("FFREE", ops...) }
-func (o Opcodes) FFREE(ops ...Operand)           { o.a.op("FFREE", ops...) }
-func (o Opcodes) Fldcw(ops ...Operand)           { o.a.op("FLDCW", ops...) }
-func (o Opcodes) FLDCW(ops ...Operand)           { o.a.op("FLDCW", ops...) }
-func (o Opcodes) Fldenv(ops ...Operand)          { o.a.op("FLDENV", ops...) }
-func (o Opcodes) FLDENV(ops ...Operand)          { o.a.op("FLDENV", ops...) }
-func (o Opcodes) Frstor(ops ...Operand)          { o.a.op("FRSTOR", ops...) }
-func (o Opcodes) FRSTOR(ops ...Operand)          { o.a.op("FRSTOR", ops...) }
-func (o Opcodes) Fsave(ops ...Operand)           { o.a.op("FSAVE", ops...) }
-func (o Opcodes) FSAVE(ops ...Operand)           { o.a.op("FSAVE", ops...) }
-func (o Opcodes) Fstcw(ops ...Operand)           { o.a.op("FSTCW", ops...) }
-func (o Opcodes) FSTCW(ops ...Operand)           { o.a.op("FSTCW", ops...) }
-func (o Opcodes) Fstenv(ops ...Operand)          { o.a.op("FSTENV", ops...) }
-func (o Opcodes) FSTENV(ops ...Operand)          { o.a.op("FSTENV", ops...) }
-func (o Opcodes) Fstsw(ops ...Operand)           { o.a.op("FSTSW", ops...) }
-func (o Opcodes) FSTSW(ops ...Operand)           { o.a.op("FSTSW", ops...) }
-func (o Opcodes) F2xm1(ops ...Operand)           { o.a.op("F2XM1", ops...) }
-func (o Opcodes) F2XM1(ops ...Operand)           { o.a.op("F2XM1", ops...) }
-func (o Opcodes) Fabs(ops ...Operand)            { o.a.op("FABS", ops...) }
-func (o Opcodes) FABS(ops ...Operand)            { o.a.op("FABS", ops...) }
-func (o Opcodes) Fchs(ops ...Operand)            { o.a.op("FCHS", ops...) }
-func (o Opcodes) FCHS(ops ...Operand)            { o.a.op("FCHS", ops...) }
-func (o Opcodes) Fclex(ops ...Operand)           { o.a.op("FCLEX", ops...) }
-func (o Opcodes) FCLEX(ops ...Operand)           { o.a.op("FCLEX", ops...) }
-func (o Opcodes) Fcos(ops ...Operand)            { o.a.op("FCOS", ops...) }
-func (o Opcodes) FCOS(ops ...Operand)            { o.a.op("FCOS", ops...) }
-func (o Opcodes) Fdecstp(ops ...Operand)         { o.a.op("FDECSTP", ops...) }
-func (o Opcodes) FDECSTP(ops ...Operand)         { o.a.op("FDECSTP", ops...) }
-func (o Opcodes) Fincstp(ops ...Operand)         { o.a.op("FINCSTP", ops...) }
-func (o Opcodes) FINCSTP(ops ...Operand)         { o.a.op("FINCSTP", ops...) }
-func (o Opcodes) Finit(ops ...Operand)           { o.a.op("FINIT", ops...) }
-func (o Opcodes) FINIT(ops ...Operand)           { o.a.op("FINIT", ops...) }
-func (o Opcodes) Fld1(ops ...Operand)            { o.a.op("FLD1", ops...) }
-func (o Opcodes) FLD1(ops ...Operand)            { o.a.op("FLD1", ops...) }
-func (o Opcodes) Fldl2e(ops ...Operand)          { o.a.op("FLDL2E", ops...) }
-func (o Opcodes) FLDL2E(ops ...Operand)          { o.a.op("FLDL2E", ops...) }
-func (o Opcodes) Fldl2t(ops ...Operand)          { o.a.op("FLDL2T", ops...) }
-func (o Opcodes) FLDL2T(ops ...Operand)          { o.a.op("FLDL2T", ops...) }
-func (o Opcodes) Fldlg2(ops ...Operand)          { o.a.op("FLDLG2", ops...) }
-func (o Opcodes) FLDLG2(ops ...Operand)          { o.a.op("FLDLG2", ops...) }
-func (o Opcodes) Fldln2(ops ...Operand)          { o.a.op("FLDLN2", ops...) }
-func (o Opcodes) FLDLN2(ops ...Operand)          { o.a.op("FLDLN2", ops...) }
-func (o Opcodes) Fldpi(ops ...Operand)           { o.a.op("FLDPI", ops...) }
-func (o Opcodes) FLDPI(ops ...Operand)           { o.a.op("FLDPI", ops...) }
-func (o Opcodes) Fldz(ops ...Operand)            { o.a.op("FLDZ", ops...) }
-func (o Opcodes) FLDZ(ops ...Operand)            { o.a.op("FLDZ", ops...) }
-func (o Opcodes) Fnop(ops ...Operand)            { o.a.op("FNOP", ops...) }
-func (o Opcodes) FNOP(ops ...Operand)            { o.a.op("FNOP", ops...) }
-func (o Opcodes) Fpatan(ops ...Operand)          { o.a.op("FPATAN", ops...) }
-func (o Opcodes) FPATAN(ops ...Operand)          { o.a.op("FPATAN", ops...) }
-func (o Opcodes) Fprem(ops ...Operand)           { o.a.op("FPREM", ops...) }
-func (o Opcodes) FPREM(ops ...Operand)           { o.a.op("FPREM", ops...) }
-func (o Opcodes) Fprem1(ops ...Operand)          { o.a.op("FPREM1", ops...) }
-func (o Opcodes) FPREM1(ops ...Operand)          { o.a.op("FPREM1", ops...) }
-func (o Opcodes) Fptan(ops ...Operand)           { o.a.op("FPTAN", ops...) }
-func (o Opcodes) FPTAN(ops ...Operand)           { o.a.op("FPTAN", ops...) }
-func (o Opcodes) Frndint(ops ...Operand)         { o.a.op("FRNDINT", ops...) }
-func (o Opcodes) FRNDINT(ops ...Operand)         { o.a.op("FRNDINT", ops...) }
-func (o Opcodes) Fscale(ops ...Operand)          { o.a.op("FSCALE", ops...) }
-func (o Opcodes) FSCALE(ops ...Operand)          { o.a.op("FSCALE", ops...) }
-func (o Opcodes) Fsin(ops ...Operand)            { o.a.op("FSIN", ops...) }
-func (o Opcodes) FSIN(ops ...Operand)            { o.a.op("FSIN", ops...) }
-func (o Opcodes) Fsincos(ops ...Operand)         { o.a.op("FSINCOS", ops...) }
-func (o Opcodes) FSINCOS(ops ...Operand)         { o.a.op("FSINCOS", ops...) }
-func (o Opcodes) Fsqrt(ops ...Operand)           { o.a.op("FSQRT", ops...) }
-func (o Opcodes) FSQRT(ops ...Operand)           { o.a.op("FSQRT", ops...) }
-func (o Opcodes) Ftst(ops ...Operand)            { o.a.op("FTST", ops...) }
-func (o Opcodes) FTST(ops ...Operand)            { o.a.op("FTST", ops...) }
-func (o Opcodes) Fxam(ops ...Operand)            { o.a.op("FXAM", ops...) }
-func (o Opcodes) FXAM(ops ...Operand)            { o.a.op("FXAM", ops...) }
-func (o Opcodes) Fxtract(ops ...Operand)         { o.a.op("FXTRACT", ops...) }
-func (o Opcodes) FXTRACT(ops ...Operand)         { o.a.op("FXTRACT", ops...) }
-func (o Opcodes) Fyl2x(ops ...Operand)           { o.a.op("FYL2X", ops...) }
-func (o Opcodes) FYL2X(ops ...Operand)           { o.a.op("FYL2X", ops...) }
-func (o Opcodes) Fyl2xp1(ops ...Operand)         { o.a.op("FYL2XP1", ops...) }
-func (o Opcodes) FYL2XP1(ops ...Operand)         { o.a.op("FYL2XP1", ops...) }
-func (o Opcodes) Cmpxchgb(ops ...Operand)        { o.a.op("CMPXCHGB", ops...) }
-func (o Opcodes) CMPXCHGB(ops ...Operand)        { o.a.op("CMPXCHGB", ops...) }
-func (o Opcodes) Cmpxchgl(ops ...Operand)        { o.a.op("CMPXCHGL", ops...) }
-func (o Opcodes) CMPXCHGL(ops ...Operand)        { o.a.op("CMPXCHGL", ops...) }
-func (o Opcodes) Cmpxchgw(ops ...Operand)        { o.a.op("CMPXCHGW", ops...) }
-func (o Opcodes) CMPXCHGW(ops ...Operand)        { o.a.op("CMPXCHGW", ops...) }
-func (o Opcodes) Cmpxchg8b(ops ...Operand)       { o.a.op("CMPXCHG8B", ops...) }
-func (o Opcodes) CMPXCHG8B(ops ...Operand)       { o.a.op("CMPXCHG8B", ops...) }
-func (o Opcodes) Cpuid(ops ...Operand)           { o.a.op("CPUID", ops...) }
-func (o Opcodes) CPUID(ops ...Operand)           { o.a.op("CPUID", ops...) }
-func (o Opcodes) Invd(ops ...Operand)            { o.a.op("INVD", ops...) }
-func (o Opcodes) INVD(ops ...Operand)            { o.a.op("INVD", ops...) }
-func (o Opcodes) Invlpg(ops ...Operand)          { o.a.op("INVLPG", ops...) }
-func (o Opcodes) INVLPG(ops ...Operand)          { o.a.op("INVLPG", ops...) }
-func (o Opcodes) Lfence(ops ...Operand)          { o.a.op("LFENCE", ops...) }
-func (o Opcodes) LFENCE(ops ...Operand)          { o.a.op("LFENCE", ops...) }
-func (o Opcodes) Mfence(ops ...Operand)          { o.a.op("MFENCE", ops...) }
-func (o Opcodes) MFENCE(ops ...Operand)          { o.a.op("MFENCE", ops...) }
-func (o Opcodes) Movntil(ops ...Operand)         { o.a.op("MOVNTIL", ops...) }
-func (o Opcodes) MOVNTIL(ops ...Operand)         { o.a.op("MOVNTIL", ops...) }
-func (o Opcodes) Rdmsr(ops ...Operand)           { o.a.op("RDMSR", ops...) }
-func (o Opcodes) RDMSR(ops ...Operand)           { o.a.op("RDMSR", ops...) }
-func (o Opcodes) Rdpmc(ops ...Operand)           { o.a.op("RDPMC", ops...) }
-func (o Opcodes) RDPMC(ops ...Operand)           { o.a.op("RDPMC", ops...) }
-func (o Opcodes) Rdtsc(ops ...Operand)           { o.a.op("RDTSC", ops...) }
-func (o Opcodes) RDTSC(ops ...Operand)           { o.a.op("RDTSC", ops...) }
-func (o Opcodes) Rsm(ops ...Operand)             { o.a.op("RSM", ops...) }
-func (o Opcodes) RSM(ops ...Operand)             { o.a.op("RSM", ops...) }
-func (o Opcodes) Sfence(ops ...Operand)          { o.a.op("SFENCE", ops...) }
-func (o Opcodes) SFENCE(ops ...Operand)          { o.a.op("SFENCE", ops...) }
-func (o Opcodes) Sysret(ops ...Operand)          { o.a.op("SYSRET", ops...) }
-func (o Opcodes) SYSRET(ops ...Operand)          { o.a.op("SYSRET", ops...) }
-func (o Opcodes) Wbinvd(ops ...Operand)          { o.a.op("WBINVD", ops...) }
-func (o Opcodes) WBINVD(ops ...Operand)          { o.a.op("WBINVD", ops...) }
-func (o Opcodes) Wrmsr(ops ...Operand)           { o.a.op("WRMSR", ops...) }
-func (o Opcodes) WRMSR(ops ...Operand)           { o.a.op("WRMSR", ops...) }
-func (o Opcodes) Xaddb(ops ...Operand)           { o.a.op("XADDB", ops...) }
-func (o Opcodes) XADDB(ops ...Operand)           { o.a.op("XADDB", ops...) }
-func (o Opcodes) Xaddl(ops ...Operand)           { o.a.op("XADDL", ops...) }
-func (o Opcodes) XADDL(ops ...Operand)           { o.a.op("XADDL", ops...) }
-func (o Opcodes) Xaddw(ops ...Operand)           { o.a.op("XADDW", ops...) }
-func (o Opcodes) XADDW(ops ...Operand)           { o.a.op("XADDW", ops...) }
-func (o Opcodes) Cmovlcc(ops ...Operand)         { o.a.op("CMOVLCC", ops...) }
-func (o Opcodes) CMOVLCC(ops ...Operand)         { o.a.op("CMOVLCC", ops...) }
-func (o Opcodes) Cmovlcs(ops ...Operand)         { o.a.op("CMOVLCS", ops...) }
-func (o Opcodes) CMOVLCS(ops ...Operand)         { o.a.op("CMOVLCS", ops...) }
-func (o Opcodes) Cmovleq(ops ...Operand)         { o.a.op("CMOVLEQ", ops...) }
-func (o Opcodes) CMOVLEQ(ops ...Operand)         { o.a.op("CMOVLEQ", ops...) }
-func (o Opcodes) Cmovlge(ops ...Operand)         { o.a.op("CMOVLGE", ops...) }
-func (o Opcodes) CMOVLGE(ops ...Operand)         { o.a.op("CMOVLGE", ops...) }
-func (o Opcodes) Cmovlgt(ops ...Operand)         { o.a.op("CMOVLGT", ops...) }
-func (o Opcodes) CMOVLGT(ops ...Operand)         { o.a.op("CMOVLGT", ops...) }
-func (o Opcodes) Cmovlhi(ops ...Operand)         { o.a.op("CMOVLHI", ops...) }
-func (o Opcodes) CMOVLHI(ops ...Operand)         { o.a.op("CMOVLHI", ops...) }
-func (o Opcodes) Cmovlle(ops ...Operand)         { o.a.op("CMOVLLE", ops...) }
-func (o Opcodes) CMOVLLE(ops ...Operand)         { o.a.op("CMOVLLE", ops...) }
-func (o Opcodes) Cmovlls(ops ...Operand)         { o.a.op("CMOVLLS", ops...) }
-func (o Opcodes) CMOVLLS(ops ...Operand)         { o.a.op("CMOVLLS", ops...) }
-func (o Opcodes) Cmovllt(ops ...Operand)         { o.a.op("CMOVLLT", ops...) }
-func (o Opcodes) CMOVLLT(ops ...Operand)         { o.a.op("CMOVLLT", ops...) }
-func (o Opcodes) Cmovlmi(ops ...Operand)         { o.a.op("CMOVLMI", ops...) }
-func (o Opcodes) CMOVLMI(ops ...Operand)         { o.a.op("CMOVLMI", ops...) }
-func (o Opcodes) Cmovlne(ops ...Operand)         { o.a.op("CMOVLNE", ops...) }
-func (o Opcodes) CMOVLNE(ops ...Operand)         { o.a.op("CMOVLNE", ops...) }
-func (o Opcodes) Cmovloc(ops ...Operand)         { o.a.op("CMOVLOC", ops...) }
-func (o Opcodes) CMOVLOC(ops ...Operand)         { o.a.op("CMOVLOC", ops...) }
-func (o Opcodes) Cmovlos(ops ...Operand)         { o.a.op("CMOVLOS", ops...) }
-func (o Opcodes) CMOVLOS(ops ...Operand)         { o.a.op("CMOVLOS", ops...) }
-func (o Opcodes) Cmovlpc(ops ...Operand)         { o.a.op("CMOVLPC", ops...) }
-func (o Opcodes) CMOVLPC(ops ...Operand)         { o.a.op("CMOVLPC", ops...) }
-func (o Opcodes) Cmovlpl(ops ...Operand)         { o.a.op("CMOVLPL", ops...) }
-func (o Opcodes) CMOVLPL(ops ...Operand)         { o.a.op("CMOVLPL", ops...) }
-func (o Opcodes) Cmovlps(ops ...Operand)         { o.a.op("CMOVLPS", ops...) }
-func (o Opcodes) CMOVLPS(ops ...Operand)         { o.a.op("CMOVLPS", ops...) }
-func (o Opcodes) Cmovqcc(ops ...Operand)         { o.a.op("CMOVQCC", ops...) }
-func (o Opcodes) CMOVQCC(ops ...Operand)         { o.a.op("CMOVQCC", ops...) }
-func (o Opcodes) Cmovqcs(ops ...Operand)         { o.a.op("CMOVQCS", ops...) }
-func (o Opcodes) CMOVQCS(ops ...Operand)         { o.a.op("CMOVQCS", ops...) }
-func (o Opcodes) Cmovqeq(ops ...Operand)         { o.a.op("CMOVQEQ", ops...) }
-func (o Opcodes) CMOVQEQ(ops ...Operand)         { o.a.op("CMOVQEQ", ops...) }
-func (o Opcodes) Cmovqge(ops ...Operand)         { o.a.op("CMOVQGE", ops...) }
-func (o Opcodes) CMOVQGE(ops ...Operand)         { o.a.op("CMOVQGE", ops...) }
-func (o Opcodes) Cmovqgt(ops ...Operand)         { o.a.op("CMOVQGT", ops...) }
-func (o Opcodes) CMOVQGT(ops ...Operand)         { o.a.op("CMOVQGT", ops...) }
-func (o Opcodes) Cmovqhi(ops ...Operand)         { o.a.op("CMOVQHI", ops...) }
-func (o Opcodes) CMOVQHI(ops ...Operand)         { o.a.op("CMOVQHI", ops...) }
-func (o Opcodes) Cmovqle(ops ...Operand)         { o.a.op("CMOVQLE", ops...) }
-func (o Opcodes) CMOVQLE(ops ...Operand)         { o.a.op("CMOVQLE", ops...) }
-func (o Opcodes) Cmovqls(ops ...Operand)         { o.a.op("CMOVQLS", ops...) }
-func (o Opcodes) CMOVQLS(ops ...Operand)         { o.a.op("CMOVQLS", ops...) }
-func (o Opcodes) Cmovqlt(ops ...Operand)         { o.a.op("CMOVQLT", ops...) }
-func (o Opcodes) CMOVQLT(ops ...Operand)         { o.a.op("CMOVQLT", ops...) }
-func (o Opcodes) Cmovqmi(ops ...Operand)         { o.a.op("CMOVQMI", ops...) }
-func (o Opcodes) CMOVQMI(ops ...Operand)         { o.a.op("CMOVQMI", ops...) }
-func (o Opcodes) Cmovqne(ops ...Operand)         { o.a.op("CMOVQNE", ops...) }
-func (o Opcodes) CMOVQNE(ops ...Operand)         { o.a.op("CMOVQNE", ops...) }
-func (o Opcodes) Cmovqoc(ops ...Operand)         { o.a.op("CMOVQOC", ops...) }
-func (o Opcodes) CMOVQOC(ops ...Operand)         { o.a.op("CMOVQOC", ops...) }
-func (o Opcodes) Cmovqos(ops ...Operand)         { o.a.op("CMOVQOS", ops...) }
-func (o Opcodes) CMOVQOS(ops ...Operand)         { o.a.op("CMOVQOS", ops...) }
-func (o Opcodes) Cmovqpc(ops ...Operand)         { o.a.op("CMOVQPC", ops...) }
-func (o Opcodes) CMOVQPC(ops ...Operand)         { o.a.op("CMOVQPC", ops...) }
-func (o Opcodes) Cmovqpl(ops ...Operand)         { o.a.op("CMOVQPL", ops...) }
-func (o Opcodes) CMOVQPL(ops ...Operand)         { o.a.op("CMOVQPL", ops...) }
-func (o Opcodes) Cmovqps(ops ...Operand)         { o.a.op("CMOVQPS", ops...) }
-func (o Opcodes) CMOVQPS(ops ...Operand)         { o.a.op("CMOVQPS", ops...) }
-func (o Opcodes) Cmovwcc(ops ...Operand)         { o.a.op("CMOVWCC", ops...) }
-func (o Opcodes) CMOVWCC(ops ...Operand)         { o.a.op("CMOVWCC", ops...) }
-func (o Opcodes) Cmovwcs(ops ...Operand)         { o.a.op("CMOVWCS", ops...) }
-func (o Opcodes) CMOVWCS(ops ...Operand)         { o.a.op("CMOVWCS", ops...) }
-func (o Opcodes) Cmovweq(ops ...Operand)         { o.a.op("CMOVWEQ", ops...) }
-func (o Opcodes) CMOVWEQ(ops ...Operand)         { o.a.op("CMOVWEQ", ops...) }
-func (o Opcodes) Cmovwge(ops ...Operand)         { o.a.op("CMOVWGE", ops...) }
-func (o Opcodes) CMOVWGE(ops ...Operand)         { o.a.op("CMOVWGE", ops...) }
-func (o Opcodes) Cmovwgt(ops ...Operand)         { o.a.op("CMOVWGT", ops...) }
-func (o Opcodes) CMOVWGT(ops ...Operand)         { o.a.op("CMOVWGT", ops...) }
-func (o Opcodes) Cmovwhi(ops ...Operand)         { o.a.op("CMOVWHI", ops...) }
-func (o Opcodes) CMOVWHI(ops ...Operand)         { o.a.op("CMOVWHI", ops...) }
-func (o Opcodes) Cmovwle(ops ...Operand)         { o.a.op("CMOVWLE", ops...) }
-func (o Opcodes) CMOVWLE(ops ...Operand)         { o.a.op("CMOVWLE", ops...) }
-func (o Opcodes) Cmovwls(ops ...Operand)         { o.a.op("CMOVWLS", ops...) }
-func (o Opcodes) CMOVWLS(ops ...Operand)         { o.a.op("CMOVWLS", ops...) }
-func (o Opcodes) Cmovwlt(ops ...Operand)         { o.a.op("CMOVWLT", ops...) }
-func (o Opcodes) CMOVWLT(ops ...Operand)         { o.a.op("CMOVWLT", ops...) }
-func (o Opcodes) Cmovwmi(ops ...Operand)         { o.a.op("CMOVWMI", ops...) }
-func (o Opcodes) CMOVWMI(ops ...Operand)         { o.a.op("CMOVWMI", ops...) }
-func (o Opcodes) Cmovwne(ops ...Operand)         { o.a.op("CMOVWNE", ops...) }
-func (o Opcodes) CMOVWNE(ops ...Operand)         { o.a.op("CMOVWNE", ops...) }
-func (o Opcodes) Cmovwoc(ops ...Operand)         { o.a.op("CMOVWOC", ops...) }
-func (o Opcodes) CMOVWOC(ops ...Operand)         { o.a.op("CMOVWOC", ops...) }
-func (o Opcodes) Cmovwos(ops ...Operand)         { o.a.op("CMOVWOS", ops...) }
-func (o Opcodes) CMOVWOS(ops ...Operand)         { o.a.op("CMOVWOS", ops...) }
-func (o Opcodes) Cmovwpc(ops ...Operand)         { o.a.op("CMOVWPC", ops...) }
-func (o Opcodes) CMOVWPC(ops ...Operand)         { o.a.op("CMOVWPC", ops...) }
-func (o Opcodes) Cmovwpl(ops ...Operand)         { o.a.op("CMOVWPL", ops...) }
-func (o Opcodes) CMOVWPL(ops ...Operand)         { o.a.op("CMOVWPL", ops...) }
-func (o Opcodes) Cmovwps(ops ...Operand)         { o.a.op("CMOVWPS", ops...) }
-func (o Opcodes) CMOVWPS(ops ...Operand)         { o.a.op("CMOVWPS", ops...) }
-func (o Opcodes) Adcq(ops ...Operand)            { o.a.op("ADCQ", ops...) }
-func (o Opcodes) ADCQ(ops ...Operand)            { o.a.op("ADCQ", ops...) }
-func (o Opcodes) Addq(ops ...Operand)            { o.a.op("ADDQ", ops...) }
-func (o Opcodes) ADDQ(ops ...Operand)            { o.a.op("ADDQ", ops...) }
-func (o Opcodes) Andq(ops ...Operand)            { o.a.op("ANDQ", ops...) }
-func (o Opcodes) ANDQ(ops ...Operand)            { o.a.op("ANDQ", ops...) }
-func (o Opcodes) Bsfq(ops ...Operand)            { o.a.op("BSFQ", ops...) }
-func (o Opcodes) BSFQ(ops ...Operand)            { o.a.op("BSFQ", ops...) }
-func (o Opcodes) Bsrq(ops ...Operand)            { o.a.op("BSRQ", ops...) }
-func (o Opcodes) BSRQ(ops ...Operand)            { o.a.op("BSRQ", ops...) }
-func (o Opcodes) Btcq(ops ...Operand)            { o.a.op("BTCQ", ops...) }
-func (o Opcodes) BTCQ(ops ...Operand)            { o.a.op("BTCQ", ops...) }
-func (o Opcodes) Btq(ops ...Operand)             { o.a.op("BTQ", ops...) }
-func (o Opcodes) BTQ(ops ...Operand)             { o.a.op("BTQ", ops...) }
-func (o Opcodes) Btrq(ops ...Operand)            { o.a.op("BTRQ", ops...) }
-func (o Opcodes) BTRQ(ops ...Operand)            { o.a.op("BTRQ", ops...) }
-func (o Opcodes) Btsq(ops ...Operand)            { o.a.op("BTSQ", ops...) }
-func (o Opcodes) BTSQ(ops ...Operand)            { o.a.op("BTSQ", ops...) }
-func (o Opcodes) Cmpq(ops ...Operand)            { o.a.op("CMPQ", ops...) }
-func (o Opcodes) CMPQ(ops ...Operand)            { o.a.op("CMPQ", ops...) }
-func (o Opcodes) Cmpsq(ops ...Operand)           { o.a.op("CMPSQ", ops...) }
-func (o Opcodes) CMPSQ(ops ...Operand)           { o.a.op("CMPSQ", ops...) }
-func (o Opcodes) Cmpxchgq(ops ...Operand)        { o.a.op("CMPXCHGQ", ops...) }
-func (o Opcodes) CMPXCHGQ(ops ...Operand)        { o.a.op("CMPXCHGQ", ops...) }
-func (o Opcodes) Cqo(ops ...Operand)             { o.a.op("CQO", ops...) }
-func (o Opcodes) CQO(ops ...Operand)             { o.a.op("CQO", ops...) }
-func (o Opcodes) Divq(ops ...Operand)            { o.a.op("DIVQ", ops...) }
-func (o Opcodes) DIVQ(ops ...Operand)            { o.a.op("DIVQ", ops...) }
-func (o Opcodes) Idivq(ops ...Operand)           { o.a.op("IDIVQ", ops...) }
-func (o Opcodes) IDIVQ(ops ...Operand)           { o.a.op("IDIVQ", ops...) }
-func (o Opcodes) Imulq(ops ...Operand)           { o.a.op("IMULQ", ops...) }
-func (o Opcodes) IMULQ(ops ...Operand)           { o.a.op("IMULQ", ops...) }
-func (o Opcodes) Iretq(ops ...Operand)           { o.a.op("IRETQ", ops...) }
-func (o Opcodes) IRETQ(ops ...Operand)           { o.a.op("IRETQ", ops...) }
-func (o Opcodes) Jcxzq(ops ...Operand)           { o.a.op("JCXZQ", ops...) }
-func (o Opcodes) JCXZQ(ops ...Operand)           { o.a.op("JCXZQ", ops...) }
-func (o Opcodes) Leaq(ops ...Operand)            { o.a.op("LEAQ", ops...) }
-func (o Opcodes) LEAQ(ops ...Operand)            { o.a.op("LEAQ", ops...) }
-func (o Opcodes) Leaveq(ops ...Operand)          { o.a.op("LEAVEQ", ops...) }
-func (o Opcodes) LEAVEQ(ops ...Operand)          { o.a.op("LEAVEQ", ops...) }
-func (o Opcodes) Lodsq(ops ...Operand)           { o.a.op("LODSQ", ops...) }
-func (o Opcodes) LODSQ(ops ...Operand)           { o.a.op("LODSQ", ops...) }
-func (o Opcodes) Movq(ops ...Operand)            { o.a.op("MOVQ", ops...) }
-func (o Opcodes) MOVQ(ops ...Operand)            { o.a.op("MOVQ", ops...) }
-func (o Opcodes) Movlqsx(ops ...Operand)         { o.a.op("MOVLQSX", ops...) }
-func (o Opcodes) MOVLQSX(ops ...Operand)         { o.a.op("MOVLQSX", ops...) }
-func (o Opcodes) Movlqzx(ops ...Operand)         { o.a.op("MOVLQZX", ops...) }
-func (o Opcodes) MOVLQZX(ops ...Operand)         { o.a.op("MOVLQZX", ops...) }
-func (o Opcodes) Movntiq(ops ...Operand)         { o.a.op("MOVNTIQ", ops...) }
-func (o Opcodes) MOVNTIQ(ops ...Operand)         { o.a.op("MOVNTIQ", ops...) }
-func (o Opcodes) Movsq(ops ...Operand)           { o.a.op("MOVSQ", ops...) }
-func (o Opcodes) MOVSQ(ops ...Operand)           { o.a.op("MOVSQ", ops...) }
-func (o Opcodes) Mulq(ops ...Operand)            { o.a.op("MULQ", ops...) }
-func (o Opcodes) MULQ(ops ...Operand)            { o.a.op("MULQ", ops...) }
-func (o Opcodes) Negq(ops ...Operand)            { o.a.op("NEGQ", ops...) }
-func (o Opcodes) NEGQ(ops ...Operand)            { o.a.op("NEGQ", ops...) }
-func (o Opcodes) Notq(ops ...Operand)            { o.a.op("NOTQ", ops...) }
-func (o Opcodes) NOTQ(ops ...Operand)            { o.a.op("NOTQ", ops...) }
-func (o Opcodes) Orq(ops ...Operand)             { o.a.op("ORQ", ops...) }
-func (o Opcodes) ORQ(ops ...Operand)             { o.a.op("ORQ", ops...) }
-func (o Opcodes) Popfq(ops ...Operand)           { o.a.op("POPFQ", ops...) }
-func (o Opcodes) POPFQ(ops ...Operand)           { o.a.op("POPFQ", ops...) }
-func (o Opcodes) Popq(ops ...Operand)            { o.a.op("POPQ", ops...) }
-func (o Opcodes) POPQ(ops ...Operand)            { o.a.op("POPQ", ops...) }
-func (o Opcodes) Pushfq(ops ...Operand)          { o.a.op("PUSHFQ", ops...) }
-func (o Opcodes) PUSHFQ(ops ...Operand)          { o.a.op("PUSHFQ", ops...) }
-func (o Opcodes) Pushq(ops ...Operand)           { o.a.op("PUSHQ", ops...) }
-func (o Opcodes) PUSHQ(ops ...Operand)           { o.a.op("PUSHQ", ops...) }
-func (o Opcodes) Rclq(ops ...Operand)            { o.a.op("RCLQ", ops...) }
-func (o Opcodes) RCLQ(ops ...Operand)            { o.a.op("RCLQ", ops...) }
-func (o Opcodes) Rcrq(ops ...Operand)            { o.a.op("RCRQ", ops...) }
-func (o Opcodes) RCRQ(ops ...Operand)            { o.a.op("RCRQ", ops...) }
-func (o Opcodes) Rolq(ops ...Operand)            { o.a.op("ROLQ", ops...) }
-func (o Opcodes) ROLQ(ops ...Operand)            { o.a.op("ROLQ", ops...) }
-func (o Opcodes) Rorq(ops ...Operand)            { o.a.op("RORQ", ops...) }
-func (o Opcodes) RORQ(ops ...Operand)            { o.a.op("RORQ", ops...) }
-func (o Opcodes) Quad(ops ...Operand)            { o.a.op("QUAD", ops...) }
-func (o Opcodes) QUAD(ops ...Operand)            { o.a.op("QUAD", ops...) }
-func (o Opcodes) Salq(ops ...Operand)            { o.a.op("SALQ", ops...) }
-func (o Opcodes) SALQ(ops ...Operand)            { o.a.op("SALQ", ops...) }
-func (o Opcodes) Sarq(ops ...Operand)            { o.a.op("SARQ", ops...) }
-func (o Opcodes) SARQ(ops ...Operand)            { o.a.op("SARQ", ops...) }
-func (o Opcodes) Sbbq(ops ...Operand)            { o.a.op("SBBQ", ops...) }
-func (o Opcodes) SBBQ(ops ...Operand)            { o.a.op("SBBQ", ops...) }
-func (o Opcodes) Scasq(ops ...Operand)           { o.a.op("SCASQ", ops...) }
-func (o Opcodes) SCASQ(ops ...Operand)           { o.a.op("SCASQ", ops...) }
-func (o Opcodes) Shlq(ops ...Operand)            { o.a.op("SHLQ", ops...) }
-func (o Opcodes) SHLQ(ops ...Operand)            { o.a.op("SHLQ", ops...) }
-func (o Opcodes) Shrq(ops ...Operand)            { o.a.op("SHRQ", ops...) }
-func (o Opcodes) SHRQ(ops ...Operand)            { o.a.op("SHRQ", ops...) }
-func (o Opcodes) Stosq(ops ...Operand)           { o.a.op("STOSQ", ops...) }
-func (o Opcodes) STOSQ(ops ...Operand)           { o.a.op("STOSQ", ops...) }
-func (o Opcodes) Subq(ops ...Operand)            { o.a.op("SUBQ", ops...) }
-func (o Opcodes) SUBQ(ops ...Operand)            { o.a.op("SUBQ", ops...) }
-func (o Opcodes) Testq(ops ...Operand)           { o.a.op("TESTQ", ops...) }
-func (o Opcodes) TESTQ(ops ...Operand)           { o.a.op("TESTQ", ops...) }
-func (o Opcodes) Xaddq(ops ...Operand)           { o.a.op("XADDQ", ops...) }
-func (o Opcodes) XADDQ(ops ...Operand)           { o.a.op("XADDQ", ops...) }
-func (o Opcodes) Xchgq(ops ...Operand)           { o.a.op("XCHGQ", ops...) }
-func (o Opcodes) XCHGQ(ops ...Operand)           { o.a.op("XCHGQ", ops...) }
-func (o Opcodes) Xorq(ops ...Operand)            { o.a.op("XORQ", ops...) }
-func (o Opcodes) XORQ(ops ...Operand)            { o.a.op("XORQ", ops...) }
-func (o Opcodes) Xgetbv(ops ...Operand)          { o.a.op("XGETBV", ops...) }
-func (o Opcodes) XGETBV(ops ...Operand)          { o.a.op("XGETBV", ops...) }
-func (o Opcodes) Addpd(ops ...Operand)           { o.a.op("ADDPD", ops...) }
-func (o Opcodes) ADDPD(ops ...Operand)           { o.a.op("ADDPD", ops...) }
-func (o Opcodes) Addps(ops ...Operand)           { o.a.op("ADDPS", ops...) }
-func (o Opcodes) ADDPS(ops ...Operand)           { o.a.op("ADDPS", ops...) }
-func (o Opcodes) Addsd(ops ...Operand)           { o.a.op("ADDSD", ops...) }
-func (o Opcodes) ADDSD(ops ...Operand)           { o.a.op("ADDSD", ops...) }
-func (o Opcodes) Addss(ops ...Operand)           { o.a.op("ADDSS", ops...) }
-func (o Opcodes) ADDSS(ops ...Operand)           { o.a.op("ADDSS", ops...) }
-func (o Opcodes) Andnl(ops ...Operand)           { o.a.op("ANDNL", ops...) }
-func (o Opcodes) ANDNL(ops ...Operand)           { o.a.op("ANDNL", ops...) }
-func (o Opcodes) Andnq(ops ...Operand)           { o.a.op("ANDNQ", ops...) }
-func (o Opcodes) ANDNQ(ops ...Operand)           { o.a.op("ANDNQ", ops...) }
-func (o Opcodes) Andnpd(ops ...Operand)          { o.a.op("ANDNPD", ops...) }
-func (o Opcodes) ANDNPD(ops ...Operand)          { o.a.op("ANDNPD", ops...) }
-func (o Opcodes) Andnps(ops ...Operand)          { o.a.op("ANDNPS", ops...) }
-func (o Opcodes) ANDNPS(ops ...Operand)          { o.a.op("ANDNPS", ops...) }
-func (o Opcodes) Andpd(ops ...Operand)           { o.a.op("ANDPD", ops...) }
-func (o Opcodes) ANDPD(ops ...Operand)           { o.a.op("ANDPD", ops...) }
-func (o Opcodes) Andps(ops ...Operand)           { o.a.op("ANDPS", ops...) }
-func (o Opcodes) ANDPS(ops ...Operand)           { o.a.op("ANDPS", ops...) }
-func (o Opcodes) Bextrl(ops ...Operand)          { o.a.op("BEXTRL", ops...) }
-func (o Opcodes) BEXTRL(ops ...Operand)          { o.a.op("BEXTRL", ops...) }
-func (o Opcodes) Bextrq(ops ...Operand)          { o.a.op("BEXTRQ", ops...) }
-func (o Opcodes) BEXTRQ(ops ...Operand)          { o.a.op("BEXTRQ", ops...) }
-func (o Opcodes) Blsil(ops ...Operand)           { o.a.op("BLSIL", ops...) }
-func (o Opcodes) BLSIL(ops ...Operand)           { o.a.op("BLSIL", ops...) }
-func (o Opcodes) Blsiq(ops ...Operand)           { o.a.op("BLSIQ", ops...) }
-func (o Opcodes) BLSIQ(ops ...Operand)           { o.a.op("BLSIQ", ops...) }
-func (o Opcodes) Blsmskl(ops ...Operand)         { o.a.op("BLSMSKL", ops...) }
-func (o Opcodes) BLSMSKL(ops ...Operand)         { o.a.op("BLSMSKL", ops...) }
-func (o Opcodes) Blsmskq(ops ...Operand)         { o.a.op("BLSMSKQ", ops...) }
-func (o Opcodes) BLSMSKQ(ops ...Operand)         { o.a.op("BLSMSKQ", ops...) }
-func (o Opcodes) Blsrl(ops ...Operand)           { o.a.op("BLSRL", ops...) }
-func (o Opcodes) BLSRL(ops ...Operand)           { o.a.op("BLSRL", ops...) }
-func (o Opcodes) Blsrq(ops ...Operand)           { o.a.op("BLSRQ", ops...) }
-func (o Opcodes) BLSRQ(ops ...Operand)           { o.a.op("BLSRQ", ops...) }
-func (o Opcodes) Bzhil(ops ...Operand)           { o.a.op("BZHIL", ops...) }
-func (o Opcodes) BZHIL(ops ...Operand)           { o.a.op("BZHIL", ops...) }
-func (o Opcodes) Bzhiq(ops ...Operand)           { o.a.op("BZHIQ", ops...) }
-func (o Opcodes) BZHIQ(ops ...Operand)           { o.a.op("BZHIQ", ops...) }
-func (o Opcodes) Cmppd(ops ...Operand)           { o.a.op("CMPPD", ops...) }
-func (o Opcodes) CMPPD(ops ...Operand)           { o.a.op("CMPPD", ops...) }
-func (o Opcodes) Cmpps(ops ...Operand)           { o.a.op("CMPPS", ops...) }
-func (o Opcodes) CMPPS(ops ...Operand)           { o.a.op("CMPPS", ops...) }
-func (o Opcodes) Cmpsd(ops ...Operand)           { o.a.op("CMPSD", ops...) }
-func (o Opcodes) CMPSD(ops ...Operand)           { o.a.op("CMPSD", ops...) }
-func (o Opcodes) Cmpss(ops ...Operand)           { o.a.op("CMPSS", ops...) }
-func (o Opcodes) CMPSS(ops ...Operand)           { o.a.op("CMPSS", ops...) }
-func (o Opcodes) Comisd(ops ...Operand)          { o.a.op("COMISD", ops...) }
-func (o Opcodes) COMISD(ops ...Operand)          { o.a.op("COMISD", ops...) }
-func (o Opcodes) Comiss(ops ...Operand)          { o.a.op("COMISS", ops...) }
-func (o Opcodes) COMISS(ops ...Operand)          { o.a.op("COMISS", ops...) }
-func (o Opcodes) Cvtpd2pl(ops ...Operand)        { o.a.op("CVTPD2PL", ops...) }
-func (o Opcodes) CVTPD2PL(ops ...Operand)        { o.a.op("CVTPD2PL", ops...) }
-func (o Opcodes) Cvtpd2ps(ops ...Operand)        { o.a.op("CVTPD2PS", ops...) }
-func (o Opcodes) CVTPD2PS(ops ...Operand)        { o.a.op("CVTPD2PS", ops...) }
-func (o Opcodes) Cvtpl2pd(ops ...Operand)        { o.a.op("CVTPL2PD", ops...) }
-func (o Opcodes) CVTPL2PD(ops ...Operand)        { o.a.op("CVTPL2PD", ops...) }
-func (o Opcodes) Cvtpl2ps(ops ...Operand)        { o.a.op("CVTPL2PS", ops...) }
-func (o Opcodes) CVTPL2PS(ops ...Operand)        { o.a.op("CVTPL2PS", ops...) }
-func (o Opcodes) Cvtps2pd(ops ...Operand)        { o.a.op("CVTPS2PD", ops...) }
-func (o Opcodes) CVTPS2PD(ops ...Operand)        { o.a.op("CVTPS2PD", ops...) }
-func (o Opcodes) Cvtps2pl(ops ...Operand)        { o.a.op("CVTPS2PL", ops...) }
-func (o Opcodes) CVTPS2PL(ops ...Operand)        { o.a.op("CVTPS2PL", ops...) }
-func (o Opcodes) Cvtsd2sl(ops ...Operand)        { o.a.op("CVTSD2SL", ops...) }
-func (o Opcodes) CVTSD2SL(ops ...Operand)        { o.a.op("CVTSD2SL", ops...) }
-func (o Opcodes) Cvtsd2sq(ops ...Operand)        { o.a.op("CVTSD2SQ", ops...) }
-func (o Opcodes) CVTSD2SQ(ops ...Operand)        { o.a.op("CVTSD2SQ", ops...) }
-func (o Opcodes) Cvtsd2ss(ops ...Operand)        { o.a.op("CVTSD2SS", ops...) }
-func (o Opcodes) CVTSD2SS(ops ...Operand)        { o.a.op("CVTSD2SS", ops...) }
-func (o Opcodes) Cvtsl2sd(ops ...Operand)        { o.a.op("CVTSL2SD", ops...) }
-func (o Opcodes) CVTSL2SD(ops ...Operand)        { o.a.op("CVTSL2SD", ops...) }
-func (o Opcodes) Cvtsl2ss(ops ...Operand)        { o.a.op("CVTSL2SS", ops...) }
-func (o Opcodes) CVTSL2SS(ops ...Operand)        { o.a.op("CVTSL2SS", ops...) }
-func (o Opcodes) Cvtsq2sd(ops ...Operand)        { o.a.op("CVTSQ2SD", ops...) }
-func (o Opcodes) CVTSQ2SD(ops ...Operand)        { o.a.op("CVTSQ2SD", ops...) }
-func (o Opcodes) Cvtsq2ss(ops ...Operand)        { o.a.op("CVTSQ2SS", ops...) }
-func (o Opcodes) CVTSQ2SS(ops ...Operand)        { o.a.op("CVTSQ2SS", ops...) }
-func (o Opcodes) Cvtss2sd(ops ...Operand)        { o.a.op("CVTSS2SD", ops...) }
-func (o Opcodes) CVTSS2SD(ops ...Operand)        { o.a.op("CVTSS2SD", ops...) }
-func (o Opcodes) Cvtss2sl(ops ...Operand)        { o.a.op("CVTSS2SL", ops...) }
-func (o Opcodes) CVTSS2SL(ops ...Operand)        { o.a.op("CVTSS2SL", ops...) }
-func (o Opcodes) Cvtss2sq(ops ...Operand)        { o.a.op("CVTSS2SQ", ops...) }
-func (o Opcodes) CVTSS2SQ(ops ...Operand)        { o.a.op("CVTSS2SQ", ops...) }
-func (o Opcodes) Cvttpd2pl(ops ...Operand)       { o.a.op("CVTTPD2PL", ops...) }
-func (o Opcodes) CVTTPD2PL(ops ...Operand)       { o.a.op("CVTTPD2PL", ops...) }
-func (o Opcodes) Cvttps2pl(ops ...Operand)       { o.a.op("CVTTPS2PL", ops...) }
-func (o Opcodes) CVTTPS2PL(ops ...Operand)       { o.a.op("CVTTPS2PL", ops...) }
-func (o Opcodes) Cvttsd2sl(ops ...Operand)       { o.a.op("CVTTSD2SL", ops...) }
-func (o Opcodes) CVTTSD2SL(ops ...Operand)       { o.a.op("CVTTSD2SL", ops...) }
-func (o Opcodes) Cvttsd2sq(ops ...Operand)       { o.a.op("CVTTSD2SQ", ops...) }
-func (o Opcodes) CVTTSD2SQ(ops ...Operand)       { o.a.op("CVTTSD2SQ", ops...) }
-func (o Opcodes) Cvttss2sl(ops ...Operand)       { o.a.op("CVTTSS2SL", ops...) }
-func (o Opcodes) CVTTSS2SL(ops ...Operand)       { o.a.op("CVTTSS2SL", ops...) }
-func (o Opcodes) Cvttss2sq(ops ...Operand)       { o.a.op("CVTTSS2SQ", ops...) }
-func (o Opcodes) CVTTSS2SQ(ops ...Operand)       { o.a.op("CVTTSS2SQ", ops...) }
-func (o Opcodes) Divpd(ops ...Operand)           { o.a.op("DIVPD", ops...) }
-func (o Opcodes) DIVPD(ops ...Operand)           { o.a.op("DIVPD", ops...) }
-func (o Opcodes) Divps(ops ...Operand)           { o.a.op("DIVPS", ops...) }
-func (o Opcodes) DIVPS(ops ...Operand)           { o.a.op("DIVPS", ops...) }
-func (o Opcodes) Divsd(ops ...Operand)           { o.a.op("DIVSD", ops...) }
-func (o Opcodes) DIVSD(ops ...Operand)           { o.a.op("DIVSD", ops...) }
-func (o Opcodes) Divss(ops ...Operand)           { o.a.op("DIVSS", ops...) }
-func (o Opcodes) DIVSS(ops ...Operand)           { o.a.op("DIVSS", ops...) }
-func (o Opcodes) Emms(ops ...Operand)            { o.a.op("EMMS", ops...) }
-func (o Opcodes) EMMS(ops ...Operand)            { o.a.op("EMMS", ops...) }
-func (o Opcodes) Fxrstor(ops ...Operand)         { o.a.op("FXRSTOR", ops...) }
-func (o Opcodes) FXRSTOR(ops ...Operand)         { o.a.op("FXRSTOR", ops...) }
-func (o Opcodes) Fxrstor64(ops ...Operand)       { o.a.op("FXRSTOR64", ops...) }
-func (o Opcodes) FXRSTOR64(ops ...Operand)       { o.a.op("FXRSTOR64", ops...) }
-func (o Opcodes) Fxsave(ops ...Operand)          { o.a.op("FXSAVE", ops...) }
-func (o Opcodes) FXSAVE(ops ...Operand)          { o.a.op("FXSAVE", ops...) }
-func (o Opcodes) Fxsave64(ops ...Operand)        { o.a.op("FXSAVE64", ops...) }
-func (o Opcodes) FXSAVE64(ops ...Operand)        { o.a.op("FXSAVE64", ops...) }
-func (o Opcodes) Lddqu(ops ...Operand)           { o.a.op("LDDQU", ops...) }
-func (o Opcodes) LDDQU(ops ...Operand)           { o.a.op("LDDQU", ops...) }
-func (o Opcodes) Ldmxcsr(ops ...Operand)         { o.a.op("LDMXCSR", ops...) }
-func (o Opcodes) LDMXCSR(ops ...Operand)         { o.a.op("LDMXCSR", ops...) }
-func (o Opcodes) Maskmovou(ops ...Operand)       { o.a.op("MASKMOVOU", ops...) }
-func (o Opcodes) MASKMOVOU(ops ...Operand)       { o.a.op("MASKMOVOU", ops...) }
-func (o Opcodes) Maskmovq(ops ...Operand)        { o.a.op("MASKMOVQ", ops...) }
-func (o Opcodes) MASKMOVQ(ops ...Operand)        { o.a.op("MASKMOVQ", ops...) }
-func (o Opcodes) Maxpd(ops ...Operand)           { o.a.op("MAXPD", ops...) }
-func (o Opcodes) MAXPD(ops ...Operand)           { o.a.op("MAXPD", ops...) }
-func (o Opcodes) Maxps(ops ...Operand)           { o.a.op("MAXPS", ops...) }
-func (o Opcodes) MAXPS(ops ...Operand)           { o.a.op("MAXPS", ops...) }
-func (o Opcodes) Maxsd(ops ...Operand)           { o.a.op("MAXSD", ops...) }
-func (o Opcodes) MAXSD(ops ...Operand)           { o.a.op("MAXSD", ops...) }
-func (o Opcodes) Maxss(ops ...Operand)           { o.a.op("MAXSS", ops...) }
-func (o Opcodes) MAXSS(ops ...Operand)           { o.a.op("MAXSS", ops...) }
-func (o Opcodes) Minpd(ops ...Operand)           { o.a.op("MINPD", ops...) }
-func (o Opcodes) MINPD(ops ...Operand)           { o.a.op("MINPD", ops...) }
-func (o Opcodes) Minps(ops ...Operand)           { o.a.op("MINPS", ops...) }
-func (o Opcodes) MINPS(ops ...Operand)           { o.a.op("MINPS", ops...) }
-func (o Opcodes) Minsd(ops ...Operand)           { o.a.op("MINSD", ops...) }
-func (o Opcodes) MINSD(ops ...Operand)           { o.a.op("MINSD", ops...) }
-func (o Opcodes) Minss(ops ...Operand)           { o.a.op("MINSS", ops...) }
-func (o Opcodes) MINSS(ops ...Operand)           { o.a.op("MINSS", ops...) }
-func (o Opcodes) Movapd(ops ...Operand)          { o.a.op("MOVAPD", ops...) }
-func (o Opcodes) MOVAPD(ops ...Operand)          { o.a.op("MOVAPD", ops...) }
-func (o Opcodes) Movaps(ops ...Operand)          { o.a.op("MOVAPS", ops...) }
-func (o Opcodes) MOVAPS(ops ...Operand)          { o.a.op("MOVAPS", ops...) }
-func (o Opcodes) Movou(ops ...Operand)           { o.a.op("MOVOU", ops...) }
-func (o Opcodes) MOVOU(ops ...Operand)           { o.a.op("MOVOU", ops...) }
-func (o Opcodes) Movhlps(ops ...Operand)         { o.a.op("MOVHLPS", ops...) }
-func (o Opcodes) MOVHLPS(ops ...Operand)         { o.a.op("MOVHLPS", ops...) }
-func (o Opcodes) Movhpd(ops ...Operand)          { o.a.op("MOVHPD", ops...) }
-func (o Opcodes) MOVHPD(ops ...Operand)          { o.a.op("MOVHPD", ops...) }
-func (o Opcodes) Movhps(ops ...Operand)          { o.a.op("MOVHPS", ops...) }
-func (o Opcodes) MOVHPS(ops ...Operand)          { o.a.op("MOVHPS", ops...) }
-func (o Opcodes) Movlhps(ops ...Operand)         { o.a.op("MOVLHPS", ops...) }
-func (o Opcodes) MOVLHPS(ops ...Operand)         { o.a.op("MOVLHPS", ops...) }
-func (o Opcodes) Movlpd(ops ...Operand)          { o.a.op("MOVLPD", ops...) }
-func (o Opcodes) MOVLPD(ops ...Operand)          { o.a.op("MOVLPD", ops...) }
-func (o Opcodes) Movlps(ops ...Operand)          { o.a.op("MOVLPS", ops...) }
-func (o Opcodes) MOVLPS(ops ...Operand)          { o.a.op("MOVLPS", ops...) }
-func (o Opcodes) Movmskpd(ops ...Operand)        { o.a.op("MOVMSKPD", ops...) }
-func (o Opcodes) MOVMSKPD(ops ...Operand)        { o.a.op("MOVMSKPD", ops...) }
-func (o Opcodes) Movmskps(ops ...Operand)        { o.a.op("MOVMSKPS", ops...) }
-func (o Opcodes) MOVMSKPS(ops ...Operand)        { o.a.op("MOVMSKPS", ops...) }
-func (o Opcodes) Movnto(ops ...Operand)          { o.a.op("MOVNTO", ops...) }
-func (o Opcodes) MOVNTO(ops ...Operand)          { o.a.op("MOVNTO", ops...) }
-func (o Opcodes) Movntpd(ops ...Operand)         { o.a.op("MOVNTPD", ops...) }
-func (o Opcodes) MOVNTPD(ops ...Operand)         { o.a.op("MOVNTPD", ops...) }
-func (o Opcodes) Movntps(ops ...Operand)         { o.a.op("MOVNTPS", ops...) }
-func (o Opcodes) MOVNTPS(ops ...Operand)         { o.a.op("MOVNTPS", ops...) }
-func (o Opcodes) Movntq(ops ...Operand)          { o.a.op("MOVNTQ", ops...) }
-func (o Opcodes) MOVNTQ(ops ...Operand)          { o.a.op("MOVNTQ", ops...) }
-func (o Opcodes) Movo(ops ...Operand)            { o.a.op("MOVO", ops...) }
-func (o Opcodes) MOVO(ops ...Operand)            { o.a.op("MOVO", ops...) }
-func (o Opcodes) Movqozx(ops ...Operand)         { o.a.op("MOVQOZX", ops...) }
-func (o Opcodes) MOVQOZX(ops ...Operand)         { o.a.op("MOVQOZX", ops...) }
-func (o Opcodes) Movsd(ops ...Operand)           { o.a.op("MOVSD", ops...) }
-func (o Opcodes) MOVSD(ops ...Operand)           { o.a.op("MOVSD", ops...) }
-func (o Opcodes) Movss(ops ...Operand)           { o.a.op("MOVSS", ops...) }
-func (o Opcodes) MOVSS(ops ...Operand)           { o.a.op("MOVSS", ops...) }
-func (o Opcodes) Movupd(ops ...Operand)          { o.a.op("MOVUPD", ops...) }
-func (o Opcodes) MOVUPD(ops ...Operand)          { o.a.op("MOVUPD", ops...) }
-func (o Opcodes) Movups(ops ...Operand)          { o.a.op("MOVUPS", ops...) }
-func (o Opcodes) MOVUPS(ops ...Operand)          { o.a.op("MOVUPS", ops...) }
-func (o Opcodes) Mulpd(ops ...Operand)           { o.a.op("MULPD", ops...) }
-func (o Opcodes) MULPD(ops ...Operand)           { o.a.op("MULPD", ops...) }
-func (o Opcodes) Mulps(ops ...Operand)           { o.a.op("MULPS", ops...) }
-func (o Opcodes) MULPS(ops ...Operand)           { o.a.op("MULPS", ops...) }
-func (o Opcodes) Mulsd(ops ...Operand)           { o.a.op("MULSD", ops...) }
-func (o Opcodes) MULSD(ops ...Operand)           { o.a.op("MULSD", ops...) }
-func (o Opcodes) Mulss(ops ...Operand)           { o.a.op("MULSS", ops...) }
-func (o Opcodes) MULSS(ops ...Operand)           { o.a.op("MULSS", ops...) }
-func (o Opcodes) Mulxl(ops ...Operand)           { o.a.op("MULXL", ops...) }
-func (o Opcodes) MULXL(ops ...Operand)           { o.a.op("MULXL", ops...) }
-func (o Opcodes) Mulxq(ops ...Operand)           { o.a.op("MULXQ", ops...) }
-func (o Opcodes) MULXQ(ops ...Operand)           { o.a.op("MULXQ", ops...) }
-func (o Opcodes) Orpd(ops ...Operand)            { o.a.op("ORPD", ops...) }
-func (o Opcodes) ORPD(ops ...Operand)            { o.a.op("ORPD", ops...) }
-func (o Opcodes) Orps(ops ...Operand)            { o.a.op("ORPS", ops...) }
-func (o Opcodes) ORPS(ops ...Operand)            { o.a.op("ORPS", ops...) }
-func (o Opcodes) Packsslw(ops ...Operand)        { o.a.op("PACKSSLW", ops...) }
-func (o Opcodes) PACKSSLW(ops ...Operand)        { o.a.op("PACKSSLW", ops...) }
-func (o Opcodes) Packsswb(ops ...Operand)        { o.a.op("PACKSSWB", ops...) }
-func (o Opcodes) PACKSSWB(ops ...Operand)        { o.a.op("PACKSSWB", ops...) }
-func (o Opcodes) Packuswb(ops ...Operand)        { o.a.op("PACKUSWB", ops...) }
-func (o Opcodes) PACKUSWB(ops ...Operand)        { o.a.op("PACKUSWB", ops...) }
-func (o Opcodes) Paddb(ops ...Operand)           { o.a.op("PADDB", ops...) }
-func (o Opcodes) PADDB(ops ...Operand)           { o.a.op("PADDB", ops...) }
-func (o Opcodes) Paddl(ops ...Operand)           { o.a.op("PADDL", ops...) }
-func (o Opcodes) PADDL(ops ...Operand)           { o.a.op("PADDL", ops...) }
-func (o Opcodes) Paddq(ops ...Operand)           { o.a.op("PADDQ", ops...) }
-func (o Opcodes) PADDQ(ops ...Operand)           { o.a.op("PADDQ", ops...) }
-func (o Opcodes) Paddsb(ops ...Operand)          { o.a.op("PADDSB", ops...) }
-func (o Opcodes) PADDSB(ops ...Operand)          { o.a.op("PADDSB", ops...) }
-func (o Opcodes) Paddsw(ops ...Operand)          { o.a.op("PADDSW", ops...) }
-func (o Opcodes) PADDSW(ops ...Operand)          { o.a.op("PADDSW", ops...) }
-func (o Opcodes) Paddusb(ops ...Operand)         { o.a.op("PADDUSB", ops...) }
-func (o Opcodes) PADDUSB(ops ...Operand)         { o.a.op("PADDUSB", ops...) }
-func (o Opcodes) Paddusw(ops ...Operand)         { o.a.op("PADDUSW", ops...) }
-func (o Opcodes) PADDUSW(ops ...Operand)         { o.a.op("PADDUSW", ops...) }
-func (o Opcodes) Paddw(ops ...Operand)           { o.a.op("PADDW", ops...) }
-func (o Opcodes) PADDW(ops ...Operand)           { o.a.op("PADDW", ops...) }
-func (o Opcodes) Pand(ops ...Operand)            { o.a.op("PAND", ops...) }
-func (o Opcodes) PAND(ops ...Operand)            { o.a.op("PAND", ops...) }
-func (o Opcodes) Pandn(ops ...Operand)           { o.a.op("PANDN", ops...) }
-func (o Opcodes) PANDN(ops ...Operand)           { o.a.op("PANDN", ops...) }
-func (o Opcodes) Pavgb(ops ...Operand)           { o.a.op("PAVGB", ops...) }
-func (o Opcodes) PAVGB(ops ...Operand)           { o.a.op("PAVGB", ops...) }
-func (o Opcodes) Pavgw(ops ...Operand)           { o.a.op("PAVGW", ops...) }
-func (o Opcodes) PAVGW(ops ...Operand)           { o.a.op("PAVGW", ops...) }
-func (o Opcodes) Pcmpeqb(ops ...Operand)         { o.a.op("PCMPEQB", ops...) }
-func (o Opcodes) PCMPEQB(ops ...Operand)         { o.a.op("PCMPEQB", ops...) }
-func (o Opcodes) Pcmpeql(ops ...Operand)         { o.a.op("PCMPEQL", ops...) }
-func (o Opcodes) PCMPEQL(ops ...Operand)         { o.a.op("PCMPEQL", ops...) }
-func (o Opcodes) Pcmpeqw(ops ...Operand)         { o.a.op("PCMPEQW", ops...) }
-func (o Opcodes) PCMPEQW(ops ...Operand)         { o.a.op("PCMPEQW", ops...) }
-func (o Opcodes) Pcmpgtb(ops ...Operand)         { o.a.op("PCMPGTB", ops...) }
-func (o Opcodes) PCMPGTB(ops ...Operand)         { o.a.op("PCMPGTB", ops...) }
-func (o Opcodes) Pcmpgtl(ops ...Operand)         { o.a.op("PCMPGTL", ops...) }
-func (o Opcodes) PCMPGTL(ops ...Operand)         { o.a.op("PCMPGTL", ops...) }
-func (o Opcodes) Pcmpgtw(ops ...Operand)         { o.a.op("PCMPGTW", ops...) }
-func (o Opcodes) PCMPGTW(ops ...Operand)         { o.a.op("PCMPGTW", ops...) }
-func (o Opcodes) Pdepl(ops ...Operand)           { o.a.op("PDEPL", ops...) }
-func (o Opcodes) PDEPL(ops ...Operand)           { o.a.op("PDEPL", ops...) }
-func (o Opcodes) Pdepq(ops ...Operand)           { o.a.op("PDEPQ", ops...) }
-func (o Opcodes) PDEPQ(ops ...Operand)           { o.a.op("PDEPQ", ops...) }
-func (o Opcodes) Pextl(ops ...Operand)           { o.a.op("PEXTL", ops...) }
-func (o Opcodes) PEXTL(ops ...Operand)           { o.a.op("PEXTL", ops...) }
-func (o Opcodes) Pextq(ops ...Operand)           { o.a.op("PEXTQ", ops...) }
-func (o Opcodes) PEXTQ(ops ...Operand)           { o.a.op("PEXTQ", ops...) }
-func (o Opcodes) Pextrb(ops ...Operand)          { o.a.op("PEXTRB", ops...) }
-func (o Opcodes) PEXTRB(ops ...Operand)          { o.a.op("PEXTRB", ops...) }
-func (o Opcodes) Pextrd(ops ...Operand)          { o.a.op("PEXTRD", ops...) }
-func (o Opcodes) PEXTRD(ops ...Operand)          { o.a.op("PEXTRD", ops...) }
-func (o Opcodes) Pextrq(ops ...Operand)          { o.a.op("PEXTRQ", ops...) }
-func (o Opcodes) PEXTRQ(ops ...Operand)          { o.a.op("PEXTRQ", ops...) }
-func (o Opcodes) Phaddd(ops ...Operand)          { o.a.op("PHADDD", ops...) }
-func (o Opcodes) PHADDD(ops ...Operand)          { o.a.op("PHADDD", ops...) }
-func (o Opcodes) Phaddsw(ops ...Operand)         { o.a.op("PHADDSW", ops...) }
-func (o Opcodes) PHADDSW(ops ...Operand)         { o.a.op("PHADDSW", ops...) }
-func (o Opcodes) Phaddw(ops ...Operand)          { o.a.op("PHADDW", ops...) }
-func (o Opcodes) PHADDW(ops ...Operand)          { o.a.op("PHADDW", ops...) }
-func (o Opcodes) Phminposuw(ops ...Operand)      { o.a.op("PHMINPOSUW", ops...) }
-func (o Opcodes) PHMINPOSUW(ops ...Operand)      { o.a.op("PHMINPOSUW", ops...) }
-func (o Opcodes) Phsubd(ops ...Operand)          { o.a.op("PHSUBD", ops...) }
-func (o Opcodes) PHSUBD(ops ...Operand)          { o.a.op("PHSUBD", ops...) }
-func (o Opcodes) Phsubsw(ops ...Operand)         { o.a.op("PHSUBSW", ops...) }
-func (o Opcodes) PHSUBSW(ops ...Operand)         { o.a.op("PHSUBSW", ops...) }
-func (o Opcodes) Phsubw(ops ...Operand)          { o.a.op("PHSUBW", ops...) }
-func (o Opcodes) PHSUBW(ops ...Operand)          { o.a.op("PHSUBW", ops...) }
-func (o Opcodes) Pinsrb(ops ...Operand)          { o.a.op("PINSRB", ops...) }
-func (o Opcodes) PINSRB(ops ...Operand)          { o.a.op("PINSRB", ops...) }
-func (o Opcodes) Pinsrd(ops ...Operand)          { o.a.op("PINSRD", ops...) }
-func (o Opcodes) PINSRD(ops ...Operand)          { o.a.op("PINSRD", ops...) }
-func (o Opcodes) Pinsrq(ops ...Operand)          { o.a.op("PINSRQ", ops...) }
-func (o Opcodes) PINSRQ(ops ...Operand)          { o.a.op("PINSRQ", ops...) }
-func (o Opcodes) Pinsrw(ops ...Operand)          { o.a.op("PINSRW", ops...) }
-func (o Opcodes) PINSRW(ops ...Operand)          { o.a.op("PINSRW", ops...) }
-func (o Opcodes) Pmaddwl(ops ...Operand)         { o.a.op("PMADDWL", ops...) }
-func (o Opcodes) PMADDWL(ops ...Operand)         { o.a.op("PMADDWL", ops...) }
-func (o Opcodes) Pmaxsw(ops ...Operand)          { o.a.op("PMAXSW", ops...) }
-func (o Opcodes) PMAXSW(ops ...Operand)          { o.a.op("PMAXSW", ops...) }
-func (o Opcodes) Pmaxub(ops ...Operand)          { o.a.op("PMAXUB", ops...) }
-func (o Opcodes) PMAXUB(ops ...Operand)          { o.a.op("PMAXUB", ops...) }
-func (o Opcodes) Pminsw(ops ...Operand)          { o.a.op("PMINSW", ops...) }
-func (o Opcodes) PMINSW(ops ...Operand)          { o.a.op("PMINSW", ops...) }
-func (o Opcodes) Pminub(ops ...Operand)          { o.a.op("PMINUB", ops...) }
-func (o Opcodes) PMINUB(ops ...Operand)          { o.a.op("PMINUB", ops...) }
-func (o Opcodes) Pmovmskb(ops ...Operand)        { o.a.op("PMOVMSKB", ops...) }
-func (o Opcodes) PMOVMSKB(ops ...Operand)        { o.a.op("PMOVMSKB", ops...) }
-func (o Opcodes) Pmovsxbd(ops ...Operand)        { o.a.op("PMOVSXBD", ops...) }
-func (o Opcodes) PMOVSXBD(ops ...Operand)        { o.a.op("PMOVSXBD", ops...) }
-func (o Opcodes) Pmovsxbq(ops ...Operand)        { o.a.op("PMOVSXBQ", ops...) }
-func (o Opcodes) PMOVSXBQ(ops ...Operand)        { o.a.op("PMOVSXBQ", ops...) }
-func (o Opcodes) Pmovsxbw(ops ...Operand)        { o.a.op("PMOVSXBW", ops...) }
-func (o Opcodes) PMOVSXBW(ops ...Operand)        { o.a.op("PMOVSXBW", ops...) }
-func (o Opcodes) Pmovsxdq(ops ...Operand)        { o.a.op("PMOVSXDQ", ops...) }
-func (o Opcodes) PMOVSXDQ(ops ...Operand)        { o.a.op("PMOVSXDQ", ops...) }
-func (o Opcodes) Pmovsxwd(ops ...Operand)        { o.a.op("PMOVSXWD", ops...) }
-func (o Opcodes) PMOVSXWD(ops ...Operand)        { o.a.op("PMOVSXWD", ops...) }
-func (o Opcodes) Pmovsxwq(ops ...Operand)        { o.a.op("PMOVSXWQ", ops...) }
-func (o Opcodes) PMOVSXWQ(ops ...Operand)        { o.a.op("PMOVSXWQ", ops...) }
-func (o Opcodes) Pmovzxbd(ops ...Operand)        { o.a.op("PMOVZXBD", ops...) }
-func (o Opcodes) PMOVZXBD(ops ...Operand)        { o.a.op("PMOVZXBD", ops...) }
-func (o Opcodes) Pmovzxbq(ops ...Operand)        { o.a.op("PMOVZXBQ", ops...) }
-func (o Opcodes) PMOVZXBQ(ops ...Operand)        { o.a.op("PMOVZXBQ", ops...) }
-func (o Opcodes) Pmovzxbw(ops ...Operand)        { o.a.op("PMOVZXBW", ops...) }
-func (o Opcodes) PMOVZXBW(ops ...Operand)        { o.a.op("PMOVZXBW", ops...) }
-func (o Opcodes) Pmovzxdq(ops ...Operand)        { o.a.op("PMOVZXDQ", ops...) }
-func (o Opcodes) PMOVZXDQ(ops ...Operand)        { o.a.op("PMOVZXDQ", ops...) }
-func (o Opcodes) Pmovzxwd(ops ...Operand)        { o.a.op("PMOVZXWD", ops...) }
-func (o Opcodes) PMOVZXWD(ops ...Operand)        { o.a.op("PMOVZXWD", ops...) }
-func (o Opcodes) Pmovzxwq(ops ...Operand)        { o.a.op("PMOVZXWQ", ops...) }
-func (o Opcodes) PMOVZXWQ(ops ...Operand)        { o.a.op("PMOVZXWQ", ops...) }
-func (o Opcodes) Pmuldq(ops ...Operand)          { o.a.op("PMULDQ", ops...) }
-func (o Opcodes) PMULDQ(ops ...Operand)          { o.a.op("PMULDQ", ops...) }
-func (o Opcodes) Pmulhuw(ops ...Operand)         { o.a.op("PMULHUW", ops...) }
-func (o Opcodes) PMULHUW(ops ...Operand)         { o.a.op("PMULHUW", ops...) }
-func (o Opcodes) Pmulhw(ops ...Operand)          { o.a.op("PMULHW", ops...) }
-func (o Opcodes) PMULHW(ops ...Operand)          { o.a.op("PMULHW", ops...) }
-func (o Opcodes) Pmulld(ops ...Operand)          { o.a.op("PMULLD", ops...) }
-func (o Opcodes) PMULLD(ops ...Operand)          { o.a.op("PMULLD", ops...) }
-func (o Opcodes) Pmullw(ops ...Operand)          { o.a.op("PMULLW", ops...) }
-func (o Opcodes) PMULLW(ops ...Operand)          { o.a.op("PMULLW", ops...) }
-func (o Opcodes) Pmululq(ops ...Operand)         { o.a.op("PMULULQ", ops...) }
-func (o Opcodes) PMULULQ(ops ...Operand)         { o.a.op("PMULULQ", ops...) }
-func (o Opcodes) Por(ops ...Operand)             { o.a.op("POR", ops...) }
-func (o Opcodes) POR(ops ...Operand)             { o.a.op("POR", ops...) }
-func (o Opcodes) Psadbw(ops ...Operand)          { o.a.op("PSADBW", ops...) }
-func (o Opcodes) PSADBW(ops ...Operand)          { o.a.op("PSADBW", ops...) }
-func (o Opcodes) Pshufb(ops ...Operand)          { o.a.op("PSHUFB", ops...) }
-func (o Opcodes) PSHUFB(ops ...Operand)          { o.a.op("PSHUFB", ops...) }
-func (o Opcodes) Pshufhw(ops ...Operand)         { o.a.op("PSHUFHW", ops...) }
-func (o Opcodes) PSHUFHW(ops ...Operand)         { o.a.op("PSHUFHW", ops...) }
-func (o Opcodes) Pshufl(ops ...Operand)          { o.a.op("PSHUFL", ops...) }
-func (o Opcodes) PSHUFL(ops ...Operand)          { o.a.op("PSHUFL", ops...) }
-func (o Opcodes) Pshuflw(ops ...Operand)         { o.a.op("PSHUFLW", ops...) }
-func (o Opcodes) PSHUFLW(ops ...Operand)         { o.a.op("PSHUFLW", ops...) }
-func (o Opcodes) Pshufw(ops ...Operand)          { o.a.op("PSHUFW", ops...) }
-func (o Opcodes) PSHUFW(ops ...Operand)          { o.a.op("PSHUFW", ops...) }
-func (o Opcodes) Pslll(ops ...Operand)           { o.a.op("PSLLL", ops...) }
-func (o Opcodes) PSLLL(ops ...Operand)           { o.a.op("PSLLL", ops...) }
-func (o Opcodes) Psllo(ops ...Operand)           { o.a.op("PSLLO", ops...) }
-func (o Opcodes) PSLLO(ops ...Operand)           { o.a.op("PSLLO", ops...) }
-func (o Opcodes) Psllq(ops ...Operand)           { o.a.op("PSLLQ", ops...) }
-func (o Opcodes) PSLLQ(ops ...Operand)           { o.a.op("PSLLQ", ops...) }
-func (o Opcodes) Psllw(ops ...Operand)           { o.a.op("PSLLW", ops...) }
-func (o Opcodes) PSLLW(ops ...Operand)           { o.a.op("PSLLW", ops...) }
-func (o Opcodes) Psral(ops ...Operand)           { o.a.op("PSRAL", ops...) }
-func (o Opcodes) PSRAL(ops ...Operand)           { o.a.op("PSRAL", ops...) }
-func (o Opcodes) Psraw(ops ...Operand)           { o.a.op("PSRAW", ops...) }
-func (o Opcodes) PSRAW(ops ...Operand)           { o.a.op("PSRAW", ops...) }
-func (o Opcodes) Psrll(ops ...Operand)           { o.a.op("PSRLL", ops...) }
-func (o Opcodes) PSRLL(ops ...Operand)           { o.a.op("PSRLL", ops...) }
-func (o Opcodes) Psrlo(ops ...Operand)           { o.a.op("PSRLO", ops...) }
-func (o Opcodes) PSRLO(ops ...Operand)           { o.a.op("PSRLO", ops...) }
-func (o Opcodes) Psrlq(ops ...Operand)           { o.a.op("PSRLQ", ops...) }
-func (o Opcodes) PSRLQ(ops ...Operand)           { o.a.op("PSRLQ", ops...) }
-func (o Opcodes) Psrlw(ops ...Operand)           { o.a.op("PSRLW", ops...) }
-func (o Opcodes) PSRLW(ops ...Operand)           { o.a.op("PSRLW", ops...) }
-func (o Opcodes) Psubb(ops ...Operand)           { o.a.op("PSUBB", ops...) }
-func (o Opcodes) PSUBB(ops ...Operand)           { o.a.op("PSUBB", ops...) }
-func (o Opcodes) Psubl(ops ...Operand)           { o.a.op("PSUBL", ops...) }
-func (o Opcodes) PSUBL(ops ...Operand)           { o.a.op("PSUBL", ops...) }
-func (o Opcodes) Psubq(ops ...Operand)           { o.a.op("PSUBQ", ops...) }
-func (o Opcodes) PSUBQ(ops ...Operand)           { o.a.op("PSUBQ", ops...) }
-func (o Opcodes) Psubsb(ops ...Operand)          { o.a.op("PSUBSB", ops...) }
-func (o Opcodes) PSUBSB(ops ...Operand)          { o.a.op("PSUBSB", ops...) }
-func (o Opcodes) Psubsw(ops ...Operand)          { o.a.op("PSUBSW", ops...) }
-func (o Opcodes) PSUBSW(ops ...Operand)          { o.a.op("PSUBSW", ops...) }
-func (o Opcodes) Psubusb(ops ...Operand)         { o.a.op("PSUBUSB", ops...) }
-func (o Opcodes) PSUBUSB(ops ...Operand)         { o.a.op("PSUBUSB", ops...) }
-func (o Opcodes) Psubusw(ops ...Operand)         { o.a.op("PSUBUSW", ops...) }
-func (o Opcodes) PSUBUSW(ops ...Operand)         { o.a.op("PSUBUSW", ops...) }
-func (o Opcodes) Psubw(ops ...Operand)           { o.a.op("PSUBW", ops...) }
-func (o Opcodes) PSUBW(ops ...Operand)           { o.a.op("PSUBW", ops...) }
-func (o Opcodes) Punpckhbw(ops ...Operand)       { o.a.op("PUNPCKHBW", ops...) }
-func (o Opcodes) PUNPCKHBW(ops ...Operand)       { o.a.op("PUNPCKHBW", ops...) }
-func (o Opcodes) Punpckhlq(ops ...Operand)       { o.a.op("PUNPCKHLQ", ops...) }
-func (o Opcodes) PUNPCKHLQ(ops ...Operand)       { o.a.op("PUNPCKHLQ", ops...) }
-func (o Opcodes) Punpckhqdq(ops ...Operand)      { o.a.op("PUNPCKHQDQ", ops...) }
-func (o Opcodes) PUNPCKHQDQ(ops ...Operand)      { o.a.op("PUNPCKHQDQ", ops...) }
-func (o Opcodes) Punpckhwl(ops ...Operand)       { o.a.op("PUNPCKHWL", ops...) }
-func (o Opcodes) PUNPCKHWL(ops ...Operand)       { o.a.op("PUNPCKHWL", ops...) }
-func (o Opcodes) Punpcklbw(ops ...Operand)       { o.a.op("PUNPCKLBW", ops...) }
-func (o Opcodes) PUNPCKLBW(ops ...Operand)       { o.a.op("PUNPCKLBW", ops...) }
-func (o Opcodes) Punpckllq(ops ...Operand)       { o.a.op("PUNPCKLLQ", ops...) }
-func (o Opcodes) PUNPCKLLQ(ops ...Operand)       { o.a.op("PUNPCKLLQ", ops...) }
-func (o Opcodes) Punpcklqdq(ops ...Operand)      { o.a.op("PUNPCKLQDQ", ops...) }
-func (o Opcodes) PUNPCKLQDQ(ops ...Operand)      { o.a.op("PUNPCKLQDQ", ops...) }
-func (o Opcodes) Punpcklwl(ops ...Operand)       { o.a.op("PUNPCKLWL", ops...) }
-func (o Opcodes) PUNPCKLWL(ops ...Operand)       { o.a.op("PUNPCKLWL", ops...) }
-func (o Opcodes) Pxor(ops ...Operand)            { o.a.op("PXOR", ops...) }
-func (o Opcodes) PXOR(ops ...Operand)            { o.a.op("PXOR", ops...) }
-func (o Opcodes) Rcpps(ops ...Operand)           { o.a.op("RCPPS", ops...) }
-func (o Opcodes) RCPPS(ops ...Operand)           { o.a.op("RCPPS", ops...) }
-func (o Opcodes) Rcpss(ops ...Operand)           { o.a.op("RCPSS", ops...) }
-func (o Opcodes) RCPSS(ops ...Operand)           { o.a.op("RCPSS", ops...) }
-func (o Opcodes) Rsqrtps(ops ...Operand)         { o.a.op("RSQRTPS", ops...) }
-func (o Opcodes) RSQRTPS(ops ...Operand)         { o.a.op("RSQRTPS", ops...) }
-func (o Opcodes) Rsqrtss(ops ...Operand)         { o.a.op("RSQRTSS", ops...) }
-func (o Opcodes) RSQRTSS(ops ...Operand)         { o.a.op("RSQRTSS", ops...) }
-func (o Opcodes) Sarxl(ops ...Operand)           { o.a.op("SARXL", ops...) }
-func (o Opcodes) SARXL(ops ...Operand)           { o.a.op("SARXL", ops...) }
-func (o Opcodes) Sarxq(ops ...Operand)           { o.a.op("SARXQ", ops...) }
-func (o Opcodes) SARXQ(ops ...Operand)           { o.a.op("SARXQ", ops...) }
-func (o Opcodes) Shlxl(ops ...Operand)           { o.a.op("SHLXL", ops...) }
-func (o Opcodes) SHLXL(ops ...Operand)           { o.a.op("SHLXL", ops...) }
-func (o Opcodes) Shlxq(ops ...Operand)           { o.a.op("SHLXQ", ops...) }
-func (o Opcodes) SHLXQ(ops ...Operand)           { o.a.op("SHLXQ", ops...) }
-func (o Opcodes) Shrxl(ops ...Operand)           { o.a.op("SHRXL", ops...) }
-func (o Opcodes) SHRXL(ops ...Operand)           { o.a.op("SHRXL", ops...) }
-func (o Opcodes) Shrxq(ops ...Operand)           { o.a.op("SHRXQ", ops...) }
-func (o Opcodes) SHRXQ(ops ...Operand)           { o.a.op("SHRXQ", ops...) }
-func (o Opcodes) Shufpd(ops ...Operand)          { o.a.op("SHUFPD", ops...) }
-func (o Opcodes) SHUFPD(ops ...Operand)          { o.a.op("SHUFPD", ops...) }
-func (o Opcodes) Shufps(ops ...Operand)          { o.a.op("SHUFPS", ops...) }
-func (o Opcodes) SHUFPS(ops ...Operand)          { o.a.op("SHUFPS", ops...) }
-func (o Opcodes) Sqrtpd(ops ...Operand)          { o.a.op("SQRTPD", ops...) }
-func (o Opcodes) SQRTPD(ops ...Operand)          { o.a.op("SQRTPD", ops...) }
-func (o Opcodes) Sqrtps(ops ...Operand)          { o.a.op("SQRTPS", ops...) }
-func (o Opcodes) SQRTPS(ops ...Operand)          { o.a.op("SQRTPS", ops...) }
-func (o Opcodes) Sqrtsd(ops ...Operand)          { o.a.op("SQRTSD", ops...) }
-func (o Opcodes) SQRTSD(ops ...Operand)          { o.a.op("SQRTSD", ops...) }
-func (o Opcodes) Sqrtss(ops ...Operand)          { o.a.op("SQRTSS", ops...) }
-func (o Opcodes) SQRTSS(ops ...Operand)          { o.a.op("SQRTSS", ops...) }
-func (o Opcodes) Stmxcsr(ops ...Operand)         { o.a.op("STMXCSR", ops...) }
-func (o Opcodes) STMXCSR(ops ...Operand)         { o.a.op("STMXCSR", ops...) }
-func (o Opcodes) Subpd(ops ...Operand)           { o.a.op("SUBPD", ops...) }
-func (o Opcodes) SUBPD(ops ...Operand)           { o.a.op("SUBPD", ops...) }
-func (o Opcodes) Subps(ops ...Operand)           { o.a.op("SUBPS", ops...) }
-func (o Opcodes) SUBPS(ops ...Operand)           { o.a.op("SUBPS", ops...) }
-func (o Opcodes) Subsd(ops ...Operand)           { o.a.op("SUBSD", ops...) }
-func (o Opcodes) SUBSD(ops ...Operand)           { o.a.op("SUBSD", ops...) }
-func (o Opcodes) Subss(ops ...Operand)           { o.a.op("SUBSS", ops...) }
-func (o Opcodes) SUBSS(ops ...Operand)           { o.a.op("SUBSS", ops...) }
-func (o Opcodes) Ucomisd(ops ...Operand)         { o.a.op("UCOMISD", ops...) }
-func (o Opcodes) UCOMISD(ops ...Operand)         { o.a.op("UCOMISD", ops...) }
-func (o Opcodes) Ucomiss(ops ...Operand)         { o.a.op("UCOMISS", ops...) }
-func (o Opcodes) UCOMISS(ops ...Operand)         { o.a.op("UCOMISS", ops...) }
-func (o Opcodes) Unpckhpd(ops ...Operand)        { o.a.op("UNPCKHPD", ops...) }
-func (o Opcodes) UNPCKHPD(ops ...Operand)        { o.a.op("UNPCKHPD", ops...) }
-func (o Opcodes) Unpckhps(ops ...Operand)        { o.a.op("UNPCKHPS", ops...) }
-func (o Opcodes) UNPCKHPS(ops ...Operand)        { o.a.op("UNPCKHPS", ops...) }
-func (o Opcodes) Unpcklpd(ops ...Operand)        { o.a.op("UNPCKLPD", ops...) }
-func (o Opcodes) UNPCKLPD(ops ...Operand)        { o.a.op("UNPCKLPD", ops...) }
-func (o Opcodes) Unpcklps(ops ...Operand)        { o.a.op("UNPCKLPS", ops...) }
-func (o Opcodes) UNPCKLPS(ops ...Operand)        { o.a.op("UNPCKLPS", ops...) }
-func (o Opcodes) Xorpd(ops ...Operand)           { o.a.op("XORPD", ops...) }
-func (o Opcodes) XORPD(ops ...Operand)           { o.a.op("XORPD", ops...) }
-func (o Opcodes) Xorps(ops ...Operand)           { o.a.op("XORPS", ops...) }
-func (o Opcodes) XORPS(ops ...Operand)           { o.a.op("XORPS", ops...) }
-func (o Opcodes) Pcmpestri(ops ...Operand)       { o.a.op("PCMPESTRI", ops...) }
-func (o Opcodes) PCMPESTRI(ops ...Operand)       { o.a.op("PCMPESTRI", ops...) }
-func (o Opcodes) Retfw(ops ...Operand)           { o.a.op("RETFW", ops...) }
-func (o Opcodes) RETFW(ops ...Operand)           { o.a.op("RETFW", ops...) }
-func (o Opcodes) Retfl(ops ...Operand)           { o.a.op("RETFL", ops...) }
-func (o Opcodes) RETFL(ops ...Operand)           { o.a.op("RETFL", ops...) }
-func (o Opcodes) Retfq(ops ...Operand)           { o.a.op("RETFQ", ops...) }
-func (o Opcodes) RETFQ(ops ...Operand)           { o.a.op("RETFQ", ops...) }
-func (o Opcodes) Swapgs(ops ...Operand)          { o.a.op("SWAPGS", ops...) }
-func (o Opcodes) SWAPGS(ops ...Operand)          { o.a.op("SWAPGS", ops...) }
-func (o Opcodes) Crc32b(ops ...Operand)          { o.a.op("CRC32B", ops...) }
-func (o Opcodes) CRC32B(ops ...Operand)          { o.a.op("CRC32B", ops...) }
-func (o Opcodes) Crc32q(ops ...Operand)          { o.a.op("CRC32Q", ops...) }
-func (o Opcodes) CRC32Q(ops ...Operand)          { o.a.op("CRC32Q", ops...) }
-func (o Opcodes) Imul3q(ops ...Operand)          { o.a.op("IMUL3Q", ops...) }
-func (o Opcodes) IMUL3Q(ops ...Operand)          { o.a.op("IMUL3Q", ops...) }
-func (o Opcodes) Prefetcht0(ops ...Operand)      { o.a.op("PREFETCHT0", ops...) }
-func (o Opcodes) PREFETCHT0(ops ...Operand)      { o.a.op("PREFETCHT0", ops...) }
-func (o Opcodes) Prefetcht1(ops ...Operand)      { o.a.op("PREFETCHT1", ops...) }
-func (o Opcodes) PREFETCHT1(ops ...Operand)      { o.a.op("PREFETCHT1", ops...) }
-func (o Opcodes) Prefetcht2(ops ...Operand)      { o.a.op("PREFETCHT2", ops...) }
-func (o Opcodes) PREFETCHT2(ops ...Operand)      { o.a.op("PREFETCHT2", ops...) }
-func (o Opcodes) Prefetchnta(ops ...Operand)     { o.a.op("PREFETCHNTA", ops...) }
-func (o Opcodes) PREFETCHNTA(ops ...Operand)     { o.a.op("PREFETCHNTA", ops...) }
-func (o Opcodes) Movql(ops ...Operand)           { o.a.op("MOVQL", ops...) }
-func (o Opcodes) MOVQL(ops ...Operand)           { o.a.op("MOVQL", ops...) }
-func (o Opcodes) Bswapl(ops ...Operand)          { o.a.op("BSWAPL", ops...) }
-func (o Opcodes) BSWAPL(ops ...Operand)          { o.a.op("BSWAPL", ops...) }
-func (o Opcodes) Bswapq(ops ...Operand)          { o.a.op("BSWAPQ", ops...) }
-func (o Opcodes) BSWAPQ(ops ...Operand)          { o.a.op("BSWAPQ", ops...) }
-func (o Opcodes) Aesenc(ops ...Operand)          { o.a.op("AESENC", ops...) }
-func (o Opcodes) AESENC(ops ...Operand)          { o.a.op("AESENC", ops...) }
-func (o Opcodes) Aesenclast(ops ...Operand)      { o.a.op("AESENCLAST", ops...) }
-func (o Opcodes) AESENCLAST(ops ...Operand)      { o.a.op("AESENCLAST", ops...) }
-func (o Opcodes) Aesdec(ops ...Operand)          { o.a.op("AESDEC", ops...) }
-func (o Opcodes) AESDEC(ops ...Operand)          { o.a.op("AESDEC", ops...) }
-func (o Opcodes) Aesdeclast(ops ...Operand)      { o.a.op("AESDECLAST", ops...) }
-func (o Opcodes) AESDECLAST(ops ...Operand)      { o.a.op("AESDECLAST", ops...) }
-func (o Opcodes) Aesimc(ops ...Operand)          { o.a.op("AESIMC", ops...) }
-func (o Opcodes) AESIMC(ops ...Operand)          { o.a.op("AESIMC", ops...) }
-func (o Opcodes) Aeskeygenassist(ops ...Operand) { o.a.op("AESKEYGENASSIST", ops...) }
-func (o Opcodes) AESKEYGENASSIST(ops ...Operand) { o.a.op("AESKEYGENASSIST", ops...) }
-func (o Opcodes) Roundps(ops ...Operand)         { o.a.op("ROUNDPS", ops...) }
-func (o Opcodes) ROUNDPS(ops ...Operand)         { o.a.op("ROUNDPS", ops...) }
-func (o Opcodes) Roundss(ops ...Operand)         { o.a.op("ROUNDSS", ops...) }
-func (o Opcodes) ROUNDSS(ops ...Operand)         { o.a.op("ROUNDSS", ops...) }
-func (o Opcodes) Roundpd(ops ...Operand)         { o.a.op("ROUNDPD", ops...) }
-func (o Opcodes) ROUNDPD(ops ...Operand)         { o.a.op("ROUNDPD", ops...) }
-func (o Opcodes) Roundsd(ops ...Operand)         { o.a.op("ROUNDSD", ops...) }
-func (o Opcodes) ROUNDSD(ops ...Operand)         { o.a.op("ROUNDSD", ops...) }
-func (o Opcodes) Movddup(ops ...Operand)         { o.a.op("MOVDDUP", ops...) }
-func (o Opcodes) MOVDDUP(ops ...Operand)         { o.a.op("MOVDDUP", ops...) }
-func (o Opcodes) Movshdup(ops ...Operand)        { o.a.op("MOVSHDUP", ops...) }
-func (o Opcodes) MOVSHDUP(ops ...Operand)        { o.a.op("MOVSHDUP", ops...) }
-func (o Opcodes) Movsldup(ops ...Operand)        { o.a.op("MOVSLDUP", ops...) }
-func (o Opcodes) MOVSLDUP(ops ...Operand)        { o.a.op("MOVSLDUP", ops...) }
-func (o Opcodes) Pshufd(ops ...Operand)          { o.a.op("PSHUFD", ops...) }
-func (o Opcodes) PSHUFD(ops ...Operand)          { o.a.op("PSHUFD", ops...) }
-func (o Opcodes) Pclmulqdq(ops ...Operand)       { o.a.op("PCLMULQDQ", ops...) }
-func (o Opcodes) PCLMULQDQ(ops ...Operand)       { o.a.op("PCLMULQDQ", ops...) }
-func (o Opcodes) Vzeroupper(ops ...Operand)      { o.a.op("VZEROUPPER", ops...) }
-func (o Opcodes) VZEROUPPER(ops ...Operand)      { o.a.op("VZEROUPPER", ops...) }
-func (o Opcodes) Vmovdqu(ops ...Operand)         { o.a.op("VMOVDQU", ops...) }
-func (o Opcodes) VMOVDQU(ops ...Operand)         { o.a.op("VMOVDQU", ops...) }
-func (o Opcodes) Vmovntdq(ops ...Operand)        { o.a.op("VMOVNTDQ", ops...) }
-func (o Opcodes) VMOVNTDQ(ops ...Operand)        { o.a.op("VMOVNTDQ", ops...) }
-func (o Opcodes) Vmovdqa(ops ...Operand)         { o.a.op("VMOVDQA", ops...) }
-func (o Opcodes) VMOVDQA(ops ...Operand)         { o.a.op("VMOVDQA", ops...) }
-func (o Opcodes) Vpcmpeqb(ops ...Operand)        { o.a.op("VPCMPEQB", ops...) }
-func (o Opcodes) VPCMPEQB(ops ...Operand)        { o.a.op("VPCMPEQB", ops...) }
-func (o Opcodes) Vpxor(ops ...Operand)           { o.a.op("VPXOR", ops...) }
-func (o Opcodes) VPXOR(ops ...Operand)           { o.a.op("VPXOR", ops...) }
-func (o Opcodes) Vpmovmskb(ops ...Operand)       { o.a.op("VPMOVMSKB", ops...) }
-func (o Opcodes) VPMOVMSKB(ops ...Operand)       { o.a.op("VPMOVMSKB", ops...) }
-func (o Opcodes) Vpand(ops ...Operand)           { o.a.op("VPAND", ops...) }
-func (o Opcodes) VPAND(ops ...Operand)           { o.a.op("VPAND", ops...) }
-func (o Opcodes) Vptest(ops ...Operand)          { o.a.op("VPTEST", ops...) }
-func (o Opcodes) VPTEST(ops ...Operand)          { o.a.op("VPTEST", ops...) }
-func (o Opcodes) Vpbroadcastb(ops ...Operand)    { o.a.op("VPBROADCASTB", ops...) }
-func (o Opcodes) VPBROADCASTB(ops ...Operand)    { o.a.op("VPBROADCASTB", ops...) }
-func (o Opcodes) Vpshufb(ops ...Operand)         { o.a.op("VPSHUFB", ops...) }
-func (o Opcodes) VPSHUFB(ops ...Operand)         { o.a.op("VPSHUFB", ops...) }
-func (o Opcodes) Vpshufd(ops ...Operand)         { o.a.op("VPSHUFD", ops...) }
-func (o Opcodes) VPSHUFD(ops ...Operand)         { o.a.op("VPSHUFD", ops...) }
-func (o Opcodes) Vperm2f128(ops ...Operand)      { o.a.op("VPERM2F128", ops...) }
-func (o Opcodes) VPERM2F128(ops ...Operand)      { o.a.op("VPERM2F128", ops...) }
-func (o Opcodes) Vpalignr(ops ...Operand)        { o.a.op("VPALIGNR", ops...) }
-func (o Opcodes) VPALIGNR(ops ...Operand)        { o.a.op("VPALIGNR", ops...) }
-func (o Opcodes) Vpaddq(ops ...Operand)          { o.a.op("VPADDQ", ops...) }
-func (o Opcodes) VPADDQ(ops ...Operand)          { o.a.op("VPADDQ", ops...) }
-func (o Opcodes) Vpaddd(ops ...Operand)          { o.a.op("VPADDD", ops...) }
-func (o Opcodes) VPADDD(ops ...Operand)          { o.a.op("VPADDD", ops...) }
-func (o Opcodes) Vpsrldq(ops ...Operand)         { o.a.op("VPSRLDQ", ops...) }
-func (o Opcodes) VPSRLDQ(ops ...Operand)         { o.a.op("VPSRLDQ", ops...) }
-func (o Opcodes) Vpslldq(ops ...Operand)         { o.a.op("VPSLLDQ", ops...) }
-func (o Opcodes) VPSLLDQ(ops ...Operand)         { o.a.op("VPSLLDQ", ops...) }
-func (o Opcodes) Vpsrlq(ops ...Operand)          { o.a.op("VPSRLQ", ops...) }
-func (o Opcodes) VPSRLQ(ops ...Operand)          { o.a.op("VPSRLQ", ops...) }
-func (o Opcodes) Vpsllq(ops ...Operand)          { o.a.op("VPSLLQ", ops...) }
-func (o Opcodes) VPSLLQ(ops ...Operand)          { o.a.op("VPSLLQ", ops...) }
-func (o Opcodes) Vpsrld(ops ...Operand)          { o.a.op("VPSRLD", ops...) }
-func (o Opcodes) VPSRLD(ops ...Operand)          { o.a.op("VPSRLD", ops...) }
-func (o Opcodes) Vpslld(ops ...Operand)          { o.a.op("VPSLLD", ops...) }
-func (o Opcodes) VPSLLD(ops ...Operand)          { o.a.op("VPSLLD", ops...) }
-func (o Opcodes) Vpor(ops ...Operand)            { o.a.op("VPOR", ops...) }
-func (o Opcodes) VPOR(ops ...Operand)            { o.a.op("VPOR", ops...) }
-func (o Opcodes) Vpblendd(ops ...Operand)        { o.a.op("VPBLENDD", ops...) }
-func (o Opcodes) VPBLENDD(ops ...Operand)        { o.a.op("VPBLENDD", ops...) }
-func (o Opcodes) Vinserti128(ops ...Operand)     { o.a.op("VINSERTI128", ops...) }
-func (o Opcodes) VINSERTI128(ops ...Operand)     { o.a.op("VINSERTI128", ops...) }
-func (o Opcodes) Vperm2i128(ops ...Operand)      { o.a.op("VPERM2I128", ops...) }
-func (o Opcodes) VPERM2I128(ops ...Operand)      { o.a.op("VPERM2I128", ops...) }
-func (o Opcodes) Rorxl(ops ...Operand)           { o.a.op("RORXL", ops...) }
-func (o Opcodes) RORXL(ops ...Operand)           { o.a.op("RORXL", ops...) }
-func (o Opcodes) Rorxq(ops ...Operand)           { o.a.op("RORXQ", ops...) }
-func (o Opcodes) RORXQ(ops ...Operand)           { o.a.op("RORXQ", ops...) }
-func (o Opcodes) Vbroadcastss(ops ...Operand)    { o.a.op("VBROADCASTSS", ops...) }
-func (o Opcodes) VBROADCASTSS(ops ...Operand)    { o.a.op("VBROADCASTSS", ops...) }
-func (o Opcodes) Vbroadcastsd(ops ...Operand)    { o.a.op("VBROADCASTSD", ops...) }
-func (o Opcodes) VBROADCASTSD(ops ...Operand)    { o.a.op("VBROADCASTSD", ops...) }
-func (o Opcodes) Vmovddup(ops ...Operand)        { o.a.op("VMOVDDUP", ops...) }
-func (o Opcodes) VMOVDDUP(ops ...Operand)        { o.a.op("VMOVDDUP", ops...) }
-func (o Opcodes) Vmovshdup(ops ...Operand)       { o.a.op("VMOVSHDUP", ops...) }
-func (o Opcodes) VMOVSHDUP(ops ...Operand)       { o.a.op("VMOVSHDUP", ops...) }
-func (o Opcodes) Vmovsldup(ops ...Operand)       { o.a.op("VMOVSLDUP", ops...) }
-func (o Opcodes) VMOVSLDUP(ops ...Operand)       { o.a.op("VMOVSLDUP", ops...) }
-func (o Opcodes) Jcxzw(ops ...Operand)           { o.a.op("JCXZW", ops...) }
-func (o Opcodes) JCXZW(ops ...Operand)           { o.a.op("JCXZW", ops...) }
-func (o Opcodes) Fcmovcc(ops ...Operand)         { o.a.op("FCMOVCC", ops...) }
-func (o Opcodes) FCMOVCC(ops ...Operand)         { o.a.op("FCMOVCC", ops...) }
-func (o Opcodes) Fcmovcs(ops ...Operand)         { o.a.op("FCMOVCS", ops...) }
-func (o Opcodes) FCMOVCS(ops ...Operand)         { o.a.op("FCMOVCS", ops...) }
-func (o Opcodes) Fcmoveq(ops ...Operand)         { o.a.op("FCMOVEQ", ops...) }
-func (o Opcodes) FCMOVEQ(ops ...Operand)         { o.a.op("FCMOVEQ", ops...) }
-func (o Opcodes) Fcmovhi(ops ...Operand)         { o.a.op("FCMOVHI", ops...) }
-func (o Opcodes) FCMOVHI(ops ...Operand)         { o.a.op("FCMOVHI", ops...) }
-func (o Opcodes) Fcmovls(ops ...Operand)         { o.a.op("FCMOVLS", ops...) }
-func (o Opcodes) FCMOVLS(ops ...Operand)         { o.a.op("FCMOVLS", ops...) }
-func (o Opcodes) Fcmovne(ops ...Operand)         { o.a.op("FCMOVNE", ops...) }
-func (o Opcodes) FCMOVNE(ops ...Operand)         { o.a.op("FCMOVNE", ops...) }
-func (o Opcodes) Fcmovnu(ops ...Operand)         { o.a.op("FCMOVNU", ops...) }
-func (o Opcodes) FCMOVNU(ops ...Operand)         { o.a.op("FCMOVNU", ops...) }
-func (o Opcodes) Fcmovun(ops ...Operand)         { o.a.op("FCMOVUN", ops...) }
-func (o Opcodes) FCMOVUN(ops ...Operand)         { o.a.op("FCMOVUN", ops...) }
-func (o Opcodes) Fcomi(ops ...Operand)           { o.a.op("FCOMI", ops...) }
-func (o Opcodes) FCOMI(ops ...Operand)           { o.a.op("FCOMI", ops...) }
-func (o Opcodes) Fcomip(ops ...Operand)          { o.a.op("FCOMIP", ops...) }
-func (o Opcodes) FCOMIP(ops ...Operand)          { o.a.op("FCOMIP", ops...) }
-func (o Opcodes) Fucomi(ops ...Operand)          { o.a.op("FUCOMI", ops...) }
-func (o Opcodes) FUCOMI(ops ...Operand)          { o.a.op("FUCOMI", ops...) }
-func (o Opcodes) Fucomip(ops ...Operand)         { o.a.op("FUCOMIP", ops...) }
-func (o Opcodes) FUCOMIP(ops ...Operand)         { o.a.op("FUCOMIP", ops...) }
-func (o Opcodes) Xacquire(ops ...Operand)        { o.a.op("XACQUIRE", ops...) }
-func (o Opcodes) XACQUIRE(ops ...Operand)        { o.a.op("XACQUIRE", ops...) }
-func (o Opcodes) Xrelease(ops ...Operand)        { o.a.op("XRELEASE", ops...) }
-func (o Opcodes) XRELEASE(ops ...Operand)        { o.a.op("XRELEASE", ops...) }
-func (o Opcodes) Xbegin(ops ...Operand)          { o.a.op("XBEGIN", ops...) }
-func (o Opcodes) XBEGIN(ops ...Operand)          { o.a.op("XBEGIN", ops...) }
-func (o Opcodes) Xend(ops ...Operand)            { o.a.op("XEND", ops...) }
-func (o Opcodes) XEND(ops ...Operand)            { o.a.op("XEND", ops...) }
-func (o Opcodes) Xabort(ops ...Operand)          { o.a.op("XABORT", ops...) }
-func (o Opcodes) XABORT(ops ...Operand)          { o.a.op("XABORT", ops...) }
-func (o Opcodes) Xtest(ops ...Operand)           { o.a.op("XTEST", ops...) }
-func (o Opcodes) XTEST(ops ...Operand)           { o.a.op("XTEST", ops...) }
-func (o Opcodes) Last(ops ...Operand)            { o.a.op("LAST", ops...) }
-func (o Opcodes) LAST(ops ...Operand)            { o.a.op("LAST", ops...) }
+func (o Opcodes) Aad(ops ...Operand)              { o.a.op("AAD", ops...) }
+func (o Opcodes) AAD(ops ...Operand)              { o.a.op("AAD", ops...) }
+func (o Opcodes) Aam(ops ...Operand)              { o.a.op("AAM", ops...) }
+func (o Opcodes) AAM(ops ...Operand)              { o.a.op("AAM", ops...) }
+func (o Opcodes) Aas(ops ...Operand)              { o.a.op("AAS", ops...) }
+func (o Opcodes) AAS(ops ...Operand)              { o.a.op("AAS", ops...) }
+func (o Opcodes) Adcb(ops ...Operand)             { o.a.op("ADCB", ops...) }
+func (o Opcodes) ADCB(ops ...Operand)             { o.a.op("ADCB", ops...) }
+func (o Opcodes) Adcl(ops ...Operand)             { o.a.op("ADCL", ops...) }
+func (o Opcodes) ADCL(ops ...Operand)             { o.a.op("ADCL", ops...) }
+func (o Opcodes) Adcq(ops ...Operand)             { o.a.op("ADCQ", ops...) }
+func (o Opcodes) ADCQ(ops ...Operand)             { o.a.op("ADCQ", ops...) }
+func (o Opcodes) Adcw(ops ...Operand)             { o.a.op("ADCW", ops...) }
+func (o Opcodes) ADCW(ops ...Operand)             { o.a.op("ADCW", ops...) }
+func (o Opcodes) Adcxl(ops ...Operand)            { o.a.op("ADCXL", ops...) }
+func (o Opcodes) ADCXL(ops ...Operand)            { o.a.op("ADCXL", ops...) }
+func (o Opcodes) Adcxq(ops ...Operand)            { o.a.op("ADCXQ", ops...) }
+func (o Opcodes) ADCXQ(ops ...Operand)            { o.a.op("ADCXQ", ops...) }
+func (o Opcodes) Addb(ops ...Operand)             { o.a.op("ADDB", ops...) }
+func (o Opcodes) ADDB(ops ...Operand)             { o.a.op("ADDB", ops...) }
+func (o Opcodes) Addl(ops ...Operand)             { o.a.op("ADDL", ops...) }
+func (o Opcodes) ADDL(ops ...Operand)             { o.a.op("ADDL", ops...) }
+func (o Opcodes) Addpd(ops ...Operand)            { o.a.op("ADDPD", ops...) }
+func (o Opcodes) ADDPD(ops ...Operand)            { o.a.op("ADDPD", ops...) }
+func (o Opcodes) Addps(ops ...Operand)            { o.a.op("ADDPS", ops...) }
+func (o Opcodes) ADDPS(ops ...Operand)            { o.a.op("ADDPS", ops...) }
+func (o Opcodes) Addq(ops ...Operand)             { o.a.op("ADDQ", ops...) }
+func (o Opcodes) ADDQ(ops ...Operand)             { o.a.op("ADDQ", ops...) }
+func (o Opcodes) Addsd(ops ...Operand)            { o.a.op("ADDSD", ops...) }
+func (o Opcodes) ADDSD(ops ...Operand)            { o.a.op("ADDSD", ops...) }
+func (o Opcodes) Addss(ops ...Operand)            { o.a.op("ADDSS", ops...) }
+func (o Opcodes) ADDSS(ops ...Operand)            { o.a.op("ADDSS", ops...) }
+func (o Opcodes) Addsubpd(ops ...Operand)         { o.a.op("ADDSUBPD", ops...) }
+func (o Opcodes) ADDSUBPD(ops ...Operand)         { o.a.op("ADDSUBPD", ops...) }
+func (o Opcodes) Addsubps(ops ...Operand)         { o.a.op("ADDSUBPS", ops...) }
+func (o Opcodes) ADDSUBPS(ops ...Operand)         { o.a.op("ADDSUBPS", ops...) }
+func (o Opcodes) Addw(ops ...Operand)             { o.a.op("ADDW", ops...) }
+func (o Opcodes) ADDW(ops ...Operand)             { o.a.op("ADDW", ops...) }
+func (o Opcodes) Adjsp(ops ...Operand)            { o.a.op("ADJSP", ops...) }
+func (o Opcodes) ADJSP(ops ...Operand)            { o.a.op("ADJSP", ops...) }
+func (o Opcodes) Adoxl(ops ...Operand)            { o.a.op("ADOXL", ops...) }
+func (o Opcodes) ADOXL(ops ...Operand)            { o.a.op("ADOXL", ops...) }
+func (o Opcodes) Adoxq(ops ...Operand)            { o.a.op("ADOXQ", ops...) }
+func (o Opcodes) ADOXQ(ops ...Operand)            { o.a.op("ADOXQ", ops...) }
+func (o Opcodes) Aesdec(ops ...Operand)           { o.a.op("AESDEC", ops...) }
+func (o Opcodes) AESDEC(ops ...Operand)           { o.a.op("AESDEC", ops...) }
+func (o Opcodes) Aesdeclast(ops ...Operand)       { o.a.op("AESDECLAST", ops...) }
+func (o Opcodes) AESDECLAST(ops ...Operand)       { o.a.op("AESDECLAST", ops...) }
+func (o Opcodes) Aesenc(ops ...Operand)           { o.a.op("AESENC", ops...) }
+func (o Opcodes) AESENC(ops ...Operand)           { o.a.op("AESENC", ops...) }
+func (o Opcodes) Aesenclast(ops ...Operand)       { o.a.op("AESENCLAST", ops...) }
+func (o Opcodes) AESENCLAST(ops ...Operand)       { o.a.op("AESENCLAST", ops...) }
+func (o Opcodes) Aesimc(ops ...Operand)           { o.a.op("AESIMC", ops...) }
+func (o Opcodes) AESIMC(ops ...Operand)           { o.a.op("AESIMC", ops...) }
+func (o Opcodes) Aeskeygenassist(ops ...Operand)  { o.a.op("AESKEYGENASSIST", ops...) }
+func (o Opcodes) AESKEYGENASSIST(ops ...Operand)  { o.a.op("AESKEYGENASSIST", ops...) }
+func (o Opcodes) Andb(ops ...Operand)             { o.a.op("ANDB", ops...) }
+func (o Opcodes) ANDB(ops ...Operand)             { o.a.op("ANDB", ops...) }
+func (o Opcodes) Andl(ops ...Operand)             { o.a.op("ANDL", ops...) }
+func (o Opcodes) ANDL(ops ...Operand)             { o.a.op("ANDL", ops...) }
+func (o Opcodes) Andnl(ops ...Operand)            { o.a.op("ANDNL", ops...) }
+func (o Opcodes) ANDNL(ops ...Operand)            { o.a.op("ANDNL", ops...) }
+func (o Opcodes) Andnpd(ops ...Operand)           { o.a.op("ANDNPD", ops...) }
+func (o Opcodes) ANDNPD(ops ...Operand)           { o.a.op("ANDNPD", ops...) }
+func (o Opcodes) Andnps(ops ...Operand)           { o.a.op("ANDNPS", ops...) }
+func (o Opcodes) ANDNPS(ops ...Operand)           { o.a.op("ANDNPS", ops...) }
+func (o Opcodes) Andnq(ops ...Operand)            { o.a.op("ANDNQ", ops...) }
+func (o Opcodes) ANDNQ(ops ...Operand)            { o.a.op("ANDNQ", ops...) }
+func (o Opcodes) Andpd(ops ...Operand)            { o.a.op("ANDPD", ops...) }
+func (o Opcodes) ANDPD(ops ...Operand)            { o.a.op("ANDPD", ops...) }
+func (o Opcodes) Andps(ops ...Operand)            { o.a.op("ANDPS", ops...) }
+func (o Opcodes) ANDPS(ops ...Operand)            { o.a.op("ANDPS", ops...) }
+func (o Opcodes) Andq(ops ...Operand)             { o.a.op("ANDQ", ops...) }
+func (o Opcodes) ANDQ(ops ...Operand)             { o.a.op("ANDQ", ops...) }
+func (o Opcodes) Andw(ops ...Operand)             { o.a.op("ANDW", ops...) }
+func (o Opcodes) ANDW(ops ...Operand)             { o.a.op("ANDW", ops...) }
+func (o Opcodes) Arpl(ops ...Operand)             { o.a.op("ARPL", ops...) }
+func (o Opcodes) ARPL(ops ...Operand)             { o.a.op("ARPL", ops...) }
+func (o Opcodes) Bextrl(ops ...Operand)           { o.a.op("BEXTRL", ops...) }
+func (o Opcodes) BEXTRL(ops ...Operand)           { o.a.op("BEXTRL", ops...) }
+func (o Opcodes) Bextrq(ops ...Operand)           { o.a.op("BEXTRQ", ops...) }
+func (o Opcodes) BEXTRQ(ops ...Operand)           { o.a.op("BEXTRQ", ops...) }
+func (o Opcodes) Blendpd(ops ...Operand)          { o.a.op("BLENDPD", ops...) }
+func (o Opcodes) BLENDPD(ops ...Operand)          { o.a.op("BLENDPD", ops...) }
+func (o Opcodes) Blendps(ops ...Operand)          { o.a.op("BLENDPS", ops...) }
+func (o Opcodes) BLENDPS(ops ...Operand)          { o.a.op("BLENDPS", ops...) }
+func (o Opcodes) Blsil(ops ...Operand)            { o.a.op("BLSIL", ops...) }
+func (o Opcodes) BLSIL(ops ...Operand)            { o.a.op("BLSIL", ops...) }
+func (o Opcodes) Blsiq(ops ...Operand)            { o.a.op("BLSIQ", ops...) }
+func (o Opcodes) BLSIQ(ops ...Operand)            { o.a.op("BLSIQ", ops...) }
+func (o Opcodes) Blsmskl(ops ...Operand)          { o.a.op("BLSMSKL", ops...) }
+func (o Opcodes) BLSMSKL(ops ...Operand)          { o.a.op("BLSMSKL", ops...) }
+func (o Opcodes) Blsmskq(ops ...Operand)          { o.a.op("BLSMSKQ", ops...) }
+func (o Opcodes) BLSMSKQ(ops ...Operand)          { o.a.op("BLSMSKQ", ops...) }
+func (o Opcodes) Blsrl(ops ...Operand)            { o.a.op("BLSRL", ops...) }
+func (o Opcodes) BLSRL(ops ...Operand)            { o.a.op("BLSRL", ops...) }
+func (o Opcodes) Blsrq(ops ...Operand)            { o.a.op("BLSRQ", ops...) }
+func (o Opcodes) BLSRQ(ops ...Operand)            { o.a.op("BLSRQ", ops...) }
+func (o Opcodes) Boundl(ops ...Operand)           { o.a.op("BOUNDL", ops...) }
+func (o Opcodes) BOUNDL(ops ...Operand)           { o.a.op("BOUNDL", ops...) }
+func (o Opcodes) Boundw(ops ...Operand)           { o.a.op("BOUNDW", ops...) }
+func (o Opcodes) BOUNDW(ops ...Operand)           { o.a.op("BOUNDW", ops...) }
+func (o Opcodes) Bsfl(ops ...Operand)             { o.a.op("BSFL", ops...) }
+func (o Opcodes) BSFL(ops ...Operand)             { o.a.op("BSFL", ops...) }
+func (o Opcodes) Bsfq(ops ...Operand)             { o.a.op("BSFQ", ops...) }
+func (o Opcodes) BSFQ(ops ...Operand)             { o.a.op("BSFQ", ops...) }
+func (o Opcodes) Bsfw(ops ...Operand)             { o.a.op("BSFW", ops...) }
+func (o Opcodes) BSFW(ops ...Operand)             { o.a.op("BSFW", ops...) }
+func (o Opcodes) Bsrl(ops ...Operand)             { o.a.op("BSRL", ops...) }
+func (o Opcodes) BSRL(ops ...Operand)             { o.a.op("BSRL", ops...) }
+func (o Opcodes) Bsrq(ops ...Operand)             { o.a.op("BSRQ", ops...) }
+func (o Opcodes) BSRQ(ops ...Operand)             { o.a.op("BSRQ", ops...) }
+func (o Opcodes) Bsrw(ops ...Operand)             { o.a.op("BSRW", ops...) }
+func (o Opcodes) BSRW(ops ...Operand)             { o.a.op("BSRW", ops...) }
+func (o Opcodes) Bswapl(ops ...Operand)           { o.a.op("BSWAPL", ops...) }
+func (o Opcodes) BSWAPL(ops ...Operand)           { o.a.op("BSWAPL", ops...) }
+func (o Opcodes) Bswapq(ops ...Operand)           { o.a.op("BSWAPQ", ops...) }
+func (o Opcodes) BSWAPQ(ops ...Operand)           { o.a.op("BSWAPQ", ops...) }
+func (o Opcodes) Btcl(ops ...Operand)             { o.a.op("BTCL", ops...) }
+func (o Opcodes) BTCL(ops ...Operand)             { o.a.op("BTCL", ops...) }
+func (o Opcodes) Btcq(ops ...Operand)             { o.a.op("BTCQ", ops...) }
+func (o Opcodes) BTCQ(ops ...Operand)             { o.a.op("BTCQ", ops...) }
+func (o Opcodes) Btcw(ops ...Operand)             { o.a.op("BTCW", ops...) }
+func (o Opcodes) BTCW(ops ...Operand)             { o.a.op("BTCW", ops...) }
+func (o Opcodes) Btl(ops ...Operand)              { o.a.op("BTL", ops...) }
+func (o Opcodes) BTL(ops ...Operand)              { o.a.op("BTL", ops...) }
+func (o Opcodes) Btq(ops ...Operand)              { o.a.op("BTQ", ops...) }
+func (o Opcodes) BTQ(ops ...Operand)              { o.a.op("BTQ", ops...) }
+func (o Opcodes) Btrl(ops ...Operand)             { o.a.op("BTRL", ops...) }
+func (o Opcodes) BTRL(ops ...Operand)             { o.a.op("BTRL", ops...) }
+func (o Opcodes) Btrq(ops ...Operand)             { o.a.op("BTRQ", ops...) }
+func (o Opcodes) BTRQ(ops ...Operand)             { o.a.op("BTRQ", ops...) }
+func (o Opcodes) Btrw(ops ...Operand)             { o.a.op("BTRW", ops...) }
+func (o Opcodes) BTRW(ops ...Operand)             { o.a.op("BTRW", ops...) }
+func (o Opcodes) Btsl(ops ...Operand)             { o.a.op("BTSL", ops...) }
+func (o Opcodes) BTSL(ops ...Operand)             { o.a.op("BTSL", ops...) }
+func (o Opcodes) Btsq(ops ...Operand)             { o.a.op("BTSQ", ops...) }
+func (o Opcodes) BTSQ(ops ...Operand)             { o.a.op("BTSQ", ops...) }
+func (o Opcodes) Btsw(ops ...Operand)             { o.a.op("BTSW", ops...) }
+func (o Opcodes) BTSW(ops ...Operand)             { o.a.op("BTSW", ops...) }
+func (o Opcodes) Btw(ops ...Operand)              { o.a.op("BTW", ops...) }
+func (o Opcodes) BTW(ops ...Operand)              { o.a.op("BTW", ops...) }
+func (o Opcodes) Byte(ops ...Operand)             { o.a.op("BYTE", ops...) }
+func (o Opcodes) BYTE(ops ...Operand)             { o.a.op("BYTE", ops...) }
+func (o Opcodes) Bzhil(ops ...Operand)            { o.a.op("BZHIL", ops...) }
+func (o Opcodes) BZHIL(ops ...Operand)            { o.a.op("BZHIL", ops...) }
+func (o Opcodes) Bzhiq(ops ...Operand)            { o.a.op("BZHIQ", ops...) }
+func (o Opcodes) BZHIQ(ops ...Operand)            { o.a.op("BZHIQ", ops...) }
+func (o Opcodes) Cdq(ops ...Operand)              { o.a.op("CDQ", ops...) }
+func (o Opcodes) CDQ(ops ...Operand)              { o.a.op("CDQ", ops...) }
+func (o Opcodes) Clc(ops ...Operand)              { o.a.op("CLC", ops...) }
+func (o Opcodes) CLC(ops ...Operand)              { o.a.op("CLC", ops...) }
+func (o Opcodes) Cld(ops ...Operand)              { o.a.op("CLD", ops...) }
+func (o Opcodes) CLD(ops ...Operand)              { o.a.op("CLD", ops...) }
+func (o Opcodes) Clflush(ops ...Operand)          { o.a.op("CLFLUSH", ops...) }
+func (o Opcodes) CLFLUSH(ops ...Operand)          { o.a.op("CLFLUSH", ops...) }
+func (o Opcodes) Cli(ops ...Operand)              { o.a.op("CLI", ops...) }
+func (o Opcodes) CLI(ops ...Operand)              { o.a.op("CLI", ops...) }
+func (o Opcodes) Clts(ops ...Operand)             { o.a.op("CLTS", ops...) }
+func (o Opcodes) CLTS(ops ...Operand)             { o.a.op("CLTS", ops...) }
+func (o Opcodes) Cmc(ops ...Operand)              { o.a.op("CMC", ops...) }
+func (o Opcodes) CMC(ops ...Operand)              { o.a.op("CMC", ops...) }
+func (o Opcodes) Cmovlcc(ops ...Operand)          { o.a.op("CMOVLCC", ops...) }
+func (o Opcodes) CMOVLCC(ops ...Operand)          { o.a.op("CMOVLCC", ops...) }
+func (o Opcodes) Cmovlcs(ops ...Operand)          { o.a.op("CMOVLCS", ops...) }
+func (o Opcodes) CMOVLCS(ops ...Operand)          { o.a.op("CMOVLCS", ops...) }
+func (o Opcodes) Cmovleq(ops ...Operand)          { o.a.op("CMOVLEQ", ops...) }
+func (o Opcodes) CMOVLEQ(ops ...Operand)          { o.a.op("CMOVLEQ", ops...) }
+func (o Opcodes) Cmovlge(ops ...Operand)          { o.a.op("CMOVLGE", ops...) }
+func (o Opcodes) CMOVLGE(ops ...Operand)          { o.a.op("CMOVLGE", ops...) }
+func (o Opcodes) Cmovlgt(ops ...Operand)          { o.a.op("CMOVLGT", ops...) }
+func (o Opcodes) CMOVLGT(ops ...Operand)          { o.a.op("CMOVLGT", ops...) }
+func (o Opcodes) Cmovlhi(ops ...Operand)          { o.a.op("CMOVLHI", ops...) }
+func (o Opcodes) CMOVLHI(ops ...Operand)          { o.a.op("CMOVLHI", ops...) }
+func (o Opcodes) Cmovlle(ops ...Operand)          { o.a.op("CMOVLLE", ops...) }
+func (o Opcodes) CMOVLLE(ops ...Operand)          { o.a.op("CMOVLLE", ops...) }
+func (o Opcodes) Cmovlls(ops ...Operand)          { o.a.op("CMOVLLS", ops...) }
+func (o Opcodes) CMOVLLS(ops ...Operand)          { o.a.op("CMOVLLS", ops...) }
+func (o Opcodes) Cmovllt(ops ...Operand)          { o.a.op("CMOVLLT", ops...) }
+func (o Opcodes) CMOVLLT(ops ...Operand)          { o.a.op("CMOVLLT", ops...) }
+func (o Opcodes) Cmovlmi(ops ...Operand)          { o.a.op("CMOVLMI", ops...) }
+func (o Opcodes) CMOVLMI(ops ...Operand)          { o.a.op("CMOVLMI", ops...) }
+func (o Opcodes) Cmovlne(ops ...Operand)          { o.a.op("CMOVLNE", ops...) }
+func (o Opcodes) CMOVLNE(ops ...Operand)          { o.a.op("CMOVLNE", ops...) }
+func (o Opcodes) Cmovloc(ops ...Operand)          { o.a.op("CMOVLOC", ops...) }
+func (o Opcodes) CMOVLOC(ops ...Operand)          { o.a.op("CMOVLOC", ops...) }
+func (o Opcodes) Cmovlos(ops ...Operand)          { o.a.op("CMOVLOS", ops...) }
+func (o Opcodes) CMOVLOS(ops ...Operand)          { o.a.op("CMOVLOS", ops...) }
+func (o Opcodes) Cmovlpc(ops ...Operand)          { o.a.op("CMOVLPC", ops...) }
+func (o Opcodes) CMOVLPC(ops ...Operand)          { o.a.op("CMOVLPC", ops...) }
+func (o Opcodes) Cmovlpl(ops ...Operand)          { o.a.op("CMOVLPL", ops...) }
+func (o Opcodes) CMOVLPL(ops ...Operand)          { o.a.op("CMOVLPL", ops...) }
+func (o Opcodes) Cmovlps(ops ...Operand)          { o.a.op("CMOVLPS", ops...) }
+func (o Opcodes) CMOVLPS(ops ...Operand)          { o.a.op("CMOVLPS", ops...) }
+func (o Opcodes) Cmovqcc(ops ...Operand)          { o.a.op("CMOVQCC", ops...) }
+func (o Opcodes) CMOVQCC(ops ...Operand)          { o.a.op("CMOVQCC", ops...) }
+func (o Opcodes) Cmovqcs(ops ...Operand)          { o.a.op("CMOVQCS", ops...) }
+func (o Opcodes) CMOVQCS(ops ...Operand)          { o.a.op("CMOVQCS", ops...) }
+func (o Opcodes) Cmovqeq(ops ...Operand)          { o.a.op("CMOVQEQ", ops...) }
+func (o Opcodes) CMOVQEQ(ops ...Operand)          { o.a.op("CMOVQEQ", ops...) }
+func (o Opcodes) Cmovqge(ops ...Operand)          { o.a.op("CMOVQGE", ops...) }
+func (o Opcodes) CMOVQGE(ops ...Operand)          { o.a.op("CMOVQGE", ops...) }
+func (o Opcodes) Cmovqgt(ops ...Operand)          { o.a.op("CMOVQGT", ops...) }
+func (o Opcodes) CMOVQGT(ops ...Operand)          { o.a.op("CMOVQGT", ops...) }
+func (o Opcodes) Cmovqhi(ops ...Operand)          { o.a.op("CMOVQHI", ops...) }
+func (o Opcodes) CMOVQHI(ops ...Operand)          { o.a.op("CMOVQHI", ops...) }
+func (o Opcodes) Cmovqle(ops ...Operand)          { o.a.op("CMOVQLE", ops...) }
+func (o Opcodes) CMOVQLE(ops ...Operand)          { o.a.op("CMOVQLE", ops...) }
+func (o Opcodes) Cmovqls(ops ...Operand)          { o.a.op("CMOVQLS", ops...) }
+func (o Opcodes) CMOVQLS(ops ...Operand)          { o.a.op("CMOVQLS", ops...) }
+func (o Opcodes) Cmovqlt(ops ...Operand)          { o.a.op("CMOVQLT", ops...) }
+func (o Opcodes) CMOVQLT(ops ...Operand)          { o.a.op("CMOVQLT", ops...) }
+func (o Opcodes) Cmovqmi(ops ...Operand)          { o.a.op("CMOVQMI", ops...) }
+func (o Opcodes) CMOVQMI(ops ...Operand)          { o.a.op("CMOVQMI", ops...) }
+func (o Opcodes) Cmovqne(ops ...Operand)          { o.a.op("CMOVQNE", ops...) }
+func (o Opcodes) CMOVQNE(ops ...Operand)          { o.a.op("CMOVQNE", ops...) }
+func (o Opcodes) Cmovqoc(ops ...Operand)          { o.a.op("CMOVQOC", ops...) }
+func (o Opcodes) CMOVQOC(ops ...Operand)          { o.a.op("CMOVQOC", ops...) }
+func (o Opcodes) Cmovqos(ops ...Operand)          { o.a.op("CMOVQOS", ops...) }
+func (o Opcodes) CMOVQOS(ops ...Operand)          { o.a.op("CMOVQOS", ops...) }
+func (o Opcodes) Cmovqpc(ops ...Operand)          { o.a.op("CMOVQPC", ops...) }
+func (o Opcodes) CMOVQPC(ops ...Operand)          { o.a.op("CMOVQPC", ops...) }
+func (o Opcodes) Cmovqpl(ops ...Operand)          { o.a.op("CMOVQPL", ops...) }
+func (o Opcodes) CMOVQPL(ops ...Operand)          { o.a.op("CMOVQPL", ops...) }
+func (o Opcodes) Cmovqps(ops ...Operand)          { o.a.op("CMOVQPS", ops...) }
+func (o Opcodes) CMOVQPS(ops ...Operand)          { o.a.op("CMOVQPS", ops...) }
+func (o Opcodes) Cmovwcc(ops ...Operand)          { o.a.op("CMOVWCC", ops...) }
+func (o Opcodes) CMOVWCC(ops ...Operand)          { o.a.op("CMOVWCC", ops...) }
+func (o Opcodes) Cmovwcs(ops ...Operand)          { o.a.op("CMOVWCS", ops...) }
+func (o Opcodes) CMOVWCS(ops ...Operand)          { o.a.op("CMOVWCS", ops...) }
+func (o Opcodes) Cmovweq(ops ...Operand)          { o.a.op("CMOVWEQ", ops...) }
+func (o Opcodes) CMOVWEQ(ops ...Operand)          { o.a.op("CMOVWEQ", ops...) }
+func (o Opcodes) Cmovwge(ops ...Operand)          { o.a.op("CMOVWGE", ops...) }
+func (o Opcodes) CMOVWGE(ops ...Operand)          { o.a.op("CMOVWGE", ops...) }
+func (o Opcodes) Cmovwgt(ops ...Operand)          { o.a.op("CMOVWGT", ops...) }
+func (o Opcodes) CMOVWGT(ops ...Operand)          { o.a.op("CMOVWGT", ops...) }
+func (o Opcodes) Cmovwhi(ops ...Operand)          { o.a.op("CMOVWHI", ops...) }
+func (o Opcodes) CMOVWHI(ops ...Operand)          { o.a.op("CMOVWHI", ops...) }
+func (o Opcodes) Cmovwle(ops ...Operand)          { o.a.op("CMOVWLE", ops...) }
+func (o Opcodes) CMOVWLE(ops ...Operand)          { o.a.op("CMOVWLE", ops...) }
+func (o Opcodes) Cmovwls(ops ...Operand)          { o.a.op("CMOVWLS", ops...) }
+func (o Opcodes) CMOVWLS(ops ...Operand)          { o.a.op("CMOVWLS", ops...) }
+func (o Opcodes) Cmovwlt(ops ...Operand)          { o.a.op("CMOVWLT", ops...) }
+func (o Opcodes) CMOVWLT(ops ...Operand)          { o.a.op("CMOVWLT", ops...) }
+func (o Opcodes) Cmovwmi(ops ...Operand)          { o.a.op("CMOVWMI", ops...) }
+func (o Opcodes) CMOVWMI(ops ...Operand)          { o.a.op("CMOVWMI", ops...) }
+func (o Opcodes) Cmovwne(ops ...Operand)          { o.a.op("CMOVWNE", ops...) }
+func (o Opcodes) CMOVWNE(ops ...Operand)          { o.a.op("CMOVWNE", ops...) }
+func (o Opcodes) Cmovwoc(ops ...Operand)          { o.a.op("CMOVWOC", ops...) }
+func (o Opcodes) CMOVWOC(ops ...Operand)          { o.a.op("CMOVWOC", ops...) }
+func (o Opcodes) Cmovwos(ops ...Operand)          { o.a.op("CMOVWOS", ops...) }
+func (o Opcodes) CMOVWOS(ops ...Operand)          { o.a.op("CMOVWOS", ops...) }
+func (o Opcodes) Cmovwpc(ops ...Operand)          { o.a.op("CMOVWPC", ops...) }
+func (o Opcodes) CMOVWPC(ops ...Operand)          { o.a.op("CMOVWPC", ops...) }
+func (o Opcodes) Cmovwpl(ops ...Operand)          { o.a.op("CMOVWPL", ops...) }
+func (o Opcodes) CMOVWPL(ops ...Operand)          { o.a.op("CMOVWPL", ops...) }
+func (o Opcodes) Cmovwps(ops ...Operand)          { o.a.op("CMOVWPS", ops...) }
+func (o Opcodes) CMOVWPS(ops ...Operand)          { o.a.op("CMOVWPS", ops...) }
+func (o Opcodes) Cmpb(ops ...Operand)             { o.a.op("CMPB", ops...) }
+func (o Opcodes) CMPB(ops ...Operand)             { o.a.op("CMPB", ops...) }
+func (o Opcodes) Cmpl(ops ...Operand)             { o.a.op("CMPL", ops...) }
+func (o Opcodes) CMPL(ops ...Operand)             { o.a.op("CMPL", ops...) }
+func (o Opcodes) Cmppd(ops ...Operand)            { o.a.op("CMPPD", ops...) }
+func (o Opcodes) CMPPD(ops ...Operand)            { o.a.op("CMPPD", ops...) }
+func (o Opcodes) Cmpps(ops ...Operand)            { o.a.op("CMPPS", ops...) }
+func (o Opcodes) CMPPS(ops ...Operand)            { o.a.op("CMPPS", ops...) }
+func (o Opcodes) Cmpq(ops ...Operand)             { o.a.op("CMPQ", ops...) }
+func (o Opcodes) CMPQ(ops ...Operand)             { o.a.op("CMPQ", ops...) }
+func (o Opcodes) Cmpsb(ops ...Operand)            { o.a.op("CMPSB", ops...) }
+func (o Opcodes) CMPSB(ops ...Operand)            { o.a.op("CMPSB", ops...) }
+func (o Opcodes) Cmpsd(ops ...Operand)            { o.a.op("CMPSD", ops...) }
+func (o Opcodes) CMPSD(ops ...Operand)            { o.a.op("CMPSD", ops...) }
+func (o Opcodes) Cmpsl(ops ...Operand)            { o.a.op("CMPSL", ops...) }
+func (o Opcodes) CMPSL(ops ...Operand)            { o.a.op("CMPSL", ops...) }
+func (o Opcodes) Cmpsq(ops ...Operand)            { o.a.op("CMPSQ", ops...) }
+func (o Opcodes) CMPSQ(ops ...Operand)            { o.a.op("CMPSQ", ops...) }
+func (o Opcodes) Cmpss(ops ...Operand)            { o.a.op("CMPSS", ops...) }
+func (o Opcodes) CMPSS(ops ...Operand)            { o.a.op("CMPSS", ops...) }
+func (o Opcodes) Cmpsw(ops ...Operand)            { o.a.op("CMPSW", ops...) }
+func (o Opcodes) CMPSW(ops ...Operand)            { o.a.op("CMPSW", ops...) }
+func (o Opcodes) Cmpw(ops ...Operand)             { o.a.op("CMPW", ops...) }
+func (o Opcodes) CMPW(ops ...Operand)             { o.a.op("CMPW", ops...) }
+func (o Opcodes) Cmpxchg8b(ops ...Operand)        { o.a.op("CMPXCHG8B", ops...) }
+func (o Opcodes) CMPXCHG8B(ops ...Operand)        { o.a.op("CMPXCHG8B", ops...) }
+func (o Opcodes) Cmpxchgb(ops ...Operand)         { o.a.op("CMPXCHGB", ops...) }
+func (o Opcodes) CMPXCHGB(ops ...Operand)         { o.a.op("CMPXCHGB", ops...) }
+func (o Opcodes) Cmpxchgl(ops ...Operand)         { o.a.op("CMPXCHGL", ops...) }
+func (o Opcodes) CMPXCHGL(ops ...Operand)         { o.a.op("CMPXCHGL", ops...) }
+func (o Opcodes) Cmpxchgq(ops ...Operand)         { o.a.op("CMPXCHGQ", ops...) }
+func (o Opcodes) CMPXCHGQ(ops ...Operand)         { o.a.op("CMPXCHGQ", ops...) }
+func (o Opcodes) Cmpxchgw(ops ...Operand)         { o.a.op("CMPXCHGW", ops...) }
+func (o Opcodes) CMPXCHGW(ops ...Operand)         { o.a.op("CMPXCHGW", ops...) }
+func (o Opcodes) Comisd(ops ...Operand)           { o.a.op("COMISD", ops...) }
+func (o Opcodes) COMISD(ops ...Operand)           { o.a.op("COMISD", ops...) }
+func (o Opcodes) Comiss(ops ...Operand)           { o.a.op("COMISS", ops...) }
+func (o Opcodes) COMISS(ops ...Operand)           { o.a.op("COMISS", ops...) }
+func (o Opcodes) Cpuid(ops ...Operand)            { o.a.op("CPUID", ops...) }
+func (o Opcodes) CPUID(ops ...Operand)            { o.a.op("CPUID", ops...) }
+func (o Opcodes) Cqo(ops ...Operand)              { o.a.op("CQO", ops...) }
+func (o Opcodes) CQO(ops ...Operand)              { o.a.op("CQO", ops...) }
+func (o Opcodes) Crc32b(ops ...Operand)           { o.a.op("CRC32B", ops...) }
+func (o Opcodes) CRC32B(ops ...Operand)           { o.a.op("CRC32B", ops...) }
+func (o Opcodes) Crc32q(ops ...Operand)           { o.a.op("CRC32Q", ops...) }
+func (o Opcodes) CRC32Q(ops ...Operand)           { o.a.op("CRC32Q", ops...) }
+func (o Opcodes) Cvtpd2pl(ops ...Operand)         { o.a.op("CVTPD2PL", ops...) }
+func (o Opcodes) CVTPD2PL(ops ...Operand)         { o.a.op("CVTPD2PL", ops...) }
+func (o Opcodes) Cvtpd2ps(ops ...Operand)         { o.a.op("CVTPD2PS", ops...) }
+func (o Opcodes) CVTPD2PS(ops ...Operand)         { o.a.op("CVTPD2PS", ops...) }
+func (o Opcodes) Cvtpl2pd(ops ...Operand)         { o.a.op("CVTPL2PD", ops...) }
+func (o Opcodes) CVTPL2PD(ops ...Operand)         { o.a.op("CVTPL2PD", ops...) }
+func (o Opcodes) Cvtpl2ps(ops ...Operand)         { o.a.op("CVTPL2PS", ops...) }
+func (o Opcodes) CVTPL2PS(ops ...Operand)         { o.a.op("CVTPL2PS", ops...) }
+func (o Opcodes) Cvtps2pd(ops ...Operand)         { o.a.op("CVTPS2PD", ops...) }
+func (o Opcodes) CVTPS2PD(ops ...Operand)         { o.a.op("CVTPS2PD", ops...) }
+func (o Opcodes) Cvtps2pl(ops ...Operand)         { o.a.op("CVTPS2PL", ops...) }
+func (o Opcodes) CVTPS2PL(ops ...Operand)         { o.a.op("CVTPS2PL", ops...) }
+func (o Opcodes) Cvtsd2sl(ops ...Operand)         { o.a.op("CVTSD2SL", ops...) }
+func (o Opcodes) CVTSD2SL(ops ...Operand)         { o.a.op("CVTSD2SL", ops...) }
+func (o Opcodes) Cvtsd2sq(ops ...Operand)         { o.a.op("CVTSD2SQ", ops...) }
+func (o Opcodes) CVTSD2SQ(ops ...Operand)         { o.a.op("CVTSD2SQ", ops...) }
+func (o Opcodes) Cvtsd2ss(ops ...Operand)         { o.a.op("CVTSD2SS", ops...) }
+func (o Opcodes) CVTSD2SS(ops ...Operand)         { o.a.op("CVTSD2SS", ops...) }
+func (o Opcodes) Cvtsl2sd(ops ...Operand)         { o.a.op("CVTSL2SD", ops...) }
+func (o Opcodes) CVTSL2SD(ops ...Operand)         { o.a.op("CVTSL2SD", ops...) }
+func (o Opcodes) Cvtsl2ss(ops ...Operand)         { o.a.op("CVTSL2SS", ops...) }
+func (o Opcodes) CVTSL2SS(ops ...Operand)         { o.a.op("CVTSL2SS", ops...) }
+func (o Opcodes) Cvtsq2sd(ops ...Operand)         { o.a.op("CVTSQ2SD", ops...) }
+func (o Opcodes) CVTSQ2SD(ops ...Operand)         { o.a.op("CVTSQ2SD", ops...) }
+func (o Opcodes) Cvtsq2ss(ops ...Operand)         { o.a.op("CVTSQ2SS", ops...) }
+func (o Opcodes) CVTSQ2SS(ops ...Operand)         { o.a.op("CVTSQ2SS", ops...) }
+func (o Opcodes) Cvtss2sd(ops ...Operand)         { o.a.op("CVTSS2SD", ops...) }
+func (o Opcodes) CVTSS2SD(ops ...Operand)         { o.a.op("CVTSS2SD", ops...) }
+func (o Opcodes) Cvtss2sl(ops ...Operand)         { o.a.op("CVTSS2SL", ops...) }
+func (o Opcodes) CVTSS2SL(ops ...Operand)         { o.a.op("CVTSS2SL", ops...) }
+func (o Opcodes) Cvtss2sq(ops ...Operand)         { o.a.op("CVTSS2SQ", ops...) }
+func (o Opcodes) CVTSS2SQ(ops ...Operand)         { o.a.op("CVTSS2SQ", ops...) }
+func (o Opcodes) Cvttpd2pl(ops ...Operand)        { o.a.op("CVTTPD2PL", ops...) }
+func (o Opcodes) CVTTPD2PL(ops ...Operand)        { o.a.op("CVTTPD2PL", ops...) }
+func (o Opcodes) Cvttps2pl(ops ...Operand)        { o.a.op("CVTTPS2PL", ops...) }
+func (o Opcodes) CVTTPS2PL(ops ...Operand)        { o.a.op("CVTTPS2PL", ops...) }
+func (o Opcodes) Cvttsd2sl(ops ...Operand)        { o.a.op("CVTTSD2SL", ops...) }
+func (o Opcodes) CVTTSD2SL(ops ...Operand)        { o.a.op("CVTTSD2SL", ops...) }
+func (o Opcodes) Cvttsd2sq(ops ...Operand)        { o.a.op("CVTTSD2SQ", ops...) }
+func (o Opcodes) CVTTSD2SQ(ops ...Operand)        { o.a.op("CVTTSD2SQ", ops...) }
+func (o Opcodes) Cvttss2sl(ops ...Operand)        { o.a.op("CVTTSS2SL", ops...) }
+func (o Opcodes) CVTTSS2SL(ops ...Operand)        { o.a.op("CVTTSS2SL", ops...) }
+func (o Opcodes) Cvttss2sq(ops ...Operand)        { o.a.op("CVTTSS2SQ", ops...) }
+func (o Opcodes) CVTTSS2SQ(ops ...Operand)        { o.a.op("CVTTSS2SQ", ops...) }
+func (o Opcodes) Cwd(ops ...Operand)              { o.a.op("CWD", ops...) }
+func (o Opcodes) CWD(ops ...Operand)              { o.a.op("CWD", ops...) }
+func (o Opcodes) Daa(ops ...Operand)              { o.a.op("DAA", ops...) }
+func (o Opcodes) DAA(ops ...Operand)              { o.a.op("DAA", ops...) }
+func (o Opcodes) Das(ops ...Operand)              { o.a.op("DAS", ops...) }
+func (o Opcodes) DAS(ops ...Operand)              { o.a.op("DAS", ops...) }
+func (o Opcodes) Decb(ops ...Operand)             { o.a.op("DECB", ops...) }
+func (o Opcodes) DECB(ops ...Operand)             { o.a.op("DECB", ops...) }
+func (o Opcodes) Decl(ops ...Operand)             { o.a.op("DECL", ops...) }
+func (o Opcodes) DECL(ops ...Operand)             { o.a.op("DECL", ops...) }
+func (o Opcodes) Decq(ops ...Operand)             { o.a.op("DECQ", ops...) }
+func (o Opcodes) DECQ(ops ...Operand)             { o.a.op("DECQ", ops...) }
+func (o Opcodes) Decw(ops ...Operand)             { o.a.op("DECW", ops...) }
+func (o Opcodes) DECW(ops ...Operand)             { o.a.op("DECW", ops...) }
+func (o Opcodes) Divb(ops ...Operand)             { o.a.op("DIVB", ops...) }
+func (o Opcodes) DIVB(ops ...Operand)             { o.a.op("DIVB", ops...) }
+func (o Opcodes) Divl(ops ...Operand)             { o.a.op("DIVL", ops...) }
+func (o Opcodes) DIVL(ops ...Operand)             { o.a.op("DIVL", ops...) }
+func (o Opcodes) Divpd(ops ...Operand)            { o.a.op("DIVPD", ops...) }
+func (o Opcodes) DIVPD(ops ...Operand)            { o.a.op("DIVPD", ops...) }
+func (o Opcodes) Divps(ops ...Operand)            { o.a.op("DIVPS", ops...) }
+func (o Opcodes) DIVPS(ops ...Operand)            { o.a.op("DIVPS", ops...) }
+func (o Opcodes) Divq(ops ...Operand)             { o.a.op("DIVQ", ops...) }
+func (o Opcodes) DIVQ(ops ...Operand)             { o.a.op("DIVQ", ops...) }
+func (o Opcodes) Divsd(ops ...Operand)            { o.a.op("DIVSD", ops...) }
+func (o Opcodes) DIVSD(ops ...Operand)            { o.a.op("DIVSD", ops...) }
+func (o Opcodes) Divss(ops ...Operand)            { o.a.op("DIVSS", ops...) }
+func (o Opcodes) DIVSS(ops ...Operand)            { o.a.op("DIVSS", ops...) }
+func (o Opcodes) Divw(ops ...Operand)             { o.a.op("DIVW", ops...) }
+func (o Opcodes) DIVW(ops ...Operand)             { o.a.op("DIVW", ops...) }
+func (o Opcodes) Dppd(ops ...Operand)             { o.a.op("DPPD", ops...) }
+func (o Opcodes) DPPD(ops ...Operand)             { o.a.op("DPPD", ops...) }
+func (o Opcodes) Dpps(ops ...Operand)             { o.a.op("DPPS", ops...) }
+func (o Opcodes) DPPS(ops ...Operand)             { o.a.op("DPPS", ops...) }
+func (o Opcodes) Emms(ops ...Operand)             { o.a.op("EMMS", ops...) }
+func (o Opcodes) EMMS(ops ...Operand)             { o.a.op("EMMS", ops...) }
+func (o Opcodes) Enter(ops ...Operand)            { o.a.op("ENTER", ops...) }
+func (o Opcodes) ENTER(ops ...Operand)            { o.a.op("ENTER", ops...) }
+func (o Opcodes) Extractps(ops ...Operand)        { o.a.op("EXTRACTPS", ops...) }
+func (o Opcodes) EXTRACTPS(ops ...Operand)        { o.a.op("EXTRACTPS", ops...) }
+func (o Opcodes) F2xm1(ops ...Operand)            { o.a.op("F2XM1", ops...) }
+func (o Opcodes) F2XM1(ops ...Operand)            { o.a.op("F2XM1", ops...) }
+func (o Opcodes) Fabs(ops ...Operand)             { o.a.op("FABS", ops...) }
+func (o Opcodes) FABS(ops ...Operand)             { o.a.op("FABS", ops...) }
+func (o Opcodes) Faddd(ops ...Operand)            { o.a.op("FADDD", ops...) }
+func (o Opcodes) FADDD(ops ...Operand)            { o.a.op("FADDD", ops...) }
+func (o Opcodes) Fadddp(ops ...Operand)           { o.a.op("FADDDP", ops...) }
+func (o Opcodes) FADDDP(ops ...Operand)           { o.a.op("FADDDP", ops...) }
+func (o Opcodes) Faddf(ops ...Operand)            { o.a.op("FADDF", ops...) }
+func (o Opcodes) FADDF(ops ...Operand)            { o.a.op("FADDF", ops...) }
+func (o Opcodes) Faddl(ops ...Operand)            { o.a.op("FADDL", ops...) }
+func (o Opcodes) FADDL(ops ...Operand)            { o.a.op("FADDL", ops...) }
+func (o Opcodes) Faddw(ops ...Operand)            { o.a.op("FADDW", ops...) }
+func (o Opcodes) FADDW(ops ...Operand)            { o.a.op("FADDW", ops...) }
+func (o Opcodes) Fchs(ops ...Operand)             { o.a.op("FCHS", ops...) }
+func (o Opcodes) FCHS(ops ...Operand)             { o.a.op("FCHS", ops...) }
+func (o Opcodes) Fclex(ops ...Operand)            { o.a.op("FCLEX", ops...) }
+func (o Opcodes) FCLEX(ops ...Operand)            { o.a.op("FCLEX", ops...) }
+func (o Opcodes) Fcmovcc(ops ...Operand)          { o.a.op("FCMOVCC", ops...) }
+func (o Opcodes) FCMOVCC(ops ...Operand)          { o.a.op("FCMOVCC", ops...) }
+func (o Opcodes) Fcmovcs(ops ...Operand)          { o.a.op("FCMOVCS", ops...) }
+func (o Opcodes) FCMOVCS(ops ...Operand)          { o.a.op("FCMOVCS", ops...) }
+func (o Opcodes) Fcmoveq(ops ...Operand)          { o.a.op("FCMOVEQ", ops...) }
+func (o Opcodes) FCMOVEQ(ops ...Operand)          { o.a.op("FCMOVEQ", ops...) }
+func (o Opcodes) Fcmovhi(ops ...Operand)          { o.a.op("FCMOVHI", ops...) }
+func (o Opcodes) FCMOVHI(ops ...Operand)          { o.a.op("FCMOVHI", ops...) }
+func (o Opcodes) Fcmovls(ops ...Operand)          { o.a.op("FCMOVLS", ops...) }
+func (o Opcodes) FCMOVLS(ops ...Operand)          { o.a.op("FCMOVLS", ops...) }
+func (o Opcodes) Fcmovne(ops ...Operand)          { o.a.op("FCMOVNE", ops...) }
+func (o Opcodes) FCMOVNE(ops ...Operand)          { o.a.op("FCMOVNE", ops...) }
+func (o Opcodes) Fcmovnu(ops ...Operand)          { o.a.op("FCMOVNU", ops...) }
+func (o Opcodes) FCMOVNU(ops ...Operand)          { o.a.op("FCMOVNU", ops...) }
+func (o Opcodes) Fcmovun(ops ...Operand)          { o.a.op("FCMOVUN", ops...) }
+func (o Opcodes) FCMOVUN(ops ...Operand)          { o.a.op("FCMOVUN", ops...) }
+func (o Opcodes) Fcomd(ops ...Operand)            { o.a.op("FCOMD", ops...) }
+func (o Opcodes) FCOMD(ops ...Operand)            { o.a.op("FCOMD", ops...) }
+func (o Opcodes) Fcomdp(ops ...Operand)           { o.a.op("FCOMDP", ops...) }
+func (o Opcodes) FCOMDP(ops ...Operand)           { o.a.op("FCOMDP", ops...) }
+func (o Opcodes) Fcomdpp(ops ...Operand)          { o.a.op("FCOMDPP", ops...) }
+func (o Opcodes) FCOMDPP(ops ...Operand)          { o.a.op("FCOMDPP", ops...) }
+func (o Opcodes) Fcomf(ops ...Operand)            { o.a.op("FCOMF", ops...) }
+func (o Opcodes) FCOMF(ops ...Operand)            { o.a.op("FCOMF", ops...) }
+func (o Opcodes) Fcomfp(ops ...Operand)           { o.a.op("FCOMFP", ops...) }
+func (o Opcodes) FCOMFP(ops ...Operand)           { o.a.op("FCOMFP", ops...) }
+func (o Opcodes) Fcomi(ops ...Operand)            { o.a.op("FCOMI", ops...) }
+func (o Opcodes) FCOMI(ops ...Operand)            { o.a.op("FCOMI", ops...) }
+func (o Opcodes) Fcomip(ops ...Operand)           { o.a.op("FCOMIP", ops...) }
+func (o Opcodes) FCOMIP(ops ...Operand)           { o.a.op("FCOMIP", ops...) }
+func (o Opcodes) Fcoml(ops ...Operand)            { o.a.op("FCOML", ops...) }
+func (o Opcodes) FCOML(ops ...Operand)            { o.a.op("FCOML", ops...) }
+func (o Opcodes) Fcomlp(ops ...Operand)           { o.a.op("FCOMLP", ops...) }
+func (o Opcodes) FCOMLP(ops ...Operand)           { o.a.op("FCOMLP", ops...) }
+func (o Opcodes) Fcomw(ops ...Operand)            { o.a.op("FCOMW", ops...) }
+func (o Opcodes) FCOMW(ops ...Operand)            { o.a.op("FCOMW", ops...) }
+func (o Opcodes) Fcomwp(ops ...Operand)           { o.a.op("FCOMWP", ops...) }
+func (o Opcodes) FCOMWP(ops ...Operand)           { o.a.op("FCOMWP", ops...) }
+func (o Opcodes) Fcos(ops ...Operand)             { o.a.op("FCOS", ops...) }
+func (o Opcodes) FCOS(ops ...Operand)             { o.a.op("FCOS", ops...) }
+func (o Opcodes) Fdecstp(ops ...Operand)          { o.a.op("FDECSTP", ops...) }
+func (o Opcodes) FDECSTP(ops ...Operand)          { o.a.op("FDECSTP", ops...) }
+func (o Opcodes) Fdivd(ops ...Operand)            { o.a.op("FDIVD", ops...) }
+func (o Opcodes) FDIVD(ops ...Operand)            { o.a.op("FDIVD", ops...) }
+func (o Opcodes) Fdivdp(ops ...Operand)           { o.a.op("FDIVDP", ops...) }
+func (o Opcodes) FDIVDP(ops ...Operand)           { o.a.op("FDIVDP", ops...) }
+func (o Opcodes) Fdivf(ops ...Operand)            { o.a.op("FDIVF", ops...) }
+func (o Opcodes) FDIVF(ops ...Operand)            { o.a.op("FDIVF", ops...) }
+func (o Opcodes) Fdivl(ops ...Operand)            { o.a.op("FDIVL", ops...) }
+func (o Opcodes) FDIVL(ops ...Operand)            { o.a.op("FDIVL", ops...) }
+func (o Opcodes) Fdivrd(ops ...Operand)           { o.a.op("FDIVRD", ops...) }
+func (o Opcodes) FDIVRD(ops ...Operand)           { o.a.op("FDIVRD", ops...) }
+func (o Opcodes) Fdivrdp(ops ...Operand)          { o.a.op("FDIVRDP", ops...) }
+func (o Opcodes) FDIVRDP(ops ...Operand)          { o.a.op("FDIVRDP", ops...) }
+func (o Opcodes) Fdivrf(ops ...Operand)           { o.a.op("FDIVRF", ops...) }
+func (o Opcodes) FDIVRF(ops ...Operand)           { o.a.op("FDIVRF", ops...) }
+func (o Opcodes) Fdivrl(ops ...Operand)           { o.a.op("FDIVRL", ops...) }
+func (o Opcodes) FDIVRL(ops ...Operand)           { o.a.op("FDIVRL", ops...) }
+func (o Opcodes) Fdivrw(ops ...Operand)           { o.a.op("FDIVRW", ops...) }
+func (o Opcodes) FDIVRW(ops ...Operand)           { o.a.op("FDIVRW", ops...) }
+func (o Opcodes) Fdivw(ops ...Operand)            { o.a.op("FDIVW", ops...) }
+func (o Opcodes) FDIVW(ops ...Operand)            { o.a.op("FDIVW", ops...) }
+func (o Opcodes) Ffree(ops ...Operand)            { o.a.op("FFREE", ops...) }
+func (o Opcodes) FFREE(ops ...Operand)            { o.a.op("FFREE", ops...) }
+func (o Opcodes) Fincstp(ops ...Operand)          { o.a.op("FINCSTP", ops...) }
+func (o Opcodes) FINCSTP(ops ...Operand)          { o.a.op("FINCSTP", ops...) }
+func (o Opcodes) Finit(ops ...Operand)            { o.a.op("FINIT", ops...) }
+func (o Opcodes) FINIT(ops ...Operand)            { o.a.op("FINIT", ops...) }
+func (o Opcodes) Fld1(ops ...Operand)             { o.a.op("FLD1", ops...) }
+func (o Opcodes) FLD1(ops ...Operand)             { o.a.op("FLD1", ops...) }
+func (o Opcodes) Fldcw(ops ...Operand)            { o.a.op("FLDCW", ops...) }
+func (o Opcodes) FLDCW(ops ...Operand)            { o.a.op("FLDCW", ops...) }
+func (o Opcodes) Fldenv(ops ...Operand)           { o.a.op("FLDENV", ops...) }
+func (o Opcodes) FLDENV(ops ...Operand)           { o.a.op("FLDENV", ops...) }
+func (o Opcodes) Fldl2e(ops ...Operand)           { o.a.op("FLDL2E", ops...) }
+func (o Opcodes) FLDL2E(ops ...Operand)           { o.a.op("FLDL2E", ops...) }
+func (o Opcodes) Fldl2t(ops ...Operand)           { o.a.op("FLDL2T", ops...) }
+func (o Opcodes) FLDL2T(ops ...Operand)           { o.a.op("FLDL2T", ops...) }
+func (o Opcodes) Fldlg2(ops ...Operand)           { o.a.op("FLDLG2", ops...) }
+func (o Opcodes) FLDLG2(ops ...Operand)           { o.a.op("FLDLG2", ops...) }
+func (o Opcodes) Fldln2(ops ...Operand)           { o.a.op("FLDLN2", ops...) }
+func (o Opcodes) FLDLN2(ops ...Operand)           { o.a.op("FLDLN2", ops...) }
+func (o Opcodes) Fldpi(ops ...Operand)            { o.a.op("FLDPI", ops...) }
+func (o Opcodes) FLDPI(ops ...Operand)            { o.a.op("FLDPI", ops...) }
+func (o Opcodes) Fldz(ops ...Operand)             { o.a.op("FLDZ", ops...) }
+func (o Opcodes) FLDZ(ops ...Operand)             { o.a.op("FLDZ", ops...) }
+func (o Opcodes) Fmovb(ops ...Operand)            { o.a.op("FMOVB", ops...) }
+func (o Opcodes) FMOVB(ops ...Operand)            { o.a.op("FMOVB", ops...) }
+func (o Opcodes) Fmovbp(ops ...Operand)           { o.a.op("FMOVBP", ops...) }
+func (o Opcodes) FMOVBP(ops ...Operand)           { o.a.op("FMOVBP", ops...) }
+func (o Opcodes) Fmovd(ops ...Operand)            { o.a.op("FMOVD", ops...) }
+func (o Opcodes) FMOVD(ops ...Operand)            { o.a.op("FMOVD", ops...) }
+func (o Opcodes) Fmovdp(ops ...Operand)           { o.a.op("FMOVDP", ops...) }
+func (o Opcodes) FMOVDP(ops ...Operand)           { o.a.op("FMOVDP", ops...) }
+func (o Opcodes) Fmovf(ops ...Operand)            { o.a.op("FMOVF", ops...) }
+func (o Opcodes) FMOVF(ops ...Operand)            { o.a.op("FMOVF", ops...) }
+func (o Opcodes) Fmovfp(ops ...Operand)           { o.a.op("FMOVFP", ops...) }
+func (o Opcodes) FMOVFP(ops ...Operand)           { o.a.op("FMOVFP", ops...) }
+func (o Opcodes) Fmovl(ops ...Operand)            { o.a.op("FMOVL", ops...) }
+func (o Opcodes) FMOVL(ops ...Operand)            { o.a.op("FMOVL", ops...) }
+func (o Opcodes) Fmovlp(ops ...Operand)           { o.a.op("FMOVLP", ops...) }
+func (o Opcodes) FMOVLP(ops ...Operand)           { o.a.op("FMOVLP", ops...) }
+func (o Opcodes) Fmovv(ops ...Operand)            { o.a.op("FMOVV", ops...) }
+func (o Opcodes) FMOVV(ops ...Operand)            { o.a.op("FMOVV", ops...) }
+func (o Opcodes) Fmovvp(ops ...Operand)           { o.a.op("FMOVVP", ops...) }
+func (o Opcodes) FMOVVP(ops ...Operand)           { o.a.op("FMOVVP", ops...) }
+func (o Opcodes) Fmovw(ops ...Operand)            { o.a.op("FMOVW", ops...) }
+func (o Opcodes) FMOVW(ops ...Operand)            { o.a.op("FMOVW", ops...) }
+func (o Opcodes) Fmovwp(ops ...Operand)           { o.a.op("FMOVWP", ops...) }
+func (o Opcodes) FMOVWP(ops ...Operand)           { o.a.op("FMOVWP", ops...) }
+func (o Opcodes) Fmovx(ops ...Operand)            { o.a.op("FMOVX", ops...) }
+func (o Opcodes) FMOVX(ops ...Operand)            { o.a.op("FMOVX", ops...) }
+func (o Opcodes) Fmovxp(ops ...Operand)           { o.a.op("FMOVXP", ops...) }
+func (o Opcodes) FMOVXP(ops ...Operand)           { o.a.op("FMOVXP", ops...) }
+func (o Opcodes) Fmuld(ops ...Operand)            { o.a.op("FMULD", ops...) }
+func (o Opcodes) FMULD(ops ...Operand)            { o.a.op("FMULD", ops...) }
+func (o Opcodes) Fmuldp(ops ...Operand)           { o.a.op("FMULDP", ops...) }
+func (o Opcodes) FMULDP(ops ...Operand)           { o.a.op("FMULDP", ops...) }
+func (o Opcodes) Fmulf(ops ...Operand)            { o.a.op("FMULF", ops...) }
+func (o Opcodes) FMULF(ops ...Operand)            { o.a.op("FMULF", ops...) }
+func (o Opcodes) Fmull(ops ...Operand)            { o.a.op("FMULL", ops...) }
+func (o Opcodes) FMULL(ops ...Operand)            { o.a.op("FMULL", ops...) }
+func (o Opcodes) Fmulw(ops ...Operand)            { o.a.op("FMULW", ops...) }
+func (o Opcodes) FMULW(ops ...Operand)            { o.a.op("FMULW", ops...) }
+func (o Opcodes) Fnop(ops ...Operand)             { o.a.op("FNOP", ops...) }
+func (o Opcodes) FNOP(ops ...Operand)             { o.a.op("FNOP", ops...) }
+func (o Opcodes) Fpatan(ops ...Operand)           { o.a.op("FPATAN", ops...) }
+func (o Opcodes) FPATAN(ops ...Operand)           { o.a.op("FPATAN", ops...) }
+func (o Opcodes) Fprem(ops ...Operand)            { o.a.op("FPREM", ops...) }
+func (o Opcodes) FPREM(ops ...Operand)            { o.a.op("FPREM", ops...) }
+func (o Opcodes) Fprem1(ops ...Operand)           { o.a.op("FPREM1", ops...) }
+func (o Opcodes) FPREM1(ops ...Operand)           { o.a.op("FPREM1", ops...) }
+func (o Opcodes) Fptan(ops ...Operand)            { o.a.op("FPTAN", ops...) }
+func (o Opcodes) FPTAN(ops ...Operand)            { o.a.op("FPTAN", ops...) }
+func (o Opcodes) Frndint(ops ...Operand)          { o.a.op("FRNDINT", ops...) }
+func (o Opcodes) FRNDINT(ops ...Operand)          { o.a.op("FRNDINT", ops...) }
+func (o Opcodes) Frstor(ops ...Operand)           { o.a.op("FRSTOR", ops...) }
+func (o Opcodes) FRSTOR(ops ...Operand)           { o.a.op("FRSTOR", ops...) }
+func (o Opcodes) Fsave(ops ...Operand)            { o.a.op("FSAVE", ops...) }
+func (o Opcodes) FSAVE(ops ...Operand)            { o.a.op("FSAVE", ops...) }
+func (o Opcodes) Fscale(ops ...Operand)           { o.a.op("FSCALE", ops...) }
+func (o Opcodes) FSCALE(ops ...Operand)           { o.a.op("FSCALE", ops...) }
+func (o Opcodes) Fsin(ops ...Operand)             { o.a.op("FSIN", ops...) }
+func (o Opcodes) FSIN(ops ...Operand)             { o.a.op("FSIN", ops...) }
+func (o Opcodes) Fsincos(ops ...Operand)          { o.a.op("FSINCOS", ops...) }
+func (o Opcodes) FSINCOS(ops ...Operand)          { o.a.op("FSINCOS", ops...) }
+func (o Opcodes) Fsqrt(ops ...Operand)            { o.a.op("FSQRT", ops...) }
+func (o Opcodes) FSQRT(ops ...Operand)            { o.a.op("FSQRT", ops...) }
+func (o Opcodes) Fstcw(ops ...Operand)            { o.a.op("FSTCW", ops...) }
+func (o Opcodes) FSTCW(ops ...Operand)            { o.a.op("FSTCW", ops...) }
+func (o Opcodes) Fstenv(ops ...Operand)           { o.a.op("FSTENV", ops...) }
+func (o Opcodes) FSTENV(ops ...Operand)           { o.a.op("FSTENV", ops...) }
+func (o Opcodes) Fstsw(ops ...Operand)            { o.a.op("FSTSW", ops...) }
+func (o Opcodes) FSTSW(ops ...Operand)            { o.a.op("FSTSW", ops...) }
+func (o Opcodes) Fsubd(ops ...Operand)            { o.a.op("FSUBD", ops...) }
+func (o Opcodes) FSUBD(ops ...Operand)            { o.a.op("FSUBD", ops...) }
+func (o Opcodes) Fsubdp(ops ...Operand)           { o.a.op("FSUBDP", ops...) }
+func (o Opcodes) FSUBDP(ops ...Operand)           { o.a.op("FSUBDP", ops...) }
+func (o Opcodes) Fsubf(ops ...Operand)            { o.a.op("FSUBF", ops...) }
+func (o Opcodes) FSUBF(ops ...Operand)            { o.a.op("FSUBF", ops...) }
+func (o Opcodes) Fsubl(ops ...Operand)            { o.a.op("FSUBL", ops...) }
+func (o Opcodes) FSUBL(ops ...Operand)            { o.a.op("FSUBL", ops...) }
+func (o Opcodes) Fsubrd(ops ...Operand)           { o.a.op("FSUBRD", ops...) }
+func (o Opcodes) FSUBRD(ops ...Operand)           { o.a.op("FSUBRD", ops...) }
+func (o Opcodes) Fsubrdp(ops ...Operand)          { o.a.op("FSUBRDP", ops...) }
+func (o Opcodes) FSUBRDP(ops ...Operand)          { o.a.op("FSUBRDP", ops...) }
+func (o Opcodes) Fsubrf(ops ...Operand)           { o.a.op("FSUBRF", ops...) }
+func (o Opcodes) FSUBRF(ops ...Operand)           { o.a.op("FSUBRF", ops...) }
+func (o Opcodes) Fsubrl(ops ...Operand)           { o.a.op("FSUBRL", ops...) }
+func (o Opcodes) FSUBRL(ops ...Operand)           { o.a.op("FSUBRL", ops...) }
+func (o Opcodes) Fsubrw(ops ...Operand)           { o.a.op("FSUBRW", ops...) }
+func (o Opcodes) FSUBRW(ops ...Operand)           { o.a.op("FSUBRW", ops...) }
+func (o Opcodes) Fsubw(ops ...Operand)            { o.a.op("FSUBW", ops...) }
+func (o Opcodes) FSUBW(ops ...Operand)            { o.a.op("FSUBW", ops...) }
+func (o Opcodes) Ftst(ops ...Operand)             { o.a.op("FTST", ops...) }
+func (o Opcodes) FTST(ops ...Operand)             { o.a.op("FTST", ops...) }
+func (o Opcodes) Fucom(ops ...Operand)            { o.a.op("FUCOM", ops...) }
+func (o Opcodes) FUCOM(ops ...Operand)            { o.a.op("FUCOM", ops...) }
+func (o Opcodes) Fucomi(ops ...Operand)           { o.a.op("FUCOMI", ops...) }
+func (o Opcodes) FUCOMI(ops ...Operand)           { o.a.op("FUCOMI", ops...) }
+func (o Opcodes) Fucomip(ops ...Operand)          { o.a.op("FUCOMIP", ops...) }
+func (o Opcodes) FUCOMIP(ops ...Operand)          { o.a.op("FUCOMIP", ops...) }
+func (o Opcodes) Fucomp(ops ...Operand)           { o.a.op("FUCOMP", ops...) }
+func (o Opcodes) FUCOMP(ops ...Operand)           { o.a.op("FUCOMP", ops...) }
+func (o Opcodes) Fucompp(ops ...Operand)          { o.a.op("FUCOMPP", ops...) }
+func (o Opcodes) FUCOMPP(ops ...Operand)          { o.a.op("FUCOMPP", ops...) }
+func (o Opcodes) Fxam(ops ...Operand)             { o.a.op("FXAM", ops...) }
+func (o Opcodes) FXAM(ops ...Operand)             { o.a.op("FXAM", ops...) }
+func (o Opcodes) Fxchd(ops ...Operand)            { o.a.op("FXCHD", ops...) }
+func (o Opcodes) FXCHD(ops ...Operand)            { o.a.op("FXCHD", ops...) }
+func (o Opcodes) Fxrstor(ops ...Operand)          { o.a.op("FXRSTOR", ops...) }
+func (o Opcodes) FXRSTOR(ops ...Operand)          { o.a.op("FXRSTOR", ops...) }
+func (o Opcodes) Fxrstor64(ops ...Operand)        { o.a.op("FXRSTOR64", ops...) }
+func (o Opcodes) FXRSTOR64(ops ...Operand)        { o.a.op("FXRSTOR64", ops...) }
+func (o Opcodes) Fxsave(ops ...Operand)           { o.a.op("FXSAVE", ops...) }
+func (o Opcodes) FXSAVE(ops ...Operand)           { o.a.op("FXSAVE", ops...) }
+func (o Opcodes) Fxsave64(ops ...Operand)         { o.a.op("FXSAVE64", ops...) }
+func (o Opcodes) FXSAVE64(ops ...Operand)         { o.a.op("FXSAVE64", ops...) }
+func (o Opcodes) Fxtract(ops ...Operand)          { o.a.op("FXTRACT", ops...) }
+func (o Opcodes) FXTRACT(ops ...Operand)          { o.a.op("FXTRACT", ops...) }
+func (o Opcodes) Fyl2x(ops ...Operand)            { o.a.op("FYL2X", ops...) }
+func (o Opcodes) FYL2X(ops ...Operand)            { o.a.op("FYL2X", ops...) }
+func (o Opcodes) Fyl2xp1(ops ...Operand)          { o.a.op("FYL2XP1", ops...) }
+func (o Opcodes) FYL2XP1(ops ...Operand)          { o.a.op("FYL2XP1", ops...) }
+func (o Opcodes) Haddpd(ops ...Operand)           { o.a.op("HADDPD", ops...) }
+func (o Opcodes) HADDPD(ops ...Operand)           { o.a.op("HADDPD", ops...) }
+func (o Opcodes) Haddps(ops ...Operand)           { o.a.op("HADDPS", ops...) }
+func (o Opcodes) HADDPS(ops ...Operand)           { o.a.op("HADDPS", ops...) }
+func (o Opcodes) Hlt(ops ...Operand)              { o.a.op("HLT", ops...) }
+func (o Opcodes) HLT(ops ...Operand)              { o.a.op("HLT", ops...) }
+func (o Opcodes) Hsubpd(ops ...Operand)           { o.a.op("HSUBPD", ops...) }
+func (o Opcodes) HSUBPD(ops ...Operand)           { o.a.op("HSUBPD", ops...) }
+func (o Opcodes) Hsubps(ops ...Operand)           { o.a.op("HSUBPS", ops...) }
+func (o Opcodes) HSUBPS(ops ...Operand)           { o.a.op("HSUBPS", ops...) }
+func (o Opcodes) Idivb(ops ...Operand)            { o.a.op("IDIVB", ops...) }
+func (o Opcodes) IDIVB(ops ...Operand)            { o.a.op("IDIVB", ops...) }
+func (o Opcodes) Idivl(ops ...Operand)            { o.a.op("IDIVL", ops...) }
+func (o Opcodes) IDIVL(ops ...Operand)            { o.a.op("IDIVL", ops...) }
+func (o Opcodes) Idivq(ops ...Operand)            { o.a.op("IDIVQ", ops...) }
+func (o Opcodes) IDIVQ(ops ...Operand)            { o.a.op("IDIVQ", ops...) }
+func (o Opcodes) Idivw(ops ...Operand)            { o.a.op("IDIVW", ops...) }
+func (o Opcodes) IDIVW(ops ...Operand)            { o.a.op("IDIVW", ops...) }
+func (o Opcodes) Imul3q(ops ...Operand)           { o.a.op("IMUL3Q", ops...) }
+func (o Opcodes) IMUL3Q(ops ...Operand)           { o.a.op("IMUL3Q", ops...) }
+func (o Opcodes) Imulb(ops ...Operand)            { o.a.op("IMULB", ops...) }
+func (o Opcodes) IMULB(ops ...Operand)            { o.a.op("IMULB", ops...) }
+func (o Opcodes) Imull(ops ...Operand)            { o.a.op("IMULL", ops...) }
+func (o Opcodes) IMULL(ops ...Operand)            { o.a.op("IMULL", ops...) }
+func (o Opcodes) Imulq(ops ...Operand)            { o.a.op("IMULQ", ops...) }
+func (o Opcodes) IMULQ(ops ...Operand)            { o.a.op("IMULQ", ops...) }
+func (o Opcodes) Imulw(ops ...Operand)            { o.a.op("IMULW", ops...) }
+func (o Opcodes) IMULW(ops ...Operand)            { o.a.op("IMULW", ops...) }
+func (o Opcodes) Inb(ops ...Operand)              { o.a.op("INB", ops...) }
+func (o Opcodes) INB(ops ...Operand)              { o.a.op("INB", ops...) }
+func (o Opcodes) Incb(ops ...Operand)             { o.a.op("INCB", ops...) }
+func (o Opcodes) INCB(ops ...Operand)             { o.a.op("INCB", ops...) }
+func (o Opcodes) Incl(ops ...Operand)             { o.a.op("INCL", ops...) }
+func (o Opcodes) INCL(ops ...Operand)             { o.a.op("INCL", ops...) }
+func (o Opcodes) Incq(ops ...Operand)             { o.a.op("INCQ", ops...) }
+func (o Opcodes) INCQ(ops ...Operand)             { o.a.op("INCQ", ops...) }
+func (o Opcodes) Incw(ops ...Operand)             { o.a.op("INCW", ops...) }
+func (o Opcodes) INCW(ops ...Operand)             { o.a.op("INCW", ops...) }
+func (o Opcodes) Inl(ops ...Operand)              { o.a.op("INL", ops...) }
+func (o Opcodes) INL(ops ...Operand)              { o.a.op("INL", ops...) }
+func (o Opcodes) Insb(ops ...Operand)             { o.a.op("INSB", ops...) }
+func (o Opcodes) INSB(ops ...Operand)             { o.a.op("INSB", ops...) }
+func (o Opcodes) Insertps(ops ...Operand)         { o.a.op("INSERTPS", ops...) }
+func (o Opcodes) INSERTPS(ops ...Operand)         { o.a.op("INSERTPS", ops...) }
+func (o Opcodes) Insl(ops ...Operand)             { o.a.op("INSL", ops...) }
+func (o Opcodes) INSL(ops ...Operand)             { o.a.op("INSL", ops...) }
+func (o Opcodes) Insw(ops ...Operand)             { o.a.op("INSW", ops...) }
+func (o Opcodes) INSW(ops ...Operand)             { o.a.op("INSW", ops...) }
+func (o Opcodes) Int(ops ...Operand)              { o.a.op("INT", ops...) }
+func (o Opcodes) INT(ops ...Operand)              { o.a.op("INT", ops...) }
+func (o Opcodes) Into(ops ...Operand)             { o.a.op("INTO", ops...) }
+func (o Opcodes) INTO(ops ...Operand)             { o.a.op("INTO", ops...) }
+func (o Opcodes) Invd(ops ...Operand)             { o.a.op("INVD", ops...) }
+func (o Opcodes) INVD(ops ...Operand)             { o.a.op("INVD", ops...) }
+func (o Opcodes) Invlpg(ops ...Operand)           { o.a.op("INVLPG", ops...) }
+func (o Opcodes) INVLPG(ops ...Operand)           { o.a.op("INVLPG", ops...) }
+func (o Opcodes) Inw(ops ...Operand)              { o.a.op("INW", ops...) }
+func (o Opcodes) INW(ops ...Operand)              { o.a.op("INW", ops...) }
+func (o Opcodes) Iretl(ops ...Operand)            { o.a.op("IRETL", ops...) }
+func (o Opcodes) IRETL(ops ...Operand)            { o.a.op("IRETL", ops...) }
+func (o Opcodes) Iretq(ops ...Operand)            { o.a.op("IRETQ", ops...) }
+func (o Opcodes) IRETQ(ops ...Operand)            { o.a.op("IRETQ", ops...) }
+func (o Opcodes) Iretw(ops ...Operand)            { o.a.op("IRETW", ops...) }
+func (o Opcodes) IRETW(ops ...Operand)            { o.a.op("IRETW", ops...) }
+func (o Opcodes) Jcc(ops ...Operand)              { o.a.op("JCC", ops...) }
+func (o Opcodes) JCC(ops ...Operand)              { o.a.op("JCC", ops...) }
+func (o Opcodes) Jcs(ops ...Operand)              { o.a.op("JCS", ops...) }
+func (o Opcodes) JCS(ops ...Operand)              { o.a.op("JCS", ops...) }
+func (o Opcodes) Jcxzl(ops ...Operand)            { o.a.op("JCXZL", ops...) }
+func (o Opcodes) JCXZL(ops ...Operand)            { o.a.op("JCXZL", ops...) }
+func (o Opcodes) Jcxzq(ops ...Operand)            { o.a.op("JCXZQ", ops...) }
+func (o Opcodes) JCXZQ(ops ...Operand)            { o.a.op("JCXZQ", ops...) }
+func (o Opcodes) Jcxzw(ops ...Operand)            { o.a.op("JCXZW", ops...) }
+func (o Opcodes) JCXZW(ops ...Operand)            { o.a.op("JCXZW", ops...) }
+func (o Opcodes) Jeq(ops ...Operand)              { o.a.op("JEQ", ops...) }
+func (o Opcodes) JEQ(ops ...Operand)              { o.a.op("JEQ", ops...) }
+func (o Opcodes) Jge(ops ...Operand)              { o.a.op("JGE", ops...) }
+func (o Opcodes) JGE(ops ...Operand)              { o.a.op("JGE", ops...) }
+func (o Opcodes) Jgt(ops ...Operand)              { o.a.op("JGT", ops...) }
+func (o Opcodes) JGT(ops ...Operand)              { o.a.op("JGT", ops...) }
+func (o Opcodes) Jhi(ops ...Operand)              { o.a.op("JHI", ops...) }
+func (o Opcodes) JHI(ops ...Operand)              { o.a.op("JHI", ops...) }
+func (o Opcodes) Jle(ops ...Operand)              { o.a.op("JLE", ops...) }
+func (o Opcodes) JLE(ops ...Operand)              { o.a.op("JLE", ops...) }
+func (o Opcodes) Jls(ops ...Operand)              { o.a.op("JLS", ops...) }
+func (o Opcodes) JLS(ops ...Operand)              { o.a.op("JLS", ops...) }
+func (o Opcodes) Jlt(ops ...Operand)              { o.a.op("JLT", ops...) }
+func (o Opcodes) JLT(ops ...Operand)              { o.a.op("JLT", ops...) }
+func (o Opcodes) Jmi(ops ...Operand)              { o.a.op("JMI", ops...) }
+func (o Opcodes) JMI(ops ...Operand)              { o.a.op("JMI", ops...) }
+func (o Opcodes) Jne(ops ...Operand)              { o.a.op("JNE", ops...) }
+func (o Opcodes) JNE(ops ...Operand)              { o.a.op("JNE", ops...) }
+func (o Opcodes) Joc(ops ...Operand)              { o.a.op("JOC", ops...) }
+func (o Opcodes) JOC(ops ...Operand)              { o.a.op("JOC", ops...) }
+func (o Opcodes) Jos(ops ...Operand)              { o.a.op("JOS", ops...) }
+func (o Opcodes) JOS(ops ...Operand)              { o.a.op("JOS", ops...) }
+func (o Opcodes) Jpc(ops ...Operand)              { o.a.op("JPC", ops...) }
+func (o Opcodes) JPC(ops ...Operand)              { o.a.op("JPC", ops...) }
+func (o Opcodes) Jpl(ops ...Operand)              { o.a.op("JPL", ops...) }
+func (o Opcodes) JPL(ops ...Operand)              { o.a.op("JPL", ops...) }
+func (o Opcodes) Jps(ops ...Operand)              { o.a.op("JPS", ops...) }
+func (o Opcodes) JPS(ops ...Operand)              { o.a.op("JPS", ops...) }
+func (o Opcodes) Lahf(ops ...Operand)             { o.a.op("LAHF", ops...) }
+func (o Opcodes) LAHF(ops ...Operand)             { o.a.op("LAHF", ops...) }
+func (o Opcodes) Larl(ops ...Operand)             { o.a.op("LARL", ops...) }
+func (o Opcodes) LARL(ops ...Operand)             { o.a.op("LARL", ops...) }
+func (o Opcodes) Larw(ops ...Operand)             { o.a.op("LARW", ops...) }
+func (o Opcodes) LARW(ops ...Operand)             { o.a.op("LARW", ops...) }
+func (o Opcodes) Lddqu(ops ...Operand)            { o.a.op("LDDQU", ops...) }
+func (o Opcodes) LDDQU(ops ...Operand)            { o.a.op("LDDQU", ops...) }
+func (o Opcodes) Ldmxcsr(ops ...Operand)          { o.a.op("LDMXCSR", ops...) }
+func (o Opcodes) LDMXCSR(ops ...Operand)          { o.a.op("LDMXCSR", ops...) }
+func (o Opcodes) Leal(ops ...Operand)             { o.a.op("LEAL", ops...) }
+func (o Opcodes) LEAL(ops ...Operand)             { o.a.op("LEAL", ops...) }
+func (o Opcodes) Leaq(ops ...Operand)             { o.a.op("LEAQ", ops...) }
+func (o Opcodes) LEAQ(ops ...Operand)             { o.a.op("LEAQ", ops...) }
+func (o Opcodes) Leavel(ops ...Operand)           { o.a.op("LEAVEL", ops...) }
+func (o Opcodes) LEAVEL(ops ...Operand)           { o.a.op("LEAVEL", ops...) }
+func (o Opcodes) Leaveq(ops ...Operand)           { o.a.op("LEAVEQ", ops...) }
+func (o Opcodes) LEAVEQ(ops ...Operand)           { o.a.op("LEAVEQ", ops...) }
+func (o Opcodes) Leavew(ops ...Operand)           { o.a.op("LEAVEW", ops...) }
+func (o Opcodes) LEAVEW(ops ...Operand)           { o.a.op("LEAVEW", ops...) }
+func (o Opcodes) Leaw(ops ...Operand)             { o.a.op("LEAW", ops...) }
+func (o Opcodes) LEAW(ops ...Operand)             { o.a.op("LEAW", ops...) }
+func (o Opcodes) Lfence(ops ...Operand)           { o.a.op("LFENCE", ops...) }
+func (o Opcodes) LFENCE(ops ...Operand)           { o.a.op("LFENCE", ops...) }
+func (o Opcodes) Lock(ops ...Operand)             { o.a.op("LOCK", ops...) }
+func (o Opcodes) LOCK(ops ...Operand)             { o.a.op("LOCK", ops...) }
+func (o Opcodes) Lodsb(ops ...Operand)            { o.a.op("LODSB", ops...) }
+func (o Opcodes) LODSB(ops ...Operand)            { o.a.op("LODSB", ops...) }
+func (o Opcodes) Lodsl(ops ...Operand)            { o.a.op("LODSL", ops...) }
+func (o Opcodes) LODSL(ops ...Operand)            { o.a.op("LODSL", ops...) }
+func (o Opcodes) Lodsq(ops ...Operand)            { o.a.op("LODSQ", ops...) }
+func (o Opcodes) LODSQ(ops ...Operand)            { o.a.op("LODSQ", ops...) }
+func (o Opcodes) Lodsw(ops ...Operand)            { o.a.op("LODSW", ops...) }
+func (o Opcodes) LODSW(ops ...Operand)            { o.a.op("LODSW", ops...) }
+func (o Opcodes) Long(ops ...Operand)             { o.a.op("LONG", ops...) }
+func (o Opcodes) LONG(ops ...Operand)             { o.a.op("LONG", ops...) }
+func (o Opcodes) Loop(ops ...Operand)             { o.a.op("LOOP", ops...) }
+func (o Opcodes) LOOP(ops ...Operand)             { o.a.op("LOOP", ops...) }
+func (o Opcodes) Loopeq(ops ...Operand)           { o.a.op("LOOPEQ", ops...) }
+func (o Opcodes) LOOPEQ(ops ...Operand)           { o.a.op("LOOPEQ", ops...) }
+func (o Opcodes) Loopne(ops ...Operand)           { o.a.op("LOOPNE", ops...) }
+func (o Opcodes) LOOPNE(ops ...Operand)           { o.a.op("LOOPNE", ops...) }
+func (o Opcodes) Lsll(ops ...Operand)             { o.a.op("LSLL", ops...) }
+func (o Opcodes) LSLL(ops ...Operand)             { o.a.op("LSLL", ops...) }
+func (o Opcodes) Lslw(ops ...Operand)             { o.a.op("LSLW", ops...) }
+func (o Opcodes) LSLW(ops ...Operand)             { o.a.op("LSLW", ops...) }
+func (o Opcodes) Maskmovou(ops ...Operand)        { o.a.op("MASKMOVOU", ops...) }
+func (o Opcodes) MASKMOVOU(ops ...Operand)        { o.a.op("MASKMOVOU", ops...) }
+func (o Opcodes) Maskmovq(ops ...Operand)         { o.a.op("MASKMOVQ", ops...) }
+func (o Opcodes) MASKMOVQ(ops ...Operand)         { o.a.op("MASKMOVQ", ops...) }
+func (o Opcodes) Maxpd(ops ...Operand)            { o.a.op("MAXPD", ops...) }
+func (o Opcodes) MAXPD(ops ...Operand)            { o.a.op("MAXPD", ops...) }
+func (o Opcodes) Maxps(ops ...Operand)            { o.a.op("MAXPS", ops...) }
+func (o Opcodes) MAXPS(ops ...Operand)            { o.a.op("MAXPS", ops...) }
+func (o Opcodes) Maxsd(ops ...Operand)            { o.a.op("MAXSD", ops...) }
+func (o Opcodes) MAXSD(ops ...Operand)            { o.a.op("MAXSD", ops...) }
+func (o Opcodes) Maxss(ops ...Operand)            { o.a.op("MAXSS", ops...) }
+func (o Opcodes) MAXSS(ops ...Operand)            { o.a.op("MAXSS", ops...) }
+func (o Opcodes) Mfence(ops ...Operand)           { o.a.op("MFENCE", ops...) }
+func (o Opcodes) MFENCE(ops ...Operand)           { o.a.op("MFENCE", ops...) }
+func (o Opcodes) Minpd(ops ...Operand)            { o.a.op("MINPD", ops...) }
+func (o Opcodes) MINPD(ops ...Operand)            { o.a.op("MINPD", ops...) }
+func (o Opcodes) Minps(ops ...Operand)            { o.a.op("MINPS", ops...) }
+func (o Opcodes) MINPS(ops ...Operand)            { o.a.op("MINPS", ops...) }
+func (o Opcodes) Minsd(ops ...Operand)            { o.a.op("MINSD", ops...) }
+func (o Opcodes) MINSD(ops ...Operand)            { o.a.op("MINSD", ops...) }
+func (o Opcodes) Minss(ops ...Operand)            { o.a.op("MINSS", ops...) }
+func (o Opcodes) MINSS(ops ...Operand)            { o.a.op("MINSS", ops...) }
+func (o Opcodes) Movapd(ops ...Operand)           { o.a.op("MOVAPD", ops...) }
+func (o Opcodes) MOVAPD(ops ...Operand)           { o.a.op("MOVAPD", ops...) }
+func (o Opcodes) Movaps(ops ...Operand)           { o.a.op("MOVAPS", ops...) }
+func (o Opcodes) MOVAPS(ops ...Operand)           { o.a.op("MOVAPS", ops...) }
+func (o Opcodes) Movb(ops ...Operand)             { o.a.op("MOVB", ops...) }
+func (o Opcodes) MOVB(ops ...Operand)             { o.a.op("MOVB", ops...) }
+func (o Opcodes) Movblsx(ops ...Operand)          { o.a.op("MOVBLSX", ops...) }
+func (o Opcodes) MOVBLSX(ops ...Operand)          { o.a.op("MOVBLSX", ops...) }
+func (o Opcodes) Movblzx(ops ...Operand)          { o.a.op("MOVBLZX", ops...) }
+func (o Opcodes) MOVBLZX(ops ...Operand)          { o.a.op("MOVBLZX", ops...) }
+func (o Opcodes) Movbqsx(ops ...Operand)          { o.a.op("MOVBQSX", ops...) }
+func (o Opcodes) MOVBQSX(ops ...Operand)          { o.a.op("MOVBQSX", ops...) }
+func (o Opcodes) Movbqzx(ops ...Operand)          { o.a.op("MOVBQZX", ops...) }
+func (o Opcodes) MOVBQZX(ops ...Operand)          { o.a.op("MOVBQZX", ops...) }
+func (o Opcodes) Movbwsx(ops ...Operand)          { o.a.op("MOVBWSX", ops...) }
+func (o Opcodes) MOVBWSX(ops ...Operand)          { o.a.op("MOVBWSX", ops...) }
+func (o Opcodes) Movbwzx(ops ...Operand)          { o.a.op("MOVBWZX", ops...) }
+func (o Opcodes) MOVBWZX(ops ...Operand)          { o.a.op("MOVBWZX", ops...) }
+func (o Opcodes) Movddup(ops ...Operand)          { o.a.op("MOVDDUP", ops...) }
+func (o Opcodes) MOVDDUP(ops ...Operand)          { o.a.op("MOVDDUP", ops...) }
+func (o Opcodes) Movhlps(ops ...Operand)          { o.a.op("MOVHLPS", ops...) }
+func (o Opcodes) MOVHLPS(ops ...Operand)          { o.a.op("MOVHLPS", ops...) }
+func (o Opcodes) Movhpd(ops ...Operand)           { o.a.op("MOVHPD", ops...) }
+func (o Opcodes) MOVHPD(ops ...Operand)           { o.a.op("MOVHPD", ops...) }
+func (o Opcodes) Movhps(ops ...Operand)           { o.a.op("MOVHPS", ops...) }
+func (o Opcodes) MOVHPS(ops ...Operand)           { o.a.op("MOVHPS", ops...) }
+func (o Opcodes) Movl(ops ...Operand)             { o.a.op("MOVL", ops...) }
+func (o Opcodes) MOVL(ops ...Operand)             { o.a.op("MOVL", ops...) }
+func (o Opcodes) Movlhps(ops ...Operand)          { o.a.op("MOVLHPS", ops...) }
+func (o Opcodes) MOVLHPS(ops ...Operand)          { o.a.op("MOVLHPS", ops...) }
+func (o Opcodes) Movlpd(ops ...Operand)           { o.a.op("MOVLPD", ops...) }
+func (o Opcodes) MOVLPD(ops ...Operand)           { o.a.op("MOVLPD", ops...) }
+func (o Opcodes) Movlps(ops ...Operand)           { o.a.op("MOVLPS", ops...) }
+func (o Opcodes) MOVLPS(ops ...Operand)           { o.a.op("MOVLPS", ops...) }
+func (o Opcodes) Movlqsx(ops ...Operand)          { o.a.op("MOVLQSX", ops...) }
+func (o Opcodes) MOVLQSX(ops ...Operand)          { o.a.op("MOVLQSX", ops...) }
+func (o Opcodes) Movlqzx(ops ...Operand)          { o.a.op("MOVLQZX", ops...) }
+func (o Opcodes) MOVLQZX(ops ...Operand)          { o.a.op("MOVLQZX", ops...) }
+func (o Opcodes) Movmskpd(ops ...Operand)         { o.a.op("MOVMSKPD", ops...) }
+func (o Opcodes) MOVMSKPD(ops ...Operand)         { o.a.op("MOVMSKPD", ops...) }
+func (o Opcodes) Movmskps(ops ...Operand)         { o.a.op("MOVMSKPS", ops...) }
+func (o Opcodes) MOVMSKPS(ops ...Operand)         { o.a.op("MOVMSKPS", ops...) }
+func (o Opcodes) Movntdqa(ops ...Operand)         { o.a.op("MOVNTDQA", ops...) }
+func (o Opcodes) MOVNTDQA(ops ...Operand)         { o.a.op("MOVNTDQA", ops...) }
+func (o Opcodes) Movntil(ops ...Operand)          { o.a.op("MOVNTIL", ops...) }
+func (o Opcodes) MOVNTIL(ops ...Operand)          { o.a.op("MOVNTIL", ops...) }
+func (o Opcodes) Movntiq(ops ...Operand)          { o.a.op("MOVNTIQ", ops...) }
+func (o Opcodes) MOVNTIQ(ops ...Operand)          { o.a.op("MOVNTIQ", ops...) }
+func (o Opcodes) Movnto(ops ...Operand)           { o.a.op("MOVNTO", ops...) }
+func (o Opcodes) MOVNTO(ops ...Operand)           { o.a.op("MOVNTO", ops...) }
+func (o Opcodes) Movntpd(ops ...Operand)          { o.a.op("MOVNTPD", ops...) }
+func (o Opcodes) MOVNTPD(ops ...Operand)          { o.a.op("MOVNTPD", ops...) }
+func (o Opcodes) Movntps(ops ...Operand)          { o.a.op("MOVNTPS", ops...) }
+func (o Opcodes) MOVNTPS(ops ...Operand)          { o.a.op("MOVNTPS", ops...) }
+func (o Opcodes) Movntq(ops ...Operand)           { o.a.op("MOVNTQ", ops...) }
+func (o Opcodes) MOVNTQ(ops ...Operand)           { o.a.op("MOVNTQ", ops...) }
+func (o Opcodes) Movo(ops ...Operand)             { o.a.op("MOVO", ops...) }
+func (o Opcodes) MOVO(ops ...Operand)             { o.a.op("MOVO", ops...) }
+func (o Opcodes) Movou(ops ...Operand)            { o.a.op("MOVOU", ops...) }
+func (o Opcodes) MOVOU(ops ...Operand)            { o.a.op("MOVOU", ops...) }
+func (o Opcodes) Movq(ops ...Operand)             { o.a.op("MOVQ", ops...) }
+func (o Opcodes) MOVQ(ops ...Operand)             { o.a.op("MOVQ", ops...) }
+func (o Opcodes) Movql(ops ...Operand)            { o.a.op("MOVQL", ops...) }
+func (o Opcodes) MOVQL(ops ...Operand)            { o.a.op("MOVQL", ops...) }
+func (o Opcodes) Movqozx(ops ...Operand)          { o.a.op("MOVQOZX", ops...) }
+func (o Opcodes) MOVQOZX(ops ...Operand)          { o.a.op("MOVQOZX", ops...) }
+func (o Opcodes) Movsb(ops ...Operand)            { o.a.op("MOVSB", ops...) }
+func (o Opcodes) MOVSB(ops ...Operand)            { o.a.op("MOVSB", ops...) }
+func (o Opcodes) Movsd(ops ...Operand)            { o.a.op("MOVSD", ops...) }
+func (o Opcodes) MOVSD(ops ...Operand)            { o.a.op("MOVSD", ops...) }
+func (o Opcodes) Movshdup(ops ...Operand)         { o.a.op("MOVSHDUP", ops...) }
+func (o Opcodes) MOVSHDUP(ops ...Operand)         { o.a.op("MOVSHDUP", ops...) }
+func (o Opcodes) Movsl(ops ...Operand)            { o.a.op("MOVSL", ops...) }
+func (o Opcodes) MOVSL(ops ...Operand)            { o.a.op("MOVSL", ops...) }
+func (o Opcodes) Movsldup(ops ...Operand)         { o.a.op("MOVSLDUP", ops...) }
+func (o Opcodes) MOVSLDUP(ops ...Operand)         { o.a.op("MOVSLDUP", ops...) }
+func (o Opcodes) Movsq(ops ...Operand)            { o.a.op("MOVSQ", ops...) }
+func (o Opcodes) MOVSQ(ops ...Operand)            { o.a.op("MOVSQ", ops...) }
+func (o Opcodes) Movss(ops ...Operand)            { o.a.op("MOVSS", ops...) }
+func (o Opcodes) MOVSS(ops ...Operand)            { o.a.op("MOVSS", ops...) }
+func (o Opcodes) Movsw(ops ...Operand)            { o.a.op("MOVSW", ops...) }
+func (o Opcodes) MOVSW(ops ...Operand)            { o.a.op("MOVSW", ops...) }
+func (o Opcodes) Movupd(ops ...Operand)           { o.a.op("MOVUPD", ops...) }
+func (o Opcodes) MOVUPD(ops ...Operand)           { o.a.op("MOVUPD", ops...) }
+func (o Opcodes) Movups(ops ...Operand)           { o.a.op("MOVUPS", ops...) }
+func (o Opcodes) MOVUPS(ops ...Operand)           { o.a.op("MOVUPS", ops...) }
+func (o Opcodes) Movw(ops ...Operand)             { o.a.op("MOVW", ops...) }
+func (o Opcodes) MOVW(ops ...Operand)             { o.a.op("MOVW", ops...) }
+func (o Opcodes) Movwlsx(ops ...Operand)          { o.a.op("MOVWLSX", ops...) }
+func (o Opcodes) MOVWLSX(ops ...Operand)          { o.a.op("MOVWLSX", ops...) }
+func (o Opcodes) Movwlzx(ops ...Operand)          { o.a.op("MOVWLZX", ops...) }
+func (o Opcodes) MOVWLZX(ops ...Operand)          { o.a.op("MOVWLZX", ops...) }
+func (o Opcodes) Movwqsx(ops ...Operand)          { o.a.op("MOVWQSX", ops...) }
+func (o Opcodes) MOVWQSX(ops ...Operand)          { o.a.op("MOVWQSX", ops...) }
+func (o Opcodes) Movwqzx(ops ...Operand)          { o.a.op("MOVWQZX", ops...) }
+func (o Opcodes) MOVWQZX(ops ...Operand)          { o.a.op("MOVWQZX", ops...) }
+func (o Opcodes) Mpsadbw(ops ...Operand)          { o.a.op("MPSADBW", ops...) }
+func (o Opcodes) MPSADBW(ops ...Operand)          { o.a.op("MPSADBW", ops...) }
+func (o Opcodes) Mulb(ops ...Operand)             { o.a.op("MULB", ops...) }
+func (o Opcodes) MULB(ops ...Operand)             { o.a.op("MULB", ops...) }
+func (o Opcodes) Mull(ops ...Operand)             { o.a.op("MULL", ops...) }
+func (o Opcodes) MULL(ops ...Operand)             { o.a.op("MULL", ops...) }
+func (o Opcodes) Mulpd(ops ...Operand)            { o.a.op("MULPD", ops...) }
+func (o Opcodes) MULPD(ops ...Operand)            { o.a.op("MULPD", ops...) }
+func (o Opcodes) Mulps(ops ...Operand)            { o.a.op("MULPS", ops...) }
+func (o Opcodes) MULPS(ops ...Operand)            { o.a.op("MULPS", ops...) }
+func (o Opcodes) Mulq(ops ...Operand)             { o.a.op("MULQ", ops...) }
+func (o Opcodes) MULQ(ops ...Operand)             { o.a.op("MULQ", ops...) }
+func (o Opcodes) Mulsd(ops ...Operand)            { o.a.op("MULSD", ops...) }
+func (o Opcodes) MULSD(ops ...Operand)            { o.a.op("MULSD", ops...) }
+func (o Opcodes) Mulss(ops ...Operand)            { o.a.op("MULSS", ops...) }
+func (o Opcodes) MULSS(ops ...Operand)            { o.a.op("MULSS", ops...) }
+func (o Opcodes) Mulw(ops ...Operand)             { o.a.op("MULW", ops...) }
+func (o Opcodes) MULW(ops ...Operand)             { o.a.op("MULW", ops...) }
+func (o Opcodes) Mulxl(ops ...Operand)            { o.a.op("MULXL", ops...) }
+func (o Opcodes) MULXL(ops ...Operand)            { o.a.op("MULXL", ops...) }
+func (o Opcodes) Mulxq(ops ...Operand)            { o.a.op("MULXQ", ops...) }
+func (o Opcodes) MULXQ(ops ...Operand)            { o.a.op("MULXQ", ops...) }
+func (o Opcodes) Negb(ops ...Operand)             { o.a.op("NEGB", ops...) }
+func (o Opcodes) NEGB(ops ...Operand)             { o.a.op("NEGB", ops...) }
+func (o Opcodes) Negl(ops ...Operand)             { o.a.op("NEGL", ops...) }
+func (o Opcodes) NEGL(ops ...Operand)             { o.a.op("NEGL", ops...) }
+func (o Opcodes) Negq(ops ...Operand)             { o.a.op("NEGQ", ops...) }
+func (o Opcodes) NEGQ(ops ...Operand)             { o.a.op("NEGQ", ops...) }
+func (o Opcodes) Negw(ops ...Operand)             { o.a.op("NEGW", ops...) }
+func (o Opcodes) NEGW(ops ...Operand)             { o.a.op("NEGW", ops...) }
+func (o Opcodes) Notb(ops ...Operand)             { o.a.op("NOTB", ops...) }
+func (o Opcodes) NOTB(ops ...Operand)             { o.a.op("NOTB", ops...) }
+func (o Opcodes) Notl(ops ...Operand)             { o.a.op("NOTL", ops...) }
+func (o Opcodes) NOTL(ops ...Operand)             { o.a.op("NOTL", ops...) }
+func (o Opcodes) Notq(ops ...Operand)             { o.a.op("NOTQ", ops...) }
+func (o Opcodes) NOTQ(ops ...Operand)             { o.a.op("NOTQ", ops...) }
+func (o Opcodes) Notw(ops ...Operand)             { o.a.op("NOTW", ops...) }
+func (o Opcodes) NOTW(ops ...Operand)             { o.a.op("NOTW", ops...) }
+func (o Opcodes) Orb(ops ...Operand)              { o.a.op("ORB", ops...) }
+func (o Opcodes) ORB(ops ...Operand)              { o.a.op("ORB", ops...) }
+func (o Opcodes) Orl(ops ...Operand)              { o.a.op("ORL", ops...) }
+func (o Opcodes) ORL(ops ...Operand)              { o.a.op("ORL", ops...) }
+func (o Opcodes) Orpd(ops ...Operand)             { o.a.op("ORPD", ops...) }
+func (o Opcodes) ORPD(ops ...Operand)             { o.a.op("ORPD", ops...) }
+func (o Opcodes) Orps(ops ...Operand)             { o.a.op("ORPS", ops...) }
+func (o Opcodes) ORPS(ops ...Operand)             { o.a.op("ORPS", ops...) }
+func (o Opcodes) Orq(ops ...Operand)              { o.a.op("ORQ", ops...) }
+func (o Opcodes) ORQ(ops ...Operand)              { o.a.op("ORQ", ops...) }
+func (o Opcodes) Orw(ops ...Operand)              { o.a.op("ORW", ops...) }
+func (o Opcodes) ORW(ops ...Operand)              { o.a.op("ORW", ops...) }
+func (o Opcodes) Outb(ops ...Operand)             { o.a.op("OUTB", ops...) }
+func (o Opcodes) OUTB(ops ...Operand)             { o.a.op("OUTB", ops...) }
+func (o Opcodes) Outl(ops ...Operand)             { o.a.op("OUTL", ops...) }
+func (o Opcodes) OUTL(ops ...Operand)             { o.a.op("OUTL", ops...) }
+func (o Opcodes) Outsb(ops ...Operand)            { o.a.op("OUTSB", ops...) }
+func (o Opcodes) OUTSB(ops ...Operand)            { o.a.op("OUTSB", ops...) }
+func (o Opcodes) Outsl(ops ...Operand)            { o.a.op("OUTSL", ops...) }
+func (o Opcodes) OUTSL(ops ...Operand)            { o.a.op("OUTSL", ops...) }
+func (o Opcodes) Outsw(ops ...Operand)            { o.a.op("OUTSW", ops...) }
+func (o Opcodes) OUTSW(ops ...Operand)            { o.a.op("OUTSW", ops...) }
+func (o Opcodes) Outw(ops ...Operand)             { o.a.op("OUTW", ops...) }
+func (o Opcodes) OUTW(ops ...Operand)             { o.a.op("OUTW", ops...) }
+func (o Opcodes) Pabsb(ops ...Operand)            { o.a.op("PABSB", ops...) }
+func (o Opcodes) PABSB(ops ...Operand)            { o.a.op("PABSB", ops...) }
+func (o Opcodes) Pabsd(ops ...Operand)            { o.a.op("PABSD", ops...) }
+func (o Opcodes) PABSD(ops ...Operand)            { o.a.op("PABSD", ops...) }
+func (o Opcodes) Pabsw(ops ...Operand)            { o.a.op("PABSW", ops...) }
+func (o Opcodes) PABSW(ops ...Operand)            { o.a.op("PABSW", ops...) }
+func (o Opcodes) Packsslw(ops ...Operand)         { o.a.op("PACKSSLW", ops...) }
+func (o Opcodes) PACKSSLW(ops ...Operand)         { o.a.op("PACKSSLW", ops...) }
+func (o Opcodes) Packsswb(ops ...Operand)         { o.a.op("PACKSSWB", ops...) }
+func (o Opcodes) PACKSSWB(ops ...Operand)         { o.a.op("PACKSSWB", ops...) }
+func (o Opcodes) Packusdw(ops ...Operand)         { o.a.op("PACKUSDW", ops...) }
+func (o Opcodes) PACKUSDW(ops ...Operand)         { o.a.op("PACKUSDW", ops...) }
+func (o Opcodes) Packuswb(ops ...Operand)         { o.a.op("PACKUSWB", ops...) }
+func (o Opcodes) PACKUSWB(ops ...Operand)         { o.a.op("PACKUSWB", ops...) }
+func (o Opcodes) Paddb(ops ...Operand)            { o.a.op("PADDB", ops...) }
+func (o Opcodes) PADDB(ops ...Operand)            { o.a.op("PADDB", ops...) }
+func (o Opcodes) Paddl(ops ...Operand)            { o.a.op("PADDL", ops...) }
+func (o Opcodes) PADDL(ops ...Operand)            { o.a.op("PADDL", ops...) }
+func (o Opcodes) Paddq(ops ...Operand)            { o.a.op("PADDQ", ops...) }
+func (o Opcodes) PADDQ(ops ...Operand)            { o.a.op("PADDQ", ops...) }
+func (o Opcodes) Paddsb(ops ...Operand)           { o.a.op("PADDSB", ops...) }
+func (o Opcodes) PADDSB(ops ...Operand)           { o.a.op("PADDSB", ops...) }
+func (o Opcodes) Paddsw(ops ...Operand)           { o.a.op("PADDSW", ops...) }
+func (o Opcodes) PADDSW(ops ...Operand)           { o.a.op("PADDSW", ops...) }
+func (o Opcodes) Paddusb(ops ...Operand)          { o.a.op("PADDUSB", ops...) }
+func (o Opcodes) PADDUSB(ops ...Operand)          { o.a.op("PADDUSB", ops...) }
+func (o Opcodes) Paddusw(ops ...Operand)          { o.a.op("PADDUSW", ops...) }
+func (o Opcodes) PADDUSW(ops ...Operand)          { o.a.op("PADDUSW", ops...) }
+func (o Opcodes) Paddw(ops ...Operand)            { o.a.op("PADDW", ops...) }
+func (o Opcodes) PADDW(ops ...Operand)            { o.a.op("PADDW", ops...) }
+func (o Opcodes) Palignr(ops ...Operand)          { o.a.op("PALIGNR", ops...) }
+func (o Opcodes) PALIGNR(ops ...Operand)          { o.a.op("PALIGNR", ops...) }
+func (o Opcodes) Pand(ops ...Operand)             { o.a.op("PAND", ops...) }
+func (o Opcodes) PAND(ops ...Operand)             { o.a.op("PAND", ops...) }
+func (o Opcodes) Pandn(ops ...Operand)            { o.a.op("PANDN", ops...) }
+func (o Opcodes) PANDN(ops ...Operand)            { o.a.op("PANDN", ops...) }
+func (o Opcodes) Pause(ops ...Operand)            { o.a.op("PAUSE", ops...) }
+func (o Opcodes) PAUSE(ops ...Operand)            { o.a.op("PAUSE", ops...) }
+func (o Opcodes) Pavgb(ops ...Operand)            { o.a.op("PAVGB", ops...) }
+func (o Opcodes) PAVGB(ops ...Operand)            { o.a.op("PAVGB", ops...) }
+func (o Opcodes) Pavgw(ops ...Operand)            { o.a.op("PAVGW", ops...) }
+func (o Opcodes) PAVGW(ops ...Operand)            { o.a.op("PAVGW", ops...) }
+func (o Opcodes) Pblendw(ops ...Operand)          { o.a.op("PBLENDW", ops...) }
+func (o Opcodes) PBLENDW(ops ...Operand)          { o.a.op("PBLENDW", ops...) }
+func (o Opcodes) Pclmulqdq(ops ...Operand)        { o.a.op("PCLMULQDQ", ops...) }
+func (o Opcodes) PCLMULQDQ(ops ...Operand)        { o.a.op("PCLMULQDQ", ops...) }
+func (o Opcodes) Pcmpeqb(ops ...Operand)          { o.a.op("PCMPEQB", ops...) }
+func (o Opcodes) PCMPEQB(ops ...Operand)          { o.a.op("PCMPEQB", ops...) }
+func (o Opcodes) Pcmpeql(ops ...Operand)          { o.a.op("PCMPEQL", ops...) }
+func (o Opcodes) PCMPEQL(ops ...Operand)          { o.a.op("PCMPEQL", ops...) }
+func (o Opcodes) Pcmpeqq(ops ...Operand)          { o.a.op("PCMPEQQ", ops...) }
+func (o Opcodes) PCMPEQQ(ops ...Operand)          { o.a.op("PCMPEQQ", ops...) }
+func (o Opcodes) Pcmpeqw(ops ...Operand)          { o.a.op("PCMPEQW", ops...) }
+func (o Opcodes) PCMPEQW(ops ...Operand)          { o.a.op("PCMPEQW", ops...) }
+func (o Opcodes) Pcmpestri(ops ...Operand)        { o.a.op("PCMPESTRI", ops...) }
+func (o Opcodes) PCMPESTRI(ops ...Operand)        { o.a.op("PCMPESTRI", ops...) }
+func (o Opcodes) Pcmpestrm(ops ...Operand)        { o.a.op("PCMPESTRM", ops...) }
+func (o Opcodes) PCMPESTRM(ops ...Operand)        { o.a.op("PCMPESTRM", ops...) }
+func (o Opcodes) Pcmpgtb(ops ...Operand)          { o.a.op("PCMPGTB", ops...) }
+func (o Opcodes) PCMPGTB(ops ...Operand)          { o.a.op("PCMPGTB", ops...) }
+func (o Opcodes) Pcmpgtl(ops ...Operand)          { o.a.op("PCMPGTL", ops...) }
+func (o Opcodes) PCMPGTL(ops ...Operand)          { o.a.op("PCMPGTL", ops...) }
+func (o Opcodes) Pcmpgtq(ops ...Operand)          { o.a.op("PCMPGTQ", ops...) }
+func (o Opcodes) PCMPGTQ(ops ...Operand)          { o.a.op("PCMPGTQ", ops...) }
+func (o Opcodes) Pcmpgtw(ops ...Operand)          { o.a.op("PCMPGTW", ops...) }
+func (o Opcodes) PCMPGTW(ops ...Operand)          { o.a.op("PCMPGTW", ops...) }
+func (o Opcodes) Pcmpistri(ops ...Operand)        { o.a.op("PCMPISTRI", ops...) }
+func (o Opcodes) PCMPISTRI(ops ...Operand)        { o.a.op("PCMPISTRI", ops...) }
+func (o Opcodes) Pcmpistrm(ops ...Operand)        { o.a.op("PCMPISTRM", ops...) }
+func (o Opcodes) PCMPISTRM(ops ...Operand)        { o.a.op("PCMPISTRM", ops...) }
+func (o Opcodes) Pdepl(ops ...Operand)            { o.a.op("PDEPL", ops...) }
+func (o Opcodes) PDEPL(ops ...Operand)            { o.a.op("PDEPL", ops...) }
+func (o Opcodes) Pdepq(ops ...Operand)            { o.a.op("PDEPQ", ops...) }
+func (o Opcodes) PDEPQ(ops ...Operand)            { o.a.op("PDEPQ", ops...) }
+func (o Opcodes) Pextl(ops ...Operand)            { o.a.op("PEXTL", ops...) }
+func (o Opcodes) PEXTL(ops ...Operand)            { o.a.op("PEXTL", ops...) }
+func (o Opcodes) Pextq(ops ...Operand)            { o.a.op("PEXTQ", ops...) }
+func (o Opcodes) PEXTQ(ops ...Operand)            { o.a.op("PEXTQ", ops...) }
+func (o Opcodes) Pextrb(ops ...Operand)           { o.a.op("PEXTRB", ops...) }
+func (o Opcodes) PEXTRB(ops ...Operand)           { o.a.op("PEXTRB", ops...) }
+func (o Opcodes) Pextrd(ops ...Operand)           { o.a.op("PEXTRD", ops...) }
+func (o Opcodes) PEXTRD(ops ...Operand)           { o.a.op("PEXTRD", ops...) }
+func (o Opcodes) Pextrq(ops ...Operand)           { o.a.op("PEXTRQ", ops...) }
+func (o Opcodes) PEXTRQ(ops ...Operand)           { o.a.op("PEXTRQ", ops...) }
+func (o Opcodes) Phaddd(ops ...Operand)           { o.a.op("PHADDD", ops...) }
+func (o Opcodes) PHADDD(ops ...Operand)           { o.a.op("PHADDD", ops...) }
+func (o Opcodes) Phaddsw(ops ...Operand)          { o.a.op("PHADDSW", ops...) }
+func (o Opcodes) PHADDSW(ops ...Operand)          { o.a.op("PHADDSW", ops...) }
+func (o Opcodes) Phaddw(ops ...Operand)           { o.a.op("PHADDW", ops...) }
+func (o Opcodes) PHADDW(ops ...Operand)           { o.a.op("PHADDW", ops...) }
+func (o Opcodes) Phminposuw(ops ...Operand)       { o.a.op("PHMINPOSUW", ops...) }
+func (o Opcodes) PHMINPOSUW(ops ...Operand)       { o.a.op("PHMINPOSUW", ops...) }
+func (o Opcodes) Phsubd(ops ...Operand)           { o.a.op("PHSUBD", ops...) }
+func (o Opcodes) PHSUBD(ops ...Operand)           { o.a.op("PHSUBD", ops...) }
+func (o Opcodes) Phsubsw(ops ...Operand)          { o.a.op("PHSUBSW", ops...) }
+func (o Opcodes) PHSUBSW(ops ...Operand)          { o.a.op("PHSUBSW", ops...) }
+func (o Opcodes) Phsubw(ops ...Operand)           { o.a.op("PHSUBW", ops...) }
+func (o Opcodes) PHSUBW(ops ...Operand)           { o.a.op("PHSUBW", ops...) }
+func (o Opcodes) Pinsrb(ops ...Operand)           { o.a.op("PINSRB", ops...) }
+func (o Opcodes) PINSRB(ops ...Operand)           { o.a.op("PINSRB", ops...) }
+func (o Opcodes) Pinsrd(ops ...Operand)           { o.a.op("PINSRD", ops...) }
+func (o Opcodes) PINSRD(ops ...Operand)           { o.a.op("PINSRD", ops...) }
+func (o Opcodes) Pinsrq(ops ...Operand)           { o.a.op("PINSRQ", ops...) }
+func (o Opcodes) PINSRQ(ops ...Operand)           { o.a.op("PINSRQ", ops...) }
+func (o Opcodes) Pinsrw(ops ...Operand)           { o.a.op("PINSRW", ops...) }
+func (o Opcodes) PINSRW(ops ...Operand)           { o.a.op("PINSRW", ops...) }
+func (o Opcodes) Pmaddubsw(ops ...Operand)        { o.a.op("PMADDUBSW", ops...) }
+func (o Opcodes) PMADDUBSW(ops ...Operand)        { o.a.op("PMADDUBSW", ops...) }
+func (o Opcodes) Pmaddwl(ops ...Operand)          { o.a.op("PMADDWL", ops...) }
+func (o Opcodes) PMADDWL(ops ...Operand)          { o.a.op("PMADDWL", ops...) }
+func (o Opcodes) Pmaxsb(ops ...Operand)           { o.a.op("PMAXSB", ops...) }
+func (o Opcodes) PMAXSB(ops ...Operand)           { o.a.op("PMAXSB", ops...) }
+func (o Opcodes) Pmaxsd(ops ...Operand)           { o.a.op("PMAXSD", ops...) }
+func (o Opcodes) PMAXSD(ops ...Operand)           { o.a.op("PMAXSD", ops...) }
+func (o Opcodes) Pmaxsw(ops ...Operand)           { o.a.op("PMAXSW", ops...) }
+func (o Opcodes) PMAXSW(ops ...Operand)           { o.a.op("PMAXSW", ops...) }
+func (o Opcodes) Pmaxub(ops ...Operand)           { o.a.op("PMAXUB", ops...) }
+func (o Opcodes) PMAXUB(ops ...Operand)           { o.a.op("PMAXUB", ops...) }
+func (o Opcodes) Pmaxud(ops ...Operand)           { o.a.op("PMAXUD", ops...) }
+func (o Opcodes) PMAXUD(ops ...Operand)           { o.a.op("PMAXUD", ops...) }
+func (o Opcodes) Pmaxuw(ops ...Operand)           { o.a.op("PMAXUW", ops...) }
+func (o Opcodes) PMAXUW(ops ...Operand)           { o.a.op("PMAXUW", ops...) }
+func (o Opcodes) Pminsb(ops ...Operand)           { o.a.op("PMINSB", ops...) }
+func (o Opcodes) PMINSB(ops ...Operand)           { o.a.op("PMINSB", ops...) }
+func (o Opcodes) Pminsd(ops ...Operand)           { o.a.op("PMINSD", ops...) }
+func (o Opcodes) PMINSD(ops ...Operand)           { o.a.op("PMINSD", ops...) }
+func (o Opcodes) Pminsw(ops ...Operand)           { o.a.op("PMINSW", ops...) }
+func (o Opcodes) PMINSW(ops ...Operand)           { o.a.op("PMINSW", ops...) }
+func (o Opcodes) Pminub(ops ...Operand)           { o.a.op("PMINUB", ops...) }
+func (o Opcodes) PMINUB(ops ...Operand)           { o.a.op("PMINUB", ops...) }
+func (o Opcodes) Pminud(ops ...Operand)           { o.a.op("PMINUD", ops...) }
+func (o Opcodes) PMINUD(ops ...Operand)           { o.a.op("PMINUD", ops...) }
+func (o Opcodes) Pminuw(ops ...Operand)           { o.a.op("PMINUW", ops...) }
+func (o Opcodes) PMINUW(ops ...Operand)           { o.a.op("PMINUW", ops...) }
+func (o Opcodes) Pmovmskb(ops ...Operand)         { o.a.op("PMOVMSKB", ops...) }
+func (o Opcodes) PMOVMSKB(ops ...Operand)         { o.a.op("PMOVMSKB", ops...) }
+func (o Opcodes) Pmovsxbd(ops ...Operand)         { o.a.op("PMOVSXBD", ops...) }
+func (o Opcodes) PMOVSXBD(ops ...Operand)         { o.a.op("PMOVSXBD", ops...) }
+func (o Opcodes) Pmovsxbq(ops ...Operand)         { o.a.op("PMOVSXBQ", ops...) }
+func (o Opcodes) PMOVSXBQ(ops ...Operand)         { o.a.op("PMOVSXBQ", ops...) }
+func (o Opcodes) Pmovsxbw(ops ...Operand)         { o.a.op("PMOVSXBW", ops...) }
+func (o Opcodes) PMOVSXBW(ops ...Operand)         { o.a.op("PMOVSXBW", ops...) }
+func (o Opcodes) Pmovsxdq(ops ...Operand)         { o.a.op("PMOVSXDQ", ops...) }
+func (o Opcodes) PMOVSXDQ(ops ...Operand)         { o.a.op("PMOVSXDQ", ops...) }
+func (o Opcodes) Pmovsxwd(ops ...Operand)         { o.a.op("PMOVSXWD", ops...) }
+func (o Opcodes) PMOVSXWD(ops ...Operand)         { o.a.op("PMOVSXWD", ops...) }
+func (o Opcodes) Pmovsxwq(ops ...Operand)         { o.a.op("PMOVSXWQ", ops...) }
+func (o Opcodes) PMOVSXWQ(ops ...Operand)         { o.a.op("PMOVSXWQ", ops...) }
+func (o Opcodes) Pmovzxbd(ops ...Operand)         { o.a.op("PMOVZXBD", ops...) }
+func (o Opcodes) PMOVZXBD(ops ...Operand)         { o.a.op("PMOVZXBD", ops...) }
+func (o Opcodes) Pmovzxbq(ops ...Operand)         { o.a.op("PMOVZXBQ", ops...) }
+func (o Opcodes) PMOVZXBQ(ops ...Operand)         { o.a.op("PMOVZXBQ", ops...) }
+func (o Opcodes) Pmovzxbw(ops ...Operand)         { o.a.op("PMOVZXBW", ops...) }
+func (o Opcodes) PMOVZXBW(ops ...Operand)         { o.a.op("PMOVZXBW", ops...) }
+func (o Opcodes) Pmovzxdq(ops ...Operand)         { o.a.op("PMOVZXDQ", ops...) }
+func (o Opcodes) PMOVZXDQ(ops ...Operand)         { o.a.op("PMOVZXDQ", ops...) }
+func (o Opcodes) Pmovzxwd(ops ...Operand)         { o.a.op("PMOVZXWD", ops...) }
+func (o Opcodes) PMOVZXWD(ops ...Operand)         { o.a.op("PMOVZXWD", ops...) }
+func (o Opcodes) Pmovzxwq(ops ...Operand)         { o.a.op("PMOVZXWQ", ops...) }
+func (o Opcodes) PMOVZXWQ(ops ...Operand)         { o.a.op("PMOVZXWQ", ops...) }
+func (o Opcodes) Pmuldq(ops ...Operand)           { o.a.op("PMULDQ", ops...) }
+func (o Opcodes) PMULDQ(ops ...Operand)           { o.a.op("PMULDQ", ops...) }
+func (o Opcodes) Pmulhrsw(ops ...Operand)         { o.a.op("PMULHRSW", ops...) }
+func (o Opcodes) PMULHRSW(ops ...Operand)         { o.a.op("PMULHRSW", ops...) }
+func (o Opcodes) Pmulhuw(ops ...Operand)          { o.a.op("PMULHUW", ops...) }
+func (o Opcodes) PMULHUW(ops ...Operand)          { o.a.op("PMULHUW", ops...) }
+func (o Opcodes) Pmulhw(ops ...Operand)           { o.a.op("PMULHW", ops...) }
+func (o Opcodes) PMULHW(ops ...Operand)           { o.a.op("PMULHW", ops...) }
+func (o Opcodes) Pmulld(ops ...Operand)           { o.a.op("PMULLD", ops...) }
+func (o Opcodes) PMULLD(ops ...Operand)           { o.a.op("PMULLD", ops...) }
+func (o Opcodes) Pmullw(ops ...Operand)           { o.a.op("PMULLW", ops...) }
+func (o Opcodes) PMULLW(ops ...Operand)           { o.a.op("PMULLW", ops...) }
+func (o Opcodes) Pmululq(ops ...Operand)          { o.a.op("PMULULQ", ops...) }
+func (o Opcodes) PMULULQ(ops ...Operand)          { o.a.op("PMULULQ", ops...) }
+func (o Opcodes) Popal(ops ...Operand)            { o.a.op("POPAL", ops...) }
+func (o Opcodes) POPAL(ops ...Operand)            { o.a.op("POPAL", ops...) }
+func (o Opcodes) Popaw(ops ...Operand)            { o.a.op("POPAW", ops...) }
+func (o Opcodes) POPAW(ops ...Operand)            { o.a.op("POPAW", ops...) }
+func (o Opcodes) Popcntl(ops ...Operand)          { o.a.op("POPCNTL", ops...) }
+func (o Opcodes) POPCNTL(ops ...Operand)          { o.a.op("POPCNTL", ops...) }
+func (o Opcodes) Popcntq(ops ...Operand)          { o.a.op("POPCNTQ", ops...) }
+func (o Opcodes) POPCNTQ(ops ...Operand)          { o.a.op("POPCNTQ", ops...) }
+func (o Opcodes) Popcntw(ops ...Operand)          { o.a.op("POPCNTW", ops...) }
+func (o Opcodes) POPCNTW(ops ...Operand)          { o.a.op("POPCNTW", ops...) }
+func (o Opcodes) Popfl(ops ...Operand)            { o.a.op("POPFL", ops...) }
+func (o Opcodes) POPFL(ops ...Operand)            { o.a.op("POPFL", ops...) }
+func (o Opcodes) Popfq(ops ...Operand)            { o.a.op("POPFQ", ops...) }
+func (o Opcodes) POPFQ(ops ...Operand)            { o.a.op("POPFQ", ops...) }
+func (o Opcodes) Popfw(ops ...Operand)            { o.a.op("POPFW", ops...) }
+func (o Opcodes) POPFW(ops ...Operand)            { o.a.op("POPFW", ops...) }
+func (o Opcodes) Popl(ops ...Operand)             { o.a.op("POPL", ops...) }
+func (o Opcodes) POPL(ops ...Operand)             { o.a.op("POPL", ops...) }
+func (o Opcodes) Popq(ops ...Operand)             { o.a.op("POPQ", ops...) }
+func (o Opcodes) POPQ(ops ...Operand)             { o.a.op("POPQ", ops...) }
+func (o Opcodes) Popw(ops ...Operand)             { o.a.op("POPW", ops...) }
+func (o Opcodes) POPW(ops ...Operand)             { o.a.op("POPW", ops...) }
+func (o Opcodes) Por(ops ...Operand)              { o.a.op("POR", ops...) }
+func (o Opcodes) POR(ops ...Operand)              { o.a.op("POR", ops...) }
+func (o Opcodes) Prefetchnta(ops ...Operand)      { o.a.op("PREFETCHNTA", ops...) }
+func (o Opcodes) PREFETCHNTA(ops ...Operand)      { o.a.op("PREFETCHNTA", ops...) }
+func (o Opcodes) Prefetcht0(ops ...Operand)       { o.a.op("PREFETCHT0", ops...) }
+func (o Opcodes) PREFETCHT0(ops ...Operand)       { o.a.op("PREFETCHT0", ops...) }
+func (o Opcodes) Prefetcht1(ops ...Operand)       { o.a.op("PREFETCHT1", ops...) }
+func (o Opcodes) PREFETCHT1(ops ...Operand)       { o.a.op("PREFETCHT1", ops...) }
+func (o Opcodes) Prefetcht2(ops ...Operand)       { o.a.op("PREFETCHT2", ops...) }
+func (o Opcodes) PREFETCHT2(ops ...Operand)       { o.a.op("PREFETCHT2", ops...) }
+func (o Opcodes) Psadbw(ops ...Operand)           { o.a.op("PSADBW", ops...) }
+func (o Opcodes) PSADBW(ops ...Operand)           { o.a.op("PSADBW", ops...) }
+func (o Opcodes) Pshufb(ops ...Operand)           { o.a.op("PSHUFB", ops...) }
+func (o Opcodes) PSHUFB(ops ...Operand)           { o.a.op("PSHUFB", ops...) }
+func (o Opcodes) Pshufd(ops ...Operand)           { o.a.op("PSHUFD", ops...) }
+func (o Opcodes) PSHUFD(ops ...Operand)           { o.a.op("PSHUFD", ops...) }
+func (o Opcodes) Pshufhw(ops ...Operand)          { o.a.op("PSHUFHW", ops...) }
+func (o Opcodes) PSHUFHW(ops ...Operand)          { o.a.op("PSHUFHW", ops...) }
+func (o Opcodes) Pshufl(ops ...Operand)           { o.a.op("PSHUFL", ops...) }
+func (o Opcodes) PSHUFL(ops ...Operand)           { o.a.op("PSHUFL", ops...) }
+func (o Opcodes) Pshuflw(ops ...Operand)          { o.a.op("PSHUFLW", ops...) }
+func (o Opcodes) PSHUFLW(ops ...Operand)          { o.a.op("PSHUFLW", ops...) }
+func (o Opcodes) Pshufw(ops ...Operand)           { o.a.op("PSHUFW", ops...) }
+func (o Opcodes) PSHUFW(ops ...Operand)           { o.a.op("PSHUFW", ops...) }
+func (o Opcodes) Psignb(ops ...Operand)           { o.a.op("PSIGNB", ops...) }
+func (o Opcodes) PSIGNB(ops ...Operand)           { o.a.op("PSIGNB", ops...) }
+func (o Opcodes) Psignd(ops ...Operand)           { o.a.op("PSIGND", ops...) }
+func (o Opcodes) PSIGND(ops ...Operand)           { o.a.op("PSIGND", ops...) }
+func (o Opcodes) Psignw(ops ...Operand)           { o.a.op("PSIGNW", ops...) }
+func (o Opcodes) PSIGNW(ops ...Operand)           { o.a.op("PSIGNW", ops...) }
+func (o Opcodes) Pslll(ops ...Operand)            { o.a.op("PSLLL", ops...) }
+func (o Opcodes) PSLLL(ops ...Operand)            { o.a.op("PSLLL", ops...) }
+func (o Opcodes) Psllo(ops ...Operand)            { o.a.op("PSLLO", ops...) }
+func (o Opcodes) PSLLO(ops ...Operand)            { o.a.op("PSLLO", ops...) }
+func (o Opcodes) Psllq(ops ...Operand)            { o.a.op("PSLLQ", ops...) }
+func (o Opcodes) PSLLQ(ops ...Operand)            { o.a.op("PSLLQ", ops...) }
+func (o Opcodes) Psllw(ops ...Operand)            { o.a.op("PSLLW", ops...) }
+func (o Opcodes) PSLLW(ops ...Operand)            { o.a.op("PSLLW", ops...) }
+func (o Opcodes) Psral(ops ...Operand)            { o.a.op("PSRAL", ops...) }
+func (o Opcodes) PSRAL(ops ...Operand)            { o.a.op("PSRAL", ops...) }
+func (o Opcodes) Psraw(ops ...Operand)            { o.a.op("PSRAW", ops...) }
+func (o Opcodes) PSRAW(ops ...Operand)            { o.a.op("PSRAW", ops...) }
+func (o Opcodes) Psrll(ops ...Operand)            { o.a.op("PSRLL", ops...) }
+func (o Opcodes) PSRLL(ops ...Operand)            { o.a.op("PSRLL", ops...) }
+func (o Opcodes) Psrlo(ops ...Operand)            { o.a.op("PSRLO", ops...) }
+func (o Opcodes) PSRLO(ops ...Operand)            { o.a.op("PSRLO", ops...) }
+func (o Opcodes) Psrlq(ops ...Operand)            { o.a.op("PSRLQ", ops...) }
+func (o Opcodes) PSRLQ(ops ...Operand)            { o.a.op("PSRLQ", ops...) }
+func (o Opcodes) Psrlw(ops ...Operand)            { o.a.op("PSRLW", ops...) }
+func (o Opcodes) PSRLW(ops ...Operand)            { o.a.op("PSRLW", ops...) }
+func (o Opcodes) Psubb(ops ...Operand)            { o.a.op("PSUBB", ops...) }
+func (o Opcodes) PSUBB(ops ...Operand)            { o.a.op("PSUBB", ops...) }
+func (o Opcodes) Psubl(ops ...Operand)            { o.a.op("PSUBL", ops...) }
+func (o Opcodes) PSUBL(ops ...Operand)            { o.a.op("PSUBL", ops...) }
+func (o Opcodes) Psubq(ops ...Operand)            { o.a.op("PSUBQ", ops...) }
+func (o Opcodes) PSUBQ(ops ...Operand)            { o.a.op("PSUBQ", ops...) }
+func (o Opcodes) Psubsb(ops ...Operand)           { o.a.op("PSUBSB", ops...) }
+func (o Opcodes) PSUBSB(ops ...Operand)           { o.a.op("PSUBSB", ops...) }
+func (o Opcodes) Psubsw(ops ...Operand)           { o.a.op("PSUBSW", ops...) }
+func (o Opcodes) PSUBSW(ops ...Operand)           { o.a.op("PSUBSW", ops...) }
+func (o Opcodes) Psubusb(ops ...Operand)          { o.a.op("PSUBUSB", ops...) }
+func (o Opcodes) PSUBUSB(ops ...Operand)          { o.a.op("PSUBUSB", ops...) }
+func (o Opcodes) Psubusw(ops ...Operand)          { o.a.op("PSUBUSW", ops...) }
+func (o Opcodes) PSUBUSW(ops ...Operand)          { o.a.op("PSUBUSW", ops...) }
+func (o Opcodes) Psubw(ops ...Operand)            { o.a.op("PSUBW", ops...) }
+func (o Opcodes) PSUBW(ops ...Operand)            { o.a.op("PSUBW", ops...) }
+func (o Opcodes) Ptest(ops ...Operand)            { o.a.op("PTEST", ops...) }
+func (o Opcodes) PTEST(ops ...Operand)            { o.a.op("PTEST", ops...) }
+func (o Opcodes) Punpckhbw(ops ...Operand)        { o.a.op("PUNPCKHBW", ops...) }
+func (o Opcodes) PUNPCKHBW(ops ...Operand)        { o.a.op("PUNPCKHBW", ops...) }
+func (o Opcodes) Punpckhlq(ops ...Operand)        { o.a.op("PUNPCKHLQ", ops...) }
+func (o Opcodes) PUNPCKHLQ(ops ...Operand)        { o.a.op("PUNPCKHLQ", ops...) }
+func (o Opcodes) Punpckhqdq(ops ...Operand)       { o.a.op("PUNPCKHQDQ", ops...) }
+func (o Opcodes) PUNPCKHQDQ(ops ...Operand)       { o.a.op("PUNPCKHQDQ", ops...) }
+func (o Opcodes) Punpckhwl(ops ...Operand)        { o.a.op("PUNPCKHWL", ops...) }
+func (o Opcodes) PUNPCKHWL(ops ...Operand)        { o.a.op("PUNPCKHWL", ops...) }
+func (o Opcodes) Punpcklbw(ops ...Operand)        { o.a.op("PUNPCKLBW", ops...) }
+func (o Opcodes) PUNPCKLBW(ops ...Operand)        { o.a.op("PUNPCKLBW", ops...) }
+func (o Opcodes) Punpckllq(ops ...Operand)        { o.a.op("PUNPCKLLQ", ops...) }
+func (o Opcodes) PUNPCKLLQ(ops ...Operand)        { o.a.op("PUNPCKLLQ", ops...) }
+func (o Opcodes) Punpcklqdq(ops ...Operand)       { o.a.op("PUNPCKLQDQ", ops...) }
+func (o Opcodes) PUNPCKLQDQ(ops ...Operand)       { o.a.op("PUNPCKLQDQ", ops...) }
+func (o Opcodes) Punpcklwl(ops ...Operand)        { o.a.op("PUNPCKLWL", ops...) }
+func (o Opcodes) PUNPCKLWL(ops ...Operand)        { o.a.op("PUNPCKLWL", ops...) }
+func (o Opcodes) Pushal(ops ...Operand)           { o.a.op("PUSHAL", ops...) }
+func (o Opcodes) PUSHAL(ops ...Operand)           { o.a.op("PUSHAL", ops...) }
+func (o Opcodes) Pushaw(ops ...Operand)           { o.a.op("PUSHAW", ops...) }
+func (o Opcodes) PUSHAW(ops ...Operand)           { o.a.op("PUSHAW", ops...) }
+func (o Opcodes) Pushfl(ops ...Operand)           { o.a.op("PUSHFL", ops...) }
+func (o Opcodes) PUSHFL(ops ...Operand)           { o.a.op("PUSHFL", ops...) }
+func (o Opcodes) Pushfq(ops ...Operand)           { o.a.op("PUSHFQ", ops...) }
+func (o Opcodes) PUSHFQ(ops ...Operand)           { o.a.op("PUSHFQ", ops...) }
+func (o Opcodes) Pushfw(ops ...Operand)           { o.a.op("PUSHFW", ops...) }
+func (o Opcodes) PUSHFW(ops ...Operand)           { o.a.op("PUSHFW", ops...) }
+func (o Opcodes) Pushl(ops ...Operand)            { o.a.op("PUSHL", ops...) }
+func (o Opcodes) PUSHL(ops ...Operand)            { o.a.op("PUSHL", ops...) }
+func (o Opcodes) Pushq(ops ...Operand)            { o.a.op("PUSHQ", ops...) }
+func (o Opcodes) PUSHQ(ops ...Operand)            { o.a.op("PUSHQ", ops...) }
+func (o Opcodes) Pushw(ops ...Operand)            { o.a.op("PUSHW", ops...) }
+func (o Opcodes) PUSHW(ops ...Operand)            { o.a.op("PUSHW", ops...) }
+func (o Opcodes) Pxor(ops ...Operand)             { o.a.op("PXOR", ops...) }
+func (o Opcodes) PXOR(ops ...Operand)             { o.a.op("PXOR", ops...) }
+func (o Opcodes) Quad(ops ...Operand)             { o.a.op("QUAD", ops...) }
+func (o Opcodes) QUAD(ops ...Operand)             { o.a.op("QUAD", ops...) }
+func (o Opcodes) Rclb(ops ...Operand)             { o.a.op("RCLB", ops...) }
+func (o Opcodes) RCLB(ops ...Operand)             { o.a.op("RCLB", ops...) }
+func (o Opcodes) Rcll(ops ...Operand)             { o.a.op("RCLL", ops...) }
+func (o Opcodes) RCLL(ops ...Operand)             { o.a.op("RCLL", ops...) }
+func (o Opcodes) Rclq(ops ...Operand)             { o.a.op("RCLQ", ops...) }
+func (o Opcodes) RCLQ(ops ...Operand)             { o.a.op("RCLQ", ops...) }
+func (o Opcodes) Rclw(ops ...Operand)             { o.a.op("RCLW", ops...) }
+func (o Opcodes) RCLW(ops ...Operand)             { o.a.op("RCLW", ops...) }
+func (o Opcodes) Rcpps(ops ...Operand)            { o.a.op("RCPPS", ops...) }
+func (o Opcodes) RCPPS(ops ...Operand)            { o.a.op("RCPPS", ops...) }
+func (o Opcodes) Rcpss(ops ...Operand)            { o.a.op("RCPSS", ops...) }
+func (o Opcodes) RCPSS(ops ...Operand)            { o.a.op("RCPSS", ops...) }
+func (o Opcodes) Rcrb(ops ...Operand)             { o.a.op("RCRB", ops...) }
+func (o Opcodes) RCRB(ops ...Operand)             { o.a.op("RCRB", ops...) }
+func (o Opcodes) Rcrl(ops ...Operand)             { o.a.op("RCRL", ops...) }
+func (o Opcodes) RCRL(ops ...Operand)             { o.a.op("RCRL", ops...) }
+func (o Opcodes) Rcrq(ops ...Operand)             { o.a.op("RCRQ", ops...) }
+func (o Opcodes) RCRQ(ops ...Operand)             { o.a.op("RCRQ", ops...) }
+func (o Opcodes) Rcrw(ops ...Operand)             { o.a.op("RCRW", ops...) }
+func (o Opcodes) RCRW(ops ...Operand)             { o.a.op("RCRW", ops...) }
+func (o Opcodes) Rdmsr(ops ...Operand)            { o.a.op("RDMSR", ops...) }
+func (o Opcodes) RDMSR(ops ...Operand)            { o.a.op("RDMSR", ops...) }
+func (o Opcodes) Rdpmc(ops ...Operand)            { o.a.op("RDPMC", ops...) }
+func (o Opcodes) RDPMC(ops ...Operand)            { o.a.op("RDPMC", ops...) }
+func (o Opcodes) Rdtsc(ops ...Operand)            { o.a.op("RDTSC", ops...) }
+func (o Opcodes) RDTSC(ops ...Operand)            { o.a.op("RDTSC", ops...) }
+func (o Opcodes) Rep(ops ...Operand)              { o.a.op("REP", ops...) }
+func (o Opcodes) REP(ops ...Operand)              { o.a.op("REP", ops...) }
+func (o Opcodes) Repn(ops ...Operand)             { o.a.op("REPN", ops...) }
+func (o Opcodes) REPN(ops ...Operand)             { o.a.op("REPN", ops...) }
+func (o Opcodes) Retfl(ops ...Operand)            { o.a.op("RETFL", ops...) }
+func (o Opcodes) RETFL(ops ...Operand)            { o.a.op("RETFL", ops...) }
+func (o Opcodes) Retfq(ops ...Operand)            { o.a.op("RETFQ", ops...) }
+func (o Opcodes) RETFQ(ops ...Operand)            { o.a.op("RETFQ", ops...) }
+func (o Opcodes) Retfw(ops ...Operand)            { o.a.op("RETFW", ops...) }
+func (o Opcodes) RETFW(ops ...Operand)            { o.a.op("RETFW", ops...) }
+func (o Opcodes) Rolb(ops ...Operand)             { o.a.op("ROLB", ops...) }
+func (o Opcodes) ROLB(ops ...Operand)             { o.a.op("ROLB", ops...) }
+func (o Opcodes) Roll(ops ...Operand)             { o.a.op("ROLL", ops...) }
+func (o Opcodes) ROLL(ops ...Operand)             { o.a.op("ROLL", ops...) }
+func (o Opcodes) Rolq(ops ...Operand)             { o.a.op("ROLQ", ops...) }
+func (o Opcodes) ROLQ(ops ...Operand)             { o.a.op("ROLQ", ops...) }
+func (o Opcodes) Rolw(ops ...Operand)             { o.a.op("ROLW", ops...) }
+func (o Opcodes) ROLW(ops ...Operand)             { o.a.op("ROLW", ops...) }
+func (o Opcodes) Rorb(ops ...Operand)             { o.a.op("RORB", ops...) }
+func (o Opcodes) RORB(ops ...Operand)             { o.a.op("RORB", ops...) }
+func (o Opcodes) Rorl(ops ...Operand)             { o.a.op("RORL", ops...) }
+func (o Opcodes) RORL(ops ...Operand)             { o.a.op("RORL", ops...) }
+func (o Opcodes) Rorq(ops ...Operand)             { o.a.op("RORQ", ops...) }
+func (o Opcodes) RORQ(ops ...Operand)             { o.a.op("RORQ", ops...) }
+func (o Opcodes) Rorw(ops ...Operand)             { o.a.op("RORW", ops...) }
+func (o Opcodes) RORW(ops ...Operand)             { o.a.op("RORW", ops...) }
+func (o Opcodes) Rorxl(ops ...Operand)            { o.a.op("RORXL", ops...) }
+func (o Opcodes) RORXL(ops ...Operand)            { o.a.op("RORXL", ops...) }
+func (o Opcodes) Rorxq(ops ...Operand)            { o.a.op("RORXQ", ops...) }
+func (o Opcodes) RORXQ(ops ...Operand)            { o.a.op("RORXQ", ops...) }
+func (o Opcodes) Roundpd(ops ...Operand)          { o.a.op("ROUNDPD", ops...) }
+func (o Opcodes) ROUNDPD(ops ...Operand)          { o.a.op("ROUNDPD", ops...) }
+func (o Opcodes) Roundps(ops ...Operand)          { o.a.op("ROUNDPS", ops...) }
+func (o Opcodes) ROUNDPS(ops ...Operand)          { o.a.op("ROUNDPS", ops...) }
+func (o Opcodes) Roundsd(ops ...Operand)          { o.a.op("ROUNDSD", ops...) }
+func (o Opcodes) ROUNDSD(ops ...Operand)          { o.a.op("ROUNDSD", ops...) }
+func (o Opcodes) Roundss(ops ...Operand)          { o.a.op("ROUNDSS", ops...) }
+func (o Opcodes) ROUNDSS(ops ...Operand)          { o.a.op("ROUNDSS", ops...) }
+func (o Opcodes) Rsm(ops ...Operand)              { o.a.op("RSM", ops...) }
+func (o Opcodes) RSM(ops ...Operand)              { o.a.op("RSM", ops...) }
+func (o Opcodes) Rsqrtps(ops ...Operand)          { o.a.op("RSQRTPS", ops...) }
+func (o Opcodes) RSQRTPS(ops ...Operand)          { o.a.op("RSQRTPS", ops...) }
+func (o Opcodes) Rsqrtss(ops ...Operand)          { o.a.op("RSQRTSS", ops...) }
+func (o Opcodes) RSQRTSS(ops ...Operand)          { o.a.op("RSQRTSS", ops...) }
+func (o Opcodes) Sahf(ops ...Operand)             { o.a.op("SAHF", ops...) }
+func (o Opcodes) SAHF(ops ...Operand)             { o.a.op("SAHF", ops...) }
+func (o Opcodes) Salb(ops ...Operand)             { o.a.op("SALB", ops...) }
+func (o Opcodes) SALB(ops ...Operand)             { o.a.op("SALB", ops...) }
+func (o Opcodes) Sall(ops ...Operand)             { o.a.op("SALL", ops...) }
+func (o Opcodes) SALL(ops ...Operand)             { o.a.op("SALL", ops...) }
+func (o Opcodes) Salq(ops ...Operand)             { o.a.op("SALQ", ops...) }
+func (o Opcodes) SALQ(ops ...Operand)             { o.a.op("SALQ", ops...) }
+func (o Opcodes) Salw(ops ...Operand)             { o.a.op("SALW", ops...) }
+func (o Opcodes) SALW(ops ...Operand)             { o.a.op("SALW", ops...) }
+func (o Opcodes) Sarb(ops ...Operand)             { o.a.op("SARB", ops...) }
+func (o Opcodes) SARB(ops ...Operand)             { o.a.op("SARB", ops...) }
+func (o Opcodes) Sarl(ops ...Operand)             { o.a.op("SARL", ops...) }
+func (o Opcodes) SARL(ops ...Operand)             { o.a.op("SARL", ops...) }
+func (o Opcodes) Sarq(ops ...Operand)             { o.a.op("SARQ", ops...) }
+func (o Opcodes) SARQ(ops ...Operand)             { o.a.op("SARQ", ops...) }
+func (o Opcodes) Sarw(ops ...Operand)             { o.a.op("SARW", ops...) }
+func (o Opcodes) SARW(ops ...Operand)             { o.a.op("SARW", ops...) }
+func (o Opcodes) Sarxl(ops ...Operand)            { o.a.op("SARXL", ops...) }
+func (o Opcodes) SARXL(ops ...Operand)            { o.a.op("SARXL", ops...) }
+func (o Opcodes) Sarxq(ops ...Operand)            { o.a.op("SARXQ", ops...) }
+func (o Opcodes) SARXQ(ops ...Operand)            { o.a.op("SARXQ", ops...) }
+func (o Opcodes) Sbbb(ops ...Operand)             { o.a.op("SBBB", ops...) }
+func (o Opcodes) SBBB(ops ...Operand)             { o.a.op("SBBB", ops...) }
+func (o Opcodes) Sbbl(ops ...Operand)             { o.a.op("SBBL", ops...) }
+func (o Opcodes) SBBL(ops ...Operand)             { o.a.op("SBBL", ops...) }
+func (o Opcodes) Sbbq(ops ...Operand)             { o.a.op("SBBQ", ops...) }
+func (o Opcodes) SBBQ(ops ...Operand)             { o.a.op("SBBQ", ops...) }
+func (o Opcodes) Sbbw(ops ...Operand)             { o.a.op("SBBW", ops...) }
+func (o Opcodes) SBBW(ops ...Operand)             { o.a.op("SBBW", ops...) }
+func (o Opcodes) Scasb(ops ...Operand)            { o.a.op("SCASB", ops...) }
+func (o Opcodes) SCASB(ops ...Operand)            { o.a.op("SCASB", ops...) }
+func (o Opcodes) Scasl(ops ...Operand)            { o.a.op("SCASL", ops...) }
+func (o Opcodes) SCASL(ops ...Operand)            { o.a.op("SCASL", ops...) }
+func (o Opcodes) Scasq(ops ...Operand)            { o.a.op("SCASQ", ops...) }
+func (o Opcodes) SCASQ(ops ...Operand)            { o.a.op("SCASQ", ops...) }
+func (o Opcodes) Scasw(ops ...Operand)            { o.a.op("SCASW", ops...) }
+func (o Opcodes) SCASW(ops ...Operand)            { o.a.op("SCASW", ops...) }
+func (o Opcodes) Setcc(ops ...Operand)            { o.a.op("SETCC", ops...) }
+func (o Opcodes) SETCC(ops ...Operand)            { o.a.op("SETCC", ops...) }
+func (o Opcodes) Setcs(ops ...Operand)            { o.a.op("SETCS", ops...) }
+func (o Opcodes) SETCS(ops ...Operand)            { o.a.op("SETCS", ops...) }
+func (o Opcodes) Seteq(ops ...Operand)            { o.a.op("SETEQ", ops...) }
+func (o Opcodes) SETEQ(ops ...Operand)            { o.a.op("SETEQ", ops...) }
+func (o Opcodes) Setge(ops ...Operand)            { o.a.op("SETGE", ops...) }
+func (o Opcodes) SETGE(ops ...Operand)            { o.a.op("SETGE", ops...) }
+func (o Opcodes) Setgt(ops ...Operand)            { o.a.op("SETGT", ops...) }
+func (o Opcodes) SETGT(ops ...Operand)            { o.a.op("SETGT", ops...) }
+func (o Opcodes) Sethi(ops ...Operand)            { o.a.op("SETHI", ops...) }
+func (o Opcodes) SETHI(ops ...Operand)            { o.a.op("SETHI", ops...) }
+func (o Opcodes) Setle(ops ...Operand)            { o.a.op("SETLE", ops...) }
+func (o Opcodes) SETLE(ops ...Operand)            { o.a.op("SETLE", ops...) }
+func (o Opcodes) Setls(ops ...Operand)            { o.a.op("SETLS", ops...) }
+func (o Opcodes) SETLS(ops ...Operand)            { o.a.op("SETLS", ops...) }
+func (o Opcodes) Setlt(ops ...Operand)            { o.a.op("SETLT", ops...) }
+func (o Opcodes) SETLT(ops ...Operand)            { o.a.op("SETLT", ops...) }
+func (o Opcodes) Setmi(ops ...Operand)            { o.a.op("SETMI", ops...) }
+func (o Opcodes) SETMI(ops ...Operand)            { o.a.op("SETMI", ops...) }
+func (o Opcodes) Setne(ops ...Operand)            { o.a.op("SETNE", ops...) }
+func (o Opcodes) SETNE(ops ...Operand)            { o.a.op("SETNE", ops...) }
+func (o Opcodes) Setoc(ops ...Operand)            { o.a.op("SETOC", ops...) }
+func (o Opcodes) SETOC(ops ...Operand)            { o.a.op("SETOC", ops...) }
+func (o Opcodes) Setos(ops ...Operand)            { o.a.op("SETOS", ops...) }
+func (o Opcodes) SETOS(ops ...Operand)            { o.a.op("SETOS", ops...) }
+func (o Opcodes) Setpc(ops ...Operand)            { o.a.op("SETPC", ops...) }
+func (o Opcodes) SETPC(ops ...Operand)            { o.a.op("SETPC", ops...) }
+func (o Opcodes) Setpl(ops ...Operand)            { o.a.op("SETPL", ops...) }
+func (o Opcodes) SETPL(ops ...Operand)            { o.a.op("SETPL", ops...) }
+func (o Opcodes) Setps(ops ...Operand)            { o.a.op("SETPS", ops...) }
+func (o Opcodes) SETPS(ops ...Operand)            { o.a.op("SETPS", ops...) }
+func (o Opcodes) Sfence(ops ...Operand)           { o.a.op("SFENCE", ops...) }
+func (o Opcodes) SFENCE(ops ...Operand)           { o.a.op("SFENCE", ops...) }
+func (o Opcodes) Shlb(ops ...Operand)             { o.a.op("SHLB", ops...) }
+func (o Opcodes) SHLB(ops ...Operand)             { o.a.op("SHLB", ops...) }
+func (o Opcodes) Shll(ops ...Operand)             { o.a.op("SHLL", ops...) }
+func (o Opcodes) SHLL(ops ...Operand)             { o.a.op("SHLL", ops...) }
+func (o Opcodes) Shlq(ops ...Operand)             { o.a.op("SHLQ", ops...) }
+func (o Opcodes) SHLQ(ops ...Operand)             { o.a.op("SHLQ", ops...) }
+func (o Opcodes) Shlw(ops ...Operand)             { o.a.op("SHLW", ops...) }
+func (o Opcodes) SHLW(ops ...Operand)             { o.a.op("SHLW", ops...) }
+func (o Opcodes) Shlxl(ops ...Operand)            { o.a.op("SHLXL", ops...) }
+func (o Opcodes) SHLXL(ops ...Operand)            { o.a.op("SHLXL", ops...) }
+func (o Opcodes) Shlxq(ops ...Operand)            { o.a.op("SHLXQ", ops...) }
+func (o Opcodes) SHLXQ(ops ...Operand)            { o.a.op("SHLXQ", ops...) }
+func (o Opcodes) Shrb(ops ...Operand)             { o.a.op("SHRB", ops...) }
+func (o Opcodes) SHRB(ops ...Operand)             { o.a.op("SHRB", ops...) }
+func (o Opcodes) Shrl(ops ...Operand)             { o.a.op("SHRL", ops...) }
+func (o Opcodes) SHRL(ops ...Operand)             { o.a.op("SHRL", ops...) }
+func (o Opcodes) Shrq(ops ...Operand)             { o.a.op("SHRQ", ops...) }
+func (o Opcodes) SHRQ(ops ...Operand)             { o.a.op("SHRQ", ops...) }
+func (o Opcodes) Shrw(ops ...Operand)             { o.a.op("SHRW", ops...) }
+func (o Opcodes) SHRW(ops ...Operand)             { o.a.op("SHRW", ops...) }
+func (o Opcodes) Shrxl(ops ...Operand)            { o.a.op("SHRXL", ops...) }
+func (o Opcodes) SHRXL(ops ...Operand)            { o.a.op("SHRXL", ops...) }
+func (o Opcodes) Shrxq(ops ...Operand)            { o.a.op("SHRXQ", ops...) }
+func (o Opcodes) SHRXQ(ops ...Operand)            { o.a.op("SHRXQ", ops...) }
+func (o Opcodes) Shufpd(ops ...Operand)           { o.a.op("SHUFPD", ops...) }
+func (o Opcodes) SHUFPD(ops ...Operand)           { o.a.op("SHUFPD", ops...) }
+func (o Opcodes) Shufps(ops ...Operand)           { o.a.op("SHUFPS", ops...) }
+func (o Opcodes) SHUFPS(ops ...Operand)           { o.a.op("SHUFPS", ops...) }
+func (o Opcodes) Sqrtpd(ops ...Operand)           { o.a.op("SQRTPD", ops...) }
+func (o Opcodes) SQRTPD(ops ...Operand)           { o.a.op("SQRTPD", ops...) }
+func (o Opcodes) Sqrtps(ops ...Operand)           { o.a.op("SQRTPS", ops...) }
+func (o Opcodes) SQRTPS(ops ...Operand)           { o.a.op("SQRTPS", ops...) }
+func (o Opcodes) Sqrtsd(ops ...Operand)           { o.a.op("SQRTSD", ops...) }
+func (o Opcodes) SQRTSD(ops ...Operand)           { o.a.op("SQRTSD", ops...) }
+func (o Opcodes) Sqrtss(ops ...Operand)           { o.a.op("SQRTSS", ops...) }
+func (o Opcodes) SQRTSS(ops ...Operand)           { o.a.op("SQRTSS", ops...) }
+func (o Opcodes) Stc(ops ...Operand)              { o.a.op("STC", ops...) }
+func (o Opcodes) STC(ops ...Operand)              { o.a.op("STC", ops...) }
+func (o Opcodes) Std(ops ...Operand)              { o.a.op("STD", ops...) }
+func (o Opcodes) STD(ops ...Operand)              { o.a.op("STD", ops...) }
+func (o Opcodes) Sti(ops ...Operand)              { o.a.op("STI", ops...) }
+func (o Opcodes) STI(ops ...Operand)              { o.a.op("STI", ops...) }
+func (o Opcodes) Stmxcsr(ops ...Operand)          { o.a.op("STMXCSR", ops...) }
+func (o Opcodes) STMXCSR(ops ...Operand)          { o.a.op("STMXCSR", ops...) }
+func (o Opcodes) Stosb(ops ...Operand)            { o.a.op("STOSB", ops...) }
+func (o Opcodes) STOSB(ops ...Operand)            { o.a.op("STOSB", ops...) }
+func (o Opcodes) Stosl(ops ...Operand)            { o.a.op("STOSL", ops...) }
+func (o Opcodes) STOSL(ops ...Operand)            { o.a.op("STOSL", ops...) }
+func (o Opcodes) Stosq(ops ...Operand)            { o.a.op("STOSQ", ops...) }
+func (o Opcodes) STOSQ(ops ...Operand)            { o.a.op("STOSQ", ops...) }
+func (o Opcodes) Stosw(ops ...Operand)            { o.a.op("STOSW", ops...) }
+func (o Opcodes) STOSW(ops ...Operand)            { o.a.op("STOSW", ops...) }
+func (o Opcodes) Subb(ops ...Operand)             { o.a.op("SUBB", ops...) }
+func (o Opcodes) SUBB(ops ...Operand)             { o.a.op("SUBB", ops...) }
+func (o Opcodes) Subl(ops ...Operand)             { o.a.op("SUBL", ops...) }
+func (o Opcodes) SUBL(ops ...Operand)             { o.a.op("SUBL", ops...) }
+func (o Opcodes) Subpd(ops ...Operand)            { o.a.op("SUBPD", ops...) }
+func (o Opcodes) SUBPD(ops ...Operand)            { o.a.op("SUBPD", ops...) }
+func (o Opcodes) Subps(ops ...Operand)            { o.a.op("SUBPS", ops...) }
+func (o Opcodes) SUBPS(ops ...Operand)            { o.a.op("SUBPS", ops...) }
+func (o Opcodes) Subq(ops ...Operand)             { o.a.op("SUBQ", ops...) }
+func (o Opcodes) SUBQ(ops ...Operand)             { o.a.op("SUBQ", ops...) }
+func (o Opcodes) Subsd(ops ...Operand)            { o.a.op("SUBSD", ops...) }
+func (o Opcodes) SUBSD(ops ...Operand)            { o.a.op("SUBSD", ops...) }
+func (o Opcodes) Subss(ops ...Operand)            { o.a.op("SUBSS", ops...) }
+func (o Opcodes) SUBSS(ops ...Operand)            { o.a.op("SUBSS", ops...) }
+func (o Opcodes) Subw(ops ...Operand)             { o.a.op("SUBW", ops...) }
+func (o Opcodes) SUBW(ops ...Operand)             { o.a.op("SUBW", ops...) }
+func (o Opcodes) Swapgs(ops ...Operand)           { o.a.op("SWAPGS", ops...) }
+func (o Opcodes) SWAPGS(ops ...Operand)           { o.a.op("SWAPGS", ops...) }
+func (o Opcodes) Syscall(ops ...Operand)          { o.a.op("SYSCALL", ops...) }
+func (o Opcodes) SYSCALL(ops ...Operand)          { o.a.op("SYSCALL", ops...) }
+func (o Opcodes) Sysret(ops ...Operand)           { o.a.op("SYSRET", ops...) }
+func (o Opcodes) SYSRET(ops ...Operand)           { o.a.op("SYSRET", ops...) }
+func (o Opcodes) Testb(ops ...Operand)            { o.a.op("TESTB", ops...) }
+func (o Opcodes) TESTB(ops ...Operand)            { o.a.op("TESTB", ops...) }
+func (o Opcodes) Testl(ops ...Operand)            { o.a.op("TESTL", ops...) }
+func (o Opcodes) TESTL(ops ...Operand)            { o.a.op("TESTL", ops...) }
+func (o Opcodes) Testq(ops ...Operand)            { o.a.op("TESTQ", ops...) }
+func (o Opcodes) TESTQ(ops ...Operand)            { o.a.op("TESTQ", ops...) }
+func (o Opcodes) Testw(ops ...Operand)            { o.a.op("TESTW", ops...) }
+func (o Opcodes) TESTW(ops ...Operand)            { o.a.op("TESTW", ops...) }
+func (o Opcodes) Ucomisd(ops ...Operand)          { o.a.op("UCOMISD", ops...) }
+func (o Opcodes) UCOMISD(ops ...Operand)          { o.a.op("UCOMISD", ops...) }
+func (o Opcodes) Ucomiss(ops ...Operand)          { o.a.op("UCOMISS", ops...) }
+func (o Opcodes) UCOMISS(ops ...Operand)          { o.a.op("UCOMISS", ops...) }
+func (o Opcodes) Unpckhpd(ops ...Operand)         { o.a.op("UNPCKHPD", ops...) }
+func (o Opcodes) UNPCKHPD(ops ...Operand)         { o.a.op("UNPCKHPD", ops...) }
+func (o Opcodes) Unpckhps(ops ...Operand)         { o.a.op("UNPCKHPS", ops...) }
+func (o Opcodes) UNPCKHPS(ops ...Operand)         { o.a.op("UNPCKHPS", ops...) }
+func (o Opcodes) Unpcklpd(ops ...Operand)         { o.a.op("UNPCKLPD", ops...) }
+func (o Opcodes) UNPCKLPD(ops ...Operand)         { o.a.op("UNPCKLPD", ops...) }
+func (o Opcodes) Unpcklps(ops ...Operand)         { o.a.op("UNPCKLPS", ops...) }
+func (o Opcodes) UNPCKLPS(ops ...Operand)         { o.a.op("UNPCKLPS", ops...) }
+func (o Opcodes) Vaddpd(ops ...Operand)           { o.a.op("VADDPD", ops...) }
+func (o Opcodes) VADDPD(ops ...Operand)           { o.a.op("VADDPD", ops...) }
+func (o Opcodes) Vaddps(ops ...Operand)           { o.a.op("VADDPS", ops...) }
+func (o Opcodes) VADDPS(ops ...Operand)           { o.a.op("VADDPS", ops...) }
+func (o Opcodes) Vaddsd(ops ...Operand)           { o.a.op("VADDSD", ops...) }
+func (o Opcodes) VADDSD(ops ...Operand)           { o.a.op("VADDSD", ops...) }
+func (o Opcodes) Vaddss(ops ...Operand)           { o.a.op("VADDSS", ops...) }
+func (o Opcodes) VADDSS(ops ...Operand)           { o.a.op("VADDSS", ops...) }
+func (o Opcodes) Vaddsubpd(ops ...Operand)        { o.a.op("VADDSUBPD", ops...) }
+func (o Opcodes) VADDSUBPD(ops ...Operand)        { o.a.op("VADDSUBPD", ops...) }
+func (o Opcodes) Vaddsubps(ops ...Operand)        { o.a.op("VADDSUBPS", ops...) }
+func (o Opcodes) VADDSUBPS(ops ...Operand)        { o.a.op("VADDSUBPS", ops...) }
+func (o Opcodes) Vaesdec(ops ...Operand)          { o.a.op("VAESDEC", ops...) }
+func (o Opcodes) VAESDEC(ops ...Operand)          { o.a.op("VAESDEC", ops...) }
+func (o Opcodes) Vaesdeclast(ops ...Operand)      { o.a.op("VAESDECLAST", ops...) }
+func (o Opcodes) VAESDECLAST(ops ...Operand)      { o.a.op("VAESDECLAST", ops...) }
+func (o Opcodes) Vaesenc(ops ...Operand)          { o.a.op("VAESENC", ops...) }
+func (o Opcodes) VAESENC(ops ...Operand)          { o.a.op("VAESENC", ops...) }
+func (o Opcodes) Vaesenclast(ops ...Operand)      { o.a.op("VAESENCLAST", ops...) }
+func (o Opcodes) VAESENCLAST(ops ...Operand)      { o.a.op("VAESENCLAST", ops...) }
+func (o Opcodes) Vaesimc(ops ...Operand)          { o.a.op("VAESIMC", ops...) }
+func (o Opcodes) VAESIMC(ops ...Operand)          { o.a.op("VAESIMC", ops...) }
+func (o Opcodes) Vaeskeygenassist(ops ...Operand) { o.a.op("VAESKEYGENASSIST", ops...) }
+func (o Opcodes) VAESKEYGENASSIST(ops ...Operand) { o.a.op("VAESKEYGENASSIST", ops...) }
+func (o Opcodes) Vandnpd(ops ...Operand)          { o.a.op("VANDNPD", ops...) }
+func (o Opcodes) VANDNPD(ops ...Operand)          { o.a.op("VANDNPD", ops...) }
+func (o Opcodes) Vandnps(ops ...Operand)          { o.a.op("VANDNPS", ops...) }
+func (o Opcodes) VANDNPS(ops ...Operand)          { o.a.op("VANDNPS", ops...) }
+func (o Opcodes) Vandpd(ops ...Operand)           { o.a.op("VANDPD", ops...) }
+func (o Opcodes) VANDPD(ops ...Operand)           { o.a.op("VANDPD", ops...) }
+func (o Opcodes) Vandps(ops ...Operand)           { o.a.op("VANDPS", ops...) }
+func (o Opcodes) VANDPS(ops ...Operand)           { o.a.op("VANDPS", ops...) }
+func (o Opcodes) Vblendpd(ops ...Operand)         { o.a.op("VBLENDPD", ops...) }
+func (o Opcodes) VBLENDPD(ops ...Operand)         { o.a.op("VBLENDPD", ops...) }
+func (o Opcodes) Vblendps(ops ...Operand)         { o.a.op("VBLENDPS", ops...) }
+func (o Opcodes) VBLENDPS(ops ...Operand)         { o.a.op("VBLENDPS", ops...) }
+func (o Opcodes) Vblendvpd(ops ...Operand)        { o.a.op("VBLENDVPD", ops...) }
+func (o Opcodes) VBLENDVPD(ops ...Operand)        { o.a.op("VBLENDVPD", ops...) }
+func (o Opcodes) Vblendvps(ops ...Operand)        { o.a.op("VBLENDVPS", ops...) }
+func (o Opcodes) VBLENDVPS(ops ...Operand)        { o.a.op("VBLENDVPS", ops...) }
+func (o Opcodes) Vbroadcastf128(ops ...Operand)   { o.a.op("VBROADCASTF128", ops...) }
+func (o Opcodes) VBROADCASTF128(ops ...Operand)   { o.a.op("VBROADCASTF128", ops...) }
+func (o Opcodes) Vbroadcasti128(ops ...Operand)   { o.a.op("VBROADCASTI128", ops...) }
+func (o Opcodes) VBROADCASTI128(ops ...Operand)   { o.a.op("VBROADCASTI128", ops...) }
+func (o Opcodes) Vbroadcastsd(ops ...Operand)     { o.a.op("VBROADCASTSD", ops...) }
+func (o Opcodes) VBROADCASTSD(ops ...Operand)     { o.a.op("VBROADCASTSD", ops...) }
+func (o Opcodes) Vbroadcastss(ops ...Operand)     { o.a.op("VBROADCASTSS", ops...) }
+func (o Opcodes) VBROADCASTSS(ops ...Operand)     { o.a.op("VBROADCASTSS", ops...) }
+func (o Opcodes) Vcmppd(ops ...Operand)           { o.a.op("VCMPPD", ops...) }
+func (o Opcodes) VCMPPD(ops ...Operand)           { o.a.op("VCMPPD", ops...) }
+func (o Opcodes) Vcmpps(ops ...Operand)           { o.a.op("VCMPPS", ops...) }
+func (o Opcodes) VCMPPS(ops ...Operand)           { o.a.op("VCMPPS", ops...) }
+func (o Opcodes) Vcmpsd(ops ...Operand)           { o.a.op("VCMPSD", ops...) }
+func (o Opcodes) VCMPSD(ops ...Operand)           { o.a.op("VCMPSD", ops...) }
+func (o Opcodes) Vcmpss(ops ...Operand)           { o.a.op("VCMPSS", ops...) }
+func (o Opcodes) VCMPSS(ops ...Operand)           { o.a.op("VCMPSS", ops...) }
+func (o Opcodes) Vcomisd(ops ...Operand)          { o.a.op("VCOMISD", ops...) }
+func (o Opcodes) VCOMISD(ops ...Operand)          { o.a.op("VCOMISD", ops...) }
+func (o Opcodes) Vcomiss(ops ...Operand)          { o.a.op("VCOMISS", ops...) }
+func (o Opcodes) VCOMISS(ops ...Operand)          { o.a.op("VCOMISS", ops...) }
+func (o Opcodes) Vcvtdq2pd(ops ...Operand)        { o.a.op("VCVTDQ2PD", ops...) }
+func (o Opcodes) VCVTDQ2PD(ops ...Operand)        { o.a.op("VCVTDQ2PD", ops...) }
+func (o Opcodes) Vcvtdq2ps(ops ...Operand)        { o.a.op("VCVTDQ2PS", ops...) }
+func (o Opcodes) VCVTDQ2PS(ops ...Operand)        { o.a.op("VCVTDQ2PS", ops...) }
+func (o Opcodes) Vcvtpd2dqx(ops ...Operand)       { o.a.op("VCVTPD2DQX", ops...) }
+func (o Opcodes) VCVTPD2DQX(ops ...Operand)       { o.a.op("VCVTPD2DQX", ops...) }
+func (o Opcodes) Vcvtpd2dqy(ops ...Operand)       { o.a.op("VCVTPD2DQY", ops...) }
+func (o Opcodes) VCVTPD2DQY(ops ...Operand)       { o.a.op("VCVTPD2DQY", ops...) }
+func (o Opcodes) Vcvtpd2psx(ops ...Operand)       { o.a.op("VCVTPD2PSX", ops...) }
+func (o Opcodes) VCVTPD2PSX(ops ...Operand)       { o.a.op("VCVTPD2PSX", ops...) }
+func (o Opcodes) Vcvtpd2psy(ops ...Operand)       { o.a.op("VCVTPD2PSY", ops...) }
+func (o Opcodes) VCVTPD2PSY(ops ...Operand)       { o.a.op("VCVTPD2PSY", ops...) }
+func (o Opcodes) Vcvtph2ps(ops ...Operand)        { o.a.op("VCVTPH2PS", ops...) }
+func (o Opcodes) VCVTPH2PS(ops ...Operand)        { o.a.op("VCVTPH2PS", ops...) }
+func (o Opcodes) Vcvtps2dq(ops ...Operand)        { o.a.op("VCVTPS2DQ", ops...) }
+func (o Opcodes) VCVTPS2DQ(ops ...Operand)        { o.a.op("VCVTPS2DQ", ops...) }
+func (o Opcodes) Vcvtps2pd(ops ...Operand)        { o.a.op("VCVTPS2PD", ops...) }
+func (o Opcodes) VCVTPS2PD(ops ...Operand)        { o.a.op("VCVTPS2PD", ops...) }
+func (o Opcodes) Vcvtps2ph(ops ...Operand)        { o.a.op("VCVTPS2PH", ops...) }
+func (o Opcodes) VCVTPS2PH(ops ...Operand)        { o.a.op("VCVTPS2PH", ops...) }
+func (o Opcodes) Vcvtsd2si(ops ...Operand)        { o.a.op("VCVTSD2SI", ops...) }
+func (o Opcodes) VCVTSD2SI(ops ...Operand)        { o.a.op("VCVTSD2SI", ops...) }
+func (o Opcodes) Vcvtsd2siq(ops ...Operand)       { o.a.op("VCVTSD2SIQ", ops...) }
+func (o Opcodes) VCVTSD2SIQ(ops ...Operand)       { o.a.op("VCVTSD2SIQ", ops...) }
+func (o Opcodes) Vcvtsd2ss(ops ...Operand)        { o.a.op("VCVTSD2SS", ops...) }
+func (o Opcodes) VCVTSD2SS(ops ...Operand)        { o.a.op("VCVTSD2SS", ops...) }
+func (o Opcodes) Vcvtsi2sdl(ops ...Operand)       { o.a.op("VCVTSI2SDL", ops...) }
+func (o Opcodes) VCVTSI2SDL(ops ...Operand)       { o.a.op("VCVTSI2SDL", ops...) }
+func (o Opcodes) Vcvtsi2sdq(ops ...Operand)       { o.a.op("VCVTSI2SDQ", ops...) }
+func (o Opcodes) VCVTSI2SDQ(ops ...Operand)       { o.a.op("VCVTSI2SDQ", ops...) }
+func (o Opcodes) Vcvtsi2ssl(ops ...Operand)       { o.a.op("VCVTSI2SSL", ops...) }
+func (o Opcodes) VCVTSI2SSL(ops ...Operand)       { o.a.op("VCVTSI2SSL", ops...) }
+func (o Opcodes) Vcvtsi2ssq(ops ...Operand)       { o.a.op("VCVTSI2SSQ", ops...) }
+func (o Opcodes) VCVTSI2SSQ(ops ...Operand)       { o.a.op("VCVTSI2SSQ", ops...) }
+func (o Opcodes) Vcvtss2sd(ops ...Operand)        { o.a.op("VCVTSS2SD", ops...) }
+func (o Opcodes) VCVTSS2SD(ops ...Operand)        { o.a.op("VCVTSS2SD", ops...) }
+func (o Opcodes) Vcvtss2si(ops ...Operand)        { o.a.op("VCVTSS2SI", ops...) }
+func (o Opcodes) VCVTSS2SI(ops ...Operand)        { o.a.op("VCVTSS2SI", ops...) }
+func (o Opcodes) Vcvtss2siq(ops ...Operand)       { o.a.op("VCVTSS2SIQ", ops...) }
+func (o Opcodes) VCVTSS2SIQ(ops ...Operand)       { o.a.op("VCVTSS2SIQ", ops...) }
+func (o Opcodes) Vcvttpd2dqx(ops ...Operand)      { o.a.op("VCVTTPD2DQX", ops...) }
+func (o Opcodes) VCVTTPD2DQX(ops ...Operand)      { o.a.op("VCVTTPD2DQX", ops...) }
+func (o Opcodes) Vcvttpd2dqy(ops ...Operand)      { o.a.op("VCVTTPD2DQY", ops...) }
+func (o Opcodes) VCVTTPD2DQY(ops ...Operand)      { o.a.op("VCVTTPD2DQY", ops...) }
+func (o Opcodes) Vcvttps2dq(ops ...Operand)       { o.a.op("VCVTTPS2DQ", ops...) }
+func (o Opcodes) VCVTTPS2DQ(ops ...Operand)       { o.a.op("VCVTTPS2DQ", ops...) }
+func (o Opcodes) Vcvttsd2si(ops ...Operand)       { o.a.op("VCVTTSD2SI", ops...) }
+func (o Opcodes) VCVTTSD2SI(ops ...Operand)       { o.a.op("VCVTTSD2SI", ops...) }
+func (o Opcodes) Vcvttsd2siq(ops ...Operand)      { o.a.op("VCVTTSD2SIQ", ops...) }
+func (o Opcodes) VCVTTSD2SIQ(ops ...Operand)      { o.a.op("VCVTTSD2SIQ", ops...) }
+func (o Opcodes) Vcvttss2si(ops ...Operand)       { o.a.op("VCVTTSS2SI", ops...) }
+func (o Opcodes) VCVTTSS2SI(ops ...Operand)       { o.a.op("VCVTTSS2SI", ops...) }
+func (o Opcodes) Vcvttss2siq(ops ...Operand)      { o.a.op("VCVTTSS2SIQ", ops...) }
+func (o Opcodes) VCVTTSS2SIQ(ops ...Operand)      { o.a.op("VCVTTSS2SIQ", ops...) }
+func (o Opcodes) Vdivpd(ops ...Operand)           { o.a.op("VDIVPD", ops...) }
+func (o Opcodes) VDIVPD(ops ...Operand)           { o.a.op("VDIVPD", ops...) }
+func (o Opcodes) Vdivps(ops ...Operand)           { o.a.op("VDIVPS", ops...) }
+func (o Opcodes) VDIVPS(ops ...Operand)           { o.a.op("VDIVPS", ops...) }
+func (o Opcodes) Vdivsd(ops ...Operand)           { o.a.op("VDIVSD", ops...) }
+func (o Opcodes) VDIVSD(ops ...Operand)           { o.a.op("VDIVSD", ops...) }
+func (o Opcodes) Vdivss(ops ...Operand)           { o.a.op("VDIVSS", ops...) }
+func (o Opcodes) VDIVSS(ops ...Operand)           { o.a.op("VDIVSS", ops...) }
+func (o Opcodes) Vdppd(ops ...Operand)            { o.a.op("VDPPD", ops...) }
+func (o Opcodes) VDPPD(ops ...Operand)            { o.a.op("VDPPD", ops...) }
+func (o Opcodes) Vdpps(ops ...Operand)            { o.a.op("VDPPS", ops...) }
+func (o Opcodes) VDPPS(ops ...Operand)            { o.a.op("VDPPS", ops...) }
+func (o Opcodes) Verr(ops ...Operand)             { o.a.op("VERR", ops...) }
+func (o Opcodes) VERR(ops ...Operand)             { o.a.op("VERR", ops...) }
+func (o Opcodes) Verw(ops ...Operand)             { o.a.op("VERW", ops...) }
+func (o Opcodes) VERW(ops ...Operand)             { o.a.op("VERW", ops...) }
+func (o Opcodes) Vextractf128(ops ...Operand)     { o.a.op("VEXTRACTF128", ops...) }
+func (o Opcodes) VEXTRACTF128(ops ...Operand)     { o.a.op("VEXTRACTF128", ops...) }
+func (o Opcodes) Vextracti128(ops ...Operand)     { o.a.op("VEXTRACTI128", ops...) }
+func (o Opcodes) VEXTRACTI128(ops ...Operand)     { o.a.op("VEXTRACTI128", ops...) }
+func (o Opcodes) Vextractps(ops ...Operand)       { o.a.op("VEXTRACTPS", ops...) }
+func (o Opcodes) VEXTRACTPS(ops ...Operand)       { o.a.op("VEXTRACTPS", ops...) }
+func (o Opcodes) Vfmadd132pd(ops ...Operand)      { o.a.op("VFMADD132PD", ops...) }
+func (o Opcodes) VFMADD132PD(ops ...Operand)      { o.a.op("VFMADD132PD", ops...) }
+func (o Opcodes) Vfmadd132ps(ops ...Operand)      { o.a.op("VFMADD132PS", ops...) }
+func (o Opcodes) VFMADD132PS(ops ...Operand)      { o.a.op("VFMADD132PS", ops...) }
+func (o Opcodes) Vfmadd132sd(ops ...Operand)      { o.a.op("VFMADD132SD", ops...) }
+func (o Opcodes) VFMADD132SD(ops ...Operand)      { o.a.op("VFMADD132SD", ops...) }
+func (o Opcodes) Vfmadd132ss(ops ...Operand)      { o.a.op("VFMADD132SS", ops...) }
+func (o Opcodes) VFMADD132SS(ops ...Operand)      { o.a.op("VFMADD132SS", ops...) }
+func (o Opcodes) Vfmadd213pd(ops ...Operand)      { o.a.op("VFMADD213PD", ops...) }
+func (o Opcodes) VFMADD213PD(ops ...Operand)      { o.a.op("VFMADD213PD", ops...) }
+func (o Opcodes) Vfmadd213ps(ops ...Operand)      { o.a.op("VFMADD213PS", ops...) }
+func (o Opcodes) VFMADD213PS(ops ...Operand)      { o.a.op("VFMADD213PS", ops...) }
+func (o Opcodes) Vfmadd213sd(ops ...Operand)      { o.a.op("VFMADD213SD", ops...) }
+func (o Opcodes) VFMADD213SD(ops ...Operand)      { o.a.op("VFMADD213SD", ops...) }
+func (o Opcodes) Vfmadd213ss(ops ...Operand)      { o.a.op("VFMADD213SS", ops...) }
+func (o Opcodes) VFMADD213SS(ops ...Operand)      { o.a.op("VFMADD213SS", ops...) }
+func (o Opcodes) Vfmadd231pd(ops ...Operand)      { o.a.op("VFMADD231PD", ops...) }
+func (o Opcodes) VFMADD231PD(ops ...Operand)      { o.a.op("VFMADD231PD", ops...) }
+func (o Opcodes) Vfmadd231ps(ops ...Operand)      { o.a.op("VFMADD231PS", ops...) }
+func (o Opcodes) VFMADD231PS(ops ...Operand)      { o.a.op("VFMADD231PS", ops...) }
+func (o Opcodes) Vfmadd231sd(ops ...Operand)      { o.a.op("VFMADD231SD", ops...) }
+func (o Opcodes) VFMADD231SD(ops ...Operand)      { o.a.op("VFMADD231SD", ops...) }
+func (o Opcodes) Vfmadd231ss(ops ...Operand)      { o.a.op("VFMADD231SS", ops...) }
+func (o Opcodes) VFMADD231SS(ops ...Operand)      { o.a.op("VFMADD231SS", ops...) }
+func (o Opcodes) Vfmaddsub132pd(ops ...Operand)   { o.a.op("VFMADDSUB132PD", ops...) }
+func (o Opcodes) VFMADDSUB132PD(ops ...Operand)   { o.a.op("VFMADDSUB132PD", ops...) }
+func (o Opcodes) Vfmaddsub132ps(ops ...Operand)   { o.a.op("VFMADDSUB132PS", ops...) }
+func (o Opcodes) VFMADDSUB132PS(ops ...Operand)   { o.a.op("VFMADDSUB132PS", ops...) }
+func (o Opcodes) Vfmaddsub213pd(ops ...Operand)   { o.a.op("VFMADDSUB213PD", ops...) }
+func (o Opcodes) VFMADDSUB213PD(ops ...Operand)   { o.a.op("VFMADDSUB213PD", ops...) }
+func (o Opcodes) Vfmaddsub213ps(ops ...Operand)   { o.a.op("VFMADDSUB213PS", ops...) }
+func (o Opcodes) VFMADDSUB213PS(ops ...Operand)   { o.a.op("VFMADDSUB213PS", ops...) }
+func (o Opcodes) Vfmaddsub231pd(ops ...Operand)   { o.a.op("VFMADDSUB231PD", ops...) }
+func (o Opcodes) VFMADDSUB231PD(ops ...Operand)   { o.a.op("VFMADDSUB231PD", ops...) }
+func (o Opcodes) Vfmaddsub231ps(ops ...Operand)   { o.a.op("VFMADDSUB231PS", ops...) }
+func (o Opcodes) VFMADDSUB231PS(ops ...Operand)   { o.a.op("VFMADDSUB231PS", ops...) }
+func (o Opcodes) Vfmsub132pd(ops ...Operand)      { o.a.op("VFMSUB132PD", ops...) }
+func (o Opcodes) VFMSUB132PD(ops ...Operand)      { o.a.op("VFMSUB132PD", ops...) }
+func (o Opcodes) Vfmsub132ps(ops ...Operand)      { o.a.op("VFMSUB132PS", ops...) }
+func (o Opcodes) VFMSUB132PS(ops ...Operand)      { o.a.op("VFMSUB132PS", ops...) }
+func (o Opcodes) Vfmsub132sd(ops ...Operand)      { o.a.op("VFMSUB132SD", ops...) }
+func (o Opcodes) VFMSUB132SD(ops ...Operand)      { o.a.op("VFMSUB132SD", ops...) }
+func (o Opcodes) Vfmsub132ss(ops ...Operand)      { o.a.op("VFMSUB132SS", ops...) }
+func (o Opcodes) VFMSUB132SS(ops ...Operand)      { o.a.op("VFMSUB132SS", ops...) }
+func (o Opcodes) Vfmsub213pd(ops ...Operand)      { o.a.op("VFMSUB213PD", ops...) }
+func (o Opcodes) VFMSUB213PD(ops ...Operand)      { o.a.op("VFMSUB213PD", ops...) }
+func (o Opcodes) Vfmsub213ps(ops ...Operand)      { o.a.op("VFMSUB213PS", ops...) }
+func (o Opcodes) VFMSUB213PS(ops ...Operand)      { o.a.op("VFMSUB213PS", ops...) }
+func (o Opcodes) Vfmsub213sd(ops ...Operand)      { o.a.op("VFMSUB213SD", ops...) }
+func (o Opcodes) VFMSUB213SD(ops ...Operand)      { o.a.op("VFMSUB213SD", ops...) }
+func (o Opcodes) Vfmsub213ss(ops ...Operand)      { o.a.op("VFMSUB213SS", ops...) }
+func (o Opcodes) VFMSUB213SS(ops ...Operand)      { o.a.op("VFMSUB213SS", ops...) }
+func (o Opcodes) Vfmsub231pd(ops ...Operand)      { o.a.op("VFMSUB231PD", ops...) }
+func (o Opcodes) VFMSUB231PD(ops ...Operand)      { o.a.op("VFMSUB231PD", ops...) }
+func (o Opcodes) Vfmsub231ps(ops ...Operand)      { o.a.op("VFMSUB231PS", ops...) }
+func (o Opcodes) VFMSUB231PS(ops ...Operand)      { o.a.op("VFMSUB231PS", ops...) }
+func (o Opcodes) Vfmsub231sd(ops ...Operand)      { o.a.op("VFMSUB231SD", ops...) }
+func (o Opcodes) VFMSUB231SD(ops ...Operand)      { o.a.op("VFMSUB231SD", ops...) }
+func (o Opcodes) Vfmsub231ss(ops ...Operand)      { o.a.op("VFMSUB231SS", ops...) }
+func (o Opcodes) VFMSUB231SS(ops ...Operand)      { o.a.op("VFMSUB231SS", ops...) }
+func (o Opcodes) Vfmsubadd132pd(ops ...Operand)   { o.a.op("VFMSUBADD132PD", ops...) }
+func (o Opcodes) VFMSUBADD132PD(ops ...Operand)   { o.a.op("VFMSUBADD132PD", ops...) }
+func (o Opcodes) Vfmsubadd132ps(ops ...Operand)   { o.a.op("VFMSUBADD132PS", ops...) }
+func (o Opcodes) VFMSUBADD132PS(ops ...Operand)   { o.a.op("VFMSUBADD132PS", ops...) }
+func (o Opcodes) Vfmsubadd213pd(ops ...Operand)   { o.a.op("VFMSUBADD213PD", ops...) }
+func (o Opcodes) VFMSUBADD213PD(ops ...Operand)   { o.a.op("VFMSUBADD213PD", ops...) }
+func (o Opcodes) Vfmsubadd213ps(ops ...Operand)   { o.a.op("VFMSUBADD213PS", ops...) }
+func (o Opcodes) VFMSUBADD213PS(ops ...Operand)   { o.a.op("VFMSUBADD213PS", ops...) }
+func (o Opcodes) Vfmsubadd231pd(ops ...Operand)   { o.a.op("VFMSUBADD231PD", ops...) }
+func (o Opcodes) VFMSUBADD231PD(ops ...Operand)   { o.a.op("VFMSUBADD231PD", ops...) }
+func (o Opcodes) Vfmsubadd231ps(ops ...Operand)   { o.a.op("VFMSUBADD231PS", ops...) }
+func (o Opcodes) VFMSUBADD231PS(ops ...Operand)   { o.a.op("VFMSUBADD231PS", ops...) }
+func (o Opcodes) Vfnmadd132pd(ops ...Operand)     { o.a.op("VFNMADD132PD", ops...) }
+func (o Opcodes) VFNMADD132PD(ops ...Operand)     { o.a.op("VFNMADD132PD", ops...) }
+func (o Opcodes) Vfnmadd132ps(ops ...Operand)     { o.a.op("VFNMADD132PS", ops...) }
+func (o Opcodes) VFNMADD132PS(ops ...Operand)     { o.a.op("VFNMADD132PS", ops...) }
+func (o Opcodes) Vfnmadd132sd(ops ...Operand)     { o.a.op("VFNMADD132SD", ops...) }
+func (o Opcodes) VFNMADD132SD(ops ...Operand)     { o.a.op("VFNMADD132SD", ops...) }
+func (o Opcodes) Vfnmadd132ss(ops ...Operand)     { o.a.op("VFNMADD132SS", ops...) }
+func (o Opcodes) VFNMADD132SS(ops ...Operand)     { o.a.op("VFNMADD132SS", ops...) }
+func (o Opcodes) Vfnmadd213pd(ops ...Operand)     { o.a.op("VFNMADD213PD", ops...) }
+func (o Opcodes) VFNMADD213PD(ops ...Operand)     { o.a.op("VFNMADD213PD", ops...) }
+func (o Opcodes) Vfnmadd213ps(ops ...Operand)     { o.a.op("VFNMADD213PS", ops...) }
+func (o Opcodes) VFNMADD213PS(ops ...Operand)     { o.a.op("VFNMADD213PS", ops...) }
+func (o Opcodes) Vfnmadd213sd(ops ...Operand)     { o.a.op("VFNMADD213SD", ops...) }
+func (o Opcodes) VFNMADD213SD(ops ...Operand)     { o.a.op("VFNMADD213SD", ops...) }
+func (o Opcodes) Vfnmadd213ss(ops ...Operand)     { o.a.op("VFNMADD213SS", ops...) }
+func (o Opcodes) VFNMADD213SS(ops ...Operand)     { o.a.op("VFNMADD213SS", ops...) }
+func (o Opcodes) Vfnmadd231pd(ops ...Operand)     { o.a.op("VFNMADD231PD", ops...) }
+func (o Opcodes) VFNMADD231PD(ops ...Operand)     { o.a.op("VFNMADD231PD", ops...) }
+func (o Opcodes) Vfnmadd231ps(ops ...Operand)     { o.a.op("VFNMADD231PS", ops...) }
+func (o Opcodes) VFNMADD231PS(ops ...Operand)     { o.a.op("VFNMADD231PS", ops...) }
+func (o Opcodes) Vfnmadd231sd(ops ...Operand)     { o.a.op("VFNMADD231SD", ops...) }
+func (o Opcodes) VFNMADD231SD(ops ...Operand)     { o.a.op("VFNMADD231SD", ops...) }
+func (o Opcodes) Vfnmadd231ss(ops ...Operand)     { o.a.op("VFNMADD231SS", ops...) }
+func (o Opcodes) VFNMADD231SS(ops ...Operand)     { o.a.op("VFNMADD231SS", ops...) }
+func (o Opcodes) Vfnmsub132pd(ops ...Operand)     { o.a.op("VFNMSUB132PD", ops...) }
+func (o Opcodes) VFNMSUB132PD(ops ...Operand)     { o.a.op("VFNMSUB132PD", ops...) }
+func (o Opcodes) Vfnmsub132ps(ops ...Operand)     { o.a.op("VFNMSUB132PS", ops...) }
+func (o Opcodes) VFNMSUB132PS(ops ...Operand)     { o.a.op("VFNMSUB132PS", ops...) }
+func (o Opcodes) Vfnmsub132sd(ops ...Operand)     { o.a.op("VFNMSUB132SD", ops...) }
+func (o Opcodes) VFNMSUB132SD(ops ...Operand)     { o.a.op("VFNMSUB132SD", ops...) }
+func (o Opcodes) Vfnmsub132ss(ops ...Operand)     { o.a.op("VFNMSUB132SS", ops...) }
+func (o Opcodes) VFNMSUB132SS(ops ...Operand)     { o.a.op("VFNMSUB132SS", ops...) }
+func (o Opcodes) Vfnmsub213pd(ops ...Operand)     { o.a.op("VFNMSUB213PD", ops...) }
+func (o Opcodes) VFNMSUB213PD(ops ...Operand)     { o.a.op("VFNMSUB213PD", ops...) }
+func (o Opcodes) Vfnmsub213ps(ops ...Operand)     { o.a.op("VFNMSUB213PS", ops...) }
+func (o Opcodes) VFNMSUB213PS(ops ...Operand)     { o.a.op("VFNMSUB213PS", ops...) }
+func (o Opcodes) Vfnmsub213sd(ops ...Operand)     { o.a.op("VFNMSUB213SD", ops...) }
+func (o Opcodes) VFNMSUB213SD(ops ...Operand)     { o.a.op("VFNMSUB213SD", ops...) }
+func (o Opcodes) Vfnmsub213ss(ops ...Operand)     { o.a.op("VFNMSUB213SS", ops...) }
+func (o Opcodes) VFNMSUB213SS(ops ...Operand)     { o.a.op("VFNMSUB213SS", ops...) }
+func (o Opcodes) Vfnmsub231pd(ops ...Operand)     { o.a.op("VFNMSUB231PD", ops...) }
+func (o Opcodes) VFNMSUB231PD(ops ...Operand)     { o.a.op("VFNMSUB231PD", ops...) }
+func (o Opcodes) Vfnmsub231ps(ops ...Operand)     { o.a.op("VFNMSUB231PS", ops...) }
+func (o Opcodes) VFNMSUB231PS(ops ...Operand)     { o.a.op("VFNMSUB231PS", ops...) }
+func (o Opcodes) Vfnmsub231sd(ops ...Operand)     { o.a.op("VFNMSUB231SD", ops...) }
+func (o Opcodes) VFNMSUB231SD(ops ...Operand)     { o.a.op("VFNMSUB231SD", ops...) }
+func (o Opcodes) Vfnmsub231ss(ops ...Operand)     { o.a.op("VFNMSUB231SS", ops...) }
+func (o Opcodes) VFNMSUB231SS(ops ...Operand)     { o.a.op("VFNMSUB231SS", ops...) }
+func (o Opcodes) Vgatherdpd(ops ...Operand)       { o.a.op("VGATHERDPD", ops...) }
+func (o Opcodes) VGATHERDPD(ops ...Operand)       { o.a.op("VGATHERDPD", ops...) }
+func (o Opcodes) Vgatherdps(ops ...Operand)       { o.a.op("VGATHERDPS", ops...) }
+func (o Opcodes) VGATHERDPS(ops ...Operand)       { o.a.op("VGATHERDPS", ops...) }
+func (o Opcodes) Vgatherqpd(ops ...Operand)       { o.a.op("VGATHERQPD", ops...) }
+func (o Opcodes) VGATHERQPD(ops ...Operand)       { o.a.op("VGATHERQPD", ops...) }
+func (o Opcodes) Vgatherqps(ops ...Operand)       { o.a.op("VGATHERQPS", ops...) }
+func (o Opcodes) VGATHERQPS(ops ...Operand)       { o.a.op("VGATHERQPS", ops...) }
+func (o Opcodes) Vhaddpd(ops ...Operand)          { o.a.op("VHADDPD", ops...) }
+func (o Opcodes) VHADDPD(ops ...Operand)          { o.a.op("VHADDPD", ops...) }
+func (o Opcodes) Vhaddps(ops ...Operand)          { o.a.op("VHADDPS", ops...) }
+func (o Opcodes) VHADDPS(ops ...Operand)          { o.a.op("VHADDPS", ops...) }
+func (o Opcodes) Vhsubpd(ops ...Operand)          { o.a.op("VHSUBPD", ops...) }
+func (o Opcodes) VHSUBPD(ops ...Operand)          { o.a.op("VHSUBPD", ops...) }
+func (o Opcodes) Vhsubps(ops ...Operand)          { o.a.op("VHSUBPS", ops...) }
+func (o Opcodes) VHSUBPS(ops ...Operand)          { o.a.op("VHSUBPS", ops...) }
+func (o Opcodes) Vinsertf128(ops ...Operand)      { o.a.op("VINSERTF128", ops...) }
+func (o Opcodes) VINSERTF128(ops ...Operand)      { o.a.op("VINSERTF128", ops...) }
+func (o Opcodes) Vinserti128(ops ...Operand)      { o.a.op("VINSERTI128", ops...) }
+func (o Opcodes) VINSERTI128(ops ...Operand)      { o.a.op("VINSERTI128", ops...) }
+func (o Opcodes) Vinsertps(ops ...Operand)        { o.a.op("VINSERTPS", ops...) }
+func (o Opcodes) VINSERTPS(ops ...Operand)        { o.a.op("VINSERTPS", ops...) }
+func (o Opcodes) Vlddqu(ops ...Operand)           { o.a.op("VLDDQU", ops...) }
+func (o Opcodes) VLDDQU(ops ...Operand)           { o.a.op("VLDDQU", ops...) }
+func (o Opcodes) Vldmxcsr(ops ...Operand)         { o.a.op("VLDMXCSR", ops...) }
+func (o Opcodes) VLDMXCSR(ops ...Operand)         { o.a.op("VLDMXCSR", ops...) }
+func (o Opcodes) Vmaskmovdqu(ops ...Operand)      { o.a.op("VMASKMOVDQU", ops...) }
+func (o Opcodes) VMASKMOVDQU(ops ...Operand)      { o.a.op("VMASKMOVDQU", ops...) }
+func (o Opcodes) Vmaskmovpd(ops ...Operand)       { o.a.op("VMASKMOVPD", ops...) }
+func (o Opcodes) VMASKMOVPD(ops ...Operand)       { o.a.op("VMASKMOVPD", ops...) }
+func (o Opcodes) Vmaskmovps(ops ...Operand)       { o.a.op("VMASKMOVPS", ops...) }
+func (o Opcodes) VMASKMOVPS(ops ...Operand)       { o.a.op("VMASKMOVPS", ops...) }
+func (o Opcodes) Vmaxpd(ops ...Operand)           { o.a.op("VMAXPD", ops...) }
+func (o Opcodes) VMAXPD(ops ...Operand)           { o.a.op("VMAXPD", ops...) }
+func (o Opcodes) Vmaxps(ops ...Operand)           { o.a.op("VMAXPS", ops...) }
+func (o Opcodes) VMAXPS(ops ...Operand)           { o.a.op("VMAXPS", ops...) }
+func (o Opcodes) Vmaxsd(ops ...Operand)           { o.a.op("VMAXSD", ops...) }
+func (o Opcodes) VMAXSD(ops ...Operand)           { o.a.op("VMAXSD", ops...) }
+func (o Opcodes) Vmaxss(ops ...Operand)           { o.a.op("VMAXSS", ops...) }
+func (o Opcodes) VMAXSS(ops ...Operand)           { o.a.op("VMAXSS", ops...) }
+func (o Opcodes) Vminpd(ops ...Operand)           { o.a.op("VMINPD", ops...) }
+func (o Opcodes) VMINPD(ops ...Operand)           { o.a.op("VMINPD", ops...) }
+func (o Opcodes) Vminps(ops ...Operand)           { o.a.op("VMINPS", ops...) }
+func (o Opcodes) VMINPS(ops ...Operand)           { o.a.op("VMINPS", ops...) }
+func (o Opcodes) Vminsd(ops ...Operand)           { o.a.op("VMINSD", ops...) }
+func (o Opcodes) VMINSD(ops ...Operand)           { o.a.op("VMINSD", ops...) }
+func (o Opcodes) Vminss(ops ...Operand)           { o.a.op("VMINSS", ops...) }
+func (o Opcodes) VMINSS(ops ...Operand)           { o.a.op("VMINSS", ops...) }
+func (o Opcodes) Vmovapd(ops ...Operand)          { o.a.op("VMOVAPD", ops...) }
+func (o Opcodes) VMOVAPD(ops ...Operand)          { o.a.op("VMOVAPD", ops...) }
+func (o Opcodes) Vmovaps(ops ...Operand)          { o.a.op("VMOVAPS", ops...) }
+func (o Opcodes) VMOVAPS(ops ...Operand)          { o.a.op("VMOVAPS", ops...) }
+func (o Opcodes) Vmovd(ops ...Operand)            { o.a.op("VMOVD", ops...) }
+func (o Opcodes) VMOVD(ops ...Operand)            { o.a.op("VMOVD", ops...) }
+func (o Opcodes) Vmovddup(ops ...Operand)         { o.a.op("VMOVDDUP", ops...) }
+func (o Opcodes) VMOVDDUP(ops ...Operand)         { o.a.op("VMOVDDUP", ops...) }
+func (o Opcodes) Vmovdqa(ops ...Operand)          { o.a.op("VMOVDQA", ops...) }
+func (o Opcodes) VMOVDQA(ops ...Operand)          { o.a.op("VMOVDQA", ops...) }
+func (o Opcodes) Vmovdqu(ops ...Operand)          { o.a.op("VMOVDQU", ops...) }
+func (o Opcodes) VMOVDQU(ops ...Operand)          { o.a.op("VMOVDQU", ops...) }
+func (o Opcodes) Vmovhlps(ops ...Operand)         { o.a.op("VMOVHLPS", ops...) }
+func (o Opcodes) VMOVHLPS(ops ...Operand)         { o.a.op("VMOVHLPS", ops...) }
+func (o Opcodes) Vmovhpd(ops ...Operand)          { o.a.op("VMOVHPD", ops...) }
+func (o Opcodes) VMOVHPD(ops ...Operand)          { o.a.op("VMOVHPD", ops...) }
+func (o Opcodes) Vmovhps(ops ...Operand)          { o.a.op("VMOVHPS", ops...) }
+func (o Opcodes) VMOVHPS(ops ...Operand)          { o.a.op("VMOVHPS", ops...) }
+func (o Opcodes) Vmovlhps(ops ...Operand)         { o.a.op("VMOVLHPS", ops...) }
+func (o Opcodes) VMOVLHPS(ops ...Operand)         { o.a.op("VMOVLHPS", ops...) }
+func (o Opcodes) Vmovlpd(ops ...Operand)          { o.a.op("VMOVLPD", ops...) }
+func (o Opcodes) VMOVLPD(ops ...Operand)          { o.a.op("VMOVLPD", ops...) }
+func (o Opcodes) Vmovlps(ops ...Operand)          { o.a.op("VMOVLPS", ops...) }
+func (o Opcodes) VMOVLPS(ops ...Operand)          { o.a.op("VMOVLPS", ops...) }
+func (o Opcodes) Vmovmskpd(ops ...Operand)        { o.a.op("VMOVMSKPD", ops...) }
+func (o Opcodes) VMOVMSKPD(ops ...Operand)        { o.a.op("VMOVMSKPD", ops...) }
+func (o Opcodes) Vmovmskps(ops ...Operand)        { o.a.op("VMOVMSKPS", ops...) }
+func (o Opcodes) VMOVMSKPS(ops ...Operand)        { o.a.op("VMOVMSKPS", ops...) }
+func (o Opcodes) Vmovntdq(ops ...Operand)         { o.a.op("VMOVNTDQ", ops...) }
+func (o Opcodes) VMOVNTDQ(ops ...Operand)         { o.a.op("VMOVNTDQ", ops...) }
+func (o Opcodes) Vmovntdqa(ops ...Operand)        { o.a.op("VMOVNTDQA", ops...) }
+func (o Opcodes) VMOVNTDQA(ops ...Operand)        { o.a.op("VMOVNTDQA", ops...) }
+func (o Opcodes) Vmovntpd(ops ...Operand)         { o.a.op("VMOVNTPD", ops...) }
+func (o Opcodes) VMOVNTPD(ops ...Operand)         { o.a.op("VMOVNTPD", ops...) }
+func (o Opcodes) Vmovntps(ops ...Operand)         { o.a.op("VMOVNTPS", ops...) }
+func (o Opcodes) VMOVNTPS(ops ...Operand)         { o.a.op("VMOVNTPS", ops...) }
+func (o Opcodes) Vmovq(ops ...Operand)            { o.a.op("VMOVQ", ops...) }
+func (o Opcodes) VMOVQ(ops ...Operand)            { o.a.op("VMOVQ", ops...) }
+func (o Opcodes) Vmovsd(ops ...Operand)           { o.a.op("VMOVSD", ops...) }
+func (o Opcodes) VMOVSD(ops ...Operand)           { o.a.op("VMOVSD", ops...) }
+func (o Opcodes) Vmovshdup(ops ...Operand)        { o.a.op("VMOVSHDUP", ops...) }
+func (o Opcodes) VMOVSHDUP(ops ...Operand)        { o.a.op("VMOVSHDUP", ops...) }
+func (o Opcodes) Vmovsldup(ops ...Operand)        { o.a.op("VMOVSLDUP", ops...) }
+func (o Opcodes) VMOVSLDUP(ops ...Operand)        { o.a.op("VMOVSLDUP", ops...) }
+func (o Opcodes) Vmovss(ops ...Operand)           { o.a.op("VMOVSS", ops...) }
+func (o Opcodes) VMOVSS(ops ...Operand)           { o.a.op("VMOVSS", ops...) }
+func (o Opcodes) Vmovupd(ops ...Operand)          { o.a.op("VMOVUPD", ops...) }
+func (o Opcodes) VMOVUPD(ops ...Operand)          { o.a.op("VMOVUPD", ops...) }
+func (o Opcodes) Vmovups(ops ...Operand)          { o.a.op("VMOVUPS", ops...) }
+func (o Opcodes) VMOVUPS(ops ...Operand)          { o.a.op("VMOVUPS", ops...) }
+func (o Opcodes) Vmpsadbw(ops ...Operand)         { o.a.op("VMPSADBW", ops...) }
+func (o Opcodes) VMPSADBW(ops ...Operand)         { o.a.op("VMPSADBW", ops...) }
+func (o Opcodes) Vmulpd(ops ...Operand)           { o.a.op("VMULPD", ops...) }
+func (o Opcodes) VMULPD(ops ...Operand)           { o.a.op("VMULPD", ops...) }
+func (o Opcodes) Vmulps(ops ...Operand)           { o.a.op("VMULPS", ops...) }
+func (o Opcodes) VMULPS(ops ...Operand)           { o.a.op("VMULPS", ops...) }
+func (o Opcodes) Vmulsd(ops ...Operand)           { o.a.op("VMULSD", ops...) }
+func (o Opcodes) VMULSD(ops ...Operand)           { o.a.op("VMULSD", ops...) }
+func (o Opcodes) Vmulss(ops ...Operand)           { o.a.op("VMULSS", ops...) }
+func (o Opcodes) VMULSS(ops ...Operand)           { o.a.op("VMULSS", ops...) }
+func (o Opcodes) Vorpd(ops ...Operand)            { o.a.op("VORPD", ops...) }
+func (o Opcodes) VORPD(ops ...Operand)            { o.a.op("VORPD", ops...) }
+func (o Opcodes) Vorps(ops ...Operand)            { o.a.op("VORPS", ops...) }
+func (o Opcodes) VORPS(ops ...Operand)            { o.a.op("VORPS", ops...) }
+func (o Opcodes) Vpabsb(ops ...Operand)           { o.a.op("VPABSB", ops...) }
+func (o Opcodes) VPABSB(ops ...Operand)           { o.a.op("VPABSB", ops...) }
+func (o Opcodes) Vpabsd(ops ...Operand)           { o.a.op("VPABSD", ops...) }
+func (o Opcodes) VPABSD(ops ...Operand)           { o.a.op("VPABSD", ops...) }
+func (o Opcodes) Vpabsw(ops ...Operand)           { o.a.op("VPABSW", ops...) }
+func (o Opcodes) VPABSW(ops ...Operand)           { o.a.op("VPABSW", ops...) }
+func (o Opcodes) Vpackssdw(ops ...Operand)        { o.a.op("VPACKSSDW", ops...) }
+func (o Opcodes) VPACKSSDW(ops ...Operand)        { o.a.op("VPACKSSDW", ops...) }
+func (o Opcodes) Vpacksswb(ops ...Operand)        { o.a.op("VPACKSSWB", ops...) }
+func (o Opcodes) VPACKSSWB(ops ...Operand)        { o.a.op("VPACKSSWB", ops...) }
+func (o Opcodes) Vpackusdw(ops ...Operand)        { o.a.op("VPACKUSDW", ops...) }
+func (o Opcodes) VPACKUSDW(ops ...Operand)        { o.a.op("VPACKUSDW", ops...) }
+func (o Opcodes) Vpackuswb(ops ...Operand)        { o.a.op("VPACKUSWB", ops...) }
+func (o Opcodes) VPACKUSWB(ops ...Operand)        { o.a.op("VPACKUSWB", ops...) }
+func (o Opcodes) Vpaddb(ops ...Operand)           { o.a.op("VPADDB", ops...) }
+func (o Opcodes) VPADDB(ops ...Operand)           { o.a.op("VPADDB", ops...) }
+func (o Opcodes) Vpaddd(ops ...Operand)           { o.a.op("VPADDD", ops...) }
+func (o Opcodes) VPADDD(ops ...Operand)           { o.a.op("VPADDD", ops...) }
+func (o Opcodes) Vpaddq(ops ...Operand)           { o.a.op("VPADDQ", ops...) }
+func (o Opcodes) VPADDQ(ops ...Operand)           { o.a.op("VPADDQ", ops...) }
+func (o Opcodes) Vpaddsb(ops ...Operand)          { o.a.op("VPADDSB", ops...) }
+func (o Opcodes) VPADDSB(ops ...Operand)          { o.a.op("VPADDSB", ops...) }
+func (o Opcodes) Vpaddsw(ops ...Operand)          { o.a.op("VPADDSW", ops...) }
+func (o Opcodes) VPADDSW(ops ...Operand)          { o.a.op("VPADDSW", ops...) }
+func (o Opcodes) Vpaddusb(ops ...Operand)         { o.a.op("VPADDUSB", ops...) }
+func (o Opcodes) VPADDUSB(ops ...Operand)         { o.a.op("VPADDUSB", ops...) }
+func (o Opcodes) Vpaddusw(ops ...Operand)         { o.a.op("VPADDUSW", ops...) }
+func (o Opcodes) VPADDUSW(ops ...Operand)         { o.a.op("VPADDUSW", ops...) }
+func (o Opcodes) Vpaddw(ops ...Operand)           { o.a.op("VPADDW", ops...) }
+func (o Opcodes) VPADDW(ops ...Operand)           { o.a.op("VPADDW", ops...) }
+func (o Opcodes) Vpalignr(ops ...Operand)         { o.a.op("VPALIGNR", ops...) }
+func (o Opcodes) VPALIGNR(ops ...Operand)         { o.a.op("VPALIGNR", ops...) }
+func (o Opcodes) Vpand(ops ...Operand)            { o.a.op("VPAND", ops...) }
+func (o Opcodes) VPAND(ops ...Operand)            { o.a.op("VPAND", ops...) }
+func (o Opcodes) Vpandn(ops ...Operand)           { o.a.op("VPANDN", ops...) }
+func (o Opcodes) VPANDN(ops ...Operand)           { o.a.op("VPANDN", ops...) }
+func (o Opcodes) Vpavgb(ops ...Operand)           { o.a.op("VPAVGB", ops...) }
+func (o Opcodes) VPAVGB(ops ...Operand)           { o.a.op("VPAVGB", ops...) }
+func (o Opcodes) Vpavgw(ops ...Operand)           { o.a.op("VPAVGW", ops...) }
+func (o Opcodes) VPAVGW(ops ...Operand)           { o.a.op("VPAVGW", ops...) }
+func (o Opcodes) Vpblendd(ops ...Operand)         { o.a.op("VPBLENDD", ops...) }
+func (o Opcodes) VPBLENDD(ops ...Operand)         { o.a.op("VPBLENDD", ops...) }
+func (o Opcodes) Vpblendvb(ops ...Operand)        { o.a.op("VPBLENDVB", ops...) }
+func (o Opcodes) VPBLENDVB(ops ...Operand)        { o.a.op("VPBLENDVB", ops...) }
+func (o Opcodes) Vpblendw(ops ...Operand)         { o.a.op("VPBLENDW", ops...) }
+func (o Opcodes) VPBLENDW(ops ...Operand)         { o.a.op("VPBLENDW", ops...) }
+func (o Opcodes) Vpbroadcastb(ops ...Operand)     { o.a.op("VPBROADCASTB", ops...) }
+func (o Opcodes) VPBROADCASTB(ops ...Operand)     { o.a.op("VPBROADCASTB", ops...) }
+func (o Opcodes) Vpbroadcastd(ops ...Operand)     { o.a.op("VPBROADCASTD", ops...) }
+func (o Opcodes) VPBROADCASTD(ops ...Operand)     { o.a.op("VPBROADCASTD", ops...) }
+func (o Opcodes) Vpbroadcastq(ops ...Operand)     { o.a.op("VPBROADCASTQ", ops...) }
+func (o Opcodes) VPBROADCASTQ(ops ...Operand)     { o.a.op("VPBROADCASTQ", ops...) }
+func (o Opcodes) Vpbroadcastw(ops ...Operand)     { o.a.op("VPBROADCASTW", ops...) }
+func (o Opcodes) VPBROADCASTW(ops ...Operand)     { o.a.op("VPBROADCASTW", ops...) }
+func (o Opcodes) Vpclmulqdq(ops ...Operand)       { o.a.op("VPCLMULQDQ", ops...) }
+func (o Opcodes) VPCLMULQDQ(ops ...Operand)       { o.a.op("VPCLMULQDQ", ops...) }
+func (o Opcodes) Vpcmpeqb(ops ...Operand)         { o.a.op("VPCMPEQB", ops...) }
+func (o Opcodes) VPCMPEQB(ops ...Operand)         { o.a.op("VPCMPEQB", ops...) }
+func (o Opcodes) Vpcmpeqd(ops ...Operand)         { o.a.op("VPCMPEQD", ops...) }
+func (o Opcodes) VPCMPEQD(ops ...Operand)         { o.a.op("VPCMPEQD", ops...) }
+func (o Opcodes) Vpcmpeqq(ops ...Operand)         { o.a.op("VPCMPEQQ", ops...) }
+func (o Opcodes) VPCMPEQQ(ops ...Operand)         { o.a.op("VPCMPEQQ", ops...) }
+func (o Opcodes) Vpcmpeqw(ops ...Operand)         { o.a.op("VPCMPEQW", ops...) }
+func (o Opcodes) VPCMPEQW(ops ...Operand)         { o.a.op("VPCMPEQW", ops...) }
+func (o Opcodes) Vpcmpestri(ops ...Operand)       { o.a.op("VPCMPESTRI", ops...) }
+func (o Opcodes) VPCMPESTRI(ops ...Operand)       { o.a.op("VPCMPESTRI", ops...) }
+func (o Opcodes) Vpcmpestrm(ops ...Operand)       { o.a.op("VPCMPESTRM", ops...) }
+func (o Opcodes) VPCMPESTRM(ops ...Operand)       { o.a.op("VPCMPESTRM", ops...) }
+func (o Opcodes) Vpcmpgtb(ops ...Operand)         { o.a.op("VPCMPGTB", ops...) }
+func (o Opcodes) VPCMPGTB(ops ...Operand)         { o.a.op("VPCMPGTB", ops...) }
+func (o Opcodes) Vpcmpgtd(ops ...Operand)         { o.a.op("VPCMPGTD", ops...) }
+func (o Opcodes) VPCMPGTD(ops ...Operand)         { o.a.op("VPCMPGTD", ops...) }
+func (o Opcodes) Vpcmpgtq(ops ...Operand)         { o.a.op("VPCMPGTQ", ops...) }
+func (o Opcodes) VPCMPGTQ(ops ...Operand)         { o.a.op("VPCMPGTQ", ops...) }
+func (o Opcodes) Vpcmpgtw(ops ...Operand)         { o.a.op("VPCMPGTW", ops...) }
+func (o Opcodes) VPCMPGTW(ops ...Operand)         { o.a.op("VPCMPGTW", ops...) }
+func (o Opcodes) Vpcmpistri(ops ...Operand)       { o.a.op("VPCMPISTRI", ops...) }
+func (o Opcodes) VPCMPISTRI(ops ...Operand)       { o.a.op("VPCMPISTRI", ops...) }
+func (o Opcodes) Vpcmpistrm(ops ...Operand)       { o.a.op("VPCMPISTRM", ops...) }
+func (o Opcodes) VPCMPISTRM(ops ...Operand)       { o.a.op("VPCMPISTRM", ops...) }
+func (o Opcodes) Vperm2f128(ops ...Operand)       { o.a.op("VPERM2F128", ops...) }
+func (o Opcodes) VPERM2F128(ops ...Operand)       { o.a.op("VPERM2F128", ops...) }
+func (o Opcodes) Vperm2i128(ops ...Operand)       { o.a.op("VPERM2I128", ops...) }
+func (o Opcodes) VPERM2I128(ops ...Operand)       { o.a.op("VPERM2I128", ops...) }
+func (o Opcodes) Vpermd(ops ...Operand)           { o.a.op("VPERMD", ops...) }
+func (o Opcodes) VPERMD(ops ...Operand)           { o.a.op("VPERMD", ops...) }
+func (o Opcodes) Vpermilpd(ops ...Operand)        { o.a.op("VPERMILPD", ops...) }
+func (o Opcodes) VPERMILPD(ops ...Operand)        { o.a.op("VPERMILPD", ops...) }
+func (o Opcodes) Vpermilps(ops ...Operand)        { o.a.op("VPERMILPS", ops...) }
+func (o Opcodes) VPERMILPS(ops ...Operand)        { o.a.op("VPERMILPS", ops...) }
+func (o Opcodes) Vpermpd(ops ...Operand)          { o.a.op("VPERMPD", ops...) }
+func (o Opcodes) VPERMPD(ops ...Operand)          { o.a.op("VPERMPD", ops...) }
+func (o Opcodes) Vpermps(ops ...Operand)          { o.a.op("VPERMPS", ops...) }
+func (o Opcodes) VPERMPS(ops ...Operand)          { o.a.op("VPERMPS", ops...) }
+func (o Opcodes) Vpermq(ops ...Operand)           { o.a.op("VPERMQ", ops...) }
+func (o Opcodes) VPERMQ(ops ...Operand)           { o.a.op("VPERMQ", ops...) }
+func (o Opcodes) Vpextrb(ops ...Operand)          { o.a.op("VPEXTRB", ops...) }
+func (o Opcodes) VPEXTRB(ops ...Operand)          { o.a.op("VPEXTRB", ops...) }
+func (o Opcodes) Vpextrd(ops ...Operand)          { o.a.op("VPEXTRD", ops...) }
+func (o Opcodes) VPEXTRD(ops ...Operand)          { o.a.op("VPEXTRD", ops...) }
+func (o Opcodes) Vpextrq(ops ...Operand)          { o.a.op("VPEXTRQ", ops...) }
+func (o Opcodes) VPEXTRQ(ops ...Operand)          { o.a.op("VPEXTRQ", ops...) }
+func (o Opcodes) Vpextrw(ops ...Operand)          { o.a.op("VPEXTRW", ops...) }
+func (o Opcodes) VPEXTRW(ops ...Operand)          { o.a.op("VPEXTRW", ops...) }
+func (o Opcodes) Vpgatherdd(ops ...Operand)       { o.a.op("VPGATHERDD", ops...) }
+func (o Opcodes) VPGATHERDD(ops ...Operand)       { o.a.op("VPGATHERDD", ops...) }
+func (o Opcodes) Vpgatherdq(ops ...Operand)       { o.a.op("VPGATHERDQ", ops...) }
+func (o Opcodes) VPGATHERDQ(ops ...Operand)       { o.a.op("VPGATHERDQ", ops...) }
+func (o Opcodes) Vpgatherqd(ops ...Operand)       { o.a.op("VPGATHERQD", ops...) }
+func (o Opcodes) VPGATHERQD(ops ...Operand)       { o.a.op("VPGATHERQD", ops...) }
+func (o Opcodes) Vpgatherqq(ops ...Operand)       { o.a.op("VPGATHERQQ", ops...) }
+func (o Opcodes) VPGATHERQQ(ops ...Operand)       { o.a.op("VPGATHERQQ", ops...) }
+func (o Opcodes) Vphaddd(ops ...Operand)          { o.a.op("VPHADDD", ops...) }
+func (o Opcodes) VPHADDD(ops ...Operand)          { o.a.op("VPHADDD", ops...) }
+func (o Opcodes) Vphaddsw(ops ...Operand)         { o.a.op("VPHADDSW", ops...) }
+func (o Opcodes) VPHADDSW(ops ...Operand)         { o.a.op("VPHADDSW", ops...) }
+func (o Opcodes) Vphaddw(ops ...Operand)          { o.a.op("VPHADDW", ops...) }
+func (o Opcodes) VPHADDW(ops ...Operand)          { o.a.op("VPHADDW", ops...) }
+func (o Opcodes) Vphminposuw(ops ...Operand)      { o.a.op("VPHMINPOSUW", ops...) }
+func (o Opcodes) VPHMINPOSUW(ops ...Operand)      { o.a.op("VPHMINPOSUW", ops...) }
+func (o Opcodes) Vphsubd(ops ...Operand)          { o.a.op("VPHSUBD", ops...) }
+func (o Opcodes) VPHSUBD(ops ...Operand)          { o.a.op("VPHSUBD", ops...) }
+func (o Opcodes) Vphsubsw(ops ...Operand)         { o.a.op("VPHSUBSW", ops...) }
+func (o Opcodes) VPHSUBSW(ops ...Operand)         { o.a.op("VPHSUBSW", ops...) }
+func (o Opcodes) Vphsubw(ops ...Operand)          { o.a.op("VPHSUBW", ops...) }
+func (o Opcodes) VPHSUBW(ops ...Operand)          { o.a.op("VPHSUBW", ops...) }
+func (o Opcodes) Vpinsrb(ops ...Operand)          { o.a.op("VPINSRB", ops...) }
+func (o Opcodes) VPINSRB(ops ...Operand)          { o.a.op("VPINSRB", ops...) }
+func (o Opcodes) Vpinsrd(ops ...Operand)          { o.a.op("VPINSRD", ops...) }
+func (o Opcodes) VPINSRD(ops ...Operand)          { o.a.op("VPINSRD", ops...) }
+func (o Opcodes) Vpinsrq(ops ...Operand)          { o.a.op("VPINSRQ", ops...) }
+func (o Opcodes) VPINSRQ(ops ...Operand)          { o.a.op("VPINSRQ", ops...) }
+func (o Opcodes) Vpinsrw(ops ...Operand)          { o.a.op("VPINSRW", ops...) }
+func (o Opcodes) VPINSRW(ops ...Operand)          { o.a.op("VPINSRW", ops...) }
+func (o Opcodes) Vpmaddubsw(ops ...Operand)       { o.a.op("VPMADDUBSW", ops...) }
+func (o Opcodes) VPMADDUBSW(ops ...Operand)       { o.a.op("VPMADDUBSW", ops...) }
+func (o Opcodes) Vpmaddwd(ops ...Operand)         { o.a.op("VPMADDWD", ops...) }
+func (o Opcodes) VPMADDWD(ops ...Operand)         { o.a.op("VPMADDWD", ops...) }
+func (o Opcodes) Vpmaskmovd(ops ...Operand)       { o.a.op("VPMASKMOVD", ops...) }
+func (o Opcodes) VPMASKMOVD(ops ...Operand)       { o.a.op("VPMASKMOVD", ops...) }
+func (o Opcodes) Vpmaskmovq(ops ...Operand)       { o.a.op("VPMASKMOVQ", ops...) }
+func (o Opcodes) VPMASKMOVQ(ops ...Operand)       { o.a.op("VPMASKMOVQ", ops...) }
+func (o Opcodes) Vpmaxsb(ops ...Operand)          { o.a.op("VPMAXSB", ops...) }
+func (o Opcodes) VPMAXSB(ops ...Operand)          { o.a.op("VPMAXSB", ops...) }
+func (o Opcodes) Vpmaxsd(ops ...Operand)          { o.a.op("VPMAXSD", ops...) }
+func (o Opcodes) VPMAXSD(ops ...Operand)          { o.a.op("VPMAXSD", ops...) }
+func (o Opcodes) Vpmaxsw(ops ...Operand)          { o.a.op("VPMAXSW", ops...) }
+func (o Opcodes) VPMAXSW(ops ...Operand)          { o.a.op("VPMAXSW", ops...) }
+func (o Opcodes) Vpmaxub(ops ...Operand)          { o.a.op("VPMAXUB", ops...) }
+func (o Opcodes) VPMAXUB(ops ...Operand)          { o.a.op("VPMAXUB", ops...) }
+func (o Opcodes) Vpmaxud(ops ...Operand)          { o.a.op("VPMAXUD", ops...) }
+func (o Opcodes) VPMAXUD(ops ...Operand)          { o.a.op("VPMAXUD", ops...) }
+func (o Opcodes) Vpmaxuw(ops ...Operand)          { o.a.op("VPMAXUW", ops...) }
+func (o Opcodes) VPMAXUW(ops ...Operand)          { o.a.op("VPMAXUW", ops...) }
+func (o Opcodes) Vpminsb(ops ...Operand)          { o.a.op("VPMINSB", ops...) }
+func (o Opcodes) VPMINSB(ops ...Operand)          { o.a.op("VPMINSB", ops...) }
+func (o Opcodes) Vpminsd(ops ...Operand)          { o.a.op("VPMINSD", ops...) }
+func (o Opcodes) VPMINSD(ops ...Operand)          { o.a.op("VPMINSD", ops...) }
+func (o Opcodes) Vpminsw(ops ...Operand)          { o.a.op("VPMINSW", ops...) }
+func (o Opcodes) VPMINSW(ops ...Operand)          { o.a.op("VPMINSW", ops...) }
+func (o Opcodes) Vpminub(ops ...Operand)          { o.a.op("VPMINUB", ops...) }
+func (o Opcodes) VPMINUB(ops ...Operand)          { o.a.op("VPMINUB", ops...) }
+func (o Opcodes) Vpminud(ops ...Operand)          { o.a.op("VPMINUD", ops...) }
+func (o Opcodes) VPMINUD(ops ...Operand)          { o.a.op("VPMINUD", ops...) }
+func (o Opcodes) Vpminuw(ops ...Operand)          { o.a.op("VPMINUW", ops...) }
+func (o Opcodes) VPMINUW(ops ...Operand)          { o.a.op("VPMINUW", ops...) }
+func (o Opcodes) Vpmovmskb(ops ...Operand)        { o.a.op("VPMOVMSKB", ops...) }
+func (o Opcodes) VPMOVMSKB(ops ...Operand)        { o.a.op("VPMOVMSKB", ops...) }
+func (o Opcodes) Vpmovsxbd(ops ...Operand)        { o.a.op("VPMOVSXBD", ops...) }
+func (o Opcodes) VPMOVSXBD(ops ...Operand)        { o.a.op("VPMOVSXBD", ops...) }
+func (o Opcodes) Vpmovsxbq(ops ...Operand)        { o.a.op("VPMOVSXBQ", ops...) }
+func (o Opcodes) VPMOVSXBQ(ops ...Operand)        { o.a.op("VPMOVSXBQ", ops...) }
+func (o Opcodes) Vpmovsxbw(ops ...Operand)        { o.a.op("VPMOVSXBW", ops...) }
+func (o Opcodes) VPMOVSXBW(ops ...Operand)        { o.a.op("VPMOVSXBW", ops...) }
+func (o Opcodes) Vpmovsxdq(ops ...Operand)        { o.a.op("VPMOVSXDQ", ops...) }
+func (o Opcodes) VPMOVSXDQ(ops ...Operand)        { o.a.op("VPMOVSXDQ", ops...) }
+func (o Opcodes) Vpmovsxwd(ops ...Operand)        { o.a.op("VPMOVSXWD", ops...) }
+func (o Opcodes) VPMOVSXWD(ops ...Operand)        { o.a.op("VPMOVSXWD", ops...) }
+func (o Opcodes) Vpmovsxwq(ops ...Operand)        { o.a.op("VPMOVSXWQ", ops...) }
+func (o Opcodes) VPMOVSXWQ(ops ...Operand)        { o.a.op("VPMOVSXWQ", ops...) }
+func (o Opcodes) Vpmovzxbd(ops ...Operand)        { o.a.op("VPMOVZXBD", ops...) }
+func (o Opcodes) VPMOVZXBD(ops ...Operand)        { o.a.op("VPMOVZXBD", ops...) }
+func (o Opcodes) Vpmovzxbq(ops ...Operand)        { o.a.op("VPMOVZXBQ", ops...) }
+func (o Opcodes) VPMOVZXBQ(ops ...Operand)        { o.a.op("VPMOVZXBQ", ops...) }
+func (o Opcodes) Vpmovzxbw(ops ...Operand)        { o.a.op("VPMOVZXBW", ops...) }
+func (o Opcodes) VPMOVZXBW(ops ...Operand)        { o.a.op("VPMOVZXBW", ops...) }
+func (o Opcodes) Vpmovzxdq(ops ...Operand)        { o.a.op("VPMOVZXDQ", ops...) }
+func (o Opcodes) VPMOVZXDQ(ops ...Operand)        { o.a.op("VPMOVZXDQ", ops...) }
+func (o Opcodes) Vpmovzxwd(ops ...Operand)        { o.a.op("VPMOVZXWD", ops...) }
+func (o Opcodes) VPMOVZXWD(ops ...Operand)        { o.a.op("VPMOVZXWD", ops...) }
+func (o Opcodes) Vpmovzxwq(ops ...Operand)        { o.a.op("VPMOVZXWQ", ops...) }
+func (o Opcodes) VPMOVZXWQ(ops ...Operand)        { o.a.op("VPMOVZXWQ", ops...) }
+func (o Opcodes) Vpmuldq(ops ...Operand)          { o.a.op("VPMULDQ", ops...) }
+func (o Opcodes) VPMULDQ(ops ...Operand)          { o.a.op("VPMULDQ", ops...) }
+func (o Opcodes) Vpmulhrsw(ops ...Operand)        { o.a.op("VPMULHRSW", ops...) }
+func (o Opcodes) VPMULHRSW(ops ...Operand)        { o.a.op("VPMULHRSW", ops...) }
+func (o Opcodes) Vpmulhuw(ops ...Operand)         { o.a.op("VPMULHUW", ops...) }
+func (o Opcodes) VPMULHUW(ops ...Operand)         { o.a.op("VPMULHUW", ops...) }
+func (o Opcodes) Vpmulhw(ops ...Operand)          { o.a.op("VPMULHW", ops...) }
+func (o Opcodes) VPMULHW(ops ...Operand)          { o.a.op("VPMULHW", ops...) }
+func (o Opcodes) Vpmulld(ops ...Operand)          { o.a.op("VPMULLD", ops...) }
+func (o Opcodes) VPMULLD(ops ...Operand)          { o.a.op("VPMULLD", ops...) }
+func (o Opcodes) Vpmullw(ops ...Operand)          { o.a.op("VPMULLW", ops...) }
+func (o Opcodes) VPMULLW(ops ...Operand)          { o.a.op("VPMULLW", ops...) }
+func (o Opcodes) Vpmuludq(ops ...Operand)         { o.a.op("VPMULUDQ", ops...) }
+func (o Opcodes) VPMULUDQ(ops ...Operand)         { o.a.op("VPMULUDQ", ops...) }
+func (o Opcodes) Vpor(ops ...Operand)             { o.a.op("VPOR", ops...) }
+func (o Opcodes) VPOR(ops ...Operand)             { o.a.op("VPOR", ops...) }
+func (o Opcodes) Vpsadbw(ops ...Operand)          { o.a.op("VPSADBW", ops...) }
+func (o Opcodes) VPSADBW(ops ...Operand)          { o.a.op("VPSADBW", ops...) }
+func (o Opcodes) Vpshufb(ops ...Operand)          { o.a.op("VPSHUFB", ops...) }
+func (o Opcodes) VPSHUFB(ops ...Operand)          { o.a.op("VPSHUFB", ops...) }
+func (o Opcodes) Vpshufd(ops ...Operand)          { o.a.op("VPSHUFD", ops...) }
+func (o Opcodes) VPSHUFD(ops ...Operand)          { o.a.op("VPSHUFD", ops...) }
+func (o Opcodes) Vpshufhw(ops ...Operand)         { o.a.op("VPSHUFHW", ops...) }
+func (o Opcodes) VPSHUFHW(ops ...Operand)         { o.a.op("VPSHUFHW", ops...) }
+func (o Opcodes) Vpshuflw(ops ...Operand)         { o.a.op("VPSHUFLW", ops...) }
+func (o Opcodes) VPSHUFLW(ops ...Operand)         { o.a.op("VPSHUFLW", ops...) }
+func (o Opcodes) Vpsignb(ops ...Operand)          { o.a.op("VPSIGNB", ops...) }
+func (o Opcodes) VPSIGNB(ops ...Operand)          { o.a.op("VPSIGNB", ops...) }
+func (o Opcodes) Vpsignd(ops ...Operand)          { o.a.op("VPSIGND", ops...) }
+func (o Opcodes) VPSIGND(ops ...Operand)          { o.a.op("VPSIGND", ops...) }
+func (o Opcodes) Vpsignw(ops ...Operand)          { o.a.op("VPSIGNW", ops...) }
+func (o Opcodes) VPSIGNW(ops ...Operand)          { o.a.op("VPSIGNW", ops...) }
+func (o Opcodes) Vpslld(ops ...Operand)           { o.a.op("VPSLLD", ops...) }
+func (o Opcodes) VPSLLD(ops ...Operand)           { o.a.op("VPSLLD", ops...) }
+func (o Opcodes) Vpslldq(ops ...Operand)          { o.a.op("VPSLLDQ", ops...) }
+func (o Opcodes) VPSLLDQ(ops ...Operand)          { o.a.op("VPSLLDQ", ops...) }
+func (o Opcodes) Vpsllq(ops ...Operand)           { o.a.op("VPSLLQ", ops...) }
+func (o Opcodes) VPSLLQ(ops ...Operand)           { o.a.op("VPSLLQ", ops...) }
+func (o Opcodes) Vpsllvd(ops ...Operand)          { o.a.op("VPSLLVD", ops...) }
+func (o Opcodes) VPSLLVD(ops ...Operand)          { o.a.op("VPSLLVD", ops...) }
+func (o Opcodes) Vpsllvq(ops ...Operand)          { o.a.op("VPSLLVQ", ops...) }
+func (o Opcodes) VPSLLVQ(ops ...Operand)          { o.a.op("VPSLLVQ", ops...) }
+func (o Opcodes) Vpsllw(ops ...Operand)           { o.a.op("VPSLLW", ops...) }
+func (o Opcodes) VPSLLW(ops ...Operand)           { o.a.op("VPSLLW", ops...) }
+func (o Opcodes) Vpsrad(ops ...Operand)           { o.a.op("VPSRAD", ops...) }
+func (o Opcodes) VPSRAD(ops ...Operand)           { o.a.op("VPSRAD", ops...) }
+func (o Opcodes) Vpsravd(ops ...Operand)          { o.a.op("VPSRAVD", ops...) }
+func (o Opcodes) VPSRAVD(ops ...Operand)          { o.a.op("VPSRAVD", ops...) }
+func (o Opcodes) Vpsraw(ops ...Operand)           { o.a.op("VPSRAW", ops...) }
+func (o Opcodes) VPSRAW(ops ...Operand)           { o.a.op("VPSRAW", ops...) }
+func (o Opcodes) Vpsrld(ops ...Operand)           { o.a.op("VPSRLD", ops...) }
+func (o Opcodes) VPSRLD(ops ...Operand)           { o.a.op("VPSRLD", ops...) }
+func (o Opcodes) Vpsrldq(ops ...Operand)          { o.a.op("VPSRLDQ", ops...) }
+func (o Opcodes) VPSRLDQ(ops ...Operand)          { o.a.op("VPSRLDQ", ops...) }
+func (o Opcodes) Vpsrlq(ops ...Operand)           { o.a.op("VPSRLQ", ops...) }
+func (o Opcodes) VPSRLQ(ops ...Operand)           { o.a.op("VPSRLQ", ops...) }
+func (o Opcodes) Vpsrlvd(ops ...Operand)          { o.a.op("VPSRLVD", ops...) }
+func (o Opcodes) VPSRLVD(ops ...Operand)          { o.a.op("VPSRLVD", ops...) }
+func (o Opcodes) Vpsrlvq(ops ...Operand)          { o.a.op("VPSRLVQ", ops...) }
+func (o Opcodes) VPSRLVQ(ops ...Operand)          { o.a.op("VPSRLVQ", ops...) }
+func (o Opcodes) Vpsrlw(ops ...Operand)           { o.a.op("VPSRLW", ops...) }
+func (o Opcodes) VPSRLW(ops ...Operand)           { o.a.op("VPSRLW", ops...) }
+func (o Opcodes) Vpsubb(ops ...Operand)           { o.a.op("VPSUBB", ops...) }
+func (o Opcodes) VPSUBB(ops ...Operand)           { o.a.op("VPSUBB", ops...) }
+func (o Opcodes) Vpsubd(ops ...Operand)           { o.a.op("VPSUBD", ops...) }
+func (o Opcodes) VPSUBD(ops ...Operand)           { o.a.op("VPSUBD", ops...) }
+func (o Opcodes) Vpsubq(ops ...Operand)           { o.a.op("VPSUBQ", ops...) }
+func (o Opcodes) VPSUBQ(ops ...Operand)           { o.a.op("VPSUBQ", ops...) }
+func (o Opcodes) Vpsubsb(ops ...Operand)          { o.a.op("VPSUBSB", ops...) }
+func (o Opcodes) VPSUBSB(ops ...Operand)          { o.a.op("VPSUBSB", ops...) }
+func (o Opcodes) Vpsubsw(ops ...Operand)          { o.a.op("VPSUBSW", ops...) }
+func (o Opcodes) VPSUBSW(ops ...Operand)          { o.a.op("VPSUBSW", ops...) }
+func (o Opcodes) Vpsubusb(ops ...Operand)         { o.a.op("VPSUBUSB", ops...) }
+func (o Opcodes) VPSUBUSB(ops ...Operand)         { o.a.op("VPSUBUSB", ops...) }
+func (o Opcodes) Vpsubusw(ops ...Operand)         { o.a.op("VPSUBUSW", ops...) }
+func (o Opcodes) VPSUBUSW(ops ...Operand)         { o.a.op("VPSUBUSW", ops...) }
+func (o Opcodes) Vpsubw(ops ...Operand)           { o.a.op("VPSUBW", ops...) }
+func (o Opcodes) VPSUBW(ops ...Operand)           { o.a.op("VPSUBW", ops...) }
+func (o Opcodes) Vptest(ops ...Operand)           { o.a.op("VPTEST", ops...) }
+func (o Opcodes) VPTEST(ops ...Operand)           { o.a.op("VPTEST", ops...) }
+func (o Opcodes) Vpunpckhbw(ops ...Operand)       { o.a.op("VPUNPCKHBW", ops...) }
+func (o Opcodes) VPUNPCKHBW(ops ...Operand)       { o.a.op("VPUNPCKHBW", ops...) }
+func (o Opcodes) Vpunpckhdq(ops ...Operand)       { o.a.op("VPUNPCKHDQ", ops...) }
+func (o Opcodes) VPUNPCKHDQ(ops ...Operand)       { o.a.op("VPUNPCKHDQ", ops...) }
+func (o Opcodes) Vpunpckhqdq(ops ...Operand)      { o.a.op("VPUNPCKHQDQ", ops...) }
+func (o Opcodes) VPUNPCKHQDQ(ops ...Operand)      { o.a.op("VPUNPCKHQDQ", ops...) }
+func (o Opcodes) Vpunpckhwd(ops ...Operand)       { o.a.op("VPUNPCKHWD", ops...) }
+func (o Opcodes) VPUNPCKHWD(ops ...Operand)       { o.a.op("VPUNPCKHWD", ops...) }
+func (o Opcodes) Vpunpcklbw(ops ...Operand)       { o.a.op("VPUNPCKLBW", ops...) }
+func (o Opcodes) VPUNPCKLBW(ops ...Operand)       { o.a.op("VPUNPCKLBW", ops...) }
+func (o Opcodes) Vpunpckldq(ops ...Operand)       { o.a.op("VPUNPCKLDQ", ops...) }
+func (o Opcodes) VPUNPCKLDQ(ops ...Operand)       { o.a.op("VPUNPCKLDQ", ops...) }
+func (o Opcodes) Vpunpcklqdq(ops ...Operand)      { o.a.op("VPUNPCKLQDQ", ops...) }
+func (o Opcodes) VPUNPCKLQDQ(ops ...Operand)      { o.a.op("VPUNPCKLQDQ", ops...) }
+func (o Opcodes) Vpunpcklwd(ops ...Operand)       { o.a.op("VPUNPCKLWD", ops...) }
+func (o Opcodes) VPUNPCKLWD(ops ...Operand)       { o.a.op("VPUNPCKLWD", ops...) }
+func (o Opcodes) Vpxor(ops ...Operand)            { o.a.op("VPXOR", ops...) }
+func (o Opcodes) VPXOR(ops ...Operand)            { o.a.op("VPXOR", ops...) }
+func (o Opcodes) Vrcpps(ops ...Operand)           { o.a.op("VRCPPS", ops...) }
+func (o Opcodes) VRCPPS(ops ...Operand)           { o.a.op("VRCPPS", ops...) }
+func (o Opcodes) Vrcpss(ops ...Operand)           { o.a.op("VRCPSS", ops...) }
+func (o Opcodes) VRCPSS(ops ...Operand)           { o.a.op("VRCPSS", ops...) }
+func (o Opcodes) Vroundpd(ops ...Operand)         { o.a.op("VROUNDPD", ops...) }
+func (o Opcodes) VROUNDPD(ops ...Operand)         { o.a.op("VROUNDPD", ops...) }
+func (o Opcodes) Vroundps(ops ...Operand)         { o.a.op("VROUNDPS", ops...) }
+func (o Opcodes) VROUNDPS(ops ...Operand)         { o.a.op("VROUNDPS", ops...) }
+func (o Opcodes) Vroundsd(ops ...Operand)         { o.a.op("VROUNDSD", ops...) }
+func (o Opcodes) VROUNDSD(ops ...Operand)         { o.a.op("VROUNDSD", ops...) }
+func (o Opcodes) Vroundss(ops ...Operand)         { o.a.op("VROUNDSS", ops...) }
+func (o Opcodes) VROUNDSS(ops ...Operand)         { o.a.op("VROUNDSS", ops...) }
+func (o Opcodes) Vrsqrtps(ops ...Operand)         { o.a.op("VRSQRTPS", ops...) }
+func (o Opcodes) VRSQRTPS(ops ...Operand)         { o.a.op("VRSQRTPS", ops...) }
+func (o Opcodes) Vrsqrtss(ops ...Operand)         { o.a.op("VRSQRTSS", ops...) }
+func (o Opcodes) VRSQRTSS(ops ...Operand)         { o.a.op("VRSQRTSS", ops...) }
+func (o Opcodes) Vshufpd(ops ...Operand)          { o.a.op("VSHUFPD", ops...) }
+func (o Opcodes) VSHUFPD(ops ...Operand)          { o.a.op("VSHUFPD", ops...) }
+func (o Opcodes) Vshufps(ops ...Operand)          { o.a.op("VSHUFPS", ops...) }
+func (o Opcodes) VSHUFPS(ops ...Operand)          { o.a.op("VSHUFPS", ops...) }
+func (o Opcodes) Vsqrtpd(ops ...Operand)          { o.a.op("VSQRTPD", ops...) }
+func (o Opcodes) VSQRTPD(ops ...Operand)          { o.a.op("VSQRTPD", ops...) }
+func (o Opcodes) Vsqrtps(ops ...Operand)          { o.a.op("VSQRTPS", ops...) }
+func (o Opcodes) VSQRTPS(ops ...Operand)          { o.a.op("VSQRTPS", ops...) }
+func (o Opcodes) Vsqrtsd(ops ...Operand)          { o.a.op("VSQRTSD", ops...) }
+func (o Opcodes) VSQRTSD(ops ...Operand)          { o.a.op("VSQRTSD", ops...) }
+func (o Opcodes) Vsqrtss(ops ...Operand)          { o.a.op("VSQRTSS", ops...) }
+func (o Opcodes) VSQRTSS(ops ...Operand)          { o.a.op("VSQRTSS", ops...) }
+func (o Opcodes) Vstmxcsr(ops ...Operand)         { o.a.op("VSTMXCSR", ops...) }
+func (o Opcodes) VSTMXCSR(ops ...Operand)         { o.a.op("VSTMXCSR", ops...) }
+func (o Opcodes) Vsubpd(ops ...Operand)           { o.a.op("VSUBPD", ops...) }
+func (o Opcodes) VSUBPD(ops ...Operand)           { o.a.op("VSUBPD", ops...) }
+func (o Opcodes) Vsubps(ops ...Operand)           { o.a.op("VSUBPS", ops...) }
+func (o Opcodes) VSUBPS(ops ...Operand)           { o.a.op("VSUBPS", ops...) }
+func (o Opcodes) Vsubsd(ops ...Operand)           { o.a.op("VSUBSD", ops...) }
+func (o Opcodes) VSUBSD(ops ...Operand)           { o.a.op("VSUBSD", ops...) }
+func (o Opcodes) Vsubss(ops ...Operand)           { o.a.op("VSUBSS", ops...) }
+func (o Opcodes) VSUBSS(ops ...Operand)           { o.a.op("VSUBSS", ops...) }
+func (o Opcodes) Vtestpd(ops ...Operand)          { o.a.op("VTESTPD", ops...) }
+func (o Opcodes) VTESTPD(ops ...Operand)          { o.a.op("VTESTPD", ops...) }
+func (o Opcodes) Vtestps(ops ...Operand)          { o.a.op("VTESTPS", ops...) }
+func (o Opcodes) VTESTPS(ops ...Operand)          { o.a.op("VTESTPS", ops...) }
+func (o Opcodes) Vucomisd(ops ...Operand)         { o.a.op("VUCOMISD", ops...) }
+func (o Opcodes) VUCOMISD(ops ...Operand)         { o.a.op("VUCOMISD", ops...) }
+func (o Opcodes) Vucomiss(ops ...Operand)         { o.a.op("VUCOMISS", ops...) }
+func (o Opcodes) VUCOMISS(ops ...Operand)         { o.a.op("VUCOMISS", ops...) }
+func (o Opcodes) Vunpckhpd(ops ...Operand)        { o.a.op("VUNPCKHPD", ops...) }
+func (o Opcodes) VUNPCKHPD(ops ...Operand)        { o.a.op("VUNPCKHPD", ops...) }
+func (o Opcodes) Vunpckhps(ops ...Operand)        { o.a.op("VUNPCKHPS", ops...) }
+func (o Opcodes) VUNPCKHPS(ops ...Operand)        { o.a.op("VUNPCKHPS", ops...) }
+func (o Opcodes) Vunpcklpd(ops ...Operand)        { o.a.op("VUNPCKLPD", ops...) }
+func (o Opcodes) VUNPCKLPD(ops ...Operand)        { o.a.op("VUNPCKLPD", ops...) }
+func (o Opcodes) Vunpcklps(ops ...Operand)        { o.a.op("VUNPCKLPS", ops...) }
+func (o Opcodes) VUNPCKLPS(ops ...Operand)        { o.a.op("VUNPCKLPS", ops...) }
+func (o Opcodes) Vxorpd(ops ...Operand)           { o.a.op("VXORPD", ops...) }
+func (o Opcodes) VXORPD(ops ...Operand)           { o.a.op("VXORPD", ops...) }
+func (o Opcodes) Vxorps(ops ...Operand)           { o.a.op("VXORPS", ops...) }
+func (o Opcodes) VXORPS(ops ...Operand)           { o.a.op("VXORPS", ops...) }
+func (o Opcodes) Vzeroall(ops ...Operand)         { o.a.op("VZEROALL", ops...) }
+func (o Opcodes) VZEROALL(ops ...Operand)         { o.a.op("VZEROALL", ops...) }
+func (o Opcodes) Vzeroupper(ops ...Operand)       { o.a.op("VZEROUPPER", ops...) }
+func (o Opcodes) VZEROUPPER(ops ...Operand)       { o.a.op("VZEROUPPER", ops...) }
+func (o Opcodes) Wait(ops ...Operand)             { o.a.op("WAIT", ops...) }
+func (o Opcodes) WAIT(ops ...Operand)             { o.a.op("WAIT", ops...) }
+func (o Opcodes) Wbinvd(ops ...Operand)           { o.a.op("WBINVD", ops...) }
+func (o Opcodes) WBINVD(ops ...Operand)           { o.a.op("WBINVD", ops...) }
+func (o Opcodes) Word(ops ...Operand)             { o.a.op("WORD", ops...) }
+func (o Opcodes) WORD(ops ...Operand)             { o.a.op("WORD", ops...) }
+func (o Opcodes) Wrmsr(ops ...Operand)            { o.a.op("WRMSR", ops...) }
+func (o Opcodes) WRMSR(ops ...Operand)            { o.a.op("WRMSR", ops...) }
+func (o Opcodes) Xabort(ops ...Operand)           { o.a.op("XABORT", ops...) }
+func (o Opcodes) XABORT(ops ...Operand)           { o.a.op("XABORT", ops...) }
+func (o Opcodes) Xacquire(ops ...Operand)         { o.a.op("XACQUIRE", ops...) }
+func (o Opcodes) XACQUIRE(ops ...Operand)         { o.a.op("XACQUIRE", ops...) }
+func (o Opcodes) Xaddb(ops ...Operand)            { o.a.op("XADDB", ops...) }
+func (o Opcodes) XADDB(ops ...Operand)            { o.a.op("XADDB", ops...) }
+func (o Opcodes) Xaddl(ops ...Operand)            { o.a.op("XADDL", ops...) }
+func (o Opcodes) XADDL(ops ...Operand)            { o.a.op("XADDL", ops...) }
+func (o Opcodes) Xaddq(ops ...Operand)            { o.a.op("XADDQ", ops...) }
+func (o Opcodes) XADDQ(ops ...Operand)            { o.a.op("XADDQ", ops...) }
+func (o Opcodes) Xaddw(ops ...Operand)            { o.a.op("XADDW", ops...) }
+func (o Opcodes) XADDW(ops ...Operand)            { o.a.op("XADDW", ops...) }
+func (o Opcodes) Xbegin(ops ...Operand)           { o.a.op("XBEGIN", ops...) }
+func (o Opcodes) XBEGIN(ops ...Operand)           { o.a.op("XBEGIN", ops...) }
+func (o Opcodes) Xchgb(ops ...Operand)            { o.a.op("XCHGB", ops...) }
+func (o Opcodes) XCHGB(ops ...Operand)            { o.a.op("XCHGB", ops...) }
+func (o Opcodes) Xchgl(ops ...Operand)            { o.a.op("XCHGL", ops...) }
+func (o Opcodes) XCHGL(ops ...Operand)            { o.a.op("XCHGL", ops...) }
+func (o Opcodes) Xchgq(ops ...Operand)            { o.a.op("XCHGQ", ops...) }
+func (o Opcodes) XCHGQ(ops ...Operand)            { o.a.op("XCHGQ", ops...) }
+func (o Opcodes) Xchgw(ops ...Operand)            { o.a.op("XCHGW", ops...) }
+func (o Opcodes) XCHGW(ops ...Operand)            { o.a.op("XCHGW", ops...) }
+func (o Opcodes) Xend(ops ...Operand)             { o.a.op("XEND", ops...) }
+func (o Opcodes) XEND(ops ...Operand)             { o.a.op("XEND", ops...) }
+func (o Opcodes) Xgetbv(ops ...Operand)           { o.a.op("XGETBV", ops...) }
+func (o Opcodes) XGETBV(ops ...Operand)           { o.a.op("XGETBV", ops...) }
+func (o Opcodes) Xlat(ops ...Operand)             { o.a.op("XLAT", ops...) }
+func (o Opcodes) XLAT(ops ...Operand)             { o.a.op("XLAT", ops...) }
+func (o Opcodes) Xorb(ops ...Operand)             { o.a.op("XORB", ops...) }
+func (o Opcodes) XORB(ops ...Operand)             { o.a.op("XORB", ops...) }
+func (o Opcodes) Xorl(ops ...Operand)             { o.a.op("XORL", ops...) }
+func (o Opcodes) XORL(ops ...Operand)             { o.a.op("XORL", ops...) }
+func (o Opcodes) Xorpd(ops ...Operand)            { o.a.op("XORPD", ops...) }
+func (o Opcodes) XORPD(ops ...Operand)            { o.a.op("XORPD", ops...) }
+func (o Opcodes) Xorps(ops ...Operand)            { o.a.op("XORPS", ops...) }
+func (o Opcodes) XORPS(ops ...Operand)            { o.a.op("XORPS", ops...) }
+func (o Opcodes) Xorq(ops ...Operand)             { o.a.op("XORQ", ops...) }
+func (o Opcodes) XORQ(ops ...Operand)             { o.a.op("XORQ", ops...) }
+func (o Opcodes) Xorw(ops ...Operand)             { o.a.op("XORW", ops...) }
+func (o Opcodes) XORW(ops ...Operand)             { o.a.op("XORW", ops...) }
+func (o Opcodes) Xrelease(ops ...Operand)         { o.a.op("XRELEASE", ops...) }
+func (o Opcodes) XRELEASE(ops ...Operand)         { o.a.op("XRELEASE", ops...) }
+func (o Opcodes) Xtest(ops ...Operand)            { o.a.op("XTEST", ops...) }
+func (o Opcodes) XTEST(ops ...Operand)            { o.a.op("XTEST", ops...) }
+func (o Opcodes) Last(ops ...Operand)             { o.a.op("LAST", ops...) }
+func (o Opcodes) LAST(ops ...Operand)             { o.a.op("LAST", ops...) }
diff --git a/vendor/github.com/tmthrgd/asm/opcode_gen.go b/vendor/github.com/tmthrgd/asm/opcode_gen.go
index b3f477708b3c16bd2e63ec3e699e0aa0b0d17f1a..8aa47bbd010858dd9679c6e09a1e612e8bf25bb5 100644
--- a/vendor/github.com/tmthrgd/asm/opcode_gen.go
+++ b/vendor/github.com/tmthrgd/asm/opcode_gen.go
@@ -14,7 +14,9 @@ import (
 	"fmt"
 	"log"
 	"os"
+	"path/filepath"
 	"regexp"
+	"runtime"
 	"strings"
 )
 
@@ -38,14 +40,20 @@ func main() {
 	if err != nil {
 		log.Fatal(err)
 	}
+	defer in.Close()
 
 	fd, err := os.Create(*output)
 	if err != nil {
 		log.Fatal(err)
 	}
+	defer fd.Close()
 
 	out := bufio.NewWriter(fd)
-	defer out.Flush()
+	defer func() {
+		if err := out.Flush(); err != nil {
+			log.Fatal(err)
+		}
+	}()
 
 	var on = false
 	s := bufio.NewScanner(in)
@@ -62,8 +70,15 @@ func main() {
 				continue
 			}
 
+			inputPath, err := filepath.Rel(runtime.GOROOT(), *input)
+			if err != nil {
+				inputPath = *input
+			} else {
+				inputPath = filepath.Join("$GOROOT", inputPath)
+			}
+
 			// It's on. Start with the header.
-			fmt.Fprintf(out, header, *input, *output, *pkg, *pkg)
+			fmt.Fprintf(out, header, inputPath, *output, *pkg, *pkg)
 			on = true
 			line = line[:index]
 		}
diff --git a/vendor/github.com/tmthrgd/go-hex/asm_gen.go b/vendor/github.com/tmthrgd/go-hex/asm_gen.go
index 3da3ae193bda91d69d0ccc16073b9943f8d20f2d..a2ac965d5b74e7f4e0924db021e403fa2c50c6f3 100644
--- a/vendor/github.com/tmthrgd/go-hex/asm_gen.go
+++ b/vendor/github.com/tmthrgd/go-hex/asm_gen.go
@@ -173,7 +173,7 @@ func encodeASM(a *asm.Asm) {
 	a.Cmpq(asm.Constant(16), e.cx)
 	a.Jb(tail)
 
-	a.Cmpb(asm.Constant(1), asm.Data("runtime·support_avx"))
+	a.Cmpb(asm.Constant(1), asm.Data("·support_avx"))
 	a.Jne(bigloop_sse)
 
 	e.BigLoop(bigloop_avx, a.Vpand, a.Vpunpckhbw, a.Vpshufb)
@@ -242,7 +242,8 @@ func encodeASM(a *asm.Asm) {
 
 	for i := 7; i >= 5; i-- {
 		a.Label(tailOut[i])
-		a.Pextrw(asm.Address(e.di, (i-1)*2), asm.X1, asm.Constant(i-1))
+		a.Pextrb(asm.Address(e.di, (i-1)*2+1), asm.X1, asm.Constant((i-1)*2+1))
+		a.Pextrb(asm.Address(e.di, (i-1)*2+0), asm.X1, asm.Constant((i-1)*2+0))
 	}
 
 	a.Label(tailOut[4])
@@ -251,7 +252,8 @@ func encodeASM(a *asm.Asm) {
 
 	for i := 3; i >= 1; i-- {
 		a.Label(tailOut[i])
-		a.Pextrw(asm.Address(e.di, (i-1)*2), asm.X1, asm.Constant(i-1))
+		a.Pextrb(asm.Address(e.di, (i-1)*2+1), asm.X1, asm.Constant((i-1)*2+1))
+		a.Pextrb(asm.Address(e.di, (i-1)*2+0), asm.X1, asm.Constant((i-1)*2+0))
 	}
 
 	a.Label(ret)
@@ -432,7 +434,7 @@ func decodeASM(a *asm.Asm) {
 	a.Cmpq(asm.Constant(16), d.cx)
 	a.Jb(tail)
 
-	a.Cmpb(asm.Constant(1), asm.Data("runtime·support_avx"))
+	a.Cmpb(asm.Constant(1), asm.Data("·support_avx"))
 	a.Jne(bigloop_sse)
 
 	d.BigLoop(bigloop_avx, a.Vpxor, a.Vpcmpgtb, a.Vpshufb)
diff --git a/vendor/github.com/tmthrgd/go-hex/hex_amd64.go b/vendor/github.com/tmthrgd/go-hex/hex_amd64.go
index 5e3895692857e8690deb2afcc0805891cd9854f5..cf00d9485ec6d0bf8f88afb17e330c60e5d8181e 100644
--- a/vendor/github.com/tmthrgd/go-hex/hex_amd64.go
+++ b/vendor/github.com/tmthrgd/go-hex/hex_amd64.go
@@ -7,6 +7,10 @@
 
 package hex
 
+import "golang.org/x/sys/cpu"
+
+var support_avx = cpu.X86.HasAVX
+
 // RawEncode encodes src into EncodedLen(len(src))
 // bytes of dst.  As a convenience, it returns the number
 // of bytes written to dst, but this value is always EncodedLen(len(src)).
diff --git a/vendor/github.com/tmthrgd/go-hex/hex_decode_amd64.s b/vendor/github.com/tmthrgd/go-hex/hex_decode_amd64.s
index 876ade09813f32dde009e8c48eb0d9a54e02263b..5963c583ed8c0eb22d827e2a2e6114845d36942e 100644
--- a/vendor/github.com/tmthrgd/go-hex/hex_decode_amd64.s
+++ b/vendor/github.com/tmthrgd/go-hex/hex_decode_amd64.s
@@ -56,18 +56,16 @@ TEXT ·decodeASM(SB),NOSPLIT,$0
 	MOVW $65535, DX
 	CMPQ BX, $16
 	JB tail
-	CMPB runtime·support_avx(SB), $1
+	CMPB ·support_avx(SB), $1
 	JNE bigloop_sse
 bigloop_avx:
 	MOVOU (SI), X0
 	VPXOR decodeToSigned<>(SB), X0, X1
 	POR decodeToLower<>(SB), X0
 	VPXOR decodeToSigned<>(SB), X0, X2
-	// VPCMPGTB X1, X14, X3
-	BYTE $0xc5; BYTE $0x89; BYTE $0x64; BYTE $0xd9
+	VPCMPGTB X1, X14, X3
 	PCMPGTB decodeValid<>+0x10(SB), X1
-	// VPCMPGTB X2, X15, X4
-	BYTE $0xc5; BYTE $0x81; BYTE $0x64; BYTE $0xe2
+	VPCMPGTB X2, X15, X4
 	PCMPGTB decodeValid<>+0x30(SB), X2
 	PAND X4, X1
 	POR X2, X3
diff --git a/vendor/github.com/tmthrgd/go-hex/hex_encode_amd64.s b/vendor/github.com/tmthrgd/go-hex/hex_encode_amd64.s
index 7d5feafa6d4824ae55df0e9c468050a833080753..48d569d9186038239fd5f20342e88c230138450a 100644
--- a/vendor/github.com/tmthrgd/go-hex/hex_encode_amd64.s
+++ b/vendor/github.com/tmthrgd/go-hex/hex_encode_amd64.s
@@ -26,15 +26,14 @@ TEXT ·encodeASM(SB),NOSPLIT,$0
 	MOVOU (DX), X15
 	CMPQ BX, $16
 	JB tail
-	CMPB runtime·support_avx(SB), $1
+	CMPB ·support_avx(SB), $1
 	JNE bigloop_sse
 bigloop_avx:
 	MOVOU -16(SI)(BX*1), X0
 	VPAND encodeMask<>(SB), X0, X1
 	PSRLW $4, X0
 	PAND encodeMask<>(SB), X0
-	// VPUNPCKHBW X1, X0, X3
-	BYTE $0xc5; BYTE $0xf9; BYTE $0x68; BYTE $0xd9
+	VPUNPCKHBW X1, X0, X3
 	PUNPCKLBW X1, X0
 	VPSHUFB X0, X15, X1
 	VPSHUFB X3, X15, X2
@@ -101,26 +100,26 @@ tail_out_8:
 	ADDQ $16, DI
 	JMP tail
 tail_out_7:
-	// PEXTRW $6, X1, 12(DI)
-	BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x15; BYTE $0x4f; BYTE $0x0c; BYTE $0x06
+	PEXTRB $13, X1, 13(DI)
+	PEXTRB $12, X1, 12(DI)
 tail_out_6:
-	// PEXTRW $5, X1, 10(DI)
-	BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x15; BYTE $0x4f; BYTE $0x0a; BYTE $0x05
+	PEXTRB $11, X1, 11(DI)
+	PEXTRB $10, X1, 10(DI)
 tail_out_5:
-	// PEXTRW $4, X1, 8(DI)
-	BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x15; BYTE $0x4f; BYTE $0x08; BYTE $0x04
+	PEXTRB $9, X1, 9(DI)
+	PEXTRB $8, X1, 8(DI)
 tail_out_4:
 	MOVQ X1, (DI)
 	RET
 tail_out_3:
-	// PEXTRW $2, X1, 4(DI)
-	BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x15; BYTE $0x4f; BYTE $0x04; BYTE $0x02
+	PEXTRB $5, X1, 5(DI)
+	PEXTRB $4, X1, 4(DI)
 tail_out_2:
-	// PEXTRW $1, X1, 2(DI)
-	BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x15; BYTE $0x4f; BYTE $0x02; BYTE $0x01
+	PEXTRB $3, X1, 3(DI)
+	PEXTRB $2, X1, 2(DI)
 tail_out_1:
-	// PEXTRW $0, X1, (DI)
-	BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x15; BYTE $0x0f; BYTE $0x00
+	PEXTRB $1, X1, 1(DI)
+	PEXTRB $0, X1, (DI)
 ret:
 	RET
 bigloop_sse:
diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go
index a57771a1ed3a5c302b44375a3f0da889977b8ce1..d6f683ba3f788f3b1fcb07f79f1162be843142a8 100644
--- a/vendor/golang.org/x/crypto/ed25519/ed25519.go
+++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go
@@ -6,7 +6,10 @@
 // https://ed25519.cr.yp.to/.
 //
 // These functions are also compatible with the “Ed25519” function defined in
-// RFC 8032.
+// RFC 8032. However, unlike RFC 8032's formulation, this package's private key
+// representation includes a public key suffix to make multiple signing
+// operations with the same key more efficient. This package refers to the RFC
+// 8032 private key as the “seed”.
 package ed25519
 
 // This code is a port of the public domain, “ref10” implementation of ed25519
@@ -31,6 +34,8 @@ const (
 	PrivateKeySize = 64
 	// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
 	SignatureSize = 64
+	// SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032.
+	SeedSize = 32
 )
 
 // PublicKey is the type of Ed25519 public keys.
@@ -46,6 +51,15 @@ func (priv PrivateKey) Public() crypto.PublicKey {
 	return PublicKey(publicKey)
 }
 
+// Seed returns the private key seed corresponding to priv. It is provided for
+// interoperability with RFC 8032. RFC 8032's private keys correspond to seeds
+// in this package.
+func (priv PrivateKey) Seed() []byte {
+	seed := make([]byte, SeedSize)
+	copy(seed, priv[:32])
+	return seed
+}
+
 // Sign signs the given message with priv.
 // Ed25519 performs two passes over messages to be signed and therefore cannot
 // handle pre-hashed messages. Thus opts.HashFunc() must return zero to
@@ -61,19 +75,33 @@ func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOp
 
 // GenerateKey generates a public/private key pair using entropy from rand.
 // If rand is nil, crypto/rand.Reader will be used.
-func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, err error) {
+func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) {
 	if rand == nil {
 		rand = cryptorand.Reader
 	}
 
-	privateKey = make([]byte, PrivateKeySize)
-	publicKey = make([]byte, PublicKeySize)
-	_, err = io.ReadFull(rand, privateKey[:32])
-	if err != nil {
+	seed := make([]byte, SeedSize)
+	if _, err := io.ReadFull(rand, seed); err != nil {
 		return nil, nil, err
 	}
 
-	digest := sha512.Sum512(privateKey[:32])
+	privateKey := NewKeyFromSeed(seed)
+	publicKey := make([]byte, PublicKeySize)
+	copy(publicKey, privateKey[32:])
+
+	return publicKey, privateKey, nil
+}
+
+// NewKeyFromSeed calculates a private key from a seed. It will panic if
+// len(seed) is not SeedSize. This function is provided for interoperability
+// with RFC 8032. RFC 8032's private keys correspond to seeds in this
+// package.
+func NewKeyFromSeed(seed []byte) PrivateKey {
+	if l := len(seed); l != SeedSize {
+		panic("ed25519: bad seed length: " + strconv.Itoa(l))
+	}
+
+	digest := sha512.Sum512(seed)
 	digest[0] &= 248
 	digest[31] &= 127
 	digest[31] |= 64
@@ -85,10 +113,11 @@ func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, er
 	var publicKeyBytes [32]byte
 	A.ToBytes(&publicKeyBytes)
 
+	privateKey := make([]byte, PrivateKeySize)
+	copy(privateKey, seed)
 	copy(privateKey[32:], publicKeyBytes[:])
-	copy(publicKey, publicKeyBytes[:])
 
-	return publicKey, privateKey, nil
+	return privateKey
 }
 
 // Sign signs the message with privateKey and returns a signature. It will
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go
new file mode 100644
index 0000000000000000000000000000000000000000..751eec52743ce32579f4716559abf942d1e6c050
--- /dev/null
+++ b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go
@@ -0,0 +1,14 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl
+
+package poly1305
+
+// Sum generates an authenticator for msg using a one-time key and puts the
+// 16-byte result into out. Authenticating two different messages with the same
+// key allows an attacker to forge messages at will.
+func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) {
+	sumGeneric(out, msg, key)
+}
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ref.go b/vendor/golang.org/x/crypto/poly1305/sum_ref.go
index b2805a5ca173b29dabaa49aade4ea82322779551..c4d59bd09874cf24ade413e0da715c0eacaef5cd 100644
--- a/vendor/golang.org/x/crypto/poly1305/sum_ref.go
+++ b/vendor/golang.org/x/crypto/poly1305/sum_ref.go
@@ -2,16 +2,14 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// +build !amd64,!arm gccgo appengine nacl
-
 package poly1305
 
 import "encoding/binary"
 
-// Sum generates an authenticator for msg using a one-time key and puts the
-// 16-byte result into out. Authenticating two different messages with the same
-// key allows an attacker to forge messages at will.
-func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) {
+// sumGeneric generates an authenticator for msg using a one-time key and
+// puts the 16-byte result into out. This is the generic implementation of
+// Sum and should be called if no assembly implementation is available.
+func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) {
 	var (
 		h0, h1, h2, h3, h4 uint32 // the hash accumulators
 		r0, r1, r2, r3, r4 uint64 // the r part of the key
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go
new file mode 100644
index 0000000000000000000000000000000000000000..7a266cece46adad6e09165b48e7afa83e90c9fca
--- /dev/null
+++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go
@@ -0,0 +1,49 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,go1.11,!gccgo,!appengine
+
+package poly1305
+
+// hasVectorFacility reports whether the machine supports
+// the vector facility (vx).
+func hasVectorFacility() bool
+
+// hasVMSLFacility reports whether the machine supports
+// Vector Multiply Sum Logical (VMSL).
+func hasVMSLFacility() bool
+
+var hasVX = hasVectorFacility()
+var hasVMSL = hasVMSLFacility()
+
+// poly1305vx is an assembly implementation of Poly1305 that uses vector
+// instructions. It must only be called if the vector facility (vx) is
+// available.
+//go:noescape
+func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
+
+// poly1305vmsl is an assembly implementation of Poly1305 that uses vector
+// instructions, including VMSL. It must only be called if the vector facility (vx) is
+// available and if VMSL is supported.
+//go:noescape
+func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte)
+
+// Sum generates an authenticator for m using a one-time key and puts the
+// 16-byte result into out. Authenticating two different messages with the same
+// key allows an attacker to forge messages at will.
+func Sum(out *[16]byte, m []byte, key *[32]byte) {
+	if hasVX {
+		var mPtr *byte
+		if len(m) > 0 {
+			mPtr = &m[0]
+		}
+		if hasVMSL && len(m) > 256 {
+			poly1305vmsl(out, mPtr, uint64(len(m)), key)
+		} else {
+			poly1305vx(out, mPtr, uint64(len(m)), key)
+		}
+	} else {
+		sumGeneric(out, m, key)
+	}
+}
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s
new file mode 100644
index 0000000000000000000000000000000000000000..356c07a6c2b122ec9c205dca9c8d6a35229756b9
--- /dev/null
+++ b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s
@@ -0,0 +1,400 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,go1.11,!gccgo,!appengine
+
+#include "textflag.h"
+
+// Implementation of Poly1305 using the vector facility (vx).
+
+// constants
+#define MOD26 V0
+#define EX0   V1
+#define EX1   V2
+#define EX2   V3
+
+// temporaries
+#define T_0 V4
+#define T_1 V5
+#define T_2 V6
+#define T_3 V7
+#define T_4 V8
+
+// key (r)
+#define R_0  V9
+#define R_1  V10
+#define R_2  V11
+#define R_3  V12
+#define R_4  V13
+#define R5_1 V14
+#define R5_2 V15
+#define R5_3 V16
+#define R5_4 V17
+#define RSAVE_0 R5
+#define RSAVE_1 R6
+#define RSAVE_2 R7
+#define RSAVE_3 R8
+#define RSAVE_4 R9
+#define R5SAVE_1 V28
+#define R5SAVE_2 V29
+#define R5SAVE_3 V30
+#define R5SAVE_4 V31
+
+// message block
+#define F_0 V18
+#define F_1 V19
+#define F_2 V20
+#define F_3 V21
+#define F_4 V22
+
+// accumulator
+#define H_0 V23
+#define H_1 V24
+#define H_2 V25
+#define H_3 V26
+#define H_4 V27
+
+GLOBL ·keyMask<>(SB), RODATA, $16
+DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f
+DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f
+
+GLOBL ·bswapMask<>(SB), RODATA, $16
+DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908
+DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100
+
+GLOBL ·constants<>(SB), RODATA, $64
+// MOD26
+DATA ·constants<>+0(SB)/8, $0x3ffffff
+DATA ·constants<>+8(SB)/8, $0x3ffffff
+// EX0
+DATA ·constants<>+16(SB)/8, $0x0006050403020100
+DATA ·constants<>+24(SB)/8, $0x1016151413121110
+// EX1
+DATA ·constants<>+32(SB)/8, $0x060c0b0a09080706
+DATA ·constants<>+40(SB)/8, $0x161c1b1a19181716
+// EX2
+DATA ·constants<>+48(SB)/8, $0x0d0d0d0d0d0f0e0d
+DATA ·constants<>+56(SB)/8, $0x1d1d1d1d1d1f1e1d
+
+// h = (f*g) % (2**130-5) [partial reduction]
+#define MULTIPLY(f0, f1, f2, f3, f4, g0, g1, g2, g3, g4, g51, g52, g53, g54, h0, h1, h2, h3, h4) \
+	VMLOF  f0, g0, h0        \
+	VMLOF  f0, g1, h1        \
+	VMLOF  f0, g2, h2        \
+	VMLOF  f0, g3, h3        \
+	VMLOF  f0, g4, h4        \
+	VMLOF  f1, g54, T_0      \
+	VMLOF  f1, g0, T_1       \
+	VMLOF  f1, g1, T_2       \
+	VMLOF  f1, g2, T_3       \
+	VMLOF  f1, g3, T_4       \
+	VMALOF f2, g53, h0, h0   \
+	VMALOF f2, g54, h1, h1   \
+	VMALOF f2, g0, h2, h2    \
+	VMALOF f2, g1, h3, h3    \
+	VMALOF f2, g2, h4, h4    \
+	VMALOF f3, g52, T_0, T_0 \
+	VMALOF f3, g53, T_1, T_1 \
+	VMALOF f3, g54, T_2, T_2 \
+	VMALOF f3, g0, T_3, T_3  \
+	VMALOF f3, g1, T_4, T_4  \
+	VMALOF f4, g51, h0, h0   \
+	VMALOF f4, g52, h1, h1   \
+	VMALOF f4, g53, h2, h2   \
+	VMALOF f4, g54, h3, h3   \
+	VMALOF f4, g0, h4, h4    \
+	VAG    T_0, h0, h0       \
+	VAG    T_1, h1, h1       \
+	VAG    T_2, h2, h2       \
+	VAG    T_3, h3, h3       \
+	VAG    T_4, h4, h4
+
+// carry h0->h1 h3->h4, h1->h2 h4->h0, h0->h1 h2->h3, h3->h4
+#define REDUCE(h0, h1, h2, h3, h4) \
+	VESRLG $26, h0, T_0  \
+	VESRLG $26, h3, T_1  \
+	VN     MOD26, h0, h0 \
+	VN     MOD26, h3, h3 \
+	VAG    T_0, h1, h1   \
+	VAG    T_1, h4, h4   \
+	VESRLG $26, h1, T_2  \
+	VESRLG $26, h4, T_3  \
+	VN     MOD26, h1, h1 \
+	VN     MOD26, h4, h4 \
+	VESLG  $2, T_3, T_4  \
+	VAG    T_3, T_4, T_4 \
+	VAG    T_2, h2, h2   \
+	VAG    T_4, h0, h0   \
+	VESRLG $26, h2, T_0  \
+	VESRLG $26, h0, T_1  \
+	VN     MOD26, h2, h2 \
+	VN     MOD26, h0, h0 \
+	VAG    T_0, h3, h3   \
+	VAG    T_1, h1, h1   \
+	VESRLG $26, h3, T_2  \
+	VN     MOD26, h3, h3 \
+	VAG    T_2, h4, h4
+
+// expand in0 into d[0] and in1 into d[1]
+#define EXPAND(in0, in1, d0, d1, d2, d3, d4) \
+	VGBM   $0x0707, d1       \ // d1=tmp
+	VPERM  in0, in1, EX2, d4 \
+	VPERM  in0, in1, EX0, d0 \
+	VPERM  in0, in1, EX1, d2 \
+	VN     d1, d4, d4        \
+	VESRLG $26, d0, d1       \
+	VESRLG $30, d2, d3       \
+	VESRLG $4, d2, d2        \
+	VN     MOD26, d0, d0     \
+	VN     MOD26, d1, d1     \
+	VN     MOD26, d2, d2     \
+	VN     MOD26, d3, d3
+
+// pack h4:h0 into h1:h0 (no carry)
+#define PACK(h0, h1, h2, h3, h4) \
+	VESLG $26, h1, h1  \
+	VESLG $26, h3, h3  \
+	VO    h0, h1, h0   \
+	VO    h2, h3, h2   \
+	VESLG $4, h2, h2   \
+	VLEIB $7, $48, h1  \
+	VSLB  h1, h2, h2   \
+	VO    h0, h2, h0   \
+	VLEIB $7, $104, h1 \
+	VSLB  h1, h4, h3   \
+	VO    h3, h0, h0   \
+	VLEIB $7, $24, h1  \
+	VSRLB h1, h4, h1
+
+// if h > 2**130-5 then h -= 2**130-5
+#define MOD(h0, h1, t0, t1, t2) \
+	VZERO t0          \
+	VLEIG $1, $5, t0  \
+	VACCQ h0, t0, t1  \
+	VAQ   h0, t0, t0  \
+	VONE  t2          \
+	VLEIG $1, $-4, t2 \
+	VAQ   t2, t1, t1  \
+	VACCQ h1, t1, t1  \
+	VONE  t2          \
+	VAQ   t2, t1, t1  \
+	VN    h0, t1, t2  \
+	VNC   t0, t1, t1  \
+	VO    t1, t2, h0
+
+// func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]key)
+TEXT ·poly1305vx(SB), $0-32
+	// This code processes up to 2 blocks (32 bytes) per iteration
+	// using the algorithm described in:
+	// NEON crypto, Daniel J. Bernstein & Peter Schwabe
+	// https://cryptojedi.org/papers/neoncrypto-20120320.pdf
+	LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key
+
+	// load MOD26, EX0, EX1 and EX2
+	MOVD $·constants<>(SB), R5
+	VLM  (R5), MOD26, EX2
+
+	// setup r
+	VL   (R4), T_0
+	MOVD $·keyMask<>(SB), R6
+	VL   (R6), T_1
+	VN   T_0, T_1, T_0
+	EXPAND(T_0, T_0, R_0, R_1, R_2, R_3, R_4)
+
+	// setup r*5
+	VLEIG $0, $5, T_0
+	VLEIG $1, $5, T_0
+
+	// store r (for final block)
+	VMLOF T_0, R_1, R5SAVE_1
+	VMLOF T_0, R_2, R5SAVE_2
+	VMLOF T_0, R_3, R5SAVE_3
+	VMLOF T_0, R_4, R5SAVE_4
+	VLGVG $0, R_0, RSAVE_0
+	VLGVG $0, R_1, RSAVE_1
+	VLGVG $0, R_2, RSAVE_2
+	VLGVG $0, R_3, RSAVE_3
+	VLGVG $0, R_4, RSAVE_4
+
+	// skip r**2 calculation
+	CMPBLE R3, $16, skip
+
+	// calculate r**2
+	MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5SAVE_1, R5SAVE_2, R5SAVE_3, R5SAVE_4, H_0, H_1, H_2, H_3, H_4)
+	REDUCE(H_0, H_1, H_2, H_3, H_4)
+	VLEIG $0, $5, T_0
+	VLEIG $1, $5, T_0
+	VMLOF T_0, H_1, R5_1
+	VMLOF T_0, H_2, R5_2
+	VMLOF T_0, H_3, R5_3
+	VMLOF T_0, H_4, R5_4
+	VLR   H_0, R_0
+	VLR   H_1, R_1
+	VLR   H_2, R_2
+	VLR   H_3, R_3
+	VLR   H_4, R_4
+
+	// initialize h
+	VZERO H_0
+	VZERO H_1
+	VZERO H_2
+	VZERO H_3
+	VZERO H_4
+
+loop:
+	CMPBLE R3, $32, b2
+	VLM    (R2), T_0, T_1
+	SUB    $32, R3
+	MOVD   $32(R2), R2
+	EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4)
+	VLEIB  $4, $1, F_4
+	VLEIB  $12, $1, F_4
+
+multiply:
+	VAG    H_0, F_0, F_0
+	VAG    H_1, F_1, F_1
+	VAG    H_2, F_2, F_2
+	VAG    H_3, F_3, F_3
+	VAG    H_4, F_4, F_4
+	MULTIPLY(F_0, F_1, F_2, F_3, F_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4)
+	REDUCE(H_0, H_1, H_2, H_3, H_4)
+	CMPBNE R3, $0, loop
+
+finish:
+	// sum vectors
+	VZERO  T_0
+	VSUMQG H_0, T_0, H_0
+	VSUMQG H_1, T_0, H_1
+	VSUMQG H_2, T_0, H_2
+	VSUMQG H_3, T_0, H_3
+	VSUMQG H_4, T_0, H_4
+
+	// h may be >= 2*(2**130-5) so we need to reduce it again
+	REDUCE(H_0, H_1, H_2, H_3, H_4)
+
+	// carry h1->h4
+	VESRLG $26, H_1, T_1
+	VN     MOD26, H_1, H_1
+	VAQ    T_1, H_2, H_2
+	VESRLG $26, H_2, T_2
+	VN     MOD26, H_2, H_2
+	VAQ    T_2, H_3, H_3
+	VESRLG $26, H_3, T_3
+	VN     MOD26, H_3, H_3
+	VAQ    T_3, H_4, H_4
+
+	// h is now < 2*(2**130-5)
+	// pack h into h1 (hi) and h0 (lo)
+	PACK(H_0, H_1, H_2, H_3, H_4)
+
+	// if h > 2**130-5 then h -= 2**130-5
+	MOD(H_0, H_1, T_0, T_1, T_2)
+
+	// h += s
+	MOVD  $·bswapMask<>(SB), R5
+	VL    (R5), T_1
+	VL    16(R4), T_0
+	VPERM T_0, T_0, T_1, T_0    // reverse bytes (to big)
+	VAQ   T_0, H_0, H_0
+	VPERM H_0, H_0, T_1, H_0    // reverse bytes (to little)
+	VST   H_0, (R1)
+
+	RET
+
+b2:
+	CMPBLE R3, $16, b1
+
+	// 2 blocks remaining
+	SUB    $17, R3
+	VL     (R2), T_0
+	VLL    R3, 16(R2), T_1
+	ADD    $1, R3
+	MOVBZ  $1, R0
+	CMPBEQ R3, $16, 2(PC)
+	VLVGB  R3, R0, T_1
+	EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4)
+	CMPBNE R3, $16, 2(PC)
+	VLEIB  $12, $1, F_4
+	VLEIB  $4, $1, F_4
+
+	// setup [r²,r]
+	VLVGG $1, RSAVE_0, R_0
+	VLVGG $1, RSAVE_1, R_1
+	VLVGG $1, RSAVE_2, R_2
+	VLVGG $1, RSAVE_3, R_3
+	VLVGG $1, RSAVE_4, R_4
+	VPDI  $0, R5_1, R5SAVE_1, R5_1
+	VPDI  $0, R5_2, R5SAVE_2, R5_2
+	VPDI  $0, R5_3, R5SAVE_3, R5_3
+	VPDI  $0, R5_4, R5SAVE_4, R5_4
+
+	MOVD $0, R3
+	BR   multiply
+
+skip:
+	VZERO H_0
+	VZERO H_1
+	VZERO H_2
+	VZERO H_3
+	VZERO H_4
+
+	CMPBEQ R3, $0, finish
+
+b1:
+	// 1 block remaining
+	SUB    $1, R3
+	VLL    R3, (R2), T_0
+	ADD    $1, R3
+	MOVBZ  $1, R0
+	CMPBEQ R3, $16, 2(PC)
+	VLVGB  R3, R0, T_0
+	VZERO  T_1
+	EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4)
+	CMPBNE R3, $16, 2(PC)
+	VLEIB  $4, $1, F_4
+	VLEIG  $1, $1, R_0
+	VZERO  R_1
+	VZERO  R_2
+	VZERO  R_3
+	VZERO  R_4
+	VZERO  R5_1
+	VZERO  R5_2
+	VZERO  R5_3
+	VZERO  R5_4
+
+	// setup [r, 1]
+	VLVGG $0, RSAVE_0, R_0
+	VLVGG $0, RSAVE_1, R_1
+	VLVGG $0, RSAVE_2, R_2
+	VLVGG $0, RSAVE_3, R_3
+	VLVGG $0, RSAVE_4, R_4
+	VPDI  $0, R5SAVE_1, R5_1, R5_1
+	VPDI  $0, R5SAVE_2, R5_2, R5_2
+	VPDI  $0, R5SAVE_3, R5_3, R5_3
+	VPDI  $0, R5SAVE_4, R5_4, R5_4
+
+	MOVD $0, R3
+	BR   multiply
+
+TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1
+	MOVD  $x-24(SP), R1
+	XC    $24, 0(R1), 0(R1) // clear the storage
+	MOVD  $2, R0            // R0 is the number of double words stored -1
+	WORD  $0xB2B01000       // STFLE 0(R1)
+	XOR   R0, R0            // reset the value of R0
+	MOVBZ z-8(SP), R1
+	AND   $0x40, R1
+	BEQ   novector
+
+vectorinstalled:
+	// check if the vector instruction has been enabled
+	VLEIB  $0, $0xF, V16
+	VLGVB  $0, V16, R1
+	CMPBNE R1, $0xF, novector
+	MOVB   $1, ret+0(FP)      // have vx
+	RET
+
+novector:
+	MOVB $0, ret+0(FP) // no vx
+	RET
diff --git a/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s
new file mode 100644
index 0000000000000000000000000000000000000000..e548020b14e198b9824ab47927365bc86f68a91a
--- /dev/null
+++ b/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s
@@ -0,0 +1,931 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build s390x,go1.11,!gccgo,!appengine
+
+#include "textflag.h"
+
+// Implementation of Poly1305 using the vector facility (vx) and the VMSL instruction.
+
+// constants
+#define EX0   V1
+#define EX1   V2
+#define EX2   V3
+
+// temporaries
+#define T_0 V4
+#define T_1 V5
+#define T_2 V6
+#define T_3 V7
+#define T_4 V8
+#define T_5 V9
+#define T_6 V10
+#define T_7 V11
+#define T_8 V12
+#define T_9 V13
+#define T_10 V14
+
+// r**2 & r**4
+#define R_0  V15
+#define R_1  V16
+#define R_2  V17
+#define R5_1 V18
+#define R5_2 V19
+// key (r)
+#define RSAVE_0 R7
+#define RSAVE_1 R8
+#define RSAVE_2 R9
+#define R5SAVE_1 R10
+#define R5SAVE_2 R11
+
+// message block
+#define M0 V20
+#define M1 V21
+#define M2 V22
+#define M3 V23
+#define M4 V24
+#define M5 V25
+
+// accumulator
+#define H0_0 V26
+#define H1_0 V27
+#define H2_0 V28
+#define H0_1 V29
+#define H1_1 V30
+#define H2_1 V31
+
+GLOBL ·keyMask<>(SB), RODATA, $16
+DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f
+DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f
+
+GLOBL ·bswapMask<>(SB), RODATA, $16
+DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908
+DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100
+
+GLOBL ·constants<>(SB), RODATA, $48
+// EX0
+DATA ·constants<>+0(SB)/8, $0x18191a1b1c1d1e1f
+DATA ·constants<>+8(SB)/8, $0x0000050403020100
+// EX1
+DATA ·constants<>+16(SB)/8, $0x18191a1b1c1d1e1f
+DATA ·constants<>+24(SB)/8, $0x00000a0908070605
+// EX2
+DATA ·constants<>+32(SB)/8, $0x18191a1b1c1d1e1f
+DATA ·constants<>+40(SB)/8, $0x0000000f0e0d0c0b
+
+GLOBL ·c<>(SB), RODATA, $48
+// EX0
+DATA ·c<>+0(SB)/8, $0x0000050403020100
+DATA ·c<>+8(SB)/8, $0x0000151413121110
+// EX1
+DATA ·c<>+16(SB)/8, $0x00000a0908070605
+DATA ·c<>+24(SB)/8, $0x00001a1918171615
+// EX2
+DATA ·c<>+32(SB)/8, $0x0000000f0e0d0c0b
+DATA ·c<>+40(SB)/8, $0x0000001f1e1d1c1b
+
+GLOBL ·reduce<>(SB), RODATA, $32
+// 44 bit
+DATA ·reduce<>+0(SB)/8, $0x0
+DATA ·reduce<>+8(SB)/8, $0xfffffffffff
+// 42 bit
+DATA ·reduce<>+16(SB)/8, $0x0
+DATA ·reduce<>+24(SB)/8, $0x3ffffffffff
+
+// h = (f*g) % (2**130-5) [partial reduction]
+// uses T_0...T_9 temporary registers
+// input: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2
+// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9
+// output: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2
+#define MULTIPLY(m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) \
+	\ // Eliminate the dependency for the last 2 VMSLs
+	VMSLG m02_0, r_2, m4_2, m4_2                       \
+	VMSLG m13_0, r_2, m5_2, m5_2                       \ // 8 VMSLs pipelined
+	VMSLG m02_0, r_0, m4_0, m4_0                       \
+	VMSLG m02_1, r5_2, V0, T_0                         \
+	VMSLG m02_0, r_1, m4_1, m4_1                       \
+	VMSLG m02_1, r_0, V0, T_1                          \
+	VMSLG m02_1, r_1, V0, T_2                          \
+	VMSLG m02_2, r5_1, V0, T_3                         \
+	VMSLG m02_2, r5_2, V0, T_4                         \
+	VMSLG m13_0, r_0, m5_0, m5_0                       \
+	VMSLG m13_1, r5_2, V0, T_5                         \
+	VMSLG m13_0, r_1, m5_1, m5_1                       \
+	VMSLG m13_1, r_0, V0, T_6                          \
+	VMSLG m13_1, r_1, V0, T_7                          \
+	VMSLG m13_2, r5_1, V0, T_8                         \
+	VMSLG m13_2, r5_2, V0, T_9                         \
+	VMSLG m02_2, r_0, m4_2, m4_2                       \
+	VMSLG m13_2, r_0, m5_2, m5_2                       \
+	VAQ   m4_0, T_0, m02_0                             \
+	VAQ   m4_1, T_1, m02_1                             \
+	VAQ   m5_0, T_5, m13_0                             \
+	VAQ   m5_1, T_6, m13_1                             \
+	VAQ   m02_0, T_3, m02_0                            \
+	VAQ   m02_1, T_4, m02_1                            \
+	VAQ   m13_0, T_8, m13_0                            \
+	VAQ   m13_1, T_9, m13_1                            \
+	VAQ   m4_2, T_2, m02_2                             \
+	VAQ   m5_2, T_7, m13_2                             \
+
+// SQUARE uses three limbs of r and r_2*5 to output square of r
+// uses T_1, T_5 and T_7 temporary registers
+// input: r_0, r_1, r_2, r5_2
+// temp: TEMP0, TEMP1, TEMP2
+// output: p0, p1, p2
+#define SQUARE(r_0, r_1, r_2, r5_2, p0, p1, p2, TEMP0, TEMP1, TEMP2) \
+	VMSLG r_0, r_0, p0, p0     \
+	VMSLG r_1, r5_2, V0, TEMP0 \
+	VMSLG r_2, r5_2, p1, p1    \
+	VMSLG r_0, r_1, V0, TEMP1  \
+	VMSLG r_1, r_1, p2, p2     \
+	VMSLG r_0, r_2, V0, TEMP2  \
+	VAQ   TEMP0, p0, p0        \
+	VAQ   TEMP1, p1, p1        \
+	VAQ   TEMP2, p2, p2        \
+	VAQ   TEMP0, p0, p0        \
+	VAQ   TEMP1, p1, p1        \
+	VAQ   TEMP2, p2, p2        \
+
+// carry h0->h1->h2->h0 || h3->h4->h5->h3
+// uses T_2, T_4, T_5, T_7, T_8, T_9
+//       t6,  t7,  t8,  t9, t10, t11
+// input: h0, h1, h2, h3, h4, h5
+// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11
+// output: h0, h1, h2, h3, h4, h5
+#define REDUCE(h0, h1, h2, h3, h4, h5, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \
+	VLM    (R12), t6, t7  \ // 44 and 42 bit clear mask
+	VLEIB  $7, $0x28, t10 \ // 5 byte shift mask
+	VREPIB $4, t8         \ // 4 bit shift mask
+	VREPIB $2, t11        \ // 2 bit shift mask
+	VSRLB  t10, h0, t0    \ // h0 byte shift
+	VSRLB  t10, h1, t1    \ // h1 byte shift
+	VSRLB  t10, h2, t2    \ // h2 byte shift
+	VSRLB  t10, h3, t3    \ // h3 byte shift
+	VSRLB  t10, h4, t4    \ // h4 byte shift
+	VSRLB  t10, h5, t5    \ // h5 byte shift
+	VSRL   t8, t0, t0     \ // h0 bit shift
+	VSRL   t8, t1, t1     \ // h2 bit shift
+	VSRL   t11, t2, t2    \ // h2 bit shift
+	VSRL   t8, t3, t3     \ // h3 bit shift
+	VSRL   t8, t4, t4     \ // h4 bit shift
+	VESLG  $2, t2, t9     \ // h2 carry x5
+	VSRL   t11, t5, t5    \ // h5 bit shift
+	VN     t6, h0, h0     \ // h0 clear carry
+	VAQ    t2, t9, t2     \ // h2 carry x5
+	VESLG  $2, t5, t9     \ // h5 carry x5
+	VN     t6, h1, h1     \ // h1 clear carry
+	VN     t7, h2, h2     \ // h2 clear carry
+	VAQ    t5, t9, t5     \ // h5 carry x5
+	VN     t6, h3, h3     \ // h3 clear carry
+	VN     t6, h4, h4     \ // h4 clear carry
+	VN     t7, h5, h5     \ // h5 clear carry
+	VAQ    t0, h1, h1     \ // h0->h1
+	VAQ    t3, h4, h4     \ // h3->h4
+	VAQ    t1, h2, h2     \ // h1->h2
+	VAQ    t4, h5, h5     \ // h4->h5
+	VAQ    t2, h0, h0     \ // h2->h0
+	VAQ    t5, h3, h3     \ // h5->h3
+	VREPG  $1, t6, t6     \ // 44 and 42 bit masks across both halves
+	VREPG  $1, t7, t7     \
+	VSLDB  $8, h0, h0, h0 \ // set up [h0/1/2, h3/4/5]
+	VSLDB  $8, h1, h1, h1 \
+	VSLDB  $8, h2, h2, h2 \
+	VO     h0, h3, h3     \
+	VO     h1, h4, h4     \
+	VO     h2, h5, h5     \
+	VESRLG $44, h3, t0    \ // 44 bit shift right
+	VESRLG $44, h4, t1    \
+	VESRLG $42, h5, t2    \
+	VN     t6, h3, h3     \ // clear carry bits
+	VN     t6, h4, h4     \
+	VN     t7, h5, h5     \
+	VESLG  $2, t2, t9     \ // multiply carry by 5
+	VAQ    t9, t2, t2     \
+	VAQ    t0, h4, h4     \
+	VAQ    t1, h5, h5     \
+	VAQ    t2, h3, h3     \
+
+// carry h0->h1->h2->h0
+// input: h0, h1, h2
+// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8
+// output: h0, h1, h2
+#define REDUCE2(h0, h1, h2, t0, t1, t2, t3, t4, t5, t6, t7, t8) \
+	VLEIB  $7, $0x28, t3 \ // 5 byte shift mask
+	VREPIB $4, t4        \ // 4 bit shift mask
+	VREPIB $2, t7        \ // 2 bit shift mask
+	VGBM   $0x003F, t5   \ // mask to clear carry bits
+	VSRLB  t3, h0, t0    \
+	VSRLB  t3, h1, t1    \
+	VSRLB  t3, h2, t2    \
+	VESRLG $4, t5, t5    \ // 44 bit clear mask
+	VSRL   t4, t0, t0    \
+	VSRL   t4, t1, t1    \
+	VSRL   t7, t2, t2    \
+	VESRLG $2, t5, t6    \ // 42 bit clear mask
+	VESLG  $2, t2, t8    \
+	VAQ    t8, t2, t2    \
+	VN     t5, h0, h0    \
+	VN     t5, h1, h1    \
+	VN     t6, h2, h2    \
+	VAQ    t0, h1, h1    \
+	VAQ    t1, h2, h2    \
+	VAQ    t2, h0, h0    \
+	VSRLB  t3, h0, t0    \
+	VSRLB  t3, h1, t1    \
+	VSRLB  t3, h2, t2    \
+	VSRL   t4, t0, t0    \
+	VSRL   t4, t1, t1    \
+	VSRL   t7, t2, t2    \
+	VN     t5, h0, h0    \
+	VN     t5, h1, h1    \
+	VESLG  $2, t2, t8    \
+	VN     t6, h2, h2    \
+	VAQ    t0, h1, h1    \
+	VAQ    t8, t2, t2    \
+	VAQ    t1, h2, h2    \
+	VAQ    t2, h0, h0    \
+
+// expands two message blocks into the lower halfs of the d registers
+// moves the contents of the d registers into upper halfs
+// input: in1, in2, d0, d1, d2, d3, d4, d5
+// temp: TEMP0, TEMP1, TEMP2, TEMP3
+// output: d0, d1, d2, d3, d4, d5
+#define EXPACC(in1, in2, d0, d1, d2, d3, d4, d5, TEMP0, TEMP1, TEMP2, TEMP3) \
+	VGBM   $0xff3f, TEMP0      \
+	VGBM   $0xff1f, TEMP1      \
+	VESLG  $4, d1, TEMP2       \
+	VESLG  $4, d4, TEMP3       \
+	VESRLG $4, TEMP0, TEMP0    \
+	VPERM  in1, d0, EX0, d0    \
+	VPERM  in2, d3, EX0, d3    \
+	VPERM  in1, d2, EX2, d2    \
+	VPERM  in2, d5, EX2, d5    \
+	VPERM  in1, TEMP2, EX1, d1 \
+	VPERM  in2, TEMP3, EX1, d4 \
+	VN     TEMP0, d0, d0       \
+	VN     TEMP0, d3, d3       \
+	VESRLG $4, d1, d1          \
+	VESRLG $4, d4, d4          \
+	VN     TEMP1, d2, d2       \
+	VN     TEMP1, d5, d5       \
+	VN     TEMP0, d1, d1       \
+	VN     TEMP0, d4, d4       \
+
+// expands one message block into the lower halfs of the d registers
+// moves the contents of the d registers into upper halfs
+// input: in, d0, d1, d2
+// temp: TEMP0, TEMP1, TEMP2
+// output: d0, d1, d2
+#define EXPACC2(in, d0, d1, d2, TEMP0, TEMP1, TEMP2) \
+	VGBM   $0xff3f, TEMP0     \
+	VESLG  $4, d1, TEMP2      \
+	VGBM   $0xff1f, TEMP1     \
+	VPERM  in, d0, EX0, d0    \
+	VESRLG $4, TEMP0, TEMP0   \
+	VPERM  in, d2, EX2, d2    \
+	VPERM  in, TEMP2, EX1, d1 \
+	VN     TEMP0, d0, d0      \
+	VN     TEMP1, d2, d2      \
+	VESRLG $4, d1, d1         \
+	VN     TEMP0, d1, d1      \
+
+// pack h2:h0 into h1:h0 (no carry)
+// input: h0, h1, h2
+// output: h0, h1, h2
+#define PACK(h0, h1, h2) \
+	VMRLG  h1, h2, h2  \ // copy h1 to upper half h2
+	VESLG  $44, h1, h1 \ // shift limb 1 44 bits, leaving 20
+	VO     h0, h1, h0  \ // combine h0 with 20 bits from limb 1
+	VESRLG $20, h2, h1 \ // put top 24 bits of limb 1 into h1
+	VLEIG  $1, $0, h1  \ // clear h2 stuff from lower half of h1
+	VO     h0, h1, h0  \ // h0 now has 88 bits (limb 0 and 1)
+	VLEIG  $0, $0, h2  \ // clear upper half of h2
+	VESRLG $40, h2, h1 \ // h1 now has upper two bits of result
+	VLEIB  $7, $88, h1 \ // for byte shift (11 bytes)
+	VSLB   h1, h2, h2  \ // shift h2 11 bytes to the left
+	VO     h0, h2, h0  \ // combine h0 with 20 bits from limb 1
+	VLEIG  $0, $0, h1  \ // clear upper half of h1
+
+// if h > 2**130-5 then h -= 2**130-5
+// input: h0, h1
+// temp: t0, t1, t2
+// output: h0
+#define MOD(h0, h1, t0, t1, t2) \
+	VZERO t0          \
+	VLEIG $1, $5, t0  \
+	VACCQ h0, t0, t1  \
+	VAQ   h0, t0, t0  \
+	VONE  t2          \
+	VLEIG $1, $-4, t2 \
+	VAQ   t2, t1, t1  \
+	VACCQ h1, t1, t1  \
+	VONE  t2          \
+	VAQ   t2, t1, t1  \
+	VN    h0, t1, t2  \
+	VNC   t0, t1, t1  \
+	VO    t1, t2, h0  \
+
+// func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]key)
+TEXT ·poly1305vmsl(SB), $0-32
+	// This code processes 6 + up to 4 blocks (32 bytes) per iteration
+	// using the algorithm described in:
+	// NEON crypto, Daniel J. Bernstein & Peter Schwabe
+	// https://cryptojedi.org/papers/neoncrypto-20120320.pdf
+	// And as moddified for VMSL as described in
+	// Accelerating Poly1305 Cryptographic Message Authentication on the z14
+	// O'Farrell et al, CASCON 2017, p48-55
+	// https://ibm.ent.box.com/s/jf9gedj0e9d2vjctfyh186shaztavnht
+
+	LMG   out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key
+	VZERO V0                // c
+
+	// load EX0, EX1 and EX2
+	MOVD $·constants<>(SB), R5
+	VLM  (R5), EX0, EX2        // c
+
+	// setup r
+	VL    (R4), T_0
+	MOVD  $·keyMask<>(SB), R6
+	VL    (R6), T_1
+	VN    T_0, T_1, T_0
+	VZERO T_2                 // limbs for r
+	VZERO T_3
+	VZERO T_4
+	EXPACC2(T_0, T_2, T_3, T_4, T_1, T_5, T_7)
+
+	// T_2, T_3, T_4: [0, r]
+
+	// setup r*20
+	VLEIG $0, $0, T_0
+	VLEIG $1, $20, T_0       // T_0: [0, 20]
+	VZERO T_5
+	VZERO T_6
+	VMSLG T_0, T_3, T_5, T_5
+	VMSLG T_0, T_4, T_6, T_6
+
+	// store r for final block in GR
+	VLGVG $1, T_2, RSAVE_0  // c
+	VLGVG $1, T_3, RSAVE_1  // c
+	VLGVG $1, T_4, RSAVE_2  // c
+	VLGVG $1, T_5, R5SAVE_1 // c
+	VLGVG $1, T_6, R5SAVE_2 // c
+
+	// initialize h
+	VZERO H0_0
+	VZERO H1_0
+	VZERO H2_0
+	VZERO H0_1
+	VZERO H1_1
+	VZERO H2_1
+
+	// initialize pointer for reduce constants
+	MOVD $·reduce<>(SB), R12
+
+	// calculate r**2 and 20*(r**2)
+	VZERO R_0
+	VZERO R_1
+	VZERO R_2
+	SQUARE(T_2, T_3, T_4, T_6, R_0, R_1, R_2, T_1, T_5, T_7)
+	REDUCE2(R_0, R_1, R_2, M0, M1, M2, M3, M4, R5_1, R5_2, M5, T_1)
+	VZERO R5_1
+	VZERO R5_2
+	VMSLG T_0, R_1, R5_1, R5_1
+	VMSLG T_0, R_2, R5_2, R5_2
+
+	// skip r**4 calculation if 3 blocks or less
+	CMPBLE R3, $48, b4
+
+	// calculate r**4 and 20*(r**4)
+	VZERO T_8
+	VZERO T_9
+	VZERO T_10
+	SQUARE(R_0, R_1, R_2, R5_2, T_8, T_9, T_10, T_1, T_5, T_7)
+	REDUCE2(T_8, T_9, T_10, M0, M1, M2, M3, M4, T_2, T_3, M5, T_1)
+	VZERO T_2
+	VZERO T_3
+	VMSLG T_0, T_9, T_2, T_2
+	VMSLG T_0, T_10, T_3, T_3
+
+	// put r**2 to the right and r**4 to the left of R_0, R_1, R_2
+	VSLDB $8, T_8, T_8, T_8
+	VSLDB $8, T_9, T_9, T_9
+	VSLDB $8, T_10, T_10, T_10
+	VSLDB $8, T_2, T_2, T_2
+	VSLDB $8, T_3, T_3, T_3
+
+	VO T_8, R_0, R_0
+	VO T_9, R_1, R_1
+	VO T_10, R_2, R_2
+	VO T_2, R5_1, R5_1
+	VO T_3, R5_2, R5_2
+
+	CMPBLE R3, $80, load // less than or equal to 5 blocks in message
+
+	// 6(or 5+1) blocks
+	SUB    $81, R3
+	VLM    (R2), M0, M4
+	VLL    R3, 80(R2), M5
+	ADD    $1, R3
+	MOVBZ  $1, R0
+	CMPBGE R3, $16, 2(PC)
+	VLVGB  R3, R0, M5
+	MOVD   $96(R2), R2
+	EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3)
+	EXPACC(M2, M3, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3)
+	VLEIB  $2, $1, H2_0
+	VLEIB  $2, $1, H2_1
+	VLEIB  $10, $1, H2_0
+	VLEIB  $10, $1, H2_1
+
+	VZERO  M0
+	VZERO  M1
+	VZERO  M2
+	VZERO  M3
+	VZERO  T_4
+	VZERO  T_10
+	EXPACC(M4, M5, M0, M1, M2, M3, T_4, T_10, T_0, T_1, T_2, T_3)
+	VLR    T_4, M4
+	VLEIB  $10, $1, M2
+	CMPBLT R3, $16, 2(PC)
+	VLEIB  $10, $1, T_10
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9)
+	VMRHG  V0, H0_1, H0_0
+	VMRHG  V0, H1_1, H1_0
+	VMRHG  V0, H2_1, H2_0
+	VMRLG  V0, H0_1, H0_1
+	VMRLG  V0, H1_1, H1_1
+	VMRLG  V0, H2_1, H2_1
+
+	SUB    $16, R3
+	CMPBLE R3, $0, square
+
+load:
+	// load EX0, EX1 and EX2
+	MOVD $·c<>(SB), R5
+	VLM  (R5), EX0, EX2
+
+loop:
+	CMPBLE R3, $64, add // b4	// last 4 or less blocks left
+
+	// next 4 full blocks
+	VLM  (R2), M2, M5
+	SUB  $64, R3
+	MOVD $64(R2), R2
+	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, T_0, T_1, T_3, T_4, T_5, T_2, T_7, T_8, T_9)
+
+	// expacc in-lined to create [m2, m3] limbs
+	VGBM   $0x3f3f, T_0     // 44 bit clear mask
+	VGBM   $0x1f1f, T_1     // 40 bit clear mask
+	VPERM  M2, M3, EX0, T_3
+	VESRLG $4, T_0, T_0     // 44 bit clear mask ready
+	VPERM  M2, M3, EX1, T_4
+	VPERM  M2, M3, EX2, T_5
+	VN     T_0, T_3, T_3
+	VESRLG $4, T_4, T_4
+	VN     T_1, T_5, T_5
+	VN     T_0, T_4, T_4
+	VMRHG  H0_1, T_3, H0_0
+	VMRHG  H1_1, T_4, H1_0
+	VMRHG  H2_1, T_5, H2_0
+	VMRLG  H0_1, T_3, H0_1
+	VMRLG  H1_1, T_4, H1_1
+	VMRLG  H2_1, T_5, H2_1
+	VLEIB  $10, $1, H2_0
+	VLEIB  $10, $1, H2_1
+	VPERM  M4, M5, EX0, T_3
+	VPERM  M4, M5, EX1, T_4
+	VPERM  M4, M5, EX2, T_5
+	VN     T_0, T_3, T_3
+	VESRLG $4, T_4, T_4
+	VN     T_1, T_5, T_5
+	VN     T_0, T_4, T_4
+	VMRHG  V0, T_3, M0
+	VMRHG  V0, T_4, M1
+	VMRHG  V0, T_5, M2
+	VMRLG  V0, T_3, M3
+	VMRLG  V0, T_4, M4
+	VMRLG  V0, T_5, M5
+	VLEIB  $10, $1, M2
+	VLEIB  $10, $1, M5
+
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	CMPBNE R3, $0, loop
+	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9)
+	VMRHG  V0, H0_1, H0_0
+	VMRHG  V0, H1_1, H1_0
+	VMRHG  V0, H2_1, H2_0
+	VMRLG  V0, H0_1, H0_1
+	VMRLG  V0, H1_1, H1_1
+	VMRLG  V0, H2_1, H2_1
+
+	// load EX0, EX1, EX2
+	MOVD $·constants<>(SB), R5
+	VLM  (R5), EX0, EX2
+
+	// sum vectors
+	VAQ H0_0, H0_1, H0_0
+	VAQ H1_0, H1_1, H1_0
+	VAQ H2_0, H2_1, H2_0
+
+	// h may be >= 2*(2**130-5) so we need to reduce it again
+	// M0...M4 are used as temps here
+	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5)
+
+next:  // carry h1->h2
+	VLEIB  $7, $0x28, T_1
+	VREPIB $4, T_2
+	VGBM   $0x003F, T_3
+	VESRLG $4, T_3
+
+	// byte shift
+	VSRLB T_1, H1_0, T_4
+
+	// bit shift
+	VSRL T_2, T_4, T_4
+
+	// clear h1 carry bits
+	VN T_3, H1_0, H1_0
+
+	// add carry
+	VAQ T_4, H2_0, H2_0
+
+	// h is now < 2*(2**130-5)
+	// pack h into h1 (hi) and h0 (lo)
+	PACK(H0_0, H1_0, H2_0)
+
+	// if h > 2**130-5 then h -= 2**130-5
+	MOD(H0_0, H1_0, T_0, T_1, T_2)
+
+	// h += s
+	MOVD  $·bswapMask<>(SB), R5
+	VL    (R5), T_1
+	VL    16(R4), T_0
+	VPERM T_0, T_0, T_1, T_0    // reverse bytes (to big)
+	VAQ   T_0, H0_0, H0_0
+	VPERM H0_0, H0_0, T_1, H0_0 // reverse bytes (to little)
+	VST   H0_0, (R1)
+	RET
+
+add:
+	// load EX0, EX1, EX2
+	MOVD $·constants<>(SB), R5
+	VLM  (R5), EX0, EX2
+
+	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9)
+	VMRHG  V0, H0_1, H0_0
+	VMRHG  V0, H1_1, H1_0
+	VMRHG  V0, H2_1, H2_0
+	VMRLG  V0, H0_1, H0_1
+	VMRLG  V0, H1_1, H1_1
+	VMRLG  V0, H2_1, H2_1
+	CMPBLE R3, $64, b4
+
+b4:
+	CMPBLE R3, $48, b3 // 3 blocks or less
+
+	// 4(3+1) blocks remaining
+	SUB    $49, R3
+	VLM    (R2), M0, M2
+	VLL    R3, 48(R2), M3
+	ADD    $1, R3
+	MOVBZ  $1, R0
+	CMPBEQ R3, $16, 2(PC)
+	VLVGB  R3, R0, M3
+	MOVD   $64(R2), R2
+	EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3)
+	VLEIB  $10, $1, H2_0
+	VLEIB  $10, $1, H2_1
+	VZERO  M0
+	VZERO  M1
+	VZERO  M4
+	VZERO  M5
+	VZERO  T_4
+	VZERO  T_10
+	EXPACC(M2, M3, M0, M1, M4, M5, T_4, T_10, T_0, T_1, T_2, T_3)
+	VLR    T_4, M2
+	VLEIB  $10, $1, M4
+	CMPBNE R3, $16, 2(PC)
+	VLEIB  $10, $1, T_10
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M4, M5, M2, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9)
+	VMRHG  V0, H0_1, H0_0
+	VMRHG  V0, H1_1, H1_0
+	VMRHG  V0, H2_1, H2_0
+	VMRLG  V0, H0_1, H0_1
+	VMRLG  V0, H1_1, H1_1
+	VMRLG  V0, H2_1, H2_1
+	SUB    $16, R3
+	CMPBLE R3, $0, square // this condition must always hold true!
+
+b3:
+	CMPBLE R3, $32, b2
+
+	// 3 blocks remaining
+
+	// setup [r²,r]
+	VSLDB $8, R_0, R_0, R_0
+	VSLDB $8, R_1, R_1, R_1
+	VSLDB $8, R_2, R_2, R_2
+	VSLDB $8, R5_1, R5_1, R5_1
+	VSLDB $8, R5_2, R5_2, R5_2
+
+	VLVGG $1, RSAVE_0, R_0
+	VLVGG $1, RSAVE_1, R_1
+	VLVGG $1, RSAVE_2, R_2
+	VLVGG $1, R5SAVE_1, R5_1
+	VLVGG $1, R5SAVE_2, R5_2
+
+	// setup [h0, h1]
+	VSLDB $8, H0_0, H0_0, H0_0
+	VSLDB $8, H1_0, H1_0, H1_0
+	VSLDB $8, H2_0, H2_0, H2_0
+	VO    H0_1, H0_0, H0_0
+	VO    H1_1, H1_0, H1_0
+	VO    H2_1, H2_0, H2_0
+	VZERO H0_1
+	VZERO H1_1
+	VZERO H2_1
+
+	VZERO M0
+	VZERO M1
+	VZERO M2
+	VZERO M3
+	VZERO M4
+	VZERO M5
+
+	// H*[r**2, r]
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, T_10, M5)
+
+	SUB    $33, R3
+	VLM    (R2), M0, M1
+	VLL    R3, 32(R2), M2
+	ADD    $1, R3
+	MOVBZ  $1, R0
+	CMPBEQ R3, $16, 2(PC)
+	VLVGB  R3, R0, M2
+
+	// H += m0
+	VZERO T_1
+	VZERO T_2
+	VZERO T_3
+	EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6)
+	VLEIB $10, $1, T_3
+	VAG   H0_0, T_1, H0_0
+	VAG   H1_0, T_2, H1_0
+	VAG   H2_0, T_3, H2_0
+
+	VZERO M0
+	VZERO M3
+	VZERO M4
+	VZERO M5
+	VZERO T_10
+
+	// (H+m0)*r
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M3, M4, M5, V0, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_10, H0_1, H1_1, H2_1, T_9)
+
+	// H += m1
+	VZERO V0
+	VZERO T_1
+	VZERO T_2
+	VZERO T_3
+	EXPACC2(M1, T_1, T_2, T_3, T_4, T_5, T_6)
+	VLEIB $10, $1, T_3
+	VAQ   H0_0, T_1, H0_0
+	VAQ   H1_0, T_2, H1_0
+	VAQ   H2_0, T_3, H2_0
+	REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10)
+
+	// [H, m2] * [r**2, r]
+	EXPACC2(M2, H0_0, H1_0, H2_0, T_1, T_2, T_3)
+	CMPBNE R3, $16, 2(PC)
+	VLEIB  $10, $1, H2_0
+	VZERO  M0
+	VZERO  M1
+	VZERO  M2
+	VZERO  M3
+	VZERO  M4
+	VZERO  M5
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, M5, T_10)
+	SUB    $16, R3
+	CMPBLE R3, $0, next   // this condition must always hold true!
+
+b2:
+	CMPBLE R3, $16, b1
+
+	// 2 blocks remaining
+
+	// setup [r²,r]
+	VSLDB $8, R_0, R_0, R_0
+	VSLDB $8, R_1, R_1, R_1
+	VSLDB $8, R_2, R_2, R_2
+	VSLDB $8, R5_1, R5_1, R5_1
+	VSLDB $8, R5_2, R5_2, R5_2
+
+	VLVGG $1, RSAVE_0, R_0
+	VLVGG $1, RSAVE_1, R_1
+	VLVGG $1, RSAVE_2, R_2
+	VLVGG $1, R5SAVE_1, R5_1
+	VLVGG $1, R5SAVE_2, R5_2
+
+	// setup [h0, h1]
+	VSLDB $8, H0_0, H0_0, H0_0
+	VSLDB $8, H1_0, H1_0, H1_0
+	VSLDB $8, H2_0, H2_0, H2_0
+	VO    H0_1, H0_0, H0_0
+	VO    H1_1, H1_0, H1_0
+	VO    H2_1, H2_0, H2_0
+	VZERO H0_1
+	VZERO H1_1
+	VZERO H2_1
+
+	VZERO M0
+	VZERO M1
+	VZERO M2
+	VZERO M3
+	VZERO M4
+	VZERO M5
+
+	// H*[r**2, r]
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9)
+	VMRHG V0, H0_1, H0_0
+	VMRHG V0, H1_1, H1_0
+	VMRHG V0, H2_1, H2_0
+	VMRLG V0, H0_1, H0_1
+	VMRLG V0, H1_1, H1_1
+	VMRLG V0, H2_1, H2_1
+
+	// move h to the left and 0s at the right
+	VSLDB $8, H0_0, H0_0, H0_0
+	VSLDB $8, H1_0, H1_0, H1_0
+	VSLDB $8, H2_0, H2_0, H2_0
+
+	// get message blocks and append 1 to start
+	SUB    $17, R3
+	VL     (R2), M0
+	VLL    R3, 16(R2), M1
+	ADD    $1, R3
+	MOVBZ  $1, R0
+	CMPBEQ R3, $16, 2(PC)
+	VLVGB  R3, R0, M1
+	VZERO  T_6
+	VZERO  T_7
+	VZERO  T_8
+	EXPACC2(M0, T_6, T_7, T_8, T_1, T_2, T_3)
+	EXPACC2(M1, T_6, T_7, T_8, T_1, T_2, T_3)
+	VLEIB  $2, $1, T_8
+	CMPBNE R3, $16, 2(PC)
+	VLEIB  $10, $1, T_8
+
+	// add [m0, m1] to h
+	VAG H0_0, T_6, H0_0
+	VAG H1_0, T_7, H1_0
+	VAG H2_0, T_8, H2_0
+
+	VZERO M2
+	VZERO M3
+	VZERO M4
+	VZERO M5
+	VZERO T_10
+	VZERO M0
+
+	// at this point R_0 .. R5_2 look like [r**2, r]
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M2, M3, M4, M5, T_10, M0, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE2(H0_0, H1_0, H2_0, M2, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10)
+	SUB    $16, R3, R3
+	CMPBLE R3, $0, next
+
+b1:
+	CMPBLE R3, $0, next
+
+	// 1 block remaining
+
+	// setup [r²,r]
+	VSLDB $8, R_0, R_0, R_0
+	VSLDB $8, R_1, R_1, R_1
+	VSLDB $8, R_2, R_2, R_2
+	VSLDB $8, R5_1, R5_1, R5_1
+	VSLDB $8, R5_2, R5_2, R5_2
+
+	VLVGG $1, RSAVE_0, R_0
+	VLVGG $1, RSAVE_1, R_1
+	VLVGG $1, RSAVE_2, R_2
+	VLVGG $1, R5SAVE_1, R5_1
+	VLVGG $1, R5SAVE_2, R5_2
+
+	// setup [h0, h1]
+	VSLDB $8, H0_0, H0_0, H0_0
+	VSLDB $8, H1_0, H1_0, H1_0
+	VSLDB $8, H2_0, H2_0, H2_0
+	VO    H0_1, H0_0, H0_0
+	VO    H1_1, H1_0, H1_0
+	VO    H2_1, H2_0, H2_0
+	VZERO H0_1
+	VZERO H1_1
+	VZERO H2_1
+
+	VZERO M0
+	VZERO M1
+	VZERO M2
+	VZERO M3
+	VZERO M4
+	VZERO M5
+
+	// H*[r**2, r]
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5)
+
+	// set up [0, m0] limbs
+	SUB    $1, R3
+	VLL    R3, (R2), M0
+	ADD    $1, R3
+	MOVBZ  $1, R0
+	CMPBEQ R3, $16, 2(PC)
+	VLVGB  R3, R0, M0
+	VZERO  T_1
+	VZERO  T_2
+	VZERO  T_3
+	EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6)// limbs: [0, m]
+	CMPBNE R3, $16, 2(PC)
+	VLEIB  $10, $1, T_3
+
+	// h+m0
+	VAQ H0_0, T_1, H0_0
+	VAQ H1_0, T_2, H1_0
+	VAQ H2_0, T_3, H2_0
+
+	VZERO M0
+	VZERO M1
+	VZERO M2
+	VZERO M3
+	VZERO M4
+	VZERO M5
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5)
+
+	BR next
+
+square:
+	// setup [r²,r]
+	VSLDB $8, R_0, R_0, R_0
+	VSLDB $8, R_1, R_1, R_1
+	VSLDB $8, R_2, R_2, R_2
+	VSLDB $8, R5_1, R5_1, R5_1
+	VSLDB $8, R5_2, R5_2, R5_2
+
+	VLVGG $1, RSAVE_0, R_0
+	VLVGG $1, RSAVE_1, R_1
+	VLVGG $1, RSAVE_2, R_2
+	VLVGG $1, R5SAVE_1, R5_1
+	VLVGG $1, R5SAVE_2, R5_2
+
+	// setup [h0, h1]
+	VSLDB $8, H0_0, H0_0, H0_0
+	VSLDB $8, H1_0, H1_0, H1_0
+	VSLDB $8, H2_0, H2_0, H2_0
+	VO    H0_1, H0_0, H0_0
+	VO    H1_1, H1_0, H1_0
+	VO    H2_1, H2_0, H2_0
+	VZERO H0_1
+	VZERO H1_1
+	VZERO H2_1
+
+	VZERO M0
+	VZERO M1
+	VZERO M2
+	VZERO M3
+	VZERO M4
+	VZERO M5
+
+	// (h0*r**2) + (h1*r)
+	MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9)
+	REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5)
+	BR next
+
+TEXT ·hasVMSLFacility(SB), NOSPLIT, $24-1
+	MOVD  $x-24(SP), R1
+	XC    $24, 0(R1), 0(R1) // clear the storage
+	MOVD  $2, R0            // R0 is the number of double words stored -1
+	WORD  $0xB2B01000       // STFLE 0(R1)
+	XOR   R0, R0            // reset the value of R0
+	MOVBZ z-8(SP), R1
+	AND   $0x01, R1
+	BEQ   novmsl
+
+vectorinstalled:
+	// check if the vector instruction has been enabled
+	VLEIB  $0, $0xF, V16
+	VLGVB  $0, V16, R1
+	CMPBNE R1, $0xF, novmsl
+	MOVB   $1, ret+0(FP)    // have vx
+	RET
+
+novmsl:
+	MOVB $0, ret+0(FP) // no vx
+	RET
diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go
index ff28aaef6ff2f091efe8cdbae93da4c402908bd1..9b25b5ac255a8df66d676c177ab33af60819a265 100644
--- a/vendor/golang.org/x/crypto/scrypt/scrypt.go
+++ b/vendor/golang.org/x/crypto/scrypt/scrypt.go
@@ -218,7 +218,7 @@ func smix(b []byte, r, N int, v, xy []uint32) {
 // For example, you can get a derived key for e.g. AES-256 (which needs a
 // 32-byte key) by doing:
 //
-//      dk, err := scrypt.Key([]byte("some password"), salt, 16384, 8, 1, 32)
+//      dk, err := scrypt.Key([]byte("some password"), salt, 32768, 8, 1, 32)
 //
 // The recommended parameters for interactive logins as of 2017 are N=32768, r=8
 // and p=1. The parameters N, r, and p should be increased as memory latency and
diff --git a/vendor/golang.org/x/net/http/httpguts/guts.go b/vendor/golang.org/x/net/http/httpguts/guts.go
new file mode 100644
index 0000000000000000000000000000000000000000..8255fd49b424d9027bb80af256c3f7cc7976adc1
--- /dev/null
+++ b/vendor/golang.org/x/net/http/httpguts/guts.go
@@ -0,0 +1,65 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package httpguts provides functions implementing various details
+// of the HTTP specification.
+//
+// This package is shared by the standard library (which vendors it)
+// and x/net/http2. It comes with no API stability promise.
+package httpguts
+
+import (
+	"net/textproto"
+	"strings"
+)
+
+// SniffedContentType reports whether ct is a Content-Type that is known
+// to cause client-side content sniffing.
+//
+// This provides just a partial implementation of mime.ParseMediaType
+// with the assumption that the Content-Type is not attacker controlled.
+func SniffedContentType(ct string) bool {
+	if i := strings.Index(ct, ";"); i != -1 {
+		ct = ct[:i]
+	}
+	ct = strings.ToLower(strings.TrimSpace(ct))
+	return ct == "text/plain" || ct == "application/octet-stream" ||
+		ct == "application/unknown" || ct == "unknown/unknown" || ct == "*/*" ||
+		!strings.Contains(ct, "/")
+}
+
+// ValidTrailerHeader reports whether name is a valid header field name to appear
+// in trailers.
+// See RFC 7230, Section 4.1.2
+func ValidTrailerHeader(name string) bool {
+	name = textproto.CanonicalMIMEHeaderKey(name)
+	if strings.HasPrefix(name, "If-") || badTrailer[name] {
+		return false
+	}
+	return true
+}
+
+var badTrailer = map[string]bool{
+	"Authorization":       true,
+	"Cache-Control":       true,
+	"Connection":          true,
+	"Content-Encoding":    true,
+	"Content-Length":      true,
+	"Content-Range":       true,
+	"Content-Type":        true,
+	"Expect":              true,
+	"Host":                true,
+	"Keep-Alive":          true,
+	"Max-Forwards":        true,
+	"Pragma":              true,
+	"Proxy-Authenticate":  true,
+	"Proxy-Authorization": true,
+	"Proxy-Connection":    true,
+	"Range":               true,
+	"Realm":               true,
+	"Te":                  true,
+	"Trailer":             true,
+	"Transfer-Encoding":   true,
+	"Www-Authenticate":    true,
+}
diff --git a/vendor/golang.org/x/net/lex/httplex/httplex.go b/vendor/golang.org/x/net/http/httpguts/httplex.go
similarity index 97%
rename from vendor/golang.org/x/net/lex/httplex/httplex.go
rename to vendor/golang.org/x/net/http/httpguts/httplex.go
index 20f2b8940baed667985ba67ac18ef1d75b4b3378..e7de24ee64efc6b10326616b2b5b2588b2b70439 100644
--- a/vendor/golang.org/x/net/lex/httplex/httplex.go
+++ b/vendor/golang.org/x/net/http/httpguts/httplex.go
@@ -2,12 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-// Package httplex contains rules around lexical matters of various
-// HTTP-related specifications.
-//
-// This package is shared by the standard library (which vendors it)
-// and x/net/http2. It comes with no API stability promise.
-package httplex
+package httpguts
 
 import (
 	"net"
diff --git a/vendor/golang.org/x/net/http2/frame.go b/vendor/golang.org/x/net/http2/frame.go
index 3b14890728f5fd107cf2fa7957527feb67e48da5..e32500779af9c1f487158d2868c80a5d6cdd52e0 100644
--- a/vendor/golang.org/x/net/http2/frame.go
+++ b/vendor/golang.org/x/net/http2/frame.go
@@ -14,8 +14,8 @@ import (
 	"strings"
 	"sync"
 
+	"golang.org/x/net/http/httpguts"
 	"golang.org/x/net/http2/hpack"
-	"golang.org/x/net/lex/httplex"
 )
 
 const frameHeaderLen = 9
@@ -1462,7 +1462,7 @@ func (fr *Framer) readMetaFrame(hf *HeadersFrame) (*MetaHeadersFrame, error) {
 		if VerboseLogs && fr.logReads {
 			fr.debugReadLoggerf("http2: decoded hpack field %+v", hf)
 		}
-		if !httplex.ValidHeaderFieldValue(hf.Value) {
+		if !httpguts.ValidHeaderFieldValue(hf.Value) {
 			invalid = headerFieldValueError(hf.Value)
 		}
 		isPseudo := strings.HasPrefix(hf.Name, ":")
diff --git a/vendor/golang.org/x/net/http2/hpack/hpack.go b/vendor/golang.org/x/net/http2/hpack/hpack.go
index 176644acdaceca5cc935e263598ee4155623a312..166788ceec5e84f0c1dd5245f9bb042e40d88dad 100644
--- a/vendor/golang.org/x/net/http2/hpack/hpack.go
+++ b/vendor/golang.org/x/net/http2/hpack/hpack.go
@@ -389,6 +389,12 @@ func (d *Decoder) callEmit(hf HeaderField) error {
 
 // (same invariants and behavior as parseHeaderFieldRepr)
 func (d *Decoder) parseDynamicTableSizeUpdate() error {
+	// RFC 7541, sec 4.2: This dynamic table size update MUST occur at the
+	// beginning of the first header block following the change to the dynamic table size.
+	if d.dynTab.size > 0 {
+		return DecodingError{errors.New("dynamic table size update MUST occur at the beginning of a header block")}
+	}
+
 	buf := d.buf
 	size, buf, err := readVarInt(5, buf)
 	if err != nil {
diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go
index 71db28a873a1c1af2e5edd675f27960399813eaf..c82428254af428e5fed86b980ddc9250da25f82d 100644
--- a/vendor/golang.org/x/net/http2/http2.go
+++ b/vendor/golang.org/x/net/http2/http2.go
@@ -29,7 +29,7 @@ import (
 	"strings"
 	"sync"
 
-	"golang.org/x/net/lex/httplex"
+	"golang.org/x/net/http/httpguts"
 )
 
 var (
@@ -179,7 +179,7 @@ var (
 )
 
 // validWireHeaderFieldName reports whether v is a valid header field
-// name (key). See httplex.ValidHeaderName for the base rules.
+// name (key). See httpguts.ValidHeaderName for the base rules.
 //
 // Further, http2 says:
 //   "Just as in HTTP/1.x, header field names are strings of ASCII
@@ -191,7 +191,7 @@ func validWireHeaderFieldName(v string) bool {
 		return false
 	}
 	for _, r := range v {
-		if !httplex.IsTokenRune(r) {
+		if !httpguts.IsTokenRune(r) {
 			return false
 		}
 		if 'A' <= r && r <= 'Z' {
diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go
index 39ed755a86e62f157843429c515092a2a5d42de8..acf3b24186f87f10110a4405edc74a341ef54a3f 100644
--- a/vendor/golang.org/x/net/http2/server.go
+++ b/vendor/golang.org/x/net/http2/server.go
@@ -46,6 +46,7 @@ import (
 	"sync"
 	"time"
 
+	"golang.org/x/net/http/httpguts"
 	"golang.org/x/net/http2/hpack"
 )
 
@@ -1607,7 +1608,10 @@ func (sc *serverConn) processData(f *DataFrame) error {
 	// Sender sending more than they'd declared?
 	if st.declBodyBytes != -1 && st.bodyBytes+int64(len(data)) > st.declBodyBytes {
 		st.body.CloseWithError(fmt.Errorf("sender tried to send more than declared Content-Length of %d bytes", st.declBodyBytes))
-		return streamError(id, ErrCodeStreamClosed)
+		// RFC 7540, sec 8.1.2.6: A request or response is also malformed if the
+		// value of a content-length header field does not equal the sum of the
+		// DATA frame payload lengths that form the body.
+		return streamError(id, ErrCodeProtocol)
 	}
 	if f.Length > 0 {
 		// Check whether the client has flow control quota.
@@ -1817,7 +1821,7 @@ func (st *stream) processTrailerHeaders(f *MetaHeadersFrame) error {
 	if st.trailer != nil {
 		for _, hf := range f.RegularFields() {
 			key := sc.canonicalHeader(hf.Name)
-			if !ValidTrailerHeader(key) {
+			if !httpguts.ValidTrailerHeader(key) {
 				// TODO: send more details to the peer somehow. But http2 has
 				// no way to send debug data at a stream level. Discuss with
 				// HTTP folk.
@@ -2284,7 +2288,7 @@ func (rws *responseWriterState) hasTrailers() bool { return len(rws.trailers) !=
 // written in the trailers at the end of the response.
 func (rws *responseWriterState) declareTrailer(k string) {
 	k = http.CanonicalHeaderKey(k)
-	if !ValidTrailerHeader(k) {
+	if !httpguts.ValidTrailerHeader(k) {
 		// Forbidden by RFC 7230, section 4.1.2.
 		rws.conn.logf("ignoring invalid trailer %q", k)
 		return
@@ -2308,6 +2312,7 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
 	isHeadResp := rws.req.Method == "HEAD"
 	if !rws.sentHeader {
 		rws.sentHeader = true
+
 		var ctype, clen string
 		if clen = rws.snapHeader.Get("Content-Length"); clen != "" {
 			rws.snapHeader.Del("Content-Length")
@@ -2321,10 +2326,33 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
 		if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
 			clen = strconv.Itoa(len(p))
 		}
+
 		_, hasContentType := rws.snapHeader["Content-Type"]
 		if !hasContentType && bodyAllowedForStatus(rws.status) && len(p) > 0 {
-			ctype = http.DetectContentType(p)
+			if cto := rws.snapHeader.Get("X-Content-Type-Options"); strings.EqualFold("nosniff", cto) {
+				// nosniff is an explicit directive not to guess a content-type.
+				// Content-sniffing is no less susceptible to polyglot attacks via
+				// hosted content when done on the server.
+				ctype = "application/octet-stream"
+				rws.conn.logf("http2: WriteHeader called with X-Content-Type-Options:nosniff but no Content-Type")
+			} else {
+				ctype = http.DetectContentType(p)
+			}
+		}
+
+		var noSniff bool
+		if bodyAllowedForStatus(rws.status) && (rws.sentContentLen > 0 || len(p) > 0) {
+			// If the content type triggers client-side sniffing on old browsers,
+			// attach a X-Content-Type-Options header if not present (or explicitly nil).
+			if _, ok := rws.snapHeader["X-Content-Type-Options"]; !ok {
+				if hasContentType {
+					noSniff = httpguts.SniffedContentType(rws.snapHeader.Get("Content-Type"))
+				} else if ctype != "" {
+					noSniff = httpguts.SniffedContentType(ctype)
+				}
+			}
 		}
+
 		var date string
 		if _, ok := rws.snapHeader["Date"]; !ok {
 			// TODO(bradfitz): be faster here, like net/http? measure.
@@ -2343,6 +2371,7 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) {
 			endStream:     endStream,
 			contentType:   ctype,
 			contentLength: clen,
+			noSniff:       noSniff,
 			date:          date,
 		})
 		if err != nil {
@@ -2838,41 +2867,6 @@ func new400Handler(err error) http.HandlerFunc {
 	}
 }
 
-// ValidTrailerHeader reports whether name is a valid header field name to appear
-// in trailers.
-// See: http://tools.ietf.org/html/rfc7230#section-4.1.2
-func ValidTrailerHeader(name string) bool {
-	name = http.CanonicalHeaderKey(name)
-	if strings.HasPrefix(name, "If-") || badTrailer[name] {
-		return false
-	}
-	return true
-}
-
-var badTrailer = map[string]bool{
-	"Authorization":       true,
-	"Cache-Control":       true,
-	"Connection":          true,
-	"Content-Encoding":    true,
-	"Content-Length":      true,
-	"Content-Range":       true,
-	"Content-Type":        true,
-	"Expect":              true,
-	"Host":                true,
-	"Keep-Alive":          true,
-	"Max-Forwards":        true,
-	"Pragma":              true,
-	"Proxy-Authenticate":  true,
-	"Proxy-Authorization": true,
-	"Proxy-Connection":    true,
-	"Range":               true,
-	"Realm":               true,
-	"Te":                  true,
-	"Trailer":             true,
-	"Transfer-Encoding":   true,
-	"Www-Authenticate":    true,
-}
-
 // h1ServerKeepAlivesDisabled reports whether hs has its keep-alives
 // disabled. See comments on h1ServerShutdownChan above for why
 // the code is written this way.
diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go
index e6b321f4bb60c12687424c68f9a76f9e572566a5..d23a226251c26cf4bd95e80a5089ac322bbdce39 100644
--- a/vendor/golang.org/x/net/http2/transport.go
+++ b/vendor/golang.org/x/net/http2/transport.go
@@ -27,9 +27,9 @@ import (
 	"sync"
 	"time"
 
+	"golang.org/x/net/http/httpguts"
 	"golang.org/x/net/http2/hpack"
 	"golang.org/x/net/idna"
-	"golang.org/x/net/lex/httplex"
 )
 
 const (
@@ -567,6 +567,10 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro
 	// henc in response to SETTINGS frames?
 	cc.henc = hpack.NewEncoder(&cc.hbuf)
 
+	if t.AllowHTTP {
+		cc.nextStreamID = 3
+	}
+
 	if cs, ok := c.(connectionStater); ok {
 		state := cs.ConnectionState()
 		cc.tlsState = &state
@@ -951,6 +955,9 @@ func (cc *ClientConn) awaitOpenSlotForRequest(req *http.Request) error {
 	for {
 		cc.lastActive = time.Now()
 		if cc.closed || !cc.canTakeNewRequestLocked() {
+			if waitingForConn != nil {
+				close(waitingForConn)
+			}
 			return errClientConnUnusable
 		}
 		if int64(len(cc.streams))+1 <= int64(cc.maxConcurrentStreams) {
@@ -1174,7 +1181,7 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
 	if host == "" {
 		host = req.URL.Host
 	}
-	host, err := httplex.PunycodeHostPort(host)
+	host, err := httpguts.PunycodeHostPort(host)
 	if err != nil {
 		return nil, err
 	}
@@ -1199,11 +1206,11 @@ func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trail
 	// potentially pollute our hpack state. (We want to be able to
 	// continue to reuse the hpack encoder for future requests)
 	for k, vv := range req.Header {
-		if !httplex.ValidHeaderFieldName(k) {
+		if !httpguts.ValidHeaderFieldName(k) {
 			return nil, fmt.Errorf("invalid HTTP header name %q", k)
 		}
 		for _, v := range vv {
-			if !httplex.ValidHeaderFieldValue(v) {
+			if !httpguts.ValidHeaderFieldValue(v) {
 				return nil, fmt.Errorf("invalid HTTP header value %q for header %q", v, k)
 			}
 		}
@@ -2244,7 +2251,7 @@ func (t *Transport) getBodyWriterState(cs *clientStream, body io.Reader) (s body
 	}
 	s.delay = t.expectContinueTimeout()
 	if s.delay == 0 ||
-		!httplex.HeaderValuesContainsToken(
+		!httpguts.HeaderValuesContainsToken(
 			cs.req.Header["Expect"],
 			"100-continue") {
 		return
@@ -2299,5 +2306,5 @@ func (s bodyWriterState) scheduleBodyWrite() {
 // isConnectionCloseRequest reports whether req should use its own
 // connection for a single request and then close the connection.
 func isConnectionCloseRequest(req *http.Request) bool {
-	return req.Close || httplex.HeaderValuesContainsToken(req.Header["Connection"], "close")
+	return req.Close || httpguts.HeaderValuesContainsToken(req.Header["Connection"], "close")
 }
diff --git a/vendor/golang.org/x/net/http2/write.go b/vendor/golang.org/x/net/http2/write.go
index 54ab4a88e7b809a4c1aa58e4c92ad2013d816fa6..a5120412e6759e0d705d6b48a2871f49c9420d2a 100644
--- a/vendor/golang.org/x/net/http2/write.go
+++ b/vendor/golang.org/x/net/http2/write.go
@@ -11,8 +11,8 @@ import (
 	"net/http"
 	"net/url"
 
+	"golang.org/x/net/http/httpguts"
 	"golang.org/x/net/http2/hpack"
-	"golang.org/x/net/lex/httplex"
 )
 
 // writeFramer is implemented by any type that is used to write frames.
@@ -186,6 +186,7 @@ type writeResHeaders struct {
 	date          string
 	contentType   string
 	contentLength string
+	noSniff       bool
 }
 
 func encKV(enc *hpack.Encoder, k, v string) {
@@ -222,6 +223,9 @@ func (w *writeResHeaders) writeFrame(ctx writeContext) error {
 	if w.contentLength != "" {
 		encKV(enc, "content-length", w.contentLength)
 	}
+	if w.noSniff {
+		encKV(enc, "x-content-type-options", "nosniff")
+	}
 	if w.date != "" {
 		encKV(enc, "date", w.date)
 	}
@@ -350,7 +354,7 @@ func encodeHeaders(enc *hpack.Encoder, h http.Header, keys []string) {
 		}
 		isTE := k == "transfer-encoding"
 		for _, v := range vv {
-			if !httplex.ValidHeaderFieldValue(v) {
+			if !httpguts.ValidHeaderFieldValue(v) {
 				// TODO: return an error? golang.org/issue/14048
 				// For now just omit it.
 				continue
diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go
new file mode 100644
index 0000000000000000000000000000000000000000..2d1fc12fbdb929ea2e3ed481121495166be39a74
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu.go
@@ -0,0 +1,35 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package cpu implements processor feature detection for
+// various CPU architectures.
+package cpu
+
+// X86 contains the supported CPU features of the
+// current X86/AMD64 platform. If the current platform
+// is not X86/AMD64 then all feature flags are false.
+//
+// X86 is padded to avoid false sharing. Further the HasAVX
+// and HasAVX2 are only set if the OS supports XMM and YMM
+// registers in addition to the CPUID feature bit being set.
+var X86 struct {
+	_            [cacheLineSize]byte
+	HasAES       bool // AES hardware implementation (AES NI)
+	HasADX       bool // Multi-precision add-carry instruction extensions
+	HasAVX       bool // Advanced vector extension
+	HasAVX2      bool // Advanced vector extension 2
+	HasBMI1      bool // Bit manipulation instruction set 1
+	HasBMI2      bool // Bit manipulation instruction set 2
+	HasERMS      bool // Enhanced REP for MOVSB and STOSB
+	HasFMA       bool // Fused-multiply-add instructions
+	HasOSXSAVE   bool // OS supports XSAVE/XRESTOR for saving/restoring XMM registers.
+	HasPCLMULQDQ bool // PCLMULQDQ instruction - most often used for AES-GCM
+	HasPOPCNT    bool // Hamming weight instruction POPCNT.
+	HasSSE2      bool // Streaming SIMD extension 2 (always available on amd64)
+	HasSSE3      bool // Streaming SIMD extension 3
+	HasSSSE3     bool // Supplemental streaming SIMD extension 3
+	HasSSE41     bool // Streaming SIMD extension 4 and 4.1
+	HasSSE42     bool // Streaming SIMD extension 4 and 4.2
+	_            [cacheLineSize]byte
+}
diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm.go b/vendor/golang.org/x/sys/cpu/cpu_arm.go
new file mode 100644
index 0000000000000000000000000000000000000000..d93036f7522bf7f9545aa9dbb55be2afab36aabf
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_arm.go
@@ -0,0 +1,7 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+const cacheLineSize = 32
diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go
new file mode 100644
index 0000000000000000000000000000000000000000..1d2ab2902a769684cfb8b7fb32b67d72e20f9014
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go
@@ -0,0 +1,7 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+const cacheLineSize = 64
diff --git a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go
new file mode 100644
index 0000000000000000000000000000000000000000..6165f121249abd4b272a6e7d35f9da50c9433532
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go
@@ -0,0 +1,9 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build mips64 mips64le
+
+package cpu
+
+const cacheLineSize = 32
diff --git a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go
new file mode 100644
index 0000000000000000000000000000000000000000..1269eee88d00626c89276d04b371a8249e916eb5
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go
@@ -0,0 +1,9 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build mips mipsle
+
+package cpu
+
+const cacheLineSize = 32
diff --git a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go
new file mode 100644
index 0000000000000000000000000000000000000000..d10759a524f2858dc26cc7bfdcc81d7c595336e8
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go
@@ -0,0 +1,9 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build ppc64 ppc64le
+
+package cpu
+
+const cacheLineSize = 128
diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_s390x.go
new file mode 100644
index 0000000000000000000000000000000000000000..684c4f005d09eacd825ed1b68937f863fdaff519
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.go
@@ -0,0 +1,7 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cpu
+
+const cacheLineSize = 256
diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go
new file mode 100644
index 0000000000000000000000000000000000000000..8842b7cf71c40d1bf1a9aafbc8261592d8607ca8
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go
@@ -0,0 +1,61 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build 386 amd64 amd64p32
+
+package cpu
+
+const cacheLineSize = 64
+
+// cpuid is implemented in cpu_x86.s.
+func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)
+
+// xgetbv with ecx = 0 is implemented in cpu_x86.s.
+func xgetbv() (eax, edx uint32)
+
+func init() {
+	maxID, _, _, _ := cpuid(0, 0)
+
+	if maxID < 1 {
+		return
+	}
+
+	_, _, ecx1, edx1 := cpuid(1, 0)
+	X86.HasSSE2 = isSet(26, edx1)
+
+	X86.HasSSE3 = isSet(0, ecx1)
+	X86.HasPCLMULQDQ = isSet(1, ecx1)
+	X86.HasSSSE3 = isSet(9, ecx1)
+	X86.HasFMA = isSet(12, ecx1)
+	X86.HasSSE41 = isSet(19, ecx1)
+	X86.HasSSE42 = isSet(20, ecx1)
+	X86.HasPOPCNT = isSet(23, ecx1)
+	X86.HasAES = isSet(25, ecx1)
+	X86.HasOSXSAVE = isSet(27, ecx1)
+
+	osSupportsAVX := false
+	// For XGETBV, OSXSAVE bit is required and sufficient.
+	if X86.HasOSXSAVE {
+		eax, _ := xgetbv()
+		// Check if XMM and YMM registers have OS support.
+		osSupportsAVX = isSet(1, eax) && isSet(2, eax)
+	}
+
+	X86.HasAVX = isSet(28, ecx1) && osSupportsAVX
+
+	if maxID < 7 {
+		return
+	}
+
+	_, ebx7, _, _ := cpuid(7, 0)
+	X86.HasBMI1 = isSet(3, ebx7)
+	X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX
+	X86.HasBMI2 = isSet(8, ebx7)
+	X86.HasERMS = isSet(9, ebx7)
+	X86.HasADX = isSet(19, ebx7)
+}
+
+func isSet(bitpos uint, value uint32) bool {
+	return value&(1<<bitpos) != 0
+}
diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.s b/vendor/golang.org/x/sys/cpu/cpu_x86.s
new file mode 100644
index 0000000000000000000000000000000000000000..4ff61e00d761737a917a36a78445dd3017d961e2
--- /dev/null
+++ b/vendor/golang.org/x/sys/cpu/cpu_x86.s
@@ -0,0 +1,26 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build 386 amd64 amd64p32
+
+#include "textflag.h"
+
+// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32)
+TEXT ·cpuid(SB), NOSPLIT, $0-24
+	MOVL eaxArg+0(FP), AX
+	MOVL ecxArg+4(FP), CX
+	CPUID
+	MOVL AX, eax+8(FP)
+	MOVL BX, ebx+12(FP)
+	MOVL CX, ecx+16(FP)
+	MOVL DX, edx+20(FP)
+	RET
+
+// func xgetbv() (eax, edx uint32)
+TEXT ·xgetbv(SB),NOSPLIT,$0-8
+	MOVL $0, CX
+	XGETBV
+	MOVL AX, eax+0(FP)
+	MOVL DX, edx+4(FP)
+	RET
diff --git a/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s b/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s
index d5ed6726cc14c7dc14fc7b87a49d1905b675e7b4..603dd5728c4a4b41f26ae34834f250d516de5b04 100644
--- a/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s
+++ b/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s
@@ -13,17 +13,17 @@
 // Just jump to package syscall's implementation for all these functions.
 // The runtime may know about them.
 
-TEXT	·Syscall(SB),NOSPLIT,$0-64
+TEXT	·Syscall(SB),NOSPLIT,$0-56
 	JMP	syscall·Syscall(SB)
 
-TEXT	·Syscall6(SB),NOSPLIT,$0-88
+TEXT	·Syscall6(SB),NOSPLIT,$0-80
 	JMP	syscall·Syscall6(SB)
 
-TEXT	·Syscall9(SB),NOSPLIT,$0-112
+TEXT	·Syscall9(SB),NOSPLIT,$0-104
 	JMP	syscall·Syscall9(SB)
 
-TEXT ·RawSyscall(SB),NOSPLIT,$0-64
+TEXT ·RawSyscall(SB),NOSPLIT,$0-56
 	JMP	syscall·RawSyscall(SB)
 
-TEXT	·RawSyscall6(SB),NOSPLIT,$0-88
+TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 	JMP	syscall·RawSyscall6(SB)
diff --git a/vendor/golang.org/x/sys/unix/cap_freebsd.go b/vendor/golang.org/x/sys/unix/cap_freebsd.go
index 83b6bceab438a9b5f92d5df1bc19fa7ebc441ca4..df5204877378c349252b53d796dd3cd9547daeef 100644
--- a/vendor/golang.org/x/sys/unix/cap_freebsd.go
+++ b/vendor/golang.org/x/sys/unix/cap_freebsd.go
@@ -7,7 +7,7 @@
 package unix
 
 import (
-	errorspkg "errors"
+	"errors"
 	"fmt"
 )
 
@@ -60,26 +60,26 @@ func CapRightsSet(rights *CapRights, setrights []uint64) error {
 
 	n := caparsize(rights)
 	if n < capArSizeMin || n > capArSizeMax {
-		return errorspkg.New("bad rights size")
+		return errors.New("bad rights size")
 	}
 
 	for _, right := range setrights {
 		if caprver(right) != CAP_RIGHTS_VERSION_00 {
-			return errorspkg.New("bad right version")
+			return errors.New("bad right version")
 		}
 		i, err := rightToIndex(right)
 		if err != nil {
 			return err
 		}
 		if i >= n {
-			return errorspkg.New("index overflow")
+			return errors.New("index overflow")
 		}
 		if capidxbit(rights.Rights[i]) != capidxbit(right) {
-			return errorspkg.New("index mismatch")
+			return errors.New("index mismatch")
 		}
 		rights.Rights[i] |= right
 		if capidxbit(rights.Rights[i]) != capidxbit(right) {
-			return errorspkg.New("index mismatch (after assign)")
+			return errors.New("index mismatch (after assign)")
 		}
 	}
 
@@ -95,26 +95,26 @@ func CapRightsClear(rights *CapRights, clearrights []uint64) error {
 
 	n := caparsize(rights)
 	if n < capArSizeMin || n > capArSizeMax {
-		return errorspkg.New("bad rights size")
+		return errors.New("bad rights size")
 	}
 
 	for _, right := range clearrights {
 		if caprver(right) != CAP_RIGHTS_VERSION_00 {
-			return errorspkg.New("bad right version")
+			return errors.New("bad right version")
 		}
 		i, err := rightToIndex(right)
 		if err != nil {
 			return err
 		}
 		if i >= n {
-			return errorspkg.New("index overflow")
+			return errors.New("index overflow")
 		}
 		if capidxbit(rights.Rights[i]) != capidxbit(right) {
-			return errorspkg.New("index mismatch")
+			return errors.New("index mismatch")
 		}
 		rights.Rights[i] &= ^(right & 0x01FFFFFFFFFFFFFF)
 		if capidxbit(rights.Rights[i]) != capidxbit(right) {
-			return errorspkg.New("index mismatch (after assign)")
+			return errors.New("index mismatch (after assign)")
 		}
 	}
 
@@ -130,22 +130,22 @@ func CapRightsIsSet(rights *CapRights, setrights []uint64) (bool, error) {
 
 	n := caparsize(rights)
 	if n < capArSizeMin || n > capArSizeMax {
-		return false, errorspkg.New("bad rights size")
+		return false, errors.New("bad rights size")
 	}
 
 	for _, right := range setrights {
 		if caprver(right) != CAP_RIGHTS_VERSION_00 {
-			return false, errorspkg.New("bad right version")
+			return false, errors.New("bad right version")
 		}
 		i, err := rightToIndex(right)
 		if err != nil {
 			return false, err
 		}
 		if i >= n {
-			return false, errorspkg.New("index overflow")
+			return false, errors.New("index overflow")
 		}
 		if capidxbit(rights.Rights[i]) != capidxbit(right) {
-			return false, errorspkg.New("index mismatch")
+			return false, errors.New("index mismatch")
 		}
 		if (rights.Rights[i] & right) != right {
 			return false, nil
diff --git a/vendor/golang.org/x/sys/unix/mkpost.go b/vendor/golang.org/x/sys/unix/mkpost.go
index 23590bda366c108b72b11feba9d2056acf2128d9..7e5c22c47350590ddc4321c41a69ffec434ea6e4 100644
--- a/vendor/golang.org/x/sys/unix/mkpost.go
+++ b/vendor/golang.org/x/sys/unix/mkpost.go
@@ -42,6 +42,10 @@ func main() {
 		log.Fatal(err)
 	}
 
+	// Intentionally export __val fields in Fsid and Sigset_t
+	valRegex := regexp.MustCompile(`type (Fsid|Sigset_t) struct {(\s+)X__val(\s+\S+\s+)}`)
+	b = valRegex.ReplaceAll(b, []byte("type $1 struct {${2}Val$3}"))
+
 	// If we have empty Ptrace structs, we should delete them. Only s390x emits
 	// nonempty Ptrace structs.
 	ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`)
@@ -69,12 +73,9 @@ func main() {
 	removePaddingFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`)
 	b = removePaddingFieldsRegex.ReplaceAll(b, []byte("_"))
 
-	// We refuse to export private fields on s390x
-	if goarch == "s390x" && goos == "linux" {
-		// Remove padding, hidden, or unused fields
-		removeFieldsRegex = regexp.MustCompile(`\bX_\S+`)
-		b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
-	}
+	// Remove padding, hidden, or unused fields
+	removeFieldsRegex = regexp.MustCompile(`\b(X_\S+|Padding)`)
+	b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
 
 	// Remove the first line of warning from cgo
 	b = b[bytes.IndexByte(b, '\n')+1:]
diff --git a/vendor/golang.org/x/sys/unix/openbsd_pledge.go b/vendor/golang.org/x/sys/unix/openbsd_pledge.go
index db4f72ea9c41a764682c463ca24378a87a17709c..9b1e86a12bae62f5e4c6a5c23a21c7de2180e14f 100644
--- a/vendor/golang.org/x/sys/unix/openbsd_pledge.go
+++ b/vendor/golang.org/x/sys/unix/openbsd_pledge.go
@@ -13,7 +13,7 @@ import (
 )
 
 const (
-	SYS_PLEDGE = 108
+	_SYS_PLEDGE = 108
 )
 
 // Pledge implements the pledge syscall. For more information see pledge(2).
@@ -30,7 +30,7 @@ func Pledge(promises string, paths []string) error {
 		}
 		pathsUnsafe = unsafe.Pointer(&pathsPtr[0])
 	}
-	_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(promisesUnsafe), uintptr(pathsUnsafe), 0)
+	_, _, e := syscall.Syscall(_SYS_PLEDGE, uintptr(promisesUnsafe), uintptr(pathsUnsafe), 0)
 	if e != 0 {
 		return e
 	}
diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go
index 006e21f5d0246869f763fba4165d08352e171e69..79e94767deb22a12e13529cf453d40f5b85ac83b 100644
--- a/vendor/golang.org/x/sys/unix/syscall_darwin.go
+++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go
@@ -13,7 +13,7 @@
 package unix
 
 import (
-	errorspkg "errors"
+	"errors"
 	"syscall"
 	"unsafe"
 )
@@ -98,7 +98,7 @@ type attrList struct {
 
 func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) {
 	if len(attrBuf) < 4 {
-		return nil, errorspkg.New("attrBuf too small")
+		return nil, errors.New("attrBuf too small")
 	}
 	attrList.bitmapCount = attrBitMapCount
 
@@ -134,12 +134,12 @@ func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (
 	for i := uint32(0); int(i) < len(dat); {
 		header := dat[i:]
 		if len(header) < 8 {
-			return attrs, errorspkg.New("truncated attribute header")
+			return attrs, errors.New("truncated attribute header")
 		}
 		datOff := *(*int32)(unsafe.Pointer(&header[0]))
 		attrLen := *(*uint32)(unsafe.Pointer(&header[4]))
 		if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) {
-			return attrs, errorspkg.New("truncated results; attrBuf too small")
+			return attrs, errors.New("truncated results; attrBuf too small")
 		}
 		end := uint32(datOff) + attrLen
 		attrs = append(attrs, dat[datOff:end])
@@ -176,6 +176,88 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
 	return
 }
 
+func xattrPointer(dest []byte) *byte {
+	// It's only when dest is set to NULL that the OS X implementations of
+	// getxattr() and listxattr() return the current sizes of the named attributes.
+	// An empty byte array is not sufficient. To maintain the same behaviour as the
+	// linux implementation, we wrap around the system calls and pass in NULL when
+	// dest is empty.
+	var destp *byte
+	if len(dest) > 0 {
+		destp = &dest[0]
+	}
+	return destp
+}
+
+//sys	getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error)
+
+func Getxattr(path string, attr string, dest []byte) (sz int, err error) {
+	return getxattr(path, attr, xattrPointer(dest), len(dest), 0, 0)
+}
+
+func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {
+	return getxattr(link, attr, xattrPointer(dest), len(dest), 0, XATTR_NOFOLLOW)
+}
+
+//sys  setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error)
+
+func Setxattr(path string, attr string, data []byte, flags int) (err error) {
+	// The parameters for the OS X implementation vary slightly compared to the
+	// linux system call, specifically the position parameter:
+	//
+	//  linux:
+	//      int setxattr(
+	//          const char *path,
+	//          const char *name,
+	//          const void *value,
+	//          size_t size,
+	//          int flags
+	//      );
+	//
+	//  darwin:
+	//      int setxattr(
+	//          const char *path,
+	//          const char *name,
+	//          void *value,
+	//          size_t size,
+	//          u_int32_t position,
+	//          int options
+	//      );
+	//
+	// position specifies the offset within the extended attribute. In the
+	// current implementation, only the resource fork extended attribute makes
+	// use of this argument. For all others, position is reserved. We simply
+	// default to setting it to zero.
+	return setxattr(path, attr, xattrPointer(data), len(data), 0, flags)
+}
+
+func Lsetxattr(link string, attr string, data []byte, flags int) (err error) {
+	return setxattr(link, attr, xattrPointer(data), len(data), 0, flags|XATTR_NOFOLLOW)
+}
+
+//sys removexattr(path string, attr string, options int) (err error)
+
+func Removexattr(path string, attr string) (err error) {
+	// We wrap around and explicitly zero out the options provided to the OS X
+	// implementation of removexattr, we do so for interoperability with the
+	// linux variant.
+	return removexattr(path, attr, 0)
+}
+
+func Lremovexattr(link string, attr string) (err error) {
+	return removexattr(link, attr, XATTR_NOFOLLOW)
+}
+
+//sys	listxattr(path string, dest *byte, size int, options int) (sz int, err error)
+
+func Listxattr(path string, dest []byte) (sz int, err error) {
+	return listxattr(path, xattrPointer(dest), len(dest), 0)
+}
+
+func Llistxattr(link string, dest []byte) (sz int, err error) {
+	return listxattr(link, xattrPointer(dest), len(dest), XATTR_NOFOLLOW)
+}
+
 func setattrlistTimes(path string, times []Timespec, flags int) error {
 	_p0, err := BytePtrFromString(path)
 	if err != nil {
@@ -447,13 +529,9 @@ func Uname(uname *Utsname) error {
 // Watchevent
 // Waitevent
 // Modwatch
-// Getxattr
 // Fgetxattr
-// Setxattr
 // Fsetxattr
-// Removexattr
 // Fremovexattr
-// Listxattr
 // Flistxattr
 // Fsctl
 // Initgroups
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go
index a24ba5fbcf7446f78d2873c42233abd06044095e..04f38c53ee113d04545d87c8f0148f2054dceb7a 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux.go
@@ -944,15 +944,17 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
 	}
 	var dummy byte
 	if len(oob) > 0 {
-		var sockType int
-		sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
-		if err != nil {
-			return
-		}
-		// receive at least one normal byte
-		if sockType != SOCK_DGRAM && len(p) == 0 {
-			iov.Base = &dummy
-			iov.SetLen(1)
+		if len(p) == 0 {
+			var sockType int
+			sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
+			if err != nil {
+				return
+			}
+			// receive at least one normal byte
+			if sockType != SOCK_DGRAM {
+				iov.Base = &dummy
+				iov.SetLen(1)
+			}
 		}
 		msg.Control = &oob[0]
 		msg.SetControllen(len(oob))
@@ -996,15 +998,17 @@ func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error)
 	}
 	var dummy byte
 	if len(oob) > 0 {
-		var sockType int
-		sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
-		if err != nil {
-			return 0, err
-		}
-		// send at least one normal byte
-		if sockType != SOCK_DGRAM && len(p) == 0 {
-			iov.Base = &dummy
-			iov.SetLen(1)
+		if len(p) == 0 {
+			var sockType int
+			sockType, err = GetsockoptInt(fd, SOL_SOCKET, SO_TYPE)
+			if err != nil {
+				return 0, err
+			}
+			// send at least one normal byte
+			if sockType != SOCK_DGRAM {
+				iov.Base = &dummy
+				iov.SetLen(1)
+			}
 		}
 		msg.Control = &oob[0]
 		msg.SetControllen(len(oob))
@@ -1260,6 +1264,7 @@ func Getpgrp() (pid int) {
 //sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
 //sys	Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
 //sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
+//sys	PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error)
 //sys	PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
 //sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
 //sys   Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
index 53d38a534289204448f694f1fba3e4131d822be0..d121106323e3ae93d4a01e45903bc12471c9441f 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go
@@ -29,7 +29,15 @@ package unix
 //sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 //sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 //sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
-//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
+
+func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
+	var ts *Timespec
+	if timeout != nil {
+		ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000}
+	}
+	return Pselect(nfd, r, w, e, ts, nil)
+}
+
 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 //sys	Setfsgid(gid int) (err error)
 //sys	Setfsuid(uid int) (err error)
@@ -40,7 +48,12 @@ package unix
 //sysnb	Setreuid(ruid int, euid int) (err error)
 //sys	Shutdown(fd int, how int) (err error)
 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
-//sys	Stat(path string, stat *Stat_t) (err error)
+
+func Stat(path string, stat *Stat_t) (err error) {
+	// Use fstatat, because Android's seccomp policy blocks stat.
+	return Fstatat(AT_FDCWD, path, stat, 0)
+}
+
 //sys	Statfs(path string, buf *Statfs_t) (err error)
 //sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 //sys	Truncate(path string, length int64) (err error)
diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
index 3d5817f6612fc1766741c9fadab5b7e2db467e30..9e16cc9d14ed2b07302e673691ad7e8c48a118d3 100644
--- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
+++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go
@@ -36,7 +36,7 @@ func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr,
 
 //sysnb	Setreuid(ruid int, euid int) (err error)
 //sys	Shutdown(fd int, how int) (err error)
-//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
+//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 
 //sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 //sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go
index 387e1cfcf982fa928ff2214e041e282fdea01ea8..614fcf04945ddf1b86cf909acdc867cfb983171e 100644
--- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go
+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go
@@ -222,6 +222,7 @@ func Uname(uname *Utsname) error {
 //sysnb	Getppid() (ppid int)
 //sys	Getpriority(which int, who int) (prio int, err error)
 //sysnb	Getrlimit(which int, lim *Rlimit) (err error)
+//sysnb	Getrtable() (rtable int, err error)
 //sysnb	Getrusage(who int, rusage *Rusage) (err error)
 //sysnb	Getsid(pid int) (sid int, err error)
 //sysnb	Gettimeofday(tv *Timeval) (err error)
@@ -259,6 +260,7 @@ func Uname(uname *Utsname) error {
 //sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 //sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 //sysnb	Setrlimit(which int, lim *Rlimit) (err error)
+//sysnb	Setrtable(rtable int) (err error)
 //sysnb	Setsid() (pid int, err error)
 //sysnb	Settimeofday(tp *Timeval) (err error)
 //sysnb	Setuid(uid int) (err error)
@@ -307,7 +309,6 @@ func Uname(uname *Utsname) error {
 // getlogin
 // getresgid
 // getresuid
-// getrtable
 // getthrid
 // ktrace
 // lfs_bmapv
@@ -343,7 +344,6 @@ func Uname(uname *Utsname) error {
 // semop
 // setgroups
 // setitimer
-// setrtable
 // setsockopt
 // shmat
 // shmctl
diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go
index 649e67fccc58adef0423485e1deebf07b7e8f316..9a35334cba436894b6337750c4449d48ed3e2768 100644
--- a/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go
@@ -31,3 +31,7 @@ func (msghdr *Msghdr) SetControllen(length int) {
 func (cmsg *Cmsghdr) SetLen(length int) {
 	cmsg.Len = uint32(length)
 }
+
+// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
+// of openbsd/amd64 the syscall is called sysctl instead of __sysctl.
+const SYS___SYSCTL = SYS_SYSCTL
diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go
index 262dc520ea7021c60d41f8a809f6b25d7cdbec96..b835bad0fe47357da17e1cbe4a8e2563b15e84f7 100644
--- a/vendor/golang.org/x/sys/unix/syscall_unix.go
+++ b/vendor/golang.org/x/sys/unix/syscall_unix.go
@@ -9,6 +9,7 @@ package unix
 import (
 	"bytes"
 	"runtime"
+	"sort"
 	"sync"
 	"syscall"
 	"unsafe"
@@ -51,6 +52,28 @@ func errnoErr(e syscall.Errno) error {
 	return e
 }
 
+// ErrnoName returns the error name for error number e.
+func ErrnoName(e syscall.Errno) string {
+	i := sort.Search(len(errorList), func(i int) bool {
+		return errorList[i].num >= e
+	})
+	if i < len(errorList) && errorList[i].num == e {
+		return errorList[i].name
+	}
+	return ""
+}
+
+// SignalName returns the signal name for signal number s.
+func SignalName(s syscall.Signal) string {
+	i := sort.Search(len(signalList), func(i int) bool {
+		return signalList[i].num >= s
+	})
+	if i < len(signalList) && signalList[i].num == s {
+		return signalList[i].name
+	}
+	return ""
+}
+
 // clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte.
 func clen(n []byte) int {
 	i := bytes.IndexByte(n, 0)
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go
index dcba88424b16d95a6ccb0ada1f0677fe1ffff4d8..3b39d7408ad84bd494918a9ca70a766ac65d2e7e 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go
@@ -1473,6 +1473,12 @@ const (
 	WORDSIZE                          = 0x20
 	WSTOPPED                          = 0x8
 	WUNTRACED                         = 0x2
+	XATTR_CREATE                      = 0x2
+	XATTR_NODEFAULT                   = 0x10
+	XATTR_NOFOLLOW                    = 0x1
+	XATTR_NOSECURITY                  = 0x8
+	XATTR_REPLACE                     = 0x4
+	XATTR_SHOWCOMPRESSION             = 0x20
 )
 
 // Errors
@@ -1624,146 +1630,154 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "device not configured",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource deadlock avoided",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "resource busy",
-	17:  "file exists",
-	18:  "cross-device link",
-	19:  "operation not supported by device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "result too large",
-	35:  "resource temporarily unavailable",
-	36:  "operation now in progress",
-	37:  "operation already in progress",
-	38:  "socket operation on non-socket",
-	39:  "destination address required",
-	40:  "message too long",
-	41:  "protocol wrong type for socket",
-	42:  "protocol not available",
-	43:  "protocol not supported",
-	44:  "socket type not supported",
-	45:  "operation not supported",
-	46:  "protocol family not supported",
-	47:  "address family not supported by protocol family",
-	48:  "address already in use",
-	49:  "can't assign requested address",
-	50:  "network is down",
-	51:  "network is unreachable",
-	52:  "network dropped connection on reset",
-	53:  "software caused connection abort",
-	54:  "connection reset by peer",
-	55:  "no buffer space available",
-	56:  "socket is already connected",
-	57:  "socket is not connected",
-	58:  "can't send after socket shutdown",
-	59:  "too many references: can't splice",
-	60:  "operation timed out",
-	61:  "connection refused",
-	62:  "too many levels of symbolic links",
-	63:  "file name too long",
-	64:  "host is down",
-	65:  "no route to host",
-	66:  "directory not empty",
-	67:  "too many processes",
-	68:  "too many users",
-	69:  "disc quota exceeded",
-	70:  "stale NFS file handle",
-	71:  "too many levels of remote in path",
-	72:  "RPC struct is bad",
-	73:  "RPC version wrong",
-	74:  "RPC prog. not avail",
-	75:  "program version wrong",
-	76:  "bad procedure for program",
-	77:  "no locks available",
-	78:  "function not implemented",
-	79:  "inappropriate file type or format",
-	80:  "authentication error",
-	81:  "need authenticator",
-	82:  "device power is off",
-	83:  "device error",
-	84:  "value too large to be stored in data type",
-	85:  "bad executable (or shared library)",
-	86:  "bad CPU type in executable",
-	87:  "shared library version mismatch",
-	88:  "malformed Mach-o file",
-	89:  "operation canceled",
-	90:  "identifier removed",
-	91:  "no message of desired type",
-	92:  "illegal byte sequence",
-	93:  "attribute not found",
-	94:  "bad message",
-	95:  "EMULTIHOP (Reserved)",
-	96:  "no message available on STREAM",
-	97:  "ENOLINK (Reserved)",
-	98:  "no STREAM resources",
-	99:  "not a STREAM",
-	100: "protocol error",
-	101: "STREAM ioctl timeout",
-	102: "operation not supported on socket",
-	103: "policy not found",
-	104: "state not recoverable",
-	105: "previous owner died",
-	106: "interface output queue is full",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "ENOTSUP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EPWROFF", "device power is off"},
+	{83, "EDEVERR", "device error"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "EBADEXEC", "bad executable (or shared library)"},
+	{86, "EBADARCH", "bad CPU type in executable"},
+	{87, "ESHLIBVERS", "shared library version mismatch"},
+	{88, "EBADMACHO", "malformed Mach-o file"},
+	{89, "ECANCELED", "operation canceled"},
+	{90, "EIDRM", "identifier removed"},
+	{91, "ENOMSG", "no message of desired type"},
+	{92, "EILSEQ", "illegal byte sequence"},
+	{93, "ENOATTR", "attribute not found"},
+	{94, "EBADMSG", "bad message"},
+	{95, "EMULTIHOP", "EMULTIHOP (Reserved)"},
+	{96, "ENODATA", "no message available on STREAM"},
+	{97, "ENOLINK", "ENOLINK (Reserved)"},
+	{98, "ENOSR", "no STREAM resources"},
+	{99, "ENOSTR", "not a STREAM"},
+	{100, "EPROTO", "protocol error"},
+	{101, "ETIME", "STREAM ioctl timeout"},
+	{102, "EOPNOTSUPP", "operation not supported on socket"},
+	{103, "ENOPOLICY", "policy not found"},
+	{104, "ENOTRECOVERABLE", "state not recoverable"},
+	{105, "EOWNERDEAD", "previous owner died"},
+	{106, "EQFULL", "interface output queue is full"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGABRT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
index 1a51c963c89bbf62a4b7ab1c62677afe2452ceb1..8fe5547775b2ced15c43edfa5082d6882a1ce0d7 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go
@@ -1473,6 +1473,12 @@ const (
 	WORDSIZE                          = 0x40
 	WSTOPPED                          = 0x8
 	WUNTRACED                         = 0x2
+	XATTR_CREATE                      = 0x2
+	XATTR_NODEFAULT                   = 0x10
+	XATTR_NOFOLLOW                    = 0x1
+	XATTR_NOSECURITY                  = 0x8
+	XATTR_REPLACE                     = 0x4
+	XATTR_SHOWCOMPRESSION             = 0x20
 )
 
 // Errors
@@ -1624,146 +1630,154 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "device not configured",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource deadlock avoided",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "resource busy",
-	17:  "file exists",
-	18:  "cross-device link",
-	19:  "operation not supported by device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "result too large",
-	35:  "resource temporarily unavailable",
-	36:  "operation now in progress",
-	37:  "operation already in progress",
-	38:  "socket operation on non-socket",
-	39:  "destination address required",
-	40:  "message too long",
-	41:  "protocol wrong type for socket",
-	42:  "protocol not available",
-	43:  "protocol not supported",
-	44:  "socket type not supported",
-	45:  "operation not supported",
-	46:  "protocol family not supported",
-	47:  "address family not supported by protocol family",
-	48:  "address already in use",
-	49:  "can't assign requested address",
-	50:  "network is down",
-	51:  "network is unreachable",
-	52:  "network dropped connection on reset",
-	53:  "software caused connection abort",
-	54:  "connection reset by peer",
-	55:  "no buffer space available",
-	56:  "socket is already connected",
-	57:  "socket is not connected",
-	58:  "can't send after socket shutdown",
-	59:  "too many references: can't splice",
-	60:  "operation timed out",
-	61:  "connection refused",
-	62:  "too many levels of symbolic links",
-	63:  "file name too long",
-	64:  "host is down",
-	65:  "no route to host",
-	66:  "directory not empty",
-	67:  "too many processes",
-	68:  "too many users",
-	69:  "disc quota exceeded",
-	70:  "stale NFS file handle",
-	71:  "too many levels of remote in path",
-	72:  "RPC struct is bad",
-	73:  "RPC version wrong",
-	74:  "RPC prog. not avail",
-	75:  "program version wrong",
-	76:  "bad procedure for program",
-	77:  "no locks available",
-	78:  "function not implemented",
-	79:  "inappropriate file type or format",
-	80:  "authentication error",
-	81:  "need authenticator",
-	82:  "device power is off",
-	83:  "device error",
-	84:  "value too large to be stored in data type",
-	85:  "bad executable (or shared library)",
-	86:  "bad CPU type in executable",
-	87:  "shared library version mismatch",
-	88:  "malformed Mach-o file",
-	89:  "operation canceled",
-	90:  "identifier removed",
-	91:  "no message of desired type",
-	92:  "illegal byte sequence",
-	93:  "attribute not found",
-	94:  "bad message",
-	95:  "EMULTIHOP (Reserved)",
-	96:  "no message available on STREAM",
-	97:  "ENOLINK (Reserved)",
-	98:  "no STREAM resources",
-	99:  "not a STREAM",
-	100: "protocol error",
-	101: "STREAM ioctl timeout",
-	102: "operation not supported on socket",
-	103: "policy not found",
-	104: "state not recoverable",
-	105: "previous owner died",
-	106: "interface output queue is full",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "ENOTSUP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EPWROFF", "device power is off"},
+	{83, "EDEVERR", "device error"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "EBADEXEC", "bad executable (or shared library)"},
+	{86, "EBADARCH", "bad CPU type in executable"},
+	{87, "ESHLIBVERS", "shared library version mismatch"},
+	{88, "EBADMACHO", "malformed Mach-o file"},
+	{89, "ECANCELED", "operation canceled"},
+	{90, "EIDRM", "identifier removed"},
+	{91, "ENOMSG", "no message of desired type"},
+	{92, "EILSEQ", "illegal byte sequence"},
+	{93, "ENOATTR", "attribute not found"},
+	{94, "EBADMSG", "bad message"},
+	{95, "EMULTIHOP", "EMULTIHOP (Reserved)"},
+	{96, "ENODATA", "no message available on STREAM"},
+	{97, "ENOLINK", "ENOLINK (Reserved)"},
+	{98, "ENOSR", "no STREAM resources"},
+	{99, "ENOSTR", "not a STREAM"},
+	{100, "EPROTO", "protocol error"},
+	{101, "ETIME", "STREAM ioctl timeout"},
+	{102, "EOPNOTSUPP", "operation not supported on socket"},
+	{103, "ENOPOLICY", "policy not found"},
+	{104, "ENOTRECOVERABLE", "state not recoverable"},
+	{105, "EOWNERDEAD", "previous owner died"},
+	{106, "EQFULL", "interface output queue is full"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGABRT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go
index fa135b17c15044f58e95ffcffacfd2d8599c3150..7a977770d0ade59dc3e1cfdc0b5d4c2f704c0e62 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go
@@ -1473,6 +1473,12 @@ const (
 	WORDSIZE                          = 0x40
 	WSTOPPED                          = 0x8
 	WUNTRACED                         = 0x2
+	XATTR_CREATE                      = 0x2
+	XATTR_NODEFAULT                   = 0x10
+	XATTR_NOFOLLOW                    = 0x1
+	XATTR_NOSECURITY                  = 0x8
+	XATTR_REPLACE                     = 0x4
+	XATTR_SHOWCOMPRESSION             = 0x20
 )
 
 // Errors
@@ -1624,146 +1630,154 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "device not configured",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource deadlock avoided",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "resource busy",
-	17:  "file exists",
-	18:  "cross-device link",
-	19:  "operation not supported by device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "result too large",
-	35:  "resource temporarily unavailable",
-	36:  "operation now in progress",
-	37:  "operation already in progress",
-	38:  "socket operation on non-socket",
-	39:  "destination address required",
-	40:  "message too long",
-	41:  "protocol wrong type for socket",
-	42:  "protocol not available",
-	43:  "protocol not supported",
-	44:  "socket type not supported",
-	45:  "operation not supported",
-	46:  "protocol family not supported",
-	47:  "address family not supported by protocol family",
-	48:  "address already in use",
-	49:  "can't assign requested address",
-	50:  "network is down",
-	51:  "network is unreachable",
-	52:  "network dropped connection on reset",
-	53:  "software caused connection abort",
-	54:  "connection reset by peer",
-	55:  "no buffer space available",
-	56:  "socket is already connected",
-	57:  "socket is not connected",
-	58:  "can't send after socket shutdown",
-	59:  "too many references: can't splice",
-	60:  "operation timed out",
-	61:  "connection refused",
-	62:  "too many levels of symbolic links",
-	63:  "file name too long",
-	64:  "host is down",
-	65:  "no route to host",
-	66:  "directory not empty",
-	67:  "too many processes",
-	68:  "too many users",
-	69:  "disc quota exceeded",
-	70:  "stale NFS file handle",
-	71:  "too many levels of remote in path",
-	72:  "RPC struct is bad",
-	73:  "RPC version wrong",
-	74:  "RPC prog. not avail",
-	75:  "program version wrong",
-	76:  "bad procedure for program",
-	77:  "no locks available",
-	78:  "function not implemented",
-	79:  "inappropriate file type or format",
-	80:  "authentication error",
-	81:  "need authenticator",
-	82:  "device power is off",
-	83:  "device error",
-	84:  "value too large to be stored in data type",
-	85:  "bad executable (or shared library)",
-	86:  "bad CPU type in executable",
-	87:  "shared library version mismatch",
-	88:  "malformed Mach-o file",
-	89:  "operation canceled",
-	90:  "identifier removed",
-	91:  "no message of desired type",
-	92:  "illegal byte sequence",
-	93:  "attribute not found",
-	94:  "bad message",
-	95:  "EMULTIHOP (Reserved)",
-	96:  "no message available on STREAM",
-	97:  "ENOLINK (Reserved)",
-	98:  "no STREAM resources",
-	99:  "not a STREAM",
-	100: "protocol error",
-	101: "STREAM ioctl timeout",
-	102: "operation not supported on socket",
-	103: "policy not found",
-	104: "state not recoverable",
-	105: "previous owner died",
-	106: "interface output queue is full",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "ENOTSUP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EPWROFF", "device power is off"},
+	{83, "EDEVERR", "device error"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "EBADEXEC", "bad executable (or shared library)"},
+	{86, "EBADARCH", "bad CPU type in executable"},
+	{87, "ESHLIBVERS", "shared library version mismatch"},
+	{88, "EBADMACHO", "malformed Mach-o file"},
+	{89, "ECANCELED", "operation canceled"},
+	{90, "EIDRM", "identifier removed"},
+	{91, "ENOMSG", "no message of desired type"},
+	{92, "EILSEQ", "illegal byte sequence"},
+	{93, "ENOATTR", "attribute not found"},
+	{94, "EBADMSG", "bad message"},
+	{95, "EMULTIHOP", "EMULTIHOP (Reserved)"},
+	{96, "ENODATA", "no message available on STREAM"},
+	{97, "ENOLINK", "ENOLINK (Reserved)"},
+	{98, "ENOSR", "no STREAM resources"},
+	{99, "ENOSTR", "not a STREAM"},
+	{100, "EPROTO", "protocol error"},
+	{101, "ETIME", "STREAM ioctl timeout"},
+	{102, "EOPNOTSUPP", "operation not supported on socket"},
+	{103, "ENOPOLICY", "policy not found"},
+	{104, "ENOTRECOVERABLE", "state not recoverable"},
+	{105, "EOWNERDEAD", "previous owner died"},
+	{106, "EQFULL", "interface output queue is full"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGABRT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
index 6419c65e13bb63141307e02a4e3117ede064d8c5..6d56d8a059d17f30478a85ec7ca785391e464d39 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go
@@ -1473,6 +1473,12 @@ const (
 	WORDSIZE                          = 0x40
 	WSTOPPED                          = 0x8
 	WUNTRACED                         = 0x2
+	XATTR_CREATE                      = 0x2
+	XATTR_NODEFAULT                   = 0x10
+	XATTR_NOFOLLOW                    = 0x1
+	XATTR_NOSECURITY                  = 0x8
+	XATTR_REPLACE                     = 0x4
+	XATTR_SHOWCOMPRESSION             = 0x20
 )
 
 // Errors
@@ -1624,146 +1630,154 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "device not configured",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource deadlock avoided",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "resource busy",
-	17:  "file exists",
-	18:  "cross-device link",
-	19:  "operation not supported by device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "result too large",
-	35:  "resource temporarily unavailable",
-	36:  "operation now in progress",
-	37:  "operation already in progress",
-	38:  "socket operation on non-socket",
-	39:  "destination address required",
-	40:  "message too long",
-	41:  "protocol wrong type for socket",
-	42:  "protocol not available",
-	43:  "protocol not supported",
-	44:  "socket type not supported",
-	45:  "operation not supported",
-	46:  "protocol family not supported",
-	47:  "address family not supported by protocol family",
-	48:  "address already in use",
-	49:  "can't assign requested address",
-	50:  "network is down",
-	51:  "network is unreachable",
-	52:  "network dropped connection on reset",
-	53:  "software caused connection abort",
-	54:  "connection reset by peer",
-	55:  "no buffer space available",
-	56:  "socket is already connected",
-	57:  "socket is not connected",
-	58:  "can't send after socket shutdown",
-	59:  "too many references: can't splice",
-	60:  "operation timed out",
-	61:  "connection refused",
-	62:  "too many levels of symbolic links",
-	63:  "file name too long",
-	64:  "host is down",
-	65:  "no route to host",
-	66:  "directory not empty",
-	67:  "too many processes",
-	68:  "too many users",
-	69:  "disc quota exceeded",
-	70:  "stale NFS file handle",
-	71:  "too many levels of remote in path",
-	72:  "RPC struct is bad",
-	73:  "RPC version wrong",
-	74:  "RPC prog. not avail",
-	75:  "program version wrong",
-	76:  "bad procedure for program",
-	77:  "no locks available",
-	78:  "function not implemented",
-	79:  "inappropriate file type or format",
-	80:  "authentication error",
-	81:  "need authenticator",
-	82:  "device power is off",
-	83:  "device error",
-	84:  "value too large to be stored in data type",
-	85:  "bad executable (or shared library)",
-	86:  "bad CPU type in executable",
-	87:  "shared library version mismatch",
-	88:  "malformed Mach-o file",
-	89:  "operation canceled",
-	90:  "identifier removed",
-	91:  "no message of desired type",
-	92:  "illegal byte sequence",
-	93:  "attribute not found",
-	94:  "bad message",
-	95:  "EMULTIHOP (Reserved)",
-	96:  "no message available on STREAM",
-	97:  "ENOLINK (Reserved)",
-	98:  "no STREAM resources",
-	99:  "not a STREAM",
-	100: "protocol error",
-	101: "STREAM ioctl timeout",
-	102: "operation not supported on socket",
-	103: "policy not found",
-	104: "state not recoverable",
-	105: "previous owner died",
-	106: "interface output queue is full",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "ENOTSUP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EPWROFF", "device power is off"},
+	{83, "EDEVERR", "device error"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "EBADEXEC", "bad executable (or shared library)"},
+	{86, "EBADARCH", "bad CPU type in executable"},
+	{87, "ESHLIBVERS", "shared library version mismatch"},
+	{88, "EBADMACHO", "malformed Mach-o file"},
+	{89, "ECANCELED", "operation canceled"},
+	{90, "EIDRM", "identifier removed"},
+	{91, "ENOMSG", "no message of desired type"},
+	{92, "EILSEQ", "illegal byte sequence"},
+	{93, "ENOATTR", "attribute not found"},
+	{94, "EBADMSG", "bad message"},
+	{95, "EMULTIHOP", "EMULTIHOP (Reserved)"},
+	{96, "ENODATA", "no message available on STREAM"},
+	{97, "ENOLINK", "ENOLINK (Reserved)"},
+	{98, "ENOSR", "no STREAM resources"},
+	{99, "ENOSTR", "not a STREAM"},
+	{100, "EPROTO", "protocol error"},
+	{101, "ETIME", "STREAM ioctl timeout"},
+	{102, "EOPNOTSUPP", "operation not supported on socket"},
+	{103, "ENOPOLICY", "policy not found"},
+	{104, "ENOTRECOVERABLE", "state not recoverable"},
+	{105, "EOWNERDEAD", "previous owner died"},
+	{106, "EQFULL", "interface output queue is full"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGABRT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
index 474441b808da1a93fd51d9279b1d1a2a4ae977ba..46a082b6d59f267833c29fce68ea2c5ea7994849 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go
@@ -1437,142 +1437,150 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "operation timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "identifier removed",
-	83: "no message of desired type",
-	84: "value too large to be stored in data type",
-	85: "operation canceled",
-	86: "illegal byte sequence",
-	87: "attribute not found",
-	88: "programming error",
-	89: "bad message",
-	90: "multihop attempted",
-	91: "link has been severed",
-	92: "protocol error",
-	93: "no medium found",
-	94: "unknown error: 94",
-	95: "unknown error: 95",
-	96: "unknown error: 96",
-	97: "unknown error: 97",
-	98: "unknown error: 98",
-	99: "unknown error: 99",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EWOULDBLOCK", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIDRM", "identifier removed"},
+	{83, "ENOMSG", "no message of desired type"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "ECANCELED", "operation canceled"},
+	{86, "EILSEQ", "illegal byte sequence"},
+	{87, "ENOATTR", "attribute not found"},
+	{88, "EDOOFUS", "programming error"},
+	{89, "EBADMSG", "bad message"},
+	{90, "EMULTIHOP", "multihop attempted"},
+	{91, "ENOLINK", "link has been severed"},
+	{92, "EPROTO", "protocol error"},
+	{93, "ENOMEDIUM", "no medium found"},
+	{94, "EUNUSED94", "unknown error: 94"},
+	{95, "EUNUSED95", "unknown error: 95"},
+	{96, "EUNUSED96", "unknown error: 96"},
+	{97, "EUNUSED97", "unknown error: 97"},
+	{98, "EUNUSED98", "unknown error: 98"},
+	{99, "ELAST", "unknown error: 99"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "thread Scheduler",
-	33: "checkPoint",
-	34: "checkPointExit",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGIOT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGTHR", "thread Scheduler"},
+	{33, "SIGCKPT", "checkPoint"},
+	{34, "SIGCKPTEXIT", "checkPointExit"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
index a8b05878e387eafd34385e37651299f467cb7e11..2947dc0382e4db808b45aefcbd277a9e7b5a9a2a 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go
@@ -1619,138 +1619,146 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "operation timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "identifier removed",
-	83: "no message of desired type",
-	84: "value too large to be stored in data type",
-	85: "operation canceled",
-	86: "illegal byte sequence",
-	87: "attribute not found",
-	88: "programming error",
-	89: "bad message",
-	90: "multihop attempted",
-	91: "link has been severed",
-	92: "protocol error",
-	93: "capabilities insufficient",
-	94: "not permitted in capability mode",
-	95: "state not recoverable",
-	96: "previous owner died",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIDRM", "identifier removed"},
+	{83, "ENOMSG", "no message of desired type"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "ECANCELED", "operation canceled"},
+	{86, "EILSEQ", "illegal byte sequence"},
+	{87, "ENOATTR", "attribute not found"},
+	{88, "EDOOFUS", "programming error"},
+	{89, "EBADMSG", "bad message"},
+	{90, "EMULTIHOP", "multihop attempted"},
+	{91, "ENOLINK", "link has been severed"},
+	{92, "EPROTO", "protocol error"},
+	{93, "ENOTCAPABLE", "capabilities insufficient"},
+	{94, "ECAPMODE", "not permitted in capability mode"},
+	{95, "ENOTRECOVERABLE", "state not recoverable"},
+	{96, "EOWNERDEAD", "previous owner died"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "unknown signal",
-	33: "unknown signal",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGIOT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGTHR", "unknown signal"},
+	{33, "SIGLIBRT", "unknown signal"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
index cf5f01260e5ec423fd80b5bebe0f5ab984211c4f..c600d012d069deafa330d72a5669ab2744f3b774 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go
@@ -1620,138 +1620,146 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "operation timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "identifier removed",
-	83: "no message of desired type",
-	84: "value too large to be stored in data type",
-	85: "operation canceled",
-	86: "illegal byte sequence",
-	87: "attribute not found",
-	88: "programming error",
-	89: "bad message",
-	90: "multihop attempted",
-	91: "link has been severed",
-	92: "protocol error",
-	93: "capabilities insufficient",
-	94: "not permitted in capability mode",
-	95: "state not recoverable",
-	96: "previous owner died",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIDRM", "identifier removed"},
+	{83, "ENOMSG", "no message of desired type"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "ECANCELED", "operation canceled"},
+	{86, "EILSEQ", "illegal byte sequence"},
+	{87, "ENOATTR", "attribute not found"},
+	{88, "EDOOFUS", "programming error"},
+	{89, "EBADMSG", "bad message"},
+	{90, "EMULTIHOP", "multihop attempted"},
+	{91, "ENOLINK", "link has been severed"},
+	{92, "EPROTO", "protocol error"},
+	{93, "ENOTCAPABLE", "capabilities insufficient"},
+	{94, "ECAPMODE", "not permitted in capability mode"},
+	{95, "ENOTRECOVERABLE", "state not recoverable"},
+	{96, "EOWNERDEAD", "previous owner died"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "unknown signal",
-	33: "unknown signal",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGIOT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGTHR", "unknown signal"},
+	{33, "SIGLIBRT", "unknown signal"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
index 9bbb90ad8a05e4a61cd0d57fa3ada7e8815dd943..e8240d2397b2e21f11382a6edfe14d98f4685e9d 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go
@@ -1628,138 +1628,146 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "operation timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "identifier removed",
-	83: "no message of desired type",
-	84: "value too large to be stored in data type",
-	85: "operation canceled",
-	86: "illegal byte sequence",
-	87: "attribute not found",
-	88: "programming error",
-	89: "bad message",
-	90: "multihop attempted",
-	91: "link has been severed",
-	92: "protocol error",
-	93: "capabilities insufficient",
-	94: "not permitted in capability mode",
-	95: "state not recoverable",
-	96: "previous owner died",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIDRM", "identifier removed"},
+	{83, "ENOMSG", "no message of desired type"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "ECANCELED", "operation canceled"},
+	{86, "EILSEQ", "illegal byte sequence"},
+	{87, "ENOATTR", "attribute not found"},
+	{88, "EDOOFUS", "programming error"},
+	{89, "EBADMSG", "bad message"},
+	{90, "EMULTIHOP", "multihop attempted"},
+	{91, "ENOLINK", "link has been severed"},
+	{92, "EPROTO", "protocol error"},
+	{93, "ENOTCAPABLE", "capabilities insufficient"},
+	{94, "ECAPMODE", "not permitted in capability mode"},
+	{95, "ENOTRECOVERABLE", "state not recoverable"},
+	{96, "EOWNERDEAD", "previous owner died"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "suspended (signal)",
-	18: "suspended",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "unknown signal",
-	33: "unknown signal",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGIOT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGTHR", "unknown signal"},
+	{33, "SIGLIBRT", "unknown signal"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
index 68de61b8c3ffcd7f16b8c0c5245161ddc85173d6..ee17d4bd4a570580827c48d8cb286b5053a95506 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x80041270
 	BLKBSZSET                            = 0x40041271
 	BLKFLSBUF                            = 0x1261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x800
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -462,6 +490,7 @@ const (
 	FF1                                  = 0x8000
 	FFDLY                                = 0x8000
 	FLUSHO                               = 0x1000
+	FP_XSTATE_MAGIC2                     = 0x46505845
 	FS_ENCRYPTION_MODE_AES_128_CBC       = 0x5
 	FS_ENCRYPTION_MODE_AES_128_CTS       = 0x6
 	FS_ENCRYPTION_MODE_AES_256_CBC       = 0x3
@@ -482,6 +511,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +573,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +866,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -895,9 +970,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -957,7 +1038,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -992,6 +1075,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1024,6 +1138,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1031,7 +1147,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x400
 	O_ASYNC                              = 0x2000
@@ -1124,9 +1242,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x40042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x40042406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x2405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1232,6 +1352,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1291,6 +1412,11 @@ const (
 	PTRACE_SYSEMU                        = 0x1f
 	PTRACE_SYSEMU_SINGLESTEP             = 0x20
 	PTRACE_TRACEME                       = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1476,6 +1602,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1560,6 +1688,23 @@ const (
 	SIOCSPGRP                            = 0x8902
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x2
@@ -1670,6 +1815,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1691,6 +1838,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1872,7 +2020,27 @@ const (
 	TIOCSTI                              = 0x5412
 	TIOCSWINSZ                           = 0x5414
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x100
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x400854d5
 	TUNDETACHFILTER                      = 0x400854d6
@@ -1900,9 +2068,12 @@ const (
 	TUNSETVNETBE                         = 0x400454de
 	TUNSETVNETHDRSZ                      = 0x400454d8
 	TUNSETVNETLE                         = 0x400454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x4
 	VEOL                                 = 0xb
@@ -1944,16 +2115,99 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
 	WORDSIZE                             = 0x20
 	WSTOPPED                             = 0x2
 	WUNTRACED                            = 0x2
+	X86_FXSR_MAGIC                       = 0x0
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2133,171 +2387,179 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "no such device or address",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device or resource busy",
-	17:  "file exists",
-	18:  "invalid cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "numerical result out of range",
-	35:  "resource deadlock avoided",
-	36:  "file name too long",
-	37:  "no locks available",
-	38:  "function not implemented",
-	39:  "directory not empty",
-	40:  "too many levels of symbolic links",
-	42:  "no message of desired type",
-	43:  "identifier removed",
-	44:  "channel number out of range",
-	45:  "level 2 not synchronized",
-	46:  "level 3 halted",
-	47:  "level 3 reset",
-	48:  "link number out of range",
-	49:  "protocol driver not attached",
-	50:  "no CSI structure available",
-	51:  "level 2 halted",
-	52:  "invalid exchange",
-	53:  "invalid request descriptor",
-	54:  "exchange full",
-	55:  "no anode",
-	56:  "invalid request code",
-	57:  "invalid slot",
-	59:  "bad font file format",
-	60:  "device not a stream",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of streams resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "multihop attempted",
-	73:  "RFS specific error",
-	74:  "bad message",
-	75:  "value too large for defined data type",
-	76:  "name not unique on network",
-	77:  "file descriptor in bad state",
-	78:  "remote address changed",
-	79:  "can not access a needed shared library",
-	80:  "accessing a corrupted shared library",
-	81:  ".lib section in a.out corrupted",
-	82:  "attempting to link in too many shared libraries",
-	83:  "cannot exec a shared library directly",
-	84:  "invalid or incomplete multibyte or wide character",
-	85:  "interrupted system call should be restarted",
-	86:  "streams pipe error",
-	87:  "too many users",
-	88:  "socket operation on non-socket",
-	89:  "destination address required",
-	90:  "message too long",
-	91:  "protocol wrong type for socket",
-	92:  "protocol not available",
-	93:  "protocol not supported",
-	94:  "socket type not supported",
-	95:  "operation not supported",
-	96:  "protocol family not supported",
-	97:  "address family not supported by protocol",
-	98:  "address already in use",
-	99:  "cannot assign requested address",
-	100: "network is down",
-	101: "network is unreachable",
-	102: "network dropped connection on reset",
-	103: "software caused connection abort",
-	104: "connection reset by peer",
-	105: "no buffer space available",
-	106: "transport endpoint is already connected",
-	107: "transport endpoint is not connected",
-	108: "cannot send after transport endpoint shutdown",
-	109: "too many references: cannot splice",
-	110: "connection timed out",
-	111: "connection refused",
-	112: "host is down",
-	113: "no route to host",
-	114: "operation already in progress",
-	115: "operation now in progress",
-	116: "stale file handle",
-	117: "structure needs cleaning",
-	118: "not a XENIX named type file",
-	119: "no XENIX semaphores available",
-	120: "is a named type file",
-	121: "remote I/O error",
-	122: "disk quota exceeded",
-	123: "no medium found",
-	124: "wrong medium type",
-	125: "operation canceled",
-	126: "required key not available",
-	127: "key has expired",
-	128: "key has been revoked",
-	129: "key was rejected by service",
-	130: "owner died",
-	131: "state not recoverable",
-	132: "operation not possible due to RF-kill",
-	133: "memory page has hardware error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "EDEADLK", "resource deadlock avoided"},
+	{36, "ENAMETOOLONG", "file name too long"},
+	{37, "ENOLCK", "no locks available"},
+	{38, "ENOSYS", "function not implemented"},
+	{39, "ENOTEMPTY", "directory not empty"},
+	{40, "ELOOP", "too many levels of symbolic links"},
+	{42, "ENOMSG", "no message of desired type"},
+	{43, "EIDRM", "identifier removed"},
+	{44, "ECHRNG", "channel number out of range"},
+	{45, "EL2NSYNC", "level 2 not synchronized"},
+	{46, "EL3HLT", "level 3 halted"},
+	{47, "EL3RST", "level 3 reset"},
+	{48, "ELNRNG", "link number out of range"},
+	{49, "EUNATCH", "protocol driver not attached"},
+	{50, "ENOCSI", "no CSI structure available"},
+	{51, "EL2HLT", "level 2 halted"},
+	{52, "EBADE", "invalid exchange"},
+	{53, "EBADR", "invalid request descriptor"},
+	{54, "EXFULL", "exchange full"},
+	{55, "ENOANO", "no anode"},
+	{56, "EBADRQC", "invalid request code"},
+	{57, "EBADSLT", "invalid slot"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "EMULTIHOP", "multihop attempted"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EBADMSG", "bad message"},
+	{75, "EOVERFLOW", "value too large for defined data type"},
+	{76, "ENOTUNIQ", "name not unique on network"},
+	{77, "EBADFD", "file descriptor in bad state"},
+	{78, "EREMCHG", "remote address changed"},
+	{79, "ELIBACC", "can not access a needed shared library"},
+	{80, "ELIBBAD", "accessing a corrupted shared library"},
+	{81, "ELIBSCN", ".lib section in a.out corrupted"},
+	{82, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{83, "ELIBEXEC", "cannot exec a shared library directly"},
+	{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{85, "ERESTART", "interrupted system call should be restarted"},
+	{86, "ESTRPIPE", "streams pipe error"},
+	{87, "EUSERS", "too many users"},
+	{88, "ENOTSOCK", "socket operation on non-socket"},
+	{89, "EDESTADDRREQ", "destination address required"},
+	{90, "EMSGSIZE", "message too long"},
+	{91, "EPROTOTYPE", "protocol wrong type for socket"},
+	{92, "ENOPROTOOPT", "protocol not available"},
+	{93, "EPROTONOSUPPORT", "protocol not supported"},
+	{94, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{95, "ENOTSUP", "operation not supported"},
+	{96, "EPFNOSUPPORT", "protocol family not supported"},
+	{97, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{98, "EADDRINUSE", "address already in use"},
+	{99, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{100, "ENETDOWN", "network is down"},
+	{101, "ENETUNREACH", "network is unreachable"},
+	{102, "ENETRESET", "network dropped connection on reset"},
+	{103, "ECONNABORTED", "software caused connection abort"},
+	{104, "ECONNRESET", "connection reset by peer"},
+	{105, "ENOBUFS", "no buffer space available"},
+	{106, "EISCONN", "transport endpoint is already connected"},
+	{107, "ENOTCONN", "transport endpoint is not connected"},
+	{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{109, "ETOOMANYREFS", "too many references: cannot splice"},
+	{110, "ETIMEDOUT", "connection timed out"},
+	{111, "ECONNREFUSED", "connection refused"},
+	{112, "EHOSTDOWN", "host is down"},
+	{113, "EHOSTUNREACH", "no route to host"},
+	{114, "EALREADY", "operation already in progress"},
+	{115, "EINPROGRESS", "operation now in progress"},
+	{116, "ESTALE", "stale file handle"},
+	{117, "EUCLEAN", "structure needs cleaning"},
+	{118, "ENOTNAM", "not a XENIX named type file"},
+	{119, "ENAVAIL", "no XENIX semaphores available"},
+	{120, "EISNAM", "is a named type file"},
+	{121, "EREMOTEIO", "remote I/O error"},
+	{122, "EDQUOT", "disk quota exceeded"},
+	{123, "ENOMEDIUM", "no medium found"},
+	{124, "EMEDIUMTYPE", "wrong medium type"},
+	{125, "ECANCELED", "operation canceled"},
+	{126, "ENOKEY", "required key not available"},
+	{127, "EKEYEXPIRED", "key has expired"},
+	{128, "EKEYREVOKED", "key has been revoked"},
+	{129, "EKEYREJECTED", "key was rejected by service"},
+	{130, "EOWNERDEAD", "owner died"},
+	{131, "ENOTRECOVERABLE", "state not recoverable"},
+	{132, "ERFKILL", "operation not possible due to RF-kill"},
+	{133, "EHWPOISON", "memory page has hardware error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "bus error",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "user defined signal 1",
-	11: "segmentation fault",
-	12: "user defined signal 2",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "stack fault",
-	17: "child exited",
-	18: "continued",
-	19: "stopped (signal)",
-	20: "stopped",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "urgent I/O condition",
-	24: "CPU time limit exceeded",
-	25: "file size limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window changed",
-	29: "I/O possible",
-	30: "power failure",
-	31: "bad system call",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGBUS", "bus error"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGUSR1", "user defined signal 1"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGUSR2", "user defined signal 2"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGSTKFLT", "stack fault"},
+	{17, "SIGCHLD", "child exited"},
+	{18, "SIGCONT", "continued"},
+	{19, "SIGSTOP", "stopped (signal)"},
+	{20, "SIGTSTP", "stopped"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGURG", "urgent I/O condition"},
+	{24, "SIGXCPU", "CPU time limit exceeded"},
+	{25, "SIGXFSZ", "file size limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window changed"},
+	{29, "SIGIO", "I/O possible"},
+	{30, "SIGPWR", "power failure"},
+	{31, "SIGSYS", "bad system call"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
index a5748ae9e96eb98c3211f0561ce6a80de6e6d64c..64ab9f40ade43af4a6a6a60d1affc43a53283a4b 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x80081270
 	BLKBSZSET                            = 0x40081271
 	BLKFLSBUF                            = 0x1261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x800
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -462,6 +490,7 @@ const (
 	FF1                                  = 0x8000
 	FFDLY                                = 0x8000
 	FLUSHO                               = 0x1000
+	FP_XSTATE_MAGIC2                     = 0x46505845
 	FS_ENCRYPTION_MODE_AES_128_CBC       = 0x5
 	FS_ENCRYPTION_MODE_AES_128_CTS       = 0x6
 	FS_ENCRYPTION_MODE_AES_256_CBC       = 0x3
@@ -482,6 +511,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +573,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +866,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -895,9 +970,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -957,7 +1038,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -992,6 +1075,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1024,6 +1138,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1031,7 +1147,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x400
 	O_ASYNC                              = 0x2000
@@ -1124,9 +1242,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x40042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x40082406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x2405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1232,6 +1352,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ARCH_PRCTL                    = 0x1e
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
@@ -1292,6 +1413,11 @@ const (
 	PTRACE_SYSEMU                        = 0x1f
 	PTRACE_SYSEMU_SINGLESTEP             = 0x20
 	PTRACE_TRACEME                       = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1477,6 +1603,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1561,6 +1689,23 @@ const (
 	SIOCSPGRP                            = 0x8902
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x2
@@ -1671,6 +1816,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1692,6 +1839,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1873,7 +2021,27 @@ const (
 	TIOCSTI                              = 0x5412
 	TIOCSWINSZ                           = 0x5414
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x100
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x401054d5
 	TUNDETACHFILTER                      = 0x401054d6
@@ -1901,9 +2069,12 @@ const (
 	TUNSETVNETBE                         = 0x400454de
 	TUNSETVNETHDRSZ                      = 0x400454d8
 	TUNSETVNETLE                         = 0x400454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x4
 	VEOL                                 = 0xb
@@ -1945,6 +2116,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -1954,7 +2205,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2134,171 +2387,179 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "no such device or address",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device or resource busy",
-	17:  "file exists",
-	18:  "invalid cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "numerical result out of range",
-	35:  "resource deadlock avoided",
-	36:  "file name too long",
-	37:  "no locks available",
-	38:  "function not implemented",
-	39:  "directory not empty",
-	40:  "too many levels of symbolic links",
-	42:  "no message of desired type",
-	43:  "identifier removed",
-	44:  "channel number out of range",
-	45:  "level 2 not synchronized",
-	46:  "level 3 halted",
-	47:  "level 3 reset",
-	48:  "link number out of range",
-	49:  "protocol driver not attached",
-	50:  "no CSI structure available",
-	51:  "level 2 halted",
-	52:  "invalid exchange",
-	53:  "invalid request descriptor",
-	54:  "exchange full",
-	55:  "no anode",
-	56:  "invalid request code",
-	57:  "invalid slot",
-	59:  "bad font file format",
-	60:  "device not a stream",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of streams resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "multihop attempted",
-	73:  "RFS specific error",
-	74:  "bad message",
-	75:  "value too large for defined data type",
-	76:  "name not unique on network",
-	77:  "file descriptor in bad state",
-	78:  "remote address changed",
-	79:  "can not access a needed shared library",
-	80:  "accessing a corrupted shared library",
-	81:  ".lib section in a.out corrupted",
-	82:  "attempting to link in too many shared libraries",
-	83:  "cannot exec a shared library directly",
-	84:  "invalid or incomplete multibyte or wide character",
-	85:  "interrupted system call should be restarted",
-	86:  "streams pipe error",
-	87:  "too many users",
-	88:  "socket operation on non-socket",
-	89:  "destination address required",
-	90:  "message too long",
-	91:  "protocol wrong type for socket",
-	92:  "protocol not available",
-	93:  "protocol not supported",
-	94:  "socket type not supported",
-	95:  "operation not supported",
-	96:  "protocol family not supported",
-	97:  "address family not supported by protocol",
-	98:  "address already in use",
-	99:  "cannot assign requested address",
-	100: "network is down",
-	101: "network is unreachable",
-	102: "network dropped connection on reset",
-	103: "software caused connection abort",
-	104: "connection reset by peer",
-	105: "no buffer space available",
-	106: "transport endpoint is already connected",
-	107: "transport endpoint is not connected",
-	108: "cannot send after transport endpoint shutdown",
-	109: "too many references: cannot splice",
-	110: "connection timed out",
-	111: "connection refused",
-	112: "host is down",
-	113: "no route to host",
-	114: "operation already in progress",
-	115: "operation now in progress",
-	116: "stale file handle",
-	117: "structure needs cleaning",
-	118: "not a XENIX named type file",
-	119: "no XENIX semaphores available",
-	120: "is a named type file",
-	121: "remote I/O error",
-	122: "disk quota exceeded",
-	123: "no medium found",
-	124: "wrong medium type",
-	125: "operation canceled",
-	126: "required key not available",
-	127: "key has expired",
-	128: "key has been revoked",
-	129: "key was rejected by service",
-	130: "owner died",
-	131: "state not recoverable",
-	132: "operation not possible due to RF-kill",
-	133: "memory page has hardware error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "EDEADLK", "resource deadlock avoided"},
+	{36, "ENAMETOOLONG", "file name too long"},
+	{37, "ENOLCK", "no locks available"},
+	{38, "ENOSYS", "function not implemented"},
+	{39, "ENOTEMPTY", "directory not empty"},
+	{40, "ELOOP", "too many levels of symbolic links"},
+	{42, "ENOMSG", "no message of desired type"},
+	{43, "EIDRM", "identifier removed"},
+	{44, "ECHRNG", "channel number out of range"},
+	{45, "EL2NSYNC", "level 2 not synchronized"},
+	{46, "EL3HLT", "level 3 halted"},
+	{47, "EL3RST", "level 3 reset"},
+	{48, "ELNRNG", "link number out of range"},
+	{49, "EUNATCH", "protocol driver not attached"},
+	{50, "ENOCSI", "no CSI structure available"},
+	{51, "EL2HLT", "level 2 halted"},
+	{52, "EBADE", "invalid exchange"},
+	{53, "EBADR", "invalid request descriptor"},
+	{54, "EXFULL", "exchange full"},
+	{55, "ENOANO", "no anode"},
+	{56, "EBADRQC", "invalid request code"},
+	{57, "EBADSLT", "invalid slot"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "EMULTIHOP", "multihop attempted"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EBADMSG", "bad message"},
+	{75, "EOVERFLOW", "value too large for defined data type"},
+	{76, "ENOTUNIQ", "name not unique on network"},
+	{77, "EBADFD", "file descriptor in bad state"},
+	{78, "EREMCHG", "remote address changed"},
+	{79, "ELIBACC", "can not access a needed shared library"},
+	{80, "ELIBBAD", "accessing a corrupted shared library"},
+	{81, "ELIBSCN", ".lib section in a.out corrupted"},
+	{82, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{83, "ELIBEXEC", "cannot exec a shared library directly"},
+	{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{85, "ERESTART", "interrupted system call should be restarted"},
+	{86, "ESTRPIPE", "streams pipe error"},
+	{87, "EUSERS", "too many users"},
+	{88, "ENOTSOCK", "socket operation on non-socket"},
+	{89, "EDESTADDRREQ", "destination address required"},
+	{90, "EMSGSIZE", "message too long"},
+	{91, "EPROTOTYPE", "protocol wrong type for socket"},
+	{92, "ENOPROTOOPT", "protocol not available"},
+	{93, "EPROTONOSUPPORT", "protocol not supported"},
+	{94, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{95, "ENOTSUP", "operation not supported"},
+	{96, "EPFNOSUPPORT", "protocol family not supported"},
+	{97, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{98, "EADDRINUSE", "address already in use"},
+	{99, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{100, "ENETDOWN", "network is down"},
+	{101, "ENETUNREACH", "network is unreachable"},
+	{102, "ENETRESET", "network dropped connection on reset"},
+	{103, "ECONNABORTED", "software caused connection abort"},
+	{104, "ECONNRESET", "connection reset by peer"},
+	{105, "ENOBUFS", "no buffer space available"},
+	{106, "EISCONN", "transport endpoint is already connected"},
+	{107, "ENOTCONN", "transport endpoint is not connected"},
+	{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{109, "ETOOMANYREFS", "too many references: cannot splice"},
+	{110, "ETIMEDOUT", "connection timed out"},
+	{111, "ECONNREFUSED", "connection refused"},
+	{112, "EHOSTDOWN", "host is down"},
+	{113, "EHOSTUNREACH", "no route to host"},
+	{114, "EALREADY", "operation already in progress"},
+	{115, "EINPROGRESS", "operation now in progress"},
+	{116, "ESTALE", "stale file handle"},
+	{117, "EUCLEAN", "structure needs cleaning"},
+	{118, "ENOTNAM", "not a XENIX named type file"},
+	{119, "ENAVAIL", "no XENIX semaphores available"},
+	{120, "EISNAM", "is a named type file"},
+	{121, "EREMOTEIO", "remote I/O error"},
+	{122, "EDQUOT", "disk quota exceeded"},
+	{123, "ENOMEDIUM", "no medium found"},
+	{124, "EMEDIUMTYPE", "wrong medium type"},
+	{125, "ECANCELED", "operation canceled"},
+	{126, "ENOKEY", "required key not available"},
+	{127, "EKEYEXPIRED", "key has expired"},
+	{128, "EKEYREVOKED", "key has been revoked"},
+	{129, "EKEYREJECTED", "key was rejected by service"},
+	{130, "EOWNERDEAD", "owner died"},
+	{131, "ENOTRECOVERABLE", "state not recoverable"},
+	{132, "ERFKILL", "operation not possible due to RF-kill"},
+	{133, "EHWPOISON", "memory page has hardware error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "bus error",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "user defined signal 1",
-	11: "segmentation fault",
-	12: "user defined signal 2",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "stack fault",
-	17: "child exited",
-	18: "continued",
-	19: "stopped (signal)",
-	20: "stopped",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "urgent I/O condition",
-	24: "CPU time limit exceeded",
-	25: "file size limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window changed",
-	29: "I/O possible",
-	30: "power failure",
-	31: "bad system call",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGBUS", "bus error"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGUSR1", "user defined signal 1"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGUSR2", "user defined signal 2"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGSTKFLT", "stack fault"},
+	{17, "SIGCHLD", "child exited"},
+	{18, "SIGCONT", "continued"},
+	{19, "SIGSTOP", "stopped (signal)"},
+	{20, "SIGTSTP", "stopped"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGURG", "urgent I/O condition"},
+	{24, "SIGXCPU", "CPU time limit exceeded"},
+	{25, "SIGXFSZ", "file size limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window changed"},
+	{29, "SIGIO", "I/O possible"},
+	{30, "SIGPWR", "power failure"},
+	{31, "SIGSYS", "bad system call"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
index 6d9fc7e943dd23a227b8a887a796a289ca13b282..6ae0ac6f86282af33a3eb9444f2cdfc03c40f180 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x80041270
 	BLKBSZSET                            = 0x40041271
 	BLKFLSBUF                            = 0x1261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x800
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -894,9 +968,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -956,7 +1036,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -991,6 +1073,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1023,6 +1136,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1030,7 +1145,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x400
 	O_ASYNC                              = 0x2000
@@ -1123,9 +1240,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x40042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x40042406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x2405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1231,6 +1350,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1299,6 +1419,11 @@ const (
 	PT_DATA_ADDR                         = 0x10004
 	PT_TEXT_ADDR                         = 0x10000
 	PT_TEXT_END_ADDR                     = 0x10008
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1484,6 +1609,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1568,6 +1695,23 @@ const (
 	SIOCSPGRP                            = 0x8902
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x2
@@ -1678,6 +1822,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1699,6 +1845,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1880,7 +2027,27 @@ const (
 	TIOCSTI                              = 0x5412
 	TIOCSWINSZ                           = 0x5414
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x100
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x400854d5
 	TUNDETACHFILTER                      = 0x400854d6
@@ -1908,9 +2075,12 @@ const (
 	TUNSETVNETBE                         = 0x400454de
 	TUNSETVNETHDRSZ                      = 0x400454d8
 	TUNSETVNETLE                         = 0x400454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x4
 	VEOL                                 = 0xb
@@ -1952,6 +2122,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -1961,7 +2211,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2141,171 +2393,179 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "no such device or address",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device or resource busy",
-	17:  "file exists",
-	18:  "invalid cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "numerical result out of range",
-	35:  "resource deadlock avoided",
-	36:  "file name too long",
-	37:  "no locks available",
-	38:  "function not implemented",
-	39:  "directory not empty",
-	40:  "too many levels of symbolic links",
-	42:  "no message of desired type",
-	43:  "identifier removed",
-	44:  "channel number out of range",
-	45:  "level 2 not synchronized",
-	46:  "level 3 halted",
-	47:  "level 3 reset",
-	48:  "link number out of range",
-	49:  "protocol driver not attached",
-	50:  "no CSI structure available",
-	51:  "level 2 halted",
-	52:  "invalid exchange",
-	53:  "invalid request descriptor",
-	54:  "exchange full",
-	55:  "no anode",
-	56:  "invalid request code",
-	57:  "invalid slot",
-	59:  "bad font file format",
-	60:  "device not a stream",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of streams resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "multihop attempted",
-	73:  "RFS specific error",
-	74:  "bad message",
-	75:  "value too large for defined data type",
-	76:  "name not unique on network",
-	77:  "file descriptor in bad state",
-	78:  "remote address changed",
-	79:  "can not access a needed shared library",
-	80:  "accessing a corrupted shared library",
-	81:  ".lib section in a.out corrupted",
-	82:  "attempting to link in too many shared libraries",
-	83:  "cannot exec a shared library directly",
-	84:  "invalid or incomplete multibyte or wide character",
-	85:  "interrupted system call should be restarted",
-	86:  "streams pipe error",
-	87:  "too many users",
-	88:  "socket operation on non-socket",
-	89:  "destination address required",
-	90:  "message too long",
-	91:  "protocol wrong type for socket",
-	92:  "protocol not available",
-	93:  "protocol not supported",
-	94:  "socket type not supported",
-	95:  "operation not supported",
-	96:  "protocol family not supported",
-	97:  "address family not supported by protocol",
-	98:  "address already in use",
-	99:  "cannot assign requested address",
-	100: "network is down",
-	101: "network is unreachable",
-	102: "network dropped connection on reset",
-	103: "software caused connection abort",
-	104: "connection reset by peer",
-	105: "no buffer space available",
-	106: "transport endpoint is already connected",
-	107: "transport endpoint is not connected",
-	108: "cannot send after transport endpoint shutdown",
-	109: "too many references: cannot splice",
-	110: "connection timed out",
-	111: "connection refused",
-	112: "host is down",
-	113: "no route to host",
-	114: "operation already in progress",
-	115: "operation now in progress",
-	116: "stale file handle",
-	117: "structure needs cleaning",
-	118: "not a XENIX named type file",
-	119: "no XENIX semaphores available",
-	120: "is a named type file",
-	121: "remote I/O error",
-	122: "disk quota exceeded",
-	123: "no medium found",
-	124: "wrong medium type",
-	125: "operation canceled",
-	126: "required key not available",
-	127: "key has expired",
-	128: "key has been revoked",
-	129: "key was rejected by service",
-	130: "owner died",
-	131: "state not recoverable",
-	132: "operation not possible due to RF-kill",
-	133: "memory page has hardware error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "EDEADLK", "resource deadlock avoided"},
+	{36, "ENAMETOOLONG", "file name too long"},
+	{37, "ENOLCK", "no locks available"},
+	{38, "ENOSYS", "function not implemented"},
+	{39, "ENOTEMPTY", "directory not empty"},
+	{40, "ELOOP", "too many levels of symbolic links"},
+	{42, "ENOMSG", "no message of desired type"},
+	{43, "EIDRM", "identifier removed"},
+	{44, "ECHRNG", "channel number out of range"},
+	{45, "EL2NSYNC", "level 2 not synchronized"},
+	{46, "EL3HLT", "level 3 halted"},
+	{47, "EL3RST", "level 3 reset"},
+	{48, "ELNRNG", "link number out of range"},
+	{49, "EUNATCH", "protocol driver not attached"},
+	{50, "ENOCSI", "no CSI structure available"},
+	{51, "EL2HLT", "level 2 halted"},
+	{52, "EBADE", "invalid exchange"},
+	{53, "EBADR", "invalid request descriptor"},
+	{54, "EXFULL", "exchange full"},
+	{55, "ENOANO", "no anode"},
+	{56, "EBADRQC", "invalid request code"},
+	{57, "EBADSLT", "invalid slot"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "EMULTIHOP", "multihop attempted"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EBADMSG", "bad message"},
+	{75, "EOVERFLOW", "value too large for defined data type"},
+	{76, "ENOTUNIQ", "name not unique on network"},
+	{77, "EBADFD", "file descriptor in bad state"},
+	{78, "EREMCHG", "remote address changed"},
+	{79, "ELIBACC", "can not access a needed shared library"},
+	{80, "ELIBBAD", "accessing a corrupted shared library"},
+	{81, "ELIBSCN", ".lib section in a.out corrupted"},
+	{82, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{83, "ELIBEXEC", "cannot exec a shared library directly"},
+	{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{85, "ERESTART", "interrupted system call should be restarted"},
+	{86, "ESTRPIPE", "streams pipe error"},
+	{87, "EUSERS", "too many users"},
+	{88, "ENOTSOCK", "socket operation on non-socket"},
+	{89, "EDESTADDRREQ", "destination address required"},
+	{90, "EMSGSIZE", "message too long"},
+	{91, "EPROTOTYPE", "protocol wrong type for socket"},
+	{92, "ENOPROTOOPT", "protocol not available"},
+	{93, "EPROTONOSUPPORT", "protocol not supported"},
+	{94, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{95, "ENOTSUP", "operation not supported"},
+	{96, "EPFNOSUPPORT", "protocol family not supported"},
+	{97, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{98, "EADDRINUSE", "address already in use"},
+	{99, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{100, "ENETDOWN", "network is down"},
+	{101, "ENETUNREACH", "network is unreachable"},
+	{102, "ENETRESET", "network dropped connection on reset"},
+	{103, "ECONNABORTED", "software caused connection abort"},
+	{104, "ECONNRESET", "connection reset by peer"},
+	{105, "ENOBUFS", "no buffer space available"},
+	{106, "EISCONN", "transport endpoint is already connected"},
+	{107, "ENOTCONN", "transport endpoint is not connected"},
+	{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{109, "ETOOMANYREFS", "too many references: cannot splice"},
+	{110, "ETIMEDOUT", "connection timed out"},
+	{111, "ECONNREFUSED", "connection refused"},
+	{112, "EHOSTDOWN", "host is down"},
+	{113, "EHOSTUNREACH", "no route to host"},
+	{114, "EALREADY", "operation already in progress"},
+	{115, "EINPROGRESS", "operation now in progress"},
+	{116, "ESTALE", "stale file handle"},
+	{117, "EUCLEAN", "structure needs cleaning"},
+	{118, "ENOTNAM", "not a XENIX named type file"},
+	{119, "ENAVAIL", "no XENIX semaphores available"},
+	{120, "EISNAM", "is a named type file"},
+	{121, "EREMOTEIO", "remote I/O error"},
+	{122, "EDQUOT", "disk quota exceeded"},
+	{123, "ENOMEDIUM", "no medium found"},
+	{124, "EMEDIUMTYPE", "wrong medium type"},
+	{125, "ECANCELED", "operation canceled"},
+	{126, "ENOKEY", "required key not available"},
+	{127, "EKEYEXPIRED", "key has expired"},
+	{128, "EKEYREVOKED", "key has been revoked"},
+	{129, "EKEYREJECTED", "key was rejected by service"},
+	{130, "EOWNERDEAD", "owner died"},
+	{131, "ENOTRECOVERABLE", "state not recoverable"},
+	{132, "ERFKILL", "operation not possible due to RF-kill"},
+	{133, "EHWPOISON", "memory page has hardware error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "bus error",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "user defined signal 1",
-	11: "segmentation fault",
-	12: "user defined signal 2",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "stack fault",
-	17: "child exited",
-	18: "continued",
-	19: "stopped (signal)",
-	20: "stopped",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "urgent I/O condition",
-	24: "CPU time limit exceeded",
-	25: "file size limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window changed",
-	29: "I/O possible",
-	30: "power failure",
-	31: "bad system call",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGBUS", "bus error"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGUSR1", "user defined signal 1"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGUSR2", "user defined signal 2"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGSTKFLT", "stack fault"},
+	{17, "SIGCHLD", "child exited"},
+	{18, "SIGCONT", "continued"},
+	{19, "SIGSTOP", "stopped (signal)"},
+	{20, "SIGTSTP", "stopped"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGURG", "urgent I/O condition"},
+	{24, "SIGXCPU", "CPU time limit exceeded"},
+	{25, "SIGXFSZ", "file size limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window changed"},
+	{29, "SIGIO", "I/O possible"},
+	{30, "SIGPWR", "power failure"},
+	{31, "SIGSYS", "bad system call"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
index 0253ba34fd8a0410560980d918ab075ec9848a22..f58450bf3d37378e8bf75cdd3e34e9320de3967f 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x80081270
 	BLKBSZSET                            = 0x40081271
 	BLKFLSBUF                            = 0x1261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x800
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -447,10 +470,15 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
 	EXTRA_MAGIC                          = 0x45585401
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -464,6 +492,7 @@ const (
 	FF1                                  = 0x8000
 	FFDLY                                = 0x8000
 	FLUSHO                               = 0x1000
+	FPSIMD_MAGIC                         = 0x46508001
 	FS_ENCRYPTION_MODE_AES_128_CBC       = 0x5
 	FS_ENCRYPTION_MODE_AES_128_CTS       = 0x6
 	FS_ENCRYPTION_MODE_AES_256_CBC       = 0x3
@@ -484,6 +513,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -545,6 +575,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -795,12 +868,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -896,9 +971,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -958,7 +1039,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -993,6 +1076,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1025,6 +1139,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1032,7 +1148,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x400
 	O_ASYNC                              = 0x2000
@@ -1125,9 +1243,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x40042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x40082406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x2405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1233,6 +1353,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1282,6 +1403,11 @@ const (
 	PTRACE_SINGLESTEP                    = 0x9
 	PTRACE_SYSCALL                       = 0x18
 	PTRACE_TRACEME                       = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1467,6 +1593,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1551,6 +1679,23 @@ const (
 	SIOCSPGRP                            = 0x8902
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x2
@@ -1661,6 +1806,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1682,6 +1829,8 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SVE_MAGIC                            = 0x53564501
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1863,7 +2012,27 @@ const (
 	TIOCSTI                              = 0x5412
 	TIOCSWINSZ                           = 0x5414
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x100
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x401054d5
 	TUNDETACHFILTER                      = 0x401054d6
@@ -1891,9 +2060,12 @@ const (
 	TUNSETVNETBE                         = 0x400454de
 	TUNSETVNETHDRSZ                      = 0x400454d8
 	TUNSETVNETLE                         = 0x400454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x4
 	VEOL                                 = 0xb
@@ -1935,6 +2107,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -1944,7 +2196,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2124,171 +2378,179 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "no such device or address",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device or resource busy",
-	17:  "file exists",
-	18:  "invalid cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "numerical result out of range",
-	35:  "resource deadlock avoided",
-	36:  "file name too long",
-	37:  "no locks available",
-	38:  "function not implemented",
-	39:  "directory not empty",
-	40:  "too many levels of symbolic links",
-	42:  "no message of desired type",
-	43:  "identifier removed",
-	44:  "channel number out of range",
-	45:  "level 2 not synchronized",
-	46:  "level 3 halted",
-	47:  "level 3 reset",
-	48:  "link number out of range",
-	49:  "protocol driver not attached",
-	50:  "no CSI structure available",
-	51:  "level 2 halted",
-	52:  "invalid exchange",
-	53:  "invalid request descriptor",
-	54:  "exchange full",
-	55:  "no anode",
-	56:  "invalid request code",
-	57:  "invalid slot",
-	59:  "bad font file format",
-	60:  "device not a stream",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of streams resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "multihop attempted",
-	73:  "RFS specific error",
-	74:  "bad message",
-	75:  "value too large for defined data type",
-	76:  "name not unique on network",
-	77:  "file descriptor in bad state",
-	78:  "remote address changed",
-	79:  "can not access a needed shared library",
-	80:  "accessing a corrupted shared library",
-	81:  ".lib section in a.out corrupted",
-	82:  "attempting to link in too many shared libraries",
-	83:  "cannot exec a shared library directly",
-	84:  "invalid or incomplete multibyte or wide character",
-	85:  "interrupted system call should be restarted",
-	86:  "streams pipe error",
-	87:  "too many users",
-	88:  "socket operation on non-socket",
-	89:  "destination address required",
-	90:  "message too long",
-	91:  "protocol wrong type for socket",
-	92:  "protocol not available",
-	93:  "protocol not supported",
-	94:  "socket type not supported",
-	95:  "operation not supported",
-	96:  "protocol family not supported",
-	97:  "address family not supported by protocol",
-	98:  "address already in use",
-	99:  "cannot assign requested address",
-	100: "network is down",
-	101: "network is unreachable",
-	102: "network dropped connection on reset",
-	103: "software caused connection abort",
-	104: "connection reset by peer",
-	105: "no buffer space available",
-	106: "transport endpoint is already connected",
-	107: "transport endpoint is not connected",
-	108: "cannot send after transport endpoint shutdown",
-	109: "too many references: cannot splice",
-	110: "connection timed out",
-	111: "connection refused",
-	112: "host is down",
-	113: "no route to host",
-	114: "operation already in progress",
-	115: "operation now in progress",
-	116: "stale file handle",
-	117: "structure needs cleaning",
-	118: "not a XENIX named type file",
-	119: "no XENIX semaphores available",
-	120: "is a named type file",
-	121: "remote I/O error",
-	122: "disk quota exceeded",
-	123: "no medium found",
-	124: "wrong medium type",
-	125: "operation canceled",
-	126: "required key not available",
-	127: "key has expired",
-	128: "key has been revoked",
-	129: "key was rejected by service",
-	130: "owner died",
-	131: "state not recoverable",
-	132: "operation not possible due to RF-kill",
-	133: "memory page has hardware error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "EDEADLK", "resource deadlock avoided"},
+	{36, "ENAMETOOLONG", "file name too long"},
+	{37, "ENOLCK", "no locks available"},
+	{38, "ENOSYS", "function not implemented"},
+	{39, "ENOTEMPTY", "directory not empty"},
+	{40, "ELOOP", "too many levels of symbolic links"},
+	{42, "ENOMSG", "no message of desired type"},
+	{43, "EIDRM", "identifier removed"},
+	{44, "ECHRNG", "channel number out of range"},
+	{45, "EL2NSYNC", "level 2 not synchronized"},
+	{46, "EL3HLT", "level 3 halted"},
+	{47, "EL3RST", "level 3 reset"},
+	{48, "ELNRNG", "link number out of range"},
+	{49, "EUNATCH", "protocol driver not attached"},
+	{50, "ENOCSI", "no CSI structure available"},
+	{51, "EL2HLT", "level 2 halted"},
+	{52, "EBADE", "invalid exchange"},
+	{53, "EBADR", "invalid request descriptor"},
+	{54, "EXFULL", "exchange full"},
+	{55, "ENOANO", "no anode"},
+	{56, "EBADRQC", "invalid request code"},
+	{57, "EBADSLT", "invalid slot"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "EMULTIHOP", "multihop attempted"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EBADMSG", "bad message"},
+	{75, "EOVERFLOW", "value too large for defined data type"},
+	{76, "ENOTUNIQ", "name not unique on network"},
+	{77, "EBADFD", "file descriptor in bad state"},
+	{78, "EREMCHG", "remote address changed"},
+	{79, "ELIBACC", "can not access a needed shared library"},
+	{80, "ELIBBAD", "accessing a corrupted shared library"},
+	{81, "ELIBSCN", ".lib section in a.out corrupted"},
+	{82, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{83, "ELIBEXEC", "cannot exec a shared library directly"},
+	{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{85, "ERESTART", "interrupted system call should be restarted"},
+	{86, "ESTRPIPE", "streams pipe error"},
+	{87, "EUSERS", "too many users"},
+	{88, "ENOTSOCK", "socket operation on non-socket"},
+	{89, "EDESTADDRREQ", "destination address required"},
+	{90, "EMSGSIZE", "message too long"},
+	{91, "EPROTOTYPE", "protocol wrong type for socket"},
+	{92, "ENOPROTOOPT", "protocol not available"},
+	{93, "EPROTONOSUPPORT", "protocol not supported"},
+	{94, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{95, "ENOTSUP", "operation not supported"},
+	{96, "EPFNOSUPPORT", "protocol family not supported"},
+	{97, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{98, "EADDRINUSE", "address already in use"},
+	{99, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{100, "ENETDOWN", "network is down"},
+	{101, "ENETUNREACH", "network is unreachable"},
+	{102, "ENETRESET", "network dropped connection on reset"},
+	{103, "ECONNABORTED", "software caused connection abort"},
+	{104, "ECONNRESET", "connection reset by peer"},
+	{105, "ENOBUFS", "no buffer space available"},
+	{106, "EISCONN", "transport endpoint is already connected"},
+	{107, "ENOTCONN", "transport endpoint is not connected"},
+	{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{109, "ETOOMANYREFS", "too many references: cannot splice"},
+	{110, "ETIMEDOUT", "connection timed out"},
+	{111, "ECONNREFUSED", "connection refused"},
+	{112, "EHOSTDOWN", "host is down"},
+	{113, "EHOSTUNREACH", "no route to host"},
+	{114, "EALREADY", "operation already in progress"},
+	{115, "EINPROGRESS", "operation now in progress"},
+	{116, "ESTALE", "stale file handle"},
+	{117, "EUCLEAN", "structure needs cleaning"},
+	{118, "ENOTNAM", "not a XENIX named type file"},
+	{119, "ENAVAIL", "no XENIX semaphores available"},
+	{120, "EISNAM", "is a named type file"},
+	{121, "EREMOTEIO", "remote I/O error"},
+	{122, "EDQUOT", "disk quota exceeded"},
+	{123, "ENOMEDIUM", "no medium found"},
+	{124, "EMEDIUMTYPE", "wrong medium type"},
+	{125, "ECANCELED", "operation canceled"},
+	{126, "ENOKEY", "required key not available"},
+	{127, "EKEYEXPIRED", "key has expired"},
+	{128, "EKEYREVOKED", "key has been revoked"},
+	{129, "EKEYREJECTED", "key was rejected by service"},
+	{130, "EOWNERDEAD", "owner died"},
+	{131, "ENOTRECOVERABLE", "state not recoverable"},
+	{132, "ERFKILL", "operation not possible due to RF-kill"},
+	{133, "EHWPOISON", "memory page has hardware error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "bus error",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "user defined signal 1",
-	11: "segmentation fault",
-	12: "user defined signal 2",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "stack fault",
-	17: "child exited",
-	18: "continued",
-	19: "stopped (signal)",
-	20: "stopped",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "urgent I/O condition",
-	24: "CPU time limit exceeded",
-	25: "file size limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window changed",
-	29: "I/O possible",
-	30: "power failure",
-	31: "bad system call",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGBUS", "bus error"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGUSR1", "user defined signal 1"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGUSR2", "user defined signal 2"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGSTKFLT", "stack fault"},
+	{17, "SIGCHLD", "child exited"},
+	{18, "SIGCONT", "continued"},
+	{19, "SIGSTOP", "stopped (signal)"},
+	{20, "SIGTSTP", "stopped"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGURG", "urgent I/O condition"},
+	{24, "SIGXCPU", "CPU time limit exceeded"},
+	{25, "SIGXFSZ", "file size limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window changed"},
+	{29, "SIGIO", "I/O possible"},
+	{30, "SIGPWR", "power failure"},
+	{31, "SIGSYS", "bad system call"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
index 4cef12d8e73d1af8a98d37d5dfe15347a58e7699..465ff2f0f3c11b71760be00fc00f5f9548b36bbb 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x40041270
 	BLKBSZSET                            = 0x80041271
 	BLKFLSBUF                            = 0x20001261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x80
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -895,9 +969,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -957,7 +1037,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -992,6 +1074,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1024,6 +1137,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1031,7 +1146,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x8
 	O_ASYNC                              = 0x1000
@@ -1124,9 +1241,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x80042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x80042406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x20002405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1232,6 +1351,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1293,6 +1413,11 @@ const (
 	PTRACE_SINGLESTEP                    = 0x9
 	PTRACE_SYSCALL                       = 0x18
 	PTRACE_TRACEME                       = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1478,6 +1603,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1562,6 +1689,23 @@ const (
 	SIOCSPGRP                            = 0x80047308
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x1
@@ -1673,6 +1817,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1694,6 +1840,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1876,7 +2023,27 @@ const (
 	TIOCSTI                              = 0x5472
 	TIOCSWINSZ                           = 0x80087467
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x8000
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x800854d5
 	TUNDETACHFILTER                      = 0x800854d6
@@ -1904,9 +2071,12 @@ const (
 	TUNSETVNETBE                         = 0x800454de
 	TUNSETVNETHDRSZ                      = 0x800454d8
 	TUNSETVNETLE                         = 0x800454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x10
 	VEOL                                 = 0x11
@@ -1949,6 +2119,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -1958,7 +2208,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2140,174 +2392,182 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:    "operation not permitted",
-	2:    "no such file or directory",
-	3:    "no such process",
-	4:    "interrupted system call",
-	5:    "input/output error",
-	6:    "no such device or address",
-	7:    "argument list too long",
-	8:    "exec format error",
-	9:    "bad file descriptor",
-	10:   "no child processes",
-	11:   "resource temporarily unavailable",
-	12:   "cannot allocate memory",
-	13:   "permission denied",
-	14:   "bad address",
-	15:   "block device required",
-	16:   "device or resource busy",
-	17:   "file exists",
-	18:   "invalid cross-device link",
-	19:   "no such device",
-	20:   "not a directory",
-	21:   "is a directory",
-	22:   "invalid argument",
-	23:   "too many open files in system",
-	24:   "too many open files",
-	25:   "inappropriate ioctl for device",
-	26:   "text file busy",
-	27:   "file too large",
-	28:   "no space left on device",
-	29:   "illegal seek",
-	30:   "read-only file system",
-	31:   "too many links",
-	32:   "broken pipe",
-	33:   "numerical argument out of domain",
-	34:   "numerical result out of range",
-	35:   "no message of desired type",
-	36:   "identifier removed",
-	37:   "channel number out of range",
-	38:   "level 2 not synchronized",
-	39:   "level 3 halted",
-	40:   "level 3 reset",
-	41:   "link number out of range",
-	42:   "protocol driver not attached",
-	43:   "no CSI structure available",
-	44:   "level 2 halted",
-	45:   "resource deadlock avoided",
-	46:   "no locks available",
-	50:   "invalid exchange",
-	51:   "invalid request descriptor",
-	52:   "exchange full",
-	53:   "no anode",
-	54:   "invalid request code",
-	55:   "invalid slot",
-	56:   "file locking deadlock error",
-	59:   "bad font file format",
-	60:   "device not a stream",
-	61:   "no data available",
-	62:   "timer expired",
-	63:   "out of streams resources",
-	64:   "machine is not on the network",
-	65:   "package not installed",
-	66:   "object is remote",
-	67:   "link has been severed",
-	68:   "advertise error",
-	69:   "srmount error",
-	70:   "communication error on send",
-	71:   "protocol error",
-	73:   "RFS specific error",
-	74:   "multihop attempted",
-	77:   "bad message",
-	78:   "file name too long",
-	79:   "value too large for defined data type",
-	80:   "name not unique on network",
-	81:   "file descriptor in bad state",
-	82:   "remote address changed",
-	83:   "can not access a needed shared library",
-	84:   "accessing a corrupted shared library",
-	85:   ".lib section in a.out corrupted",
-	86:   "attempting to link in too many shared libraries",
-	87:   "cannot exec a shared library directly",
-	88:   "invalid or incomplete multibyte or wide character",
-	89:   "function not implemented",
-	90:   "too many levels of symbolic links",
-	91:   "interrupted system call should be restarted",
-	92:   "streams pipe error",
-	93:   "directory not empty",
-	94:   "too many users",
-	95:   "socket operation on non-socket",
-	96:   "destination address required",
-	97:   "message too long",
-	98:   "protocol wrong type for socket",
-	99:   "protocol not available",
-	120:  "protocol not supported",
-	121:  "socket type not supported",
-	122:  "operation not supported",
-	123:  "protocol family not supported",
-	124:  "address family not supported by protocol",
-	125:  "address already in use",
-	126:  "cannot assign requested address",
-	127:  "network is down",
-	128:  "network is unreachable",
-	129:  "network dropped connection on reset",
-	130:  "software caused connection abort",
-	131:  "connection reset by peer",
-	132:  "no buffer space available",
-	133:  "transport endpoint is already connected",
-	134:  "transport endpoint is not connected",
-	135:  "structure needs cleaning",
-	137:  "not a XENIX named type file",
-	138:  "no XENIX semaphores available",
-	139:  "is a named type file",
-	140:  "remote I/O error",
-	141:  "unknown error 141",
-	142:  "unknown error 142",
-	143:  "cannot send after transport endpoint shutdown",
-	144:  "too many references: cannot splice",
-	145:  "connection timed out",
-	146:  "connection refused",
-	147:  "host is down",
-	148:  "no route to host",
-	149:  "operation already in progress",
-	150:  "operation now in progress",
-	151:  "stale file handle",
-	158:  "operation canceled",
-	159:  "no medium found",
-	160:  "wrong medium type",
-	161:  "required key not available",
-	162:  "key has expired",
-	163:  "key has been revoked",
-	164:  "key was rejected by service",
-	165:  "owner died",
-	166:  "state not recoverable",
-	167:  "operation not possible due to RF-kill",
-	168:  "memory page has hardware error",
-	1133: "disk quota exceeded",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "ENOMSG", "no message of desired type"},
+	{36, "EIDRM", "identifier removed"},
+	{37, "ECHRNG", "channel number out of range"},
+	{38, "EL2NSYNC", "level 2 not synchronized"},
+	{39, "EL3HLT", "level 3 halted"},
+	{40, "EL3RST", "level 3 reset"},
+	{41, "ELNRNG", "link number out of range"},
+	{42, "EUNATCH", "protocol driver not attached"},
+	{43, "ENOCSI", "no CSI structure available"},
+	{44, "EL2HLT", "level 2 halted"},
+	{45, "EDEADLK", "resource deadlock avoided"},
+	{46, "ENOLCK", "no locks available"},
+	{50, "EBADE", "invalid exchange"},
+	{51, "EBADR", "invalid request descriptor"},
+	{52, "EXFULL", "exchange full"},
+	{53, "ENOANO", "no anode"},
+	{54, "EBADRQC", "invalid request code"},
+	{55, "EBADSLT", "invalid slot"},
+	{56, "EDEADLOCK", "file locking deadlock error"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EMULTIHOP", "multihop attempted"},
+	{77, "EBADMSG", "bad message"},
+	{78, "ENAMETOOLONG", "file name too long"},
+	{79, "EOVERFLOW", "value too large for defined data type"},
+	{80, "ENOTUNIQ", "name not unique on network"},
+	{81, "EBADFD", "file descriptor in bad state"},
+	{82, "EREMCHG", "remote address changed"},
+	{83, "ELIBACC", "can not access a needed shared library"},
+	{84, "ELIBBAD", "accessing a corrupted shared library"},
+	{85, "ELIBSCN", ".lib section in a.out corrupted"},
+	{86, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{87, "ELIBEXEC", "cannot exec a shared library directly"},
+	{88, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{89, "ENOSYS", "function not implemented"},
+	{90, "ELOOP", "too many levels of symbolic links"},
+	{91, "ERESTART", "interrupted system call should be restarted"},
+	{92, "ESTRPIPE", "streams pipe error"},
+	{93, "ENOTEMPTY", "directory not empty"},
+	{94, "EUSERS", "too many users"},
+	{95, "ENOTSOCK", "socket operation on non-socket"},
+	{96, "EDESTADDRREQ", "destination address required"},
+	{97, "EMSGSIZE", "message too long"},
+	{98, "EPROTOTYPE", "protocol wrong type for socket"},
+	{99, "ENOPROTOOPT", "protocol not available"},
+	{120, "EPROTONOSUPPORT", "protocol not supported"},
+	{121, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{122, "ENOTSUP", "operation not supported"},
+	{123, "EPFNOSUPPORT", "protocol family not supported"},
+	{124, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{125, "EADDRINUSE", "address already in use"},
+	{126, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{127, "ENETDOWN", "network is down"},
+	{128, "ENETUNREACH", "network is unreachable"},
+	{129, "ENETRESET", "network dropped connection on reset"},
+	{130, "ECONNABORTED", "software caused connection abort"},
+	{131, "ECONNRESET", "connection reset by peer"},
+	{132, "ENOBUFS", "no buffer space available"},
+	{133, "EISCONN", "transport endpoint is already connected"},
+	{134, "ENOTCONN", "transport endpoint is not connected"},
+	{135, "EUCLEAN", "structure needs cleaning"},
+	{137, "ENOTNAM", "not a XENIX named type file"},
+	{138, "ENAVAIL", "no XENIX semaphores available"},
+	{139, "EISNAM", "is a named type file"},
+	{140, "EREMOTEIO", "remote I/O error"},
+	{141, "EINIT", "unknown error 141"},
+	{142, "EREMDEV", "unknown error 142"},
+	{143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{144, "ETOOMANYREFS", "too many references: cannot splice"},
+	{145, "ETIMEDOUT", "connection timed out"},
+	{146, "ECONNREFUSED", "connection refused"},
+	{147, "EHOSTDOWN", "host is down"},
+	{148, "EHOSTUNREACH", "no route to host"},
+	{149, "EALREADY", "operation already in progress"},
+	{150, "EINPROGRESS", "operation now in progress"},
+	{151, "ESTALE", "stale file handle"},
+	{158, "ECANCELED", "operation canceled"},
+	{159, "ENOMEDIUM", "no medium found"},
+	{160, "EMEDIUMTYPE", "wrong medium type"},
+	{161, "ENOKEY", "required key not available"},
+	{162, "EKEYEXPIRED", "key has expired"},
+	{163, "EKEYREVOKED", "key has been revoked"},
+	{164, "EKEYREJECTED", "key was rejected by service"},
+	{165, "EOWNERDEAD", "owner died"},
+	{166, "ENOTRECOVERABLE", "state not recoverable"},
+	{167, "ERFKILL", "operation not possible due to RF-kill"},
+	{168, "EHWPOISON", "memory page has hardware error"},
+	{1133, "EDQUOT", "disk quota exceeded"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "user defined signal 1",
-	17: "user defined signal 2",
-	18: "child exited",
-	19: "power failure",
-	20: "window changed",
-	21: "urgent I/O condition",
-	22: "I/O possible",
-	23: "stopped (signal)",
-	24: "stopped",
-	25: "continued",
-	26: "stopped (tty input)",
-	27: "stopped (tty output)",
-	28: "virtual timer expired",
-	29: "profiling timer expired",
-	30: "CPU time limit exceeded",
-	31: "file size limit exceeded",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGUSR1", "user defined signal 1"},
+	{17, "SIGUSR2", "user defined signal 2"},
+	{18, "SIGCHLD", "child exited"},
+	{19, "SIGPWR", "power failure"},
+	{20, "SIGWINCH", "window changed"},
+	{21, "SIGURG", "urgent I/O condition"},
+	{22, "SIGIO", "I/O possible"},
+	{23, "SIGSTOP", "stopped (signal)"},
+	{24, "SIGTSTP", "stopped"},
+	{25, "SIGCONT", "continued"},
+	{26, "SIGTTIN", "stopped (tty input)"},
+	{27, "SIGTTOU", "stopped (tty output)"},
+	{28, "SIGVTALRM", "virtual timer expired"},
+	{29, "SIGPROF", "profiling timer expired"},
+	{30, "SIGXCPU", "CPU time limit exceeded"},
+	{31, "SIGXFSZ", "file size limit exceeded"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
index 4782b3efb6310a344927f0687b6a7ae28f3d4b90..37e851aabe403f65f92c4ad9bfafb02082222bf3 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x40081270
 	BLKBSZSET                            = 0x80081271
 	BLKFLSBUF                            = 0x20001261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x80
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -895,9 +969,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -957,7 +1037,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -992,6 +1074,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1024,6 +1137,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1031,7 +1146,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x8
 	O_ASYNC                              = 0x1000
@@ -1124,9 +1241,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x80042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x80082406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x20002405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1232,6 +1351,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1293,6 +1413,11 @@ const (
 	PTRACE_SINGLESTEP                    = 0x9
 	PTRACE_SYSCALL                       = 0x18
 	PTRACE_TRACEME                       = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1478,6 +1603,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1562,6 +1689,23 @@ const (
 	SIOCSPGRP                            = 0x80047308
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x1
@@ -1673,6 +1817,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1694,6 +1840,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1876,7 +2023,27 @@ const (
 	TIOCSTI                              = 0x5472
 	TIOCSWINSZ                           = 0x80087467
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x8000
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x801054d5
 	TUNDETACHFILTER                      = 0x801054d6
@@ -1904,9 +2071,12 @@ const (
 	TUNSETVNETBE                         = 0x800454de
 	TUNSETVNETHDRSZ                      = 0x800454d8
 	TUNSETVNETLE                         = 0x800454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x10
 	VEOL                                 = 0x11
@@ -1949,6 +2119,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -1958,7 +2208,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2140,174 +2392,182 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:    "operation not permitted",
-	2:    "no such file or directory",
-	3:    "no such process",
-	4:    "interrupted system call",
-	5:    "input/output error",
-	6:    "no such device or address",
-	7:    "argument list too long",
-	8:    "exec format error",
-	9:    "bad file descriptor",
-	10:   "no child processes",
-	11:   "resource temporarily unavailable",
-	12:   "cannot allocate memory",
-	13:   "permission denied",
-	14:   "bad address",
-	15:   "block device required",
-	16:   "device or resource busy",
-	17:   "file exists",
-	18:   "invalid cross-device link",
-	19:   "no such device",
-	20:   "not a directory",
-	21:   "is a directory",
-	22:   "invalid argument",
-	23:   "too many open files in system",
-	24:   "too many open files",
-	25:   "inappropriate ioctl for device",
-	26:   "text file busy",
-	27:   "file too large",
-	28:   "no space left on device",
-	29:   "illegal seek",
-	30:   "read-only file system",
-	31:   "too many links",
-	32:   "broken pipe",
-	33:   "numerical argument out of domain",
-	34:   "numerical result out of range",
-	35:   "no message of desired type",
-	36:   "identifier removed",
-	37:   "channel number out of range",
-	38:   "level 2 not synchronized",
-	39:   "level 3 halted",
-	40:   "level 3 reset",
-	41:   "link number out of range",
-	42:   "protocol driver not attached",
-	43:   "no CSI structure available",
-	44:   "level 2 halted",
-	45:   "resource deadlock avoided",
-	46:   "no locks available",
-	50:   "invalid exchange",
-	51:   "invalid request descriptor",
-	52:   "exchange full",
-	53:   "no anode",
-	54:   "invalid request code",
-	55:   "invalid slot",
-	56:   "file locking deadlock error",
-	59:   "bad font file format",
-	60:   "device not a stream",
-	61:   "no data available",
-	62:   "timer expired",
-	63:   "out of streams resources",
-	64:   "machine is not on the network",
-	65:   "package not installed",
-	66:   "object is remote",
-	67:   "link has been severed",
-	68:   "advertise error",
-	69:   "srmount error",
-	70:   "communication error on send",
-	71:   "protocol error",
-	73:   "RFS specific error",
-	74:   "multihop attempted",
-	77:   "bad message",
-	78:   "file name too long",
-	79:   "value too large for defined data type",
-	80:   "name not unique on network",
-	81:   "file descriptor in bad state",
-	82:   "remote address changed",
-	83:   "can not access a needed shared library",
-	84:   "accessing a corrupted shared library",
-	85:   ".lib section in a.out corrupted",
-	86:   "attempting to link in too many shared libraries",
-	87:   "cannot exec a shared library directly",
-	88:   "invalid or incomplete multibyte or wide character",
-	89:   "function not implemented",
-	90:   "too many levels of symbolic links",
-	91:   "interrupted system call should be restarted",
-	92:   "streams pipe error",
-	93:   "directory not empty",
-	94:   "too many users",
-	95:   "socket operation on non-socket",
-	96:   "destination address required",
-	97:   "message too long",
-	98:   "protocol wrong type for socket",
-	99:   "protocol not available",
-	120:  "protocol not supported",
-	121:  "socket type not supported",
-	122:  "operation not supported",
-	123:  "protocol family not supported",
-	124:  "address family not supported by protocol",
-	125:  "address already in use",
-	126:  "cannot assign requested address",
-	127:  "network is down",
-	128:  "network is unreachable",
-	129:  "network dropped connection on reset",
-	130:  "software caused connection abort",
-	131:  "connection reset by peer",
-	132:  "no buffer space available",
-	133:  "transport endpoint is already connected",
-	134:  "transport endpoint is not connected",
-	135:  "structure needs cleaning",
-	137:  "not a XENIX named type file",
-	138:  "no XENIX semaphores available",
-	139:  "is a named type file",
-	140:  "remote I/O error",
-	141:  "unknown error 141",
-	142:  "unknown error 142",
-	143:  "cannot send after transport endpoint shutdown",
-	144:  "too many references: cannot splice",
-	145:  "connection timed out",
-	146:  "connection refused",
-	147:  "host is down",
-	148:  "no route to host",
-	149:  "operation already in progress",
-	150:  "operation now in progress",
-	151:  "stale file handle",
-	158:  "operation canceled",
-	159:  "no medium found",
-	160:  "wrong medium type",
-	161:  "required key not available",
-	162:  "key has expired",
-	163:  "key has been revoked",
-	164:  "key was rejected by service",
-	165:  "owner died",
-	166:  "state not recoverable",
-	167:  "operation not possible due to RF-kill",
-	168:  "memory page has hardware error",
-	1133: "disk quota exceeded",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "ENOMSG", "no message of desired type"},
+	{36, "EIDRM", "identifier removed"},
+	{37, "ECHRNG", "channel number out of range"},
+	{38, "EL2NSYNC", "level 2 not synchronized"},
+	{39, "EL3HLT", "level 3 halted"},
+	{40, "EL3RST", "level 3 reset"},
+	{41, "ELNRNG", "link number out of range"},
+	{42, "EUNATCH", "protocol driver not attached"},
+	{43, "ENOCSI", "no CSI structure available"},
+	{44, "EL2HLT", "level 2 halted"},
+	{45, "EDEADLK", "resource deadlock avoided"},
+	{46, "ENOLCK", "no locks available"},
+	{50, "EBADE", "invalid exchange"},
+	{51, "EBADR", "invalid request descriptor"},
+	{52, "EXFULL", "exchange full"},
+	{53, "ENOANO", "no anode"},
+	{54, "EBADRQC", "invalid request code"},
+	{55, "EBADSLT", "invalid slot"},
+	{56, "EDEADLOCK", "file locking deadlock error"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EMULTIHOP", "multihop attempted"},
+	{77, "EBADMSG", "bad message"},
+	{78, "ENAMETOOLONG", "file name too long"},
+	{79, "EOVERFLOW", "value too large for defined data type"},
+	{80, "ENOTUNIQ", "name not unique on network"},
+	{81, "EBADFD", "file descriptor in bad state"},
+	{82, "EREMCHG", "remote address changed"},
+	{83, "ELIBACC", "can not access a needed shared library"},
+	{84, "ELIBBAD", "accessing a corrupted shared library"},
+	{85, "ELIBSCN", ".lib section in a.out corrupted"},
+	{86, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{87, "ELIBEXEC", "cannot exec a shared library directly"},
+	{88, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{89, "ENOSYS", "function not implemented"},
+	{90, "ELOOP", "too many levels of symbolic links"},
+	{91, "ERESTART", "interrupted system call should be restarted"},
+	{92, "ESTRPIPE", "streams pipe error"},
+	{93, "ENOTEMPTY", "directory not empty"},
+	{94, "EUSERS", "too many users"},
+	{95, "ENOTSOCK", "socket operation on non-socket"},
+	{96, "EDESTADDRREQ", "destination address required"},
+	{97, "EMSGSIZE", "message too long"},
+	{98, "EPROTOTYPE", "protocol wrong type for socket"},
+	{99, "ENOPROTOOPT", "protocol not available"},
+	{120, "EPROTONOSUPPORT", "protocol not supported"},
+	{121, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{122, "ENOTSUP", "operation not supported"},
+	{123, "EPFNOSUPPORT", "protocol family not supported"},
+	{124, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{125, "EADDRINUSE", "address already in use"},
+	{126, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{127, "ENETDOWN", "network is down"},
+	{128, "ENETUNREACH", "network is unreachable"},
+	{129, "ENETRESET", "network dropped connection on reset"},
+	{130, "ECONNABORTED", "software caused connection abort"},
+	{131, "ECONNRESET", "connection reset by peer"},
+	{132, "ENOBUFS", "no buffer space available"},
+	{133, "EISCONN", "transport endpoint is already connected"},
+	{134, "ENOTCONN", "transport endpoint is not connected"},
+	{135, "EUCLEAN", "structure needs cleaning"},
+	{137, "ENOTNAM", "not a XENIX named type file"},
+	{138, "ENAVAIL", "no XENIX semaphores available"},
+	{139, "EISNAM", "is a named type file"},
+	{140, "EREMOTEIO", "remote I/O error"},
+	{141, "EINIT", "unknown error 141"},
+	{142, "EREMDEV", "unknown error 142"},
+	{143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{144, "ETOOMANYREFS", "too many references: cannot splice"},
+	{145, "ETIMEDOUT", "connection timed out"},
+	{146, "ECONNREFUSED", "connection refused"},
+	{147, "EHOSTDOWN", "host is down"},
+	{148, "EHOSTUNREACH", "no route to host"},
+	{149, "EALREADY", "operation already in progress"},
+	{150, "EINPROGRESS", "operation now in progress"},
+	{151, "ESTALE", "stale file handle"},
+	{158, "ECANCELED", "operation canceled"},
+	{159, "ENOMEDIUM", "no medium found"},
+	{160, "EMEDIUMTYPE", "wrong medium type"},
+	{161, "ENOKEY", "required key not available"},
+	{162, "EKEYEXPIRED", "key has expired"},
+	{163, "EKEYREVOKED", "key has been revoked"},
+	{164, "EKEYREJECTED", "key was rejected by service"},
+	{165, "EOWNERDEAD", "owner died"},
+	{166, "ENOTRECOVERABLE", "state not recoverable"},
+	{167, "ERFKILL", "operation not possible due to RF-kill"},
+	{168, "EHWPOISON", "memory page has hardware error"},
+	{1133, "EDQUOT", "disk quota exceeded"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "user defined signal 1",
-	17: "user defined signal 2",
-	18: "child exited",
-	19: "power failure",
-	20: "window changed",
-	21: "urgent I/O condition",
-	22: "I/O possible",
-	23: "stopped (signal)",
-	24: "stopped",
-	25: "continued",
-	26: "stopped (tty input)",
-	27: "stopped (tty output)",
-	28: "virtual timer expired",
-	29: "profiling timer expired",
-	30: "CPU time limit exceeded",
-	31: "file size limit exceeded",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGUSR1", "user defined signal 1"},
+	{17, "SIGUSR2", "user defined signal 2"},
+	{18, "SIGCHLD", "child exited"},
+	{19, "SIGPWR", "power failure"},
+	{20, "SIGWINCH", "window changed"},
+	{21, "SIGURG", "urgent I/O condition"},
+	{22, "SIGIO", "I/O possible"},
+	{23, "SIGSTOP", "stopped (signal)"},
+	{24, "SIGTSTP", "stopped"},
+	{25, "SIGCONT", "continued"},
+	{26, "SIGTTIN", "stopped (tty input)"},
+	{27, "SIGTTOU", "stopped (tty output)"},
+	{28, "SIGVTALRM", "virtual timer expired"},
+	{29, "SIGPROF", "profiling timer expired"},
+	{30, "SIGXCPU", "CPU time limit exceeded"},
+	{31, "SIGXFSZ", "file size limit exceeded"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
index 86eb3063cdd03dc858dddb678423142d3766852a..1131d3ca1658de737b292229e2bcbff8cb15ee7e 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x40081270
 	BLKBSZSET                            = 0x80081271
 	BLKFLSBUF                            = 0x20001261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x80
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -895,9 +969,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -957,7 +1037,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -992,6 +1074,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1024,6 +1137,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1031,7 +1146,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x8
 	O_ASYNC                              = 0x1000
@@ -1124,9 +1241,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x80042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x80082406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x20002405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1232,6 +1351,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1293,6 +1413,11 @@ const (
 	PTRACE_SINGLESTEP                    = 0x9
 	PTRACE_SYSCALL                       = 0x18
 	PTRACE_TRACEME                       = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1478,6 +1603,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1562,6 +1689,23 @@ const (
 	SIOCSPGRP                            = 0x80047308
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x1
@@ -1673,6 +1817,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1694,6 +1840,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1876,7 +2023,27 @@ const (
 	TIOCSTI                              = 0x5472
 	TIOCSWINSZ                           = 0x80087467
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x8000
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x801054d5
 	TUNDETACHFILTER                      = 0x801054d6
@@ -1904,9 +2071,12 @@ const (
 	TUNSETVNETBE                         = 0x800454de
 	TUNSETVNETHDRSZ                      = 0x800454d8
 	TUNSETVNETLE                         = 0x800454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x10
 	VEOL                                 = 0x11
@@ -1949,6 +2119,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -1958,7 +2208,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2140,174 +2392,182 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:    "operation not permitted",
-	2:    "no such file or directory",
-	3:    "no such process",
-	4:    "interrupted system call",
-	5:    "input/output error",
-	6:    "no such device or address",
-	7:    "argument list too long",
-	8:    "exec format error",
-	9:    "bad file descriptor",
-	10:   "no child processes",
-	11:   "resource temporarily unavailable",
-	12:   "cannot allocate memory",
-	13:   "permission denied",
-	14:   "bad address",
-	15:   "block device required",
-	16:   "device or resource busy",
-	17:   "file exists",
-	18:   "invalid cross-device link",
-	19:   "no such device",
-	20:   "not a directory",
-	21:   "is a directory",
-	22:   "invalid argument",
-	23:   "too many open files in system",
-	24:   "too many open files",
-	25:   "inappropriate ioctl for device",
-	26:   "text file busy",
-	27:   "file too large",
-	28:   "no space left on device",
-	29:   "illegal seek",
-	30:   "read-only file system",
-	31:   "too many links",
-	32:   "broken pipe",
-	33:   "numerical argument out of domain",
-	34:   "numerical result out of range",
-	35:   "no message of desired type",
-	36:   "identifier removed",
-	37:   "channel number out of range",
-	38:   "level 2 not synchronized",
-	39:   "level 3 halted",
-	40:   "level 3 reset",
-	41:   "link number out of range",
-	42:   "protocol driver not attached",
-	43:   "no CSI structure available",
-	44:   "level 2 halted",
-	45:   "resource deadlock avoided",
-	46:   "no locks available",
-	50:   "invalid exchange",
-	51:   "invalid request descriptor",
-	52:   "exchange full",
-	53:   "no anode",
-	54:   "invalid request code",
-	55:   "invalid slot",
-	56:   "file locking deadlock error",
-	59:   "bad font file format",
-	60:   "device not a stream",
-	61:   "no data available",
-	62:   "timer expired",
-	63:   "out of streams resources",
-	64:   "machine is not on the network",
-	65:   "package not installed",
-	66:   "object is remote",
-	67:   "link has been severed",
-	68:   "advertise error",
-	69:   "srmount error",
-	70:   "communication error on send",
-	71:   "protocol error",
-	73:   "RFS specific error",
-	74:   "multihop attempted",
-	77:   "bad message",
-	78:   "file name too long",
-	79:   "value too large for defined data type",
-	80:   "name not unique on network",
-	81:   "file descriptor in bad state",
-	82:   "remote address changed",
-	83:   "can not access a needed shared library",
-	84:   "accessing a corrupted shared library",
-	85:   ".lib section in a.out corrupted",
-	86:   "attempting to link in too many shared libraries",
-	87:   "cannot exec a shared library directly",
-	88:   "invalid or incomplete multibyte or wide character",
-	89:   "function not implemented",
-	90:   "too many levels of symbolic links",
-	91:   "interrupted system call should be restarted",
-	92:   "streams pipe error",
-	93:   "directory not empty",
-	94:   "too many users",
-	95:   "socket operation on non-socket",
-	96:   "destination address required",
-	97:   "message too long",
-	98:   "protocol wrong type for socket",
-	99:   "protocol not available",
-	120:  "protocol not supported",
-	121:  "socket type not supported",
-	122:  "operation not supported",
-	123:  "protocol family not supported",
-	124:  "address family not supported by protocol",
-	125:  "address already in use",
-	126:  "cannot assign requested address",
-	127:  "network is down",
-	128:  "network is unreachable",
-	129:  "network dropped connection on reset",
-	130:  "software caused connection abort",
-	131:  "connection reset by peer",
-	132:  "no buffer space available",
-	133:  "transport endpoint is already connected",
-	134:  "transport endpoint is not connected",
-	135:  "structure needs cleaning",
-	137:  "not a XENIX named type file",
-	138:  "no XENIX semaphores available",
-	139:  "is a named type file",
-	140:  "remote I/O error",
-	141:  "unknown error 141",
-	142:  "unknown error 142",
-	143:  "cannot send after transport endpoint shutdown",
-	144:  "too many references: cannot splice",
-	145:  "connection timed out",
-	146:  "connection refused",
-	147:  "host is down",
-	148:  "no route to host",
-	149:  "operation already in progress",
-	150:  "operation now in progress",
-	151:  "stale file handle",
-	158:  "operation canceled",
-	159:  "no medium found",
-	160:  "wrong medium type",
-	161:  "required key not available",
-	162:  "key has expired",
-	163:  "key has been revoked",
-	164:  "key was rejected by service",
-	165:  "owner died",
-	166:  "state not recoverable",
-	167:  "operation not possible due to RF-kill",
-	168:  "memory page has hardware error",
-	1133: "disk quota exceeded",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "ENOMSG", "no message of desired type"},
+	{36, "EIDRM", "identifier removed"},
+	{37, "ECHRNG", "channel number out of range"},
+	{38, "EL2NSYNC", "level 2 not synchronized"},
+	{39, "EL3HLT", "level 3 halted"},
+	{40, "EL3RST", "level 3 reset"},
+	{41, "ELNRNG", "link number out of range"},
+	{42, "EUNATCH", "protocol driver not attached"},
+	{43, "ENOCSI", "no CSI structure available"},
+	{44, "EL2HLT", "level 2 halted"},
+	{45, "EDEADLK", "resource deadlock avoided"},
+	{46, "ENOLCK", "no locks available"},
+	{50, "EBADE", "invalid exchange"},
+	{51, "EBADR", "invalid request descriptor"},
+	{52, "EXFULL", "exchange full"},
+	{53, "ENOANO", "no anode"},
+	{54, "EBADRQC", "invalid request code"},
+	{55, "EBADSLT", "invalid slot"},
+	{56, "EDEADLOCK", "file locking deadlock error"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EMULTIHOP", "multihop attempted"},
+	{77, "EBADMSG", "bad message"},
+	{78, "ENAMETOOLONG", "file name too long"},
+	{79, "EOVERFLOW", "value too large for defined data type"},
+	{80, "ENOTUNIQ", "name not unique on network"},
+	{81, "EBADFD", "file descriptor in bad state"},
+	{82, "EREMCHG", "remote address changed"},
+	{83, "ELIBACC", "can not access a needed shared library"},
+	{84, "ELIBBAD", "accessing a corrupted shared library"},
+	{85, "ELIBSCN", ".lib section in a.out corrupted"},
+	{86, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{87, "ELIBEXEC", "cannot exec a shared library directly"},
+	{88, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{89, "ENOSYS", "function not implemented"},
+	{90, "ELOOP", "too many levels of symbolic links"},
+	{91, "ERESTART", "interrupted system call should be restarted"},
+	{92, "ESTRPIPE", "streams pipe error"},
+	{93, "ENOTEMPTY", "directory not empty"},
+	{94, "EUSERS", "too many users"},
+	{95, "ENOTSOCK", "socket operation on non-socket"},
+	{96, "EDESTADDRREQ", "destination address required"},
+	{97, "EMSGSIZE", "message too long"},
+	{98, "EPROTOTYPE", "protocol wrong type for socket"},
+	{99, "ENOPROTOOPT", "protocol not available"},
+	{120, "EPROTONOSUPPORT", "protocol not supported"},
+	{121, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{122, "ENOTSUP", "operation not supported"},
+	{123, "EPFNOSUPPORT", "protocol family not supported"},
+	{124, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{125, "EADDRINUSE", "address already in use"},
+	{126, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{127, "ENETDOWN", "network is down"},
+	{128, "ENETUNREACH", "network is unreachable"},
+	{129, "ENETRESET", "network dropped connection on reset"},
+	{130, "ECONNABORTED", "software caused connection abort"},
+	{131, "ECONNRESET", "connection reset by peer"},
+	{132, "ENOBUFS", "no buffer space available"},
+	{133, "EISCONN", "transport endpoint is already connected"},
+	{134, "ENOTCONN", "transport endpoint is not connected"},
+	{135, "EUCLEAN", "structure needs cleaning"},
+	{137, "ENOTNAM", "not a XENIX named type file"},
+	{138, "ENAVAIL", "no XENIX semaphores available"},
+	{139, "EISNAM", "is a named type file"},
+	{140, "EREMOTEIO", "remote I/O error"},
+	{141, "EINIT", "unknown error 141"},
+	{142, "EREMDEV", "unknown error 142"},
+	{143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{144, "ETOOMANYREFS", "too many references: cannot splice"},
+	{145, "ETIMEDOUT", "connection timed out"},
+	{146, "ECONNREFUSED", "connection refused"},
+	{147, "EHOSTDOWN", "host is down"},
+	{148, "EHOSTUNREACH", "no route to host"},
+	{149, "EALREADY", "operation already in progress"},
+	{150, "EINPROGRESS", "operation now in progress"},
+	{151, "ESTALE", "stale file handle"},
+	{158, "ECANCELED", "operation canceled"},
+	{159, "ENOMEDIUM", "no medium found"},
+	{160, "EMEDIUMTYPE", "wrong medium type"},
+	{161, "ENOKEY", "required key not available"},
+	{162, "EKEYEXPIRED", "key has expired"},
+	{163, "EKEYREVOKED", "key has been revoked"},
+	{164, "EKEYREJECTED", "key was rejected by service"},
+	{165, "EOWNERDEAD", "owner died"},
+	{166, "ENOTRECOVERABLE", "state not recoverable"},
+	{167, "ERFKILL", "operation not possible due to RF-kill"},
+	{168, "EHWPOISON", "memory page has hardware error"},
+	{1133, "EDQUOT", "disk quota exceeded"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "user defined signal 1",
-	17: "user defined signal 2",
-	18: "child exited",
-	19: "power failure",
-	20: "window changed",
-	21: "urgent I/O condition",
-	22: "I/O possible",
-	23: "stopped (signal)",
-	24: "stopped",
-	25: "continued",
-	26: "stopped (tty input)",
-	27: "stopped (tty output)",
-	28: "virtual timer expired",
-	29: "profiling timer expired",
-	30: "CPU time limit exceeded",
-	31: "file size limit exceeded",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGUSR1", "user defined signal 1"},
+	{17, "SIGUSR2", "user defined signal 2"},
+	{18, "SIGCHLD", "child exited"},
+	{19, "SIGPWR", "power failure"},
+	{20, "SIGWINCH", "window changed"},
+	{21, "SIGURG", "urgent I/O condition"},
+	{22, "SIGIO", "I/O possible"},
+	{23, "SIGSTOP", "stopped (signal)"},
+	{24, "SIGTSTP", "stopped"},
+	{25, "SIGCONT", "continued"},
+	{26, "SIGTTIN", "stopped (tty input)"},
+	{27, "SIGTTOU", "stopped (tty output)"},
+	{28, "SIGVTALRM", "virtual timer expired"},
+	{29, "SIGPROF", "profiling timer expired"},
+	{30, "SIGXCPU", "CPU time limit exceeded"},
+	{31, "SIGXFSZ", "file size limit exceeded"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
index 2168ece949fe3c3540f445cb4682694fab63a06b..d04a43b2bc770fa27e9163251ef18f601c505a3e 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x40041270
 	BLKBSZSET                            = 0x80041271
 	BLKFLSBUF                            = 0x20001261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x80
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -895,9 +969,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -957,7 +1037,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -992,6 +1074,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1024,6 +1137,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1031,7 +1146,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x8
 	O_ASYNC                              = 0x1000
@@ -1124,9 +1241,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x80042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x80042406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x20002405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1232,6 +1351,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1293,6 +1413,11 @@ const (
 	PTRACE_SINGLESTEP                    = 0x9
 	PTRACE_SYSCALL                       = 0x18
 	PTRACE_TRACEME                       = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x6
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1478,6 +1603,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1562,6 +1689,23 @@ const (
 	SIOCSPGRP                            = 0x80047308
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x1
@@ -1673,6 +1817,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1694,6 +1840,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1876,7 +2023,27 @@ const (
 	TIOCSTI                              = 0x5472
 	TIOCSWINSZ                           = 0x80087467
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x8000
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x800854d5
 	TUNDETACHFILTER                      = 0x800854d6
@@ -1904,9 +2071,12 @@ const (
 	TUNSETVNETBE                         = 0x800454de
 	TUNSETVNETHDRSZ                      = 0x800454d8
 	TUNSETVNETLE                         = 0x800454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x10
 	VEOL                                 = 0x11
@@ -1949,6 +2119,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -1958,7 +2208,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2140,174 +2392,182 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:    "operation not permitted",
-	2:    "no such file or directory",
-	3:    "no such process",
-	4:    "interrupted system call",
-	5:    "input/output error",
-	6:    "no such device or address",
-	7:    "argument list too long",
-	8:    "exec format error",
-	9:    "bad file descriptor",
-	10:   "no child processes",
-	11:   "resource temporarily unavailable",
-	12:   "cannot allocate memory",
-	13:   "permission denied",
-	14:   "bad address",
-	15:   "block device required",
-	16:   "device or resource busy",
-	17:   "file exists",
-	18:   "invalid cross-device link",
-	19:   "no such device",
-	20:   "not a directory",
-	21:   "is a directory",
-	22:   "invalid argument",
-	23:   "too many open files in system",
-	24:   "too many open files",
-	25:   "inappropriate ioctl for device",
-	26:   "text file busy",
-	27:   "file too large",
-	28:   "no space left on device",
-	29:   "illegal seek",
-	30:   "read-only file system",
-	31:   "too many links",
-	32:   "broken pipe",
-	33:   "numerical argument out of domain",
-	34:   "numerical result out of range",
-	35:   "no message of desired type",
-	36:   "identifier removed",
-	37:   "channel number out of range",
-	38:   "level 2 not synchronized",
-	39:   "level 3 halted",
-	40:   "level 3 reset",
-	41:   "link number out of range",
-	42:   "protocol driver not attached",
-	43:   "no CSI structure available",
-	44:   "level 2 halted",
-	45:   "resource deadlock avoided",
-	46:   "no locks available",
-	50:   "invalid exchange",
-	51:   "invalid request descriptor",
-	52:   "exchange full",
-	53:   "no anode",
-	54:   "invalid request code",
-	55:   "invalid slot",
-	56:   "file locking deadlock error",
-	59:   "bad font file format",
-	60:   "device not a stream",
-	61:   "no data available",
-	62:   "timer expired",
-	63:   "out of streams resources",
-	64:   "machine is not on the network",
-	65:   "package not installed",
-	66:   "object is remote",
-	67:   "link has been severed",
-	68:   "advertise error",
-	69:   "srmount error",
-	70:   "communication error on send",
-	71:   "protocol error",
-	73:   "RFS specific error",
-	74:   "multihop attempted",
-	77:   "bad message",
-	78:   "file name too long",
-	79:   "value too large for defined data type",
-	80:   "name not unique on network",
-	81:   "file descriptor in bad state",
-	82:   "remote address changed",
-	83:   "can not access a needed shared library",
-	84:   "accessing a corrupted shared library",
-	85:   ".lib section in a.out corrupted",
-	86:   "attempting to link in too many shared libraries",
-	87:   "cannot exec a shared library directly",
-	88:   "invalid or incomplete multibyte or wide character",
-	89:   "function not implemented",
-	90:   "too many levels of symbolic links",
-	91:   "interrupted system call should be restarted",
-	92:   "streams pipe error",
-	93:   "directory not empty",
-	94:   "too many users",
-	95:   "socket operation on non-socket",
-	96:   "destination address required",
-	97:   "message too long",
-	98:   "protocol wrong type for socket",
-	99:   "protocol not available",
-	120:  "protocol not supported",
-	121:  "socket type not supported",
-	122:  "operation not supported",
-	123:  "protocol family not supported",
-	124:  "address family not supported by protocol",
-	125:  "address already in use",
-	126:  "cannot assign requested address",
-	127:  "network is down",
-	128:  "network is unreachable",
-	129:  "network dropped connection on reset",
-	130:  "software caused connection abort",
-	131:  "connection reset by peer",
-	132:  "no buffer space available",
-	133:  "transport endpoint is already connected",
-	134:  "transport endpoint is not connected",
-	135:  "structure needs cleaning",
-	137:  "not a XENIX named type file",
-	138:  "no XENIX semaphores available",
-	139:  "is a named type file",
-	140:  "remote I/O error",
-	141:  "unknown error 141",
-	142:  "unknown error 142",
-	143:  "cannot send after transport endpoint shutdown",
-	144:  "too many references: cannot splice",
-	145:  "connection timed out",
-	146:  "connection refused",
-	147:  "host is down",
-	148:  "no route to host",
-	149:  "operation already in progress",
-	150:  "operation now in progress",
-	151:  "stale file handle",
-	158:  "operation canceled",
-	159:  "no medium found",
-	160:  "wrong medium type",
-	161:  "required key not available",
-	162:  "key has expired",
-	163:  "key has been revoked",
-	164:  "key was rejected by service",
-	165:  "owner died",
-	166:  "state not recoverable",
-	167:  "operation not possible due to RF-kill",
-	168:  "memory page has hardware error",
-	1133: "disk quota exceeded",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "ENOMSG", "no message of desired type"},
+	{36, "EIDRM", "identifier removed"},
+	{37, "ECHRNG", "channel number out of range"},
+	{38, "EL2NSYNC", "level 2 not synchronized"},
+	{39, "EL3HLT", "level 3 halted"},
+	{40, "EL3RST", "level 3 reset"},
+	{41, "ELNRNG", "link number out of range"},
+	{42, "EUNATCH", "protocol driver not attached"},
+	{43, "ENOCSI", "no CSI structure available"},
+	{44, "EL2HLT", "level 2 halted"},
+	{45, "EDEADLK", "resource deadlock avoided"},
+	{46, "ENOLCK", "no locks available"},
+	{50, "EBADE", "invalid exchange"},
+	{51, "EBADR", "invalid request descriptor"},
+	{52, "EXFULL", "exchange full"},
+	{53, "ENOANO", "no anode"},
+	{54, "EBADRQC", "invalid request code"},
+	{55, "EBADSLT", "invalid slot"},
+	{56, "EDEADLOCK", "file locking deadlock error"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EMULTIHOP", "multihop attempted"},
+	{77, "EBADMSG", "bad message"},
+	{78, "ENAMETOOLONG", "file name too long"},
+	{79, "EOVERFLOW", "value too large for defined data type"},
+	{80, "ENOTUNIQ", "name not unique on network"},
+	{81, "EBADFD", "file descriptor in bad state"},
+	{82, "EREMCHG", "remote address changed"},
+	{83, "ELIBACC", "can not access a needed shared library"},
+	{84, "ELIBBAD", "accessing a corrupted shared library"},
+	{85, "ELIBSCN", ".lib section in a.out corrupted"},
+	{86, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{87, "ELIBEXEC", "cannot exec a shared library directly"},
+	{88, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{89, "ENOSYS", "function not implemented"},
+	{90, "ELOOP", "too many levels of symbolic links"},
+	{91, "ERESTART", "interrupted system call should be restarted"},
+	{92, "ESTRPIPE", "streams pipe error"},
+	{93, "ENOTEMPTY", "directory not empty"},
+	{94, "EUSERS", "too many users"},
+	{95, "ENOTSOCK", "socket operation on non-socket"},
+	{96, "EDESTADDRREQ", "destination address required"},
+	{97, "EMSGSIZE", "message too long"},
+	{98, "EPROTOTYPE", "protocol wrong type for socket"},
+	{99, "ENOPROTOOPT", "protocol not available"},
+	{120, "EPROTONOSUPPORT", "protocol not supported"},
+	{121, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{122, "ENOTSUP", "operation not supported"},
+	{123, "EPFNOSUPPORT", "protocol family not supported"},
+	{124, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{125, "EADDRINUSE", "address already in use"},
+	{126, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{127, "ENETDOWN", "network is down"},
+	{128, "ENETUNREACH", "network is unreachable"},
+	{129, "ENETRESET", "network dropped connection on reset"},
+	{130, "ECONNABORTED", "software caused connection abort"},
+	{131, "ECONNRESET", "connection reset by peer"},
+	{132, "ENOBUFS", "no buffer space available"},
+	{133, "EISCONN", "transport endpoint is already connected"},
+	{134, "ENOTCONN", "transport endpoint is not connected"},
+	{135, "EUCLEAN", "structure needs cleaning"},
+	{137, "ENOTNAM", "not a XENIX named type file"},
+	{138, "ENAVAIL", "no XENIX semaphores available"},
+	{139, "EISNAM", "is a named type file"},
+	{140, "EREMOTEIO", "remote I/O error"},
+	{141, "EINIT", "unknown error 141"},
+	{142, "EREMDEV", "unknown error 142"},
+	{143, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{144, "ETOOMANYREFS", "too many references: cannot splice"},
+	{145, "ETIMEDOUT", "connection timed out"},
+	{146, "ECONNREFUSED", "connection refused"},
+	{147, "EHOSTDOWN", "host is down"},
+	{148, "EHOSTUNREACH", "no route to host"},
+	{149, "EALREADY", "operation already in progress"},
+	{150, "EINPROGRESS", "operation now in progress"},
+	{151, "ESTALE", "stale file handle"},
+	{158, "ECANCELED", "operation canceled"},
+	{159, "ENOMEDIUM", "no medium found"},
+	{160, "EMEDIUMTYPE", "wrong medium type"},
+	{161, "ENOKEY", "required key not available"},
+	{162, "EKEYEXPIRED", "key has expired"},
+	{163, "EKEYREVOKED", "key has been revoked"},
+	{164, "EKEYREJECTED", "key was rejected by service"},
+	{165, "EOWNERDEAD", "owner died"},
+	{166, "ENOTRECOVERABLE", "state not recoverable"},
+	{167, "ERFKILL", "operation not possible due to RF-kill"},
+	{168, "EHWPOISON", "memory page has hardware error"},
+	{1133, "EDQUOT", "disk quota exceeded"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "user defined signal 1",
-	17: "user defined signal 2",
-	18: "child exited",
-	19: "power failure",
-	20: "window changed",
-	21: "urgent I/O condition",
-	22: "I/O possible",
-	23: "stopped (signal)",
-	24: "stopped",
-	25: "continued",
-	26: "stopped (tty input)",
-	27: "stopped (tty output)",
-	28: "virtual timer expired",
-	29: "profiling timer expired",
-	30: "CPU time limit exceeded",
-	31: "file size limit exceeded",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGUSR1", "user defined signal 1"},
+	{17, "SIGUSR2", "user defined signal 2"},
+	{18, "SIGCHLD", "child exited"},
+	{19, "SIGPWR", "power failure"},
+	{20, "SIGWINCH", "window changed"},
+	{21, "SIGURG", "urgent I/O condition"},
+	{22, "SIGIO", "I/O possible"},
+	{23, "SIGSTOP", "stopped (signal)"},
+	{24, "SIGTSTP", "stopped"},
+	{25, "SIGCONT", "continued"},
+	{26, "SIGTTIN", "stopped (tty input)"},
+	{27, "SIGTTOU", "stopped (tty output)"},
+	{28, "SIGVTALRM", "virtual timer expired"},
+	{29, "SIGPROF", "profiling timer expired"},
+	{30, "SIGXCPU", "CPU time limit exceeded"},
+	{31, "SIGXFSZ", "file size limit exceeded"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
index 18e48b4f2bfdcbd45656ed6fbac30fba40912ad2..710410efdd853735ce02618c7339917cba0d818e 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x17
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x16
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x40081270
 	BLKBSZSET                            = 0x80081271
 	BLKFLSBUF                            = 0x20001261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x8000
 	BSDLY                                = 0x8000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0xff
 	CBAUDEX                              = 0x0
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0xff0000
 	CLOCAL                               = 0x8000
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x1000
 	CR2                                  = 0x2000
 	CR3                                  = 0x3000
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x3000
 	CREAD                                = 0x800
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x400
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x1
 	ECHONL                               = 0x10
 	ECHOPRT                              = 0x20
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x800
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x4000
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x100
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x80
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x1000
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x400
 	IXON                                 = 0x200
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -894,9 +968,15 @@ const (
 	MCL_CURRENT                          = 0x2000
 	MCL_FUTURE                           = 0x4000
 	MCL_ONFAULT                          = 0x8000
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -956,7 +1036,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -991,6 +1073,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NL2                                  = 0x200
@@ -1025,6 +1138,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80000000
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1032,7 +1147,9 @@ const (
 	ONLCR                                = 0x2
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x400
 	O_ASYNC                              = 0x2000
@@ -1125,9 +1242,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x80042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x80082406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x20002405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1234,6 +1353,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1349,6 +1469,11 @@ const (
 	PT_VSR0                              = 0x96
 	PT_VSR31                             = 0xd4
 	PT_XER                               = 0x25
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1534,6 +1659,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1618,6 +1745,23 @@ const (
 	SIOCSPGRP                            = 0x8902
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x2
@@ -1728,6 +1872,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1749,6 +1895,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1934,7 +2081,27 @@ const (
 	TIOCSTOP                             = 0x2000746f
 	TIOCSWINSZ                           = 0x80087467
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x400000
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x801054d5
 	TUNDETACHFILTER                      = 0x801054d6
@@ -1962,9 +2129,12 @@ const (
 	TUNSETVNETBE                         = 0x800454de
 	TUNSETVNETHDRSZ                      = 0x800454d8
 	TUNSETVNETLE                         = 0x800454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0x10
 	VEOF                                 = 0x4
 	VEOL                                 = 0x6
@@ -2006,6 +2176,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -2015,7 +2265,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4000
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0xc00
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2195,172 +2447,180 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "no such device or address",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device or resource busy",
-	17:  "file exists",
-	18:  "invalid cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "numerical result out of range",
-	35:  "resource deadlock avoided",
-	36:  "file name too long",
-	37:  "no locks available",
-	38:  "function not implemented",
-	39:  "directory not empty",
-	40:  "too many levels of symbolic links",
-	42:  "no message of desired type",
-	43:  "identifier removed",
-	44:  "channel number out of range",
-	45:  "level 2 not synchronized",
-	46:  "level 3 halted",
-	47:  "level 3 reset",
-	48:  "link number out of range",
-	49:  "protocol driver not attached",
-	50:  "no CSI structure available",
-	51:  "level 2 halted",
-	52:  "invalid exchange",
-	53:  "invalid request descriptor",
-	54:  "exchange full",
-	55:  "no anode",
-	56:  "invalid request code",
-	57:  "invalid slot",
-	58:  "file locking deadlock error",
-	59:  "bad font file format",
-	60:  "device not a stream",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of streams resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "multihop attempted",
-	73:  "RFS specific error",
-	74:  "bad message",
-	75:  "value too large for defined data type",
-	76:  "name not unique on network",
-	77:  "file descriptor in bad state",
-	78:  "remote address changed",
-	79:  "can not access a needed shared library",
-	80:  "accessing a corrupted shared library",
-	81:  ".lib section in a.out corrupted",
-	82:  "attempting to link in too many shared libraries",
-	83:  "cannot exec a shared library directly",
-	84:  "invalid or incomplete multibyte or wide character",
-	85:  "interrupted system call should be restarted",
-	86:  "streams pipe error",
-	87:  "too many users",
-	88:  "socket operation on non-socket",
-	89:  "destination address required",
-	90:  "message too long",
-	91:  "protocol wrong type for socket",
-	92:  "protocol not available",
-	93:  "protocol not supported",
-	94:  "socket type not supported",
-	95:  "operation not supported",
-	96:  "protocol family not supported",
-	97:  "address family not supported by protocol",
-	98:  "address already in use",
-	99:  "cannot assign requested address",
-	100: "network is down",
-	101: "network is unreachable",
-	102: "network dropped connection on reset",
-	103: "software caused connection abort",
-	104: "connection reset by peer",
-	105: "no buffer space available",
-	106: "transport endpoint is already connected",
-	107: "transport endpoint is not connected",
-	108: "cannot send after transport endpoint shutdown",
-	109: "too many references: cannot splice",
-	110: "connection timed out",
-	111: "connection refused",
-	112: "host is down",
-	113: "no route to host",
-	114: "operation already in progress",
-	115: "operation now in progress",
-	116: "stale file handle",
-	117: "structure needs cleaning",
-	118: "not a XENIX named type file",
-	119: "no XENIX semaphores available",
-	120: "is a named type file",
-	121: "remote I/O error",
-	122: "disk quota exceeded",
-	123: "no medium found",
-	124: "wrong medium type",
-	125: "operation canceled",
-	126: "required key not available",
-	127: "key has expired",
-	128: "key has been revoked",
-	129: "key was rejected by service",
-	130: "owner died",
-	131: "state not recoverable",
-	132: "operation not possible due to RF-kill",
-	133: "memory page has hardware error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "EDEADLK", "resource deadlock avoided"},
+	{36, "ENAMETOOLONG", "file name too long"},
+	{37, "ENOLCK", "no locks available"},
+	{38, "ENOSYS", "function not implemented"},
+	{39, "ENOTEMPTY", "directory not empty"},
+	{40, "ELOOP", "too many levels of symbolic links"},
+	{42, "ENOMSG", "no message of desired type"},
+	{43, "EIDRM", "identifier removed"},
+	{44, "ECHRNG", "channel number out of range"},
+	{45, "EL2NSYNC", "level 2 not synchronized"},
+	{46, "EL3HLT", "level 3 halted"},
+	{47, "EL3RST", "level 3 reset"},
+	{48, "ELNRNG", "link number out of range"},
+	{49, "EUNATCH", "protocol driver not attached"},
+	{50, "ENOCSI", "no CSI structure available"},
+	{51, "EL2HLT", "level 2 halted"},
+	{52, "EBADE", "invalid exchange"},
+	{53, "EBADR", "invalid request descriptor"},
+	{54, "EXFULL", "exchange full"},
+	{55, "ENOANO", "no anode"},
+	{56, "EBADRQC", "invalid request code"},
+	{57, "EBADSLT", "invalid slot"},
+	{58, "EDEADLOCK", "file locking deadlock error"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "EMULTIHOP", "multihop attempted"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EBADMSG", "bad message"},
+	{75, "EOVERFLOW", "value too large for defined data type"},
+	{76, "ENOTUNIQ", "name not unique on network"},
+	{77, "EBADFD", "file descriptor in bad state"},
+	{78, "EREMCHG", "remote address changed"},
+	{79, "ELIBACC", "can not access a needed shared library"},
+	{80, "ELIBBAD", "accessing a corrupted shared library"},
+	{81, "ELIBSCN", ".lib section in a.out corrupted"},
+	{82, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{83, "ELIBEXEC", "cannot exec a shared library directly"},
+	{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{85, "ERESTART", "interrupted system call should be restarted"},
+	{86, "ESTRPIPE", "streams pipe error"},
+	{87, "EUSERS", "too many users"},
+	{88, "ENOTSOCK", "socket operation on non-socket"},
+	{89, "EDESTADDRREQ", "destination address required"},
+	{90, "EMSGSIZE", "message too long"},
+	{91, "EPROTOTYPE", "protocol wrong type for socket"},
+	{92, "ENOPROTOOPT", "protocol not available"},
+	{93, "EPROTONOSUPPORT", "protocol not supported"},
+	{94, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{95, "ENOTSUP", "operation not supported"},
+	{96, "EPFNOSUPPORT", "protocol family not supported"},
+	{97, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{98, "EADDRINUSE", "address already in use"},
+	{99, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{100, "ENETDOWN", "network is down"},
+	{101, "ENETUNREACH", "network is unreachable"},
+	{102, "ENETRESET", "network dropped connection on reset"},
+	{103, "ECONNABORTED", "software caused connection abort"},
+	{104, "ECONNRESET", "connection reset by peer"},
+	{105, "ENOBUFS", "no buffer space available"},
+	{106, "EISCONN", "transport endpoint is already connected"},
+	{107, "ENOTCONN", "transport endpoint is not connected"},
+	{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{109, "ETOOMANYREFS", "too many references: cannot splice"},
+	{110, "ETIMEDOUT", "connection timed out"},
+	{111, "ECONNREFUSED", "connection refused"},
+	{112, "EHOSTDOWN", "host is down"},
+	{113, "EHOSTUNREACH", "no route to host"},
+	{114, "EALREADY", "operation already in progress"},
+	{115, "EINPROGRESS", "operation now in progress"},
+	{116, "ESTALE", "stale file handle"},
+	{117, "EUCLEAN", "structure needs cleaning"},
+	{118, "ENOTNAM", "not a XENIX named type file"},
+	{119, "ENAVAIL", "no XENIX semaphores available"},
+	{120, "EISNAM", "is a named type file"},
+	{121, "EREMOTEIO", "remote I/O error"},
+	{122, "EDQUOT", "disk quota exceeded"},
+	{123, "ENOMEDIUM", "no medium found"},
+	{124, "EMEDIUMTYPE", "wrong medium type"},
+	{125, "ECANCELED", "operation canceled"},
+	{126, "ENOKEY", "required key not available"},
+	{127, "EKEYEXPIRED", "key has expired"},
+	{128, "EKEYREVOKED", "key has been revoked"},
+	{129, "EKEYREJECTED", "key was rejected by service"},
+	{130, "EOWNERDEAD", "owner died"},
+	{131, "ENOTRECOVERABLE", "state not recoverable"},
+	{132, "ERFKILL", "operation not possible due to RF-kill"},
+	{133, "EHWPOISON", "memory page has hardware error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "bus error",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "user defined signal 1",
-	11: "segmentation fault",
-	12: "user defined signal 2",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "stack fault",
-	17: "child exited",
-	18: "continued",
-	19: "stopped (signal)",
-	20: "stopped",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "urgent I/O condition",
-	24: "CPU time limit exceeded",
-	25: "file size limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window changed",
-	29: "I/O possible",
-	30: "power failure",
-	31: "bad system call",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGBUS", "bus error"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGUSR1", "user defined signal 1"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGUSR2", "user defined signal 2"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGSTKFLT", "stack fault"},
+	{17, "SIGCHLD", "child exited"},
+	{18, "SIGCONT", "continued"},
+	{19, "SIGSTOP", "stopped (signal)"},
+	{20, "SIGTSTP", "stopped"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGURG", "urgent I/O condition"},
+	{24, "SIGXCPU", "CPU time limit exceeded"},
+	{25, "SIGXFSZ", "file size limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window changed"},
+	{29, "SIGIO", "I/O possible"},
+	{30, "SIGPWR", "power failure"},
+	{31, "SIGSYS", "bad system call"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
index c069f8fabc9eaa74496062d447f6010a74cea952..c1c1c01bcf54c3ad214e692d926f500a10dcc066 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x17
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x16
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x40081270
 	BLKBSZSET                            = 0x80081271
 	BLKFLSBUF                            = 0x20001261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x8000
 	BSDLY                                = 0x8000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0xff
 	CBAUDEX                              = 0x0
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0xff0000
 	CLOCAL                               = 0x8000
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x1000
 	CR2                                  = 0x2000
 	CR3                                  = 0x3000
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x3000
 	CREAD                                = 0x800
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x400
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x1
 	ECHONL                               = 0x10
 	ECHOPRT                              = 0x20
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x800
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x4000
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x100
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x80
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x1000
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x400
 	IXON                                 = 0x200
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -894,9 +968,15 @@ const (
 	MCL_CURRENT                          = 0x2000
 	MCL_FUTURE                           = 0x4000
 	MCL_ONFAULT                          = 0x8000
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -956,7 +1036,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -991,6 +1073,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NL2                                  = 0x200
@@ -1025,6 +1138,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80000000
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1032,7 +1147,9 @@ const (
 	ONLCR                                = 0x2
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x400
 	O_ASYNC                              = 0x2000
@@ -1125,9 +1242,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x80042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x80082406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x20002405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1234,6 +1353,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1349,6 +1469,11 @@ const (
 	PT_VSR0                              = 0x96
 	PT_VSR31                             = 0xd4
 	PT_XER                               = 0x25
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1534,6 +1659,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1618,6 +1745,23 @@ const (
 	SIOCSPGRP                            = 0x8902
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x2
@@ -1728,6 +1872,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1749,6 +1895,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1934,7 +2081,27 @@ const (
 	TIOCSTOP                             = 0x2000746f
 	TIOCSWINSZ                           = 0x80087467
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x400000
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x801054d5
 	TUNDETACHFILTER                      = 0x801054d6
@@ -1962,9 +2129,12 @@ const (
 	TUNSETVNETBE                         = 0x800454de
 	TUNSETVNETHDRSZ                      = 0x800454d8
 	TUNSETVNETLE                         = 0x800454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0x10
 	VEOF                                 = 0x4
 	VEOL                                 = 0x6
@@ -2006,6 +2176,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -2015,7 +2265,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4000
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0xc00
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2195,172 +2447,180 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "no such device or address",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device or resource busy",
-	17:  "file exists",
-	18:  "invalid cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "numerical result out of range",
-	35:  "resource deadlock avoided",
-	36:  "file name too long",
-	37:  "no locks available",
-	38:  "function not implemented",
-	39:  "directory not empty",
-	40:  "too many levels of symbolic links",
-	42:  "no message of desired type",
-	43:  "identifier removed",
-	44:  "channel number out of range",
-	45:  "level 2 not synchronized",
-	46:  "level 3 halted",
-	47:  "level 3 reset",
-	48:  "link number out of range",
-	49:  "protocol driver not attached",
-	50:  "no CSI structure available",
-	51:  "level 2 halted",
-	52:  "invalid exchange",
-	53:  "invalid request descriptor",
-	54:  "exchange full",
-	55:  "no anode",
-	56:  "invalid request code",
-	57:  "invalid slot",
-	58:  "file locking deadlock error",
-	59:  "bad font file format",
-	60:  "device not a stream",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of streams resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "multihop attempted",
-	73:  "RFS specific error",
-	74:  "bad message",
-	75:  "value too large for defined data type",
-	76:  "name not unique on network",
-	77:  "file descriptor in bad state",
-	78:  "remote address changed",
-	79:  "can not access a needed shared library",
-	80:  "accessing a corrupted shared library",
-	81:  ".lib section in a.out corrupted",
-	82:  "attempting to link in too many shared libraries",
-	83:  "cannot exec a shared library directly",
-	84:  "invalid or incomplete multibyte or wide character",
-	85:  "interrupted system call should be restarted",
-	86:  "streams pipe error",
-	87:  "too many users",
-	88:  "socket operation on non-socket",
-	89:  "destination address required",
-	90:  "message too long",
-	91:  "protocol wrong type for socket",
-	92:  "protocol not available",
-	93:  "protocol not supported",
-	94:  "socket type not supported",
-	95:  "operation not supported",
-	96:  "protocol family not supported",
-	97:  "address family not supported by protocol",
-	98:  "address already in use",
-	99:  "cannot assign requested address",
-	100: "network is down",
-	101: "network is unreachable",
-	102: "network dropped connection on reset",
-	103: "software caused connection abort",
-	104: "connection reset by peer",
-	105: "no buffer space available",
-	106: "transport endpoint is already connected",
-	107: "transport endpoint is not connected",
-	108: "cannot send after transport endpoint shutdown",
-	109: "too many references: cannot splice",
-	110: "connection timed out",
-	111: "connection refused",
-	112: "host is down",
-	113: "no route to host",
-	114: "operation already in progress",
-	115: "operation now in progress",
-	116: "stale file handle",
-	117: "structure needs cleaning",
-	118: "not a XENIX named type file",
-	119: "no XENIX semaphores available",
-	120: "is a named type file",
-	121: "remote I/O error",
-	122: "disk quota exceeded",
-	123: "no medium found",
-	124: "wrong medium type",
-	125: "operation canceled",
-	126: "required key not available",
-	127: "key has expired",
-	128: "key has been revoked",
-	129: "key was rejected by service",
-	130: "owner died",
-	131: "state not recoverable",
-	132: "operation not possible due to RF-kill",
-	133: "memory page has hardware error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "EDEADLK", "resource deadlock avoided"},
+	{36, "ENAMETOOLONG", "file name too long"},
+	{37, "ENOLCK", "no locks available"},
+	{38, "ENOSYS", "function not implemented"},
+	{39, "ENOTEMPTY", "directory not empty"},
+	{40, "ELOOP", "too many levels of symbolic links"},
+	{42, "ENOMSG", "no message of desired type"},
+	{43, "EIDRM", "identifier removed"},
+	{44, "ECHRNG", "channel number out of range"},
+	{45, "EL2NSYNC", "level 2 not synchronized"},
+	{46, "EL3HLT", "level 3 halted"},
+	{47, "EL3RST", "level 3 reset"},
+	{48, "ELNRNG", "link number out of range"},
+	{49, "EUNATCH", "protocol driver not attached"},
+	{50, "ENOCSI", "no CSI structure available"},
+	{51, "EL2HLT", "level 2 halted"},
+	{52, "EBADE", "invalid exchange"},
+	{53, "EBADR", "invalid request descriptor"},
+	{54, "EXFULL", "exchange full"},
+	{55, "ENOANO", "no anode"},
+	{56, "EBADRQC", "invalid request code"},
+	{57, "EBADSLT", "invalid slot"},
+	{58, "EDEADLOCK", "file locking deadlock error"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "EMULTIHOP", "multihop attempted"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EBADMSG", "bad message"},
+	{75, "EOVERFLOW", "value too large for defined data type"},
+	{76, "ENOTUNIQ", "name not unique on network"},
+	{77, "EBADFD", "file descriptor in bad state"},
+	{78, "EREMCHG", "remote address changed"},
+	{79, "ELIBACC", "can not access a needed shared library"},
+	{80, "ELIBBAD", "accessing a corrupted shared library"},
+	{81, "ELIBSCN", ".lib section in a.out corrupted"},
+	{82, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{83, "ELIBEXEC", "cannot exec a shared library directly"},
+	{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{85, "ERESTART", "interrupted system call should be restarted"},
+	{86, "ESTRPIPE", "streams pipe error"},
+	{87, "EUSERS", "too many users"},
+	{88, "ENOTSOCK", "socket operation on non-socket"},
+	{89, "EDESTADDRREQ", "destination address required"},
+	{90, "EMSGSIZE", "message too long"},
+	{91, "EPROTOTYPE", "protocol wrong type for socket"},
+	{92, "ENOPROTOOPT", "protocol not available"},
+	{93, "EPROTONOSUPPORT", "protocol not supported"},
+	{94, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{95, "ENOTSUP", "operation not supported"},
+	{96, "EPFNOSUPPORT", "protocol family not supported"},
+	{97, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{98, "EADDRINUSE", "address already in use"},
+	{99, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{100, "ENETDOWN", "network is down"},
+	{101, "ENETUNREACH", "network is unreachable"},
+	{102, "ENETRESET", "network dropped connection on reset"},
+	{103, "ECONNABORTED", "software caused connection abort"},
+	{104, "ECONNRESET", "connection reset by peer"},
+	{105, "ENOBUFS", "no buffer space available"},
+	{106, "EISCONN", "transport endpoint is already connected"},
+	{107, "ENOTCONN", "transport endpoint is not connected"},
+	{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{109, "ETOOMANYREFS", "too many references: cannot splice"},
+	{110, "ETIMEDOUT", "connection timed out"},
+	{111, "ECONNREFUSED", "connection refused"},
+	{112, "EHOSTDOWN", "host is down"},
+	{113, "EHOSTUNREACH", "no route to host"},
+	{114, "EALREADY", "operation already in progress"},
+	{115, "EINPROGRESS", "operation now in progress"},
+	{116, "ESTALE", "stale file handle"},
+	{117, "EUCLEAN", "structure needs cleaning"},
+	{118, "ENOTNAM", "not a XENIX named type file"},
+	{119, "ENAVAIL", "no XENIX semaphores available"},
+	{120, "EISNAM", "is a named type file"},
+	{121, "EREMOTEIO", "remote I/O error"},
+	{122, "EDQUOT", "disk quota exceeded"},
+	{123, "ENOMEDIUM", "no medium found"},
+	{124, "EMEDIUMTYPE", "wrong medium type"},
+	{125, "ECANCELED", "operation canceled"},
+	{126, "ENOKEY", "required key not available"},
+	{127, "EKEYEXPIRED", "key has expired"},
+	{128, "EKEYREVOKED", "key has been revoked"},
+	{129, "EKEYREJECTED", "key was rejected by service"},
+	{130, "EOWNERDEAD", "owner died"},
+	{131, "ENOTRECOVERABLE", "state not recoverable"},
+	{132, "ERFKILL", "operation not possible due to RF-kill"},
+	{133, "EHWPOISON", "memory page has hardware error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "bus error",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "user defined signal 1",
-	11: "segmentation fault",
-	12: "user defined signal 2",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "stack fault",
-	17: "child exited",
-	18: "continued",
-	19: "stopped (signal)",
-	20: "stopped",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "urgent I/O condition",
-	24: "CPU time limit exceeded",
-	25: "file size limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window changed",
-	29: "I/O possible",
-	30: "power failure",
-	31: "bad system call",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGBUS", "bus error"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGUSR1", "user defined signal 1"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGUSR2", "user defined signal 2"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGSTKFLT", "stack fault"},
+	{17, "SIGCHLD", "child exited"},
+	{18, "SIGCONT", "continued"},
+	{19, "SIGSTOP", "stopped (signal)"},
+	{20, "SIGTSTP", "stopped"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGURG", "urgent I/O condition"},
+	{24, "SIGXCPU", "CPU time limit exceeded"},
+	{25, "SIGXFSZ", "file size limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window changed"},
+	{29, "SIGIO", "I/O possible"},
+	{30, "SIGPWR", "power failure"},
+	{31, "SIGSYS", "bad system call"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
index e3f0e27e2740e18720fe8d1f0db7321d3464859e..c7583e15eb443b239181b65922d355dde52fe164 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go
@@ -11,6 +11,11 @@ package unix
 import "syscall"
 
 const (
+	AAFS_MAGIC                           = 0x5a3c69f0
+	ADFS_SUPER_MAGIC                     = 0xadf5
+	AFFS_SUPER_MAGIC                     = 0xadff
+	AFS_FS_MAGIC                         = 0x6b414653
+	AFS_SUPER_MAGIC                      = 0x5346414f
 	AF_ALG                               = 0x26
 	AF_APPLETALK                         = 0x5
 	AF_ASH                               = 0x12
@@ -66,6 +71,7 @@ const (
 	ALG_SET_IV                           = 0x2
 	ALG_SET_KEY                          = 0x1
 	ALG_SET_OP                           = 0x3
+	ANON_INODE_FS_MAGIC                  = 0x9041934
 	ARPHRD_6LOWPAN                       = 0x339
 	ARPHRD_ADAPT                         = 0x108
 	ARPHRD_APPLETLK                      = 0x8
@@ -133,6 +139,7 @@ const (
 	ARPHRD_VOID                          = 0xffff
 	ARPHRD_VSOCKMON                      = 0x33a
 	ARPHRD_X25                           = 0x10f
+	AUTOFS_SUPER_MAGIC                   = 0x187
 	B0                                   = 0x0
 	B1000000                             = 0x1008
 	B110                                 = 0x3
@@ -164,6 +171,9 @@ const (
 	B75                                  = 0x2
 	B921600                              = 0x1007
 	B9600                                = 0xd
+	BALLOON_KVM_MAGIC                    = 0x13661366
+	BDEVFS_MAGIC                         = 0x62646576
+	BINFMTFS_MAGIC                       = 0x42494e4d
 	BLKBSZGET                            = 0x80081270
 	BLKBSZSET                            = 0x40081271
 	BLKFLSBUF                            = 0x1261
@@ -188,6 +198,7 @@ const (
 	BPF_AND                              = 0x50
 	BPF_B                                = 0x10
 	BPF_DIV                              = 0x30
+	BPF_FS_MAGIC                         = 0xcafe4a11
 	BPF_H                                = 0x8
 	BPF_IMM                              = 0x0
 	BPF_IND                              = 0x40
@@ -229,6 +240,8 @@ const (
 	BS0                                  = 0x0
 	BS1                                  = 0x2000
 	BSDLY                                = 0x2000
+	BTRFS_SUPER_MAGIC                    = 0x9123683e
+	BTRFS_TEST_MAGIC                     = 0x73727279
 	CAN_BCM                              = 0x2
 	CAN_EFF_FLAG                         = 0x80000000
 	CAN_EFF_ID_BITS                      = 0x1d
@@ -252,6 +265,8 @@ const (
 	CBAUD                                = 0x100f
 	CBAUDEX                              = 0x1000
 	CFLUSH                               = 0xf
+	CGROUP2_SUPER_MAGIC                  = 0x63677270
+	CGROUP_SUPER_MAGIC                   = 0x27e0eb
 	CIBAUD                               = 0x100f0000
 	CLOCAL                               = 0x800
 	CLOCK_BOOTTIME                       = 0x7
@@ -294,10 +309,12 @@ const (
 	CLONE_VFORK                          = 0x4000
 	CLONE_VM                             = 0x100
 	CMSPAR                               = 0x40000000
+	CODA_SUPER_MAGIC                     = 0x73757245
 	CR0                                  = 0x0
 	CR1                                  = 0x200
 	CR2                                  = 0x400
 	CR3                                  = 0x600
+	CRAMFS_MAGIC                         = 0x28cd3d45
 	CRDLY                                = 0x600
 	CREAD                                = 0x80
 	CRTSCTS                              = 0x80000000
@@ -312,6 +329,9 @@ const (
 	CSTOP                                = 0x13
 	CSTOPB                               = 0x40
 	CSUSP                                = 0x1a
+	DAXFS_MAGIC                          = 0x64646178
+	DEBUGFS_MAGIC                        = 0x64626720
+	DEVPTS_SUPER_MAGIC                   = 0x1cd1
 	DT_BLK                               = 0x6
 	DT_CHR                               = 0x2
 	DT_DIR                               = 0x4
@@ -328,9 +348,12 @@ const (
 	ECHOKE                               = 0x800
 	ECHONL                               = 0x40
 	ECHOPRT                              = 0x400
+	ECRYPTFS_SUPER_MAGIC                 = 0xf15f
 	EFD_CLOEXEC                          = 0x80000
 	EFD_NONBLOCK                         = 0x800
 	EFD_SEMAPHORE                        = 0x1
+	EFIVARFS_MAGIC                       = 0xde5e81e4
+	EFS_SUPER_MAGIC                      = 0x414a53
 	ENCODING_DEFAULT                     = 0x0
 	ENCODING_FM_MARK                     = 0x3
 	ENCODING_FM_SPACE                    = 0x4
@@ -446,9 +469,14 @@ const (
 	ETH_P_WCCP                           = 0x883e
 	ETH_P_X25                            = 0x805
 	ETH_P_XDSA                           = 0xf8
+	EXABYTE_ENABLE_NEST                  = 0xf0
+	EXT2_SUPER_MAGIC                     = 0xef53
+	EXT3_SUPER_MAGIC                     = 0xef53
+	EXT4_SUPER_MAGIC                     = 0xef53
 	EXTA                                 = 0xe
 	EXTB                                 = 0xf
 	EXTPROC                              = 0x10000
+	F2FS_SUPER_MAGIC                     = 0xf2f52010
 	FALLOC_FL_COLLAPSE_RANGE             = 0x8
 	FALLOC_FL_INSERT_RANGE               = 0x20
 	FALLOC_FL_KEEP_SIZE                  = 0x1
@@ -482,6 +510,7 @@ const (
 	FS_POLICY_FLAGS_PAD_8                = 0x1
 	FS_POLICY_FLAGS_PAD_MASK             = 0x3
 	FS_POLICY_FLAGS_VALID                = 0x3
+	FUTEXFS_SUPER_MAGIC                  = 0xbad1dea
 	F_ADD_SEALS                          = 0x409
 	F_DUPFD                              = 0x0
 	F_DUPFD_CLOEXEC                      = 0x406
@@ -543,6 +572,49 @@ const (
 	GENL_UNS_ADMIN_PERM                  = 0x10
 	GRND_NONBLOCK                        = 0x1
 	GRND_RANDOM                          = 0x2
+	HDIO_DRIVE_CMD                       = 0x31f
+	HDIO_DRIVE_CMD_AEB                   = 0x31e
+	HDIO_DRIVE_CMD_HDR_SIZE              = 0x4
+	HDIO_DRIVE_HOB_HDR_SIZE              = 0x8
+	HDIO_DRIVE_RESET                     = 0x31c
+	HDIO_DRIVE_TASK                      = 0x31e
+	HDIO_DRIVE_TASKFILE                  = 0x31d
+	HDIO_DRIVE_TASK_HDR_SIZE             = 0x8
+	HDIO_GETGEO                          = 0x301
+	HDIO_GET_32BIT                       = 0x309
+	HDIO_GET_ACOUSTIC                    = 0x30f
+	HDIO_GET_ADDRESS                     = 0x310
+	HDIO_GET_BUSSTATE                    = 0x31a
+	HDIO_GET_DMA                         = 0x30b
+	HDIO_GET_IDENTITY                    = 0x30d
+	HDIO_GET_KEEPSETTINGS                = 0x308
+	HDIO_GET_MULTCOUNT                   = 0x304
+	HDIO_GET_NICE                        = 0x30c
+	HDIO_GET_NOWERR                      = 0x30a
+	HDIO_GET_QDMA                        = 0x305
+	HDIO_GET_UNMASKINTR                  = 0x302
+	HDIO_GET_WCACHE                      = 0x30e
+	HDIO_OBSOLETE_IDENTITY               = 0x307
+	HDIO_SCAN_HWIF                       = 0x328
+	HDIO_SET_32BIT                       = 0x324
+	HDIO_SET_ACOUSTIC                    = 0x32c
+	HDIO_SET_ADDRESS                     = 0x32f
+	HDIO_SET_BUSSTATE                    = 0x32d
+	HDIO_SET_DMA                         = 0x326
+	HDIO_SET_KEEPSETTINGS                = 0x323
+	HDIO_SET_MULTCOUNT                   = 0x321
+	HDIO_SET_NICE                        = 0x329
+	HDIO_SET_NOWERR                      = 0x325
+	HDIO_SET_PIO_MODE                    = 0x327
+	HDIO_SET_QDMA                        = 0x32e
+	HDIO_SET_UNMASKINTR                  = 0x322
+	HDIO_SET_WCACHE                      = 0x32b
+	HDIO_SET_XFER                        = 0x306
+	HDIO_TRISTATE_HWIF                   = 0x31b
+	HDIO_UNREGISTER_HWIF                 = 0x32a
+	HOSTFS_SUPER_MAGIC                   = 0xc0ffee
+	HPFS_SUPER_MAGIC                     = 0xf995e849
+	HUGETLBFS_MAGIC                      = 0x958458f6
 	HUPCL                                = 0x400
 	IBSHIFT                              = 0x10
 	ICANON                               = 0x2
@@ -793,12 +865,14 @@ const (
 	IP_UNICAST_IF                        = 0x32
 	IP_XFRM_POLICY                       = 0x11
 	ISIG                                 = 0x1
+	ISOFS_SUPER_MAGIC                    = 0x9660
 	ISTRIP                               = 0x20
 	IUCLC                                = 0x200
 	IUTF8                                = 0x4000
 	IXANY                                = 0x800
 	IXOFF                                = 0x1000
 	IXON                                 = 0x400
+	JFFS2_SUPER_MAGIC                    = 0x72b6
 	KEYCTL_ASSUME_AUTHORITY              = 0x10
 	KEYCTL_CHOWN                         = 0x4
 	KEYCTL_CLEAR                         = 0x7
@@ -894,9 +968,15 @@ const (
 	MCL_CURRENT                          = 0x1
 	MCL_FUTURE                           = 0x2
 	MCL_ONFAULT                          = 0x4
+	MINIX2_SUPER_MAGIC                   = 0x2468
+	MINIX2_SUPER_MAGIC2                  = 0x2478
+	MINIX3_SUPER_MAGIC                   = 0x4d5a
+	MINIX_SUPER_MAGIC                    = 0x137f
+	MINIX_SUPER_MAGIC2                   = 0x138f
 	MNT_DETACH                           = 0x2
 	MNT_EXPIRE                           = 0x4
 	MNT_FORCE                            = 0x1
+	MSDOS_SUPER_MAGIC                    = 0x4d44
 	MSG_BATCH                            = 0x40000
 	MSG_CMSG_CLOEXEC                     = 0x40000000
 	MSG_CONFIRM                          = 0x800
@@ -956,7 +1036,9 @@ const (
 	MS_SYNCHRONOUS                       = 0x10
 	MS_UNBINDABLE                        = 0x20000
 	MS_VERBOSE                           = 0x8000
+	MTD_INODE_FS_MAGIC                   = 0x11307854
 	NAME_MAX                             = 0xff
+	NCP_SUPER_MAGIC                      = 0x564c
 	NETLINK_ADD_MEMBERSHIP               = 0x1
 	NETLINK_AUDIT                        = 0x9
 	NETLINK_BROADCAST_ERROR              = 0x4
@@ -991,6 +1073,37 @@ const (
 	NETLINK_UNUSED                       = 0x1
 	NETLINK_USERSOCK                     = 0x2
 	NETLINK_XFRM                         = 0x6
+	NFNETLINK_V0                         = 0x0
+	NFNLGRP_ACCT_QUOTA                   = 0x8
+	NFNLGRP_CONNTRACK_DESTROY            = 0x3
+	NFNLGRP_CONNTRACK_EXP_DESTROY        = 0x6
+	NFNLGRP_CONNTRACK_EXP_NEW            = 0x4
+	NFNLGRP_CONNTRACK_EXP_UPDATE         = 0x5
+	NFNLGRP_CONNTRACK_NEW                = 0x1
+	NFNLGRP_CONNTRACK_UPDATE             = 0x2
+	NFNLGRP_MAX                          = 0x9
+	NFNLGRP_NFTABLES                     = 0x7
+	NFNLGRP_NFTRACE                      = 0x9
+	NFNLGRP_NONE                         = 0x0
+	NFNL_BATCH_MAX                       = 0x1
+	NFNL_MSG_BATCH_BEGIN                 = 0x10
+	NFNL_MSG_BATCH_END                   = 0x11
+	NFNL_NFA_NEST                        = 0x8000
+	NFNL_SUBSYS_ACCT                     = 0x7
+	NFNL_SUBSYS_COUNT                    = 0xc
+	NFNL_SUBSYS_CTHELPER                 = 0x9
+	NFNL_SUBSYS_CTNETLINK                = 0x1
+	NFNL_SUBSYS_CTNETLINK_EXP            = 0x2
+	NFNL_SUBSYS_CTNETLINK_TIMEOUT        = 0x8
+	NFNL_SUBSYS_IPSET                    = 0x6
+	NFNL_SUBSYS_NFTABLES                 = 0xa
+	NFNL_SUBSYS_NFT_COMPAT               = 0xb
+	NFNL_SUBSYS_NONE                     = 0x0
+	NFNL_SUBSYS_OSF                      = 0x5
+	NFNL_SUBSYS_QUEUE                    = 0x3
+	NFNL_SUBSYS_ULOG                     = 0x4
+	NFS_SUPER_MAGIC                      = 0x6969
+	NILFS_SUPER_MAGIC                    = 0x3434
 	NL0                                  = 0x0
 	NL1                                  = 0x100
 	NLA_ALIGNTO                          = 0x4
@@ -1023,6 +1136,8 @@ const (
 	NLM_F_REQUEST                        = 0x1
 	NLM_F_ROOT                           = 0x100
 	NOFLSH                               = 0x80
+	NSFS_MAGIC                           = 0x6e736673
+	OCFS2_SUPER_MAGIC                    = 0x7461636f
 	OCRNL                                = 0x8
 	OFDEL                                = 0x80
 	OFILL                                = 0x40
@@ -1030,7 +1145,9 @@ const (
 	ONLCR                                = 0x4
 	ONLRET                               = 0x20
 	ONOCR                                = 0x10
+	OPENPROM_SUPER_MAGIC                 = 0x9fa1
 	OPOST                                = 0x1
+	OVERLAYFS_SUPER_MAGIC                = 0x794c7630
 	O_ACCMODE                            = 0x3
 	O_APPEND                             = 0x400
 	O_ASYNC                              = 0x2000
@@ -1123,9 +1240,11 @@ const (
 	PERF_EVENT_IOC_SET_BPF               = 0x40042408
 	PERF_EVENT_IOC_SET_FILTER            = 0x40082406
 	PERF_EVENT_IOC_SET_OUTPUT            = 0x2405
+	PIPEFS_MAGIC                         = 0x50495045
 	PRIO_PGRP                            = 0x1
 	PRIO_PROCESS                         = 0x0
 	PRIO_USER                            = 0x2
+	PROC_SUPER_MAGIC                     = 0x9fa0
 	PROT_EXEC                            = 0x4
 	PROT_GROWSDOWN                       = 0x1000000
 	PROT_GROWSUP                         = 0x2000000
@@ -1231,6 +1350,7 @@ const (
 	PR_TSC_SIGSEGV                       = 0x2
 	PR_UNALIGN_NOPRINT                   = 0x1
 	PR_UNALIGN_SIGBUS                    = 0x2
+	PSTOREFS_MAGIC                       = 0x6165676c
 	PTRACE_ATTACH                        = 0x10
 	PTRACE_CONT                          = 0x7
 	PTRACE_DETACH                        = 0x11
@@ -1353,6 +1473,11 @@ const (
 	PT_ORIGGPR2                          = 0xd0
 	PT_PSWADDR                           = 0x8
 	PT_PSWMASK                           = 0x0
+	QNX4_SUPER_MAGIC                     = 0x2f
+	QNX6_SUPER_MAGIC                     = 0x68191122
+	RAMFS_MAGIC                          = 0x858458f6
+	RDTGROUP_SUPER_MAGIC                 = 0x7655821
+	REISERFS_SUPER_MAGIC                 = 0x52654973
 	RLIMIT_AS                            = 0x9
 	RLIMIT_CORE                          = 0x4
 	RLIMIT_CPU                           = 0x0
@@ -1538,6 +1663,8 @@ const (
 	SECCOMP_MODE_DISABLED                = 0x0
 	SECCOMP_MODE_FILTER                  = 0x2
 	SECCOMP_MODE_STRICT                  = 0x1
+	SECURITYFS_MAGIC                     = 0x73636673
+	SELINUX_MAGIC                        = 0xf97cff8c
 	SHUT_RD                              = 0x0
 	SHUT_RDWR                            = 0x2
 	SHUT_WR                              = 0x1
@@ -1622,6 +1749,23 @@ const (
 	SIOCSPGRP                            = 0x8902
 	SIOCSRARP                            = 0x8962
 	SIOCWANDEV                           = 0x894a
+	SMACK_MAGIC                          = 0x43415d53
+	SMART_AUTOSAVE                       = 0xd2
+	SMART_AUTO_OFFLINE                   = 0xdb
+	SMART_DISABLE                        = 0xd9
+	SMART_ENABLE                         = 0xd8
+	SMART_HCYL_PASS                      = 0xc2
+	SMART_IMMEDIATE_OFFLINE              = 0xd4
+	SMART_LCYL_PASS                      = 0x4f
+	SMART_READ_LOG_SECTOR                = 0xd5
+	SMART_READ_THRESHOLDS                = 0xd1
+	SMART_READ_VALUES                    = 0xd0
+	SMART_SAVE                           = 0xd3
+	SMART_STATUS                         = 0xda
+	SMART_WRITE_LOG_SECTOR               = 0xd6
+	SMART_WRITE_THRESHOLDS               = 0xd7
+	SMB_SUPER_MAGIC                      = 0x517b
+	SOCKFS_MAGIC                         = 0x534f434b
 	SOCK_CLOEXEC                         = 0x80000
 	SOCK_DCCP                            = 0x6
 	SOCK_DGRAM                           = 0x2
@@ -1732,6 +1876,8 @@ const (
 	SPLICE_F_MORE                        = 0x4
 	SPLICE_F_MOVE                        = 0x1
 	SPLICE_F_NONBLOCK                    = 0x2
+	SQUASHFS_MAGIC                       = 0x73717368
+	STACK_END_MAGIC                      = 0x57ac6e9d
 	STATX_ALL                            = 0xfff
 	STATX_ATIME                          = 0x20
 	STATX_ATTR_APPEND                    = 0x20
@@ -1753,6 +1899,7 @@ const (
 	STATX_TYPE                           = 0x1
 	STATX_UID                            = 0x8
 	STATX__RESERVED                      = 0x80000000
+	SYSFS_MAGIC                          = 0x62656572
 	S_BLKSIZE                            = 0x200
 	S_IEXEC                              = 0x40
 	S_IFBLK                              = 0x6000
@@ -1934,7 +2081,27 @@ const (
 	TIOCSTI                              = 0x5412
 	TIOCSWINSZ                           = 0x5414
 	TIOCVHANGUP                          = 0x5437
+	TMPFS_MAGIC                          = 0x1021994
 	TOSTOP                               = 0x100
+	TPACKET_ALIGNMENT                    = 0x10
+	TPACKET_HDRLEN                       = 0x34
+	TP_STATUS_AVAILABLE                  = 0x0
+	TP_STATUS_BLK_TMO                    = 0x20
+	TP_STATUS_COPY                       = 0x2
+	TP_STATUS_CSUMNOTREADY               = 0x8
+	TP_STATUS_CSUM_VALID                 = 0x80
+	TP_STATUS_KERNEL                     = 0x0
+	TP_STATUS_LOSING                     = 0x4
+	TP_STATUS_SENDING                    = 0x2
+	TP_STATUS_SEND_REQUEST               = 0x1
+	TP_STATUS_TS_RAW_HARDWARE            = -0x80000000
+	TP_STATUS_TS_SOFTWARE                = 0x20000000
+	TP_STATUS_TS_SYS_HARDWARE            = 0x40000000
+	TP_STATUS_USER                       = 0x1
+	TP_STATUS_VLAN_TPID_VALID            = 0x40
+	TP_STATUS_VLAN_VALID                 = 0x10
+	TP_STATUS_WRONG_FORMAT               = 0x4
+	TRACEFS_MAGIC                        = 0x74726163
 	TS_COMM_LEN                          = 0x20
 	TUNATTACHFILTER                      = 0x401054d5
 	TUNDETACHFILTER                      = 0x401054d6
@@ -1962,9 +2129,12 @@ const (
 	TUNSETVNETBE                         = 0x400454de
 	TUNSETVNETHDRSZ                      = 0x400454d8
 	TUNSETVNETLE                         = 0x400454dc
+	UDF_SUPER_MAGIC                      = 0x15013346
 	UMOUNT_NOFOLLOW                      = 0x8
+	USBDEVICE_SUPER_MAGIC                = 0x9fa2
 	UTIME_NOW                            = 0x3fffffff
 	UTIME_OMIT                           = 0x3ffffffe
+	V9FS_MAGIC                           = 0x1021997
 	VDISCARD                             = 0xd
 	VEOF                                 = 0x4
 	VEOL                                 = 0xb
@@ -2006,6 +2176,86 @@ const (
 	WDIOC_SETPRETIMEOUT                  = 0xc0045708
 	WDIOC_SETTIMEOUT                     = 0xc0045706
 	WEXITED                              = 0x4
+	WIN_ACKMEDIACHANGE                   = 0xdb
+	WIN_CHECKPOWERMODE1                  = 0xe5
+	WIN_CHECKPOWERMODE2                  = 0x98
+	WIN_DEVICE_RESET                     = 0x8
+	WIN_DIAGNOSE                         = 0x90
+	WIN_DOORLOCK                         = 0xde
+	WIN_DOORUNLOCK                       = 0xdf
+	WIN_DOWNLOAD_MICROCODE               = 0x92
+	WIN_FLUSH_CACHE                      = 0xe7
+	WIN_FLUSH_CACHE_EXT                  = 0xea
+	WIN_FORMAT                           = 0x50
+	WIN_GETMEDIASTATUS                   = 0xda
+	WIN_IDENTIFY                         = 0xec
+	WIN_IDENTIFY_DMA                     = 0xee
+	WIN_IDLEIMMEDIATE                    = 0xe1
+	WIN_INIT                             = 0x60
+	WIN_MEDIAEJECT                       = 0xed
+	WIN_MULTREAD                         = 0xc4
+	WIN_MULTREAD_EXT                     = 0x29
+	WIN_MULTWRITE                        = 0xc5
+	WIN_MULTWRITE_EXT                    = 0x39
+	WIN_NOP                              = 0x0
+	WIN_PACKETCMD                        = 0xa0
+	WIN_PIDENTIFY                        = 0xa1
+	WIN_POSTBOOT                         = 0xdc
+	WIN_PREBOOT                          = 0xdd
+	WIN_QUEUED_SERVICE                   = 0xa2
+	WIN_READ                             = 0x20
+	WIN_READDMA                          = 0xc8
+	WIN_READDMA_EXT                      = 0x25
+	WIN_READDMA_ONCE                     = 0xc9
+	WIN_READDMA_QUEUED                   = 0xc7
+	WIN_READDMA_QUEUED_EXT               = 0x26
+	WIN_READ_BUFFER                      = 0xe4
+	WIN_READ_EXT                         = 0x24
+	WIN_READ_LONG                        = 0x22
+	WIN_READ_LONG_ONCE                   = 0x23
+	WIN_READ_NATIVE_MAX                  = 0xf8
+	WIN_READ_NATIVE_MAX_EXT              = 0x27
+	WIN_READ_ONCE                        = 0x21
+	WIN_RECAL                            = 0x10
+	WIN_RESTORE                          = 0x10
+	WIN_SECURITY_DISABLE                 = 0xf6
+	WIN_SECURITY_ERASE_PREPARE           = 0xf3
+	WIN_SECURITY_ERASE_UNIT              = 0xf4
+	WIN_SECURITY_FREEZE_LOCK             = 0xf5
+	WIN_SECURITY_SET_PASS                = 0xf1
+	WIN_SECURITY_UNLOCK                  = 0xf2
+	WIN_SEEK                             = 0x70
+	WIN_SETFEATURES                      = 0xef
+	WIN_SETIDLE1                         = 0xe3
+	WIN_SETIDLE2                         = 0x97
+	WIN_SETMULT                          = 0xc6
+	WIN_SET_MAX                          = 0xf9
+	WIN_SET_MAX_EXT                      = 0x37
+	WIN_SLEEPNOW1                        = 0xe6
+	WIN_SLEEPNOW2                        = 0x99
+	WIN_SMART                            = 0xb0
+	WIN_SPECIFY                          = 0x91
+	WIN_SRST                             = 0x8
+	WIN_STANDBY                          = 0xe2
+	WIN_STANDBY2                         = 0x96
+	WIN_STANDBYNOW1                      = 0xe0
+	WIN_STANDBYNOW2                      = 0x94
+	WIN_VERIFY                           = 0x40
+	WIN_VERIFY_EXT                       = 0x42
+	WIN_VERIFY_ONCE                      = 0x41
+	WIN_WRITE                            = 0x30
+	WIN_WRITEDMA                         = 0xca
+	WIN_WRITEDMA_EXT                     = 0x35
+	WIN_WRITEDMA_ONCE                    = 0xcb
+	WIN_WRITEDMA_QUEUED                  = 0xcc
+	WIN_WRITEDMA_QUEUED_EXT              = 0x36
+	WIN_WRITE_BUFFER                     = 0xe8
+	WIN_WRITE_EXT                        = 0x34
+	WIN_WRITE_LONG                       = 0x32
+	WIN_WRITE_LONG_ONCE                  = 0x33
+	WIN_WRITE_ONCE                       = 0x31
+	WIN_WRITE_SAME                       = 0xe9
+	WIN_WRITE_VERIFY                     = 0x3c
 	WNOHANG                              = 0x1
 	WNOTHREAD                            = 0x20000000
 	WNOWAIT                              = 0x1000000
@@ -2015,7 +2265,9 @@ const (
 	XATTR_CREATE                         = 0x1
 	XATTR_REPLACE                        = 0x2
 	XCASE                                = 0x4
+	XENFS_SUPER_MAGIC                    = 0xabba1974
 	XTABS                                = 0x1800
+	ZSMALLOC_MAGIC                       = 0x58295829
 )
 
 // Errors
@@ -2195,171 +2447,179 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "operation not permitted",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "input/output error",
-	6:   "no such device or address",
-	7:   "argument list too long",
-	8:   "exec format error",
-	9:   "bad file descriptor",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "cannot allocate memory",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device or resource busy",
-	17:  "file exists",
-	18:  "invalid cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "too many open files in system",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "numerical argument out of domain",
-	34:  "numerical result out of range",
-	35:  "resource deadlock avoided",
-	36:  "file name too long",
-	37:  "no locks available",
-	38:  "function not implemented",
-	39:  "directory not empty",
-	40:  "too many levels of symbolic links",
-	42:  "no message of desired type",
-	43:  "identifier removed",
-	44:  "channel number out of range",
-	45:  "level 2 not synchronized",
-	46:  "level 3 halted",
-	47:  "level 3 reset",
-	48:  "link number out of range",
-	49:  "protocol driver not attached",
-	50:  "no CSI structure available",
-	51:  "level 2 halted",
-	52:  "invalid exchange",
-	53:  "invalid request descriptor",
-	54:  "exchange full",
-	55:  "no anode",
-	56:  "invalid request code",
-	57:  "invalid slot",
-	59:  "bad font file format",
-	60:  "device not a stream",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of streams resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "multihop attempted",
-	73:  "RFS specific error",
-	74:  "bad message",
-	75:  "value too large for defined data type",
-	76:  "name not unique on network",
-	77:  "file descriptor in bad state",
-	78:  "remote address changed",
-	79:  "can not access a needed shared library",
-	80:  "accessing a corrupted shared library",
-	81:  ".lib section in a.out corrupted",
-	82:  "attempting to link in too many shared libraries",
-	83:  "cannot exec a shared library directly",
-	84:  "invalid or incomplete multibyte or wide character",
-	85:  "interrupted system call should be restarted",
-	86:  "streams pipe error",
-	87:  "too many users",
-	88:  "socket operation on non-socket",
-	89:  "destination address required",
-	90:  "message too long",
-	91:  "protocol wrong type for socket",
-	92:  "protocol not available",
-	93:  "protocol not supported",
-	94:  "socket type not supported",
-	95:  "operation not supported",
-	96:  "protocol family not supported",
-	97:  "address family not supported by protocol",
-	98:  "address already in use",
-	99:  "cannot assign requested address",
-	100: "network is down",
-	101: "network is unreachable",
-	102: "network dropped connection on reset",
-	103: "software caused connection abort",
-	104: "connection reset by peer",
-	105: "no buffer space available",
-	106: "transport endpoint is already connected",
-	107: "transport endpoint is not connected",
-	108: "cannot send after transport endpoint shutdown",
-	109: "too many references: cannot splice",
-	110: "connection timed out",
-	111: "connection refused",
-	112: "host is down",
-	113: "no route to host",
-	114: "operation already in progress",
-	115: "operation now in progress",
-	116: "stale file handle",
-	117: "structure needs cleaning",
-	118: "not a XENIX named type file",
-	119: "no XENIX semaphores available",
-	120: "is a named type file",
-	121: "remote I/O error",
-	122: "disk quota exceeded",
-	123: "no medium found",
-	124: "wrong medium type",
-	125: "operation canceled",
-	126: "required key not available",
-	127: "key has expired",
-	128: "key has been revoked",
-	129: "key was rejected by service",
-	130: "owner died",
-	131: "state not recoverable",
-	132: "operation not possible due to RF-kill",
-	133: "memory page has hardware error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device or resource busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "invalid cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "numerical result out of range"},
+	{35, "EDEADLK", "resource deadlock avoided"},
+	{36, "ENAMETOOLONG", "file name too long"},
+	{37, "ENOLCK", "no locks available"},
+	{38, "ENOSYS", "function not implemented"},
+	{39, "ENOTEMPTY", "directory not empty"},
+	{40, "ELOOP", "too many levels of symbolic links"},
+	{42, "ENOMSG", "no message of desired type"},
+	{43, "EIDRM", "identifier removed"},
+	{44, "ECHRNG", "channel number out of range"},
+	{45, "EL2NSYNC", "level 2 not synchronized"},
+	{46, "EL3HLT", "level 3 halted"},
+	{47, "EL3RST", "level 3 reset"},
+	{48, "ELNRNG", "link number out of range"},
+	{49, "EUNATCH", "protocol driver not attached"},
+	{50, "ENOCSI", "no CSI structure available"},
+	{51, "EL2HLT", "level 2 halted"},
+	{52, "EBADE", "invalid exchange"},
+	{53, "EBADR", "invalid request descriptor"},
+	{54, "EXFULL", "exchange full"},
+	{55, "ENOANO", "no anode"},
+	{56, "EBADRQC", "invalid request code"},
+	{57, "EBADSLT", "invalid slot"},
+	{59, "EBFONT", "bad font file format"},
+	{60, "ENOSTR", "device not a stream"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of streams resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "EMULTIHOP", "multihop attempted"},
+	{73, "EDOTDOT", "RFS specific error"},
+	{74, "EBADMSG", "bad message"},
+	{75, "EOVERFLOW", "value too large for defined data type"},
+	{76, "ENOTUNIQ", "name not unique on network"},
+	{77, "EBADFD", "file descriptor in bad state"},
+	{78, "EREMCHG", "remote address changed"},
+	{79, "ELIBACC", "can not access a needed shared library"},
+	{80, "ELIBBAD", "accessing a corrupted shared library"},
+	{81, "ELIBSCN", ".lib section in a.out corrupted"},
+	{82, "ELIBMAX", "attempting to link in too many shared libraries"},
+	{83, "ELIBEXEC", "cannot exec a shared library directly"},
+	{84, "EILSEQ", "invalid or incomplete multibyte or wide character"},
+	{85, "ERESTART", "interrupted system call should be restarted"},
+	{86, "ESTRPIPE", "streams pipe error"},
+	{87, "EUSERS", "too many users"},
+	{88, "ENOTSOCK", "socket operation on non-socket"},
+	{89, "EDESTADDRREQ", "destination address required"},
+	{90, "EMSGSIZE", "message too long"},
+	{91, "EPROTOTYPE", "protocol wrong type for socket"},
+	{92, "ENOPROTOOPT", "protocol not available"},
+	{93, "EPROTONOSUPPORT", "protocol not supported"},
+	{94, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{95, "ENOTSUP", "operation not supported"},
+	{96, "EPFNOSUPPORT", "protocol family not supported"},
+	{97, "EAFNOSUPPORT", "address family not supported by protocol"},
+	{98, "EADDRINUSE", "address already in use"},
+	{99, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{100, "ENETDOWN", "network is down"},
+	{101, "ENETUNREACH", "network is unreachable"},
+	{102, "ENETRESET", "network dropped connection on reset"},
+	{103, "ECONNABORTED", "software caused connection abort"},
+	{104, "ECONNRESET", "connection reset by peer"},
+	{105, "ENOBUFS", "no buffer space available"},
+	{106, "EISCONN", "transport endpoint is already connected"},
+	{107, "ENOTCONN", "transport endpoint is not connected"},
+	{108, "ESHUTDOWN", "cannot send after transport endpoint shutdown"},
+	{109, "ETOOMANYREFS", "too many references: cannot splice"},
+	{110, "ETIMEDOUT", "connection timed out"},
+	{111, "ECONNREFUSED", "connection refused"},
+	{112, "EHOSTDOWN", "host is down"},
+	{113, "EHOSTUNREACH", "no route to host"},
+	{114, "EALREADY", "operation already in progress"},
+	{115, "EINPROGRESS", "operation now in progress"},
+	{116, "ESTALE", "stale file handle"},
+	{117, "EUCLEAN", "structure needs cleaning"},
+	{118, "ENOTNAM", "not a XENIX named type file"},
+	{119, "ENAVAIL", "no XENIX semaphores available"},
+	{120, "EISNAM", "is a named type file"},
+	{121, "EREMOTEIO", "remote I/O error"},
+	{122, "EDQUOT", "disk quota exceeded"},
+	{123, "ENOMEDIUM", "no medium found"},
+	{124, "EMEDIUMTYPE", "wrong medium type"},
+	{125, "ECANCELED", "operation canceled"},
+	{126, "ENOKEY", "required key not available"},
+	{127, "EKEYEXPIRED", "key has expired"},
+	{128, "EKEYREVOKED", "key has been revoked"},
+	{129, "EKEYREJECTED", "key was rejected by service"},
+	{130, "EOWNERDEAD", "owner died"},
+	{131, "ENOTRECOVERABLE", "state not recoverable"},
+	{132, "ERFKILL", "operation not possible due to RF-kill"},
+	{133, "EHWPOISON", "memory page has hardware error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/breakpoint trap",
-	6:  "aborted",
-	7:  "bus error",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "user defined signal 1",
-	11: "segmentation fault",
-	12: "user defined signal 2",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "stack fault",
-	17: "child exited",
-	18: "continued",
-	19: "stopped (signal)",
-	20: "stopped",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "urgent I/O condition",
-	24: "CPU time limit exceeded",
-	25: "file size limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window changed",
-	29: "I/O possible",
-	30: "power failure",
-	31: "bad system call",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/breakpoint trap"},
+	{6, "SIGABRT", "aborted"},
+	{7, "SIGBUS", "bus error"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGUSR1", "user defined signal 1"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGUSR2", "user defined signal 2"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGSTKFLT", "stack fault"},
+	{17, "SIGCHLD", "child exited"},
+	{18, "SIGCONT", "continued"},
+	{19, "SIGSTOP", "stopped (signal)"},
+	{20, "SIGTSTP", "stopped"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGURG", "urgent I/O condition"},
+	{24, "SIGXCPU", "CPU time limit exceeded"},
+	{25, "SIGXFSZ", "file size limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window changed"},
+	{29, "SIGIO", "I/O possible"},
+	{30, "SIGPWR", "power failure"},
+	{31, "SIGSYS", "bad system call"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
index 3eef63f5a6b2ab5e27fc5a37cd79220720883919..cd93ce0d85e53032d72b2e7748067599a9fb5688 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go
@@ -1584,137 +1584,145 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large or too small",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol option not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "connection timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "identifier removed",
-	83: "no message of desired type",
-	84: "value too large to be stored in data type",
-	85: "illegal byte sequence",
-	86: "not supported",
-	87: "operation Canceled",
-	88: "bad or Corrupt message",
-	89: "no message available",
-	90: "no STREAM resources",
-	91: "not a STREAM",
-	92: "STREAM ioctl timeout",
-	93: "attribute not found",
-	94: "multihop attempted",
-	95: "link has been severed",
-	96: "protocol error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large or too small"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol option not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "connection timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIDRM", "identifier removed"},
+	{83, "ENOMSG", "no message of desired type"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "EILSEQ", "illegal byte sequence"},
+	{86, "ENOTSUP", "not supported"},
+	{87, "ECANCELED", "operation Canceled"},
+	{88, "EBADMSG", "bad or Corrupt message"},
+	{89, "ENODATA", "no message available"},
+	{90, "ENOSR", "no STREAM resources"},
+	{91, "ENOSTR", "not a STREAM"},
+	{92, "ETIME", "STREAM ioctl timeout"},
+	{93, "ENOATTR", "attribute not found"},
+	{94, "EMULTIHOP", "multihop attempted"},
+	{95, "ENOLINK", "link has been severed"},
+	{96, "ELAST", "protocol error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "stopped (signal)",
-	18: "stopped",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "power fail/restart",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGIOT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "stopped (signal)"},
+	{18, "SIGTSTP", "stopped"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGPWR", "power fail/restart"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
index 40c870be156a6cfe3544504b61bcd5b2cc626575..071701c41181c10c9e6d1d24242ddcae2028503f 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go
@@ -1574,137 +1574,145 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large or too small",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol option not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "connection timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "identifier removed",
-	83: "no message of desired type",
-	84: "value too large to be stored in data type",
-	85: "illegal byte sequence",
-	86: "not supported",
-	87: "operation Canceled",
-	88: "bad or Corrupt message",
-	89: "no message available",
-	90: "no STREAM resources",
-	91: "not a STREAM",
-	92: "STREAM ioctl timeout",
-	93: "attribute not found",
-	94: "multihop attempted",
-	95: "link has been severed",
-	96: "protocol error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large or too small"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol option not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "connection timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIDRM", "identifier removed"},
+	{83, "ENOMSG", "no message of desired type"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "EILSEQ", "illegal byte sequence"},
+	{86, "ENOTSUP", "not supported"},
+	{87, "ECANCELED", "operation Canceled"},
+	{88, "EBADMSG", "bad or Corrupt message"},
+	{89, "ENODATA", "no message available"},
+	{90, "ENOSR", "no STREAM resources"},
+	{91, "ENOSTR", "not a STREAM"},
+	{92, "ETIME", "STREAM ioctl timeout"},
+	{93, "ENOATTR", "attribute not found"},
+	{94, "EMULTIHOP", "multihop attempted"},
+	{95, "ENOLINK", "link has been severed"},
+	{96, "ELAST", "protocol error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "stopped (signal)",
-	18: "stopped",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "power fail/restart",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGIOT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "stopped (signal)"},
+	{18, "SIGTSTP", "stopped"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGPWR", "power fail/restart"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
index 43c4add50c2c6524af9289f9b611539ae8096245..5fe56ae8c72415d904676f969c67a3659227082b 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go
@@ -1563,137 +1563,145 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large or too small",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol option not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "connection timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "identifier removed",
-	83: "no message of desired type",
-	84: "value too large to be stored in data type",
-	85: "illegal byte sequence",
-	86: "not supported",
-	87: "operation Canceled",
-	88: "bad or Corrupt message",
-	89: "no message available",
-	90: "no STREAM resources",
-	91: "not a STREAM",
-	92: "STREAM ioctl timeout",
-	93: "attribute not found",
-	94: "multihop attempted",
-	95: "link has been severed",
-	96: "protocol error",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large or too small"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol option not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "connection timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disc quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC prog. not avail"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIDRM", "identifier removed"},
+	{83, "ENOMSG", "no message of desired type"},
+	{84, "EOVERFLOW", "value too large to be stored in data type"},
+	{85, "EILSEQ", "illegal byte sequence"},
+	{86, "ENOTSUP", "not supported"},
+	{87, "ECANCELED", "operation Canceled"},
+	{88, "EBADMSG", "bad or Corrupt message"},
+	{89, "ENODATA", "no message available"},
+	{90, "ENOSR", "no STREAM resources"},
+	{91, "ENOSTR", "not a STREAM"},
+	{92, "ETIME", "STREAM ioctl timeout"},
+	{93, "ENOATTR", "attribute not found"},
+	{94, "EMULTIHOP", "multihop attempted"},
+	{95, "ENOLINK", "link has been severed"},
+	{96, "ELAST", "protocol error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "stopped (signal)",
-	18: "stopped",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "power fail/restart",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGIOT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "stopped (signal)"},
+	{18, "SIGTSTP", "stopped"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGPWR", "power fail/restart"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
index f47536dc43e5a9aa056c1c9277c12e78115a8a5e..0a1c3e7e8c3b6a323491c31eb0efe1b4203e464a 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go
@@ -1461,132 +1461,140 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "connection timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "IPsec processing failure",
-	83: "attribute not found",
-	84: "illegal byte sequence",
-	85: "no medium found",
-	86: "wrong medium type",
-	87: "value too large to be stored in data type",
-	88: "operation canceled",
-	89: "identifier removed",
-	90: "no message of desired type",
-	91: "not supported",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EWOULDBLOCK", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disk quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC program not available"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIPSEC", "IPsec processing failure"},
+	{83, "ENOATTR", "attribute not found"},
+	{84, "EILSEQ", "illegal byte sequence"},
+	{85, "ENOMEDIUM", "no medium found"},
+	{86, "EMEDIUMTYPE", "wrong medium type"},
+	{87, "EOVERFLOW", "value too large to be stored in data type"},
+	{88, "ECANCELED", "operation canceled"},
+	{89, "EIDRM", "identifier removed"},
+	{90, "ENOMSG", "no message of desired type"},
+	{91, "ELAST", "not supported"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "stopped (signal)",
-	18: "stopped",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "thread AST",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGABRT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGTHR", "thread AST"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
index c96ca653ac7cf04613ed5ca68963f74ba362c01e..acfc6646919427e0a8b6d1d6630a2e2ea064236a 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go
@@ -45,6 +45,7 @@ const (
 	AF_SNA                            = 0xb
 	AF_UNIX                           = 0x1
 	AF_UNSPEC                         = 0x0
+	ALTWERASE                         = 0x200
 	ARPHRD_ETHER                      = 0x1
 	ARPHRD_FRELAY                     = 0xf
 	ARPHRD_IEEE1394                   = 0x18
@@ -146,6 +147,12 @@ const (
 	BRKINT                            = 0x2
 	CFLUSH                            = 0xf
 	CLOCAL                            = 0x8000
+	CLOCK_BOOTTIME                    = 0x6
+	CLOCK_MONOTONIC                   = 0x3
+	CLOCK_PROCESS_CPUTIME_ID          = 0x2
+	CLOCK_REALTIME                    = 0x0
+	CLOCK_THREAD_CPUTIME_ID           = 0x4
+	CLOCK_UPTIME                      = 0x5
 	CREAD                             = 0x800
 	CRTSCTS                           = 0x10000
 	CS5                               = 0x0
@@ -178,6 +185,7 @@ const (
 	DLT_LOOP                          = 0xc
 	DLT_MPLS                          = 0xdb
 	DLT_NULL                          = 0x0
+	DLT_OPENFLOW                      = 0x10b
 	DLT_PFLOG                         = 0x75
 	DLT_PFSYNC                        = 0x12
 	DLT_PPP                           = 0x9
@@ -188,6 +196,23 @@ const (
 	DLT_RAW                           = 0xe
 	DLT_SLIP                          = 0x8
 	DLT_SLIP_BSDOS                    = 0xf
+	DLT_USBPCAP                       = 0xf9
+	DLT_USER0                         = 0x93
+	DLT_USER1                         = 0x94
+	DLT_USER10                        = 0x9d
+	DLT_USER11                        = 0x9e
+	DLT_USER12                        = 0x9f
+	DLT_USER13                        = 0xa0
+	DLT_USER14                        = 0xa1
+	DLT_USER15                        = 0xa2
+	DLT_USER2                         = 0x95
+	DLT_USER3                         = 0x96
+	DLT_USER4                         = 0x97
+	DLT_USER5                         = 0x98
+	DLT_USER6                         = 0x99
+	DLT_USER7                         = 0x9a
+	DLT_USER8                         = 0x9b
+	DLT_USER9                         = 0x9c
 	DT_BLK                            = 0x6
 	DT_CHR                            = 0x2
 	DT_DIR                            = 0x4
@@ -401,27 +426,38 @@ const (
 	ETHER_CRC_POLY_LE                 = 0xedb88320
 	ETHER_HDR_LEN                     = 0xe
 	ETHER_MAX_DIX_LEN                 = 0x600
+	ETHER_MAX_HARDMTU_LEN             = 0xff9b
 	ETHER_MAX_LEN                     = 0x5ee
 	ETHER_MIN_LEN                     = 0x40
 	ETHER_TYPE_LEN                    = 0x2
 	ETHER_VLAN_ENCAP_LEN              = 0x4
 	EVFILT_AIO                        = -0x3
+	EVFILT_DEVICE                     = -0x8
 	EVFILT_PROC                       = -0x5
 	EVFILT_READ                       = -0x1
 	EVFILT_SIGNAL                     = -0x6
-	EVFILT_SYSCOUNT                   = 0x7
+	EVFILT_SYSCOUNT                   = 0x8
 	EVFILT_TIMER                      = -0x7
 	EVFILT_VNODE                      = -0x4
 	EVFILT_WRITE                      = -0x2
+	EVL_ENCAPLEN                      = 0x4
+	EVL_PRIO_BITS                     = 0xd
+	EVL_PRIO_MAX                      = 0x7
+	EVL_VLID_MASK                     = 0xfff
+	EVL_VLID_MAX                      = 0xffe
+	EVL_VLID_MIN                      = 0x1
+	EVL_VLID_NULL                     = 0x0
 	EV_ADD                            = 0x1
 	EV_CLEAR                          = 0x20
 	EV_DELETE                         = 0x2
 	EV_DISABLE                        = 0x8
+	EV_DISPATCH                       = 0x80
 	EV_ENABLE                         = 0x4
 	EV_EOF                            = 0x8000
 	EV_ERROR                          = 0x4000
 	EV_FLAG1                          = 0x2000
 	EV_ONESHOT                        = 0x10
+	EV_RECEIPT                        = 0x40
 	EV_SYSFLAGS                       = 0xf000
 	EXTA                              = 0x4b00
 	EXTB                              = 0x9600
@@ -435,7 +471,7 @@ const (
 	F_GETFL                           = 0x3
 	F_GETLK                           = 0x7
 	F_GETOWN                          = 0x5
-	F_OK                              = 0x0
+	F_ISATTY                          = 0xb
 	F_RDLCK                           = 0x1
 	F_SETFD                           = 0x2
 	F_SETFL                           = 0x4
@@ -452,7 +488,6 @@ const (
 	IEXTEN                            = 0x400
 	IFAN_ARRIVAL                      = 0x0
 	IFAN_DEPARTURE                    = 0x1
-	IFA_ROUTE                         = 0x1
 	IFF_ALLMULTI                      = 0x200
 	IFF_BROADCAST                     = 0x2
 	IFF_CANTCHANGE                    = 0x8e52
@@ -463,12 +498,12 @@ const (
 	IFF_LOOPBACK                      = 0x8
 	IFF_MULTICAST                     = 0x8000
 	IFF_NOARP                         = 0x80
-	IFF_NOTRAILERS                    = 0x20
 	IFF_OACTIVE                       = 0x400
 	IFF_POINTOPOINT                   = 0x10
 	IFF_PROMISC                       = 0x100
 	IFF_RUNNING                       = 0x40
 	IFF_SIMPLEX                       = 0x800
+	IFF_STATICARP                     = 0x20
 	IFF_UP                            = 0x1
 	IFNAMSIZ                          = 0x10
 	IFT_1822                          = 0x2
@@ -597,6 +632,7 @@ const (
 	IFT_LINEGROUP                     = 0xd2
 	IFT_LOCALTALK                     = 0x2a
 	IFT_LOOP                          = 0x18
+	IFT_MBIM                          = 0xfa
 	IFT_MEDIAMAILOVERIP               = 0x8b
 	IFT_MFSIGLINK                     = 0xa7
 	IFT_MIOX25                        = 0x26
@@ -721,8 +757,6 @@ const (
 	IPPROTO_AH                        = 0x33
 	IPPROTO_CARP                      = 0x70
 	IPPROTO_DIVERT                    = 0x102
-	IPPROTO_DIVERT_INIT               = 0x2
-	IPPROTO_DIVERT_RESP               = 0x1
 	IPPROTO_DONE                      = 0x101
 	IPPROTO_DSTOPTS                   = 0x3c
 	IPPROTO_EGP                       = 0x8
@@ -779,6 +813,7 @@ const (
 	IPV6_LEAVE_GROUP                  = 0xd
 	IPV6_MAXHLIM                      = 0xff
 	IPV6_MAXPACKET                    = 0xffff
+	IPV6_MINHOPCOUNT                  = 0x41
 	IPV6_MMTU                         = 0x500
 	IPV6_MULTICAST_HOPS               = 0xa
 	IPV6_MULTICAST_IF                 = 0x9
@@ -818,12 +853,12 @@ const (
 	IP_DEFAULT_MULTICAST_LOOP         = 0x1
 	IP_DEFAULT_MULTICAST_TTL          = 0x1
 	IP_DF                             = 0x4000
-	IP_DIVERTFL                       = 0x1022
 	IP_DROP_MEMBERSHIP                = 0xd
 	IP_ESP_NETWORK_LEVEL              = 0x16
 	IP_ESP_TRANS_LEVEL                = 0x15
 	IP_HDRINCL                        = 0x2
 	IP_IPCOMP_LEVEL                   = 0x1d
+	IP_IPDEFTTL                       = 0x25
 	IP_IPSECFLOWINFO                  = 0x24
 	IP_IPSEC_LOCAL_AUTH               = 0x1b
 	IP_IPSEC_LOCAL_CRED               = 0x19
@@ -857,10 +892,12 @@ const (
 	IP_RETOPTS                        = 0x8
 	IP_RF                             = 0x8000
 	IP_RTABLE                         = 0x1021
+	IP_SENDSRCADDR                    = 0x7
 	IP_TOS                            = 0x3
 	IP_TTL                            = 0x4
 	ISIG                              = 0x80
 	ISTRIP                            = 0x20
+	IUCLC                             = 0x1000
 	IXANY                             = 0x800
 	IXOFF                             = 0x400
 	IXON                              = 0x200
@@ -881,25 +918,28 @@ const (
 	MADV_SPACEAVAIL                   = 0x5
 	MADV_WILLNEED                     = 0x3
 	MAP_ANON                          = 0x1000
-	MAP_COPY                          = 0x4
+	MAP_ANONYMOUS                     = 0x1000
+	MAP_COPY                          = 0x2
 	MAP_FILE                          = 0x0
 	MAP_FIXED                         = 0x10
-	MAP_FLAGMASK                      = 0x1ff7
-	MAP_HASSEMAPHORE                  = 0x200
-	MAP_INHERIT                       = 0x80
+	MAP_FLAGMASK                      = 0x7ff7
+	MAP_HASSEMAPHORE                  = 0x0
+	MAP_INHERIT                       = 0x0
 	MAP_INHERIT_COPY                  = 0x1
-	MAP_INHERIT_DONATE_COPY           = 0x3
 	MAP_INHERIT_NONE                  = 0x2
 	MAP_INHERIT_SHARE                 = 0x0
-	MAP_NOEXTEND                      = 0x100
-	MAP_NORESERVE                     = 0x40
+	MAP_INHERIT_ZERO                  = 0x3
+	MAP_NOEXTEND                      = 0x0
+	MAP_NORESERVE                     = 0x0
 	MAP_PRIVATE                       = 0x2
-	MAP_RENAME                        = 0x20
+	MAP_RENAME                        = 0x0
 	MAP_SHARED                        = 0x1
-	MAP_TRYFIXED                      = 0x400
+	MAP_STACK                         = 0x4000
+	MAP_TRYFIXED                      = 0x0
 	MCL_CURRENT                       = 0x1
 	MCL_FUTURE                        = 0x2
 	MSG_BCAST                         = 0x100
+	MSG_CMSG_CLOEXEC                  = 0x800
 	MSG_CTRUNC                        = 0x20
 	MSG_DONTROUTE                     = 0x4
 	MSG_DONTWAIT                      = 0x80
@@ -917,11 +957,14 @@ const (
 	NET_RT_DUMP                       = 0x1
 	NET_RT_FLAGS                      = 0x2
 	NET_RT_IFLIST                     = 0x3
-	NET_RT_MAXID                      = 0x6
+	NET_RT_IFNAMES                    = 0x6
+	NET_RT_MAXID                      = 0x7
 	NET_RT_STATS                      = 0x4
 	NET_RT_TABLE                      = 0x5
 	NOFLSH                            = 0x80000000
+	NOKERNINFO                        = 0x2000000
 	NOTE_ATTRIB                       = 0x8
+	NOTE_CHANGE                       = 0x1
 	NOTE_CHILD                        = 0x4
 	NOTE_DELETE                       = 0x1
 	NOTE_EOF                          = 0x2
@@ -940,11 +983,13 @@ const (
 	NOTE_TRUNCATE                     = 0x80
 	NOTE_WRITE                        = 0x2
 	OCRNL                             = 0x10
+	OLCUC                             = 0x20
 	ONLCR                             = 0x2
 	ONLRET                            = 0x80
 	ONOCR                             = 0x40
 	ONOEOT                            = 0x8
 	OPOST                             = 0x1
+	OXTABS                            = 0x4
 	O_ACCMODE                         = 0x3
 	O_APPEND                          = 0x8
 	O_ASYNC                           = 0x40
@@ -982,23 +1027,32 @@ const (
 	RLIMIT_CPU                        = 0x0
 	RLIMIT_DATA                       = 0x2
 	RLIMIT_FSIZE                      = 0x1
+	RLIMIT_MEMLOCK                    = 0x6
 	RLIMIT_NOFILE                     = 0x8
+	RLIMIT_NPROC                      = 0x7
+	RLIMIT_RSS                        = 0x5
 	RLIMIT_STACK                      = 0x3
 	RLIM_INFINITY                     = 0x7fffffffffffffff
 	RTAX_AUTHOR                       = 0x6
+	RTAX_BFD                          = 0xb
 	RTAX_BRD                          = 0x7
+	RTAX_DNS                          = 0xc
 	RTAX_DST                          = 0x0
 	RTAX_GATEWAY                      = 0x1
 	RTAX_GENMASK                      = 0x3
 	RTAX_IFA                          = 0x5
 	RTAX_IFP                          = 0x4
 	RTAX_LABEL                        = 0xa
-	RTAX_MAX                          = 0xb
+	RTAX_MAX                          = 0xf
 	RTAX_NETMASK                      = 0x2
+	RTAX_SEARCH                       = 0xe
 	RTAX_SRC                          = 0x8
 	RTAX_SRCMASK                      = 0x9
+	RTAX_STATIC                       = 0xd
 	RTA_AUTHOR                        = 0x40
+	RTA_BFD                           = 0x800
 	RTA_BRD                           = 0x80
+	RTA_DNS                           = 0x1000
 	RTA_DST                           = 0x1
 	RTA_GATEWAY                       = 0x2
 	RTA_GENMASK                       = 0x8
@@ -1006,34 +1060,39 @@ const (
 	RTA_IFP                           = 0x10
 	RTA_LABEL                         = 0x400
 	RTA_NETMASK                       = 0x4
+	RTA_SEARCH                        = 0x4000
 	RTA_SRC                           = 0x100
 	RTA_SRCMASK                       = 0x200
+	RTA_STATIC                        = 0x2000
 	RTF_ANNOUNCE                      = 0x4000
+	RTF_BFD                           = 0x1000000
 	RTF_BLACKHOLE                     = 0x1000
+	RTF_BROADCAST                     = 0x400000
+	RTF_CACHED                        = 0x20000
 	RTF_CLONED                        = 0x10000
 	RTF_CLONING                       = 0x100
+	RTF_CONNECTED                     = 0x800000
 	RTF_DONE                          = 0x40
 	RTF_DYNAMIC                       = 0x10
-	RTF_FMASK                         = 0x10f808
+	RTF_FMASK                         = 0x110fc08
 	RTF_GATEWAY                       = 0x2
 	RTF_HOST                          = 0x4
 	RTF_LLINFO                        = 0x400
-	RTF_MASK                          = 0x80
+	RTF_LOCAL                         = 0x200000
 	RTF_MODIFIED                      = 0x20
 	RTF_MPATH                         = 0x40000
 	RTF_MPLS                          = 0x100000
+	RTF_MULTICAST                     = 0x200
 	RTF_PERMANENT_ARP                 = 0x2000
 	RTF_PROTO1                        = 0x8000
 	RTF_PROTO2                        = 0x4000
 	RTF_PROTO3                        = 0x2000
 	RTF_REJECT                        = 0x8
-	RTF_SOURCE                        = 0x20000
 	RTF_STATIC                        = 0x800
-	RTF_TUNNEL                        = 0x100000
 	RTF_UP                            = 0x1
 	RTF_USETRAILERS                   = 0x8000
-	RTF_XRESOLVE                      = 0x200
 	RTM_ADD                           = 0x1
+	RTM_BFD                           = 0x12
 	RTM_CHANGE                        = 0x3
 	RTM_DELADDR                       = 0xd
 	RTM_DELETE                        = 0x2
@@ -1041,11 +1100,13 @@ const (
 	RTM_GET                           = 0x4
 	RTM_IFANNOUNCE                    = 0xf
 	RTM_IFINFO                        = 0xe
+	RTM_INVALIDATE                    = 0x11
 	RTM_LOCK                          = 0x8
 	RTM_LOSING                        = 0x5
 	RTM_MAXSIZE                       = 0x800
 	RTM_MISS                          = 0x7
 	RTM_NEWADDR                       = 0xc
+	RTM_PROPOSAL                      = 0x13
 	RTM_REDIRECT                      = 0x6
 	RTM_RESOLVE                       = 0xb
 	RTM_RTTUNIT                       = 0xf4240
@@ -1058,6 +1119,8 @@ const (
 	RTV_RTTVAR                        = 0x80
 	RTV_SPIPE                         = 0x10
 	RTV_SSTHRESH                      = 0x20
+	RT_TABLEID_BITS                   = 0x8
+	RT_TABLEID_MASK                   = 0xff
 	RT_TABLEID_MAX                    = 0xff
 	RUSAGE_CHILDREN                   = -0x1
 	RUSAGE_SELF                       = 0x0
@@ -1070,55 +1133,55 @@ const (
 	SIOCADDMULTI                      = 0x80206931
 	SIOCAIFADDR                       = 0x8040691a
 	SIOCAIFGROUP                      = 0x80286987
-	SIOCALIFADDR                      = 0x8218691c
 	SIOCATMARK                        = 0x40047307
-	SIOCBRDGADD                       = 0x8058693c
-	SIOCBRDGADDS                      = 0x80586941
-	SIOCBRDGARL                       = 0x806e694d
+	SIOCBRDGADD                       = 0x8060693c
+	SIOCBRDGADDL                      = 0x80606949
+	SIOCBRDGADDS                      = 0x80606941
+	SIOCBRDGARL                       = 0x808c694d
 	SIOCBRDGDADDR                     = 0x81286947
-	SIOCBRDGDEL                       = 0x8058693d
-	SIOCBRDGDELS                      = 0x80586942
-	SIOCBRDGFLUSH                     = 0x80586948
-	SIOCBRDGFRL                       = 0x806e694e
-	SIOCBRDGGCACHE                    = 0xc0146941
-	SIOCBRDGGFD                       = 0xc0146952
-	SIOCBRDGGHT                       = 0xc0146951
-	SIOCBRDGGIFFLGS                   = 0xc058693e
-	SIOCBRDGGMA                       = 0xc0146953
+	SIOCBRDGDEL                       = 0x8060693d
+	SIOCBRDGDELS                      = 0x80606942
+	SIOCBRDGFLUSH                     = 0x80606948
+	SIOCBRDGFRL                       = 0x808c694e
+	SIOCBRDGGCACHE                    = 0xc0186941
+	SIOCBRDGGFD                       = 0xc0186952
+	SIOCBRDGGHT                       = 0xc0186951
+	SIOCBRDGGIFFLGS                   = 0xc060693e
+	SIOCBRDGGMA                       = 0xc0186953
 	SIOCBRDGGPARAM                    = 0xc0406958
-	SIOCBRDGGPRI                      = 0xc0146950
+	SIOCBRDGGPRI                      = 0xc0186950
 	SIOCBRDGGRL                       = 0xc030694f
-	SIOCBRDGGSIFS                     = 0xc058693c
-	SIOCBRDGGTO                       = 0xc0146946
-	SIOCBRDGIFS                       = 0xc0586942
+	SIOCBRDGGTO                       = 0xc0186946
+	SIOCBRDGIFS                       = 0xc0606942
 	SIOCBRDGRTS                       = 0xc0206943
 	SIOCBRDGSADDR                     = 0xc1286944
-	SIOCBRDGSCACHE                    = 0x80146940
-	SIOCBRDGSFD                       = 0x80146952
-	SIOCBRDGSHT                       = 0x80146951
-	SIOCBRDGSIFCOST                   = 0x80586955
-	SIOCBRDGSIFFLGS                   = 0x8058693f
-	SIOCBRDGSIFPRIO                   = 0x80586954
-	SIOCBRDGSMA                       = 0x80146953
-	SIOCBRDGSPRI                      = 0x80146950
-	SIOCBRDGSPROTO                    = 0x8014695a
-	SIOCBRDGSTO                       = 0x80146945
-	SIOCBRDGSTXHC                     = 0x80146959
+	SIOCBRDGSCACHE                    = 0x80186940
+	SIOCBRDGSFD                       = 0x80186952
+	SIOCBRDGSHT                       = 0x80186951
+	SIOCBRDGSIFCOST                   = 0x80606955
+	SIOCBRDGSIFFLGS                   = 0x8060693f
+	SIOCBRDGSIFPRIO                   = 0x80606954
+	SIOCBRDGSIFPROT                   = 0x8060694a
+	SIOCBRDGSMA                       = 0x80186953
+	SIOCBRDGSPRI                      = 0x80186950
+	SIOCBRDGSPROTO                    = 0x8018695a
+	SIOCBRDGSTO                       = 0x80186945
+	SIOCBRDGSTXHC                     = 0x80186959
 	SIOCDELMULTI                      = 0x80206932
 	SIOCDIFADDR                       = 0x80206919
 	SIOCDIFGROUP                      = 0x80286989
+	SIOCDIFPARENT                     = 0x802069b4
 	SIOCDIFPHYADDR                    = 0x80206949
-	SIOCDLIFADDR                      = 0x8218691e
+	SIOCDVNETID                       = 0x802069af
 	SIOCGETKALIVE                     = 0xc01869a4
 	SIOCGETLABEL                      = 0x8020699a
+	SIOCGETMPWCFG                     = 0xc02069ae
 	SIOCGETPFLOW                      = 0xc02069fe
 	SIOCGETPFSYNC                     = 0xc02069f8
 	SIOCGETSGCNT                      = 0xc0207534
 	SIOCGETVIFCNT                     = 0xc0287533
 	SIOCGETVLAN                       = 0xc0206990
-	SIOCGHIWAT                        = 0x40047301
 	SIOCGIFADDR                       = 0xc0206921
-	SIOCGIFASYNCMAP                   = 0xc020697c
 	SIOCGIFBRDADDR                    = 0xc0206923
 	SIOCGIFCONF                       = 0xc0106924
 	SIOCGIFDATA                       = 0xc020691b
@@ -1130,37 +1193,41 @@ const (
 	SIOCGIFGMEMB                      = 0xc028698a
 	SIOCGIFGROUP                      = 0xc0286988
 	SIOCGIFHARDMTU                    = 0xc02069a5
-	SIOCGIFMEDIA                      = 0xc0306936
+	SIOCGIFLLPRIO                     = 0xc02069b6
+	SIOCGIFMEDIA                      = 0xc0406938
 	SIOCGIFMETRIC                     = 0xc0206917
 	SIOCGIFMTU                        = 0xc020697e
 	SIOCGIFNETMASK                    = 0xc0206925
-	SIOCGIFPDSTADDR                   = 0xc0206948
+	SIOCGIFPAIR                       = 0xc02069b1
+	SIOCGIFPARENT                     = 0xc02069b3
 	SIOCGIFPRIORITY                   = 0xc020699c
-	SIOCGIFPSRCADDR                   = 0xc0206947
 	SIOCGIFRDOMAIN                    = 0xc02069a0
 	SIOCGIFRTLABEL                    = 0xc0206983
-	SIOCGIFTIMESLOT                   = 0xc0206986
+	SIOCGIFRXR                        = 0x802069aa
 	SIOCGIFXFLAGS                     = 0xc020699e
-	SIOCGLIFADDR                      = 0xc218691d
 	SIOCGLIFPHYADDR                   = 0xc218694b
+	SIOCGLIFPHYDF                     = 0xc02069c2
 	SIOCGLIFPHYRTABLE                 = 0xc02069a2
 	SIOCGLIFPHYTTL                    = 0xc02069a9
-	SIOCGLOWAT                        = 0x40047303
 	SIOCGPGRP                         = 0x40047309
 	SIOCGSPPPPARAMS                   = 0xc0206994
+	SIOCGUMBINFO                      = 0xc02069be
+	SIOCGUMBPARAM                     = 0xc02069c0
 	SIOCGVH                           = 0xc02069f6
+	SIOCGVNETFLOWID                   = 0xc02069c4
 	SIOCGVNETID                       = 0xc02069a7
+	SIOCIFAFATTACH                    = 0x801169ab
+	SIOCIFAFDETACH                    = 0x801169ac
 	SIOCIFCREATE                      = 0x8020697a
 	SIOCIFDESTROY                     = 0x80206979
 	SIOCIFGCLONERS                    = 0xc0106978
 	SIOCSETKALIVE                     = 0x801869a3
 	SIOCSETLABEL                      = 0x80206999
+	SIOCSETMPWCFG                     = 0x802069ad
 	SIOCSETPFLOW                      = 0x802069fd
 	SIOCSETPFSYNC                     = 0x802069f7
 	SIOCSETVLAN                       = 0x8020698f
-	SIOCSHIWAT                        = 0x80047300
 	SIOCSIFADDR                       = 0x8020690c
-	SIOCSIFASYNCMAP                   = 0x8020697d
 	SIOCSIFBRDADDR                    = 0x80206913
 	SIOCSIFDESCR                      = 0x80206980
 	SIOCSIFDSTADDR                    = 0x8020690e
@@ -1168,25 +1235,36 @@ const (
 	SIOCSIFGATTR                      = 0x8028698c
 	SIOCSIFGENERIC                    = 0x80206939
 	SIOCSIFLLADDR                     = 0x8020691f
-	SIOCSIFMEDIA                      = 0xc0206935
+	SIOCSIFLLPRIO                     = 0x802069b5
+	SIOCSIFMEDIA                      = 0xc0206937
 	SIOCSIFMETRIC                     = 0x80206918
 	SIOCSIFMTU                        = 0x8020697f
 	SIOCSIFNETMASK                    = 0x80206916
-	SIOCSIFPHYADDR                    = 0x80406946
+	SIOCSIFPAIR                       = 0x802069b0
+	SIOCSIFPARENT                     = 0x802069b2
 	SIOCSIFPRIORITY                   = 0x8020699b
 	SIOCSIFRDOMAIN                    = 0x8020699f
 	SIOCSIFRTLABEL                    = 0x80206982
-	SIOCSIFTIMESLOT                   = 0x80206985
 	SIOCSIFXFLAGS                     = 0x8020699d
 	SIOCSLIFPHYADDR                   = 0x8218694a
+	SIOCSLIFPHYDF                     = 0x802069c1
 	SIOCSLIFPHYRTABLE                 = 0x802069a1
 	SIOCSLIFPHYTTL                    = 0x802069a8
-	SIOCSLOWAT                        = 0x80047302
 	SIOCSPGRP                         = 0x80047308
 	SIOCSSPPPPARAMS                   = 0x80206993
+	SIOCSUMBPARAM                     = 0x802069bf
 	SIOCSVH                           = 0xc02069f5
+	SIOCSVNETFLOWID                   = 0x802069c3
 	SIOCSVNETID                       = 0x802069a6
+	SIOCSWGDPID                       = 0xc018695b
+	SIOCSWGMAXFLOW                    = 0xc0186960
+	SIOCSWGMAXGROUP                   = 0xc018695d
+	SIOCSWSDPID                       = 0x8018695c
+	SIOCSWSPORTNO                     = 0xc060695f
+	SOCK_CLOEXEC                      = 0x8000
 	SOCK_DGRAM                        = 0x2
+	SOCK_DNS                          = 0x1000
+	SOCK_NONBLOCK                     = 0x4000
 	SOCK_RAW                          = 0x3
 	SOCK_RDM                          = 0x4
 	SOCK_SEQPACKET                    = 0x5
@@ -1217,9 +1295,14 @@ const (
 	SO_TIMESTAMP                      = 0x800
 	SO_TYPE                           = 0x1008
 	SO_USELOOPBACK                    = 0x40
+	SO_ZEROIZE                        = 0x2000
 	TCIFLUSH                          = 0x1
+	TCIOFF                            = 0x3
 	TCIOFLUSH                         = 0x3
+	TCION                             = 0x4
 	TCOFLUSH                          = 0x2
+	TCOOFF                            = 0x1
+	TCOON                             = 0x2
 	TCP_MAXBURST                      = 0x4
 	TCP_MAXSEG                        = 0x2
 	TCP_MAXWIN                        = 0xffff
@@ -1229,11 +1312,12 @@ const (
 	TCP_MSS                           = 0x200
 	TCP_NODELAY                       = 0x1
 	TCP_NOPUSH                        = 0x10
-	TCP_NSTATES                       = 0xb
 	TCP_SACK_ENABLE                   = 0x8
 	TCSAFLUSH                         = 0x2
 	TIOCCBRK                          = 0x2000747a
 	TIOCCDTR                          = 0x20007478
+	TIOCCHKVERAUTH                    = 0x2000741e
+	TIOCCLRVERAUTH                    = 0x2000741d
 	TIOCCONS                          = 0x80047462
 	TIOCDRAIN                         = 0x2000745e
 	TIOCEXCL                          = 0x2000740d
@@ -1288,16 +1372,19 @@ const (
 	TIOCSETAF                         = 0x802c7416
 	TIOCSETAW                         = 0x802c7415
 	TIOCSETD                          = 0x8004741b
+	TIOCSETVERAUTH                    = 0x8004741c
 	TIOCSFLAGS                        = 0x8004745c
 	TIOCSIG                           = 0x8004745f
 	TIOCSPGRP                         = 0x80047476
 	TIOCSTART                         = 0x2000746e
-	TIOCSTAT                          = 0x80047465
+	TIOCSTAT                          = 0x20007465
 	TIOCSTI                           = 0x80017472
 	TIOCSTOP                          = 0x2000746f
 	TIOCSTSTAMP                       = 0x8008745a
 	TIOCSWINSZ                        = 0x80087467
 	TIOCUCNTL                         = 0x80047466
+	TIOCUCNTL_CBRK                    = 0x7a
+	TIOCUCNTL_SBRK                    = 0x7b
 	TOSTOP                            = 0x400000
 	VDISCARD                          = 0xf
 	VDSUSP                            = 0xb
@@ -1309,6 +1396,18 @@ const (
 	VKILL                             = 0x5
 	VLNEXT                            = 0xe
 	VMIN                              = 0x10
+	VM_ANONMIN                        = 0x7
+	VM_LOADAVG                        = 0x2
+	VM_MAXID                          = 0xc
+	VM_MAXSLP                         = 0xa
+	VM_METER                          = 0x1
+	VM_NKMEMPAGES                     = 0x6
+	VM_PSSTRINGS                      = 0x3
+	VM_SWAPENCRYPT                    = 0x5
+	VM_USPACE                         = 0xb
+	VM_UVMEXP                         = 0x4
+	VM_VNODEMIN                       = 0x9
+	VM_VTEXTMIN                       = 0x8
 	VQUIT                             = 0x9
 	VREPRINT                          = 0x6
 	VSTART                            = 0xc
@@ -1321,8 +1420,8 @@ const (
 	WCONTINUED                        = 0x8
 	WCOREFLAG                         = 0x80
 	WNOHANG                           = 0x1
-	WSTOPPED                          = 0x7f
 	WUNTRACED                         = 0x2
+	XCASE                             = 0x1000000
 )
 
 // Errors
@@ -1336,6 +1435,7 @@ const (
 	EALREADY        = syscall.Errno(0x25)
 	EAUTH           = syscall.Errno(0x50)
 	EBADF           = syscall.Errno(0x9)
+	EBADMSG         = syscall.Errno(0x5c)
 	EBADRPC         = syscall.Errno(0x48)
 	EBUSY           = syscall.Errno(0x10)
 	ECANCELED       = syscall.Errno(0x58)
@@ -1362,7 +1462,7 @@ const (
 	EIPSEC          = syscall.Errno(0x52)
 	EISCONN         = syscall.Errno(0x38)
 	EISDIR          = syscall.Errno(0x15)
-	ELAST           = syscall.Errno(0x5b)
+	ELAST           = syscall.Errno(0x5f)
 	ELOOP           = syscall.Errno(0x3e)
 	EMEDIUMTYPE     = syscall.Errno(0x56)
 	EMFILE          = syscall.Errno(0x18)
@@ -1390,12 +1490,14 @@ const (
 	ENOTCONN        = syscall.Errno(0x39)
 	ENOTDIR         = syscall.Errno(0x14)
 	ENOTEMPTY       = syscall.Errno(0x42)
+	ENOTRECOVERABLE = syscall.Errno(0x5d)
 	ENOTSOCK        = syscall.Errno(0x26)
 	ENOTSUP         = syscall.Errno(0x5b)
 	ENOTTY          = syscall.Errno(0x19)
 	ENXIO           = syscall.Errno(0x6)
 	EOPNOTSUPP      = syscall.Errno(0x2d)
 	EOVERFLOW       = syscall.Errno(0x57)
+	EOWNERDEAD      = syscall.Errno(0x5e)
 	EPERM           = syscall.Errno(0x1)
 	EPFNOSUPPORT    = syscall.Errno(0x2e)
 	EPIPE           = syscall.Errno(0x20)
@@ -1403,6 +1505,7 @@ const (
 	EPROCUNAVAIL    = syscall.Errno(0x4c)
 	EPROGMISMATCH   = syscall.Errno(0x4b)
 	EPROGUNAVAIL    = syscall.Errno(0x4a)
+	EPROTO          = syscall.Errno(0x5f)
 	EPROTONOSUPPORT = syscall.Errno(0x2b)
 	EPROTOTYPE      = syscall.Errno(0x29)
 	ERANGE          = syscall.Errno(0x22)
@@ -1460,132 +1563,144 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "connection timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "IPsec processing failure",
-	83: "attribute not found",
-	84: "illegal byte sequence",
-	85: "no medium found",
-	86: "wrong medium type",
-	87: "value too large to be stored in data type",
-	88: "operation canceled",
-	89: "identifier removed",
-	90: "no message of desired type",
-	91: "not supported",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EAGAIN", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disk quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC program not available"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIPSEC", "IPsec processing failure"},
+	{83, "ENOATTR", "attribute not found"},
+	{84, "EILSEQ", "illegal byte sequence"},
+	{85, "ENOMEDIUM", "no medium found"},
+	{86, "EMEDIUMTYPE", "wrong medium type"},
+	{87, "EOVERFLOW", "value too large to be stored in data type"},
+	{88, "ECANCELED", "operation canceled"},
+	{89, "EIDRM", "identifier removed"},
+	{90, "ENOMSG", "no message of desired type"},
+	{91, "ENOTSUP", "not supported"},
+	{92, "EBADMSG", "bad message"},
+	{93, "ENOTRECOVERABLE", "state not recoverable"},
+	{94, "EOWNERDEAD", "previous owner died"},
+	{95, "ELAST", "protocol error"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "stopped (signal)",
-	18: "stopped",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "thread AST",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGABRT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGTHR", "thread AST"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
index 4c027352e91b70f023424db55f86349bbd8d4ce0..93e37c4b289ed8b0a7772e29a0abb621a170bfdb 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go
@@ -1463,132 +1463,140 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:  "operation not permitted",
-	2:  "no such file or directory",
-	3:  "no such process",
-	4:  "interrupted system call",
-	5:  "input/output error",
-	6:  "device not configured",
-	7:  "argument list too long",
-	8:  "exec format error",
-	9:  "bad file descriptor",
-	10: "no child processes",
-	11: "resource deadlock avoided",
-	12: "cannot allocate memory",
-	13: "permission denied",
-	14: "bad address",
-	15: "block device required",
-	16: "device busy",
-	17: "file exists",
-	18: "cross-device link",
-	19: "operation not supported by device",
-	20: "not a directory",
-	21: "is a directory",
-	22: "invalid argument",
-	23: "too many open files in system",
-	24: "too many open files",
-	25: "inappropriate ioctl for device",
-	26: "text file busy",
-	27: "file too large",
-	28: "no space left on device",
-	29: "illegal seek",
-	30: "read-only file system",
-	31: "too many links",
-	32: "broken pipe",
-	33: "numerical argument out of domain",
-	34: "result too large",
-	35: "resource temporarily unavailable",
-	36: "operation now in progress",
-	37: "operation already in progress",
-	38: "socket operation on non-socket",
-	39: "destination address required",
-	40: "message too long",
-	41: "protocol wrong type for socket",
-	42: "protocol not available",
-	43: "protocol not supported",
-	44: "socket type not supported",
-	45: "operation not supported",
-	46: "protocol family not supported",
-	47: "address family not supported by protocol family",
-	48: "address already in use",
-	49: "can't assign requested address",
-	50: "network is down",
-	51: "network is unreachable",
-	52: "network dropped connection on reset",
-	53: "software caused connection abort",
-	54: "connection reset by peer",
-	55: "no buffer space available",
-	56: "socket is already connected",
-	57: "socket is not connected",
-	58: "can't send after socket shutdown",
-	59: "too many references: can't splice",
-	60: "connection timed out",
-	61: "connection refused",
-	62: "too many levels of symbolic links",
-	63: "file name too long",
-	64: "host is down",
-	65: "no route to host",
-	66: "directory not empty",
-	67: "too many processes",
-	68: "too many users",
-	69: "disc quota exceeded",
-	70: "stale NFS file handle",
-	71: "too many levels of remote in path",
-	72: "RPC struct is bad",
-	73: "RPC version wrong",
-	74: "RPC prog. not avail",
-	75: "program version wrong",
-	76: "bad procedure for program",
-	77: "no locks available",
-	78: "function not implemented",
-	79: "inappropriate file type or format",
-	80: "authentication error",
-	81: "need authenticator",
-	82: "IPsec processing failure",
-	83: "attribute not found",
-	84: "illegal byte sequence",
-	85: "no medium found",
-	86: "wrong medium type",
-	87: "value too large to be stored in data type",
-	88: "operation canceled",
-	89: "identifier removed",
-	90: "no message of desired type",
-	91: "not supported",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "operation not permitted"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "input/output error"},
+	{6, "ENXIO", "device not configured"},
+	{7, "E2BIG", "argument list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file descriptor"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EDEADLK", "resource deadlock avoided"},
+	{12, "ENOMEM", "cannot allocate memory"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "operation not supported by device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "too many open files in system"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "numerical argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "EWOULDBLOCK", "resource temporarily unavailable"},
+	{36, "EINPROGRESS", "operation now in progress"},
+	{37, "EALREADY", "operation already in progress"},
+	{38, "ENOTSOCK", "socket operation on non-socket"},
+	{39, "EDESTADDRREQ", "destination address required"},
+	{40, "EMSGSIZE", "message too long"},
+	{41, "EPROTOTYPE", "protocol wrong type for socket"},
+	{42, "ENOPROTOOPT", "protocol not available"},
+	{43, "EPROTONOSUPPORT", "protocol not supported"},
+	{44, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{45, "EOPNOTSUPP", "operation not supported"},
+	{46, "EPFNOSUPPORT", "protocol family not supported"},
+	{47, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{48, "EADDRINUSE", "address already in use"},
+	{49, "EADDRNOTAVAIL", "can't assign requested address"},
+	{50, "ENETDOWN", "network is down"},
+	{51, "ENETUNREACH", "network is unreachable"},
+	{52, "ENETRESET", "network dropped connection on reset"},
+	{53, "ECONNABORTED", "software caused connection abort"},
+	{54, "ECONNRESET", "connection reset by peer"},
+	{55, "ENOBUFS", "no buffer space available"},
+	{56, "EISCONN", "socket is already connected"},
+	{57, "ENOTCONN", "socket is not connected"},
+	{58, "ESHUTDOWN", "can't send after socket shutdown"},
+	{59, "ETOOMANYREFS", "too many references: can't splice"},
+	{60, "ETIMEDOUT", "operation timed out"},
+	{61, "ECONNREFUSED", "connection refused"},
+	{62, "ELOOP", "too many levels of symbolic links"},
+	{63, "ENAMETOOLONG", "file name too long"},
+	{64, "EHOSTDOWN", "host is down"},
+	{65, "EHOSTUNREACH", "no route to host"},
+	{66, "ENOTEMPTY", "directory not empty"},
+	{67, "EPROCLIM", "too many processes"},
+	{68, "EUSERS", "too many users"},
+	{69, "EDQUOT", "disk quota exceeded"},
+	{70, "ESTALE", "stale NFS file handle"},
+	{71, "EREMOTE", "too many levels of remote in path"},
+	{72, "EBADRPC", "RPC struct is bad"},
+	{73, "ERPCMISMATCH", "RPC version wrong"},
+	{74, "EPROGUNAVAIL", "RPC program not available"},
+	{75, "EPROGMISMATCH", "program version wrong"},
+	{76, "EPROCUNAVAIL", "bad procedure for program"},
+	{77, "ENOLCK", "no locks available"},
+	{78, "ENOSYS", "function not implemented"},
+	{79, "EFTYPE", "inappropriate file type or format"},
+	{80, "EAUTH", "authentication error"},
+	{81, "ENEEDAUTH", "need authenticator"},
+	{82, "EIPSEC", "IPsec processing failure"},
+	{83, "ENOATTR", "attribute not found"},
+	{84, "EILSEQ", "illegal byte sequence"},
+	{85, "ENOMEDIUM", "no medium found"},
+	{86, "EMEDIUMTYPE", "wrong medium type"},
+	{87, "EOVERFLOW", "value too large to be stored in data type"},
+	{88, "ECANCELED", "operation canceled"},
+	{89, "EIDRM", "identifier removed"},
+	{90, "ENOMSG", "no message of desired type"},
+	{91, "ELAST", "not supported"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal instruction",
-	5:  "trace/BPT trap",
-	6:  "abort trap",
-	7:  "EMT trap",
-	8:  "floating point exception",
-	9:  "killed",
-	10: "bus error",
-	11: "segmentation fault",
-	12: "bad system call",
-	13: "broken pipe",
-	14: "alarm clock",
-	15: "terminated",
-	16: "urgent I/O condition",
-	17: "stopped (signal)",
-	18: "stopped",
-	19: "continued",
-	20: "child exited",
-	21: "stopped (tty input)",
-	22: "stopped (tty output)",
-	23: "I/O possible",
-	24: "cputime limit exceeded",
-	25: "filesize limit exceeded",
-	26: "virtual timer expired",
-	27: "profiling timer expired",
-	28: "window size changes",
-	29: "information request",
-	30: "user defined signal 1",
-	31: "user defined signal 2",
-	32: "thread AST",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal instruction"},
+	{5, "SIGTRAP", "trace/BPT trap"},
+	{6, "SIGABRT", "abort trap"},
+	{7, "SIGEMT", "EMT trap"},
+	{8, "SIGFPE", "floating point exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus error"},
+	{11, "SIGSEGV", "segmentation fault"},
+	{12, "SIGSYS", "bad system call"},
+	{13, "SIGPIPE", "broken pipe"},
+	{14, "SIGALRM", "alarm clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGURG", "urgent I/O condition"},
+	{17, "SIGSTOP", "suspended (signal)"},
+	{18, "SIGTSTP", "suspended"},
+	{19, "SIGCONT", "continued"},
+	{20, "SIGCHLD", "child exited"},
+	{21, "SIGTTIN", "stopped (tty input)"},
+	{22, "SIGTTOU", "stopped (tty output)"},
+	{23, "SIGIO", "I/O possible"},
+	{24, "SIGXCPU", "cputime limit exceeded"},
+	{25, "SIGXFSZ", "filesize limit exceeded"},
+	{26, "SIGVTALRM", "virtual timer expired"},
+	{27, "SIGPROF", "profiling timer expired"},
+	{28, "SIGWINCH", "window size changes"},
+	{29, "SIGINFO", "information request"},
+	{30, "SIGUSR1", "user defined signal 1"},
+	{31, "SIGUSR2", "user defined signal 2"},
+	{32, "SIGTHR", "thread AST"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go
index 09eedb009353e3a10fb9bafe59ac33db48f3fd48..be42830cf3d382bb7a55deed8a552be087bdd351 100644
--- a/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go
@@ -1319,171 +1319,179 @@ const (
 )
 
 // Error table
-var errors = [...]string{
-	1:   "not owner",
-	2:   "no such file or directory",
-	3:   "no such process",
-	4:   "interrupted system call",
-	5:   "I/O error",
-	6:   "no such device or address",
-	7:   "arg list too long",
-	8:   "exec format error",
-	9:   "bad file number",
-	10:  "no child processes",
-	11:  "resource temporarily unavailable",
-	12:  "not enough space",
-	13:  "permission denied",
-	14:  "bad address",
-	15:  "block device required",
-	16:  "device busy",
-	17:  "file exists",
-	18:  "cross-device link",
-	19:  "no such device",
-	20:  "not a directory",
-	21:  "is a directory",
-	22:  "invalid argument",
-	23:  "file table overflow",
-	24:  "too many open files",
-	25:  "inappropriate ioctl for device",
-	26:  "text file busy",
-	27:  "file too large",
-	28:  "no space left on device",
-	29:  "illegal seek",
-	30:  "read-only file system",
-	31:  "too many links",
-	32:  "broken pipe",
-	33:  "argument out of domain",
-	34:  "result too large",
-	35:  "no message of desired type",
-	36:  "identifier removed",
-	37:  "channel number out of range",
-	38:  "level 2 not synchronized",
-	39:  "level 3 halted",
-	40:  "level 3 reset",
-	41:  "link number out of range",
-	42:  "protocol driver not attached",
-	43:  "no CSI structure available",
-	44:  "level 2 halted",
-	45:  "deadlock situation detected/avoided",
-	46:  "no record locks available",
-	47:  "operation canceled",
-	48:  "operation not supported",
-	49:  "disc quota exceeded",
-	50:  "bad exchange descriptor",
-	51:  "bad request descriptor",
-	52:  "message tables full",
-	53:  "anode table overflow",
-	54:  "bad request code",
-	55:  "invalid slot",
-	56:  "file locking deadlock",
-	57:  "bad font file format",
-	58:  "owner of the lock died",
-	59:  "lock is not recoverable",
-	60:  "not a stream device",
-	61:  "no data available",
-	62:  "timer expired",
-	63:  "out of stream resources",
-	64:  "machine is not on the network",
-	65:  "package not installed",
-	66:  "object is remote",
-	67:  "link has been severed",
-	68:  "advertise error",
-	69:  "srmount error",
-	70:  "communication error on send",
-	71:  "protocol error",
-	72:  "locked lock was unmapped ",
-	73:  "facility is not active",
-	74:  "multihop attempted",
-	77:  "not a data message",
-	78:  "file name too long",
-	79:  "value too large for defined data type",
-	80:  "name not unique on network",
-	81:  "file descriptor in bad state",
-	82:  "remote address changed",
-	83:  "can not access a needed shared library",
-	84:  "accessing a corrupted shared library",
-	85:  ".lib section in a.out corrupted",
-	86:  "attempting to link in more shared libraries than system limit",
-	87:  "can not exec a shared library directly",
-	88:  "illegal byte sequence",
-	89:  "operation not applicable",
-	90:  "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS",
-	91:  "error 91",
-	92:  "error 92",
-	93:  "directory not empty",
-	94:  "too many users",
-	95:  "socket operation on non-socket",
-	96:  "destination address required",
-	97:  "message too long",
-	98:  "protocol wrong type for socket",
-	99:  "option not supported by protocol",
-	120: "protocol not supported",
-	121: "socket type not supported",
-	122: "operation not supported on transport endpoint",
-	123: "protocol family not supported",
-	124: "address family not supported by protocol family",
-	125: "address already in use",
-	126: "cannot assign requested address",
-	127: "network is down",
-	128: "network is unreachable",
-	129: "network dropped connection because of reset",
-	130: "software caused connection abort",
-	131: "connection reset by peer",
-	132: "no buffer space available",
-	133: "transport endpoint is already connected",
-	134: "transport endpoint is not connected",
-	143: "cannot send after socket shutdown",
-	144: "too many references: cannot splice",
-	145: "connection timed out",
-	146: "connection refused",
-	147: "host is down",
-	148: "no route to host",
-	149: "operation already in progress",
-	150: "operation now in progress",
-	151: "stale NFS file handle",
+var errorList = [...]struct {
+	num  syscall.Errno
+	name string
+	desc string
+}{
+	{1, "EPERM", "not owner"},
+	{2, "ENOENT", "no such file or directory"},
+	{3, "ESRCH", "no such process"},
+	{4, "EINTR", "interrupted system call"},
+	{5, "EIO", "I/O error"},
+	{6, "ENXIO", "no such device or address"},
+	{7, "E2BIG", "arg list too long"},
+	{8, "ENOEXEC", "exec format error"},
+	{9, "EBADF", "bad file number"},
+	{10, "ECHILD", "no child processes"},
+	{11, "EAGAIN", "resource temporarily unavailable"},
+	{12, "ENOMEM", "not enough space"},
+	{13, "EACCES", "permission denied"},
+	{14, "EFAULT", "bad address"},
+	{15, "ENOTBLK", "block device required"},
+	{16, "EBUSY", "device busy"},
+	{17, "EEXIST", "file exists"},
+	{18, "EXDEV", "cross-device link"},
+	{19, "ENODEV", "no such device"},
+	{20, "ENOTDIR", "not a directory"},
+	{21, "EISDIR", "is a directory"},
+	{22, "EINVAL", "invalid argument"},
+	{23, "ENFILE", "file table overflow"},
+	{24, "EMFILE", "too many open files"},
+	{25, "ENOTTY", "inappropriate ioctl for device"},
+	{26, "ETXTBSY", "text file busy"},
+	{27, "EFBIG", "file too large"},
+	{28, "ENOSPC", "no space left on device"},
+	{29, "ESPIPE", "illegal seek"},
+	{30, "EROFS", "read-only file system"},
+	{31, "EMLINK", "too many links"},
+	{32, "EPIPE", "broken pipe"},
+	{33, "EDOM", "argument out of domain"},
+	{34, "ERANGE", "result too large"},
+	{35, "ENOMSG", "no message of desired type"},
+	{36, "EIDRM", "identifier removed"},
+	{37, "ECHRNG", "channel number out of range"},
+	{38, "EL2NSYNC", "level 2 not synchronized"},
+	{39, "EL3HLT", "level 3 halted"},
+	{40, "EL3RST", "level 3 reset"},
+	{41, "ELNRNG", "link number out of range"},
+	{42, "EUNATCH", "protocol driver not attached"},
+	{43, "ENOCSI", "no CSI structure available"},
+	{44, "EL2HLT", "level 2 halted"},
+	{45, "EDEADLK", "deadlock situation detected/avoided"},
+	{46, "ENOLCK", "no record locks available"},
+	{47, "ECANCELED", "operation canceled"},
+	{48, "ENOTSUP", "operation not supported"},
+	{49, "EDQUOT", "disc quota exceeded"},
+	{50, "EBADE", "bad exchange descriptor"},
+	{51, "EBADR", "bad request descriptor"},
+	{52, "EXFULL", "message tables full"},
+	{53, "ENOANO", "anode table overflow"},
+	{54, "EBADRQC", "bad request code"},
+	{55, "EBADSLT", "invalid slot"},
+	{56, "EDEADLOCK", "file locking deadlock"},
+	{57, "EBFONT", "bad font file format"},
+	{58, "EOWNERDEAD", "owner of the lock died"},
+	{59, "ENOTRECOVERABLE", "lock is not recoverable"},
+	{60, "ENOSTR", "not a stream device"},
+	{61, "ENODATA", "no data available"},
+	{62, "ETIME", "timer expired"},
+	{63, "ENOSR", "out of stream resources"},
+	{64, "ENONET", "machine is not on the network"},
+	{65, "ENOPKG", "package not installed"},
+	{66, "EREMOTE", "object is remote"},
+	{67, "ENOLINK", "link has been severed"},
+	{68, "EADV", "advertise error"},
+	{69, "ESRMNT", "srmount error"},
+	{70, "ECOMM", "communication error on send"},
+	{71, "EPROTO", "protocol error"},
+	{72, "ELOCKUNMAPPED", "locked lock was unmapped "},
+	{73, "ENOTACTIVE", "facility is not active"},
+	{74, "EMULTIHOP", "multihop attempted"},
+	{77, "EBADMSG", "not a data message"},
+	{78, "ENAMETOOLONG", "file name too long"},
+	{79, "EOVERFLOW", "value too large for defined data type"},
+	{80, "ENOTUNIQ", "name not unique on network"},
+	{81, "EBADFD", "file descriptor in bad state"},
+	{82, "EREMCHG", "remote address changed"},
+	{83, "ELIBACC", "can not access a needed shared library"},
+	{84, "ELIBBAD", "accessing a corrupted shared library"},
+	{85, "ELIBSCN", ".lib section in a.out corrupted"},
+	{86, "ELIBMAX", "attempting to link in more shared libraries than system limit"},
+	{87, "ELIBEXEC", "can not exec a shared library directly"},
+	{88, "EILSEQ", "illegal byte sequence"},
+	{89, "ENOSYS", "operation not applicable"},
+	{90, "ELOOP", "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS"},
+	{91, "ERESTART", "error 91"},
+	{92, "ESTRPIPE", "error 92"},
+	{93, "ENOTEMPTY", "directory not empty"},
+	{94, "EUSERS", "too many users"},
+	{95, "ENOTSOCK", "socket operation on non-socket"},
+	{96, "EDESTADDRREQ", "destination address required"},
+	{97, "EMSGSIZE", "message too long"},
+	{98, "EPROTOTYPE", "protocol wrong type for socket"},
+	{99, "ENOPROTOOPT", "option not supported by protocol"},
+	{120, "EPROTONOSUPPORT", "protocol not supported"},
+	{121, "ESOCKTNOSUPPORT", "socket type not supported"},
+	{122, "EOPNOTSUPP", "operation not supported on transport endpoint"},
+	{123, "EPFNOSUPPORT", "protocol family not supported"},
+	{124, "EAFNOSUPPORT", "address family not supported by protocol family"},
+	{125, "EADDRINUSE", "address already in use"},
+	{126, "EADDRNOTAVAIL", "cannot assign requested address"},
+	{127, "ENETDOWN", "network is down"},
+	{128, "ENETUNREACH", "network is unreachable"},
+	{129, "ENETRESET", "network dropped connection because of reset"},
+	{130, "ECONNABORTED", "software caused connection abort"},
+	{131, "ECONNRESET", "connection reset by peer"},
+	{132, "ENOBUFS", "no buffer space available"},
+	{133, "EISCONN", "transport endpoint is already connected"},
+	{134, "ENOTCONN", "transport endpoint is not connected"},
+	{143, "ESHUTDOWN", "cannot send after socket shutdown"},
+	{144, "ETOOMANYREFS", "too many references: cannot splice"},
+	{145, "ETIMEDOUT", "connection timed out"},
+	{146, "ECONNREFUSED", "connection refused"},
+	{147, "EHOSTDOWN", "host is down"},
+	{148, "EHOSTUNREACH", "no route to host"},
+	{149, "EALREADY", "operation already in progress"},
+	{150, "EINPROGRESS", "operation now in progress"},
+	{151, "ESTALE", "stale NFS file handle"},
 }
 
 // Signal table
-var signals = [...]string{
-	1:  "hangup",
-	2:  "interrupt",
-	3:  "quit",
-	4:  "illegal Instruction",
-	5:  "trace/Breakpoint Trap",
-	6:  "abort",
-	7:  "emulation Trap",
-	8:  "arithmetic Exception",
-	9:  "killed",
-	10: "bus Error",
-	11: "segmentation Fault",
-	12: "bad System Call",
-	13: "broken Pipe",
-	14: "alarm Clock",
-	15: "terminated",
-	16: "user Signal 1",
-	17: "user Signal 2",
-	18: "child Status Changed",
-	19: "power-Fail/Restart",
-	20: "window Size Change",
-	21: "urgent Socket Condition",
-	22: "pollable Event",
-	23: "stopped (signal)",
-	24: "stopped (user)",
-	25: "continued",
-	26: "stopped (tty input)",
-	27: "stopped (tty output)",
-	28: "virtual Timer Expired",
-	29: "profiling Timer Expired",
-	30: "cpu Limit Exceeded",
-	31: "file Size Limit Exceeded",
-	32: "no runnable lwp",
-	33: "inter-lwp signal",
-	34: "checkpoint Freeze",
-	35: "checkpoint Thaw",
-	36: "thread Cancellation",
-	37: "resource Lost",
-	38: "resource Control Exceeded",
-	39: "reserved for JVM 1",
-	40: "reserved for JVM 2",
-	41: "information Request",
+var signalList = [...]struct {
+	num  syscall.Signal
+	name string
+	desc string
+}{
+	{1, "SIGHUP", "hangup"},
+	{2, "SIGINT", "interrupt"},
+	{3, "SIGQUIT", "quit"},
+	{4, "SIGILL", "illegal Instruction"},
+	{5, "SIGTRAP", "trace/Breakpoint Trap"},
+	{6, "SIGABRT", "abort"},
+	{7, "SIGEMT", "emulation Trap"},
+	{8, "SIGFPE", "arithmetic Exception"},
+	{9, "SIGKILL", "killed"},
+	{10, "SIGBUS", "bus Error"},
+	{11, "SIGSEGV", "segmentation Fault"},
+	{12, "SIGSYS", "bad System Call"},
+	{13, "SIGPIPE", "broken Pipe"},
+	{14, "SIGALRM", "alarm Clock"},
+	{15, "SIGTERM", "terminated"},
+	{16, "SIGUSR1", "user Signal 1"},
+	{17, "SIGUSR2", "user Signal 2"},
+	{18, "SIGCHLD", "child Status Changed"},
+	{19, "SIGPWR", "power-Fail/Restart"},
+	{20, "SIGWINCH", "window Size Change"},
+	{21, "SIGURG", "urgent Socket Condition"},
+	{22, "SIGIO", "pollable Event"},
+	{23, "SIGSTOP", "stopped (signal)"},
+	{24, "SIGTSTP", "stopped (user)"},
+	{25, "SIGCONT", "continued"},
+	{26, "SIGTTIN", "stopped (tty input)"},
+	{27, "SIGTTOU", "stopped (tty output)"},
+	{28, "SIGVTALRM", "virtual Timer Expired"},
+	{29, "SIGPROF", "profiling Timer Expired"},
+	{30, "SIGXCPU", "cpu Limit Exceeded"},
+	{31, "SIGXFSZ", "file Size Limit Exceeded"},
+	{32, "SIGWAITING", "no runnable lwp"},
+	{33, "SIGLWP", "inter-lwp signal"},
+	{34, "SIGFREEZE", "checkpoint Freeze"},
+	{35, "SIGTHAW", "checkpoint Thaw"},
+	{36, "SIGCANCEL", "thread Cancellation"},
+	{37, "SIGLOST", "resource Lost"},
+	{38, "SIGXRES", "resource Control Exceeded"},
+	{39, "SIGJVM1", "reserved for JVM 1"},
+	{40, "SIGJVM2", "reserved for JVM 2"},
+	{41, "SIGINFO", "information Request"},
 }
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
index 4c9f72756b221c9b83ffecdc44e943db246072ce..ac02d4d8419e6eec1ad6b9d5e3903b3ca2857731 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go
@@ -399,6 +399,83 @@ func pipe() (r int, w int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options))
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func removexattr(path string, attr string, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func listxattr(path string, dest *byte, size int, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0)
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func kill(pid int, signum int, posix int) (err error) {
 	_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))
 	if e1 != 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
index 256237773826982d5dd483bc069a757c70f1fb39..1dd3cfa0e17ab2736a6f995acadfcd5c0ea391a9 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
@@ -399,6 +399,83 @@ func pipe() (r int, w int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options))
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func removexattr(path string, attr string, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func listxattr(path string, dest *byte, size int, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0)
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func kill(pid int, signum int, posix int) (err error) {
 	_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))
 	if e1 != 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
index 4ae787e491d1a73afdf2159f15be2137a88c43ce..cab46e74ba447c370a966427cc9f3f93a0253bef 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go
@@ -1,4 +1,4 @@
-// mksyscall.pl -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go
+// mksyscall.pl -l32 -tags darwin,arm syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go
 // Code generated by the command above; see README.md. DO NOT EDIT.
 
 // +build darwin,arm
@@ -399,6 +399,83 @@ func pipe() (r int, w int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options))
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func removexattr(path string, attr string, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func listxattr(path string, dest *byte, size int, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0)
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func kill(pid int, signum int, posix int) (err error) {
 	_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))
 	if e1 != 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
index 14ed6886c7b69bb279d6002f667e997e2305d5e2..13478dd0bcf3d9f3ee84e6e7a34fbb5f1708110d 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
@@ -399,6 +399,83 @@ func pipe() (r int, w int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func getxattr(path string, attr string, dest *byte, size int, position uint32, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(position), uintptr(options))
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func setxattr(path string, attr string, data *byte, size int, position uint32, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(data)), uintptr(size), uintptr(position), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func removexattr(path string, attr string, options int) (err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	var _p1 *byte
+	_p1, err = BytePtrFromString(attr)
+	if err != nil {
+		return
+	}
+	_, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options))
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func listxattr(path string, dest *byte, size int, options int) (sz int, err error) {
+	var _p0 *byte
+	_p0, err = BytePtrFromString(path)
+	if err != nil {
+		return
+	}
+	r0, _, e1 := Syscall6(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(dest)), uintptr(size), uintptr(options), 0, 0)
+	sz = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func kill(pid int, signum int, posix int) (err error) {
 	_, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix))
 	if e1 != 0 {
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
index ef9602c1eb061cc516ae23573b58c16b23479f9a..433becfd02a6e85d0bf7d4917c8952be1112014a 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
index 63054b358598cf1267463f5e11f190c5cc7db415..33c02b2695d5c82723b7981822e23dbac1229624 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
@@ -1784,17 +1795,6 @@ func Seek(fd int, offset int64, whence int) (off int64, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) {
-	r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0)
-	n = int(r0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 	r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0)
 	written = int(r0)
@@ -1897,21 +1897,6 @@ func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n i
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Stat(path string, stat *Stat_t) (err error) {
-	var _p0 *byte
-	_p0, err = BytePtrFromString(path)
-	if err != nil {
-		return
-	}
-	_, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0)
-	if e1 != 0 {
-		err = errnoErr(e1)
-	}
-	return
-}
-
-// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
-
 func Statfs(path string, buf *Statfs_t) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(path)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
index 8b10ee14452e731656121b29867a47415054ad6c..f91b56c2175b3d22d31e89eb56a9906b3107aa65 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
index 8c9e26a0a13224000e8ad98c265bc2f71baac98c..52d75952503bc4884e27cc410c426476e1cbee60 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
index 8dc2b58f585786d9093d67c77d2b03cd6abe8ed3..970a5c132d5f33d7067a02cb059c00f763e8f4f7 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
@@ -1747,9 +1758,9 @@ func Shutdown(fd int, how int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
-	r0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))
-	n = int64(int64(r0)<<32 | int64(r1))
+func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {
+	r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))
+	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
index e8beef850c926e31fde2544607dcb7c3fc8b2db8..b989d0f2826033a85afb4194bfe0d7966498a3bd 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
index 899e4403a9694244517b3eb4afefc253fb63a4b7..1f8d14cacc5e0308f4ecbaf0c43eed3bbf17ff1d 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
index 7a477cbdead3cd4396b69de8b470a6560096c075..a9c7e520e492268e4d1f861b64d30f769ee6196e 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
@@ -1747,9 +1758,9 @@ func Shutdown(fd int, how int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) {
-	r0, r1, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))
-	n = int64(int64(r1)<<32 | int64(r0))
+func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) {
+	r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags))
+	n = int(r0)
 	if e1 != 0 {
 		err = errnoErr(e1)
 	}
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
index 9dc4c7d6d48513a8d60c5ffa268c531eddb9c2c4..3bb9a20992f4635e1020c0c5f4df94fd6f11ccfb 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
index f0d1ee125c1b19d68a26b32edd16db02acce672a..56116623d6919a1d3759210a1dfed3e0ed865e09 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
index c443baf63f0948096b650a9e8ff1de1708913e71..9696a0199df8d4774c8d1f684ba5b3bd348f3767 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go
@@ -995,6 +995,17 @@ func Nanosleep(time *Timespec, leftover *Timespec) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) {
+	r0, _, e1 := Syscall6(SYS_PERF_EVENT_OPEN, uintptr(unsafe.Pointer(attr)), uintptr(pid), uintptr(cpu), uintptr(groupFd), uintptr(flags), 0)
+	fd = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func PivotRoot(newroot string, putold string) (err error) {
 	var _p0 *byte
 	_p0, err = BytePtrFromString(newroot)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
index 5c09c075872275421d2d57ce3272c24d029390dd..49b3b5e8a437aa9220f23c7897ae0649f7efb5a0 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go
@@ -780,6 +780,17 @@ func Getrlimit(which int, lim *Rlimit) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Getrtable() (rtable int, err error) {
+	r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0)
+	rtable = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Getrusage(who int, rusage *Rusage) (err error) {
 	_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)
 	if e1 != 0 {
@@ -1254,6 +1265,16 @@ func Setrlimit(which int, lim *Rlimit) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Setrtable(rtable int) (err error) {
+	_, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
index 54ccc935d4de00460f6114bb5053a8438d6d63c3..c4c7d8540c0c157442f28a26f109cf1c863cf651 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go
@@ -780,6 +780,17 @@ func Getrlimit(which int, lim *Rlimit) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Getrtable() (rtable int, err error) {
+	r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0)
+	rtable = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Getrusage(who int, rusage *Rusage) (err error) {
 	_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)
 	if e1 != 0 {
@@ -1254,6 +1265,16 @@ func Setrlimit(which int, lim *Rlimit) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Setrtable(rtable int) (err error) {
+	_, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
index 59258b0a45a8ac2da69a523b8d3c2e9b33f6cd57..210285b0ba5f0da9ccc5fc97e51a2b42f98bcb52 100644
--- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
+++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go
@@ -780,6 +780,17 @@ func Getrlimit(which int, lim *Rlimit) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Getrtable() (rtable int, err error) {
+	r0, _, e1 := RawSyscall(SYS_GETRTABLE, 0, 0, 0)
+	rtable = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Getrusage(who int, rusage *Rusage) (err error) {
 	_, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0)
 	if e1 != 0 {
@@ -1254,6 +1265,16 @@ func Setrlimit(which int, lim *Rlimit) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func Setrtable(rtable int) (err error) {
+	_, _, e1 := RawSyscall(SYS_SETRTABLE, uintptr(rtable), 0, 0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Setsid() (pid int, err error) {
 	r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0)
 	pid = int(r0)
diff --git a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
index 83bb935b91c57c8ef568b4da26c9609a324b6e60..207b27938b2cb8d6504183b33fc49b572a1c2fb5 100644
--- a/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go
@@ -1,6 +1,8 @@
 // mksysctl_openbsd.pl
 // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
 
+// +build amd64,openbsd
+
 package unix
 
 type mibentry struct {
@@ -14,6 +16,7 @@ var sysctlMib = []mibentry{
 	{"ddb.max_line", []_C_int{9, 3}},
 	{"ddb.max_width", []_C_int{9, 2}},
 	{"ddb.panic", []_C_int{9, 5}},
+	{"ddb.profile", []_C_int{9, 9}},
 	{"ddb.radix", []_C_int{9, 1}},
 	{"ddb.tab_stop_width", []_C_int{9, 4}},
 	{"ddb.trigger", []_C_int{9, 8}},
@@ -29,6 +32,7 @@ var sysctlMib = []mibentry{
 	{"hw.ncpu", []_C_int{6, 3}},
 	{"hw.ncpufound", []_C_int{6, 21}},
 	{"hw.pagesize", []_C_int{6, 7}},
+	{"hw.perfpolicy", []_C_int{6, 23}},
 	{"hw.physmem", []_C_int{6, 19}},
 	{"hw.product", []_C_int{6, 15}},
 	{"hw.serialno", []_C_int{6, 17}},
@@ -37,7 +41,7 @@ var sysctlMib = []mibentry{
 	{"hw.uuid", []_C_int{6, 18}},
 	{"hw.vendor", []_C_int{6, 14}},
 	{"hw.version", []_C_int{6, 16}},
-	{"kern.arandom", []_C_int{1, 37}},
+	{"kern.allowkmem", []_C_int{1, 52}},
 	{"kern.argmax", []_C_int{1, 8}},
 	{"kern.boottime", []_C_int{1, 21}},
 	{"kern.bufcachepercent", []_C_int{1, 72}},
@@ -46,12 +50,13 @@ var sysctlMib = []mibentry{
 	{"kern.consdev", []_C_int{1, 75}},
 	{"kern.cp_time", []_C_int{1, 40}},
 	{"kern.cp_time2", []_C_int{1, 71}},
-	{"kern.cryptodevallowsoft", []_C_int{1, 53}},
+	{"kern.dnsjackport", []_C_int{1, 13}},
 	{"kern.domainname", []_C_int{1, 22}},
 	{"kern.file", []_C_int{1, 73}},
 	{"kern.forkstat", []_C_int{1, 42}},
 	{"kern.fscale", []_C_int{1, 46}},
 	{"kern.fsync", []_C_int{1, 33}},
+	{"kern.global_ptrace", []_C_int{1, 81}},
 	{"kern.hostid", []_C_int{1, 11}},
 	{"kern.hostname", []_C_int{1, 10}},
 	{"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}},
@@ -84,7 +89,6 @@ var sysctlMib = []mibentry{
 	{"kern.pool_debug", []_C_int{1, 77}},
 	{"kern.posix1version", []_C_int{1, 17}},
 	{"kern.proc", []_C_int{1, 66}},
-	{"kern.random", []_C_int{1, 31}},
 	{"kern.rawpartition", []_C_int{1, 24}},
 	{"kern.saved_ids", []_C_int{1, 20}},
 	{"kern.securelevel", []_C_int{1, 9}},
@@ -102,21 +106,16 @@ var sysctlMib = []mibentry{
 	{"kern.timecounter.hardware", []_C_int{1, 69, 3}},
 	{"kern.timecounter.tick", []_C_int{1, 69, 1}},
 	{"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}},
-	{"kern.tty.maxptys", []_C_int{1, 44, 6}},
-	{"kern.tty.nptys", []_C_int{1, 44, 7}},
 	{"kern.tty.tk_cancc", []_C_int{1, 44, 4}},
 	{"kern.tty.tk_nin", []_C_int{1, 44, 1}},
 	{"kern.tty.tk_nout", []_C_int{1, 44, 2}},
 	{"kern.tty.tk_rawcc", []_C_int{1, 44, 3}},
 	{"kern.tty.ttyinfo", []_C_int{1, 44, 5}},
 	{"kern.ttycount", []_C_int{1, 57}},
-	{"kern.userasymcrypto", []_C_int{1, 60}},
-	{"kern.usercrypto", []_C_int{1, 52}},
-	{"kern.usermount", []_C_int{1, 30}},
 	{"kern.version", []_C_int{1, 4}},
-	{"kern.vnode", []_C_int{1, 13}},
 	{"kern.watchdog.auto", []_C_int{1, 64, 2}},
 	{"kern.watchdog.period", []_C_int{1, 64, 1}},
+	{"kern.wxabort", []_C_int{1, 74}},
 	{"net.bpf.bufsize", []_C_int{4, 31, 1}},
 	{"net.bpf.maxbufsize", []_C_int{4, 31, 2}},
 	{"net.inet.ah.enable", []_C_int{4, 2, 51, 1}},
@@ -144,7 +143,9 @@ var sysctlMib = []mibentry{
 	{"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}},
 	{"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}},
 	{"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}},
+	{"net.inet.ip.arpdown", []_C_int{4, 2, 0, 40}},
 	{"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}},
+	{"net.inet.ip.arptimeout", []_C_int{4, 2, 0, 39}},
 	{"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}},
 	{"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}},
 	{"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}},
@@ -153,8 +154,10 @@ var sysctlMib = []mibentry{
 	{"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}},
 	{"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}},
 	{"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}},
+	{"net.inet.ip.mrtmfc", []_C_int{4, 2, 0, 37}},
 	{"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}},
 	{"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}},
+	{"net.inet.ip.mrtvif", []_C_int{4, 2, 0, 38}},
 	{"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}},
 	{"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}},
 	{"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}},
@@ -173,7 +176,6 @@ var sysctlMib = []mibentry{
 	{"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}},
 	{"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}},
 	{"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}},
-	{"net.inet.pim.stats", []_C_int{4, 2, 103, 1}},
 	{"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}},
 	{"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}},
 	{"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}},
@@ -187,6 +189,7 @@ var sysctlMib = []mibentry{
 	{"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}},
 	{"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}},
 	{"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}},
+	{"net.inet.tcp.rootonly", []_C_int{4, 2, 6, 24}},
 	{"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}},
 	{"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}},
 	{"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}},
@@ -194,9 +197,12 @@ var sysctlMib = []mibentry{
 	{"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}},
 	{"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}},
 	{"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}},
+	{"net.inet.tcp.synhashsize", []_C_int{4, 2, 6, 25}},
+	{"net.inet.tcp.synuselimit", []_C_int{4, 2, 6, 23}},
 	{"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}},
 	{"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}},
 	{"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}},
+	{"net.inet.udp.rootonly", []_C_int{4, 2, 17, 6}},
 	{"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}},
 	{"net.inet.udp.stats", []_C_int{4, 2, 17, 5}},
 	{"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}},
@@ -209,13 +215,8 @@ var sysctlMib = []mibentry{
 	{"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}},
 	{"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}},
 	{"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}},
-	{"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}},
 	{"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}},
-	{"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}},
-	{"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}},
-	{"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}},
 	{"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}},
-	{"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}},
 	{"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}},
 	{"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}},
 	{"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}},
@@ -228,20 +229,19 @@ var sysctlMib = []mibentry{
 	{"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}},
 	{"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}},
 	{"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}},
-	{"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}},
-	{"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}},
 	{"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}},
+	{"net.inet6.ip6.mrtmfc", []_C_int{4, 24, 17, 53}},
+	{"net.inet6.ip6.mrtmif", []_C_int{4, 24, 17, 52}},
 	{"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}},
 	{"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}},
 	{"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}},
 	{"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}},
 	{"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}},
 	{"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}},
-	{"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}},
+	{"net.inet6.ip6.soiikey", []_C_int{4, 24, 17, 54}},
 	{"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}},
 	{"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}},
 	{"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}},
-	{"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}},
 	{"net.key.sadb_dump", []_C_int{4, 30, 1}},
 	{"net.key.spd_dump", []_C_int{4, 30, 2}},
 	{"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}},
@@ -254,17 +254,4 @@ var sysctlMib = []mibentry{
 	{"net.mpls.ttl", []_C_int{4, 33, 2}},
 	{"net.pflow.stats", []_C_int{4, 34, 1}},
 	{"net.pipex.enable", []_C_int{4, 35, 1}},
-	{"vm.anonmin", []_C_int{2, 7}},
-	{"vm.loadavg", []_C_int{2, 2}},
-	{"vm.maxslp", []_C_int{2, 10}},
-	{"vm.nkmempages", []_C_int{2, 6}},
-	{"vm.psstrings", []_C_int{2, 3}},
-	{"vm.swapencrypt.enable", []_C_int{2, 5, 0}},
-	{"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}},
-	{"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}},
-	{"vm.uspace", []_C_int{2, 11}},
-	{"vm.uvmexp", []_C_int{2, 4}},
-	{"vm.vmmeter", []_C_int{2, 1}},
-	{"vm.vnodemin", []_C_int{2, 9}},
-	{"vm.vtextmin", []_C_int{2, 8}},
 }
diff --git a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go
index bd28146ddd5ee83d33f653954012d602e4c2ab92..10edff07d5754f6e7b8244009bc07e3640959c97 100644
--- a/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go
@@ -1,5 +1,5 @@
 // mksysnum_openbsd.pl
-// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
+// Code generated by the command above; see README.md. DO NOT EDIT.
 
 // +build amd64,openbsd
 
@@ -12,6 +12,7 @@ const (
 	SYS_WRITE          = 4   // { ssize_t sys_write(int fd, const void *buf, \
 	SYS_OPEN           = 5   // { int sys_open(const char *path, \
 	SYS_CLOSE          = 6   // { int sys_close(int fd); }
+	SYS_GETENTROPY     = 7   // { int sys_getentropy(void *buf, size_t nbyte); }
 	SYS___TFORK        = 8   // { int sys___tfork(const struct __tfork *param, \
 	SYS_LINK           = 9   // { int sys_link(const char *path, const char *link); }
 	SYS_UNLINK         = 10  // { int sys_unlink(const char *path); }
@@ -37,11 +38,10 @@ const (
 	SYS_ACCEPT         = 30  // { int sys_accept(int s, struct sockaddr *name, \
 	SYS_GETPEERNAME    = 31  // { int sys_getpeername(int fdes, struct sockaddr *asa, \
 	SYS_GETSOCKNAME    = 32  // { int sys_getsockname(int fdes, struct sockaddr *asa, \
-	SYS_ACCESS         = 33  // { int sys_access(const char *path, int flags); }
+	SYS_ACCESS         = 33  // { int sys_access(const char *path, int amode); }
 	SYS_CHFLAGS        = 34  // { int sys_chflags(const char *path, u_int flags); }
 	SYS_FCHFLAGS       = 35  // { int sys_fchflags(int fd, u_int flags); }
 	SYS_SYNC           = 36  // { void sys_sync(void); }
-	SYS_KILL           = 37  // { int sys_kill(int pid, int signum); }
 	SYS_STAT           = 38  // { int sys_stat(const char *path, struct stat *ub); }
 	SYS_GETPPID        = 39  // { pid_t sys_getppid(void); }
 	SYS_LSTAT          = 40  // { int sys_lstat(const char *path, struct stat *ub); }
@@ -53,7 +53,6 @@ const (
 	SYS_SIGACTION      = 46  // { int sys_sigaction(int signum, \
 	SYS_GETGID         = 47  // { gid_t sys_getgid(void); }
 	SYS_SIGPROCMASK    = 48  // { int sys_sigprocmask(int how, sigset_t mask); }
-	SYS_GETLOGIN       = 49  // { int sys_getlogin(char *namebuf, u_int namelen); }
 	SYS_SETLOGIN       = 50  // { int sys_setlogin(const char *namebuf); }
 	SYS_ACCT           = 51  // { int sys_acct(const char *path); }
 	SYS_SIGPENDING     = 52  // { int sys_sigpending(void); }
@@ -62,7 +61,7 @@ const (
 	SYS_REBOOT         = 55  // { int sys_reboot(int opt); }
 	SYS_REVOKE         = 56  // { int sys_revoke(const char *path); }
 	SYS_SYMLINK        = 57  // { int sys_symlink(const char *path, \
-	SYS_READLINK       = 58  // { int sys_readlink(const char *path, char *buf, \
+	SYS_READLINK       = 58  // { ssize_t sys_readlink(const char *path, \
 	SYS_EXECVE         = 59  // { int sys_execve(const char *path, \
 	SYS_UMASK          = 60  // { mode_t sys_umask(mode_t newmask); }
 	SYS_CHROOT         = 61  // { int sys_chroot(const char *path); }
@@ -86,15 +85,18 @@ const (
 	SYS_GETGROUPS      = 79  // { int sys_getgroups(int gidsetsize, \
 	SYS_SETGROUPS      = 80  // { int sys_setgroups(int gidsetsize, \
 	SYS_GETPGRP        = 81  // { int sys_getpgrp(void); }
-	SYS_SETPGID        = 82  // { int sys_setpgid(pid_t pid, int pgid); }
+	SYS_SETPGID        = 82  // { int sys_setpgid(pid_t pid, pid_t pgid); }
+	SYS_FUTEX          = 83  // { int sys_futex(uint32_t *f, int op, int val, \
 	SYS_UTIMENSAT      = 84  // { int sys_utimensat(int fd, const char *path, \
 	SYS_FUTIMENS       = 85  // { int sys_futimens(int fd, \
+	SYS_KBIND          = 86  // { int sys_kbind(const struct __kbind *param, \
 	SYS_CLOCK_GETTIME  = 87  // { int sys_clock_gettime(clockid_t clock_id, \
 	SYS_CLOCK_SETTIME  = 88  // { int sys_clock_settime(clockid_t clock_id, \
 	SYS_CLOCK_GETRES   = 89  // { int sys_clock_getres(clockid_t clock_id, \
 	SYS_DUP2           = 90  // { int sys_dup2(int from, int to); }
 	SYS_NANOSLEEP      = 91  // { int sys_nanosleep(const struct timespec *rqtp, \
 	SYS_FCNTL          = 92  // { int sys_fcntl(int fd, int cmd, ... void *arg); }
+	SYS_ACCEPT4        = 93  // { int sys_accept4(int s, struct sockaddr *name, \
 	SYS___THRSLEEP     = 94  // { int sys___thrsleep(const volatile void *ident, \
 	SYS_FSYNC          = 95  // { int sys_fsync(int fd); }
 	SYS_SETPRIORITY    = 96  // { int sys_setpriority(int which, id_t who, int prio); }
@@ -102,16 +104,23 @@ const (
 	SYS_CONNECT        = 98  // { int sys_connect(int s, const struct sockaddr *name, \
 	SYS_GETDENTS       = 99  // { int sys_getdents(int fd, void *buf, size_t buflen); }
 	SYS_GETPRIORITY    = 100 // { int sys_getpriority(int which, id_t who); }
+	SYS_PIPE2          = 101 // { int sys_pipe2(int *fdp, int flags); }
+	SYS_DUP3           = 102 // { int sys_dup3(int from, int to, int flags); }
 	SYS_SIGRETURN      = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); }
 	SYS_BIND           = 104 // { int sys_bind(int s, const struct sockaddr *name, \
 	SYS_SETSOCKOPT     = 105 // { int sys_setsockopt(int s, int level, int name, \
 	SYS_LISTEN         = 106 // { int sys_listen(int s, int backlog); }
+	SYS_CHFLAGSAT      = 107 // { int sys_chflagsat(int fd, const char *path, \
+	SYS_PLEDGE         = 108 // { int sys_pledge(const char *promises, \
 	SYS_PPOLL          = 109 // { int sys_ppoll(struct pollfd *fds, \
 	SYS_PSELECT        = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \
 	SYS_SIGSUSPEND     = 111 // { int sys_sigsuspend(int mask); }
+	SYS_SENDSYSLOG     = 112 // { int sys_sendsyslog(const char *buf, size_t nbyte, \
 	SYS_GETSOCKOPT     = 118 // { int sys_getsockopt(int s, int level, int name, \
+	SYS_THRKILL        = 119 // { int sys_thrkill(pid_t tid, int signum, void *tcb); }
 	SYS_READV          = 120 // { ssize_t sys_readv(int fd, \
 	SYS_WRITEV         = 121 // { ssize_t sys_writev(int fd, \
+	SYS_KILL           = 122 // { int sys_kill(int pid, int signum); }
 	SYS_FCHOWN         = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); }
 	SYS_FCHMOD         = 124 // { int sys_fchmod(int fd, mode_t mode); }
 	SYS_SETREUID       = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); }
@@ -125,6 +134,7 @@ const (
 	SYS_MKDIR          = 136 // { int sys_mkdir(const char *path, mode_t mode); }
 	SYS_RMDIR          = 137 // { int sys_rmdir(const char *path); }
 	SYS_ADJTIME        = 140 // { int sys_adjtime(const struct timeval *delta, \
+	SYS_GETLOGIN_R     = 141 // { int sys_getlogin_r(char *namebuf, u_int namelen); }
 	SYS_SETSID         = 147 // { int sys_setsid(void); }
 	SYS_QUOTACTL       = 148 // { int sys_quotactl(const char *path, int cmd, \
 	SYS_NFSSVC         = 155 // { int sys_nfssvc(int flag, void *argp); }
@@ -144,7 +154,7 @@ const (
 	SYS_LSEEK          = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \
 	SYS_TRUNCATE       = 200 // { int sys_truncate(const char *path, int pad, \
 	SYS_FTRUNCATE      = 201 // { int sys_ftruncate(int fd, int pad, off_t length); }
-	SYS___SYSCTL       = 202 // { int sys___sysctl(const int *name, u_int namelen, \
+	SYS_SYSCTL         = 202 // { int sys_sysctl(const int *name, u_int namelen, \
 	SYS_MLOCK          = 203 // { int sys_mlock(const void *addr, size_t len); }
 	SYS_MUNLOCK        = 204 // { int sys_munlock(const void *addr, size_t len); }
 	SYS_GETPGID        = 207 // { pid_t sys_getpgid(pid_t pid); }
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
index 3c56b20762236ba898664a782fc039313c071376..40474620810d04ebcb190e1ecc307958be2f755e 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go
@@ -96,45 +96,30 @@ type Rlimit struct {
 type _Gid_t uint32
 
 type Stat_t struct {
-	Dev       uint64
-	X__pad1   uint16
-	_         [2]byte
-	X__st_ino uint32
-	Mode      uint32
-	Nlink     uint32
-	Uid       uint32
-	Gid       uint32
-	Rdev      uint64
-	X__pad2   uint16
-	_         [2]byte
-	Size      int64
-	Blksize   int32
-	Blocks    int64
-	Atim      Timespec
-	Mtim      Timespec
-	Ctim      Timespec
-	Ino       uint64
-}
-
-type Statfs_t struct {
-	Type    int32
-	Bsize   int32
-	Blocks  uint64
-	Bfree   uint64
-	Bavail  uint64
-	Files   uint64
-	Ffree   uint64
-	Fsid    Fsid
-	Namelen int32
-	Frsize  int32
-	Flags   int32
-	Spare   [4]int32
+	Dev     uint64
+	_       uint16
+	_       [2]byte
+	_       uint32
+	Mode    uint32
+	Nlink   uint32
+	Uid     uint32
+	Gid     uint32
+	Rdev    uint64
+	_       uint16
+	_       [2]byte
+	Size    int64
+	Blksize int32
+	Blocks  int64
+	Atim    Timespec
+	Mtim    Timespec
+	Ctim    Timespec
+	Ino     uint64
 }
 
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -171,7 +156,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -583,12 +568,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -683,7 +668,7 @@ type Sysinfo_t struct {
 	Totalhigh uint32
 	Freehigh  uint32
 	Unit      uint32
-	X_f       [8]int8
+	_         [8]int8
 }
 
 type Utsname struct {
@@ -739,7 +724,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [32]uint32
+	Val [32]uint32
 }
 
 const RNDGETENTCNT = 0x80045200
@@ -895,3 +880,936 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x1
+	CBitFieldMaskBit1  = 0x2
+	CBitFieldMaskBit2  = 0x4
+	CBitFieldMaskBit3  = 0x8
+	CBitFieldMaskBit4  = 0x10
+	CBitFieldMaskBit5  = 0x20
+	CBitFieldMaskBit6  = 0x40
+	CBitFieldMaskBit7  = 0x80
+	CBitFieldMaskBit8  = 0x100
+	CBitFieldMaskBit9  = 0x200
+	CBitFieldMaskBit10 = 0x400
+	CBitFieldMaskBit11 = 0x800
+	CBitFieldMaskBit12 = 0x1000
+	CBitFieldMaskBit13 = 0x2000
+	CBitFieldMaskBit14 = 0x4000
+	CBitFieldMaskBit15 = 0x8000
+	CBitFieldMaskBit16 = 0x10000
+	CBitFieldMaskBit17 = 0x20000
+	CBitFieldMaskBit18 = 0x40000
+	CBitFieldMaskBit19 = 0x80000
+	CBitFieldMaskBit20 = 0x100000
+	CBitFieldMaskBit21 = 0x200000
+	CBitFieldMaskBit22 = 0x400000
+	CBitFieldMaskBit23 = 0x800000
+	CBitFieldMaskBit24 = 0x1000000
+	CBitFieldMaskBit25 = 0x2000000
+	CBitFieldMaskBit26 = 0x4000000
+	CBitFieldMaskBit27 = 0x8000000
+	CBitFieldMaskBit28 = 0x10000000
+	CBitFieldMaskBit29 = 0x20000000
+	CBitFieldMaskBit30 = 0x40000000
+	CBitFieldMaskBit31 = 0x80000000
+	CBitFieldMaskBit32 = 0x100000000
+	CBitFieldMaskBit33 = 0x200000000
+	CBitFieldMaskBit34 = 0x400000000
+	CBitFieldMaskBit35 = 0x800000000
+	CBitFieldMaskBit36 = 0x1000000000
+	CBitFieldMaskBit37 = 0x2000000000
+	CBitFieldMaskBit38 = 0x4000000000
+	CBitFieldMaskBit39 = 0x8000000000
+	CBitFieldMaskBit40 = 0x10000000000
+	CBitFieldMaskBit41 = 0x20000000000
+	CBitFieldMaskBit42 = 0x40000000000
+	CBitFieldMaskBit43 = 0x80000000000
+	CBitFieldMaskBit44 = 0x100000000000
+	CBitFieldMaskBit45 = 0x200000000000
+	CBitFieldMaskBit46 = 0x400000000000
+	CBitFieldMaskBit47 = 0x800000000000
+	CBitFieldMaskBit48 = 0x1000000000000
+	CBitFieldMaskBit49 = 0x2000000000000
+	CBitFieldMaskBit50 = 0x4000000000000
+	CBitFieldMaskBit51 = 0x8000000000000
+	CBitFieldMaskBit52 = 0x10000000000000
+	CBitFieldMaskBit53 = 0x20000000000000
+	CBitFieldMaskBit54 = 0x40000000000000
+	CBitFieldMaskBit55 = 0x80000000000000
+	CBitFieldMaskBit56 = 0x100000000000000
+	CBitFieldMaskBit57 = 0x200000000000000
+	CBitFieldMaskBit58 = 0x400000000000000
+	CBitFieldMaskBit59 = 0x800000000000000
+	CBitFieldMaskBit60 = 0x1000000000000000
+	CBitFieldMaskBit61 = 0x2000000000000000
+	CBitFieldMaskBit62 = 0x4000000000000000
+	CBitFieldMaskBit63 = 0x8000000000000000
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [122]int8
+	_      uint32
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	Start     uint32
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int32
+	Bsize   int32
+	Blocks  uint64
+	Bfree   uint64
+	Bavail  uint64
+	Files   uint64
+	Ffree   uint64
+	Fsid    Fsid
+	Namelen int32
+	Frsize  int32
+	Flags   int32
+	Spare   [4]int32
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint32
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x18
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
index 92f1c8fe4dc72c290eca539bbfc996eeee63058e..2ab0cb9e79b597ecaefb573694524c60b82d67a9 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go
@@ -105,7 +105,7 @@ type Stat_t struct {
 	Mode    uint32
 	Uid     uint32
 	Gid     uint32
-	X__pad0 int32
+	_       int32
 	Rdev    uint64
 	Size    int64
 	Blksize int64
@@ -116,25 +116,10 @@ type Stat_t struct {
 	_       [3]int64
 }
 
-type Statfs_t struct {
-	Type    int64
-	Bsize   int64
-	Blocks  uint64
-	Bfree   uint64
-	Bavail  uint64
-	Files   uint64
-	Ffree   uint64
-	Fsid    Fsid
-	Namelen int64
-	Frsize  int64
-	Flags   int64
-	Spare   [4]int64
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -171,7 +156,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -587,12 +572,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -698,7 +683,7 @@ type Sysinfo_t struct {
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	X_f       [0]int8
+	_         [0]int8
 	_         [4]byte
 }
 
@@ -757,7 +742,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [16]uint64
+	Val [16]uint64
 }
 
 const RNDGETENTCNT = 0x80045200
@@ -913,3 +898,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x1
+	CBitFieldMaskBit1  = 0x2
+	CBitFieldMaskBit2  = 0x4
+	CBitFieldMaskBit3  = 0x8
+	CBitFieldMaskBit4  = 0x10
+	CBitFieldMaskBit5  = 0x20
+	CBitFieldMaskBit6  = 0x40
+	CBitFieldMaskBit7  = 0x80
+	CBitFieldMaskBit8  = 0x100
+	CBitFieldMaskBit9  = 0x200
+	CBitFieldMaskBit10 = 0x400
+	CBitFieldMaskBit11 = 0x800
+	CBitFieldMaskBit12 = 0x1000
+	CBitFieldMaskBit13 = 0x2000
+	CBitFieldMaskBit14 = 0x4000
+	CBitFieldMaskBit15 = 0x8000
+	CBitFieldMaskBit16 = 0x10000
+	CBitFieldMaskBit17 = 0x20000
+	CBitFieldMaskBit18 = 0x40000
+	CBitFieldMaskBit19 = 0x80000
+	CBitFieldMaskBit20 = 0x100000
+	CBitFieldMaskBit21 = 0x200000
+	CBitFieldMaskBit22 = 0x400000
+	CBitFieldMaskBit23 = 0x800000
+	CBitFieldMaskBit24 = 0x1000000
+	CBitFieldMaskBit25 = 0x2000000
+	CBitFieldMaskBit26 = 0x4000000
+	CBitFieldMaskBit27 = 0x8000000
+	CBitFieldMaskBit28 = 0x10000000
+	CBitFieldMaskBit29 = 0x20000000
+	CBitFieldMaskBit30 = 0x40000000
+	CBitFieldMaskBit31 = 0x80000000
+	CBitFieldMaskBit32 = 0x100000000
+	CBitFieldMaskBit33 = 0x200000000
+	CBitFieldMaskBit34 = 0x400000000
+	CBitFieldMaskBit35 = 0x800000000
+	CBitFieldMaskBit36 = 0x1000000000
+	CBitFieldMaskBit37 = 0x2000000000
+	CBitFieldMaskBit38 = 0x4000000000
+	CBitFieldMaskBit39 = 0x8000000000
+	CBitFieldMaskBit40 = 0x10000000000
+	CBitFieldMaskBit41 = 0x20000000000
+	CBitFieldMaskBit42 = 0x40000000000
+	CBitFieldMaskBit43 = 0x80000000000
+	CBitFieldMaskBit44 = 0x100000000000
+	CBitFieldMaskBit45 = 0x200000000000
+	CBitFieldMaskBit46 = 0x400000000000
+	CBitFieldMaskBit47 = 0x800000000000
+	CBitFieldMaskBit48 = 0x1000000000000
+	CBitFieldMaskBit49 = 0x2000000000000
+	CBitFieldMaskBit50 = 0x4000000000000
+	CBitFieldMaskBit51 = 0x8000000000000
+	CBitFieldMaskBit52 = 0x10000000000000
+	CBitFieldMaskBit53 = 0x20000000000000
+	CBitFieldMaskBit54 = 0x40000000000000
+	CBitFieldMaskBit55 = 0x80000000000000
+	CBitFieldMaskBit56 = 0x100000000000000
+	CBitFieldMaskBit57 = 0x200000000000000
+	CBitFieldMaskBit58 = 0x400000000000000
+	CBitFieldMaskBit59 = 0x800000000000000
+	CBitFieldMaskBit60 = 0x1000000000000000
+	CBitFieldMaskBit61 = 0x2000000000000000
+	CBitFieldMaskBit62 = 0x4000000000000000
+	CBitFieldMaskBit63 = 0x8000000000000000
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [118]int8
+	_      uint64
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	_         [4]byte
+	Start     uint64
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int64
+	Bsize   int64
+	Blocks  uint64
+	Bfree   uint64
+	Bavail  uint64
+	Files   uint64
+	Ffree   uint64
+	Fsid    Fsid
+	Namelen int64
+	Frsize  int64
+	Flags   int64
+	Spare   [4]int64
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint64
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+	_       [4]byte
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x20
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
index cee5459ac11c249d37440623c3ee213b58b5fa5e..18d577b9125d6c3d9d57a2e58122509f45fcf73a 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go
@@ -96,47 +96,31 @@ type Rlimit struct {
 type _Gid_t uint32
 
 type Stat_t struct {
-	Dev       uint64
-	X__pad1   uint16
-	_         [2]byte
-	X__st_ino uint32
-	Mode      uint32
-	Nlink     uint32
-	Uid       uint32
-	Gid       uint32
-	Rdev      uint64
-	X__pad2   uint16
-	_         [6]byte
-	Size      int64
-	Blksize   int32
-	_         [4]byte
-	Blocks    int64
-	Atim      Timespec
-	Mtim      Timespec
-	Ctim      Timespec
-	Ino       uint64
-}
-
-type Statfs_t struct {
-	Type    int32
-	Bsize   int32
-	Blocks  uint64
-	Bfree   uint64
-	Bavail  uint64
-	Files   uint64
-	Ffree   uint64
-	Fsid    Fsid
-	Namelen int32
-	Frsize  int32
-	Flags   int32
-	Spare   [4]int32
+	Dev     uint64
+	_       uint16
+	_       [2]byte
+	_       uint32
+	Mode    uint32
+	Nlink   uint32
+	Uid     uint32
+	Gid     uint32
+	Rdev    uint64
+	_       uint16
+	_       [6]byte
+	Size    int64
+	Blksize int32
 	_       [4]byte
+	Blocks  int64
+	Atim    Timespec
+	Mtim    Timespec
+	Ctim    Timespec
+	Ino     uint64
 }
 
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -173,7 +157,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -587,12 +571,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -671,7 +655,7 @@ type Sysinfo_t struct {
 	Totalhigh uint32
 	Freehigh  uint32
 	Unit      uint32
-	X_f       [8]uint8
+	_         [8]uint8
 }
 
 type Utsname struct {
@@ -728,7 +712,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [32]uint32
+	Val [32]uint32
 }
 
 const RNDGETENTCNT = 0x80045200
@@ -884,3 +868,937 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x1
+	CBitFieldMaskBit1  = 0x2
+	CBitFieldMaskBit2  = 0x4
+	CBitFieldMaskBit3  = 0x8
+	CBitFieldMaskBit4  = 0x10
+	CBitFieldMaskBit5  = 0x20
+	CBitFieldMaskBit6  = 0x40
+	CBitFieldMaskBit7  = 0x80
+	CBitFieldMaskBit8  = 0x100
+	CBitFieldMaskBit9  = 0x200
+	CBitFieldMaskBit10 = 0x400
+	CBitFieldMaskBit11 = 0x800
+	CBitFieldMaskBit12 = 0x1000
+	CBitFieldMaskBit13 = 0x2000
+	CBitFieldMaskBit14 = 0x4000
+	CBitFieldMaskBit15 = 0x8000
+	CBitFieldMaskBit16 = 0x10000
+	CBitFieldMaskBit17 = 0x20000
+	CBitFieldMaskBit18 = 0x40000
+	CBitFieldMaskBit19 = 0x80000
+	CBitFieldMaskBit20 = 0x100000
+	CBitFieldMaskBit21 = 0x200000
+	CBitFieldMaskBit22 = 0x400000
+	CBitFieldMaskBit23 = 0x800000
+	CBitFieldMaskBit24 = 0x1000000
+	CBitFieldMaskBit25 = 0x2000000
+	CBitFieldMaskBit26 = 0x4000000
+	CBitFieldMaskBit27 = 0x8000000
+	CBitFieldMaskBit28 = 0x10000000
+	CBitFieldMaskBit29 = 0x20000000
+	CBitFieldMaskBit30 = 0x40000000
+	CBitFieldMaskBit31 = 0x80000000
+	CBitFieldMaskBit32 = 0x100000000
+	CBitFieldMaskBit33 = 0x200000000
+	CBitFieldMaskBit34 = 0x400000000
+	CBitFieldMaskBit35 = 0x800000000
+	CBitFieldMaskBit36 = 0x1000000000
+	CBitFieldMaskBit37 = 0x2000000000
+	CBitFieldMaskBit38 = 0x4000000000
+	CBitFieldMaskBit39 = 0x8000000000
+	CBitFieldMaskBit40 = 0x10000000000
+	CBitFieldMaskBit41 = 0x20000000000
+	CBitFieldMaskBit42 = 0x40000000000
+	CBitFieldMaskBit43 = 0x80000000000
+	CBitFieldMaskBit44 = 0x100000000000
+	CBitFieldMaskBit45 = 0x200000000000
+	CBitFieldMaskBit46 = 0x400000000000
+	CBitFieldMaskBit47 = 0x800000000000
+	CBitFieldMaskBit48 = 0x1000000000000
+	CBitFieldMaskBit49 = 0x2000000000000
+	CBitFieldMaskBit50 = 0x4000000000000
+	CBitFieldMaskBit51 = 0x8000000000000
+	CBitFieldMaskBit52 = 0x10000000000000
+	CBitFieldMaskBit53 = 0x20000000000000
+	CBitFieldMaskBit54 = 0x40000000000000
+	CBitFieldMaskBit55 = 0x80000000000000
+	CBitFieldMaskBit56 = 0x100000000000000
+	CBitFieldMaskBit57 = 0x200000000000000
+	CBitFieldMaskBit58 = 0x400000000000000
+	CBitFieldMaskBit59 = 0x800000000000000
+	CBitFieldMaskBit60 = 0x1000000000000000
+	CBitFieldMaskBit61 = 0x2000000000000000
+	CBitFieldMaskBit62 = 0x4000000000000000
+	CBitFieldMaskBit63 = 0x8000000000000000
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [122]uint8
+	_      uint32
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	Start     uint32
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int32
+	Bsize   int32
+	Blocks  uint64
+	Bfree   uint64
+	Bavail  uint64
+	Files   uint64
+	Ffree   uint64
+	Fsid    Fsid
+	Namelen int32
+	Frsize  int32
+	Flags   int32
+	Spare   [4]int32
+	_       [4]byte
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint32
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x18
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
index 5ce7cfe835d8191edcbc4b17b0e9256f77effe04..6ea80563f121093c1fcccb07154a12843ccbf474 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go
@@ -106,10 +106,10 @@ type Stat_t struct {
 	Uid     uint32
 	Gid     uint32
 	Rdev    uint64
-	X__pad1 uint64
+	_       uint64
 	Size    int64
 	Blksize int32
-	X__pad2 int32
+	_       int32
 	Blocks  int64
 	Atim    Timespec
 	Mtim    Timespec
@@ -117,25 +117,10 @@ type Stat_t struct {
 	_       [2]int32
 }
 
-type Statfs_t struct {
-	Type    int64
-	Bsize   int64
-	Blocks  uint64
-	Bfree   uint64
-	Bavail  uint64
-	Files   uint64
-	Ffree   uint64
-	Fsid    Fsid
-	Namelen int64
-	Frsize  int64
-	Flags   int64
-	Spare   [4]int64
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -172,7 +157,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -588,12 +573,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -676,7 +661,7 @@ type Sysinfo_t struct {
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	X_f       [0]int8
+	_         [0]int8
 	_         [4]byte
 }
 
@@ -736,7 +721,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [16]uint64
+	Val [16]uint64
 }
 
 const RNDGETENTCNT = 0x80045200
@@ -892,3 +877,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x1
+	CBitFieldMaskBit1  = 0x2
+	CBitFieldMaskBit2  = 0x4
+	CBitFieldMaskBit3  = 0x8
+	CBitFieldMaskBit4  = 0x10
+	CBitFieldMaskBit5  = 0x20
+	CBitFieldMaskBit6  = 0x40
+	CBitFieldMaskBit7  = 0x80
+	CBitFieldMaskBit8  = 0x100
+	CBitFieldMaskBit9  = 0x200
+	CBitFieldMaskBit10 = 0x400
+	CBitFieldMaskBit11 = 0x800
+	CBitFieldMaskBit12 = 0x1000
+	CBitFieldMaskBit13 = 0x2000
+	CBitFieldMaskBit14 = 0x4000
+	CBitFieldMaskBit15 = 0x8000
+	CBitFieldMaskBit16 = 0x10000
+	CBitFieldMaskBit17 = 0x20000
+	CBitFieldMaskBit18 = 0x40000
+	CBitFieldMaskBit19 = 0x80000
+	CBitFieldMaskBit20 = 0x100000
+	CBitFieldMaskBit21 = 0x200000
+	CBitFieldMaskBit22 = 0x400000
+	CBitFieldMaskBit23 = 0x800000
+	CBitFieldMaskBit24 = 0x1000000
+	CBitFieldMaskBit25 = 0x2000000
+	CBitFieldMaskBit26 = 0x4000000
+	CBitFieldMaskBit27 = 0x8000000
+	CBitFieldMaskBit28 = 0x10000000
+	CBitFieldMaskBit29 = 0x20000000
+	CBitFieldMaskBit30 = 0x40000000
+	CBitFieldMaskBit31 = 0x80000000
+	CBitFieldMaskBit32 = 0x100000000
+	CBitFieldMaskBit33 = 0x200000000
+	CBitFieldMaskBit34 = 0x400000000
+	CBitFieldMaskBit35 = 0x800000000
+	CBitFieldMaskBit36 = 0x1000000000
+	CBitFieldMaskBit37 = 0x2000000000
+	CBitFieldMaskBit38 = 0x4000000000
+	CBitFieldMaskBit39 = 0x8000000000
+	CBitFieldMaskBit40 = 0x10000000000
+	CBitFieldMaskBit41 = 0x20000000000
+	CBitFieldMaskBit42 = 0x40000000000
+	CBitFieldMaskBit43 = 0x80000000000
+	CBitFieldMaskBit44 = 0x100000000000
+	CBitFieldMaskBit45 = 0x200000000000
+	CBitFieldMaskBit46 = 0x400000000000
+	CBitFieldMaskBit47 = 0x800000000000
+	CBitFieldMaskBit48 = 0x1000000000000
+	CBitFieldMaskBit49 = 0x2000000000000
+	CBitFieldMaskBit50 = 0x4000000000000
+	CBitFieldMaskBit51 = 0x8000000000000
+	CBitFieldMaskBit52 = 0x10000000000000
+	CBitFieldMaskBit53 = 0x20000000000000
+	CBitFieldMaskBit54 = 0x40000000000000
+	CBitFieldMaskBit55 = 0x80000000000000
+	CBitFieldMaskBit56 = 0x100000000000000
+	CBitFieldMaskBit57 = 0x200000000000000
+	CBitFieldMaskBit58 = 0x400000000000000
+	CBitFieldMaskBit59 = 0x800000000000000
+	CBitFieldMaskBit60 = 0x1000000000000000
+	CBitFieldMaskBit61 = 0x2000000000000000
+	CBitFieldMaskBit62 = 0x4000000000000000
+	CBitFieldMaskBit63 = 0x8000000000000000
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [118]int8
+	_      uint64
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	_         [4]byte
+	Start     uint64
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int64
+	Bsize   int64
+	Blocks  uint64
+	Bfree   uint64
+	Bavail  uint64
+	Files   uint64
+	Ffree   uint64
+	Fsid    Fsid
+	Namelen int64
+	Frsize  int64
+	Flags   int64
+	Spare   [4]int64
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint64
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+	_       [4]byte
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x20
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
index 2860b3e2848a97d49e9b0c30e19a33123c8d1e13..e0a3932232e9490c6ed44315dcf9ae5d7da80cec 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go
@@ -115,27 +115,10 @@ type Stat_t struct {
 	Pad5    [14]int32
 }
 
-type Statfs_t struct {
-	Type    int32
-	Bsize   int32
-	Frsize  int32
-	_       [4]byte
-	Blocks  uint64
-	Bfree   uint64
-	Files   uint64
-	Ffree   uint64
-	Bavail  uint64
-	Fsid    Fsid
-	Namelen int32
-	Flags   int32
-	Spare   [5]int32
-	_       [4]byte
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -172,7 +155,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -586,12 +569,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -676,7 +659,7 @@ type Sysinfo_t struct {
 	Totalhigh uint32
 	Freehigh  uint32
 	Unit      uint32
-	X_f       [8]int8
+	_         [8]int8
 }
 
 type Utsname struct {
@@ -733,7 +716,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [32]uint32
+	Val [32]uint32
 }
 
 const RNDGETENTCNT = 0x40045200
@@ -889,3 +872,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x8000000000000000
+	CBitFieldMaskBit1  = 0x4000000000000000
+	CBitFieldMaskBit2  = 0x2000000000000000
+	CBitFieldMaskBit3  = 0x1000000000000000
+	CBitFieldMaskBit4  = 0x800000000000000
+	CBitFieldMaskBit5  = 0x400000000000000
+	CBitFieldMaskBit6  = 0x200000000000000
+	CBitFieldMaskBit7  = 0x100000000000000
+	CBitFieldMaskBit8  = 0x80000000000000
+	CBitFieldMaskBit9  = 0x40000000000000
+	CBitFieldMaskBit10 = 0x20000000000000
+	CBitFieldMaskBit11 = 0x10000000000000
+	CBitFieldMaskBit12 = 0x8000000000000
+	CBitFieldMaskBit13 = 0x4000000000000
+	CBitFieldMaskBit14 = 0x2000000000000
+	CBitFieldMaskBit15 = 0x1000000000000
+	CBitFieldMaskBit16 = 0x800000000000
+	CBitFieldMaskBit17 = 0x400000000000
+	CBitFieldMaskBit18 = 0x200000000000
+	CBitFieldMaskBit19 = 0x100000000000
+	CBitFieldMaskBit20 = 0x80000000000
+	CBitFieldMaskBit21 = 0x40000000000
+	CBitFieldMaskBit22 = 0x20000000000
+	CBitFieldMaskBit23 = 0x10000000000
+	CBitFieldMaskBit24 = 0x8000000000
+	CBitFieldMaskBit25 = 0x4000000000
+	CBitFieldMaskBit26 = 0x2000000000
+	CBitFieldMaskBit27 = 0x1000000000
+	CBitFieldMaskBit28 = 0x800000000
+	CBitFieldMaskBit29 = 0x400000000
+	CBitFieldMaskBit30 = 0x200000000
+	CBitFieldMaskBit31 = 0x100000000
+	CBitFieldMaskBit32 = 0x80000000
+	CBitFieldMaskBit33 = 0x40000000
+	CBitFieldMaskBit34 = 0x20000000
+	CBitFieldMaskBit35 = 0x10000000
+	CBitFieldMaskBit36 = 0x8000000
+	CBitFieldMaskBit37 = 0x4000000
+	CBitFieldMaskBit38 = 0x2000000
+	CBitFieldMaskBit39 = 0x1000000
+	CBitFieldMaskBit40 = 0x800000
+	CBitFieldMaskBit41 = 0x400000
+	CBitFieldMaskBit42 = 0x200000
+	CBitFieldMaskBit43 = 0x100000
+	CBitFieldMaskBit44 = 0x80000
+	CBitFieldMaskBit45 = 0x40000
+	CBitFieldMaskBit46 = 0x20000
+	CBitFieldMaskBit47 = 0x10000
+	CBitFieldMaskBit48 = 0x8000
+	CBitFieldMaskBit49 = 0x4000
+	CBitFieldMaskBit50 = 0x2000
+	CBitFieldMaskBit51 = 0x1000
+	CBitFieldMaskBit52 = 0x800
+	CBitFieldMaskBit53 = 0x400
+	CBitFieldMaskBit54 = 0x200
+	CBitFieldMaskBit55 = 0x100
+	CBitFieldMaskBit56 = 0x80
+	CBitFieldMaskBit57 = 0x40
+	CBitFieldMaskBit58 = 0x20
+	CBitFieldMaskBit59 = 0x10
+	CBitFieldMaskBit60 = 0x8
+	CBitFieldMaskBit61 = 0x4
+	CBitFieldMaskBit62 = 0x2
+	CBitFieldMaskBit63 = 0x1
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [122]int8
+	_      uint32
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	Start     uint32
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int32
+	Bsize   int32
+	Frsize  int32
+	_       [4]byte
+	Blocks  uint64
+	Bfree   uint64
+	Files   uint64
+	Ffree   uint64
+	Bavail  uint64
+	Fsid    Fsid
+	Namelen int32
+	Flags   int32
+	Spare   [5]int32
+	_       [4]byte
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint32
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x18
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
index 17b881cab27cb65af076b3a1d877fd04d0af749f..838135e24b79c80ef78199fca1668088b9994d88 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go
@@ -117,25 +117,10 @@ type Stat_t struct {
 	Blocks  int64
 }
 
-type Statfs_t struct {
-	Type    int64
-	Bsize   int64
-	Frsize  int64
-	Blocks  uint64
-	Bfree   uint64
-	Files   uint64
-	Ffree   uint64
-	Bavail  uint64
-	Fsid    Fsid
-	Namelen int64
-	Flags   int64
-	Spare   [5]int64
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -172,7 +157,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -588,12 +573,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -679,7 +664,7 @@ type Sysinfo_t struct {
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	X_f       [0]int8
+	_         [0]int8
 	_         [4]byte
 }
 
@@ -738,7 +723,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [16]uint64
+	Val [16]uint64
 }
 
 const RNDGETENTCNT = 0x40045200
@@ -894,3 +879,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x8000000000000000
+	CBitFieldMaskBit1  = 0x4000000000000000
+	CBitFieldMaskBit2  = 0x2000000000000000
+	CBitFieldMaskBit3  = 0x1000000000000000
+	CBitFieldMaskBit4  = 0x800000000000000
+	CBitFieldMaskBit5  = 0x400000000000000
+	CBitFieldMaskBit6  = 0x200000000000000
+	CBitFieldMaskBit7  = 0x100000000000000
+	CBitFieldMaskBit8  = 0x80000000000000
+	CBitFieldMaskBit9  = 0x40000000000000
+	CBitFieldMaskBit10 = 0x20000000000000
+	CBitFieldMaskBit11 = 0x10000000000000
+	CBitFieldMaskBit12 = 0x8000000000000
+	CBitFieldMaskBit13 = 0x4000000000000
+	CBitFieldMaskBit14 = 0x2000000000000
+	CBitFieldMaskBit15 = 0x1000000000000
+	CBitFieldMaskBit16 = 0x800000000000
+	CBitFieldMaskBit17 = 0x400000000000
+	CBitFieldMaskBit18 = 0x200000000000
+	CBitFieldMaskBit19 = 0x100000000000
+	CBitFieldMaskBit20 = 0x80000000000
+	CBitFieldMaskBit21 = 0x40000000000
+	CBitFieldMaskBit22 = 0x20000000000
+	CBitFieldMaskBit23 = 0x10000000000
+	CBitFieldMaskBit24 = 0x8000000000
+	CBitFieldMaskBit25 = 0x4000000000
+	CBitFieldMaskBit26 = 0x2000000000
+	CBitFieldMaskBit27 = 0x1000000000
+	CBitFieldMaskBit28 = 0x800000000
+	CBitFieldMaskBit29 = 0x400000000
+	CBitFieldMaskBit30 = 0x200000000
+	CBitFieldMaskBit31 = 0x100000000
+	CBitFieldMaskBit32 = 0x80000000
+	CBitFieldMaskBit33 = 0x40000000
+	CBitFieldMaskBit34 = 0x20000000
+	CBitFieldMaskBit35 = 0x10000000
+	CBitFieldMaskBit36 = 0x8000000
+	CBitFieldMaskBit37 = 0x4000000
+	CBitFieldMaskBit38 = 0x2000000
+	CBitFieldMaskBit39 = 0x1000000
+	CBitFieldMaskBit40 = 0x800000
+	CBitFieldMaskBit41 = 0x400000
+	CBitFieldMaskBit42 = 0x200000
+	CBitFieldMaskBit43 = 0x100000
+	CBitFieldMaskBit44 = 0x80000
+	CBitFieldMaskBit45 = 0x40000
+	CBitFieldMaskBit46 = 0x20000
+	CBitFieldMaskBit47 = 0x10000
+	CBitFieldMaskBit48 = 0x8000
+	CBitFieldMaskBit49 = 0x4000
+	CBitFieldMaskBit50 = 0x2000
+	CBitFieldMaskBit51 = 0x1000
+	CBitFieldMaskBit52 = 0x800
+	CBitFieldMaskBit53 = 0x400
+	CBitFieldMaskBit54 = 0x200
+	CBitFieldMaskBit55 = 0x100
+	CBitFieldMaskBit56 = 0x80
+	CBitFieldMaskBit57 = 0x40
+	CBitFieldMaskBit58 = 0x20
+	CBitFieldMaskBit59 = 0x10
+	CBitFieldMaskBit60 = 0x8
+	CBitFieldMaskBit61 = 0x4
+	CBitFieldMaskBit62 = 0x2
+	CBitFieldMaskBit63 = 0x1
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [118]int8
+	_      uint64
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	_         [4]byte
+	Start     uint64
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int64
+	Bsize   int64
+	Frsize  int64
+	Blocks  uint64
+	Bfree   uint64
+	Files   uint64
+	Ffree   uint64
+	Bavail  uint64
+	Fsid    Fsid
+	Namelen int64
+	Flags   int64
+	Spare   [5]int64
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint64
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+	_       [4]byte
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x20
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
index ec802dc89229e3cbe03a8cddb761bad318076be8..a9d0131f2eec045d048d909cef81f67a842f5418 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go
@@ -117,25 +117,10 @@ type Stat_t struct {
 	Blocks  int64
 }
 
-type Statfs_t struct {
-	Type    int64
-	Bsize   int64
-	Frsize  int64
-	Blocks  uint64
-	Bfree   uint64
-	Files   uint64
-	Ffree   uint64
-	Bavail  uint64
-	Fsid    Fsid
-	Namelen int64
-	Flags   int64
-	Spare   [5]int64
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -172,7 +157,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -588,12 +573,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -679,7 +664,7 @@ type Sysinfo_t struct {
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	X_f       [0]int8
+	_         [0]int8
 	_         [4]byte
 }
 
@@ -738,7 +723,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [16]uint64
+	Val [16]uint64
 }
 
 const RNDGETENTCNT = 0x40045200
@@ -894,3 +879,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x1
+	CBitFieldMaskBit1  = 0x2
+	CBitFieldMaskBit2  = 0x4
+	CBitFieldMaskBit3  = 0x8
+	CBitFieldMaskBit4  = 0x10
+	CBitFieldMaskBit5  = 0x20
+	CBitFieldMaskBit6  = 0x40
+	CBitFieldMaskBit7  = 0x80
+	CBitFieldMaskBit8  = 0x100
+	CBitFieldMaskBit9  = 0x200
+	CBitFieldMaskBit10 = 0x400
+	CBitFieldMaskBit11 = 0x800
+	CBitFieldMaskBit12 = 0x1000
+	CBitFieldMaskBit13 = 0x2000
+	CBitFieldMaskBit14 = 0x4000
+	CBitFieldMaskBit15 = 0x8000
+	CBitFieldMaskBit16 = 0x10000
+	CBitFieldMaskBit17 = 0x20000
+	CBitFieldMaskBit18 = 0x40000
+	CBitFieldMaskBit19 = 0x80000
+	CBitFieldMaskBit20 = 0x100000
+	CBitFieldMaskBit21 = 0x200000
+	CBitFieldMaskBit22 = 0x400000
+	CBitFieldMaskBit23 = 0x800000
+	CBitFieldMaskBit24 = 0x1000000
+	CBitFieldMaskBit25 = 0x2000000
+	CBitFieldMaskBit26 = 0x4000000
+	CBitFieldMaskBit27 = 0x8000000
+	CBitFieldMaskBit28 = 0x10000000
+	CBitFieldMaskBit29 = 0x20000000
+	CBitFieldMaskBit30 = 0x40000000
+	CBitFieldMaskBit31 = 0x80000000
+	CBitFieldMaskBit32 = 0x100000000
+	CBitFieldMaskBit33 = 0x200000000
+	CBitFieldMaskBit34 = 0x400000000
+	CBitFieldMaskBit35 = 0x800000000
+	CBitFieldMaskBit36 = 0x1000000000
+	CBitFieldMaskBit37 = 0x2000000000
+	CBitFieldMaskBit38 = 0x4000000000
+	CBitFieldMaskBit39 = 0x8000000000
+	CBitFieldMaskBit40 = 0x10000000000
+	CBitFieldMaskBit41 = 0x20000000000
+	CBitFieldMaskBit42 = 0x40000000000
+	CBitFieldMaskBit43 = 0x80000000000
+	CBitFieldMaskBit44 = 0x100000000000
+	CBitFieldMaskBit45 = 0x200000000000
+	CBitFieldMaskBit46 = 0x400000000000
+	CBitFieldMaskBit47 = 0x800000000000
+	CBitFieldMaskBit48 = 0x1000000000000
+	CBitFieldMaskBit49 = 0x2000000000000
+	CBitFieldMaskBit50 = 0x4000000000000
+	CBitFieldMaskBit51 = 0x8000000000000
+	CBitFieldMaskBit52 = 0x10000000000000
+	CBitFieldMaskBit53 = 0x20000000000000
+	CBitFieldMaskBit54 = 0x40000000000000
+	CBitFieldMaskBit55 = 0x80000000000000
+	CBitFieldMaskBit56 = 0x100000000000000
+	CBitFieldMaskBit57 = 0x200000000000000
+	CBitFieldMaskBit58 = 0x400000000000000
+	CBitFieldMaskBit59 = 0x800000000000000
+	CBitFieldMaskBit60 = 0x1000000000000000
+	CBitFieldMaskBit61 = 0x2000000000000000
+	CBitFieldMaskBit62 = 0x4000000000000000
+	CBitFieldMaskBit63 = 0x8000000000000000
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [118]int8
+	_      uint64
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	_         [4]byte
+	Start     uint64
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int64
+	Bsize   int64
+	Frsize  int64
+	Blocks  uint64
+	Bfree   uint64
+	Files   uint64
+	Ffree   uint64
+	Bavail  uint64
+	Fsid    Fsid
+	Namelen int64
+	Flags   int64
+	Spare   [5]int64
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint64
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+	_       [4]byte
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x20
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
index 4a996485101485cf24e425a1abc51a010254cd58..4f6f1455568e407696aa0b10b926e572eeec4192 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go
@@ -115,27 +115,10 @@ type Stat_t struct {
 	Pad5    [14]int32
 }
 
-type Statfs_t struct {
-	Type    int32
-	Bsize   int32
-	Frsize  int32
-	_       [4]byte
-	Blocks  uint64
-	Bfree   uint64
-	Files   uint64
-	Ffree   uint64
-	Bavail  uint64
-	Fsid    Fsid
-	Namelen int32
-	Flags   int32
-	Spare   [5]int32
-	_       [4]byte
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -172,7 +155,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -586,12 +569,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -676,7 +659,7 @@ type Sysinfo_t struct {
 	Totalhigh uint32
 	Freehigh  uint32
 	Unit      uint32
-	X_f       [8]int8
+	_         [8]int8
 }
 
 type Utsname struct {
@@ -733,7 +716,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [32]uint32
+	Val [32]uint32
 }
 
 const RNDGETENTCNT = 0x40045200
@@ -889,3 +872,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x1
+	CBitFieldMaskBit1  = 0x2
+	CBitFieldMaskBit2  = 0x4
+	CBitFieldMaskBit3  = 0x8
+	CBitFieldMaskBit4  = 0x10
+	CBitFieldMaskBit5  = 0x20
+	CBitFieldMaskBit6  = 0x40
+	CBitFieldMaskBit7  = 0x80
+	CBitFieldMaskBit8  = 0x100
+	CBitFieldMaskBit9  = 0x200
+	CBitFieldMaskBit10 = 0x400
+	CBitFieldMaskBit11 = 0x800
+	CBitFieldMaskBit12 = 0x1000
+	CBitFieldMaskBit13 = 0x2000
+	CBitFieldMaskBit14 = 0x4000
+	CBitFieldMaskBit15 = 0x8000
+	CBitFieldMaskBit16 = 0x10000
+	CBitFieldMaskBit17 = 0x20000
+	CBitFieldMaskBit18 = 0x40000
+	CBitFieldMaskBit19 = 0x80000
+	CBitFieldMaskBit20 = 0x100000
+	CBitFieldMaskBit21 = 0x200000
+	CBitFieldMaskBit22 = 0x400000
+	CBitFieldMaskBit23 = 0x800000
+	CBitFieldMaskBit24 = 0x1000000
+	CBitFieldMaskBit25 = 0x2000000
+	CBitFieldMaskBit26 = 0x4000000
+	CBitFieldMaskBit27 = 0x8000000
+	CBitFieldMaskBit28 = 0x10000000
+	CBitFieldMaskBit29 = 0x20000000
+	CBitFieldMaskBit30 = 0x40000000
+	CBitFieldMaskBit31 = 0x80000000
+	CBitFieldMaskBit32 = 0x100000000
+	CBitFieldMaskBit33 = 0x200000000
+	CBitFieldMaskBit34 = 0x400000000
+	CBitFieldMaskBit35 = 0x800000000
+	CBitFieldMaskBit36 = 0x1000000000
+	CBitFieldMaskBit37 = 0x2000000000
+	CBitFieldMaskBit38 = 0x4000000000
+	CBitFieldMaskBit39 = 0x8000000000
+	CBitFieldMaskBit40 = 0x10000000000
+	CBitFieldMaskBit41 = 0x20000000000
+	CBitFieldMaskBit42 = 0x40000000000
+	CBitFieldMaskBit43 = 0x80000000000
+	CBitFieldMaskBit44 = 0x100000000000
+	CBitFieldMaskBit45 = 0x200000000000
+	CBitFieldMaskBit46 = 0x400000000000
+	CBitFieldMaskBit47 = 0x800000000000
+	CBitFieldMaskBit48 = 0x1000000000000
+	CBitFieldMaskBit49 = 0x2000000000000
+	CBitFieldMaskBit50 = 0x4000000000000
+	CBitFieldMaskBit51 = 0x8000000000000
+	CBitFieldMaskBit52 = 0x10000000000000
+	CBitFieldMaskBit53 = 0x20000000000000
+	CBitFieldMaskBit54 = 0x40000000000000
+	CBitFieldMaskBit55 = 0x80000000000000
+	CBitFieldMaskBit56 = 0x100000000000000
+	CBitFieldMaskBit57 = 0x200000000000000
+	CBitFieldMaskBit58 = 0x400000000000000
+	CBitFieldMaskBit59 = 0x800000000000000
+	CBitFieldMaskBit60 = 0x1000000000000000
+	CBitFieldMaskBit61 = 0x2000000000000000
+	CBitFieldMaskBit62 = 0x4000000000000000
+	CBitFieldMaskBit63 = 0x8000000000000000
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [122]int8
+	_      uint32
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	Start     uint32
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int32
+	Bsize   int32
+	Frsize  int32
+	_       [4]byte
+	Blocks  uint64
+	Bfree   uint64
+	Files   uint64
+	Ffree   uint64
+	Bavail  uint64
+	Fsid    Fsid
+	Namelen int32
+	Flags   int32
+	Spare   [5]int32
+	_       [4]byte
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint32
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x18
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
index 63a0dbe94e282485a7dce4d8bbc32251c9e11d0f..9ddd47015e33478bcf74a08cf2e46f85a4c60dea 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go
@@ -105,7 +105,7 @@ type Stat_t struct {
 	Mode    uint32
 	Uid     uint32
 	Gid     uint32
-	X__pad2 int32
+	_       int32
 	Rdev    uint64
 	Size    int64
 	Blksize int64
@@ -118,25 +118,10 @@ type Stat_t struct {
 	_       uint64
 }
 
-type Statfs_t struct {
-	Type    int64
-	Bsize   int64
-	Blocks  uint64
-	Bfree   uint64
-	Bavail  uint64
-	Files   uint64
-	Ffree   uint64
-	Fsid    Fsid
-	Namelen int64
-	Frsize  int64
-	Flags   int64
-	Spare   [4]int64
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -173,7 +158,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -589,12 +574,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -686,7 +671,7 @@ type Sysinfo_t struct {
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	X_f       [0]uint8
+	_         [0]uint8
 	_         [4]byte
 }
 
@@ -709,10 +694,10 @@ type Ustat_t struct {
 }
 
 type EpollEvent struct {
-	Events  uint32
-	X_padFd int32
-	Fd      int32
-	Pad     int32
+	Events uint32
+	_      int32
+	Fd     int32
+	Pad    int32
 }
 
 const (
@@ -746,7 +731,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [16]uint64
+	Val [16]uint64
 }
 
 const RNDGETENTCNT = 0x40045200
@@ -902,3 +887,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x8000000000000000
+	CBitFieldMaskBit1  = 0x4000000000000000
+	CBitFieldMaskBit2  = 0x2000000000000000
+	CBitFieldMaskBit3  = 0x1000000000000000
+	CBitFieldMaskBit4  = 0x800000000000000
+	CBitFieldMaskBit5  = 0x400000000000000
+	CBitFieldMaskBit6  = 0x200000000000000
+	CBitFieldMaskBit7  = 0x100000000000000
+	CBitFieldMaskBit8  = 0x80000000000000
+	CBitFieldMaskBit9  = 0x40000000000000
+	CBitFieldMaskBit10 = 0x20000000000000
+	CBitFieldMaskBit11 = 0x10000000000000
+	CBitFieldMaskBit12 = 0x8000000000000
+	CBitFieldMaskBit13 = 0x4000000000000
+	CBitFieldMaskBit14 = 0x2000000000000
+	CBitFieldMaskBit15 = 0x1000000000000
+	CBitFieldMaskBit16 = 0x800000000000
+	CBitFieldMaskBit17 = 0x400000000000
+	CBitFieldMaskBit18 = 0x200000000000
+	CBitFieldMaskBit19 = 0x100000000000
+	CBitFieldMaskBit20 = 0x80000000000
+	CBitFieldMaskBit21 = 0x40000000000
+	CBitFieldMaskBit22 = 0x20000000000
+	CBitFieldMaskBit23 = 0x10000000000
+	CBitFieldMaskBit24 = 0x8000000000
+	CBitFieldMaskBit25 = 0x4000000000
+	CBitFieldMaskBit26 = 0x2000000000
+	CBitFieldMaskBit27 = 0x1000000000
+	CBitFieldMaskBit28 = 0x800000000
+	CBitFieldMaskBit29 = 0x400000000
+	CBitFieldMaskBit30 = 0x200000000
+	CBitFieldMaskBit31 = 0x100000000
+	CBitFieldMaskBit32 = 0x80000000
+	CBitFieldMaskBit33 = 0x40000000
+	CBitFieldMaskBit34 = 0x20000000
+	CBitFieldMaskBit35 = 0x10000000
+	CBitFieldMaskBit36 = 0x8000000
+	CBitFieldMaskBit37 = 0x4000000
+	CBitFieldMaskBit38 = 0x2000000
+	CBitFieldMaskBit39 = 0x1000000
+	CBitFieldMaskBit40 = 0x800000
+	CBitFieldMaskBit41 = 0x400000
+	CBitFieldMaskBit42 = 0x200000
+	CBitFieldMaskBit43 = 0x100000
+	CBitFieldMaskBit44 = 0x80000
+	CBitFieldMaskBit45 = 0x40000
+	CBitFieldMaskBit46 = 0x20000
+	CBitFieldMaskBit47 = 0x10000
+	CBitFieldMaskBit48 = 0x8000
+	CBitFieldMaskBit49 = 0x4000
+	CBitFieldMaskBit50 = 0x2000
+	CBitFieldMaskBit51 = 0x1000
+	CBitFieldMaskBit52 = 0x800
+	CBitFieldMaskBit53 = 0x400
+	CBitFieldMaskBit54 = 0x200
+	CBitFieldMaskBit55 = 0x100
+	CBitFieldMaskBit56 = 0x80
+	CBitFieldMaskBit57 = 0x40
+	CBitFieldMaskBit58 = 0x20
+	CBitFieldMaskBit59 = 0x10
+	CBitFieldMaskBit60 = 0x8
+	CBitFieldMaskBit61 = 0x4
+	CBitFieldMaskBit62 = 0x2
+	CBitFieldMaskBit63 = 0x1
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [118]uint8
+	_      uint64
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	_         [4]byte
+	Start     uint64
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int64
+	Bsize   int64
+	Blocks  uint64
+	Bfree   uint64
+	Bavail  uint64
+	Files   uint64
+	Ffree   uint64
+	Fsid    Fsid
+	Namelen int64
+	Frsize  int64
+	Flags   int64
+	Spare   [4]int64
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint64
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+	_       [4]byte
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x20
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
index f20a63591b221b91abe389537fb925946bcd434f..3a5cc696ec3c37b49f4cc5cd367a4c58cd2896a5 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go
@@ -105,7 +105,7 @@ type Stat_t struct {
 	Mode    uint32
 	Uid     uint32
 	Gid     uint32
-	X__pad2 int32
+	_       int32
 	Rdev    uint64
 	Size    int64
 	Blksize int64
@@ -118,25 +118,10 @@ type Stat_t struct {
 	_       uint64
 }
 
-type Statfs_t struct {
-	Type    int64
-	Bsize   int64
-	Blocks  uint64
-	Bfree   uint64
-	Bavail  uint64
-	Files   uint64
-	Ffree   uint64
-	Fsid    Fsid
-	Namelen int64
-	Frsize  int64
-	Flags   int64
-	Spare   [4]int64
-}
-
 type StatxTimestamp struct {
-	Sec         int64
-	Nsec        uint32
-	X__reserved int32
+	Sec  int64
+	Nsec uint32
+	_    int32
 }
 
 type Statx_t struct {
@@ -173,7 +158,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	X__val [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -589,12 +574,12 @@ type RtAttr struct {
 }
 
 type IfInfomsg struct {
-	Family     uint8
-	X__ifi_pad uint8
-	Type       uint16
-	Index      int32
-	Flags      uint32
-	Change     uint32
+	Family uint8
+	_      uint8
+	Type   uint16
+	Index  int32
+	Flags  uint32
+	Change uint32
 }
 
 type IfAddrmsg struct {
@@ -686,7 +671,7 @@ type Sysinfo_t struct {
 	Totalhigh uint64
 	Freehigh  uint64
 	Unit      uint32
-	X_f       [0]uint8
+	_         [0]uint8
 	_         [4]byte
 }
 
@@ -709,10 +694,10 @@ type Ustat_t struct {
 }
 
 type EpollEvent struct {
-	Events  uint32
-	X_padFd int32
-	Fd      int32
-	Pad     int32
+	Events uint32
+	_      int32
+	Fd     int32
+	Pad    int32
 }
 
 const (
@@ -746,7 +731,7 @@ const (
 )
 
 type Sigset_t struct {
-	X__val [16]uint64
+	Val [16]uint64
 }
 
 const RNDGETENTCNT = 0x40045200
@@ -902,3 +887,938 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x1
+	CBitFieldMaskBit1  = 0x2
+	CBitFieldMaskBit2  = 0x4
+	CBitFieldMaskBit3  = 0x8
+	CBitFieldMaskBit4  = 0x10
+	CBitFieldMaskBit5  = 0x20
+	CBitFieldMaskBit6  = 0x40
+	CBitFieldMaskBit7  = 0x80
+	CBitFieldMaskBit8  = 0x100
+	CBitFieldMaskBit9  = 0x200
+	CBitFieldMaskBit10 = 0x400
+	CBitFieldMaskBit11 = 0x800
+	CBitFieldMaskBit12 = 0x1000
+	CBitFieldMaskBit13 = 0x2000
+	CBitFieldMaskBit14 = 0x4000
+	CBitFieldMaskBit15 = 0x8000
+	CBitFieldMaskBit16 = 0x10000
+	CBitFieldMaskBit17 = 0x20000
+	CBitFieldMaskBit18 = 0x40000
+	CBitFieldMaskBit19 = 0x80000
+	CBitFieldMaskBit20 = 0x100000
+	CBitFieldMaskBit21 = 0x200000
+	CBitFieldMaskBit22 = 0x400000
+	CBitFieldMaskBit23 = 0x800000
+	CBitFieldMaskBit24 = 0x1000000
+	CBitFieldMaskBit25 = 0x2000000
+	CBitFieldMaskBit26 = 0x4000000
+	CBitFieldMaskBit27 = 0x8000000
+	CBitFieldMaskBit28 = 0x10000000
+	CBitFieldMaskBit29 = 0x20000000
+	CBitFieldMaskBit30 = 0x40000000
+	CBitFieldMaskBit31 = 0x80000000
+	CBitFieldMaskBit32 = 0x100000000
+	CBitFieldMaskBit33 = 0x200000000
+	CBitFieldMaskBit34 = 0x400000000
+	CBitFieldMaskBit35 = 0x800000000
+	CBitFieldMaskBit36 = 0x1000000000
+	CBitFieldMaskBit37 = 0x2000000000
+	CBitFieldMaskBit38 = 0x4000000000
+	CBitFieldMaskBit39 = 0x8000000000
+	CBitFieldMaskBit40 = 0x10000000000
+	CBitFieldMaskBit41 = 0x20000000000
+	CBitFieldMaskBit42 = 0x40000000000
+	CBitFieldMaskBit43 = 0x80000000000
+	CBitFieldMaskBit44 = 0x100000000000
+	CBitFieldMaskBit45 = 0x200000000000
+	CBitFieldMaskBit46 = 0x400000000000
+	CBitFieldMaskBit47 = 0x800000000000
+	CBitFieldMaskBit48 = 0x1000000000000
+	CBitFieldMaskBit49 = 0x2000000000000
+	CBitFieldMaskBit50 = 0x4000000000000
+	CBitFieldMaskBit51 = 0x8000000000000
+	CBitFieldMaskBit52 = 0x10000000000000
+	CBitFieldMaskBit53 = 0x20000000000000
+	CBitFieldMaskBit54 = 0x40000000000000
+	CBitFieldMaskBit55 = 0x80000000000000
+	CBitFieldMaskBit56 = 0x100000000000000
+	CBitFieldMaskBit57 = 0x200000000000000
+	CBitFieldMaskBit58 = 0x400000000000000
+	CBitFieldMaskBit59 = 0x800000000000000
+	CBitFieldMaskBit60 = 0x1000000000000000
+	CBitFieldMaskBit61 = 0x2000000000000000
+	CBitFieldMaskBit62 = 0x4000000000000000
+	CBitFieldMaskBit63 = 0x8000000000000000
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [118]uint8
+	_      uint64
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	_         [4]byte
+	Start     uint64
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    int64
+	Bsize   int64
+	Blocks  uint64
+	Bfree   uint64
+	Bavail  uint64
+	Files   uint64
+	Ffree   uint64
+	Fsid    Fsid
+	Namelen int64
+	Frsize  int64
+	Flags   int64
+	Spare   [4]int64
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint64
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+	_       [4]byte
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x20
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
index 30dc10582fecc27ac905fe217ee3fa29a078c856..032a71bbfe3fd88f153232e69d3f47ed5ea12f9a 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go
@@ -116,22 +116,6 @@ type Stat_t struct {
 	_       [3]int64
 }
 
-type Statfs_t struct {
-	Type    uint32
-	Bsize   uint32
-	Blocks  uint64
-	Bfree   uint64
-	Bavail  uint64
-	Files   uint64
-	Ffree   uint64
-	Fsid    Fsid
-	Namelen uint32
-	Frsize  uint32
-	Flags   uint32
-	Spare   [4]uint32
-	_       [4]byte
-}
-
 type StatxTimestamp struct {
 	Sec  int64
 	Nsec uint32
@@ -172,7 +156,7 @@ type Dirent struct {
 }
 
 type Fsid struct {
-	_ [2]int32
+	Val [2]int32
 }
 
 type Flock_t struct {
@@ -763,7 +747,7 @@ const (
 )
 
 type Sigset_t struct {
-	_ [16]uint64
+	Val [16]uint64
 }
 
 const RNDGETENTCNT = 0x80045200
@@ -919,3 +903,939 @@ const (
 	BDADDR_LE_PUBLIC = 0x1
 	BDADDR_LE_RANDOM = 0x2
 )
+
+type PerfEventAttr struct {
+	Type               uint32
+	Size               uint32
+	Config             uint64
+	Sample             uint64
+	Sample_type        uint64
+	Read_format        uint64
+	Bits               uint64
+	Wakeup             uint32
+	Bp_type            uint32
+	Ext1               uint64
+	Ext2               uint64
+	Branch_sample_type uint64
+	Sample_regs_user   uint64
+	Sample_stack_user  uint32
+	Clockid            int32
+	Sample_regs_intr   uint64
+	Aux_watermark      uint32
+	_                  uint32
+}
+
+type PerfEventMmapPage struct {
+	Version        uint32
+	Compat_version uint32
+	Lock           uint32
+	Index          uint32
+	Offset         int64
+	Time_enabled   uint64
+	Time_running   uint64
+	Capabilities   uint64
+	Pmc_width      uint16
+	Time_shift     uint16
+	Time_mult      uint32
+	Time_offset    uint64
+	Time_zero      uint64
+	Size           uint32
+	_              [948]uint8
+	Data_head      uint64
+	Data_tail      uint64
+	Data_offset    uint64
+	Data_size      uint64
+	Aux_head       uint64
+	Aux_tail       uint64
+	Aux_offset     uint64
+	Aux_size       uint64
+}
+
+const (
+	PerfBitDisabled               uint64 = CBitFieldMaskBit0
+	PerfBitInherit                       = CBitFieldMaskBit1
+	PerfBitPinned                        = CBitFieldMaskBit2
+	PerfBitExclusive                     = CBitFieldMaskBit3
+	PerfBitExcludeUser                   = CBitFieldMaskBit4
+	PerfBitExcludeKernel                 = CBitFieldMaskBit5
+	PerfBitExcludeHv                     = CBitFieldMaskBit6
+	PerfBitExcludeIdle                   = CBitFieldMaskBit7
+	PerfBitMmap                          = CBitFieldMaskBit8
+	PerfBitComm                          = CBitFieldMaskBit9
+	PerfBitFreq                          = CBitFieldMaskBit10
+	PerfBitInheritStat                   = CBitFieldMaskBit11
+	PerfBitEnableOnExec                  = CBitFieldMaskBit12
+	PerfBitTask                          = CBitFieldMaskBit13
+	PerfBitWatermark                     = CBitFieldMaskBit14
+	PerfBitPreciseIPBit1                 = CBitFieldMaskBit15
+	PerfBitPreciseIPBit2                 = CBitFieldMaskBit16
+	PerfBitMmapData                      = CBitFieldMaskBit17
+	PerfBitSampleIDAll                   = CBitFieldMaskBit18
+	PerfBitExcludeHost                   = CBitFieldMaskBit19
+	PerfBitExcludeGuest                  = CBitFieldMaskBit20
+	PerfBitExcludeCallchainKernel        = CBitFieldMaskBit21
+	PerfBitExcludeCallchainUser          = CBitFieldMaskBit22
+	PerfBitMmap2                         = CBitFieldMaskBit23
+	PerfBitCommExec                      = CBitFieldMaskBit24
+	PerfBitUseClockID                    = CBitFieldMaskBit25
+	PerfBitContextSwitch                 = CBitFieldMaskBit26
+)
+
+const (
+	PERF_TYPE_HARDWARE   = 0x0
+	PERF_TYPE_SOFTWARE   = 0x1
+	PERF_TYPE_TRACEPOINT = 0x2
+	PERF_TYPE_HW_CACHE   = 0x3
+	PERF_TYPE_RAW        = 0x4
+	PERF_TYPE_BREAKPOINT = 0x5
+
+	PERF_COUNT_HW_CPU_CYCLES              = 0x0
+	PERF_COUNT_HW_INSTRUCTIONS            = 0x1
+	PERF_COUNT_HW_CACHE_REFERENCES        = 0x2
+	PERF_COUNT_HW_CACHE_MISSES            = 0x3
+	PERF_COUNT_HW_BRANCH_INSTRUCTIONS     = 0x4
+	PERF_COUNT_HW_BRANCH_MISSES           = 0x5
+	PERF_COUNT_HW_BUS_CYCLES              = 0x6
+	PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 0x7
+	PERF_COUNT_HW_STALLED_CYCLES_BACKEND  = 0x8
+	PERF_COUNT_HW_REF_CPU_CYCLES          = 0x9
+
+	PERF_COUNT_HW_CACHE_L1D  = 0x0
+	PERF_COUNT_HW_CACHE_L1I  = 0x1
+	PERF_COUNT_HW_CACHE_LL   = 0x2
+	PERF_COUNT_HW_CACHE_DTLB = 0x3
+	PERF_COUNT_HW_CACHE_ITLB = 0x4
+	PERF_COUNT_HW_CACHE_BPU  = 0x5
+	PERF_COUNT_HW_CACHE_NODE = 0x6
+
+	PERF_COUNT_HW_CACHE_OP_READ     = 0x0
+	PERF_COUNT_HW_CACHE_OP_WRITE    = 0x1
+	PERF_COUNT_HW_CACHE_OP_PREFETCH = 0x2
+
+	PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0x0
+	PERF_COUNT_HW_CACHE_RESULT_MISS   = 0x1
+
+	PERF_COUNT_SW_CPU_CLOCK        = 0x0
+	PERF_COUNT_SW_TASK_CLOCK       = 0x1
+	PERF_COUNT_SW_PAGE_FAULTS      = 0x2
+	PERF_COUNT_SW_CONTEXT_SWITCHES = 0x3
+	PERF_COUNT_SW_CPU_MIGRATIONS   = 0x4
+	PERF_COUNT_SW_PAGE_FAULTS_MIN  = 0x5
+	PERF_COUNT_SW_PAGE_FAULTS_MAJ  = 0x6
+	PERF_COUNT_SW_ALIGNMENT_FAULTS = 0x7
+	PERF_COUNT_SW_EMULATION_FAULTS = 0x8
+	PERF_COUNT_SW_DUMMY            = 0x9
+
+	PERF_SAMPLE_IP           = 0x1
+	PERF_SAMPLE_TID          = 0x2
+	PERF_SAMPLE_TIME         = 0x4
+	PERF_SAMPLE_ADDR         = 0x8
+	PERF_SAMPLE_READ         = 0x10
+	PERF_SAMPLE_CALLCHAIN    = 0x20
+	PERF_SAMPLE_ID           = 0x40
+	PERF_SAMPLE_CPU          = 0x80
+	PERF_SAMPLE_PERIOD       = 0x100
+	PERF_SAMPLE_STREAM_ID    = 0x200
+	PERF_SAMPLE_RAW          = 0x400
+	PERF_SAMPLE_BRANCH_STACK = 0x800
+
+	PERF_SAMPLE_BRANCH_USER       = 0x1
+	PERF_SAMPLE_BRANCH_KERNEL     = 0x2
+	PERF_SAMPLE_BRANCH_HV         = 0x4
+	PERF_SAMPLE_BRANCH_ANY        = 0x8
+	PERF_SAMPLE_BRANCH_ANY_CALL   = 0x10
+	PERF_SAMPLE_BRANCH_ANY_RETURN = 0x20
+	PERF_SAMPLE_BRANCH_IND_CALL   = 0x40
+
+	PERF_FORMAT_TOTAL_TIME_ENABLED = 0x1
+	PERF_FORMAT_TOTAL_TIME_RUNNING = 0x2
+	PERF_FORMAT_ID                 = 0x4
+	PERF_FORMAT_GROUP              = 0x8
+
+	PERF_RECORD_MMAP       = 0x1
+	PERF_RECORD_LOST       = 0x2
+	PERF_RECORD_COMM       = 0x3
+	PERF_RECORD_EXIT       = 0x4
+	PERF_RECORD_THROTTLE   = 0x5
+	PERF_RECORD_UNTHROTTLE = 0x6
+	PERF_RECORD_FORK       = 0x7
+	PERF_RECORD_READ       = 0x8
+	PERF_RECORD_SAMPLE     = 0x9
+
+	PERF_CONTEXT_HV     = -0x20
+	PERF_CONTEXT_KERNEL = -0x80
+	PERF_CONTEXT_USER   = -0x200
+
+	PERF_CONTEXT_GUEST        = -0x800
+	PERF_CONTEXT_GUEST_KERNEL = -0x880
+	PERF_CONTEXT_GUEST_USER   = -0xa00
+
+	PERF_FLAG_FD_NO_GROUP = 0x1
+	PERF_FLAG_FD_OUTPUT   = 0x2
+	PERF_FLAG_PID_CGROUP  = 0x4
+)
+
+const (
+	CBitFieldMaskBit0  = 0x8000000000000000
+	CBitFieldMaskBit1  = 0x4000000000000000
+	CBitFieldMaskBit2  = 0x2000000000000000
+	CBitFieldMaskBit3  = 0x1000000000000000
+	CBitFieldMaskBit4  = 0x800000000000000
+	CBitFieldMaskBit5  = 0x400000000000000
+	CBitFieldMaskBit6  = 0x200000000000000
+	CBitFieldMaskBit7  = 0x100000000000000
+	CBitFieldMaskBit8  = 0x80000000000000
+	CBitFieldMaskBit9  = 0x40000000000000
+	CBitFieldMaskBit10 = 0x20000000000000
+	CBitFieldMaskBit11 = 0x10000000000000
+	CBitFieldMaskBit12 = 0x8000000000000
+	CBitFieldMaskBit13 = 0x4000000000000
+	CBitFieldMaskBit14 = 0x2000000000000
+	CBitFieldMaskBit15 = 0x1000000000000
+	CBitFieldMaskBit16 = 0x800000000000
+	CBitFieldMaskBit17 = 0x400000000000
+	CBitFieldMaskBit18 = 0x200000000000
+	CBitFieldMaskBit19 = 0x100000000000
+	CBitFieldMaskBit20 = 0x80000000000
+	CBitFieldMaskBit21 = 0x40000000000
+	CBitFieldMaskBit22 = 0x20000000000
+	CBitFieldMaskBit23 = 0x10000000000
+	CBitFieldMaskBit24 = 0x8000000000
+	CBitFieldMaskBit25 = 0x4000000000
+	CBitFieldMaskBit26 = 0x2000000000
+	CBitFieldMaskBit27 = 0x1000000000
+	CBitFieldMaskBit28 = 0x800000000
+	CBitFieldMaskBit29 = 0x400000000
+	CBitFieldMaskBit30 = 0x200000000
+	CBitFieldMaskBit31 = 0x100000000
+	CBitFieldMaskBit32 = 0x80000000
+	CBitFieldMaskBit33 = 0x40000000
+	CBitFieldMaskBit34 = 0x20000000
+	CBitFieldMaskBit35 = 0x10000000
+	CBitFieldMaskBit36 = 0x8000000
+	CBitFieldMaskBit37 = 0x4000000
+	CBitFieldMaskBit38 = 0x2000000
+	CBitFieldMaskBit39 = 0x1000000
+	CBitFieldMaskBit40 = 0x800000
+	CBitFieldMaskBit41 = 0x400000
+	CBitFieldMaskBit42 = 0x200000
+	CBitFieldMaskBit43 = 0x100000
+	CBitFieldMaskBit44 = 0x80000
+	CBitFieldMaskBit45 = 0x40000
+	CBitFieldMaskBit46 = 0x20000
+	CBitFieldMaskBit47 = 0x10000
+	CBitFieldMaskBit48 = 0x8000
+	CBitFieldMaskBit49 = 0x4000
+	CBitFieldMaskBit50 = 0x2000
+	CBitFieldMaskBit51 = 0x1000
+	CBitFieldMaskBit52 = 0x800
+	CBitFieldMaskBit53 = 0x400
+	CBitFieldMaskBit54 = 0x200
+	CBitFieldMaskBit55 = 0x100
+	CBitFieldMaskBit56 = 0x80
+	CBitFieldMaskBit57 = 0x40
+	CBitFieldMaskBit58 = 0x20
+	CBitFieldMaskBit59 = 0x10
+	CBitFieldMaskBit60 = 0x8
+	CBitFieldMaskBit61 = 0x4
+	CBitFieldMaskBit62 = 0x2
+	CBitFieldMaskBit63 = 0x1
+)
+
+type SockaddrStorage struct {
+	Family uint16
+	_      [118]int8
+	_      uint64
+}
+
+type TCPMD5Sig struct {
+	Addr      SockaddrStorage
+	Flags     uint8
+	Prefixlen uint8
+	Keylen    uint16
+	_         uint32
+	Key       [80]uint8
+}
+
+type HDDriveCmdHdr struct {
+	Command uint8
+	Number  uint8
+	Feature uint8
+	Count   uint8
+}
+
+type HDGeometry struct {
+	Heads     uint8
+	Sectors   uint8
+	Cylinders uint16
+	_         [4]byte
+	Start     uint64
+}
+
+type HDDriveID struct {
+	Config         uint16
+	Cyls           uint16
+	Reserved2      uint16
+	Heads          uint16
+	Track_bytes    uint16
+	Sector_bytes   uint16
+	Sectors        uint16
+	Vendor0        uint16
+	Vendor1        uint16
+	Vendor2        uint16
+	Serial_no      [20]uint8
+	Buf_type       uint16
+	Buf_size       uint16
+	Ecc_bytes      uint16
+	Fw_rev         [8]uint8
+	Model          [40]uint8
+	Max_multsect   uint8
+	Vendor3        uint8
+	Dword_io       uint16
+	Vendor4        uint8
+	Capability     uint8
+	Reserved50     uint16
+	Vendor5        uint8
+	TPIO           uint8
+	Vendor6        uint8
+	TDMA           uint8
+	Field_valid    uint16
+	Cur_cyls       uint16
+	Cur_heads      uint16
+	Cur_sectors    uint16
+	Cur_capacity0  uint16
+	Cur_capacity1  uint16
+	Multsect       uint8
+	Multsect_valid uint8
+	Lba_capacity   uint32
+	Dma_1word      uint16
+	Dma_mword      uint16
+	Eide_pio_modes uint16
+	Eide_dma_min   uint16
+	Eide_dma_time  uint16
+	Eide_pio       uint16
+	Eide_pio_iordy uint16
+	Words69_70     [2]uint16
+	Words71_74     [4]uint16
+	Queue_depth    uint16
+	Words76_79     [4]uint16
+	Major_rev_num  uint16
+	Minor_rev_num  uint16
+	Command_set_1  uint16
+	Command_set_2  uint16
+	Cfsse          uint16
+	Cfs_enable_1   uint16
+	Cfs_enable_2   uint16
+	Csf_default    uint16
+	Dma_ultra      uint16
+	Trseuc         uint16
+	TrsEuc         uint16
+	CurAPMvalues   uint16
+	Mprc           uint16
+	Hw_config      uint16
+	Acoustic       uint16
+	Msrqs          uint16
+	Sxfert         uint16
+	Sal            uint16
+	Spg            uint32
+	Lba_capacity_2 uint64
+	Words104_125   [22]uint16
+	Last_lun       uint16
+	Word127        uint16
+	Dlf            uint16
+	Csfo           uint16
+	Words130_155   [26]uint16
+	Word156        uint16
+	Words157_159   [3]uint16
+	Cfa_power      uint16
+	Words161_175   [15]uint16
+	Words176_205   [30]uint16
+	Words206_254   [49]uint16
+	Integrity_word uint16
+}
+
+type Statfs_t struct {
+	Type    uint32
+	Bsize   uint32
+	Blocks  uint64
+	Bfree   uint64
+	Bavail  uint64
+	Files   uint64
+	Ffree   uint64
+	Fsid    Fsid
+	Namelen uint32
+	Frsize  uint32
+	Flags   uint32
+	Spare   [4]uint32
+	_       [4]byte
+}
+
+const (
+	ST_MANDLOCK    = 0x40
+	ST_NOATIME     = 0x400
+	ST_NODEV       = 0x4
+	ST_NODIRATIME  = 0x800
+	ST_NOEXEC      = 0x8
+	ST_NOSUID      = 0x2
+	ST_RDONLY      = 0x1
+	ST_RELATIME    = 0x1000
+	ST_SYNCHRONOUS = 0x10
+)
+
+type TpacketHdr struct {
+	Status  uint64
+	Len     uint32
+	Snaplen uint32
+	Mac     uint16
+	Net     uint16
+	Sec     uint32
+	Usec    uint32
+	_       [4]byte
+}
+
+type Tpacket2Hdr struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Sec       uint32
+	Nsec      uint32
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+	_         [4]uint8
+}
+
+type Tpacket3Hdr struct {
+	Next_offset uint32
+	Sec         uint32
+	Nsec        uint32
+	Snaplen     uint32
+	Len         uint32
+	Status      uint32
+	Mac         uint16
+	Net         uint16
+	Hv1         TpacketHdrVariant1
+	_           [8]uint8
+}
+
+type TpacketHdrVariant1 struct {
+	Rxhash    uint32
+	Vlan_tci  uint32
+	Vlan_tpid uint16
+	_         uint16
+}
+
+type TpacketBlockDesc struct {
+	Version uint32
+	To_priv uint32
+	Hdr     [40]byte
+}
+
+type TpacketReq struct {
+	Block_size uint32
+	Block_nr   uint32
+	Frame_size uint32
+	Frame_nr   uint32
+}
+
+type TpacketReq3 struct {
+	Block_size       uint32
+	Block_nr         uint32
+	Frame_size       uint32
+	Frame_nr         uint32
+	Retire_blk_tov   uint32
+	Sizeof_priv      uint32
+	Feature_req_word uint32
+}
+
+type TpacketStats struct {
+	Packets uint32
+	Drops   uint32
+}
+
+type TpacketStatsV3 struct {
+	Packets      uint32
+	Drops        uint32
+	Freeze_q_cnt uint32
+}
+
+type TpacketAuxdata struct {
+	Status    uint32
+	Len       uint32
+	Snaplen   uint32
+	Mac       uint16
+	Net       uint16
+	Vlan_tci  uint16
+	Vlan_tpid uint16
+}
+
+const (
+	TPACKET_V1 = 0x0
+	TPACKET_V2 = 0x1
+	TPACKET_V3 = 0x2
+)
+
+const (
+	SizeofTpacketHdr  = 0x20
+	SizeofTpacket2Hdr = 0x20
+	SizeofTpacket3Hdr = 0x30
+)
+
+const (
+	NF_INET_PRE_ROUTING  = 0x0
+	NF_INET_LOCAL_IN     = 0x1
+	NF_INET_FORWARD      = 0x2
+	NF_INET_LOCAL_OUT    = 0x3
+	NF_INET_POST_ROUTING = 0x4
+	NF_INET_NUMHOOKS     = 0x5
+)
+
+const (
+	NF_NETDEV_INGRESS  = 0x0
+	NF_NETDEV_NUMHOOKS = 0x1
+)
+
+const (
+	NFPROTO_UNSPEC   = 0x0
+	NFPROTO_INET     = 0x1
+	NFPROTO_IPV4     = 0x2
+	NFPROTO_ARP      = 0x3
+	NFPROTO_NETDEV   = 0x5
+	NFPROTO_BRIDGE   = 0x7
+	NFPROTO_IPV6     = 0xa
+	NFPROTO_DECNET   = 0xc
+	NFPROTO_NUMPROTO = 0xd
+)
+
+type Nfgenmsg struct {
+	Nfgen_family uint8
+	Version      uint8
+	Res_id       uint16
+}
+
+const (
+	NFNL_BATCH_UNSPEC = 0x0
+	NFNL_BATCH_GENID  = 0x1
+)
+
+const (
+	NFT_REG_VERDICT                   = 0x0
+	NFT_REG_1                         = 0x1
+	NFT_REG_2                         = 0x2
+	NFT_REG_3                         = 0x3
+	NFT_REG_4                         = 0x4
+	NFT_REG32_00                      = 0x8
+	NFT_REG32_01                      = 0x9
+	NFT_REG32_02                      = 0xa
+	NFT_REG32_03                      = 0xb
+	NFT_REG32_04                      = 0xc
+	NFT_REG32_05                      = 0xd
+	NFT_REG32_06                      = 0xe
+	NFT_REG32_07                      = 0xf
+	NFT_REG32_08                      = 0x10
+	NFT_REG32_09                      = 0x11
+	NFT_REG32_10                      = 0x12
+	NFT_REG32_11                      = 0x13
+	NFT_REG32_12                      = 0x14
+	NFT_REG32_13                      = 0x15
+	NFT_REG32_14                      = 0x16
+	NFT_REG32_15                      = 0x17
+	NFT_CONTINUE                      = -0x1
+	NFT_BREAK                         = -0x2
+	NFT_JUMP                          = -0x3
+	NFT_GOTO                          = -0x4
+	NFT_RETURN                        = -0x5
+	NFT_MSG_NEWTABLE                  = 0x0
+	NFT_MSG_GETTABLE                  = 0x1
+	NFT_MSG_DELTABLE                  = 0x2
+	NFT_MSG_NEWCHAIN                  = 0x3
+	NFT_MSG_GETCHAIN                  = 0x4
+	NFT_MSG_DELCHAIN                  = 0x5
+	NFT_MSG_NEWRULE                   = 0x6
+	NFT_MSG_GETRULE                   = 0x7
+	NFT_MSG_DELRULE                   = 0x8
+	NFT_MSG_NEWSET                    = 0x9
+	NFT_MSG_GETSET                    = 0xa
+	NFT_MSG_DELSET                    = 0xb
+	NFT_MSG_NEWSETELEM                = 0xc
+	NFT_MSG_GETSETELEM                = 0xd
+	NFT_MSG_DELSETELEM                = 0xe
+	NFT_MSG_NEWGEN                    = 0xf
+	NFT_MSG_GETGEN                    = 0x10
+	NFT_MSG_TRACE                     = 0x11
+	NFT_MSG_NEWOBJ                    = 0x12
+	NFT_MSG_GETOBJ                    = 0x13
+	NFT_MSG_DELOBJ                    = 0x14
+	NFT_MSG_GETOBJ_RESET              = 0x15
+	NFT_MSG_MAX                       = 0x19
+	NFTA_LIST_UNPEC                   = 0x0
+	NFTA_LIST_ELEM                    = 0x1
+	NFTA_HOOK_UNSPEC                  = 0x0
+	NFTA_HOOK_HOOKNUM                 = 0x1
+	NFTA_HOOK_PRIORITY                = 0x2
+	NFTA_HOOK_DEV                     = 0x3
+	NFT_TABLE_F_DORMANT               = 0x1
+	NFTA_TABLE_UNSPEC                 = 0x0
+	NFTA_TABLE_NAME                   = 0x1
+	NFTA_TABLE_FLAGS                  = 0x2
+	NFTA_TABLE_USE                    = 0x3
+	NFTA_CHAIN_UNSPEC                 = 0x0
+	NFTA_CHAIN_TABLE                  = 0x1
+	NFTA_CHAIN_HANDLE                 = 0x2
+	NFTA_CHAIN_NAME                   = 0x3
+	NFTA_CHAIN_HOOK                   = 0x4
+	NFTA_CHAIN_POLICY                 = 0x5
+	NFTA_CHAIN_USE                    = 0x6
+	NFTA_CHAIN_TYPE                   = 0x7
+	NFTA_CHAIN_COUNTERS               = 0x8
+	NFTA_CHAIN_PAD                    = 0x9
+	NFTA_RULE_UNSPEC                  = 0x0
+	NFTA_RULE_TABLE                   = 0x1
+	NFTA_RULE_CHAIN                   = 0x2
+	NFTA_RULE_HANDLE                  = 0x3
+	NFTA_RULE_EXPRESSIONS             = 0x4
+	NFTA_RULE_COMPAT                  = 0x5
+	NFTA_RULE_POSITION                = 0x6
+	NFTA_RULE_USERDATA                = 0x7
+	NFTA_RULE_PAD                     = 0x8
+	NFTA_RULE_ID                      = 0x9
+	NFT_RULE_COMPAT_F_INV             = 0x2
+	NFT_RULE_COMPAT_F_MASK            = 0x2
+	NFTA_RULE_COMPAT_UNSPEC           = 0x0
+	NFTA_RULE_COMPAT_PROTO            = 0x1
+	NFTA_RULE_COMPAT_FLAGS            = 0x2
+	NFT_SET_ANONYMOUS                 = 0x1
+	NFT_SET_CONSTANT                  = 0x2
+	NFT_SET_INTERVAL                  = 0x4
+	NFT_SET_MAP                       = 0x8
+	NFT_SET_TIMEOUT                   = 0x10
+	NFT_SET_EVAL                      = 0x20
+	NFT_SET_OBJECT                    = 0x40
+	NFT_SET_POL_PERFORMANCE           = 0x0
+	NFT_SET_POL_MEMORY                = 0x1
+	NFTA_SET_DESC_UNSPEC              = 0x0
+	NFTA_SET_DESC_SIZE                = 0x1
+	NFTA_SET_UNSPEC                   = 0x0
+	NFTA_SET_TABLE                    = 0x1
+	NFTA_SET_NAME                     = 0x2
+	NFTA_SET_FLAGS                    = 0x3
+	NFTA_SET_KEY_TYPE                 = 0x4
+	NFTA_SET_KEY_LEN                  = 0x5
+	NFTA_SET_DATA_TYPE                = 0x6
+	NFTA_SET_DATA_LEN                 = 0x7
+	NFTA_SET_POLICY                   = 0x8
+	NFTA_SET_DESC                     = 0x9
+	NFTA_SET_ID                       = 0xa
+	NFTA_SET_TIMEOUT                  = 0xb
+	NFTA_SET_GC_INTERVAL              = 0xc
+	NFTA_SET_USERDATA                 = 0xd
+	NFTA_SET_PAD                      = 0xe
+	NFTA_SET_OBJ_TYPE                 = 0xf
+	NFT_SET_ELEM_INTERVAL_END         = 0x1
+	NFTA_SET_ELEM_UNSPEC              = 0x0
+	NFTA_SET_ELEM_KEY                 = 0x1
+	NFTA_SET_ELEM_DATA                = 0x2
+	NFTA_SET_ELEM_FLAGS               = 0x3
+	NFTA_SET_ELEM_TIMEOUT             = 0x4
+	NFTA_SET_ELEM_EXPIRATION          = 0x5
+	NFTA_SET_ELEM_USERDATA            = 0x6
+	NFTA_SET_ELEM_EXPR                = 0x7
+	NFTA_SET_ELEM_PAD                 = 0x8
+	NFTA_SET_ELEM_OBJREF              = 0x9
+	NFTA_SET_ELEM_LIST_UNSPEC         = 0x0
+	NFTA_SET_ELEM_LIST_TABLE          = 0x1
+	NFTA_SET_ELEM_LIST_SET            = 0x2
+	NFTA_SET_ELEM_LIST_ELEMENTS       = 0x3
+	NFTA_SET_ELEM_LIST_SET_ID         = 0x4
+	NFT_DATA_VALUE                    = 0x0
+	NFT_DATA_VERDICT                  = 0xffffff00
+	NFTA_DATA_UNSPEC                  = 0x0
+	NFTA_DATA_VALUE                   = 0x1
+	NFTA_DATA_VERDICT                 = 0x2
+	NFTA_VERDICT_UNSPEC               = 0x0
+	NFTA_VERDICT_CODE                 = 0x1
+	NFTA_VERDICT_CHAIN                = 0x2
+	NFTA_EXPR_UNSPEC                  = 0x0
+	NFTA_EXPR_NAME                    = 0x1
+	NFTA_EXPR_DATA                    = 0x2
+	NFTA_IMMEDIATE_UNSPEC             = 0x0
+	NFTA_IMMEDIATE_DREG               = 0x1
+	NFTA_IMMEDIATE_DATA               = 0x2
+	NFTA_BITWISE_UNSPEC               = 0x0
+	NFTA_BITWISE_SREG                 = 0x1
+	NFTA_BITWISE_DREG                 = 0x2
+	NFTA_BITWISE_LEN                  = 0x3
+	NFTA_BITWISE_MASK                 = 0x4
+	NFTA_BITWISE_XOR                  = 0x5
+	NFT_BYTEORDER_NTOH                = 0x0
+	NFT_BYTEORDER_HTON                = 0x1
+	NFTA_BYTEORDER_UNSPEC             = 0x0
+	NFTA_BYTEORDER_SREG               = 0x1
+	NFTA_BYTEORDER_DREG               = 0x2
+	NFTA_BYTEORDER_OP                 = 0x3
+	NFTA_BYTEORDER_LEN                = 0x4
+	NFTA_BYTEORDER_SIZE               = 0x5
+	NFT_CMP_EQ                        = 0x0
+	NFT_CMP_NEQ                       = 0x1
+	NFT_CMP_LT                        = 0x2
+	NFT_CMP_LTE                       = 0x3
+	NFT_CMP_GT                        = 0x4
+	NFT_CMP_GTE                       = 0x5
+	NFTA_CMP_UNSPEC                   = 0x0
+	NFTA_CMP_SREG                     = 0x1
+	NFTA_CMP_OP                       = 0x2
+	NFTA_CMP_DATA                     = 0x3
+	NFT_RANGE_EQ                      = 0x0
+	NFT_RANGE_NEQ                     = 0x1
+	NFTA_RANGE_UNSPEC                 = 0x0
+	NFTA_RANGE_SREG                   = 0x1
+	NFTA_RANGE_OP                     = 0x2
+	NFTA_RANGE_FROM_DATA              = 0x3
+	NFTA_RANGE_TO_DATA                = 0x4
+	NFT_LOOKUP_F_INV                  = 0x1
+	NFTA_LOOKUP_UNSPEC                = 0x0
+	NFTA_LOOKUP_SET                   = 0x1
+	NFTA_LOOKUP_SREG                  = 0x2
+	NFTA_LOOKUP_DREG                  = 0x3
+	NFTA_LOOKUP_SET_ID                = 0x4
+	NFTA_LOOKUP_FLAGS                 = 0x5
+	NFT_DYNSET_OP_ADD                 = 0x0
+	NFT_DYNSET_OP_UPDATE              = 0x1
+	NFT_DYNSET_F_INV                  = 0x1
+	NFTA_DYNSET_UNSPEC                = 0x0
+	NFTA_DYNSET_SET_NAME              = 0x1
+	NFTA_DYNSET_SET_ID                = 0x2
+	NFTA_DYNSET_OP                    = 0x3
+	NFTA_DYNSET_SREG_KEY              = 0x4
+	NFTA_DYNSET_SREG_DATA             = 0x5
+	NFTA_DYNSET_TIMEOUT               = 0x6
+	NFTA_DYNSET_EXPR                  = 0x7
+	NFTA_DYNSET_PAD                   = 0x8
+	NFTA_DYNSET_FLAGS                 = 0x9
+	NFT_PAYLOAD_LL_HEADER             = 0x0
+	NFT_PAYLOAD_NETWORK_HEADER        = 0x1
+	NFT_PAYLOAD_TRANSPORT_HEADER      = 0x2
+	NFT_PAYLOAD_CSUM_NONE             = 0x0
+	NFT_PAYLOAD_CSUM_INET             = 0x1
+	NFT_PAYLOAD_L4CSUM_PSEUDOHDR      = 0x1
+	NFTA_PAYLOAD_UNSPEC               = 0x0
+	NFTA_PAYLOAD_DREG                 = 0x1
+	NFTA_PAYLOAD_BASE                 = 0x2
+	NFTA_PAYLOAD_OFFSET               = 0x3
+	NFTA_PAYLOAD_LEN                  = 0x4
+	NFTA_PAYLOAD_SREG                 = 0x5
+	NFTA_PAYLOAD_CSUM_TYPE            = 0x6
+	NFTA_PAYLOAD_CSUM_OFFSET          = 0x7
+	NFTA_PAYLOAD_CSUM_FLAGS           = 0x8
+	NFT_EXTHDR_F_PRESENT              = 0x1
+	NFT_EXTHDR_OP_IPV6                = 0x0
+	NFT_EXTHDR_OP_TCPOPT              = 0x1
+	NFTA_EXTHDR_UNSPEC                = 0x0
+	NFTA_EXTHDR_DREG                  = 0x1
+	NFTA_EXTHDR_TYPE                  = 0x2
+	NFTA_EXTHDR_OFFSET                = 0x3
+	NFTA_EXTHDR_LEN                   = 0x4
+	NFTA_EXTHDR_FLAGS                 = 0x5
+	NFTA_EXTHDR_OP                    = 0x6
+	NFTA_EXTHDR_SREG                  = 0x7
+	NFT_META_LEN                      = 0x0
+	NFT_META_PROTOCOL                 = 0x1
+	NFT_META_PRIORITY                 = 0x2
+	NFT_META_MARK                     = 0x3
+	NFT_META_IIF                      = 0x4
+	NFT_META_OIF                      = 0x5
+	NFT_META_IIFNAME                  = 0x6
+	NFT_META_OIFNAME                  = 0x7
+	NFT_META_IIFTYPE                  = 0x8
+	NFT_META_OIFTYPE                  = 0x9
+	NFT_META_SKUID                    = 0xa
+	NFT_META_SKGID                    = 0xb
+	NFT_META_NFTRACE                  = 0xc
+	NFT_META_RTCLASSID                = 0xd
+	NFT_META_SECMARK                  = 0xe
+	NFT_META_NFPROTO                  = 0xf
+	NFT_META_L4PROTO                  = 0x10
+	NFT_META_BRI_IIFNAME              = 0x11
+	NFT_META_BRI_OIFNAME              = 0x12
+	NFT_META_PKTTYPE                  = 0x13
+	NFT_META_CPU                      = 0x14
+	NFT_META_IIFGROUP                 = 0x15
+	NFT_META_OIFGROUP                 = 0x16
+	NFT_META_CGROUP                   = 0x17
+	NFT_META_PRANDOM                  = 0x18
+	NFT_RT_CLASSID                    = 0x0
+	NFT_RT_NEXTHOP4                   = 0x1
+	NFT_RT_NEXTHOP6                   = 0x2
+	NFT_RT_TCPMSS                     = 0x3
+	NFT_HASH_JENKINS                  = 0x0
+	NFT_HASH_SYM                      = 0x1
+	NFTA_HASH_UNSPEC                  = 0x0
+	NFTA_HASH_SREG                    = 0x1
+	NFTA_HASH_DREG                    = 0x2
+	NFTA_HASH_LEN                     = 0x3
+	NFTA_HASH_MODULUS                 = 0x4
+	NFTA_HASH_SEED                    = 0x5
+	NFTA_HASH_OFFSET                  = 0x6
+	NFTA_HASH_TYPE                    = 0x7
+	NFTA_META_UNSPEC                  = 0x0
+	NFTA_META_DREG                    = 0x1
+	NFTA_META_KEY                     = 0x2
+	NFTA_META_SREG                    = 0x3
+	NFTA_RT_UNSPEC                    = 0x0
+	NFTA_RT_DREG                      = 0x1
+	NFTA_RT_KEY                       = 0x2
+	NFT_CT_STATE                      = 0x0
+	NFT_CT_DIRECTION                  = 0x1
+	NFT_CT_STATUS                     = 0x2
+	NFT_CT_MARK                       = 0x3
+	NFT_CT_SECMARK                    = 0x4
+	NFT_CT_EXPIRATION                 = 0x5
+	NFT_CT_HELPER                     = 0x6
+	NFT_CT_L3PROTOCOL                 = 0x7
+	NFT_CT_SRC                        = 0x8
+	NFT_CT_DST                        = 0x9
+	NFT_CT_PROTOCOL                   = 0xa
+	NFT_CT_PROTO_SRC                  = 0xb
+	NFT_CT_PROTO_DST                  = 0xc
+	NFT_CT_LABELS                     = 0xd
+	NFT_CT_PKTS                       = 0xe
+	NFT_CT_BYTES                      = 0xf
+	NFT_CT_AVGPKT                     = 0x10
+	NFT_CT_ZONE                       = 0x11
+	NFT_CT_EVENTMASK                  = 0x12
+	NFTA_CT_UNSPEC                    = 0x0
+	NFTA_CT_DREG                      = 0x1
+	NFTA_CT_KEY                       = 0x2
+	NFTA_CT_DIRECTION                 = 0x3
+	NFTA_CT_SREG                      = 0x4
+	NFT_LIMIT_PKTS                    = 0x0
+	NFT_LIMIT_PKT_BYTES               = 0x1
+	NFT_LIMIT_F_INV                   = 0x1
+	NFTA_LIMIT_UNSPEC                 = 0x0
+	NFTA_LIMIT_RATE                   = 0x1
+	NFTA_LIMIT_UNIT                   = 0x2
+	NFTA_LIMIT_BURST                  = 0x3
+	NFTA_LIMIT_TYPE                   = 0x4
+	NFTA_LIMIT_FLAGS                  = 0x5
+	NFTA_LIMIT_PAD                    = 0x6
+	NFTA_COUNTER_UNSPEC               = 0x0
+	NFTA_COUNTER_BYTES                = 0x1
+	NFTA_COUNTER_PACKETS              = 0x2
+	NFTA_COUNTER_PAD                  = 0x3
+	NFTA_LOG_UNSPEC                   = 0x0
+	NFTA_LOG_GROUP                    = 0x1
+	NFTA_LOG_PREFIX                   = 0x2
+	NFTA_LOG_SNAPLEN                  = 0x3
+	NFTA_LOG_QTHRESHOLD               = 0x4
+	NFTA_LOG_LEVEL                    = 0x5
+	NFTA_LOG_FLAGS                    = 0x6
+	NFTA_QUEUE_UNSPEC                 = 0x0
+	NFTA_QUEUE_NUM                    = 0x1
+	NFTA_QUEUE_TOTAL                  = 0x2
+	NFTA_QUEUE_FLAGS                  = 0x3
+	NFTA_QUEUE_SREG_QNUM              = 0x4
+	NFT_QUOTA_F_INV                   = 0x1
+	NFT_QUOTA_F_DEPLETED              = 0x2
+	NFTA_QUOTA_UNSPEC                 = 0x0
+	NFTA_QUOTA_BYTES                  = 0x1
+	NFTA_QUOTA_FLAGS                  = 0x2
+	NFTA_QUOTA_PAD                    = 0x3
+	NFTA_QUOTA_CONSUMED               = 0x4
+	NFT_REJECT_ICMP_UNREACH           = 0x0
+	NFT_REJECT_TCP_RST                = 0x1
+	NFT_REJECT_ICMPX_UNREACH          = 0x2
+	NFT_REJECT_ICMPX_NO_ROUTE         = 0x0
+	NFT_REJECT_ICMPX_PORT_UNREACH     = 0x1
+	NFT_REJECT_ICMPX_HOST_UNREACH     = 0x2
+	NFT_REJECT_ICMPX_ADMIN_PROHIBITED = 0x3
+	NFTA_REJECT_UNSPEC                = 0x0
+	NFTA_REJECT_TYPE                  = 0x1
+	NFTA_REJECT_ICMP_CODE             = 0x2
+	NFT_NAT_SNAT                      = 0x0
+	NFT_NAT_DNAT                      = 0x1
+	NFTA_NAT_UNSPEC                   = 0x0
+	NFTA_NAT_TYPE                     = 0x1
+	NFTA_NAT_FAMILY                   = 0x2
+	NFTA_NAT_REG_ADDR_MIN             = 0x3
+	NFTA_NAT_REG_ADDR_MAX             = 0x4
+	NFTA_NAT_REG_PROTO_MIN            = 0x5
+	NFTA_NAT_REG_PROTO_MAX            = 0x6
+	NFTA_NAT_FLAGS                    = 0x7
+	NFTA_MASQ_UNSPEC                  = 0x0
+	NFTA_MASQ_FLAGS                   = 0x1
+	NFTA_MASQ_REG_PROTO_MIN           = 0x2
+	NFTA_MASQ_REG_PROTO_MAX           = 0x3
+	NFTA_REDIR_UNSPEC                 = 0x0
+	NFTA_REDIR_REG_PROTO_MIN          = 0x1
+	NFTA_REDIR_REG_PROTO_MAX          = 0x2
+	NFTA_REDIR_FLAGS                  = 0x3
+	NFTA_DUP_UNSPEC                   = 0x0
+	NFTA_DUP_SREG_ADDR                = 0x1
+	NFTA_DUP_SREG_DEV                 = 0x2
+	NFTA_FWD_UNSPEC                   = 0x0
+	NFTA_FWD_SREG_DEV                 = 0x1
+	NFTA_OBJREF_UNSPEC                = 0x0
+	NFTA_OBJREF_IMM_TYPE              = 0x1
+	NFTA_OBJREF_IMM_NAME              = 0x2
+	NFTA_OBJREF_SET_SREG              = 0x3
+	NFTA_OBJREF_SET_NAME              = 0x4
+	NFTA_OBJREF_SET_ID                = 0x5
+	NFTA_GEN_UNSPEC                   = 0x0
+	NFTA_GEN_ID                       = 0x1
+	NFTA_GEN_PROC_PID                 = 0x2
+	NFTA_GEN_PROC_NAME                = 0x3
+	NFTA_FIB_UNSPEC                   = 0x0
+	NFTA_FIB_DREG                     = 0x1
+	NFTA_FIB_RESULT                   = 0x2
+	NFTA_FIB_FLAGS                    = 0x3
+	NFT_FIB_RESULT_UNSPEC             = 0x0
+	NFT_FIB_RESULT_OIF                = 0x1
+	NFT_FIB_RESULT_OIFNAME            = 0x2
+	NFT_FIB_RESULT_ADDRTYPE           = 0x3
+	NFTA_FIB_F_SADDR                  = 0x1
+	NFTA_FIB_F_DADDR                  = 0x2
+	NFTA_FIB_F_MARK                   = 0x4
+	NFTA_FIB_F_IIF                    = 0x8
+	NFTA_FIB_F_OIF                    = 0x10
+	NFTA_FIB_F_PRESENT                = 0x20
+	NFTA_CT_HELPER_UNSPEC             = 0x0
+	NFTA_CT_HELPER_NAME               = 0x1
+	NFTA_CT_HELPER_L3PROTO            = 0x2
+	NFTA_CT_HELPER_L4PROTO            = 0x3
+	NFTA_OBJ_UNSPEC                   = 0x0
+	NFTA_OBJ_TABLE                    = 0x1
+	NFTA_OBJ_NAME                     = 0x2
+	NFTA_OBJ_TYPE                     = 0x3
+	NFTA_OBJ_DATA                     = 0x4
+	NFTA_OBJ_USE                      = 0x5
+	NFTA_TRACE_UNSPEC                 = 0x0
+	NFTA_TRACE_TABLE                  = 0x1
+	NFTA_TRACE_CHAIN                  = 0x2
+	NFTA_TRACE_RULE_HANDLE            = 0x3
+	NFTA_TRACE_TYPE                   = 0x4
+	NFTA_TRACE_VERDICT                = 0x5
+	NFTA_TRACE_ID                     = 0x6
+	NFTA_TRACE_LL_HEADER              = 0x7
+	NFTA_TRACE_NETWORK_HEADER         = 0x8
+	NFTA_TRACE_TRANSPORT_HEADER       = 0x9
+	NFTA_TRACE_IIF                    = 0xa
+	NFTA_TRACE_IIFTYPE                = 0xb
+	NFTA_TRACE_OIF                    = 0xc
+	NFTA_TRACE_OIFTYPE                = 0xd
+	NFTA_TRACE_MARK                   = 0xe
+	NFTA_TRACE_NFPROTO                = 0xf
+	NFTA_TRACE_POLICY                 = 0x10
+	NFTA_TRACE_PAD                    = 0x11
+	NFT_TRACETYPE_UNSPEC              = 0x0
+	NFT_TRACETYPE_POLICY              = 0x1
+	NFT_TRACETYPE_RETURN              = 0x2
+	NFT_TRACETYPE_RULE                = 0x3
+	NFTA_NG_UNSPEC                    = 0x0
+	NFTA_NG_DREG                      = 0x1
+	NFTA_NG_MODULUS                   = 0x2
+	NFTA_NG_TYPE                      = 0x3
+	NFTA_NG_OFFSET                    = 0x4
+	NFT_NG_INCREMENTAL                = 0x0
+	NFT_NG_RANDOM                     = 0x1
+)
diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
index d53141085ac38a3dd4944bceabef12cea48adf12..5a9c8184859b536098bce7443549ea6fe7618454 100644
--- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
+++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go
@@ -74,30 +74,30 @@ const (
 )
 
 type Stat_t struct {
-	Mode           uint32
-	Dev            int32
-	Ino            uint64
-	Nlink          uint32
-	Uid            uint32
-	Gid            uint32
-	Rdev           int32
-	Atim           Timespec
-	Mtim           Timespec
-	Ctim           Timespec
-	Size           int64
-	Blocks         int64
-	Blksize        uint32
-	Flags          uint32
-	Gen            uint32
-	Pad_cgo_0      [4]byte
-	X__st_birthtim Timespec
+	Mode    uint32
+	Dev     int32
+	Ino     uint64
+	Nlink   uint32
+	Uid     uint32
+	Gid     uint32
+	Rdev    int32
+	Atim    Timespec
+	Mtim    Timespec
+	Ctim    Timespec
+	Size    int64
+	Blocks  int64
+	Blksize int32
+	Flags   uint32
+	Gen     uint32
+	_       [4]byte
+	_       Timespec
 }
 
 type Statfs_t struct {
 	F_flags       uint32
 	F_bsize       uint32
 	F_iosize      uint32
-	Pad_cgo_0     [4]byte
+	_             [4]byte
 	F_blocks      uint64
 	F_bfree       uint64
 	F_bavail      int64
@@ -116,7 +116,7 @@ type Statfs_t struct {
 	F_mntonname   [90]int8
 	F_mntfromname [90]int8
 	F_mntfromspec [90]int8
-	Pad_cgo_1     [2]byte
+	_             [2]byte
 	Mount_info    [160]byte
 }
 
@@ -129,13 +129,13 @@ type Flock_t struct {
 }
 
 type Dirent struct {
-	Fileno       uint64
-	Off          int64
-	Reclen       uint16
-	Type         uint8
-	Namlen       uint8
-	X__d_padding [4]uint8
-	Name         [256]int8
+	Fileno uint64
+	Off    int64
+	Reclen uint16
+	Type   uint8
+	Namlen uint8
+	_      [4]uint8
+	Name   [256]int8
 }
 
 type Fsid struct {
@@ -216,10 +216,10 @@ type IPv6Mreq struct {
 type Msghdr struct {
 	Name       *byte
 	Namelen    uint32
-	Pad_cgo_0  [4]byte
+	_          [4]byte
 	Iov        *Iovec
 	Iovlen     uint32
-	Pad_cgo_1  [4]byte
+	_          [4]byte
 	Control    *byte
 	Controllen uint32
 	Flags      int32
@@ -281,8 +281,8 @@ type FdSet struct {
 }
 
 const (
-	SizeofIfMsghdr         = 0xf8
-	SizeofIfData           = 0xe0
+	SizeofIfMsghdr         = 0xa8
+	SizeofIfData           = 0x90
 	SizeofIfaMsghdr        = 0x18
 	SizeofIfAnnounceMsghdr = 0x1a
 	SizeofRtMsghdr         = 0x60
@@ -311,7 +311,7 @@ type IfData struct {
 	Link_state   uint8
 	Mtu          uint32
 	Metric       uint32
-	Pad          uint32
+	Rdomain      uint32
 	Baudrate     uint64
 	Ipackets     uint64
 	Ierrors      uint64
@@ -323,12 +323,11 @@ type IfData struct {
 	Imcasts      uint64
 	Omcasts      uint64
 	Iqdrops      uint64
+	Oqdrops      uint64
 	Noproto      uint64
 	Capabilities uint32
-	Pad_cgo_0    [4]byte
+	_            [4]byte
 	Lastchange   Timeval
-	Mclpool      [7]Mclpool
-	Pad_cgo_1    [4]byte
 }
 
 type IfaMsghdr struct {
@@ -389,13 +388,7 @@ type RtMetrics struct {
 	Pad      uint32
 }
 
-type Mclpool struct {
-	Grown int32
-	Alive uint16
-	Hwm   uint16
-	Cwm   uint16
-	Lwm   uint16
-}
+type Mclpool struct{}
 
 const (
 	SizeofBpfVersion = 0x4
@@ -416,9 +409,9 @@ type BpfStat struct {
 }
 
 type BpfProgram struct {
-	Len       uint32
-	Pad_cgo_0 [4]byte
-	Insns     *BpfInsn
+	Len   uint32
+	_     [4]byte
+	Insns *BpfInsn
 }
 
 type BpfInsn struct {
@@ -429,11 +422,11 @@ type BpfInsn struct {
 }
 
 type BpfHdr struct {
-	Tstamp    BpfTimeval
-	Caplen    uint32
-	Datalen   uint32
-	Hdrlen    uint16
-	Pad_cgo_0 [2]byte
+	Tstamp  BpfTimeval
+	Caplen  uint32
+	Datalen uint32
+	Hdrlen  uint16
+	_       [2]byte
 }
 
 type BpfTimeval struct {
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_386.s b/vendor/golang.org/x/sys/windows/asm_windows_386.s
index 1c20dd2f897d021e9033f9a2d2da6bd9d1a97dca..21d994d318a305fcce8116dfe1d8194b16d2fa28 100644
--- a/vendor/golang.org/x/sys/windows/asm_windows_386.s
+++ b/vendor/golang.org/x/sys/windows/asm_windows_386.s
@@ -6,8 +6,8 @@
 // System calls for 386, Windows are implemented in runtime/syscall_windows.goc
 //
 
-TEXT ·getprocaddress(SB), 7, $0-8
+TEXT ·getprocaddress(SB), 7, $0-16
 	JMP	syscall·getprocaddress(SB)
 
-TEXT ·loadlibrary(SB), 7, $0-4
+TEXT ·loadlibrary(SB), 7, $0-12
 	JMP	syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s
index 4d025ab556dbe2c3f7e11924023fd0b3a8b35676..5bfdf797414cedab6e3764e9e4f7abcdb41d756f 100644
--- a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s
+++ b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s
@@ -9,5 +9,5 @@
 TEXT ·getprocaddress(SB), 7, $0-32
 	JMP	syscall·getprocaddress(SB)
 
-TEXT ·loadlibrary(SB), 7, $0-8
+TEXT ·loadlibrary(SB), 7, $0-24
 	JMP	syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go
index a500dd7dfcf0a164eded614c9a0d0dba81223fad..24aa90bbbe1dd2b0a7b67e24f16783dcc2053f5f 100644
--- a/vendor/golang.org/x/sys/windows/service.go
+++ b/vendor/golang.org/x/sys/windows/service.go
@@ -162,3 +162,4 @@ type ENUM_SERVICE_STATUS_PROCESS struct {
 //sys	ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W
 //sys	QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W
 //sys	EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW
+//sys   QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx
diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
index c7b3b15eadb9211c1c1d9067293e4d14426c6cf0..318c61634e1d11ec75eae9b7af3d15a024a98bd7 100644
--- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go
+++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
@@ -65,6 +65,7 @@ var (
 	procChangeServiceConfig2W              = modadvapi32.NewProc("ChangeServiceConfig2W")
 	procQueryServiceConfig2W               = modadvapi32.NewProc("QueryServiceConfig2W")
 	procEnumServicesStatusExW              = modadvapi32.NewProc("EnumServicesStatusExW")
+	procQueryServiceStatusEx               = modadvapi32.NewProc("QueryServiceStatusEx")
 	procGetLastError                       = modkernel32.NewProc("GetLastError")
 	procLoadLibraryW                       = modkernel32.NewProc("LoadLibraryW")
 	procLoadLibraryExW                     = modkernel32.NewProc("LoadLibraryExW")
@@ -472,6 +473,18 @@ func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serv
 	return
 }
 
+func QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) {
+	r1, _, e1 := syscall.Syscall6(procQueryServiceStatusEx.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0)
+	if r1 == 0 {
+		if e1 != 0 {
+			err = errnoErr(e1)
+		} else {
+			err = syscall.EINVAL
+		}
+	}
+	return
+}
+
 func GetLastError() (lasterr error) {
 	r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)
 	if r0 != 0 {