diff --git a/.travis.yml b/.travis.yml index ada66af2..a35ac92c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,9 +6,7 @@ services: - docker go: - - 1.7.x - 1.8.x - - tip go_import_path: k8s.io/frakti diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 56df3615..e5537b4d 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -1305,1357 +1305,1357 @@ }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/announced", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/apimachinery/registered", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1alpha1", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/unstructured", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/openapi", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "2de00c78cb6d6127fb51b9531c1b3def1cbcac8c" + "Rev": "cff8db64dd5b6fb0166dc2cf36e39c7ff4fe48c8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticator", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/serviceaccount", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/user", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/apiserver/pkg/features", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/apiserver/pkg/server/httplog", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/apiserver/pkg/util/feature", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flag", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/apiserver/pkg/util/wsstream", - "Rev": "b7b2113881bd14871fbfc68bdaf8fb79ffcd3841" + "Rev": "dd002fed291506760ba79a43ca21c9a5086a6a5d" }, { "ImportPath": "k8s.io/client-go/discovery", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/api", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/api/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/api/v1/ref", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/admissionregistration", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/admissionregistration/v1alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/apps", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/apps/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/authentication", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/authentication/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/authentication/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/authorization", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/authorization/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/authorization/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/autoscaling", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/autoscaling/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/autoscaling/v2alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/batch", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/batch/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/batch/v2alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/certificates", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/certificates/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/extensions", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/extensions/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/networking", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/networking/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/policy", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/policy/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/rbac", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/rbac/v1alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/rbac/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/settings", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/settings/v1alpha1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/storage", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/storage/v1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/apis/storage/v1beta1", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/util", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/util/parsers", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/pkg/version", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/rest", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/rest/watch", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/tools/cache", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/tools/metrics", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/tools/record", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/tools/remotecommand", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/transport", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/util/cert", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/util/exec", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/util/flowcontrol", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/util/integer", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/client-go/util/workqueue", - "Comment": "v2.0.0-alpha.0-312-g4b8e185", - "Rev": "4b8e1857a8b8a786469dcf0e7925c54cbd2a81d9" + "Comment": "v2.0.0-alpha.0-370-g1741b65", + "Rev": "1741b65fcb294d2592bbef21ce7a82aa824fbed8" }, { "ImportPath": "k8s.io/kubernetes/cmd/kubelet/app/options", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/helper", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/service", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/util", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/helper", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/helper/qos", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/pod", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/ref", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/v1/resource", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/api/validation", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/admissionregistration/v1alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/apps/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authentication/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/authorization/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/autoscaling/v2alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/batch/v2alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/certificates/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/componentconfig/v1alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/extensions/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/networking", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/networking/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/policy/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/rbac/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/settings", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/settings/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/settings/v1alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/install", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/apis/storage/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/capabilities", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/scheme", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/admissionregistration/v1alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/apps/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/authentication/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/authentication/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/authorization/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/authorization/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/autoscaling/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/autoscaling/v2alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/batch/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/batch/v2alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/certificates/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/core/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/extensions/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/networking/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/policy/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/rbac/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/settings/v1alpha1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/typed/storage/v1beta1", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/leaderelection/resourcelock", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/client/retry", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/cloudprovider", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/controller", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/credentialprovider", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/features", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/cri", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cadvisor", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/cm/util", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/container", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/cm", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/errors", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/libdocker", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/dockershim/securitycontext", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/events", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/eviction/api", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/leaky", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/metrics", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/cni", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/hostport", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/network/kubenet", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/qos", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/remote", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/portforward", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/remotecommand", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/server/streaming", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/types", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/cache", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/format", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/kubelet/util/ioutils", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/master/ports", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/healthcheck", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/iptables", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/proxy/util", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/security/apparmor", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/securitycontext", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/serviceaccount", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/async", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/bandwidth", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/dbus", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/ebtables", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/exec", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/hash", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/interrupt", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/io", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/iptables", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/mount", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/net/sets", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/oom", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/parsers", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/procfs", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/sysctl", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/taints", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/term", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/util/version", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/pkg/volume/util", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" }, { "ImportPath": "k8s.io/kubernetes/third_party/forked/golang/expansion", - "Comment": "v1.8.0-alpha.0-592-g54f628a", - "Rev": "54f628ad79e17998c5384fdacb544dd964afe60d" + "Comment": "v1.8.0-alpha.0-642-g0a1b7d9", + "Rev": "0a1b7d94b441da381eb30c4890bb509771638f8c" } ] } diff --git a/pkg/hyper/container.go b/pkg/hyper/container.go index c0e284fa..3456b3a1 100644 --- a/pkg/hyper/container.go +++ b/pkg/hyper/container.go @@ -51,9 +51,11 @@ func (h *Runtime) CreateContainer(podSandboxID string, config *kubeapi.Container // buildUserContainer builds hyperd's UserContainer based kubelet ContainerConfig. func buildUserContainer(config *kubeapi.ContainerConfig, sandboxConfig *kubeapi.PodSandboxConfig) (*types.UserContainer, error) { - var privilege bool + privilege := false + readonlyRootfs := false if securityContext := config.GetLinux().GetSecurityContext(); securityContext != nil { privilege = securityContext.Privileged + readonlyRootfs = securityContext.ReadonlyRootfs } if privilege { @@ -74,6 +76,7 @@ func buildUserContainer(config *kubeapi.ContainerConfig, sandboxConfig *kubeapi. Entrypoint: config.Command, Labels: buildLabelsWithAnnotations(config.Labels, config.Annotations), LogPath: logPath, + ReadOnly: readonlyRootfs, } // make volumes diff --git a/pkg/hyper/types/types.pb.go b/pkg/hyper/types/types.pb.go index e4cec09c..21ac7dd6 100644 --- a/pkg/hyper/types/types.pb.go +++ b/pkg/hyper/types/types.pb.go @@ -2331,6 +2331,7 @@ type UserContainer struct { StopSignal string `protobuf:"bytes,17,opt,name=StopSignal,proto3" json:"StopSignal,omitempty"` Ulimits []*Ulimit `protobuf:"bytes,18,rep,name=ulimits" json:"ulimits,omitempty"` LogPath string `protobuf:"bytes,19,opt,name=logPath,proto3" json:"logPath,omitempty"` + ReadOnly bool `protobuf:"varint,20,opt,name=readOnly,proto3" json:"readOnly,omitempty"` } func (m *UserContainer) Reset() { *m = UserContainer{} } @@ -2464,6 +2465,13 @@ func (m *UserContainer) GetLogPath() string { return "" } +func (m *UserContainer) GetReadOnly() bool { + if m != nil { + return m.ReadOnly + } + return false +} + type UserResource struct { Vcpu int32 `protobuf:"varint,1,opt,name=vcpu,proto3" json:"vcpu,omitempty"` Memory int32 `protobuf:"varint,2,opt,name=memory,proto3" json:"memory,omitempty"` @@ -6115,333 +6123,334 @@ var _PublicAPI_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("types.proto", fileDescriptorTypes) } var fileDescriptorTypes = []byte{ - // 5242 bytes of a gzipped FileDescriptorProto + // 5250 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x3c, 0x4d, 0x6f, 0x1d, 0x47, - 0x72, 0x7a, 0x5f, 0x7c, 0x7c, 0xc5, 0x4f, 0xb5, 0x28, 0xe9, 0x89, 0xd6, 0x7a, 0xb5, 0xb3, 0xb1, - 0x25, 0xcb, 0x31, 0x6d, 0x6b, 0x1d, 0xdb, 0x2b, 0xc7, 0x58, 0xd3, 0xa4, 0xbc, 0x26, 0x22, 0xd9, - 0xf4, 0x50, 0x92, 0x61, 0x64, 0x81, 0xcd, 0xe8, 0x4d, 0xf3, 0x71, 0xcc, 0x79, 0x33, 0x93, 0x99, - 0x79, 0x94, 0xe8, 0x5b, 0x72, 0x32, 0x60, 0x04, 0x39, 0x2c, 0x10, 0x64, 0x73, 0x4c, 0x2e, 0x41, - 0xae, 0x39, 0x25, 0xc8, 0x25, 0x97, 0x9c, 0xf2, 0x47, 0x92, 0xbd, 0xe4, 0x92, 0x6b, 0x10, 0x54, - 0x75, 0x75, 0x4f, 0xf7, 0xbc, 0xe1, 0x87, 0x6c, 0xed, 0x81, 0xd0, 0x54, 0x75, 0x75, 0x77, 0x75, - 0x75, 0x75, 0x7d, 0x75, 0x3f, 0xc1, 0x42, 0x79, 0x9c, 0xc9, 0x62, 0x23, 0xcb, 0xd3, 0x32, 0x15, - 0x3d, 0x02, 0xbc, 0xdf, 0xb6, 0x60, 0x69, 0x2b, 0x4d, 0xca, 0x20, 0x4a, 0x64, 0xbe, 0x9b, 0xe6, - 0xa5, 0x10, 0xd0, 0x4d, 0x82, 0x89, 0x1c, 0xb6, 0x6e, 0xb4, 0x6e, 0x0d, 0x7c, 0xfa, 0x16, 0xeb, - 0x30, 0x7f, 0x90, 0x16, 0x25, 0xb6, 0x0f, 0xdb, 0x37, 0x5a, 0xb7, 0x7a, 0xbe, 0x81, 0xc5, 0x1f, - 0xc0, 0xd2, 0xc8, 0x1e, 0x60, 0xd8, 0x21, 0x02, 0x17, 0x89, 0x23, 0xd0, 0xbc, 0xa3, 0x34, 0x1e, - 0x76, 0x69, 0x64, 0x03, 0x8b, 0x2b, 0x30, 0x87, 0xa3, 0xed, 0xec, 0x0e, 0x7b, 0xd4, 0xc2, 0x90, - 0xf7, 0x3e, 0x2c, 0xdf, 0x4b, 0x8e, 0xa2, 0x3c, 0x4d, 0x26, 0x32, 0x29, 0x1f, 0x07, 0xb9, 0x58, - 0x85, 0x8e, 0x4c, 0x8e, 0x98, 0x35, 0xfc, 0x14, 0x6b, 0xd0, 0x3b, 0x0a, 0xe2, 0xa9, 0x24, 0xb6, - 0x06, 0xbe, 0x02, 0xbc, 0x3f, 0x85, 0x85, 0xc7, 0x69, 0x3c, 0x9d, 0xc8, 0x07, 0xe9, 0x34, 0x69, - 0x5e, 0xd2, 0x75, 0x18, 0x4c, 0xb0, 0x71, 0x37, 0x28, 0x0f, 0xb8, 0x73, 0x85, 0x40, 0x76, 0x73, - 0x19, 0x84, 0x9f, 0x27, 0xf1, 0x31, 0xad, 0x67, 0xde, 0x37, 0xb0, 0x77, 0x13, 0x96, 0xbe, 0x0c, - 0xa2, 0x32, 0x4a, 0xc6, 0x7b, 0x65, 0x50, 0x4e, 0x0b, 0xe4, 0x3f, 0x97, 0x41, 0x91, 0x26, 0x3c, - 0x01, 0x43, 0xde, 0x1b, 0xb0, 0xe4, 0x4f, 0x93, 0xa4, 0x22, 0xbc, 0x0e, 0x83, 0xa2, 0x0c, 0xf2, - 0x52, 0x86, 0x9b, 0x25, 0xd3, 0x56, 0x08, 0xef, 0x6f, 0x5b, 0x00, 0x0f, 0x65, 0x3e, 0x61, 0xe2, - 0x75, 0x98, 0x97, 0xcf, 0xa2, 0x72, 0x2b, 0x0d, 0x15, 0xe3, 0x3d, 0xdf, 0xc0, 0xd6, 0x8c, 0x6d, - 0x7b, 0x46, 0x31, 0x84, 0xfe, 0x44, 0x16, 0x45, 0x30, 0x96, 0xc4, 0xf5, 0xc0, 0xd7, 0xa0, 0x3b, - 0x75, 0xb7, 0x36, 0xb5, 0x78, 0x19, 0x60, 0x3f, 0x4a, 0xa2, 0xe2, 0x80, 0x9a, 0xd5, 0x2e, 0x58, - 0x18, 0xef, 0x7f, 0x5a, 0xb0, 0x62, 0xb4, 0x84, 0xf9, 0x6b, 0x12, 0xea, 0x0d, 0x58, 0x30, 0xdb, - 0xbe, 0xb3, 0xcd, 0xcc, 0xd9, 0x28, 0xdc, 0xaf, 0xec, 0x20, 0x28, 0x34, 0x7f, 0x0a, 0x10, 0x1b, - 0xd0, 0x7f, 0xaa, 0x44, 0x4a, 0xbc, 0x2d, 0xdc, 0x59, 0xdb, 0x50, 0xba, 0xea, 0x08, 0xda, 0xd7, - 0x44, 0x48, 0x9f, 0x2b, 0xc9, 0x12, 0xb3, 0x15, 0xbd, 0x23, 0x6f, 0x5f, 0x13, 0x89, 0xb7, 0x01, - 0x4a, 0x99, 0x4f, 0xa2, 0x24, 0x28, 0x65, 0x38, 0x9c, 0xa3, 0x2e, 0x17, 0xb9, 0x4b, 0x25, 0x72, - 0xdf, 0x22, 0xf2, 0xfe, 0xc1, 0x3e, 0x18, 0x3b, 0xc9, 0x7e, 0x2a, 0x36, 0x60, 0x60, 0x56, 0x42, - 0xab, 0x5e, 0xb8, 0xb3, 0xca, 0x63, 0x18, 0x42, 0xbf, 0x22, 0x41, 0x91, 0x8f, 0x72, 0x19, 0x28, - 0x91, 0xa3, 0x28, 0x3a, 0x7e, 0x85, 0x20, 0x41, 0xa4, 0xe1, 0xce, 0xb6, 0x11, 0x04, 0x02, 0x62, - 0x03, 0xe6, 0x0a, 0xe2, 0x85, 0xe5, 0x70, 0xa5, 0x3e, 0x01, 0x73, 0xca, 0x54, 0xde, 0x5f, 0x77, - 0x61, 0x60, 0xda, 0xbe, 0xff, 0x96, 0x44, 0x93, 0x4a, 0x65, 0x14, 0x80, 0xaa, 0x44, 0x1f, 0x3b, - 0xdb, 0xac, 0x2e, 0x1a, 0x14, 0xb7, 0x60, 0x85, 0x3e, 0x77, 0xa7, 0x71, 0xbc, 0x9b, 0xc6, 0xd1, - 0xe8, 0x98, 0x35, 0xa6, 0x8e, 0x46, 0xb5, 0x7a, 0x9a, 0xe6, 0x87, 0x51, 0x32, 0xde, 0x8e, 0x72, - 0x12, 0xfb, 0xc0, 0xb7, 0x30, 0xc8, 0xef, 0xb4, 0x90, 0xf9, 0xb0, 0xaf, 0xf8, 0xc5, 0x6f, 0x3c, - 0xe2, 0x65, 0x79, 0x3c, 0x9c, 0xa7, 0x43, 0x87, 0x9f, 0x78, 0x10, 0x46, 0xe9, 0x64, 0x12, 0x24, - 0x61, 0x31, 0x1c, 0xdc, 0xe8, 0xa0, 0xe9, 0xd0, 0x30, 0x8e, 0x10, 0xe4, 0xe3, 0x62, 0x08, 0x84, - 0xa7, 0x6f, 0x71, 0x1b, 0x25, 0x9b, 0x97, 0xc5, 0x70, 0xe1, 0x46, 0xc7, 0x52, 0x0d, 0xc7, 0xca, - 0xf9, 0x8a, 0x44, 0xdc, 0x54, 0x06, 0x65, 0x91, 0x28, 0x2f, 0x33, 0xa5, 0x6b, 0x74, 0x94, 0x9d, - 0x79, 0x17, 0x16, 0x8f, 0x2a, 0x8b, 0x52, 0x0c, 0x97, 0xa8, 0x87, 0xe0, 0x1e, 0x96, 0xb1, 0xf1, - 0x1d, 0x3a, 0xf1, 0x0e, 0xcc, 0xc5, 0xc1, 0x13, 0x19, 0x17, 0xc3, 0x65, 0xea, 0x71, 0xbd, 0xce, - 0xcd, 0xc6, 0x7d, 0x6a, 0xbe, 0x97, 0x94, 0xf9, 0xb1, 0xcf, 0xb4, 0xeb, 0x3f, 0x87, 0x05, 0x0b, - 0x8d, 0x32, 0x39, 0x94, 0xc7, 0xda, 0xec, 0x1d, 0xca, 0xe3, 0x66, 0xb3, 0x77, 0xb7, 0xfd, 0x7e, - 0xcb, 0xfb, 0x97, 0x16, 0xac, 0xf8, 0x1f, 0x6f, 0x2b, 0x8e, 0xf6, 0xd2, 0x69, 0x3e, 0x22, 0xf3, - 0x3d, 0x49, 0x93, 0xa8, 0x4c, 0xf3, 0x62, 0xd8, 0x52, 0x12, 0xd4, 0x70, 0xb5, 0xfb, 0x6d, 0x7b, - 0xf7, 0xaf, 0xc0, 0xdc, 0x7e, 0xf1, 0xf0, 0x38, 0xd3, 0x4a, 0xc1, 0x10, 0xca, 0x3b, 0x4b, 0x8d, - 0x09, 0xa7, 0x6f, 0xb3, 0x8b, 0x3d, 0x6b, 0x17, 0x87, 0xd0, 0x3f, 0x94, 0xc7, 0x39, 0x1e, 0x50, - 0xb5, 0xed, 0x1a, 0x74, 0x2c, 0x6b, 0xbf, 0x66, 0x59, 0x8f, 0x61, 0xb0, 0x9b, 0x86, 0x8a, 0xf5, - 0x46, 0x65, 0xbe, 0x02, 0x73, 0x05, 0x2d, 0x49, 0xdb, 0x3d, 0x05, 0x21, 0x3e, 0xcc, 0xa3, 0x23, - 0x99, 0x6b, 0x76, 0x15, 0x24, 0x6e, 0x41, 0x27, 0x7f, 0x12, 0xd6, 0xce, 0x52, 0x4d, 0x3a, 0x3e, - 0x92, 0x78, 0x7f, 0xd9, 0x86, 0xfe, 0x6e, 0x1a, 0xee, 0x65, 0x72, 0x24, 0x6e, 0x43, 0x5f, 0xed, - 0xa1, 0x92, 0x56, 0x75, 0xcc, 0x0d, 0x73, 0xbe, 0x26, 0x10, 0x6f, 0x01, 0x98, 0xb3, 0x54, 0x0c, - 0xdb, 0x0e, 0x79, 0x65, 0x15, 0x2c, 0x1a, 0x71, 0xc7, 0x68, 0x44, 0x87, 0xa8, 0xd7, 0xab, 0xc1, - 0x71, 0xf6, 0x26, 0x7d, 0x40, 0x59, 0x1c, 0x8d, 0xb2, 0x29, 0x2d, 0xa4, 0xe7, 0xd3, 0x37, 0xae, - 0x79, 0x22, 0x27, 0x69, 0xae, 0x4e, 0x5f, 0xcf, 0x67, 0xe8, 0x87, 0xe8, 0xce, 0x5f, 0xb4, 0x69, - 0x03, 0xd8, 0xc0, 0x1b, 0x53, 0xdd, 0xb2, 0x4d, 0xb5, 0xe5, 0x62, 0xda, 0xae, 0x8b, 0xa9, 0x9c, - 0x52, 0xc7, 0x71, 0x4a, 0x95, 0x7b, 0xef, 0xda, 0xee, 0x5d, 0x5b, 0x40, 0xf4, 0xfa, 0x1d, 0x6d, - 0x01, 0x77, 0x8d, 0xa3, 0x7a, 0x18, 0x4d, 0x24, 0xeb, 0x4e, 0x85, 0x10, 0x1f, 0xc1, 0xca, 0xc8, - 0x35, 0x85, 0xc3, 0x3e, 0x49, 0xf1, 0x24, 0x43, 0x59, 0x27, 0xaf, 0x5c, 0x1d, 0x4d, 0x30, 0x6f, - 0xbb, 0x3a, 0xc4, 0x78, 0xff, 0xd5, 0x22, 0x45, 0x20, 0x8b, 0x6f, 0x6c, 0x74, 0xcb, 0xb6, 0xd1, - 0x02, 0xba, 0x87, 0x51, 0x12, 0xf2, 0xf2, 0xe9, 0x1b, 0x47, 0x0d, 0xb2, 0xe8, 0xb1, 0xcc, 0x8b, - 0xc8, 0xac, 0xdf, 0xc2, 0x88, 0x65, 0x68, 0x1f, 0x4d, 0x78, 0xfd, 0xed, 0xa3, 0x89, 0xeb, 0x1b, - 0x7a, 0x75, 0xdf, 0xe0, 0x41, 0xb7, 0xc8, 0xe4, 0x88, 0x1d, 0xd5, 0xb2, 0xab, 0x20, 0x3e, 0xb5, - 0x89, 0x5b, 0xc6, 0x53, 0xf4, 0x1d, 0x57, 0x64, 0xf6, 0x4f, 0xfb, 0x08, 0xdc, 0xb1, 0x2c, 0x0d, - 0x3f, 0x0b, 0xcc, 0x72, 0x35, 0xe8, 0xfd, 0x7d, 0x1b, 0x06, 0x3b, 0x64, 0xd5, 0x71, 0xb5, 0xcb, - 0xd0, 0x8e, 0x42, 0x5e, 0x6a, 0x3b, 0x0a, 0x29, 0x64, 0x0b, 0x72, 0x99, 0x94, 0xc6, 0x6d, 0x18, - 0x58, 0x9d, 0xe2, 0x2c, 0x7d, 0x18, 0x8c, 0x95, 0x1a, 0x0f, 0x7c, 0x03, 0xa3, 0xc7, 0xc1, 0xef, - 0xed, 0x68, 0x2c, 0x8b, 0x12, 0x1d, 0x19, 0x36, 0xdb, 0x28, 0xe4, 0x88, 0x17, 0xcb, 0x6b, 0xd7, - 0x20, 0xf6, 0x3d, 0x8a, 0xf2, 0x72, 0x1a, 0xc4, 0x7b, 0xd1, 0x37, 0x6a, 0xff, 0x3b, 0xbe, 0x8d, - 0xb2, 0x0c, 0x6a, 0xdf, 0x31, 0xa8, 0x66, 0x1d, 0x2f, 0xda, 0xa0, 0xfe, 0x7b, 0x1b, 0xe6, 0x59, - 0xa8, 0x85, 0xf8, 0x09, 0x74, 0xf0, 0x1c, 0x2a, 0xef, 0xbf, 0xa2, 0x75, 0x2e, 0x9b, 0x52, 0xab, - 0x8f, 0x6d, 0xe2, 0x26, 0xf4, 0x9e, 0xc4, 0xe9, 0xe8, 0x90, 0x46, 0xaa, 0xc2, 0x8c, 0x8f, 0xe3, - 0xc3, 0x28, 0x55, 0x64, 0xaa, 0x5d, 0xdc, 0x36, 0x07, 0xb8, 0x43, 0x94, 0xda, 0x99, 0x3c, 0x20, - 0xa4, 0x22, 0x65, 0x0a, 0xf1, 0x06, 0xf4, 0x13, 0x59, 0xa2, 0xeb, 0x64, 0x63, 0x76, 0x89, 0x89, - 0x3f, 0x53, 0x58, 0x45, 0xad, 0x69, 0xc4, 0x06, 0x2a, 0x79, 0x2c, 0x8b, 0xe3, 0xa2, 0x94, 0x13, - 0x3a, 0x5f, 0x95, 0x1a, 0x7d, 0x52, 0x28, 0x62, 0x8b, 0x02, 0xd5, 0xb1, 0x8c, 0x26, 0xb2, 0x28, - 0x83, 0x49, 0xc6, 0x42, 0xaf, 0x10, 0xce, 0xa1, 0x53, 0x9d, 0x4f, 0x3a, 0x74, 0x3c, 0x74, 0x9d, - 0xdc, 0xdb, 0x83, 0x79, 0x2d, 0x24, 0xf1, 0x0a, 0xf4, 0xa6, 0x64, 0x3e, 0x66, 0x84, 0xf8, 0x08, - 0xd1, 0xbe, 0x6a, 0x45, 0x4d, 0xb8, 0x9f, 0x06, 0xe1, 0xe6, 0x91, 0xcc, 0xb5, 0xad, 0xe9, 0xf9, - 0x36, 0xca, 0x0b, 0x69, 0x50, 0xea, 0x84, 0xdb, 0x57, 0xa6, 0x65, 0x10, 0xd3, 0xa0, 0x5d, 0x5f, - 0x01, 0x68, 0x79, 0x32, 0x99, 0x6f, 0x65, 0x53, 0x32, 0xcc, 0x5d, 0x9f, 0x21, 0xe3, 0xb1, 0x3a, - 0x44, 0xac, 0x3c, 0x16, 0xba, 0x16, 0x25, 0xae, 0x2e, 0x61, 0x19, 0xf2, 0xfe, 0xb3, 0x0b, 0x50, - 0xed, 0x9d, 0xf8, 0x1c, 0xae, 0x46, 0xe9, 0x9e, 0xcc, 0x8f, 0xa2, 0x91, 0xfc, 0xf8, 0xb8, 0x94, - 0x85, 0x2f, 0x47, 0xd3, 0xbc, 0x88, 0x8e, 0x24, 0xfb, 0x8a, 0xcb, 0xf5, 0xfd, 0x56, 0x8a, 0x78, - 0x52, 0x2f, 0xf1, 0x4b, 0xb8, 0x64, 0x9a, 0xc2, 0x6a, 0xb0, 0xf6, 0x69, 0x83, 0x35, 0xf5, 0x10, - 0x5b, 0x70, 0x31, 0x4a, 0xbf, 0x98, 0xca, 0xa9, 0x3d, 0x4c, 0xe7, 0xb4, 0x61, 0x66, 0xe9, 0xc5, - 0x03, 0xb8, 0x62, 0xc6, 0x46, 0x73, 0x58, 0x8d, 0xd4, 0x3d, 0x6d, 0xa4, 0x13, 0x3a, 0xa9, 0xc5, - 0x61, 0x0c, 0xef, 0x8e, 0xd5, 0x3b, 0x63, 0x71, 0x33, 0x3d, 0xd4, 0xe2, 0x1e, 0xc8, 0x7c, 0x6c, - 0x2f, 0x6e, 0xee, 0x8c, 0xc5, 0xd5, 0xe8, 0xc5, 0x2f, 0x60, 0x25, 0x4a, 0x5d, 0x4e, 0xfa, 0xa7, - 0x0d, 0x51, 0xa7, 0x16, 0x9b, 0xb0, 0x5a, 0xc8, 0x11, 0x86, 0x4d, 0xd5, 0x08, 0xf3, 0xa7, 0x8d, - 0x30, 0x43, 0xee, 0xfd, 0x77, 0x0b, 0x96, 0x5d, 0xa2, 0xc6, 0x40, 0x47, 0x40, 0x17, 0x07, 0xd4, - 0x3e, 0x06, 0xbf, 0xad, 0xe0, 0xa7, 0xe3, 0x04, 0x3f, 0x6b, 0xd0, 0x9b, 0x04, 0x5f, 0xa7, 0x39, - 0x2b, 0xae, 0x02, 0x08, 0x1b, 0x25, 0xa9, 0x0a, 0xcb, 0x10, 0x8b, 0x80, 0xf8, 0x19, 0x74, 0xd1, - 0x2b, 0xb0, 0xe8, 0x7e, 0xdc, 0xc8, 0xf5, 0x46, 0xc5, 0x3f, 0x11, 0xaf, 0xbf, 0x07, 0x83, 0x8a, - 0xdb, 0x33, 0x4c, 0x67, 0xd7, 0x36, 0x9d, 0xbf, 0x6b, 0xc1, 0x82, 0x65, 0xcd, 0x90, 0xb2, 0x3a, - 0xfa, 0x5d, 0x7d, 0xd2, 0xab, 0x2c, 0x61, 0x4f, 0x96, 0x3c, 0x88, 0x85, 0x41, 0x6f, 0xb1, 0x1f, - 0x44, 0xf1, 0x28, 0x29, 0xf9, 0xc0, 0x6a, 0x50, 0x7c, 0x6c, 0x95, 0x1e, 0xb6, 0x83, 0x32, 0x60, - 0xdb, 0x78, 0x7d, 0xd6, 0x90, 0xaa, 0x4f, 0xa4, 0xf1, 0xdd, 0x2e, 0xe2, 0x53, 0x58, 0x3d, 0x88, - 0x64, 0x1e, 0xe4, 0xa3, 0x83, 0x68, 0x14, 0xc4, 0x34, 0x4c, 0xef, 0x1c, 0xc3, 0xcc, 0xf4, 0xf2, - 0xbe, 0x80, 0xcb, 0x8d, 0xa4, 0xe4, 0x80, 0xc7, 0xfb, 0xc1, 0x34, 0x2e, 0x79, 0xe1, 0x1a, 0xc4, - 0xa5, 0x67, 0xe3, 0x49, 0xf0, 0xb5, 0x6a, 0xe4, 0xa5, 0x57, 0x18, 0xef, 0xbb, 0x16, 0x2c, 0xda, - 0x16, 0x5e, 0xfc, 0x11, 0x40, 0x94, 0x94, 0x32, 0xdf, 0x0f, 0x46, 0x26, 0x3a, 0xd5, 0xba, 0xb7, - 0xa3, 0x1b, 0xd8, 0xbe, 0x57, 0x84, 0xe2, 0x06, 0x74, 0xca, 0x51, 0xc6, 0x1e, 0x49, 0x3b, 0x82, - 0x87, 0xa3, 0x0c, 0x29, 0x7d, 0x6c, 0xc2, 0x90, 0xa3, 0x1c, 0x65, 0xef, 0xb2, 0x2b, 0xaa, 0x93, - 0x50, 0x9b, 0xf7, 0xcf, 0x6d, 0xe8, 0x33, 0x06, 0xcd, 0x33, 0x7a, 0x87, 0x27, 0x31, 0x95, 0x08, - 0x78, 0x5d, 0x36, 0x0a, 0x57, 0x5d, 0x1c, 0x27, 0x7b, 0x32, 0xd1, 0x0b, 0xd3, 0x20, 0xb7, 0xf8, - 0x72, 0x74, 0xa4, 0x37, 0x94, 0x41, 0x0c, 0x2b, 0xf6, 0xa3, 0x04, 0x8f, 0xff, 0xdb, 0xac, 0xcd, - 0x06, 0xb6, 0xda, 0xee, 0xb0, 0x4e, 0x1b, 0x18, 0xdb, 0xd0, 0x5d, 0x21, 0x40, 0xee, 0xab, 0xeb, - 0x1b, 0x18, 0x95, 0x6e, 0x14, 0xa7, 0x85, 0xa4, 0x38, 0xa9, 0xeb, 0x2b, 0x80, 0x02, 0x30, 0xfc, - 0xa0, 0x2e, 0xf3, 0xd4, 0x52, 0x21, 0x90, 0xc3, 0x38, 0x28, 0xca, 0xcd, 0xd1, 0xe1, 0x70, 0xa0, - 0x38, 0x64, 0x10, 0x0f, 0x61, 0x1c, 0x15, 0xa5, 0x4c, 0x86, 0xa0, 0xdc, 0x84, 0x82, 0x28, 0xa4, - 0x89, 0xd3, 0x02, 0x13, 0x9e, 0x05, 0xd5, 0x83, 0x41, 0xef, 0xdb, 0x36, 0x2c, 0xbb, 0x5b, 0xd3, - 0x78, 0xe2, 0x87, 0xd0, 0xcf, 0x9f, 0x91, 0x6f, 0xd0, 0xe2, 0x62, 0x10, 0x59, 0xcd, 0x9f, 0xed, - 0x06, 0xa3, 0x43, 0x59, 0x16, 0x2c, 0xb0, 0x0a, 0x41, 0x91, 0xd8, 0xb3, 0x7b, 0x79, 0x8e, 0xb9, - 0x1d, 0x8b, 0x4c, 0xc3, 0xaa, 0xe7, 0x76, 0x9e, 0x66, 0x19, 0x47, 0x5a, 0xd4, 0x93, 0x11, 0x38, - 0x63, 0xc9, 0x33, 0x2a, 0x99, 0x69, 0x90, 0xc2, 0x01, 0x33, 0xa3, 0x12, 0x5b, 0x85, 0x20, 0x61, - 0xeb, 0x19, 0xe7, 0x59, 0xd8, 0xd6, 0x8c, 0xa5, 0x99, 0x71, 0xa0, 0x7b, 0x32, 0xc2, 0xfb, 0x5d, - 0x07, 0xfa, 0x1c, 0x7e, 0x50, 0xca, 0x26, 0xd1, 0x63, 0xe8, 0xa2, 0x99, 0x82, 0x70, 0xbb, 0xe2, - 0x68, 0x12, 0x69, 0xa5, 0x51, 0x40, 0x65, 0x39, 0x3a, 0xb6, 0xe5, 0xb8, 0x0e, 0x83, 0xe0, 0x28, - 0x88, 0xe2, 0xe0, 0x49, 0x2c, 0x79, 0xf1, 0x15, 0x42, 0xbc, 0x0a, 0xcb, 0x98, 0x59, 0x16, 0x5b, - 0xe9, 0x24, 0x8b, 0x65, 0x69, 0x44, 0x50, 0xc3, 0xaa, 0x78, 0x35, 0x08, 0x0b, 0xe5, 0x2e, 0x58, - 0x16, 0x36, 0x0a, 0x29, 0x8c, 0x21, 0x0f, 0x42, 0x96, 0x88, 0x8d, 0xd2, 0x59, 0xad, 0xc9, 0x29, - 0xba, 0xbe, 0x81, 0xc5, 0x2d, 0x58, 0x79, 0x9a, 0x47, 0xa5, 0xb4, 0x18, 0x51, 0x92, 0xa9, 0xa3, - 0x85, 0x07, 0x8b, 0x0a, 0xc5, 0xac, 0x28, 0x15, 0x73, 0x70, 0xb8, 0x2a, 0x9e, 0xf8, 0xcb, 0x3c, - 0x2a, 0x51, 0x11, 0x95, 0xbe, 0xd5, 0xb0, 0x28, 0x1b, 0xea, 0x47, 0x2c, 0x2d, 0x2a, 0xd9, 0x18, - 0x04, 0xce, 0x14, 0xa5, 0x3b, 0xc9, 0x6e, 0x9e, 0x8e, 0x73, 0x59, 0x14, 0xc3, 0x25, 0x35, 0x93, - 0x8d, 0xc3, 0x1d, 0x52, 0x0e, 0x70, 0xb8, 0xac, 0x54, 0x5d, 0x41, 0xc8, 0xc1, 0x53, 0x19, 0x8d, - 0x0f, 0x4a, 0x19, 0xee, 0xa8, 0xf6, 0x15, 0xc5, 0x81, 0x8b, 0xf5, 0xfe, 0xb1, 0x6d, 0x15, 0x0d, - 0x79, 0xd7, 0x6b, 0xd5, 0xa8, 0xd6, 0x6c, 0x35, 0x8a, 0x23, 0xec, 0xf6, 0x79, 0x22, 0xec, 0xce, - 0xb9, 0x23, 0xec, 0xee, 0xf3, 0x44, 0xd8, 0xbd, 0xe7, 0x8e, 0xb0, 0xe7, 0x9e, 0x2f, 0xc2, 0xee, - 0xd7, 0x22, 0x6c, 0xef, 0x55, 0x58, 0xe6, 0x9c, 0xd3, 0x97, 0x7f, 0x3e, 0x95, 0x45, 0xd9, 0x9c, - 0x7a, 0x7a, 0x1f, 0xc0, 0x8a, 0xa1, 0x2b, 0xb2, 0x34, 0x29, 0x50, 0xbb, 0x30, 0x9d, 0x43, 0x14, - 0x07, 0xd4, 0x56, 0xba, 0x48, 0x84, 0xba, 0xd9, 0xbb, 0x4b, 0x93, 0xdc, 0x8f, 0x8a, 0xf2, 0xd4, - 0x49, 0xa8, 0xd8, 0x30, 0x31, 0x39, 0x1f, 0x7d, 0x7b, 0xff, 0xd7, 0x82, 0x25, 0xd3, 0xb9, 0x40, - 0xd7, 0xd5, 0xdc, 0xd7, 0xca, 0x35, 0xdb, 0x4e, 0xae, 0x69, 0x46, 0xed, 0x54, 0xa3, 0x52, 0x44, - 0x53, 0x55, 0x3b, 0x07, 0x26, 0x63, 0x3d, 0x3d, 0x3b, 0x7e, 0xdf, 0x64, 0x80, 0x4a, 0xec, 0x37, - 0xaa, 0x05, 0x57, 0xfc, 0xbd, 0xe8, 0x2c, 0x70, 0x93, 0x24, 0xcf, 0xe3, 0x2b, 0xc9, 0x6f, 0xd0, - 0x5a, 0x11, 0xc5, 0x8e, 0x78, 0xad, 0x89, 0x11, 0x5f, 0x13, 0x79, 0x1f, 0xc1, 0x9a, 0x39, 0x0e, - 0xdf, 0x6f, 0x17, 0xbe, 0x6b, 0xc1, 0xa5, 0xda, 0x10, 0xb4, 0x17, 0x67, 0x9f, 0x2a, 0xfb, 0x92, - 0xc6, 0xda, 0x1d, 0x17, 0x79, 0x42, 0x4d, 0xfa, 0x84, 0x5d, 0xf2, 0xbe, 0x82, 0xcb, 0x75, 0x66, - 0x94, 0x60, 0x3e, 0xb2, 0x26, 0xb3, 0xc4, 0xb3, 0x5e, 0xcf, 0x16, 0x2d, 0x21, 0xb9, 0x1d, 0xbc, - 0x77, 0x2c, 0x51, 0xd9, 0xa7, 0xe2, 0x7a, 0xbd, 0x04, 0x3f, 0xb0, 0x0a, 0xee, 0xde, 0x9e, 0xc5, - 0x90, 0x73, 0x46, 0xee, 0x5a, 0x0c, 0x59, 0x27, 0x65, 0xa6, 0x32, 0x4c, 0x9d, 0x5c, 0x52, 0x6f, - 0x17, 0x16, 0x1f, 0x3f, 0xb0, 0x64, 0xad, 0xf7, 0xa5, 0x65, 0xe9, 0xb1, 0x91, 0x5b, 0xbb, 0x59, - 0x6e, 0x1d, 0x47, 0x6e, 0x3f, 0x87, 0x25, 0x3d, 0xe2, 0xf3, 0x2a, 0xc0, 0x87, 0xb0, 0x6c, 0x98, - 0x51, 0x4b, 0x7b, 0x1d, 0xe6, 0x8e, 0x26, 0x96, 0x90, 0xb5, 0xd5, 0xb2, 0x79, 0xf6, 0x99, 0xc4, - 0xfb, 0x15, 0xac, 0x52, 0x99, 0xc4, 0x9e, 0x9c, 0xea, 0x61, 0x71, 0x29, 0xf3, 0xcd, 0x7c, 0x5c, - 0x30, 0x07, 0x16, 0x86, 0x2a, 0xc1, 0x04, 0xe9, 0x92, 0xab, 0x82, 0xf0, 0xf0, 0x04, 0x71, 0xcc, - 0x97, 0x63, 0xf8, 0xe9, 0x6d, 0xc1, 0x45, 0x6b, 0x74, 0x73, 0x48, 0x06, 0x91, 0x46, 0xd6, 0xaa, - 0xa9, 0xa6, 0x62, 0xe3, 0x57, 0x24, 0x68, 0xe1, 0x1e, 0x3f, 0xd8, 0xa2, 0xb3, 0xae, 0x39, 0x5c, - 0xad, 0x6a, 0x2e, 0x3d, 0xe5, 0x00, 0xaa, 0xd2, 0x67, 0xdb, 0x2e, 0x7d, 0x7a, 0xaf, 0xc2, 0x6a, - 0xd5, 0x99, 0x19, 0x68, 0xd8, 0x2f, 0xef, 0x15, 0x9c, 0xc4, 0x97, 0x93, 0xf4, 0xc8, 0x4c, 0xd2, - 0x44, 0xf6, 0xc7, 0x38, 0x9c, 0x26, 0xab, 0x86, 0x1b, 0x55, 0x37, 0x72, 0xf4, 0x4d, 0x11, 0x66, - 0x30, 0x2d, 0x8c, 0xd5, 0x20, 0xc0, 0xfb, 0x4d, 0x0b, 0x2e, 0x3e, 0x2a, 0x64, 0xbe, 0x55, 0xbf, - 0x07, 0x35, 0x37, 0xa9, 0xad, 0xb3, 0x6e, 0x52, 0xdb, 0x4d, 0x37, 0xa9, 0x14, 0x8c, 0x50, 0xae, - 0x6d, 0xdd, 0xb6, 0xda, 0xa8, 0xd3, 0xee, 0x5a, 0xbd, 0x6f, 0x5b, 0x70, 0x09, 0xb9, 0xe2, 0x3a, - 0xb6, 0xdc, 0x97, 0xb9, 0x4c, 0x46, 0xaa, 0xb0, 0x1f, 0x94, 0x07, 0x7a, 0xfd, 0xf8, 0x8d, 0x62, - 0x56, 0x65, 0x6e, 0xbd, 0xf5, 0x0a, 0x3a, 0xed, 0x72, 0x54, 0xbc, 0x86, 0x61, 0x5d, 0x19, 0x44, - 0x31, 0xbb, 0x5c, 0xed, 0x9c, 0xad, 0x39, 0x99, 0xc0, 0xfb, 0x27, 0x16, 0xd0, 0x27, 0x51, 0x7c, - 0x06, 0x23, 0x14, 0xfa, 0xc7, 0x32, 0xa9, 0x0c, 0x97, 0x81, 0x89, 0x5e, 0xe6, 0x13, 0xed, 0x57, - 0xf0, 0xdb, 0xd4, 0x77, 0xba, 0xd6, 0x8d, 0xc4, 0x1a, 0xf4, 0xc6, 0x79, 0x3a, 0xcd, 0xf8, 0x9a, - 0x42, 0x01, 0xe2, 0xa6, 0x61, 0x77, 0xce, 0x09, 0x38, 0x0c, 0x5f, 0x9a, 0xd9, 0x3f, 0x83, 0x79, - 0xc4, 0xe1, 0x5f, 0x63, 0xf8, 0x6e, 0x86, 0x6f, 0xdb, 0xc3, 0xdf, 0x86, 0xd5, 0x20, 0x0c, 0xa3, - 0x32, 0x4a, 0x93, 0x20, 0xfe, 0x25, 0xa2, 0x74, 0xb9, 0x74, 0x06, 0xef, 0x6d, 0xc3, 0xdc, 0x23, - 0x15, 0xec, 0x0a, 0xe8, 0x7e, 0x66, 0x8d, 0xaf, 0xdd, 0xe7, 0xa7, 0x41, 0x1e, 0x72, 0x54, 0x4c, - 0xdf, 0x88, 0xdb, 0x4b, 0xf7, 0x75, 0x56, 0x4c, 0xdf, 0xde, 0xb7, 0x73, 0xb0, 0xe4, 0x68, 0xdd, - 0x49, 0xdc, 0x36, 0x5c, 0xfa, 0x0c, 0xa1, 0x8f, 0xb1, 0x4d, 0x18, 0xe9, 0x6b, 0x14, 0x0d, 0xa2, - 0x66, 0xe6, 0x92, 0xaa, 0xf0, 0x7c, 0xe1, 0xa7, 0x24, 0xeb, 0x22, 0xf5, 0xd5, 0x5d, 0xaf, 0xba, - 0xba, 0x7b, 0x9f, 0x8a, 0x6a, 0xa3, 0x32, 0xae, 0xb9, 0x6a, 0x87, 0xc3, 0x8d, 0x3d, 0x22, 0x61, - 0x57, 0xad, 0xe8, 0xc5, 0x6b, 0xd0, 0x95, 0xc9, 0x51, 0x51, 0x2b, 0xd0, 0xd4, 0x6e, 0xe6, 0x88, - 0x84, 0x52, 0x2f, 0x75, 0x1f, 0x48, 0xc5, 0x98, 0x81, 0xaf, 0x41, 0xb4, 0x6d, 0x12, 0x47, 0xcd, - 0xd2, 0x28, 0x29, 0xf9, 0xee, 0xd0, 0xc2, 0x88, 0x0d, 0x7d, 0x53, 0x08, 0x34, 0xcb, 0xb0, 0x89, - 0x3b, 0xfb, 0xb6, 0xf0, 0x9d, 0xea, 0x62, 0x68, 0xc1, 0x71, 0x69, 0x0d, 0x27, 0xaa, 0xba, 0x22, - 0xda, 0x80, 0x1e, 0x05, 0x82, 0x7c, 0xcb, 0x38, 0xac, 0xab, 0x98, 0xe9, 0xa1, 0xc8, 0xc4, 0x4f, - 0x59, 0x7b, 0x97, 0x66, 0x34, 0x12, 0xff, 0x58, 0x9d, 0xdf, 0xaf, 0xdd, 0x2b, 0x36, 0x4b, 0xb6, - 0xe9, 0x2e, 0x49, 0x95, 0xf9, 0x57, 0x4c, 0x99, 0xff, 0x65, 0x80, 0xbd, 0x32, 0xcd, 0xf6, 0xa2, - 0x71, 0x12, 0xc4, 0xc3, 0x8b, 0xca, 0x01, 0x54, 0x18, 0x71, 0x13, 0xfa, 0x53, 0xd2, 0xcb, 0x62, - 0x28, 0x68, 0xaa, 0x25, 0x3d, 0x15, 0x61, 0x7d, 0xdd, 0x4a, 0x49, 0x73, 0x3a, 0xa6, 0xf7, 0x14, - 0x97, 0x94, 0xfa, 0x30, 0x88, 0x71, 0x97, 0xb5, 0xc7, 0xcf, 0x13, 0x77, 0xfd, 0x90, 0x90, 0xed, - 0x2e, 0x2c, 0x92, 0xc0, 0x24, 0xd7, 0xc9, 0xf4, 0x25, 0x5a, 0xab, 0xf1, 0x12, 0xcd, 0xf5, 0x24, - 0xfb, 0xea, 0xb8, 0xe3, 0xfe, 0x9c, 0xf4, 0x20, 0x46, 0x26, 0xa3, 0x34, 0xc4, 0x7c, 0x9f, 0x2d, - 0x92, 0x86, 0x91, 0xc7, 0x69, 0x1e, 0xf1, 0x11, 0xc2, 0x4f, 0xa5, 0xa1, 0x49, 0x29, 0x13, 0xfd, - 0xf4, 0x42, 0x83, 0xe8, 0x91, 0x2b, 0xdd, 0xf9, 0x3c, 0x43, 0x83, 0x60, 0xac, 0x57, 0xab, 0xf9, - 0x3e, 0xb5, 0x3d, 0x73, 0x9f, 0x6a, 0xee, 0x76, 0x3b, 0xee, 0xdd, 0xae, 0xf7, 0xdb, 0x16, 0x40, - 0x35, 0xfc, 0xf3, 0xde, 0xa8, 0xee, 0xa7, 0xf9, 0x24, 0x28, 0xcd, 0x05, 0x30, 0x41, 0xe2, 0x4d, - 0x98, 0x4b, 0x89, 0x4d, 0xb6, 0xef, 0x57, 0x67, 0x4e, 0x80, 0x5a, 0x85, 0xcf, 0x64, 0xea, 0x26, - 0x99, 0x6a, 0x99, 0x3d, 0x7d, 0x93, 0x8c, 0x90, 0xf7, 0x57, 0x2d, 0x65, 0xa8, 0x4c, 0x69, 0x04, - 0x29, 0x9f, 0xe4, 0x51, 0x38, 0x36, 0x15, 0x01, 0x05, 0x91, 0xc2, 0x6a, 0xbb, 0xda, 0x8e, 0x32, - 0xca, 0x4b, 0xf7, 0x69, 0x21, 0xcc, 0x9a, 0x82, 0x50, 0xee, 0x93, 0x60, 0xc4, 0x12, 0xc6, 0x4f, - 0x94, 0xda, 0x38, 0x28, 0xe5, 0xd3, 0x40, 0xbf, 0x50, 0xd0, 0x20, 0x99, 0xaa, 0x20, 0xe3, 0xfb, - 0x45, 0xfc, 0xf4, 0x3e, 0x05, 0x81, 0xec, 0xe8, 0x22, 0x7d, 0x30, 0x3a, 0x94, 0x49, 0x68, 0xdd, - 0x5d, 0xb6, 0x9c, 0xbb, 0xcb, 0x53, 0x1e, 0x44, 0x79, 0x7f, 0xd7, 0x82, 0x05, 0x6b, 0x28, 0xba, - 0xd1, 0x54, 0x9f, 0x66, 0x98, 0x0a, 0xe1, 0x38, 0xeb, 0x76, 0xed, 0x61, 0xd4, 0xd9, 0xae, 0xfe, - 0x4d, 0xe8, 0xe1, 0xbc, 0x05, 0x97, 0xe7, 0xaf, 0x59, 0xbb, 0xe1, 0xae, 0xc4, 0x57, 0x74, 0xde, - 0xdf, 0xb4, 0x60, 0x11, 0xf3, 0x93, 0x74, 0xbc, 0x95, 0x26, 0xfb, 0xd1, 0xd8, 0x54, 0x9a, 0x5b, - 0x56, 0xa5, 0xf9, 0x3d, 0x98, 0x1b, 0x51, 0x2b, 0x5f, 0x43, 0xfc, 0xd8, 0x4a, 0x6c, 0x74, 0xc7, - 0x0d, 0xf5, 0x0f, 0xdb, 0x16, 0x45, 0x8e, 0xa7, 0xd5, 0x42, 0x3f, 0xd7, 0x69, 0x3d, 0x84, 0x05, - 0x5c, 0xd1, 0x83, 0x20, 0xcb, 0x50, 0xad, 0x67, 0x62, 0xa1, 0x56, 0x2d, 0x61, 0x99, 0x89, 0xa6, - 0x58, 0x78, 0x26, 0x9a, 0xb2, 0x05, 0xdb, 0xa9, 0x45, 0x41, 0x09, 0xac, 0x21, 0xcd, 0x44, 0x4d, - 0xf6, 0xe5, 0x41, 0x54, 0x52, 0xf4, 0x89, 0xfe, 0x9a, 0xaa, 0xa6, 0x49, 0x10, 0x73, 0xda, 0xaf, - 0x1f, 0x4c, 0xcc, 0xe0, 0x91, 0x56, 0x3e, 0xab, 0xd1, 0xb6, 0x15, 0x6d, 0x1d, 0xef, 0xfd, 0x66, - 0x0e, 0xfa, 0xb8, 0x27, 0xbb, 0x69, 0xd8, 0x74, 0xcd, 0x8a, 0x3c, 0xdb, 0xc1, 0x8d, 0x86, 0xcd, - 0xe6, 0x74, 0xac, 0xcd, 0xf9, 0xbe, 0xbe, 0xf8, 0x4e, 0x2d, 0x6d, 0xb6, 0x7d, 0xd7, 0x6e, 0x1a, - 0x36, 0xfa, 0x8a, 0x37, 0x31, 0xd2, 0x63, 0xfb, 0xd0, 0x77, 0xaa, 0x22, 0xb6, 0x65, 0xf5, 0x0d, - 0x91, 0x78, 0x05, 0x3a, 0x71, 0x3a, 0xa6, 0x12, 0x58, 0x45, 0x6b, 0xab, 0x8d, 0x8f, 0xed, 0xc8, - 0x5d, 0x98, 0xe8, 0xd7, 0x3c, 0xf8, 0x29, 0xde, 0x71, 0xde, 0x51, 0x80, 0x93, 0x4f, 0x3b, 0x3e, - 0xcd, 0x79, 0x4b, 0xf1, 0x8a, 0x76, 0xad, 0xca, 0x1d, 0xcf, 0x44, 0x6f, 0xec, 0x51, 0x5f, 0xaf, - 0xfc, 0xb6, 0xf2, 0xc1, 0x0d, 0x51, 0xa9, 0x71, 0xd7, 0xef, 0x38, 0x25, 0xf6, 0xa5, 0x19, 0x4e, - 0x8c, 0xc1, 0x72, 0x2a, 0xec, 0x1b, 0x30, 0xcf, 0xe7, 0x52, 0x7b, 0x64, 0x31, 0x7b, 0x16, 0x7d, - 0x43, 0x23, 0xbe, 0x80, 0xcb, 0x59, 0x83, 0x06, 0x16, 0xe4, 0x98, 0x17, 0xee, 0xbc, 0x64, 0x44, - 0x37, 0x4b, 0xe3, 0x37, 0xf7, 0x14, 0xef, 0xc2, 0xa2, 0xd5, 0x50, 0x0c, 0x57, 0x1d, 0x36, 0xac, - 0xc3, 0xe5, 0x3b, 0x74, 0x18, 0x00, 0x84, 0x49, 0xa1, 0xcc, 0x76, 0x31, 0xbc, 0xa8, 0xa2, 0xa4, - 0x0a, 0x83, 0xf6, 0x2b, 0x4c, 0x8a, 0x3d, 0x19, 0xe4, 0xa3, 0x03, 0x0a, 0x01, 0x06, 0x7e, 0x85, - 0xf8, 0x21, 0x0e, 0xda, 0x87, 0xd5, 0xdd, 0x34, 0x74, 0x93, 0x3d, 0x55, 0xce, 0xda, 0xcb, 0xe4, - 0xa8, 0x56, 0xce, 0x62, 0x35, 0xf5, 0x75, 0x73, 0x73, 0xd2, 0xed, 0xbd, 0x06, 0x17, 0xad, 0x31, - 0x39, 0x69, 0x6b, 0x2e, 0xa6, 0xdd, 0xa2, 0xe9, 0xdd, 0x34, 0xb0, 0x99, 0xf2, 0x43, 0x1a, 0xf4, - 0x7b, 0x67, 0x82, 0xff, 0xd1, 0xb2, 0x2b, 0x3f, 0xe9, 0xb8, 0x38, 0x57, 0x39, 0x43, 0xb9, 0xe0, - 0x38, 0x4e, 0x9f, 0xd2, 0x68, 0xf3, 0x3e, 0x43, 0xb8, 0x5f, 0xa6, 0x72, 0x58, 0x70, 0x02, 0x66, - 0x61, 0xc8, 0x68, 0xe8, 0x04, 0x0c, 0x8d, 0x46, 0x10, 0xc5, 0xc8, 0x58, 0x11, 0x25, 0x23, 0xed, - 0x84, 0x15, 0xa0, 0x2a, 0x14, 0x61, 0x3a, 0x55, 0x97, 0x26, 0xf3, 0x3e, 0x43, 0x8c, 0x97, 0x79, - 0xce, 0x2f, 0xb4, 0x18, 0xf2, 0x5e, 0xb3, 0x2b, 0x3e, 0xb4, 0x0e, 0x96, 0xc5, 0xaa, 0x3a, 0xf6, - 0xb8, 0x84, 0x45, 0x3a, 0xe1, 0x18, 0x7c, 0x6d, 0xd3, 0x1b, 0xac, 0x53, 0x5e, 0x8b, 0x56, 0x05, - 0x92, 0xb6, 0x53, 0x20, 0x59, 0x82, 0x05, 0xab, 0xe8, 0xe3, 0x7d, 0xd7, 0x81, 0x45, 0xa7, 0x9c, - 0xb3, 0x0c, 0x6d, 0xb3, 0x43, 0xed, 0x9d, 0x6d, 0x14, 0x88, 0xf3, 0x06, 0x0b, 0xf7, 0xc3, 0xb6, - 0x12, 0x18, 0x30, 0x60, 0x82, 0x53, 0xb0, 0x07, 0x65, 0xc8, 0x7a, 0x35, 0xd6, 0x75, 0x5e, 0x8d, - 0xbd, 0x01, 0xfd, 0x90, 0x19, 0xeb, 0x39, 0x45, 0x15, 0x7b, 0x45, 0xbe, 0xa6, 0x41, 0x83, 0x1c, - 0xa6, 0xa3, 0x43, 0x99, 0xfb, 0x69, 0x5a, 0x56, 0x0f, 0x1d, 0x5d, 0xa4, 0xd8, 0x00, 0x11, 0x25, - 0xa1, 0x7c, 0x86, 0xa6, 0x40, 0xe6, 0x9b, 0x61, 0x48, 0x75, 0x77, 0xf5, 0xf2, 0xb1, 0xa1, 0x45, - 0xdc, 0x82, 0x15, 0xf9, 0x4c, 0x8e, 0xa6, 0x78, 0x06, 0xd5, 0xbc, 0xfc, 0x7a, 0xa7, 0x8e, 0xa6, - 0x08, 0x50, 0x4e, 0x1e, 0xd2, 0xf3, 0x87, 0x01, 0x15, 0x4b, 0x0d, 0xac, 0xde, 0xeb, 0x85, 0x05, - 0xdd, 0x24, 0x74, 0x7c, 0xfa, 0xc6, 0x91, 0xd3, 0x4c, 0xe6, 0x01, 0x3d, 0xac, 0x55, 0xf5, 0xeb, - 0x05, 0x35, 0x72, 0x0d, 0x6d, 0x36, 0x6d, 0xb1, 0xda, 0x34, 0x2f, 0x80, 0x8b, 0xf7, 0x9e, 0xc9, - 0x91, 0x7b, 0x6a, 0xcf, 0x2e, 0x40, 0x5a, 0x49, 0x5a, 0xdb, 0x4d, 0xd2, 0xd8, 0x53, 0x75, 0x8c, - 0xa7, 0xf2, 0xfe, 0x10, 0x84, 0x3d, 0x05, 0xef, 0xfa, 0x15, 0x98, 0xc3, 0x95, 0x9b, 0xe1, 0x19, - 0xf2, 0x9e, 0xc0, 0x2a, 0x52, 0xef, 0xa1, 0xf3, 0x3b, 0x3f, 0x3f, 0xd5, 0x68, 0x6d, 0x7b, 0x34, - 0x3a, 0x28, 0x65, 0x18, 0xa9, 0x37, 0x5c, 0x8b, 0xbe, 0x02, 0xbc, 0xd7, 0xd5, 0xa2, 0x79, 0x8e, - 0x8a, 0x21, 0x3e, 0x3d, 0x4a, 0xef, 0x19, 0xf2, 0x1e, 0xc1, 0x12, 0x12, 0x3f, 0x7e, 0x70, 0x7a, - 0x7d, 0xef, 0x64, 0x89, 0x34, 0xf3, 0xb0, 0x0d, 0xcb, 0x7a, 0xd8, 0xd3, 0x19, 0x70, 0x5e, 0x8e, - 0xb7, 0xdd, 0x97, 0xe3, 0x9e, 0xe4, 0x95, 0x50, 0x6e, 0xf7, 0xc3, 0xc5, 0x85, 0x2c, 0xa8, 0xc4, - 0xb1, 0x43, 0x1a, 0xc6, 0x90, 0xb7, 0xa6, 0xb6, 0x50, 0x4f, 0xa3, 0x18, 0xf6, 0x6e, 0x52, 0x11, - 0xdd, 0xd9, 0xa9, 0x66, 0x83, 0x2b, 0xc8, 0x34, 0x3b, 0xe2, 0xf6, 0x02, 0x58, 0xf8, 0x32, 0x88, - 0xca, 0xf3, 0xd9, 0xce, 0xeb, 0x30, 0xc8, 0xf2, 0x74, 0x24, 0x8b, 0x62, 0x47, 0x3f, 0xd4, 0xab, - 0x10, 0xc8, 0x75, 0x92, 0x7e, 0x1a, 0x24, 0x63, 0xd6, 0x3a, 0x86, 0xbc, 0xdb, 0xb0, 0xa8, 0xa6, - 0x60, 0x01, 0x9f, 0xf2, 0x04, 0xdf, 0xbb, 0x07, 0x4b, 0x9b, 0x65, 0x19, 0x8c, 0x0e, 0x1e, 0xf0, - 0xf3, 0xc7, 0xb3, 0x85, 0x28, 0xa0, 0x1b, 0x06, 0x65, 0x40, 0xfc, 0x2c, 0xfa, 0xf4, 0xed, 0x7d, - 0x0d, 0x57, 0x8c, 0x49, 0x75, 0xcf, 0x94, 0x5d, 0xb4, 0xb6, 0xfc, 0x61, 0x73, 0x50, 0xe4, 0x92, - 0x9e, 0xe0, 0x1b, 0x3f, 0x80, 0xab, 0x33, 0x73, 0xf1, 0x4a, 0xcf, 0x64, 0xde, 0xbb, 0x6b, 0xd9, - 0x7e, 0x67, 0x07, 0x7f, 0x02, 0x8b, 0x86, 0xee, 0xd7, 0x26, 0xb2, 0xb5, 0xfa, 0x86, 0xde, 0xd0, - 0x5a, 0xa4, 0xbb, 0xa9, 0x99, 0xd5, 0xe2, 0x53, 0x41, 0x4f, 0x0f, 0x7b, 0x1b, 0x56, 0xd3, 0x38, - 0xdc, 0x72, 0x2e, 0x2d, 0xd4, 0xd0, 0x33, 0x78, 0xa4, 0x4d, 0xe4, 0xd3, 0xad, 0x86, 0x0b, 0x8e, - 0x19, 0xbc, 0x77, 0xcd, 0x12, 0x82, 0x9e, 0x91, 0x99, 0xf9, 0xc0, 0x61, 0xc6, 0x0e, 0x0b, 0xce, - 0xb1, 0x46, 0x77, 0x5c, 0x3b, 0x52, 0xf0, 0xfe, 0xb5, 0x05, 0xb0, 0x39, 0x2d, 0x0f, 0x38, 0xe3, - 0x5a, 0x87, 0x79, 0xcc, 0xe9, 0x2d, 0x77, 0x68, 0x60, 0xf5, 0xe6, 0xb2, 0x28, 0x9e, 0xa6, 0x79, - 0x58, 0xbd, 0xb9, 0x54, 0x30, 0xbd, 0x75, 0x9f, 0x96, 0x07, 0x3a, 0x19, 0xc0, 0x6f, 0xdc, 0x68, - 0x39, 0xa9, 0x9c, 0xbd, 0x02, 0xd0, 0x23, 0x15, 0xe4, 0x4c, 0x02, 0x76, 0x33, 0xca, 0xeb, 0xbb, - 0x48, 0x95, 0x48, 0x8c, 0xa3, 0xa2, 0xcc, 0x8f, 0xcb, 0xf4, 0x50, 0x26, 0xda, 0x6f, 0x39, 0x48, - 0x2f, 0xe0, 0x3b, 0x83, 0xdd, 0x69, 0x1c, 0x5b, 0x87, 0x56, 0x95, 0x0f, 0x5b, 0x76, 0xf9, 0x90, - 0x72, 0x6a, 0x5d, 0x9f, 0xc0, 0x4f, 0xf1, 0x8a, 0xc5, 0x71, 0x15, 0x74, 0x57, 0xa2, 0x50, 0x8b, - 0xf0, 0x6e, 0xf2, 0xc5, 0x81, 0x9a, 0xa2, 0x0a, 0xaf, 0xe8, 0xb0, 0xb4, 0xac, 0xc3, 0xf2, 0x6b, - 0xc3, 0x4b, 0x71, 0x60, 0x15, 0xee, 0x73, 0x99, 0xa5, 0x3a, 0xb0, 0xc0, 0xef, 0x17, 0xc1, 0x09, - 0x4e, 0x70, 0x0a, 0x27, 0x8f, 0x41, 0x10, 0xe1, 0x4c, 0xf4, 0xd8, 0x20, 0x97, 0x35, 0xe8, 0xed, - 0xa7, 0xba, 0xc2, 0x32, 0xef, 0x2b, 0x80, 0x8e, 0x68, 0x3e, 0x4d, 0x24, 0x9b, 0x20, 0x05, 0x78, - 0x9b, 0xb0, 0x40, 0xe3, 0x6e, 0xcb, 0x58, 0x96, 0x54, 0x91, 0x9d, 0x26, 0x65, 0x30, 0x96, 0x5a, - 0xe5, 0x34, 0x88, 0x2d, 0xa1, 0x54, 0x8f, 0x09, 0xb8, 0x20, 0xc4, 0xa0, 0xb7, 0x09, 0x97, 0x1c, - 0xd6, 0x78, 0x15, 0xb7, 0x4d, 0x10, 0xd4, 0x72, 0xf2, 0x02, 0x6b, 0x3a, 0x1d, 0x18, 0x79, 0xbe, - 0x15, 0xaf, 0xee, 0x95, 0x69, 0xf6, 0x5c, 0x6e, 0x1e, 0x23, 0x51, 0xf4, 0x49, 0xea, 0x17, 0x2f, - 0x1a, 0xf4, 0xae, 0x3a, 0xf6, 0x03, 0xc7, 0xe4, 0xd3, 0xb1, 0x0a, 0xcb, 0xfc, 0x4a, 0x5a, 0x07, - 0x7c, 0x7f, 0x02, 0x2b, 0x06, 0xc3, 0xdc, 0x0f, 0xa1, 0x7f, 0xc4, 0x8f, 0xab, 0x59, 0x10, 0x0c, - 0xd6, 0x5e, 0x5e, 0xb7, 0xeb, 0x2f, 0xaf, 0xbd, 0x7b, 0x70, 0x89, 0xb3, 0xaf, 0xda, 0xbd, 0x54, - 0x95, 0xaf, 0xb5, 0xce, 0xce, 0xd7, 0xbc, 0xdb, 0x20, 0x9c, 0x61, 0x4e, 0xf3, 0x5e, 0x5f, 0xc1, - 0x45, 0xa6, 0xdd, 0x0c, 0xc3, 0xd3, 0x83, 0x00, 0x9b, 0x8d, 0xf6, 0x39, 0xd8, 0x58, 0x33, 0x6c, - 0xd0, 0xd0, 0x2c, 0xc2, 0x6a, 0xc2, 0x6d, 0x19, 0xff, 0xbe, 0x26, 0xa4, 0xa1, 0x79, 0xc2, 0x5f, - 0xc1, 0x1a, 0x63, 0x1f, 0x65, 0xa1, 0xe5, 0xb3, 0x5e, 0xcc, 0x9c, 0x57, 0xe1, 0x72, 0x6d, 0x74, - 0x9e, 0x56, 0x3d, 0x93, 0xb0, 0x35, 0xf2, 0xb4, 0x67, 0x12, 0xb6, 0x96, 0x3d, 0x47, 0xb6, 0xf6, - 0x91, 0x8a, 0x3d, 0x9c, 0x00, 0xa9, 0x79, 0x5d, 0x55, 0xf0, 0xd3, 0x76, 0x82, 0x9f, 0x4b, 0x94, - 0x2e, 0x36, 0xc6, 0x3e, 0xbb, 0x38, 0xc5, 0x79, 0x62, 0x1f, 0x26, 0xe4, 0xce, 0x2a, 0xab, 0x7d, - 0x94, 0x64, 0x67, 0x77, 0x5f, 0x03, 0x61, 0x93, 0xf2, 0x00, 0xff, 0xd6, 0xa2, 0x51, 0x55, 0xa6, - 0x7e, 0xfa, 0xaa, 0xd6, 0x61, 0x3e, 0x3d, 0x92, 0x79, 0x1e, 0x85, 0xda, 0x62, 0x19, 0x58, 0x7c, - 0x50, 0xfb, 0xed, 0xca, 0x4f, 0xad, 0x0a, 0x8f, 0x3d, 0xf4, 0x8b, 0x7e, 0x7d, 0xa1, 0x24, 0xaa, - 0xa7, 0xa8, 0x47, 0x93, 0xe5, 0xe9, 0x2b, 0xf2, 0x7e, 0xa1, 0xa3, 0xc9, 0xb2, 0xb0, 0xee, 0xcd, - 0xe7, 0x33, 0xc6, 0xd5, 0x1e, 0xa2, 0x1b, 0x52, 0x43, 0x80, 0x09, 0xe9, 0x6e, 0x94, 0x8c, 0xb5, - 0x7d, 0x7a, 0x0b, 0x16, 0x15, 0x58, 0x05, 0x4f, 0x07, 0xc7, 0x99, 0xcc, 0xad, 0xe1, 0x06, 0xbe, - 0x8d, 0xf2, 0x0e, 0xec, 0x00, 0xe8, 0x1c, 0x9a, 0x75, 0xf6, 0x8f, 0xf6, 0x4e, 0x0a, 0xbc, 0xed, - 0x30, 0xa4, 0xa6, 0x81, 0xdf, 0xc0, 0xea, 0xc3, 0x87, 0x5f, 0xf9, 0xb2, 0x88, 0xbe, 0x91, 0x2f, - 0x24, 0x51, 0x7a, 0x1a, 0x85, 0xec, 0x52, 0x7b, 0xbe, 0x02, 0xa8, 0x5e, 0x4e, 0xaf, 0xc0, 0xf8, - 0xa7, 0x4a, 0x0c, 0xe1, 0x06, 0x5a, 0x73, 0x2b, 0x86, 0xee, 0xfc, 0xef, 0x1a, 0x0c, 0x76, 0xa7, - 0x4f, 0xe2, 0x68, 0xb4, 0xb9, 0xbb, 0x23, 0xee, 0xd2, 0xef, 0x6e, 0xa8, 0x0c, 0x7b, 0xb9, 0xfe, - 0x90, 0x86, 0x98, 0x5d, 0xbf, 0x32, 0xf3, 0xbe, 0x46, 0x2d, 0xec, 0x82, 0xf8, 0x88, 0x7e, 0xb7, - 0xa4, 0x62, 0x5a, 0x71, 0xb5, 0x22, 0x73, 0x22, 0xea, 0xf5, 0xe1, 0x6c, 0x83, 0x19, 0xe1, 0x6e, - 0xf5, 0xab, 0x9f, 0xcb, 0xb5, 0x07, 0x54, 0xb3, 0xb3, 0xdb, 0xd5, 0x08, 0x33, 0xbb, 0xf2, 0xb7, - 0xf6, 0xec, 0x4e, 0x70, 0x60, 0xcf, 0x5e, 0x8b, 0x0f, 0x2f, 0x88, 0x0f, 0xf5, 0x4f, 0x4c, 0xf2, - 0x52, 0x5c, 0x71, 0xf4, 0xd0, 0xc4, 0xd9, 0xeb, 0x57, 0x67, 0xf0, 0x35, 0xe6, 0xd1, 0xde, 0xd9, - 0xcc, 0x5b, 0x76, 0x72, 0xfd, 0x4a, 0x1d, 0x5d, 0x63, 0x9e, 0xef, 0xfa, 0xec, 0x39, 0x6c, 0x35, - 0xb5, 0x99, 0xaf, 0x69, 0x95, 0x66, 0x9e, 0x0c, 0x96, 0xcd, 0xbc, 0x6d, 0xea, 0x6c, 0xe6, 0x5d, - 0xcb, 0x76, 0x41, 0x6c, 0x01, 0x54, 0x06, 0x4b, 0x58, 0x13, 0xb9, 0xe6, 0x6e, 0xfd, 0x5a, 0x43, - 0x8b, 0x19, 0xe4, 0x03, 0x98, 0x53, 0xc9, 0xb1, 0xd0, 0xf9, 0x91, 0x93, 0x82, 0xaf, 0x5f, 0xae, - 0x61, 0x75, 0xc7, 0x5b, 0xad, 0xb7, 0x5a, 0xe2, 0xbe, 0xf5, 0x4b, 0x5f, 0xd2, 0xbf, 0x97, 0x9a, - 0x5f, 0x2a, 0xa9, 0xa1, 0xae, 0x9f, 0xf0, 0x8c, 0x49, 0xb3, 0x72, 0xbf, 0xfe, 0xbb, 0xe1, 0x97, - 0x1a, 0x9f, 0x19, 0x9d, 0x34, 0xda, 0xac, 0x6e, 0x99, 0x47, 0x35, 0x66, 0x7b, 0xea, 0x8f, 0x78, - 0xcc, 0xf6, 0xcc, 0xbc, 0xbf, 0xf1, 0x2e, 0x88, 0xf7, 0x60, 0x4e, 0x3d, 0x06, 0x32, 0xa2, 0x71, - 0x5e, 0x1f, 0x19, 0xd1, 0xb8, 0x0f, 0x8b, 0x68, 0x63, 0x16, 0xf7, 0x64, 0x69, 0xec, 0xae, 0xad, - 0x1c, 0x8e, 0xb1, 0xb7, 0x95, 0xa3, 0x66, 0xa2, 0x2d, 0xcd, 0x2e, 0x8b, 0x9a, 0x66, 0x1b, 0xab, - 0x5d, 0xd3, 0xec, 0xd2, 0xee, 0xfe, 0x99, 0xbd, 0x35, 0xe9, 0xb8, 0x68, 0xd8, 0x9a, 0xaa, 0x9e, - 0xda, 0xb0, 0x35, 0x56, 0x91, 0xd2, 0xbb, 0xf0, 0x56, 0x4b, 0xf8, 0xd6, 0x93, 0x54, 0x36, 0x17, - 0x3f, 0xaa, 0x77, 0x72, 0x8d, 0xc6, 0xcb, 0x27, 0x35, 0x1b, 0x1e, 0x3f, 0x87, 0x65, 0x37, 0xbb, - 0x15, 0xd7, 0x1b, 0x7e, 0x8c, 0x58, 0x1d, 0xe4, 0x1f, 0x9d, 0xd0, 0x6a, 0x06, 0xb4, 0x99, 0x54, - 0x29, 0xea, 0x2c, 0x93, 0x4e, 0xb2, 0x3c, 0xcb, 0x64, 0x2d, 0xb3, 0x75, 0xc7, 0xe4, 0xc3, 0x3e, - 0xcb, 0x87, 0x73, 0xe4, 0x5f, 0x3e, 0xa9, 0xb9, 0x51, 0xd3, 0xc9, 0xf8, 0xbc, 0x34, 0xbb, 0xb2, - 0xca, 0x04, 0x5d, 0x6f, 0x6e, 0x3c, 0x61, 0xd5, 0x64, 0x4b, 0x1b, 0x56, 0x6d, 0x5b, 0xd4, 0x97, - 0x4f, 0x6a, 0xb6, 0x6d, 0x4b, 0x55, 0x49, 0x34, 0xb6, 0x65, 0xa6, 0x7e, 0x69, 0x6c, 0xcb, 0x6c, - 0xd9, 0xd1, 0xbb, 0x20, 0xb6, 0x61, 0x60, 0x8a, 0x7f, 0xe6, 0x10, 0xd4, 0x4b, 0x8e, 0xeb, 0xc3, - 0xd9, 0x06, 0xc7, 0xc8, 0x30, 0x2b, 0x2c, 0x7b, 0x87, 0xda, 0x11, 0xfb, 0xb5, 0x86, 0x16, 0xcb, - 0xd0, 0xcf, 0xa9, 0xa2, 0x93, 0x39, 0xcb, 0x4e, 0x0d, 0x6a, 0xbd, 0x11, 0xcb, 0x0c, 0xbc, 0x0d, - 0x5d, 0xfa, 0x6d, 0x83, 0xb0, 0xfe, 0x6b, 0x05, 0x3d, 0xe9, 0x25, 0x07, 0x67, 0x1b, 0x1f, 0xe3, - 0xb5, 0xcd, 0xca, 0xeb, 0x31, 0x84, 0x59, 0xf9, 0x8c, 0x83, 0xf7, 0x2e, 0x88, 0x4f, 0x60, 0xc1, - 0x4a, 0x9b, 0x84, 0x5e, 0xdc, 0x6c, 0x2a, 0xb5, 0xbe, 0xde, 0xd4, 0x64, 0x6f, 0x64, 0x95, 0xf7, - 0x18, 0xe9, 0xcd, 0x64, 0x59, 0xeb, 0xd7, 0x1a, 0x5a, 0x2c, 0x66, 0x96, 0xaa, 0x5c, 0x46, 0x5a, - 0x0a, 0x31, 0x93, 0x3c, 0xd5, 0xc7, 0xb1, 0x73, 0x1f, 0xd2, 0x7b, 0x27, 0x3f, 0x31, 0x7a, 0xdf, - 0x94, 0x13, 0x19, 0xbd, 0x6f, 0x4e, 0x69, 0x2e, 0x88, 0x8f, 0xd9, 0xc2, 0xef, 0x4e, 0xe3, 0xd8, - 0xb5, 0xf0, 0x56, 0xc9, 0xc5, 0xb5, 0xf0, 0x76, 0xa1, 0x84, 0xcc, 0x5a, 0x35, 0x46, 0x71, 0x50, - 0x1f, 0xc3, 0x94, 0x4a, 0xea, 0x63, 0x54, 0x25, 0x0e, 0x1a, 0xe3, 0x13, 0x2e, 0x3d, 0xf0, 0xd9, - 0xbb, 0x66, 0x13, 0xbb, 0xe7, 0x6e, 0xbd, 0xa9, 0xc9, 0xac, 0xe7, 0x6d, 0xe8, 0x62, 0x74, 0x6c, - 0xf4, 0xcc, 0x8a, 0x9c, 0x8d, 0x9e, 0xd9, 0xe1, 0xb3, 0xea, 0x42, 0x9e, 0xd2, 0xd4, 0x24, 0x2c, - 0x07, 0x79, 0xc9, 0xc1, 0xd9, 0x21, 0x8f, 0xfe, 0x6d, 0xb5, 0x71, 0x60, 0x4e, 0x15, 0xc1, 0x84, - 0x3c, 0xb5, 0x52, 0x82, 0x77, 0xe1, 0xc9, 0x1c, 0xbd, 0x03, 0xf8, 0xd9, 0xff, 0x07, 0x00, 0x00, - 0xff, 0xff, 0x1d, 0xf3, 0xd3, 0xa0, 0x10, 0x47, 0x00, 0x00, + 0x72, 0x7a, 0x5f, 0x7c, 0x7c, 0xc5, 0x4f, 0xb5, 0x28, 0xe9, 0x89, 0xd6, 0x7a, 0xb5, 0xb3, 0xf1, + 0x4a, 0x96, 0x63, 0xda, 0xd6, 0x3a, 0xb6, 0x57, 0x8e, 0xb1, 0xa6, 0x49, 0x79, 0x4d, 0xc4, 0xb2, + 0xe9, 0xa1, 0x24, 0xc3, 0xc8, 0x02, 0x9b, 0xd1, 0x9b, 0xe6, 0xe3, 0x98, 0xf3, 0x66, 0x26, 0x33, + 0xf3, 0x28, 0xd1, 0xb7, 0xe4, 0xb4, 0x80, 0x11, 0xe4, 0xb0, 0x40, 0x90, 0xcd, 0x31, 0xc9, 0x21, + 0xc8, 0x35, 0xa7, 0x04, 0xb9, 0xe4, 0x92, 0x53, 0xfe, 0x48, 0xb2, 0x97, 0x5c, 0x72, 0x0d, 0x82, + 0xaa, 0xae, 0xee, 0xe9, 0x9e, 0x37, 0x7c, 0x94, 0x6c, 0xe5, 0x40, 0x68, 0xaa, 0xba, 0xba, 0xba, + 0xba, 0xba, 0xba, 0xaa, 0xba, 0xba, 0x9f, 0x60, 0xa9, 0x3c, 0xcd, 0x64, 0xb1, 0x95, 0xe5, 0x69, + 0x99, 0x8a, 0x1e, 0x01, 0xde, 0x6f, 0x5b, 0xb0, 0xb2, 0x93, 0x26, 0x65, 0x10, 0x25, 0x32, 0xdf, + 0x4f, 0xf3, 0x52, 0x08, 0xe8, 0x26, 0xc1, 0x44, 0x0e, 0x5b, 0x37, 0x5a, 0xb7, 0x06, 0x3e, 0x7d, + 0x8b, 0x4d, 0x58, 0x3c, 0x4a, 0x8b, 0x12, 0xdb, 0x87, 0xed, 0x1b, 0xad, 0x5b, 0x3d, 0xdf, 0xc0, + 0xe2, 0xf7, 0x60, 0x65, 0x64, 0x33, 0x18, 0x76, 0x88, 0xc0, 0x45, 0x22, 0x07, 0x1a, 0x77, 0x94, + 0xc6, 0xc3, 0x2e, 0x71, 0x36, 0xb0, 0xb8, 0x02, 0x0b, 0xc8, 0x6d, 0x6f, 0x7f, 0xd8, 0xa3, 0x16, + 0x86, 0xbc, 0xf7, 0x60, 0xf5, 0x5e, 0x72, 0x12, 0xe5, 0x69, 0x32, 0x91, 0x49, 0xf9, 0x28, 0xc8, + 0xc5, 0x3a, 0x74, 0x64, 0x72, 0xc2, 0xa2, 0xe1, 0xa7, 0xd8, 0x80, 0xde, 0x49, 0x10, 0x4f, 0x25, + 0x89, 0x35, 0xf0, 0x15, 0xe0, 0xfd, 0x31, 0x2c, 0x3d, 0x4a, 0xe3, 0xe9, 0x44, 0xde, 0x4f, 0xa7, + 0x49, 0xf3, 0x94, 0xae, 0xc3, 0x60, 0x82, 0x8d, 0xfb, 0x41, 0x79, 0xc4, 0x9d, 0x2b, 0x04, 0x8a, + 0x9b, 0xcb, 0x20, 0xfc, 0x3c, 0x89, 0x4f, 0x69, 0x3e, 0x8b, 0xbe, 0x81, 0xbd, 0x9b, 0xb0, 0xf2, + 0x65, 0x10, 0x95, 0x51, 0x32, 0x3e, 0x28, 0x83, 0x72, 0x5a, 0xa0, 0xfc, 0xb9, 0x0c, 0x8a, 0x34, + 0xe1, 0x01, 0x18, 0xf2, 0x5e, 0x87, 0x15, 0x7f, 0x9a, 0x24, 0x15, 0xe1, 0x75, 0x18, 0x14, 0x65, + 0x90, 0x97, 0x32, 0xdc, 0x2e, 0x99, 0xb6, 0x42, 0x78, 0x7f, 0xdd, 0x02, 0x78, 0x20, 0xf3, 0x09, + 0x13, 0x6f, 0xc2, 0xa2, 0x7c, 0x1a, 0x95, 0x3b, 0x69, 0xa8, 0x04, 0xef, 0xf9, 0x06, 0xb6, 0x46, + 0x6c, 0xdb, 0x23, 0x8a, 0x21, 0xf4, 0x27, 0xb2, 0x28, 0x82, 0xb1, 0x24, 0xa9, 0x07, 0xbe, 0x06, + 0xdd, 0xa1, 0xbb, 0xb5, 0xa1, 0xc5, 0xcb, 0x00, 0x87, 0x51, 0x12, 0x15, 0x47, 0xd4, 0xac, 0x56, + 0xc1, 0xc2, 0x78, 0xff, 0xdd, 0x82, 0x35, 0x63, 0x25, 0x2c, 0x5f, 0x93, 0x52, 0x6f, 0xc0, 0x92, + 0x59, 0xf6, 0xbd, 0x5d, 0x16, 0xce, 0x46, 0xe1, 0x7a, 0x65, 0x47, 0x41, 0xa1, 0xe5, 0x53, 0x80, + 0xd8, 0x82, 0xfe, 0x13, 0xa5, 0x52, 0x92, 0x6d, 0xe9, 0xce, 0xc6, 0x96, 0xb2, 0x55, 0x47, 0xd1, + 0xbe, 0x26, 0x42, 0xfa, 0x5c, 0x69, 0x96, 0x84, 0xad, 0xe8, 0x1d, 0x7d, 0xfb, 0x9a, 0x48, 0xbc, + 0x05, 0x50, 0xca, 0x7c, 0x12, 0x25, 0x41, 0x29, 0xc3, 0xe1, 0x02, 0x75, 0xb9, 0xc8, 0x5d, 0x2a, + 0x95, 0xfb, 0x16, 0x91, 0xf7, 0x77, 0xf6, 0xc6, 0xd8, 0x4b, 0x0e, 0x53, 0xb1, 0x05, 0x03, 0x33, + 0x13, 0x9a, 0xf5, 0xd2, 0x9d, 0x75, 0xe6, 0x61, 0x08, 0xfd, 0x8a, 0x04, 0x55, 0x3e, 0xca, 0x65, + 0xa0, 0x54, 0x8e, 0xaa, 0xe8, 0xf8, 0x15, 0x82, 0x14, 0x91, 0x86, 0x7b, 0xbb, 0x46, 0x11, 0x08, + 0x88, 0x2d, 0x58, 0x28, 0x48, 0x16, 0xd6, 0xc3, 0x95, 0xfa, 0x00, 0x2c, 0x29, 0x53, 0x79, 0x7f, + 0xd9, 0x85, 0x81, 0x69, 0xfb, 0xee, 0x4b, 0x12, 0x4d, 0x2a, 0x93, 0x51, 0x00, 0x9a, 0x12, 0x7d, + 0xec, 0xed, 0xb2, 0xb9, 0x68, 0x50, 0xdc, 0x82, 0x35, 0xfa, 0xdc, 0x9f, 0xc6, 0xf1, 0x7e, 0x1a, + 0x47, 0xa3, 0x53, 0xb6, 0x98, 0x3a, 0x1a, 0xcd, 0xea, 0x49, 0x9a, 0x1f, 0x47, 0xc9, 0x78, 0x37, + 0xca, 0x49, 0xed, 0x03, 0xdf, 0xc2, 0xa0, 0xbc, 0xd3, 0x42, 0xe6, 0xc3, 0xbe, 0x92, 0x17, 0xbf, + 0x71, 0x8b, 0x97, 0xe5, 0xe9, 0x70, 0x91, 0x36, 0x1d, 0x7e, 0xe2, 0x46, 0x18, 0xa5, 0x93, 0x49, + 0x90, 0x84, 0xc5, 0x70, 0x70, 0xa3, 0x83, 0xae, 0x43, 0xc3, 0xc8, 0x21, 0xc8, 0xc7, 0xc5, 0x10, + 0x08, 0x4f, 0xdf, 0xe2, 0x36, 0x6a, 0x36, 0x2f, 0x8b, 0xe1, 0xd2, 0x8d, 0x8e, 0x65, 0x1a, 0x8e, + 0x97, 0xf3, 0x15, 0x89, 0xb8, 0xa9, 0x1c, 0xca, 0x32, 0x51, 0x5e, 0x66, 0x4a, 0xd7, 0xe9, 0x28, + 0x3f, 0xf3, 0x0e, 0x2c, 0x9f, 0x54, 0x1e, 0xa5, 0x18, 0xae, 0x50, 0x0f, 0xc1, 0x3d, 0x2c, 0x67, + 0xe3, 0x3b, 0x74, 0xe2, 0x6d, 0x58, 0x88, 0x83, 0xc7, 0x32, 0x2e, 0x86, 0xab, 0xd4, 0xe3, 0x7a, + 0x5d, 0x9a, 0xad, 0x4f, 0xa9, 0xf9, 0x5e, 0x52, 0xe6, 0xa7, 0x3e, 0xd3, 0x6e, 0xfe, 0x0c, 0x96, + 0x2c, 0x34, 0xea, 0xe4, 0x58, 0x9e, 0x6a, 0xb7, 0x77, 0x2c, 0x4f, 0x9b, 0xdd, 0xde, 0xdd, 0xf6, + 0x7b, 0x2d, 0xef, 0x9f, 0x5b, 0xb0, 0xe6, 0x7f, 0xb4, 0xab, 0x24, 0x3a, 0x48, 0xa7, 0xf9, 0x88, + 0xdc, 0xf7, 0x24, 0x4d, 0xa2, 0x32, 0xcd, 0x8b, 0x61, 0x4b, 0x69, 0x50, 0xc3, 0xd5, 0xea, 0xb7, + 0xed, 0xd5, 0xbf, 0x02, 0x0b, 0x87, 0xc5, 0x83, 0xd3, 0x4c, 0x1b, 0x05, 0x43, 0xa8, 0xef, 0x2c, + 0x35, 0x2e, 0x9c, 0xbe, 0xcd, 0x2a, 0xf6, 0xac, 0x55, 0x1c, 0x42, 0xff, 0x58, 0x9e, 0xe6, 0xb8, + 0x41, 0xd5, 0xb2, 0x6b, 0xd0, 0xf1, 0xac, 0xfd, 0x9a, 0x67, 0x3d, 0x85, 0xc1, 0x7e, 0x1a, 0x2a, + 0xd1, 0x1b, 0x8d, 0xf9, 0x0a, 0x2c, 0x14, 0x34, 0x25, 0xed, 0xf7, 0x14, 0x84, 0xf8, 0x30, 0x8f, + 0x4e, 0x64, 0xae, 0xc5, 0x55, 0x90, 0xb8, 0x05, 0x9d, 0xfc, 0x71, 0x58, 0xdb, 0x4b, 0x35, 0xed, + 0xf8, 0x48, 0xe2, 0xfd, 0x79, 0x1b, 0xfa, 0xfb, 0x69, 0x78, 0x90, 0xc9, 0x91, 0xb8, 0x0d, 0x7d, + 0xb5, 0x86, 0x4a, 0x5b, 0xd5, 0x36, 0x37, 0xc2, 0xf9, 0x9a, 0x40, 0xbc, 0x09, 0x60, 0xf6, 0x52, + 0x31, 0x6c, 0x3b, 0xe4, 0x95, 0x57, 0xb0, 0x68, 0xc4, 0x1d, 0x63, 0x11, 0x1d, 0xa2, 0xde, 0xac, + 0x98, 0xe3, 0xe8, 0x4d, 0xf6, 0x80, 0xba, 0x38, 0x19, 0x65, 0x53, 0x9a, 0x48, 0xcf, 0xa7, 0x6f, + 0x9c, 0xf3, 0x44, 0x4e, 0xd2, 0x5c, 0xed, 0xbe, 0x9e, 0xcf, 0xd0, 0xf7, 0xb1, 0x9d, 0x3f, 0x6b, + 0xd3, 0x02, 0xb0, 0x83, 0x37, 0xae, 0xba, 0x65, 0xbb, 0x6a, 0x2b, 0xc4, 0xb4, 0xdd, 0x10, 0x53, + 0x05, 0xa5, 0x8e, 0x13, 0x94, 0xaa, 0xf0, 0xde, 0xb5, 0xc3, 0xbb, 0xf6, 0x80, 0x18, 0xf5, 0x3b, + 0xda, 0x03, 0xee, 0x9b, 0x40, 0xf5, 0x20, 0x9a, 0x48, 0xb6, 0x9d, 0x0a, 0x21, 0x3e, 0x84, 0xb5, + 0x91, 0xeb, 0x0a, 0x87, 0x7d, 0xd2, 0xe2, 0x59, 0x8e, 0xb2, 0x4e, 0x5e, 0x85, 0x3a, 0x1a, 0x60, + 0xd1, 0x0e, 0x75, 0x88, 0xf1, 0xfe, 0xb3, 0x45, 0x86, 0x40, 0x1e, 0xdf, 0xf8, 0xe8, 0x96, 0xed, + 0xa3, 0x05, 0x74, 0x8f, 0xa3, 0x24, 0xe4, 0xe9, 0xd3, 0x37, 0x72, 0x0d, 0xb2, 0xe8, 0x91, 0xcc, + 0x8b, 0xc8, 0xcc, 0xdf, 0xc2, 0x88, 0x55, 0x68, 0x9f, 0x4c, 0x78, 0xfe, 0xed, 0x93, 0x89, 0x1b, + 0x1b, 0x7a, 0xf5, 0xd8, 0xe0, 0x41, 0xb7, 0xc8, 0xe4, 0x88, 0x03, 0xd5, 0xaa, 0x6b, 0x20, 0x3e, + 0xb5, 0x89, 0x5b, 0x26, 0x52, 0xf4, 0x9d, 0x50, 0x64, 0xd6, 0x4f, 0xc7, 0x08, 0x5c, 0xb1, 0x2c, + 0x0d, 0x3f, 0x0b, 0xcc, 0x74, 0x35, 0xe8, 0xfd, 0x6d, 0x1b, 0x06, 0x7b, 0xe4, 0xd5, 0x71, 0xb6, + 0xab, 0xd0, 0x8e, 0x42, 0x9e, 0x6a, 0x3b, 0x0a, 0x29, 0x65, 0x0b, 0x72, 0x99, 0x94, 0x26, 0x6c, + 0x18, 0x58, 0xed, 0xe2, 0x2c, 0x7d, 0x10, 0x8c, 0x95, 0x19, 0x0f, 0x7c, 0x03, 0x63, 0xc4, 0xc1, + 0xef, 0xdd, 0x68, 0x2c, 0x8b, 0x12, 0x03, 0x19, 0x36, 0xdb, 0x28, 0x94, 0x88, 0x27, 0xcb, 0x73, + 0xd7, 0x20, 0xf6, 0x3d, 0x89, 0xf2, 0x72, 0x1a, 0xc4, 0x07, 0xd1, 0x37, 0x6a, 0xfd, 0x3b, 0xbe, + 0x8d, 0xb2, 0x1c, 0x6a, 0xdf, 0x71, 0xa8, 0x66, 0x1e, 0x2f, 0xda, 0xa1, 0xfe, 0x5b, 0x1b, 0x16, + 0x59, 0xa9, 0x85, 0xf8, 0x11, 0x74, 0x70, 0x1f, 0xaa, 0xe8, 0xbf, 0xa6, 0x6d, 0x2e, 0x9b, 0x52, + 0xab, 0x8f, 0x6d, 0xe2, 0x26, 0xf4, 0x1e, 0xc7, 0xe9, 0xe8, 0x98, 0x38, 0x55, 0x69, 0xc6, 0x47, + 0xf1, 0x71, 0x94, 0x2a, 0x32, 0xd5, 0x2e, 0x6e, 0x9b, 0x0d, 0xdc, 0x21, 0x4a, 0x1d, 0x4c, 0xee, + 0x13, 0x52, 0x91, 0x32, 0x85, 0x78, 0x1d, 0xfa, 0x89, 0x2c, 0x31, 0x74, 0xb2, 0x33, 0xbb, 0xc4, + 0xc4, 0x9f, 0x29, 0xac, 0xa2, 0xd6, 0x34, 0x62, 0x0b, 0x8d, 0x3c, 0x96, 0xc5, 0x69, 0x51, 0xca, + 0x09, 0xed, 0xaf, 0xca, 0x8c, 0x3e, 0x2e, 0x14, 0xb1, 0x45, 0x81, 0xe6, 0x58, 0x46, 0x13, 0x59, + 0x94, 0xc1, 0x24, 0x63, 0xa5, 0x57, 0x08, 0x67, 0xd3, 0xa9, 0xce, 0x67, 0x6d, 0x3a, 0x66, 0x5d, + 0x27, 0xf7, 0x0e, 0x60, 0x51, 0x2b, 0x49, 0xbc, 0x02, 0xbd, 0x29, 0xb9, 0x8f, 0x19, 0x25, 0x3e, + 0x44, 0xb4, 0xaf, 0x5a, 0xd1, 0x12, 0x3e, 0x4d, 0x83, 0x70, 0xfb, 0x44, 0xe6, 0xda, 0xd7, 0xf4, + 0x7c, 0x1b, 0xe5, 0x85, 0xc4, 0x94, 0x3a, 0xe1, 0xf2, 0x95, 0x69, 0x19, 0xc4, 0xc4, 0xb4, 0xeb, + 0x2b, 0x00, 0x3d, 0x4f, 0x26, 0xf3, 0x9d, 0x6c, 0x4a, 0x8e, 0xb9, 0xeb, 0x33, 0x64, 0x22, 0x56, + 0x87, 0x88, 0x55, 0xc4, 0xc2, 0xd0, 0xa2, 0xd4, 0xd5, 0x25, 0x2c, 0x43, 0xde, 0x7f, 0x74, 0x01, + 0xaa, 0xb5, 0x13, 0x9f, 0xc3, 0xd5, 0x28, 0x3d, 0x90, 0xf9, 0x49, 0x34, 0x92, 0x1f, 0x9d, 0x96, + 0xb2, 0xf0, 0xe5, 0x68, 0x9a, 0x17, 0xd1, 0x89, 0xe4, 0x58, 0x71, 0xb9, 0xbe, 0xde, 0xca, 0x10, + 0xcf, 0xea, 0x25, 0x7e, 0x01, 0x97, 0x4c, 0x53, 0x58, 0x31, 0x6b, 0xcf, 0x63, 0xd6, 0xd4, 0x43, + 0xec, 0xc0, 0xc5, 0x28, 0xfd, 0x62, 0x2a, 0xa7, 0x36, 0x9b, 0xce, 0x3c, 0x36, 0xb3, 0xf4, 0xe2, + 0x3e, 0x5c, 0x31, 0xbc, 0xd1, 0x1d, 0x56, 0x9c, 0xba, 0xf3, 0x38, 0x9d, 0xd1, 0x49, 0x4d, 0x0e, + 0x73, 0x78, 0x97, 0x57, 0xef, 0x9c, 0xc9, 0xcd, 0xf4, 0x50, 0x93, 0xbb, 0x2f, 0xf3, 0xb1, 0x3d, + 0xb9, 0x85, 0x73, 0x26, 0x57, 0xa3, 0x17, 0x3f, 0x87, 0xb5, 0x28, 0x75, 0x25, 0xe9, 0xcf, 0x63, + 0x51, 0xa7, 0x16, 0xdb, 0xb0, 0x5e, 0xc8, 0x11, 0xa6, 0x4d, 0x15, 0x87, 0xc5, 0x79, 0x1c, 0x66, + 0xc8, 0xbd, 0xff, 0x6a, 0xc1, 0xaa, 0x4b, 0xd4, 0x98, 0xe8, 0x08, 0xe8, 0x22, 0x43, 0x1d, 0x63, + 0xf0, 0xdb, 0x4a, 0x7e, 0x3a, 0x4e, 0xf2, 0xb3, 0x01, 0xbd, 0x49, 0xf0, 0x75, 0x9a, 0xb3, 0xe1, + 0x2a, 0x80, 0xb0, 0x51, 0x92, 0xaa, 0xb4, 0x0c, 0xb1, 0x08, 0x88, 0x9f, 0x42, 0x17, 0xa3, 0x02, + 0xab, 0xee, 0x87, 0x8d, 0x52, 0x6f, 0x55, 0xf2, 0x13, 0xf1, 0xe6, 0xbb, 0x30, 0xa8, 0xa4, 0x3d, + 0xc7, 0x75, 0x76, 0x6d, 0xd7, 0xf9, 0xbb, 0x16, 0x2c, 0x59, 0xde, 0x0c, 0x29, 0xab, 0xad, 0xdf, + 0xd5, 0x3b, 0xbd, 0x3a, 0x25, 0x1c, 0xc8, 0x92, 0x99, 0x58, 0x18, 0x8c, 0x16, 0x87, 0x41, 0x14, + 0x8f, 0x92, 0x92, 0x37, 0xac, 0x06, 0xc5, 0x47, 0x56, 0xe9, 0x61, 0x37, 0x28, 0x03, 0xf6, 0x8d, + 0xd7, 0x67, 0x1d, 0xa9, 0xfa, 0x44, 0x1a, 0xdf, 0xed, 0x22, 0x3e, 0x81, 0xf5, 0xa3, 0x48, 0xe6, + 0x41, 0x3e, 0x3a, 0x8a, 0x46, 0x41, 0x4c, 0x6c, 0x7a, 0xcf, 0xc0, 0x66, 0xa6, 0x97, 0xf7, 0x05, + 0x5c, 0x6e, 0x24, 0xa5, 0x00, 0x3c, 0x3e, 0x0c, 0xa6, 0x71, 0xc9, 0x13, 0xd7, 0x20, 0x4e, 0x3d, + 0x1b, 0x4f, 0x82, 0xaf, 0x55, 0x23, 0x4f, 0xbd, 0xc2, 0x78, 0xdf, 0xb6, 0x60, 0xd9, 0xf6, 0xf0, + 0xe2, 0x0f, 0x00, 0xa2, 0xa4, 0x94, 0xf9, 0x61, 0x30, 0x32, 0xd9, 0xa9, 0xb6, 0xbd, 0x3d, 0xdd, + 0xc0, 0xfe, 0xbd, 0x22, 0x14, 0x37, 0xa0, 0x53, 0x8e, 0x32, 0x8e, 0x48, 0x3a, 0x10, 0x3c, 0x18, + 0x65, 0x48, 0xe9, 0x63, 0x13, 0xa6, 0x1c, 0xe5, 0x28, 0x7b, 0x87, 0x43, 0x51, 0x9d, 0x84, 0xda, + 0xbc, 0x7f, 0x6a, 0x43, 0x9f, 0x31, 0xe8, 0x9e, 0x31, 0x3a, 0x3c, 0x8e, 0xa9, 0x44, 0xc0, 0xf3, + 0xb2, 0x51, 0x38, 0xeb, 0xe2, 0x34, 0x39, 0x90, 0x89, 0x9e, 0x98, 0x06, 0xb9, 0xc5, 0x97, 0xa3, + 0x13, 0xbd, 0xa0, 0x0c, 0x62, 0x5a, 0x71, 0x18, 0x25, 0xb8, 0xfd, 0xdf, 0x62, 0x6b, 0x36, 0xb0, + 0xd5, 0x76, 0x87, 0x6d, 0xda, 0xc0, 0xd8, 0x86, 0xe1, 0x0a, 0x01, 0x0a, 0x5f, 0x5d, 0xdf, 0xc0, + 0x68, 0x74, 0xa3, 0x38, 0x2d, 0x24, 0xe5, 0x49, 0x5d, 0x5f, 0x01, 0x94, 0x80, 0xe1, 0x07, 0x75, + 0x59, 0xa4, 0x96, 0x0a, 0x81, 0x12, 0xc6, 0x41, 0x51, 0x6e, 0x8f, 0x8e, 0x87, 0x03, 0x25, 0x21, + 0x83, 0xb8, 0x09, 0xe3, 0xa8, 0x28, 0x65, 0x32, 0x04, 0x15, 0x26, 0x14, 0x44, 0x29, 0x4d, 0x9c, + 0x16, 0x78, 0xe0, 0x59, 0x52, 0x3d, 0x18, 0xf4, 0x7e, 0xdd, 0x86, 0x55, 0x77, 0x69, 0x1a, 0x77, + 0xfc, 0x10, 0xfa, 0xf9, 0x53, 0x8a, 0x0d, 0x5a, 0x5d, 0x0c, 0xa2, 0xa8, 0xf9, 0xd3, 0xfd, 0x60, + 0x74, 0x2c, 0xcb, 0x82, 0x15, 0x56, 0x21, 0x28, 0x13, 0x7b, 0x7a, 0x2f, 0xcf, 0xf1, 0x6c, 0xc7, + 0x2a, 0xd3, 0xb0, 0xea, 0xb9, 0x9b, 0xa7, 0x59, 0xc6, 0x99, 0x16, 0xf5, 0x64, 0x04, 0x8e, 0x58, + 0xf2, 0x88, 0x4a, 0x67, 0x1a, 0xa4, 0x74, 0xc0, 0x8c, 0xa8, 0xd4, 0x56, 0x21, 0x48, 0xd9, 0x7a, + 0xc4, 0x45, 0x56, 0xb6, 0x35, 0x62, 0x69, 0x46, 0x1c, 0xe8, 0x9e, 0x8c, 0xf0, 0x7e, 0xd7, 0x81, + 0x3e, 0xa7, 0x1f, 0x74, 0x64, 0x93, 0x18, 0x31, 0x74, 0xd1, 0x4c, 0x41, 0xb8, 0x5c, 0x71, 0x34, + 0x89, 0xb4, 0xd1, 0x28, 0xa0, 0xf2, 0x1c, 0x1d, 0xdb, 0x73, 0x5c, 0x87, 0x41, 0x70, 0x12, 0x44, + 0x71, 0xf0, 0x38, 0x96, 0x3c, 0xf9, 0x0a, 0x21, 0x7e, 0x02, 0xab, 0x78, 0xb2, 0x2c, 0x76, 0xd2, + 0x49, 0x16, 0xcb, 0xd2, 0xa8, 0xa0, 0x86, 0x55, 0xf9, 0x6a, 0x10, 0x16, 0x2a, 0x5c, 0xb0, 0x2e, + 0x6c, 0x14, 0x52, 0x18, 0x47, 0x1e, 0x84, 0xac, 0x11, 0x1b, 0xa5, 0x4f, 0xb5, 0xe6, 0x4c, 0xd1, + 0xf5, 0x0d, 0x2c, 0x6e, 0xc1, 0xda, 0x93, 0x3c, 0x2a, 0xa5, 0x25, 0x88, 0xd2, 0x4c, 0x1d, 0x2d, + 0x3c, 0x58, 0x56, 0x28, 0x16, 0x45, 0x99, 0x98, 0x83, 0xc3, 0x59, 0xf1, 0xc0, 0x5f, 0xe6, 0x51, + 0x89, 0x86, 0xa8, 0xec, 0xad, 0x86, 0x45, 0xdd, 0x50, 0x3f, 0x12, 0x69, 0x59, 0xe9, 0xc6, 0x20, + 0x70, 0xa4, 0x28, 0xdd, 0x4b, 0xf6, 0xf3, 0x74, 0x9c, 0xcb, 0xa2, 0x18, 0xae, 0xa8, 0x91, 0x6c, + 0x1c, 0xae, 0x90, 0x0a, 0x80, 0xc3, 0x55, 0x65, 0xea, 0x0a, 0x42, 0x09, 0x9e, 0xc8, 0x68, 0x7c, + 0x54, 0xca, 0x70, 0x4f, 0xb5, 0xaf, 0x29, 0x09, 0x5c, 0xac, 0xf7, 0x0f, 0x6d, 0xab, 0x68, 0xc8, + 0xab, 0x5e, 0xab, 0x46, 0xb5, 0x66, 0xab, 0x51, 0x9c, 0x61, 0xb7, 0x9f, 0x25, 0xc3, 0xee, 0x3c, + 0x73, 0x86, 0xdd, 0x7d, 0x9e, 0x0c, 0xbb, 0xf7, 0xdc, 0x19, 0xf6, 0xc2, 0xf3, 0x65, 0xd8, 0xfd, + 0x5a, 0x86, 0xed, 0xfd, 0x04, 0x56, 0xf9, 0xcc, 0xe9, 0xcb, 0x3f, 0x9d, 0xca, 0xa2, 0x6c, 0x3e, + 0x7a, 0x7a, 0xef, 0xc3, 0x9a, 0xa1, 0x2b, 0xb2, 0x34, 0x29, 0xd0, 0xba, 0xf0, 0x38, 0x87, 0x28, + 0x4e, 0xa8, 0xad, 0xe3, 0x22, 0x11, 0xea, 0x66, 0xef, 0x2e, 0x0d, 0xf2, 0x69, 0x54, 0x94, 0x73, + 0x07, 0xa1, 0x62, 0xc3, 0xc4, 0x9c, 0xf9, 0xe8, 0xdb, 0xfb, 0xdf, 0x16, 0xac, 0x98, 0xce, 0x05, + 0x86, 0xae, 0xe6, 0xbe, 0xd6, 0x59, 0xb3, 0xed, 0x9c, 0x35, 0x0d, 0xd7, 0x4e, 0xc5, 0x95, 0x32, + 0x9a, 0xaa, 0xda, 0x39, 0x30, 0x27, 0xd6, 0xf9, 0xa7, 0xe3, 0xf7, 0xcc, 0x09, 0x50, 0xa9, 0xfd, + 0x46, 0x35, 0xe1, 0x4a, 0xbe, 0x17, 0x7d, 0x0a, 0xdc, 0x26, 0xcd, 0x33, 0x7f, 0xa5, 0xf9, 0x2d, + 0x9a, 0x2b, 0xa2, 0x38, 0x10, 0x6f, 0x34, 0x09, 0xe2, 0x6b, 0x22, 0xef, 0x43, 0xd8, 0x30, 0xdb, + 0xe1, 0xbb, 0xad, 0xc2, 0xb7, 0x2d, 0xb8, 0x54, 0x63, 0x41, 0x6b, 0x71, 0xfe, 0xae, 0xb2, 0x2f, + 0x69, 0xac, 0xd5, 0x71, 0x91, 0x67, 0xd4, 0xa4, 0xcf, 0x58, 0x25, 0xef, 0x2b, 0xb8, 0x5c, 0x17, + 0x46, 0x29, 0xe6, 0x43, 0x6b, 0x30, 0x4b, 0x3d, 0x9b, 0xf5, 0xd3, 0xa2, 0xa5, 0x24, 0xb7, 0x83, + 0xf7, 0xb6, 0xa5, 0x2a, 0x7b, 0x57, 0x5c, 0xaf, 0x97, 0xe0, 0x07, 0x56, 0xc1, 0xdd, 0x3b, 0xb0, + 0x04, 0x72, 0xf6, 0xc8, 0x5d, 0x4b, 0x20, 0x6b, 0xa7, 0xcc, 0x54, 0x86, 0xa9, 0x93, 0x4b, 0xea, + 0xed, 0xc3, 0xf2, 0xa3, 0xfb, 0x96, 0xae, 0xf5, 0xba, 0xb4, 0x2c, 0x3b, 0x36, 0x7a, 0x6b, 0x37, + 0xeb, 0xad, 0xe3, 0xe8, 0xed, 0x67, 0xb0, 0xa2, 0x39, 0x3e, 0xaf, 0x01, 0x7c, 0x00, 0xab, 0x46, + 0x18, 0x35, 0xb5, 0xd7, 0x60, 0xe1, 0x64, 0x62, 0x29, 0x59, 0x7b, 0x2d, 0x5b, 0x66, 0x9f, 0x49, + 0xbc, 0x5f, 0xc2, 0x3a, 0x95, 0x49, 0xec, 0xc1, 0xa9, 0x1e, 0x16, 0x97, 0x32, 0xdf, 0xce, 0xc7, + 0x05, 0x4b, 0x60, 0x61, 0xa8, 0x12, 0x4c, 0x90, 0x2e, 0xb9, 0x2a, 0x08, 0x37, 0x4f, 0x10, 0xc7, + 0x7c, 0x39, 0x86, 0x9f, 0xde, 0x0e, 0x5c, 0xb4, 0xb8, 0x9b, 0x4d, 0x32, 0x88, 0x34, 0xb2, 0x56, + 0x4d, 0x35, 0x15, 0x1b, 0xbf, 0x22, 0x41, 0x0f, 0xf7, 0xe8, 0xfe, 0x0e, 0xed, 0x75, 0x2d, 0xe1, + 0x7a, 0x55, 0x73, 0xe9, 0xa9, 0x00, 0x50, 0x95, 0x3e, 0xdb, 0x76, 0xe9, 0xd3, 0xfb, 0x09, 0xac, + 0x57, 0x9d, 0x59, 0x80, 0x86, 0xf5, 0xf2, 0x5e, 0xc1, 0x41, 0x7c, 0x39, 0x49, 0x4f, 0xcc, 0x20, + 0x4d, 0x64, 0x7f, 0x88, 0xec, 0x34, 0x59, 0xc5, 0x6e, 0x54, 0xdd, 0xc8, 0xd1, 0x37, 0x65, 0x98, + 0xc1, 0xb4, 0x30, 0x5e, 0x83, 0x00, 0xef, 0x37, 0x2d, 0xb8, 0xf8, 0xb0, 0x90, 0xf9, 0x4e, 0xfd, + 0x1e, 0xd4, 0xdc, 0xa4, 0xb6, 0xce, 0xbb, 0x49, 0x6d, 0x37, 0xdd, 0xa4, 0x52, 0x32, 0x42, 0x67, + 0x6d, 0xeb, 0xb6, 0xd5, 0x46, 0xcd, 0xbb, 0x6b, 0xf5, 0x7e, 0xdd, 0x82, 0x4b, 0x28, 0x15, 0xd7, + 0xb1, 0xe5, 0xa1, 0xcc, 0x65, 0x32, 0x52, 0x85, 0xfd, 0xa0, 0x3c, 0xd2, 0xf3, 0xc7, 0x6f, 0x54, + 0xb3, 0x2a, 0x73, 0xeb, 0xa5, 0x57, 0xd0, 0xbc, 0xcb, 0x51, 0xf1, 0x2a, 0xa6, 0x75, 0x65, 0x10, + 0xc5, 0x1c, 0x72, 0x75, 0x70, 0xb6, 0xc6, 0x64, 0x02, 0xef, 0x1f, 0x59, 0x41, 0x1f, 0x47, 0xf1, + 0x39, 0x82, 0x50, 0xea, 0x1f, 0xcb, 0xa4, 0x72, 0x5c, 0x06, 0x26, 0x7a, 0x99, 0x4f, 0x74, 0x5c, + 0xc1, 0x6f, 0x53, 0xdf, 0xe9, 0x5a, 0x37, 0x12, 0x1b, 0xd0, 0x1b, 0xe7, 0xe9, 0x34, 0xe3, 0x6b, + 0x0a, 0x05, 0x88, 0x9b, 0x46, 0xdc, 0x05, 0x27, 0xe1, 0x30, 0x72, 0x69, 0x61, 0xff, 0x04, 0x16, + 0x11, 0x87, 0x7f, 0x8d, 0xe9, 0xbb, 0x61, 0xdf, 0xb6, 0xd9, 0xdf, 0x86, 0xf5, 0x20, 0x0c, 0xa3, + 0x32, 0x4a, 0x93, 0x20, 0xfe, 0x05, 0xa2, 0x74, 0xb9, 0x74, 0x06, 0xef, 0xed, 0xc2, 0xc2, 0x43, + 0x95, 0xec, 0x0a, 0xe8, 0x7e, 0x66, 0xf1, 0xd7, 0xe1, 0xf3, 0x93, 0x20, 0x0f, 0x39, 0x2b, 0xa6, + 0x6f, 0xc4, 0x1d, 0xa4, 0x87, 0xfa, 0x54, 0x4c, 0xdf, 0xde, 0xdf, 0x2f, 0xc0, 0x8a, 0x63, 0x75, + 0x67, 0x49, 0xdb, 0x70, 0xe9, 0x33, 0x84, 0x3e, 0xe6, 0x36, 0x61, 0xa4, 0xaf, 0x51, 0x34, 0x88, + 0x96, 0x99, 0x4b, 0xaa, 0xc2, 0xf3, 0x85, 0x9f, 0xd2, 0xac, 0x8b, 0xd4, 0x57, 0x77, 0xbd, 0xea, + 0xea, 0xee, 0x3d, 0x2a, 0xaa, 0x8d, 0xca, 0xb8, 0x16, 0xaa, 0x1d, 0x09, 0xb7, 0x0e, 0x88, 0x84, + 0x43, 0xb5, 0xa2, 0x17, 0xaf, 0x42, 0x57, 0x26, 0x27, 0x45, 0xad, 0x40, 0x53, 0xbb, 0x99, 0x23, + 0x12, 0x3a, 0x7a, 0xa9, 0xfb, 0x40, 0x2a, 0xc6, 0x0c, 0x7c, 0x0d, 0xa2, 0x6f, 0x93, 0xc8, 0x35, + 0x4b, 0xa3, 0xa4, 0xe4, 0xbb, 0x43, 0x0b, 0x23, 0xb6, 0xf4, 0x4d, 0x21, 0xd0, 0x28, 0xc3, 0x26, + 0xe9, 0xec, 0xdb, 0xc2, 0xb7, 0xab, 0x8b, 0xa1, 0x25, 0x27, 0xa4, 0x35, 0xec, 0xa8, 0xea, 0x8a, + 0x68, 0x0b, 0x7a, 0x94, 0x08, 0xf2, 0x2d, 0xe3, 0xb0, 0x6e, 0x62, 0xa6, 0x87, 0x22, 0x13, 0x3f, + 0x66, 0xeb, 0x5d, 0x99, 0xb1, 0x48, 0xfc, 0x63, 0x73, 0x7e, 0xaf, 0x76, 0xaf, 0xd8, 0xac, 0xd9, + 0xa6, 0xbb, 0x24, 0x55, 0xe6, 0x5f, 0x33, 0x65, 0xfe, 0x97, 0x01, 0x0e, 0xca, 0x34, 0x3b, 0x88, + 0xc6, 0x49, 0x10, 0x0f, 0x2f, 0xaa, 0x00, 0x50, 0x61, 0xc4, 0x4d, 0xe8, 0x4f, 0xc9, 0x2e, 0x8b, + 0xa1, 0xa0, 0xa1, 0x56, 0xf4, 0x50, 0x84, 0xf5, 0x75, 0x2b, 0x1d, 0x9a, 0xd3, 0x31, 0xbd, 0xa7, + 0xb8, 0xa4, 0xcc, 0x87, 0x41, 0xc7, 0x61, 0x6c, 0xb8, 0x0e, 0x03, 0x73, 0x32, 0x6b, 0xfd, 0x9f, + 0x27, 0x27, 0xfb, 0x3e, 0xe9, 0xdc, 0x5d, 0x58, 0x26, 0x65, 0x4a, 0xae, 0xa1, 0xe9, 0x0b, 0xb6, + 0x56, 0xe3, 0x05, 0x9b, 0x1b, 0x65, 0x0e, 0x95, 0x2b, 0xc0, 0xb5, 0x3b, 0xeb, 0xb1, 0x8c, 0x4c, + 0x46, 0x69, 0x18, 0x25, 0x63, 0xed, 0xad, 0x34, 0x8c, 0x32, 0x4e, 0xf3, 0x88, 0xb7, 0x17, 0x7e, + 0x2a, 0xeb, 0x4d, 0x4a, 0x99, 0xe8, 0x67, 0x19, 0x1a, 0xc4, 0x68, 0x5d, 0xd9, 0xd5, 0xe7, 0x19, + 0x3a, 0x0b, 0xe3, 0xd9, 0x5a, 0xcd, 0x77, 0xad, 0xed, 0x99, 0xbb, 0x56, 0x73, 0xef, 0xdb, 0x71, + 0xef, 0x7d, 0xbd, 0xdf, 0xb6, 0x00, 0x2a, 0xf6, 0xcf, 0x7b, 0xdb, 0x7a, 0x98, 0xe6, 0x93, 0xa0, + 0x34, 0x97, 0xc3, 0x04, 0x89, 0x37, 0x60, 0x21, 0x25, 0x31, 0xd9, 0xf7, 0x5f, 0x9d, 0xd9, 0x1d, + 0x6a, 0x16, 0x3e, 0x93, 0xa9, 0x5b, 0x66, 0xaa, 0x73, 0xf6, 0xf4, 0x2d, 0x33, 0x42, 0xde, 0x5f, + 0xb4, 0x94, 0x13, 0x33, 0x65, 0x13, 0xa4, 0x7c, 0x9c, 0x47, 0xe1, 0xd8, 0x54, 0x0b, 0x14, 0x44, + 0xc6, 0xac, 0x7d, 0x6e, 0x3b, 0xca, 0xe8, 0xcc, 0x7a, 0x48, 0x13, 0x61, 0xd1, 0x14, 0x84, 0x7a, + 0x9f, 0x04, 0x23, 0xd6, 0x30, 0x7e, 0xa2, 0xd6, 0xc6, 0x41, 0x29, 0x9f, 0x04, 0xfa, 0xf5, 0x82, + 0x06, 0xc9, 0x8d, 0x05, 0x19, 0xdf, 0x3d, 0xe2, 0xa7, 0xf7, 0x09, 0x08, 0x14, 0x47, 0x17, 0xf0, + 0x83, 0xd1, 0xb1, 0x4c, 0x42, 0xeb, 0x5e, 0xb3, 0xe5, 0xdc, 0x6b, 0xce, 0x79, 0x2c, 0xe5, 0xfd, + 0x4d, 0x0b, 0x96, 0x2c, 0x56, 0x74, 0xdb, 0xa9, 0x3e, 0x0d, 0x9b, 0x0a, 0xe1, 0x04, 0xf2, 0x76, + 0xed, 0xd1, 0xd4, 0xf9, 0x69, 0xc0, 0x1b, 0xd0, 0xc3, 0x71, 0x0b, 0x2e, 0xdd, 0x5f, 0xb3, 0x56, + 0xc3, 0x9d, 0x89, 0xaf, 0xe8, 0xbc, 0xbf, 0x6a, 0xc1, 0x32, 0x9e, 0x5d, 0xd2, 0xf1, 0x4e, 0x9a, + 0x1c, 0x46, 0x63, 0x53, 0x85, 0x6e, 0x59, 0x55, 0xe8, 0x77, 0x61, 0x61, 0x44, 0xad, 0x7c, 0x45, + 0xf1, 0x43, 0xeb, 0xd0, 0xa3, 0x3b, 0x6e, 0xa9, 0x7f, 0xd8, 0xef, 0x28, 0x72, 0xdc, 0xad, 0x16, + 0xfa, 0xb9, 0x76, 0xeb, 0x31, 0x2c, 0xe1, 0x8c, 0xee, 0x07, 0x59, 0x86, 0x66, 0x3d, 0x93, 0x27, + 0xb5, 0x6a, 0x87, 0x99, 0x99, 0x4c, 0x8b, 0x95, 0x67, 0x32, 0x2d, 0x5b, 0xb1, 0x9d, 0x5a, 0x86, + 0x94, 0xc0, 0x06, 0xd2, 0x4c, 0xd4, 0x60, 0x5f, 0x1e, 0x45, 0x25, 0x65, 0xa6, 0x18, 0xcb, 0xa9, + 0xa2, 0x9a, 0x04, 0x31, 0x97, 0x04, 0xf4, 0x63, 0x8a, 0x19, 0x3c, 0xd2, 0xca, 0xa7, 0x35, 0xda, + 0xb6, 0xa2, 0xad, 0xe3, 0xbd, 0xdf, 0x2c, 0x40, 0x1f, 0xd7, 0x64, 0x3f, 0x0d, 0x9b, 0xae, 0x60, + 0x51, 0x66, 0x3b, 0xf1, 0xd1, 0xb0, 0x59, 0x9c, 0x8e, 0xb5, 0x38, 0xdf, 0x35, 0x4e, 0xdf, 0xa9, + 0x1d, 0xa9, 0xed, 0xb8, 0xb6, 0x9f, 0x86, 0x8d, 0x71, 0xe4, 0x0d, 0x74, 0xea, 0xec, 0x1f, 0xfa, + 0x4e, 0xc5, 0xc4, 0xf6, 0xac, 0xbe, 0x21, 0x12, 0xaf, 0x40, 0x27, 0x4e, 0xc7, 0x54, 0x1e, 0xab, + 0x68, 0x6d, 0xb3, 0xf1, 0xb1, 0x1d, 0xa5, 0x0b, 0x13, 0xfd, 0xd2, 0x07, 0x3f, 0xc5, 0xdb, 0xce, + 0x1b, 0x0b, 0x70, 0xce, 0xda, 0x4e, 0xbc, 0x73, 0xde, 0x59, 0xbc, 0xa2, 0xc3, 0xae, 0x0a, 0xd5, + 0x33, 0x99, 0x1d, 0x47, 0xdb, 0xd7, 0xaa, 0x98, 0xae, 0xe2, 0x73, 0x43, 0xc6, 0x6a, 0x42, 0xf9, + 0xdb, 0x4e, 0xf9, 0x7d, 0x65, 0x46, 0x12, 0xe3, 0xb0, 0x9c, 0xea, 0xfb, 0x16, 0x2c, 0xf2, 0xbe, + 0xd4, 0xd1, 0x5a, 0xcc, 0xee, 0x45, 0xdf, 0xd0, 0x88, 0x2f, 0xe0, 0x72, 0xd6, 0x60, 0x81, 0x05, + 0x05, 0xed, 0xa5, 0x3b, 0x2f, 0x19, 0xd5, 0xcd, 0xd2, 0xf8, 0xcd, 0x3d, 0xc5, 0x3b, 0xb0, 0x6c, + 0x35, 0x14, 0xc3, 0x75, 0x47, 0x0c, 0x6b, 0x73, 0xf9, 0x0e, 0x1d, 0x26, 0x07, 0x61, 0x52, 0x28, + 0xb7, 0x5d, 0x0c, 0x2f, 0xaa, 0x0c, 0xaa, 0xc2, 0xa0, 0xff, 0x0a, 0x93, 0xe2, 0x40, 0x06, 0xf9, + 0xe8, 0x88, 0xd2, 0x83, 0x81, 0x5f, 0x21, 0xbe, 0x4f, 0x80, 0xf6, 0x61, 0x7d, 0x3f, 0x0d, 0xdd, + 0x83, 0xa0, 0x2a, 0x75, 0x1d, 0x64, 0x72, 0x54, 0x2b, 0x75, 0xb1, 0x99, 0xfa, 0xba, 0xb9, 0xf9, + 0x40, 0xee, 0xbd, 0x0a, 0x17, 0x2d, 0x9e, 0x7c, 0xa0, 0x6b, 0x2e, 0xb4, 0xdd, 0xa2, 0xe1, 0xdd, + 0x23, 0x62, 0x33, 0xe5, 0x07, 0xc4, 0xf4, 0x3b, 0x9f, 0x12, 0xff, 0xbd, 0x65, 0x57, 0x85, 0xd2, + 0x71, 0xf1, 0x4c, 0xa5, 0x0e, 0x15, 0x82, 0xe3, 0x38, 0x7d, 0x42, 0xdc, 0x16, 0x7d, 0x86, 0x70, + 0xbd, 0x4c, 0x55, 0xb1, 0xe0, 0xc3, 0x99, 0x85, 0x21, 0xa7, 0xa1, 0x0f, 0x67, 0xe8, 0x34, 0x82, + 0x28, 0x46, 0xc1, 0x8a, 0x28, 0x19, 0xe9, 0x20, 0xac, 0x00, 0x55, 0xbd, 0x08, 0xd3, 0xa9, 0xba, + 0x50, 0x59, 0xf4, 0x19, 0x62, 0xbc, 0xcc, 0x73, 0x7e, 0xbd, 0xc5, 0x90, 0xf7, 0xaa, 0x5d, 0x0d, + 0xa2, 0x79, 0xb0, 0x2e, 0xd6, 0xd5, 0xb6, 0xc7, 0x29, 0x2c, 0xd3, 0x0e, 0xc7, 0xe4, 0x6b, 0x97, + 0xde, 0x67, 0xcd, 0x79, 0x49, 0x5a, 0x15, 0x4f, 0xda, 0x4e, 0xf1, 0x64, 0x05, 0x96, 0xac, 0x82, + 0x90, 0xf7, 0x6d, 0x07, 0x96, 0x9d, 0x52, 0xcf, 0x2a, 0xb4, 0xcd, 0x0a, 0xb5, 0xf7, 0x76, 0x51, + 0x21, 0xce, 0xfb, 0x2c, 0x5c, 0x0f, 0xdb, 0x4b, 0x60, 0xc2, 0x80, 0x87, 0x9f, 0x82, 0x23, 0x28, + 0x43, 0xd6, 0x8b, 0xb2, 0xae, 0xf3, 0xa2, 0xec, 0x75, 0xe8, 0x87, 0x2c, 0x58, 0xcf, 0x29, 0xb8, + 0xd8, 0x33, 0xf2, 0x35, 0x0d, 0x3a, 0xe4, 0x30, 0x1d, 0x1d, 0xcb, 0xdc, 0x4f, 0xd3, 0xb2, 0x7a, + 0x04, 0xe9, 0x22, 0xc5, 0x16, 0x88, 0x28, 0x09, 0xe5, 0x53, 0x74, 0x05, 0x32, 0xdf, 0x0e, 0x43, + 0xaa, 0xc9, 0xab, 0x57, 0x91, 0x0d, 0x2d, 0xe2, 0x16, 0xac, 0xc9, 0xa7, 0x72, 0x34, 0xc5, 0x3d, + 0xa8, 0xc6, 0xe5, 0x97, 0x3d, 0x75, 0x34, 0x65, 0x80, 0x72, 0xf2, 0x80, 0x9e, 0x46, 0x0c, 0xa8, + 0x90, 0x6a, 0x60, 0xf5, 0x96, 0x2f, 0x2c, 0xe8, 0x96, 0xa1, 0xe3, 0xd3, 0x37, 0x72, 0x4e, 0x33, + 0x99, 0x07, 0xf4, 0xe8, 0x56, 0xd5, 0xb6, 0x97, 0x14, 0xe7, 0x1a, 0xda, 0x2c, 0xda, 0x72, 0xb5, + 0x68, 0x5e, 0x00, 0x17, 0xef, 0x3d, 0x95, 0x23, 0x77, 0xd7, 0x9e, 0x5f, 0x9c, 0xb4, 0x0e, 0x70, + 0x6d, 0xf7, 0x00, 0xc7, 0x91, 0xaa, 0x63, 0x22, 0x95, 0xf7, 0xfb, 0x20, 0xec, 0x21, 0x78, 0xd5, + 0xaf, 0xc0, 0x02, 0xce, 0xdc, 0xb0, 0x67, 0xc8, 0x7b, 0x0c, 0xeb, 0x48, 0x7d, 0x80, 0xc1, 0xef, + 0xd9, 0xe5, 0xa9, 0xb8, 0xb5, 0x6d, 0x6e, 0xb4, 0x51, 0xca, 0x30, 0x52, 0xef, 0xbb, 0x96, 0x7d, + 0x05, 0x78, 0xaf, 0xa9, 0x49, 0xf3, 0x18, 0x95, 0x40, 0xbc, 0x7b, 0x94, 0xdd, 0x33, 0xe4, 0x3d, + 0x84, 0x15, 0x24, 0x7e, 0x74, 0x7f, 0x7e, 0xed, 0xef, 0x6c, 0x8d, 0x34, 0xcb, 0xb0, 0x0b, 0xab, + 0x9a, 0xed, 0x7c, 0x01, 0x9c, 0x57, 0xe5, 0x6d, 0xf7, 0x55, 0xb9, 0x27, 0x79, 0x26, 0x74, 0xee, + 0xfb, 0xfe, 0xea, 0x42, 0x11, 0xd4, 0xa1, 0xb2, 0x43, 0x16, 0xc6, 0x90, 0xb7, 0xa1, 0x96, 0x50, + 0x0f, 0xa3, 0x04, 0xf6, 0x6e, 0x52, 0x81, 0xdd, 0x59, 0xa9, 0x66, 0x87, 0x2b, 0xc8, 0x35, 0x3b, + 0xea, 0xf6, 0x02, 0x58, 0xfa, 0x32, 0x88, 0xca, 0x67, 0xf3, 0x9d, 0xd7, 0x61, 0x90, 0xe5, 0xe9, + 0x48, 0x16, 0xc5, 0x9e, 0x7e, 0xc4, 0x57, 0x21, 0x50, 0xea, 0x24, 0xfd, 0x24, 0x48, 0xc6, 0x6c, + 0x75, 0x0c, 0x79, 0xb7, 0x61, 0x59, 0x0d, 0xc1, 0x0a, 0x9e, 0xf3, 0x3c, 0xdf, 0xbb, 0x07, 0x2b, + 0xdb, 0x65, 0x19, 0x8c, 0x8e, 0xee, 0xf3, 0xd3, 0xc8, 0xf3, 0x95, 0x28, 0xa0, 0x1b, 0x06, 0x65, + 0x40, 0xf2, 0x2c, 0xfb, 0xf4, 0xed, 0x7d, 0x0d, 0x57, 0x8c, 0x4b, 0x75, 0xf7, 0x94, 0x5d, 0xd0, + 0xb6, 0xe2, 0x61, 0x73, 0x52, 0xe4, 0x92, 0x9e, 0x11, 0x1b, 0xdf, 0x87, 0xab, 0x33, 0x63, 0xf1, + 0x4c, 0xcf, 0x15, 0xde, 0xbb, 0x6b, 0xf9, 0x7e, 0x67, 0x05, 0x7f, 0x04, 0xcb, 0x86, 0xee, 0x57, + 0x26, 0xb3, 0xb5, 0xfa, 0x86, 0xde, 0xd0, 0x9a, 0xa4, 0xbb, 0xa8, 0x99, 0xd5, 0xe2, 0x53, 0xb1, + 0x4f, 0xb3, 0xbd, 0x0d, 0xeb, 0x69, 0x1c, 0xee, 0x38, 0x17, 0x1a, 0x8a, 0xf5, 0x0c, 0x1e, 0x69, + 0x13, 0xf9, 0x64, 0xa7, 0xe1, 0xf2, 0x63, 0x06, 0xef, 0x5d, 0xb3, 0x94, 0xa0, 0x47, 0x64, 0x61, + 0xde, 0x77, 0x84, 0xb1, 0xd3, 0x82, 0x67, 0x98, 0xa3, 0xcb, 0xd7, 0xce, 0x14, 0xbc, 0x7f, 0x69, + 0x01, 0x6c, 0x4f, 0xcb, 0x23, 0x3e, 0x71, 0x6d, 0xc2, 0x22, 0x9e, 0xe9, 0xad, 0x70, 0x68, 0x60, + 0xf5, 0x1e, 0xb3, 0x28, 0x9e, 0xa4, 0x79, 0x58, 0xbd, 0xc7, 0x54, 0x30, 0xbd, 0x83, 0x9f, 0x96, + 0x47, 0xfa, 0x30, 0x80, 0xdf, 0xb8, 0xd0, 0x72, 0x52, 0x05, 0x7b, 0x05, 0x60, 0x44, 0x2a, 0x28, + 0x98, 0x04, 0x1c, 0x66, 0x54, 0xd4, 0x77, 0x91, 0xea, 0x20, 0x31, 0x8e, 0x8a, 0x32, 0x3f, 0x2d, + 0xd3, 0x63, 0x99, 0xe8, 0xb8, 0xe5, 0x20, 0xbd, 0x80, 0xef, 0x13, 0xf6, 0xa7, 0x71, 0x6c, 0x6d, + 0x5a, 0x55, 0x5a, 0x6c, 0xd9, 0xa5, 0x45, 0x3a, 0x53, 0xeb, 0xfa, 0x04, 0x7e, 0x8a, 0x57, 0x2c, + 0x89, 0xab, 0xa4, 0xbb, 0x52, 0x85, 0x9a, 0x84, 0x77, 0x93, 0x2f, 0x15, 0xd4, 0x10, 0x55, 0x7a, + 0x45, 0x9b, 0xa5, 0x65, 0x6d, 0x96, 0x5f, 0x19, 0x59, 0x8a, 0x23, 0xab, 0xa8, 0x9f, 0xcb, 0x2c, + 0xd5, 0x89, 0x05, 0x7e, 0xbf, 0x08, 0x49, 0x70, 0x80, 0x39, 0x92, 0x3c, 0x02, 0x41, 0x84, 0x33, + 0xd9, 0x63, 0x83, 0x5e, 0x36, 0xa0, 0x77, 0x98, 0xea, 0x0a, 0xcb, 0xa2, 0xaf, 0x00, 0xda, 0xa2, + 0xf9, 0x34, 0x91, 0xec, 0x82, 0x14, 0xe0, 0x6d, 0xc3, 0x12, 0xf1, 0xdd, 0x95, 0xb1, 0x2c, 0xa9, + 0x5a, 0x3b, 0x4d, 0xca, 0x60, 0x2c, 0xb5, 0xc9, 0x69, 0x10, 0x5b, 0x42, 0xa9, 0x1e, 0x1a, 0x70, + 0x41, 0x88, 0x41, 0x6f, 0x1b, 0x2e, 0x39, 0xa2, 0xf1, 0x2c, 0x6e, 0x9b, 0x24, 0xa8, 0xe5, 0x9c, + 0x0b, 0xac, 0xe1, 0x74, 0x62, 0xe4, 0xf9, 0x56, 0xbe, 0x7a, 0x50, 0xa6, 0xd9, 0x73, 0x85, 0x79, + 0xcc, 0x44, 0x31, 0x26, 0xa9, 0x5f, 0xc3, 0x68, 0xd0, 0xbb, 0xea, 0xf8, 0x0f, 0xe4, 0xc9, 0xbb, + 0x63, 0x1d, 0x56, 0xf9, 0x05, 0xb5, 0x4e, 0xf8, 0xfe, 0x08, 0xd6, 0x0c, 0x86, 0xa5, 0x1f, 0x42, + 0xff, 0x84, 0x1f, 0x5e, 0xb3, 0x22, 0x18, 0xac, 0xbd, 0xca, 0x6e, 0xd7, 0x5f, 0x65, 0x7b, 0xf7, + 0xe0, 0x12, 0x9f, 0xbe, 0x6a, 0x77, 0x56, 0xd5, 0x79, 0xad, 0x75, 0xfe, 0x79, 0xcd, 0xbb, 0x0d, + 0xc2, 0x61, 0x33, 0x2f, 0x7a, 0x7d, 0x05, 0x17, 0x99, 0x76, 0x3b, 0x0c, 0xe7, 0x27, 0x01, 0xb6, + 0x18, 0xed, 0x67, 0x10, 0x63, 0xc3, 0x88, 0x41, 0xac, 0x59, 0x85, 0xd5, 0x80, 0xbb, 0x32, 0xfe, + 0xff, 0x1a, 0x90, 0x58, 0xf3, 0x80, 0xbf, 0x84, 0x0d, 0xc6, 0x3e, 0xcc, 0x42, 0x2b, 0x66, 0xbd, + 0x98, 0x31, 0xaf, 0xc2, 0xe5, 0x1a, 0x77, 0x1e, 0x56, 0x3d, 0xa1, 0xb0, 0x2d, 0x72, 0xde, 0x13, + 0x0a, 0xdb, 0xca, 0x9e, 0xe3, 0xb4, 0xf6, 0xa1, 0xca, 0x3d, 0x9c, 0x04, 0xa9, 0x79, 0x5e, 0x55, + 0xf2, 0xd3, 0x76, 0x92, 0x9f, 0x4b, 0x74, 0x5c, 0x6c, 0xcc, 0x7d, 0xf6, 0x71, 0x88, 0x67, 0xc9, + 0x7d, 0x98, 0x90, 0x3b, 0xab, 0x53, 0xed, 0xc3, 0x24, 0x3b, 0xbf, 0xfb, 0x06, 0x08, 0x9b, 0x94, + 0x19, 0xfc, 0x6b, 0x8b, 0xb8, 0xaa, 0x93, 0xfa, 0xfc, 0x59, 0x6d, 0xc2, 0x62, 0x7a, 0x22, 0xf3, + 0x3c, 0x0a, 0xb5, 0xc7, 0x32, 0xb0, 0x78, 0xbf, 0xf6, 0xbb, 0x96, 0x1f, 0x5b, 0x15, 0x1e, 0x9b, + 0xf5, 0x8b, 0x7e, 0x99, 0xa1, 0x34, 0xaa, 0x87, 0xa8, 0x67, 0x93, 0xe5, 0xfc, 0x19, 0x79, 0x3f, + 0xd7, 0xd9, 0x64, 0x59, 0x58, 0x77, 0xea, 0x8b, 0x19, 0xe3, 0x6a, 0x8f, 0xd4, 0x0d, 0xa9, 0x21, + 0xc0, 0x03, 0xe9, 0x7e, 0x94, 0x8c, 0xb5, 0x7f, 0x7a, 0x13, 0x96, 0x15, 0x58, 0x25, 0x4f, 0x47, + 0xa7, 0x99, 0xcc, 0x2d, 0x76, 0x03, 0xdf, 0x46, 0x79, 0x47, 0x76, 0x02, 0xf4, 0x0c, 0x96, 0x75, + 0xfe, 0x0f, 0xfa, 0xce, 0x4a, 0xbc, 0xed, 0x34, 0xa4, 0x66, 0x81, 0xdf, 0xc0, 0xfa, 0x83, 0x07, + 0x5f, 0xf9, 0xb2, 0x88, 0xbe, 0x91, 0x2f, 0xe4, 0xa0, 0xf4, 0x24, 0x0a, 0x39, 0xa4, 0xf6, 0x7c, + 0x05, 0x50, 0xbd, 0x9c, 0x5e, 0x88, 0xf1, 0xcf, 0x98, 0x18, 0xc2, 0x05, 0xb4, 0xc6, 0x56, 0x02, + 0xdd, 0xf9, 0x9f, 0x0d, 0x18, 0xec, 0x4f, 0x1f, 0xc7, 0xd1, 0x68, 0x7b, 0x7f, 0x4f, 0xdc, 0xa5, + 0xdf, 0xe4, 0x50, 0x19, 0xf6, 0x72, 0xfd, 0x91, 0x0d, 0x09, 0xbb, 0x79, 0x65, 0xe6, 0xed, 0x8d, + 0x9a, 0xd8, 0x05, 0xf1, 0x21, 0xfd, 0xa6, 0x49, 0xe5, 0xb4, 0xe2, 0x6a, 0x45, 0xe6, 0x64, 0xd4, + 0x9b, 0xc3, 0xd9, 0x06, 0xc3, 0xe1, 0x6e, 0xf5, 0x8b, 0xa0, 0xcb, 0xb5, 0xc7, 0x55, 0xb3, 0xa3, + 0xdb, 0xd5, 0x08, 0x33, 0xba, 0x8a, 0xb7, 0xf6, 0xe8, 0x4e, 0x72, 0x60, 0x8f, 0x5e, 0xcb, 0x0f, + 0x2f, 0x88, 0x0f, 0xf4, 0xcf, 0x4f, 0xf2, 0x52, 0x5c, 0x71, 0xec, 0xd0, 0xe4, 0xd9, 0x9b, 0x57, + 0x67, 0xf0, 0x35, 0xe1, 0xd1, 0xdf, 0xd9, 0xc2, 0x5b, 0x7e, 0x72, 0xf3, 0x4a, 0x1d, 0x5d, 0x13, + 0x9e, 0xef, 0x01, 0xed, 0x31, 0x6c, 0x33, 0xb5, 0x85, 0xaf, 0x59, 0x95, 0x16, 0x9e, 0x1c, 0x96, + 0x2d, 0xbc, 0xed, 0xea, 0x6c, 0xe1, 0x5d, 0xcf, 0x76, 0x41, 0xec, 0x00, 0x54, 0x0e, 0x4b, 0x58, + 0x03, 0xb9, 0xee, 0x6e, 0xf3, 0x5a, 0x43, 0x8b, 0x61, 0xf2, 0x3e, 0x2c, 0xa8, 0xc3, 0xb1, 0xd0, + 0xe7, 0x23, 0xe7, 0x08, 0xbe, 0x79, 0xb9, 0x86, 0xd5, 0x1d, 0x6f, 0xb5, 0xde, 0x6c, 0x89, 0x4f, + 0xad, 0x5f, 0x01, 0x93, 0xfd, 0xbd, 0xd4, 0xfc, 0x8a, 0x49, 0xb1, 0xba, 0x7e, 0xc6, 0x13, 0x27, + 0x2d, 0xca, 0xa7, 0xf5, 0xdf, 0x14, 0xbf, 0xd4, 0xf8, 0x04, 0xe9, 0x2c, 0x6e, 0xb3, 0xb6, 0x65, + 0x1e, 0xdc, 0x98, 0xe5, 0xa9, 0x3f, 0xf0, 0x31, 0xcb, 0x33, 0xf3, 0x36, 0xc7, 0xbb, 0x20, 0xde, + 0x85, 0x05, 0xf5, 0x50, 0xc8, 0xa8, 0xc6, 0x79, 0x99, 0x64, 0x54, 0xe3, 0x3e, 0x3a, 0xa2, 0x85, + 0x59, 0x3e, 0x90, 0xa5, 0xf1, 0xbb, 0xb6, 0x71, 0x38, 0xce, 0xde, 0x36, 0x8e, 0x9a, 0x8b, 0xb6, + 0x2c, 0xbb, 0x2c, 0x6a, 0x96, 0x6d, 0xbc, 0x76, 0xcd, 0xb2, 0x4b, 0xbb, 0xfb, 0x67, 0xf6, 0xd2, + 0xa4, 0xe3, 0xa2, 0x61, 0x69, 0xaa, 0x7a, 0x6a, 0xc3, 0xd2, 0x58, 0x45, 0x4a, 0xef, 0xc2, 0x9b, + 0x2d, 0xe1, 0x5b, 0xcf, 0x55, 0xd9, 0x5d, 0xfc, 0xa0, 0xde, 0xc9, 0x75, 0x1a, 0x2f, 0x9f, 0xd5, + 0x6c, 0x64, 0xfc, 0x1c, 0x56, 0xdd, 0xd3, 0xad, 0xb8, 0xde, 0xf0, 0x43, 0xc5, 0x6a, 0x23, 0xff, + 0xe0, 0x8c, 0x56, 0xc3, 0xd0, 0x16, 0x52, 0x1d, 0x51, 0x67, 0x85, 0x74, 0x0e, 0xcb, 0xb3, 0x42, + 0xd6, 0x4e, 0xb6, 0x2e, 0x4f, 0xde, 0xec, 0xb3, 0x72, 0x38, 0x5b, 0xfe, 0xe5, 0xb3, 0x9a, 0x1b, + 0x2d, 0x9d, 0x9c, 0xcf, 0x4b, 0xb3, 0x33, 0xab, 0x5c, 0xd0, 0xf5, 0xe6, 0xc6, 0x33, 0x66, 0x4d, + 0xbe, 0xb4, 0x61, 0xd6, 0xb6, 0x47, 0x7d, 0xf9, 0xac, 0x66, 0xdb, 0xb7, 0x54, 0x95, 0x44, 0xe3, + 0x5b, 0x66, 0xea, 0x97, 0xc6, 0xb7, 0xcc, 0x96, 0x1d, 0xbd, 0x0b, 0x62, 0x17, 0x06, 0xa6, 0xf8, + 0x67, 0x36, 0x41, 0xbd, 0xe4, 0xb8, 0x39, 0x9c, 0x6d, 0x70, 0x9c, 0x0c, 0x8b, 0xc2, 0xba, 0x77, + 0xa8, 0x1d, 0xb5, 0x5f, 0x6b, 0x68, 0xb1, 0x1c, 0xfd, 0x82, 0x2a, 0x3a, 0x99, 0xbd, 0xec, 0xd4, + 0xa0, 0x36, 0x1b, 0xb1, 0x2c, 0xc0, 0x5b, 0xd0, 0xa5, 0xdf, 0x3d, 0x08, 0xeb, 0xbf, 0x5d, 0xd0, + 0x83, 0x5e, 0x72, 0x70, 0xb6, 0xf3, 0x31, 0x51, 0xdb, 0xcc, 0xbc, 0x9e, 0x43, 0x98, 0x99, 0xcf, + 0x04, 0x78, 0xef, 0x82, 0xf8, 0x18, 0x96, 0xac, 0x63, 0x93, 0xd0, 0x93, 0x9b, 0x3d, 0x4a, 0x6d, + 0x6e, 0x36, 0x35, 0xd9, 0x0b, 0x59, 0x9d, 0x7b, 0x8c, 0xf6, 0x66, 0x4e, 0x59, 0x9b, 0xd7, 0x1a, + 0x5a, 0x2c, 0x61, 0x56, 0xaa, 0xb3, 0x8c, 0xb4, 0x0c, 0x62, 0xe6, 0xf0, 0x54, 0xe7, 0x63, 0x9f, + 0x7d, 0xc8, 0xee, 0x9d, 0xf3, 0x89, 0xb1, 0xfb, 0xa6, 0x33, 0x91, 0xb1, 0xfb, 0xe6, 0x23, 0xcd, + 0x05, 0xf1, 0x11, 0x7b, 0xf8, 0xfd, 0x69, 0x1c, 0xbb, 0x1e, 0xde, 0x2a, 0xb9, 0xb8, 0x1e, 0xde, + 0x2e, 0x94, 0x90, 0x5b, 0xab, 0x78, 0x14, 0x47, 0x75, 0x1e, 0xa6, 0x54, 0x52, 0xe7, 0x51, 0x95, + 0x38, 0x88, 0xc7, 0xc7, 0x5c, 0x7a, 0xe0, 0xbd, 0x77, 0xcd, 0x26, 0x76, 0xf7, 0xdd, 0x66, 0x53, + 0x93, 0x99, 0xcf, 0x5b, 0xd0, 0xc5, 0xec, 0xd8, 0xd8, 0x99, 0x95, 0x39, 0x1b, 0x3b, 0xb3, 0xd3, + 0x67, 0xd5, 0x85, 0x22, 0xa5, 0xa9, 0x49, 0x58, 0x01, 0xf2, 0x92, 0x83, 0xb3, 0x53, 0x1e, 0xfd, + 0xbb, 0x6b, 0x13, 0xc0, 0x9c, 0x2a, 0x82, 0x49, 0x79, 0x6a, 0xa5, 0x04, 0xef, 0xc2, 0xe3, 0x05, + 0x7a, 0x07, 0xf0, 0xd3, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xb1, 0x78, 0x55, 0xc4, 0x2c, 0x47, + 0x00, 0x00, } diff --git a/pkg/hyper/types/types.proto b/pkg/hyper/types/types.proto index 0977780e..963e550b 100644 --- a/pkg/hyper/types/types.proto +++ b/pkg/hyper/types/types.proto @@ -402,6 +402,7 @@ message UserContainer { string StopSignal = 17; repeated Ulimit ulimits = 18; string logPath = 19; + bool readOnly = 20; } message UserResource { diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD b/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD index f4b3598d..b148d5ce 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/BUILD @@ -11,6 +11,7 @@ load( go_test( name = "go_default_test", srcs = [ + "meta_test.go", "multirestmapper_test.go", "priority_test.go", "restmapper_test.go", @@ -18,8 +19,12 @@ go_test( library = ":go_default_library", tags = ["automanaged"], deps = [ + "//vendor/github.com/google/gofuzz:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", ], ) @@ -43,6 +48,7 @@ go_library( "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/conversion:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go b/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go index 9cc37297..45d850ea 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/meta.go @@ -23,6 +23,7 @@ import ( "github.com/golang/glog" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + metav1alpha1 "k8s.io/apimachinery/pkg/apis/meta/v1alpha1" "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -89,6 +90,36 @@ func Accessor(obj interface{}) (metav1.Object, error) { } } +// AsPartialObjectMetadata takes the metav1 interface and returns a partial object. +// TODO: consider making this solely a conversion action. +func AsPartialObjectMetadata(m metav1.Object) *metav1alpha1.PartialObjectMetadata { + switch t := m.(type) { + case *metav1.ObjectMeta: + return &metav1alpha1.PartialObjectMetadata{ObjectMeta: *t} + default: + return &metav1alpha1.PartialObjectMetadata{ + ObjectMeta: metav1.ObjectMeta{ + Name: m.GetName(), + GenerateName: m.GetGenerateName(), + Namespace: m.GetNamespace(), + SelfLink: m.GetSelfLink(), + UID: m.GetUID(), + ResourceVersion: m.GetResourceVersion(), + Generation: m.GetGeneration(), + CreationTimestamp: m.GetCreationTimestamp(), + DeletionTimestamp: m.GetDeletionTimestamp(), + DeletionGracePeriodSeconds: m.GetDeletionGracePeriodSeconds(), + Labels: m.GetLabels(), + Annotations: m.GetAnnotations(), + OwnerReferences: m.GetOwnerReferences(), + Finalizers: m.GetFinalizers(), + ClusterName: m.GetClusterName(), + Initializers: m.GetInitializers(), + }, + } + } +} + // TypeAccessor returns an interface that allows retrieving and modifying the APIVersion // and Kind of an in-memory internal object. // TODO: this interface is used to test code that does not have ObjectMeta or ListMeta diff --git a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go index 04f60584..84bd9cde 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go +++ b/vendor/k8s.io/apimachinery/pkg/api/validation/objectmeta.go @@ -184,10 +184,41 @@ func ValidateObjectMetaAccessor(meta metav1.Object, requiresNamespace bool, name allErrs = append(allErrs, v1validation.ValidateLabels(meta.GetLabels(), fldPath.Child("labels"))...) allErrs = append(allErrs, ValidateAnnotations(meta.GetAnnotations(), fldPath.Child("annotations"))...) allErrs = append(allErrs, ValidateOwnerReferences(meta.GetOwnerReferences(), fldPath.Child("ownerReferences"))...) + allErrs = append(allErrs, ValidateInitializers(meta.GetInitializers(), fldPath.Child("initializers"))...) allErrs = append(allErrs, ValidateFinalizers(meta.GetFinalizers(), fldPath.Child("finalizers"))...) return allErrs } +func ValidateInitializers(initializers *metav1.Initializers, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if initializers == nil { + return allErrs + } + for i, initializer := range initializers.Pending { + for _, msg := range validation.IsQualifiedName(initializer.Name) { + allErrs = append(allErrs, field.Invalid(fldPath.Child("pending").Index(i), initializer.Name, msg)) + } + } + allErrs = append(allErrs, validateInitializersResult(initializers.Result, fldPath.Child("result"))...) + if len(initializers.Pending) == 0 && initializers.Result == nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("pending"), nil, "must be non-empty when result is not set")) + } + return allErrs +} + +func validateInitializersResult(result *metav1.Status, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + if result == nil { + return allErrs + } + switch result.Status { + case metav1.StatusFailure: + default: + allErrs = append(allErrs, field.Invalid(fldPath.Child("status"), result.Status, "must be 'Failure'")) + } + return allErrs +} + // ValidateFinalizers tests if the finalizers name are valid, and if there are conflicting finalizers. func ValidateFinalizers(finalizers []string, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} @@ -226,7 +257,7 @@ func ValidateObjectMetaUpdate(newMeta, oldMeta *metav1.ObjectMeta, fldPath *fiel } func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *field.Path) field.ErrorList { - allErrs := field.ErrorList{} + var allErrs field.ErrorList if !RepairMalformedUpdates && newMeta.GetUID() != oldMeta.GetUID() { allErrs = append(allErrs, field.Invalid(fldPath.Child("uid"), newMeta.GetUID(), "field is immutable")) @@ -276,6 +307,8 @@ func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *f allErrs = append(allErrs, field.Invalid(fldPath.Child("generation"), newMeta.GetGeneration(), "must not be decremented")) } + allErrs = append(allErrs, ValidateInitializersUpdate(newMeta.GetInitializers(), oldMeta.GetInitializers(), fldPath.Child("initializers"))...) + allErrs = append(allErrs, ValidateImmutableField(newMeta.GetName(), oldMeta.GetName(), fldPath.Child("name"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetNamespace(), oldMeta.GetNamespace(), fldPath.Child("namespace"))...) allErrs = append(allErrs, ValidateImmutableField(newMeta.GetUID(), oldMeta.GetUID(), fldPath.Child("uid"))...) @@ -288,3 +321,28 @@ func ValidateObjectMetaAccessorUpdate(newMeta, oldMeta metav1.Object, fldPath *f return allErrs } + +// ValidateInitializersUpdate checks the update of the metadata initializers field +func ValidateInitializersUpdate(newInit, oldInit *metav1.Initializers, fldPath *field.Path) field.ErrorList { + var allErrs field.ErrorList + switch { + case oldInit == nil && newInit != nil: + // Initializers may not be set on new objects + allErrs = append(allErrs, field.Invalid(fldPath, nil, "field is immutable once initialization has completed")) + case oldInit != nil && newInit == nil: + // this is a valid transition and means initialization was successful + case oldInit != nil && newInit != nil: + // validate changes to initializers + switch { + case oldInit.Result == nil && newInit.Result != nil: + // setting a result is allowed + allErrs = append(allErrs, validateInitializersResult(newInit.Result, fldPath.Child("result"))...) + case oldInit.Result != nil: + // setting Result implies permanent failure, and all future updates will be prevented + allErrs = append(allErrs, ValidateImmutableField(newInit.Result, oldInit.Result, fldPath.Child("result"))...) + default: + // leaving the result nil is allowed + } + } + return allErrs +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD index b639f24c..2ce980fa 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD @@ -15,6 +15,7 @@ go_test( "group_version_test.go", "helpers_test.go", "labels_test.go", + "micro_time_test.go", "time_test.go", "types_test.go", ], @@ -38,14 +39,14 @@ go_library( "helpers.go", "labels.go", "meta.go", + "micro_time.go", + "micro_time_proto.go", "register.go", "time.go", "time_proto.go", "types.go", "types_swagger_doc_generated.go", "watch.go", - "well_known_annotations.go", - "well_known_labels.go", "zz_generated.deepcopy.go", "zz_generated.defaults.go", ], diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go index 4904fd06..5aec6308 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go @@ -46,6 +46,7 @@ limitations under the License. LabelSelectorRequirement ListMeta ListOptions + MicroTime ObjectMeta OwnerReference Preconditions @@ -175,59 +176,63 @@ func (m *ListOptions) Reset() { *m = ListOptions{} } func (*ListOptions) ProtoMessage() {} func (*ListOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{20} } +func (m *MicroTime) Reset() { *m = MicroTime{} } +func (*MicroTime) ProtoMessage() {} +func (*MicroTime) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } + func (m *ObjectMeta) Reset() { *m = ObjectMeta{} } func (*ObjectMeta) ProtoMessage() {} -func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{21} } +func (*ObjectMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } func (m *OwnerReference) Reset() { *m = OwnerReference{} } func (*OwnerReference) ProtoMessage() {} -func (*OwnerReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{22} } +func (*OwnerReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } func (m *Preconditions) Reset() { *m = Preconditions{} } func (*Preconditions) ProtoMessage() {} -func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{23} } +func (*Preconditions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } func (m *RootPaths) Reset() { *m = RootPaths{} } func (*RootPaths) ProtoMessage() {} -func (*RootPaths) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{24} } +func (*RootPaths) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{25} } func (m *ServerAddressByClientCIDR) Reset() { *m = ServerAddressByClientCIDR{} } func (*ServerAddressByClientCIDR) ProtoMessage() {} func (*ServerAddressByClientCIDR) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{25} + return fileDescriptorGenerated, []int{26} } func (m *Status) Reset() { *m = Status{} } func (*Status) ProtoMessage() {} -func (*Status) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{26} } +func (*Status) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } func (m *StatusCause) Reset() { *m = StatusCause{} } func (*StatusCause) ProtoMessage() {} -func (*StatusCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{27} } +func (*StatusCause) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } func (m *StatusDetails) Reset() { *m = StatusDetails{} } func (*StatusDetails) ProtoMessage() {} -func (*StatusDetails) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{28} } +func (*StatusDetails) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } func (m *Time) Reset() { *m = Time{} } func (*Time) ProtoMessage() {} -func (*Time) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{29} } +func (*Time) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } func (m *Timestamp) Reset() { *m = Timestamp{} } func (*Timestamp) ProtoMessage() {} -func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{30} } +func (*Timestamp) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } func (m *TypeMeta) Reset() { *m = TypeMeta{} } func (*TypeMeta) ProtoMessage() {} -func (*TypeMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{31} } +func (*TypeMeta) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } func (m *Verbs) Reset() { *m = Verbs{} } func (*Verbs) ProtoMessage() {} -func (*Verbs) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{32} } +func (*Verbs) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } func (m *WatchEvent) Reset() { *m = WatchEvent{} } func (*WatchEvent) ProtoMessage() {} -func (*WatchEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{33} } +func (*WatchEvent) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{34} } func init() { proto.RegisterType((*APIGroup)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.APIGroup") @@ -251,6 +256,7 @@ func init() { proto.RegisterType((*LabelSelectorRequirement)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.LabelSelectorRequirement") proto.RegisterType((*ListMeta)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta") proto.RegisterType((*ListOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ListOptions") + proto.RegisterType((*MicroTime)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime") proto.RegisterType((*ObjectMeta)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta") proto.RegisterType((*OwnerReference)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.OwnerReference") proto.RegisterType((*Preconditions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1.Preconditions") @@ -409,6 +415,21 @@ func (m *APIResource) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.SingularName))) i += copy(dAtA[i:], m.SingularName) + if len(m.Categories) > 0 { + for _, s := range m.Categories { + dAtA[i] = 0x3a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -1622,6 +1643,12 @@ func (m *APIResource) Size() (n int) { } l = len(m.SingularName) n += 1 + l + sovGenerated(uint64(l)) + if len(m.Categories) > 0 { + for _, s := range m.Categories { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -2105,6 +2132,7 @@ func (this *APIResource) String() string { `Verbs:` + strings.Replace(fmt.Sprintf("%v", this.Verbs), "Verbs", "Verbs", 1) + `,`, `ShortNames:` + fmt.Sprintf("%v", this.ShortNames) + `,`, `SingularName:` + fmt.Sprintf("%v", this.SingularName) + `,`, + `Categories:` + fmt.Sprintf("%v", this.Categories) + `,`, `}`, }, "") return s @@ -2880,6 +2908,35 @@ func (m *APIResource) Unmarshal(dAtA []byte) error { } m.SingularName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Categories", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Categories = append(m.Categories, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7292,151 +7349,152 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 2322 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0xcd, 0x6f, 0x23, 0x49, - 0x15, 0x4f, 0x3b, 0xb1, 0xc7, 0x7e, 0x8e, 0xf3, 0x51, 0x9b, 0x01, 0x6f, 0x04, 0x71, 0xb6, 0x77, - 0xb5, 0x9a, 0x85, 0x59, 0x9b, 0x64, 0x61, 0x35, 0x0c, 0x30, 0x90, 0x8e, 0x33, 0xa3, 0x68, 0xe7, - 0xc3, 0xaa, 0xec, 0x0c, 0x62, 0x18, 0x21, 0x3a, 0xdd, 0x15, 0xa7, 0x49, 0xbb, 0xbb, 0xa9, 0x2a, - 0x67, 0x12, 0xf6, 0xc0, 0x1e, 0x40, 0xe2, 0x80, 0xd0, 0x1c, 0xf7, 0x84, 0x66, 0x04, 0x7f, 0x01, - 0x77, 0x38, 0x21, 0x31, 0xc7, 0x95, 0xb8, 0x70, 0x40, 0xd6, 0x8e, 0xf7, 0xc0, 0x09, 0x71, 0x8f, - 0x84, 0x84, 0xaa, 0xba, 0xfa, 0xcb, 0x8e, 0x37, 0xed, 0x9d, 0x3d, 0x70, 0x8a, 0xfb, 0x7d, 0xfc, - 0xde, 0xab, 0x7a, 0xaf, 0xde, 0x7b, 0x55, 0x81, 0x3b, 0x47, 0xd7, 0x58, 0xd3, 0xf1, 0x5b, 0x47, - 0xfd, 0x7d, 0x42, 0x3d, 0xc2, 0x09, 0x6b, 0x1d, 0x13, 0xcf, 0xf6, 0x69, 0x4b, 0x31, 0xcc, 0xc0, - 0xe9, 0x99, 0xd6, 0xa1, 0xe3, 0x11, 0x7a, 0xda, 0x0a, 0x8e, 0xba, 0x82, 0xc0, 0x5a, 0x3d, 0xc2, - 0xcd, 0xd6, 0xf1, 0x46, 0xab, 0x4b, 0x3c, 0x42, 0x4d, 0x4e, 0xec, 0x66, 0x40, 0x7d, 0xee, 0xa3, - 0x37, 0x42, 0xad, 0x66, 0x5a, 0xab, 0x19, 0x1c, 0x75, 0x05, 0x81, 0x35, 0x85, 0x56, 0xf3, 0x78, - 0x63, 0xf5, 0xed, 0xae, 0xc3, 0x0f, 0xfb, 0xfb, 0x4d, 0xcb, 0xef, 0xb5, 0xba, 0x7e, 0xd7, 0x6f, - 0x49, 0xe5, 0xfd, 0xfe, 0x81, 0xfc, 0x92, 0x1f, 0xf2, 0x57, 0x08, 0xba, 0x3a, 0xd1, 0x15, 0xda, - 0xf7, 0xb8, 0xd3, 0x23, 0xa3, 0x5e, 0xac, 0xbe, 0x7b, 0x91, 0x02, 0xb3, 0x0e, 0x49, 0xcf, 0x1c, - 0xd3, 0x7b, 0x67, 0x92, 0x5e, 0x9f, 0x3b, 0x6e, 0xcb, 0xf1, 0x38, 0xe3, 0x74, 0x54, 0x49, 0xff, - 0xdb, 0x2c, 0x94, 0xb7, 0x3a, 0xbb, 0xb7, 0xa8, 0xdf, 0x0f, 0xd0, 0x3a, 0xcc, 0x79, 0x66, 0x8f, - 0xd4, 0xb5, 0x75, 0xed, 0x4a, 0xc5, 0x98, 0x7f, 0x3e, 0x68, 0xcc, 0x0c, 0x07, 0x8d, 0xb9, 0xbb, - 0x66, 0x8f, 0x60, 0xc9, 0x41, 0x2e, 0x94, 0x8f, 0x09, 0x65, 0x8e, 0xef, 0xb1, 0x7a, 0x61, 0x7d, - 0xf6, 0x4a, 0x75, 0xf3, 0x46, 0x33, 0xcf, 0xa6, 0x35, 0xa5, 0x81, 0x07, 0xa1, 0xea, 0x4d, 0x9f, - 0xb6, 0x1d, 0x66, 0xf9, 0xc7, 0x84, 0x9e, 0x1a, 0x4b, 0xca, 0x4a, 0x59, 0x31, 0x19, 0x8e, 0x2d, - 0xa0, 0x5f, 0x69, 0xb0, 0x14, 0x50, 0x72, 0x40, 0x28, 0x25, 0xb6, 0xe2, 0xd7, 0x67, 0xd7, 0xb5, - 0x2f, 0xc0, 0x6c, 0x5d, 0x99, 0x5d, 0xea, 0x8c, 0xe0, 0xe3, 0x31, 0x8b, 0xe8, 0x0f, 0x1a, 0xac, - 0x32, 0x42, 0x8f, 0x09, 0xdd, 0xb2, 0x6d, 0x4a, 0x18, 0x33, 0x4e, 0xb7, 0x5d, 0x87, 0x78, 0x7c, - 0x7b, 0xb7, 0x8d, 0x59, 0x7d, 0x4e, 0xee, 0xc3, 0xf7, 0xf3, 0x39, 0xb4, 0x37, 0x09, 0xc7, 0xd0, - 0x95, 0x47, 0xab, 0x13, 0x45, 0x18, 0xfe, 0x0c, 0x37, 0xf4, 0x03, 0x98, 0x8f, 0x02, 0x79, 0xdb, - 0x61, 0x1c, 0x3d, 0x80, 0x52, 0x57, 0x7c, 0xb0, 0xba, 0x26, 0x1d, 0x6c, 0xe6, 0x73, 0x30, 0xc2, - 0x30, 0x16, 0x94, 0x3f, 0x25, 0xf9, 0xc9, 0xb0, 0x42, 0xd3, 0xff, 0x5c, 0x80, 0xea, 0x56, 0x67, - 0x17, 0x13, 0xe6, 0xf7, 0xa9, 0x45, 0x72, 0x24, 0xcd, 0x26, 0x80, 0xf8, 0xcb, 0x02, 0xd3, 0x22, - 0x76, 0xbd, 0xb0, 0xae, 0x5d, 0x29, 0x1b, 0x48, 0xc9, 0xc1, 0xdd, 0x98, 0x83, 0x53, 0x52, 0x02, - 0xf5, 0xc8, 0xf1, 0x6c, 0x19, 0xed, 0x14, 0xea, 0x7b, 0x8e, 0x67, 0x63, 0xc9, 0x41, 0xb7, 0xa1, - 0x78, 0x4c, 0xe8, 0xbe, 0xd8, 0x7f, 0x91, 0x10, 0x5f, 0xcf, 0xb7, 0xbc, 0x07, 0x42, 0xc5, 0xa8, - 0x0c, 0x07, 0x8d, 0xa2, 0xfc, 0x89, 0x43, 0x10, 0xd4, 0x04, 0x60, 0x87, 0x3e, 0xe5, 0xd2, 0x9d, - 0x7a, 0x71, 0x7d, 0xf6, 0x4a, 0xc5, 0x58, 0x10, 0xfe, 0xed, 0xc5, 0x54, 0x9c, 0x92, 0x40, 0xd7, - 0x60, 0x9e, 0x39, 0x5e, 0xb7, 0xef, 0x9a, 0x54, 0x10, 0xea, 0x25, 0xe9, 0xe7, 0x8a, 0xf2, 0x73, - 0x7e, 0x2f, 0xc5, 0xc3, 0x19, 0x49, 0xfd, 0x4f, 0x1a, 0x2c, 0xa6, 0xf6, 0x4f, 0xc6, 0xea, 0x1a, - 0xcc, 0x77, 0x53, 0x99, 0xaa, 0xf6, 0x32, 0x46, 0x4b, 0x67, 0x31, 0xce, 0x48, 0x22, 0x02, 0x15, - 0xaa, 0x90, 0xa2, 0x13, 0xb9, 0x91, 0x3b, 0xd0, 0x91, 0x0f, 0x89, 0xa5, 0x14, 0x91, 0xe1, 0x04, - 0x59, 0xff, 0x97, 0x26, 0x83, 0x1e, 0x9d, 0x51, 0x74, 0x25, 0x55, 0x07, 0x34, 0xb9, 0x59, 0xf3, - 0x13, 0xce, 0xf0, 0x05, 0x87, 0xa7, 0xf0, 0x7f, 0x71, 0x78, 0xae, 0x97, 0x3f, 0x7a, 0xda, 0x98, - 0xf9, 0xf0, 0x9f, 0xeb, 0x33, 0xfa, 0xa7, 0x05, 0xa8, 0xb5, 0x89, 0x4b, 0x38, 0xb9, 0x17, 0x70, - 0xb9, 0x82, 0x9b, 0x80, 0xba, 0xd4, 0xb4, 0x48, 0x87, 0x50, 0xc7, 0xb7, 0xf7, 0x88, 0xe5, 0x7b, - 0x36, 0x93, 0x21, 0x9a, 0x35, 0xbe, 0x34, 0x1c, 0x34, 0xd0, 0xad, 0x31, 0x2e, 0x3e, 0x47, 0x03, - 0xb9, 0x50, 0x0b, 0xa8, 0xfc, 0xed, 0x70, 0x55, 0x40, 0x45, 0xe2, 0xbe, 0x93, 0x6f, 0xed, 0x9d, - 0xb4, 0xaa, 0xb1, 0x3c, 0x1c, 0x34, 0x6a, 0x19, 0x12, 0xce, 0x82, 0xa3, 0x1f, 0xc0, 0x92, 0x4f, - 0x83, 0x43, 0xd3, 0x6b, 0x93, 0x80, 0x78, 0x36, 0xf1, 0x38, 0x93, 0x87, 0xa9, 0x6c, 0xac, 0x88, - 0xb2, 0x77, 0x6f, 0x84, 0x87, 0xc7, 0xa4, 0xd1, 0x43, 0x58, 0x0e, 0xa8, 0x1f, 0x98, 0x5d, 0x53, - 0x20, 0x76, 0x7c, 0xd7, 0xb1, 0x4e, 0xe5, 0x61, 0xab, 0x18, 0x57, 0x87, 0x83, 0xc6, 0x72, 0x67, - 0x94, 0x79, 0x36, 0x68, 0xbc, 0x22, 0xb7, 0x4e, 0x50, 0x12, 0x26, 0x1e, 0x87, 0xd1, 0x77, 0xa1, - 0xdc, 0xee, 0x53, 0x49, 0x41, 0xdf, 0x83, 0xb2, 0xad, 0x7e, 0xab, 0x5d, 0x7d, 0x2d, 0xea, 0x09, - 0x91, 0xcc, 0xd9, 0xa0, 0x51, 0x13, 0xad, 0xaf, 0x19, 0x11, 0x70, 0xac, 0xa2, 0x3f, 0x82, 0xda, - 0xce, 0x49, 0xe0, 0x53, 0x1e, 0xc5, 0xeb, 0x4d, 0x28, 0x11, 0x49, 0x90, 0x68, 0xe5, 0xa4, 0x90, - 0x85, 0x62, 0x58, 0x71, 0xd1, 0xeb, 0x50, 0x24, 0x27, 0xa6, 0xc5, 0x55, 0x45, 0xaa, 0x29, 0xb1, - 0xe2, 0x8e, 0x20, 0xe2, 0x90, 0xa7, 0x3f, 0xd3, 0x00, 0x6e, 0x91, 0x18, 0x7b, 0x0b, 0x16, 0xa3, - 0x43, 0x91, 0x3d, 0xab, 0x5f, 0x56, 0xda, 0x8b, 0x38, 0xcb, 0xc6, 0xa3, 0xf2, 0xa8, 0x03, 0x2b, - 0x8e, 0x67, 0xb9, 0x7d, 0x9b, 0xdc, 0xf7, 0x1c, 0xcf, 0xe1, 0x8e, 0xe9, 0x3a, 0xbf, 0x88, 0xeb, - 0xe2, 0x57, 0x14, 0xce, 0xca, 0xee, 0x39, 0x32, 0xf8, 0x5c, 0x4d, 0xfd, 0x11, 0x54, 0x64, 0x85, - 0x10, 0xc5, 0x51, 0xac, 0x4a, 0x16, 0x08, 0xe5, 0x57, 0xbc, 0x2a, 0x29, 0x81, 0x43, 0x5e, 0x5c, - 0x5d, 0x0b, 0x93, 0xaa, 0x6b, 0xea, 0x40, 0xb8, 0x50, 0x0b, 0x75, 0xa3, 0x82, 0x9f, 0xcb, 0xc2, - 0x55, 0x28, 0x47, 0x0b, 0x57, 0x56, 0xe2, 0x46, 0x1f, 0x01, 0xe1, 0x58, 0x22, 0x65, 0xed, 0x10, - 0x32, 0xd5, 0x2e, 0x9f, 0xb1, 0xb7, 0xe0, 0x92, 0xaa, 0x37, 0xca, 0xd6, 0xa2, 0x12, 0xbb, 0x14, - 0x45, 0x21, 0xe2, 0xa7, 0x2c, 0xfd, 0x12, 0xea, 0x93, 0xa6, 0x83, 0x97, 0xa8, 0xc7, 0xf9, 0x5d, - 0xd1, 0x7f, 0xa7, 0xc1, 0x52, 0x1a, 0x29, 0x7f, 0xf8, 0xf2, 0x1b, 0xb9, 0xb8, 0x8f, 0xa6, 0x76, - 0xe4, 0xf7, 0x1a, 0xac, 0x64, 0x96, 0x36, 0x55, 0xc4, 0xa7, 0x70, 0x2a, 0x9d, 0x1c, 0xb3, 0x53, - 0x24, 0x47, 0x0b, 0xaa, 0xbb, 0x71, 0xde, 0xd3, 0x8b, 0x27, 0x0f, 0xfd, 0x2f, 0x1a, 0xcc, 0xa7, - 0x34, 0x18, 0x7a, 0x04, 0x97, 0x44, 0x7d, 0x73, 0xbc, 0xae, 0x9a, 0x8a, 0x72, 0x36, 0xcb, 0x14, - 0x48, 0xb2, 0xae, 0x4e, 0x88, 0x84, 0x23, 0x48, 0xd4, 0x81, 0x12, 0x25, 0xac, 0xef, 0x72, 0x55, - 0xda, 0xaf, 0xe6, 0x6c, 0x6b, 0xdc, 0xe4, 0x7d, 0x66, 0x80, 0xa8, 0x51, 0x58, 0xea, 0x63, 0x85, - 0xa3, 0xff, 0xbd, 0x00, 0xb5, 0xdb, 0xe6, 0x3e, 0x71, 0xf7, 0x88, 0x4b, 0x2c, 0xee, 0x53, 0xf4, - 0x01, 0x54, 0x7b, 0x26, 0xb7, 0x0e, 0x25, 0x35, 0x9a, 0xed, 0xda, 0xf9, 0x0c, 0x65, 0x90, 0x9a, - 0x77, 0x12, 0x98, 0x1d, 0x8f, 0xd3, 0x53, 0xe3, 0x15, 0xb5, 0xb0, 0x6a, 0x8a, 0x83, 0xd3, 0xd6, - 0xe4, 0x40, 0x2e, 0xbf, 0x77, 0x4e, 0x02, 0xd1, 0x44, 0xa7, 0xbf, 0x07, 0x64, 0x5c, 0xc0, 0xe4, - 0xe7, 0x7d, 0x87, 0x92, 0x1e, 0xf1, 0x78, 0x32, 0x90, 0xdf, 0x19, 0xc1, 0xc7, 0x63, 0x16, 0x57, - 0x6f, 0xc0, 0xd2, 0xa8, 0xf3, 0x68, 0x09, 0x66, 0x8f, 0xc8, 0x69, 0x98, 0x0b, 0x58, 0xfc, 0x44, - 0x2b, 0x50, 0x3c, 0x36, 0xdd, 0xbe, 0xaa, 0x3f, 0x38, 0xfc, 0xb8, 0x5e, 0xb8, 0xa6, 0xe9, 0x7f, - 0xd4, 0xa0, 0x3e, 0xc9, 0x11, 0xf4, 0xd5, 0x14, 0x90, 0x51, 0x55, 0x5e, 0xcd, 0xbe, 0x47, 0x4e, - 0x43, 0xd4, 0x1d, 0x28, 0xfb, 0x81, 0xb8, 0x42, 0xf9, 0x54, 0xe5, 0xf9, 0x5b, 0x51, 0xee, 0xde, - 0x53, 0xf4, 0xb3, 0x41, 0xe3, 0x72, 0x06, 0x3e, 0x62, 0xe0, 0x58, 0x15, 0xe9, 0x50, 0x92, 0xfe, - 0x88, 0xa6, 0x2c, 0xc6, 0x27, 0x19, 0xfc, 0x07, 0x92, 0x82, 0x15, 0x47, 0xff, 0x00, 0xca, 0x62, - 0x3a, 0xbc, 0x43, 0xb8, 0x29, 0x8e, 0x0c, 0x23, 0xee, 0xc1, 0x6d, 0xc7, 0x3b, 0x52, 0xae, 0xc5, - 0x47, 0x66, 0x4f, 0xd1, 0x71, 0x2c, 0x71, 0x5e, 0x9b, 0x2a, 0x4c, 0xd7, 0xa6, 0xf4, 0xff, 0x16, - 0xa0, 0x2a, 0xac, 0x47, 0x9d, 0xef, 0x3b, 0x50, 0x73, 0xd3, 0x6b, 0x52, 0x5e, 0x5c, 0x56, 0x80, - 0xd9, 0x2c, 0xc5, 0x59, 0x59, 0xa1, 0x7c, 0xe0, 0x10, 0xd7, 0x8e, 0x95, 0x0b, 0x59, 0xe5, 0x9b, - 0x69, 0x26, 0xce, 0xca, 0x8a, 0xea, 0xf3, 0x58, 0x44, 0x5b, 0x8d, 0x2f, 0x71, 0xf5, 0xf9, 0xa1, - 0x20, 0xe2, 0x90, 0x77, 0xde, 0x8a, 0xe7, 0xa6, 0x6c, 0xcc, 0xd7, 0x61, 0x41, 0xcc, 0x18, 0x7e, - 0x9f, 0x47, 0x33, 0x5e, 0x51, 0x4e, 0x23, 0x68, 0x38, 0x68, 0x2c, 0xbc, 0x9f, 0xe1, 0xe0, 0x11, - 0xc9, 0x89, 0x4d, 0xbd, 0xf4, 0xb9, 0x9b, 0xfa, 0xbf, 0x01, 0xe0, 0xde, 0xfe, 0xcf, 0x88, 0x15, - 0xc6, 0xff, 0xe2, 0x5b, 0x96, 0xe8, 0x59, 0xea, 0x72, 0x2f, 0x6f, 0x24, 0x85, 0x91, 0x9e, 0x95, - 0xe2, 0xe1, 0x8c, 0x24, 0x6a, 0x41, 0x25, 0xbe, 0x79, 0xa9, 0x7a, 0xbc, 0xac, 0xd4, 0x2a, 0xf1, - 0xf5, 0x0c, 0x27, 0x32, 0x99, 0x64, 0x9c, 0xbb, 0x30, 0x19, 0x0d, 0x98, 0xed, 0x3b, 0xb6, 0xdc, - 0xcc, 0x8a, 0xf1, 0x8d, 0xe8, 0x40, 0xdd, 0xdf, 0x6d, 0x9f, 0x0d, 0x1a, 0xaf, 0x4d, 0x7a, 0xb3, - 0xe0, 0xa7, 0x01, 0x61, 0xcd, 0xfb, 0xbb, 0x6d, 0x2c, 0x94, 0xcf, 0x0b, 0x6f, 0x69, 0xca, 0xf0, - 0x6e, 0x02, 0xa8, 0x55, 0x0b, 0xed, 0x4b, 0x61, 0x68, 0xa3, 0x5b, 0xe8, 0xad, 0x98, 0x83, 0x53, - 0x52, 0x88, 0xc1, 0xb2, 0x45, 0x89, 0xfc, 0x2d, 0x12, 0x80, 0x71, 0xb3, 0x17, 0xd4, 0xcb, 0xb2, - 0xb6, 0x7f, 0x2d, 0x5f, 0xbd, 0x13, 0x6a, 0xc6, 0xab, 0xca, 0xcc, 0xf2, 0xf6, 0x28, 0x18, 0x1e, - 0xc7, 0x47, 0x3e, 0x2c, 0xdb, 0x6a, 0x8a, 0x4e, 0x8c, 0x56, 0xa6, 0x36, 0x7a, 0x59, 0x18, 0x6c, - 0x8f, 0x02, 0xe1, 0x71, 0x6c, 0xf4, 0x13, 0x58, 0x8d, 0x88, 0xe3, 0x57, 0x99, 0x3a, 0xc8, 0x9d, - 0x5a, 0x13, 0x97, 0xab, 0xf6, 0x44, 0x29, 0xfc, 0x19, 0x08, 0xc8, 0x86, 0x92, 0x1b, 0x76, 0xab, - 0xaa, 0x6c, 0x15, 0xdf, 0xcd, 0xb7, 0x8a, 0x24, 0xfb, 0x9b, 0xe9, 0x2e, 0x15, 0x8f, 0xf3, 0xaa, - 0x41, 0x29, 0x6c, 0x74, 0x02, 0x55, 0xd3, 0xf3, 0x7c, 0x6e, 0x86, 0x97, 0xab, 0x79, 0x69, 0x6a, - 0x6b, 0x6a, 0x53, 0x5b, 0x09, 0xc6, 0x48, 0x57, 0x4c, 0x71, 0x70, 0xda, 0x14, 0x7a, 0x0c, 0x8b, - 0xfe, 0x63, 0x8f, 0x50, 0x4c, 0x0e, 0x08, 0x25, 0x9e, 0xb8, 0x89, 0xd7, 0xa4, 0xf5, 0x6f, 0xe6, - 0xb4, 0x9e, 0x51, 0x4e, 0x52, 0x3a, 0x4b, 0x67, 0x78, 0xd4, 0x0a, 0x6a, 0x02, 0x1c, 0x38, 0x9e, - 0x9a, 0x6d, 0xea, 0x0b, 0xc9, 0xa3, 0xc5, 0xcd, 0x98, 0x8a, 0x53, 0x12, 0xe8, 0x5b, 0x50, 0xb5, - 0xdc, 0x3e, 0xe3, 0x24, 0x7c, 0xb3, 0x58, 0x94, 0x27, 0x28, 0x5e, 0xdf, 0x76, 0xc2, 0xc2, 0x69, - 0x39, 0x74, 0x08, 0xf3, 0x4e, 0x6a, 0x88, 0xaa, 0x2f, 0xc9, 0x5c, 0xdc, 0x9c, 0x7a, 0x72, 0x62, - 0xc6, 0x92, 0xa8, 0x44, 0x69, 0x0a, 0xce, 0x20, 0xaf, 0x7e, 0x1b, 0xaa, 0x9f, 0xb3, 0xa7, 0x8b, - 0x99, 0x60, 0x34, 0x74, 0x53, 0xcd, 0x04, 0x7f, 0x2d, 0xc0, 0x42, 0x76, 0xc3, 0xe3, 0xd9, 0x59, - 0x9b, 0xf8, 0x06, 0x15, 0x55, 0xe5, 0xd9, 0x89, 0x55, 0x59, 0x15, 0xbf, 0xb9, 0x97, 0x29, 0x7e, - 0x9b, 0x00, 0x66, 0xe0, 0x44, 0x75, 0x2f, 0xac, 0xa3, 0x71, 0xe5, 0x4a, 0x5e, 0x65, 0x70, 0x4a, - 0x4a, 0xa4, 0x86, 0xe5, 0x7b, 0x9c, 0xfa, 0xae, 0x4b, 0xa8, 0x6a, 0x43, 0x32, 0x35, 0xb6, 0x63, - 0x2a, 0x4e, 0x49, 0xa0, 0x9b, 0x80, 0xf6, 0x5d, 0xdf, 0x3a, 0x92, 0x5b, 0x10, 0x9d, 0x73, 0x59, - 0x25, 0xcb, 0xe1, 0x23, 0x87, 0x31, 0xc6, 0xc5, 0xe7, 0x68, 0xe8, 0xf7, 0x20, 0xfb, 0x2c, 0x81, - 0x6e, 0x84, 0x1b, 0xa0, 0xc5, 0xef, 0x06, 0xd3, 0x2d, 0x5e, 0xbf, 0x0a, 0x15, 0xec, 0xfb, 0xbc, - 0x63, 0xf2, 0x43, 0x86, 0x1a, 0x50, 0x0c, 0xc4, 0x0f, 0xf5, 0xe6, 0x24, 0x9f, 0xf1, 0x24, 0x07, - 0x87, 0x74, 0xfd, 0xb7, 0x1a, 0xbc, 0x3a, 0xf1, 0x09, 0x48, 0x6c, 0xa4, 0x15, 0x7f, 0x29, 0x97, - 0xe2, 0x8d, 0x4c, 0xe4, 0x70, 0x4a, 0x4a, 0x8c, 0x2e, 0x99, 0x77, 0xa3, 0xd1, 0xd1, 0x25, 0x63, - 0x0d, 0x67, 0x65, 0xf5, 0xff, 0x14, 0xa0, 0x14, 0x4e, 0xf7, 0xe8, 0x11, 0x94, 0xc5, 0x91, 0xb0, - 0x4d, 0x6e, 0x4a, 0xcb, 0xb9, 0x1f, 0x64, 0xa3, 0x11, 0x30, 0xe9, 0xb1, 0x11, 0x05, 0xc7, 0x88, - 0xe8, 0x4d, 0x28, 0x31, 0x69, 0x47, 0xb9, 0x17, 0x17, 0xc9, 0xd0, 0x3a, 0x56, 0x5c, 0x71, 0x49, - 0xeb, 0x11, 0xc6, 0xcc, 0x6e, 0x94, 0xb3, 0xf1, 0x65, 0xe6, 0x4e, 0x48, 0xc6, 0x11, 0x1f, 0xbd, - 0x2b, 0x2e, 0x33, 0x26, 0x8b, 0x07, 0xa9, 0xb5, 0x08, 0x12, 0x4b, 0xea, 0xd9, 0xa0, 0x31, 0xaf, - 0xc0, 0xe5, 0x37, 0x56, 0xd2, 0xe8, 0x21, 0x5c, 0xb2, 0x09, 0x37, 0x1d, 0x37, 0x9c, 0x9f, 0x72, - 0x3f, 0x70, 0x85, 0x60, 0xed, 0x50, 0xd5, 0xa8, 0x0a, 0x9f, 0xd4, 0x07, 0x8e, 0x00, 0xc5, 0x79, - 0xb3, 0x7c, 0x3b, 0x7c, 0x6d, 0x2d, 0x26, 0xe7, 0x6d, 0xdb, 0xb7, 0x09, 0x96, 0x1c, 0xfd, 0x89, - 0x06, 0xd5, 0x10, 0x69, 0xdb, 0xec, 0x33, 0x82, 0x36, 0xe2, 0x55, 0x84, 0xe1, 0x8e, 0x5a, 0xf1, - 0xdc, 0xfb, 0xa7, 0x01, 0x39, 0x1b, 0x34, 0x2a, 0x52, 0x4c, 0x7c, 0xc4, 0x0b, 0x48, 0xed, 0x51, - 0xe1, 0x82, 0x3d, 0x7a, 0x1d, 0x8a, 0x72, 0x56, 0x55, 0x9b, 0x19, 0x8f, 0xa6, 0x72, 0x9e, 0xc5, - 0x21, 0x4f, 0xff, 0xa4, 0x00, 0xb5, 0xcc, 0xe2, 0x72, 0x0c, 0x73, 0xf1, 0x8d, 0xbb, 0x90, 0xe3, - 0x15, 0x67, 0xf2, 0x1b, 0xf9, 0x8f, 0xa0, 0x64, 0x89, 0xf5, 0x45, 0xff, 0xa4, 0xd8, 0x98, 0x26, - 0x14, 0x72, 0x67, 0x92, 0x4c, 0x92, 0x9f, 0x0c, 0x2b, 0x40, 0x74, 0x0b, 0x96, 0x29, 0xe1, 0xf4, - 0x74, 0xeb, 0x80, 0x13, 0x9a, 0x1e, 0x98, 0x8b, 0xc9, 0xb8, 0x83, 0x47, 0x05, 0xf0, 0xb8, 0x4e, - 0x54, 0x21, 0x4b, 0x2f, 0x51, 0x21, 0x75, 0x17, 0xe6, 0xc4, 0x38, 0x23, 0x42, 0xc7, 0x32, 0xef, - 0xb3, 0x71, 0xe8, 0x22, 0x07, 0x22, 0xbe, 0xd8, 0x61, 0xcf, 0xf4, 0xfc, 0xf0, 0xc0, 0x14, 0x93, - 0x1d, 0xbe, 0x2b, 0x88, 0x38, 0xe4, 0x5d, 0x5f, 0xf9, 0xe8, 0x69, 0x63, 0xe6, 0x37, 0xcf, 0x1a, - 0x33, 0x4f, 0x9e, 0x35, 0x66, 0x9e, 0x3e, 0x53, 0xcf, 0x10, 0x3f, 0x86, 0x4a, 0x32, 0x3c, 0x7d, - 0xc1, 0x26, 0xf5, 0x9f, 0x42, 0x59, 0x64, 0x63, 0x34, 0xf4, 0x5f, 0xd0, 0x80, 0xb2, 0xad, 0xa1, - 0x90, 0xa7, 0x35, 0xe8, 0x9b, 0x10, 0xfe, 0xeb, 0x43, 0x54, 0x53, 0x87, 0x93, 0x5e, 0xa6, 0x9a, - 0xee, 0x0a, 0x02, 0x0e, 0xe9, 0xa9, 0x97, 0x97, 0x5f, 0x6b, 0x00, 0xf2, 0xbe, 0xb5, 0x73, 0x2c, - 0xee, 0xc8, 0xeb, 0x30, 0x27, 0x22, 0x30, 0xea, 0x98, 0x3c, 0x46, 0x92, 0x83, 0xee, 0x43, 0xc9, - 0x97, 0x43, 0x95, 0x7a, 0x0a, 0x79, 0x7b, 0x62, 0xe6, 0xa9, 0xff, 0x6a, 0x36, 0xb1, 0xf9, 0x78, - 0xe7, 0x84, 0x13, 0x4f, 0xf8, 0x98, 0x64, 0x5d, 0x38, 0x99, 0x61, 0x05, 0x66, 0xbc, 0xf1, 0xfc, - 0xc5, 0xda, 0xcc, 0xc7, 0x2f, 0xd6, 0x66, 0xfe, 0xf1, 0x62, 0x6d, 0xe6, 0xc3, 0xe1, 0x9a, 0xf6, - 0x7c, 0xb8, 0xa6, 0x7d, 0x3c, 0x5c, 0xd3, 0x3e, 0x19, 0xae, 0x69, 0x4f, 0x3e, 0x5d, 0x9b, 0x79, - 0x58, 0x38, 0xde, 0xf8, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf6, 0x0e, 0xfb, 0x43, 0x17, 0x1e, - 0x00, 0x00, + // 2347 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0xcd, 0x6f, 0x24, 0x47, + 0x15, 0x77, 0x8f, 0x3d, 0xe3, 0x99, 0x37, 0x1e, 0x7f, 0x54, 0xbc, 0x30, 0xb1, 0xc0, 0xe3, 0x74, + 0xa2, 0x68, 0x03, 0x9b, 0x19, 0xec, 0x40, 0xb4, 0x2c, 0xb0, 0xe0, 0xf6, 0x78, 0x57, 0x56, 0xd6, + 0xbb, 0xa3, 0x72, 0x76, 0x11, 0xcb, 0x0a, 0xd1, 0xee, 0x2e, 0x8f, 0x1b, 0xf7, 0x74, 0x77, 0xaa, + 0x6a, 0xbc, 0x36, 0x39, 0x90, 0x03, 0x48, 0x1c, 0x10, 0xda, 0x23, 0x27, 0x94, 0x15, 0xfc, 0x05, + 0xfc, 0x01, 0x9c, 0x90, 0xd8, 0x63, 0x24, 0x2e, 0x1c, 0xd0, 0x28, 0xeb, 0x1c, 0x38, 0x45, 0xdc, + 0x2d, 0x21, 0xa1, 0xaa, 0xae, 0xfe, 0x9a, 0xf1, 0xc4, 0x3d, 0xd9, 0x08, 0xe5, 0xe4, 0xe9, 0xf7, + 0xf1, 0x7b, 0xaf, 0xaa, 0x5e, 0xbd, 0xf7, 0xea, 0x19, 0x76, 0x8f, 0xae, 0xb3, 0xa6, 0xe3, 0xb7, + 0x8e, 0xfa, 0xfb, 0x84, 0x7a, 0x84, 0x13, 0xd6, 0x3a, 0x26, 0x9e, 0xed, 0xd3, 0x96, 0x62, 0x98, + 0x81, 0xd3, 0x33, 0xad, 0x43, 0xc7, 0x23, 0xf4, 0xb4, 0x15, 0x1c, 0x75, 0x05, 0x81, 0xb5, 0x7a, + 0x84, 0x9b, 0xad, 0xe3, 0xf5, 0x56, 0x97, 0x78, 0x84, 0x9a, 0x9c, 0xd8, 0xcd, 0x80, 0xfa, 0xdc, + 0x47, 0xaf, 0x85, 0x5a, 0xcd, 0xb4, 0x56, 0x33, 0x38, 0xea, 0x0a, 0x02, 0x6b, 0x0a, 0xad, 0xe6, + 0xf1, 0xfa, 0xca, 0x9b, 0x5d, 0x87, 0x1f, 0xf6, 0xf7, 0x9b, 0x96, 0xdf, 0x6b, 0x75, 0xfd, 0xae, + 0xdf, 0x92, 0xca, 0xfb, 0xfd, 0x03, 0xf9, 0x25, 0x3f, 0xe4, 0xaf, 0x10, 0x74, 0x65, 0xac, 0x2b, + 0xb4, 0xef, 0x71, 0xa7, 0x47, 0x86, 0xbd, 0x58, 0x79, 0xfb, 0x32, 0x05, 0x66, 0x1d, 0x92, 0x9e, + 0x39, 0xa2, 0xf7, 0xd6, 0x38, 0xbd, 0x3e, 0x77, 0xdc, 0x96, 0xe3, 0x71, 0xc6, 0xe9, 0xb0, 0x92, + 0xfe, 0xf7, 0x69, 0x28, 0x6f, 0x76, 0x76, 0x6e, 0x53, 0xbf, 0x1f, 0xa0, 0x35, 0x98, 0xf1, 0xcc, + 0x1e, 0xa9, 0x6b, 0x6b, 0xda, 0xd5, 0x8a, 0x31, 0xf7, 0x6c, 0xd0, 0x98, 0x3a, 0x1b, 0x34, 0x66, + 0xee, 0x9a, 0x3d, 0x82, 0x25, 0x07, 0xb9, 0x50, 0x3e, 0x26, 0x94, 0x39, 0xbe, 0xc7, 0xea, 0x85, + 0xb5, 0xe9, 0xab, 0xd5, 0x8d, 0x9b, 0xcd, 0x3c, 0x9b, 0xd6, 0x94, 0x06, 0x1e, 0x84, 0xaa, 0xb7, + 0x7c, 0xda, 0x76, 0x98, 0xe5, 0x1f, 0x13, 0x7a, 0x6a, 0x2c, 0x2a, 0x2b, 0x65, 0xc5, 0x64, 0x38, + 0xb6, 0x80, 0x7e, 0xad, 0xc1, 0x62, 0x40, 0xc9, 0x01, 0xa1, 0x94, 0xd8, 0x8a, 0x5f, 0x9f, 0x5e, + 0xd3, 0xbe, 0x00, 0xb3, 0x75, 0x65, 0x76, 0xb1, 0x33, 0x84, 0x8f, 0x47, 0x2c, 0xa2, 0x3f, 0x69, + 0xb0, 0xc2, 0x08, 0x3d, 0x26, 0x74, 0xd3, 0xb6, 0x29, 0x61, 0xcc, 0x38, 0xdd, 0x72, 0x1d, 0xe2, + 0xf1, 0xad, 0x9d, 0x36, 0x66, 0xf5, 0x19, 0xb9, 0x0f, 0x3f, 0xcc, 0xe7, 0xd0, 0xde, 0x38, 0x1c, + 0x43, 0x57, 0x1e, 0xad, 0x8c, 0x15, 0x61, 0xf8, 0x33, 0xdc, 0xd0, 0x0f, 0x60, 0x2e, 0x3a, 0xc8, + 0x3b, 0x0e, 0xe3, 0xe8, 0x01, 0x94, 0xba, 0xe2, 0x83, 0xd5, 0x35, 0xe9, 0x60, 0x33, 0x9f, 0x83, + 0x11, 0x86, 0x31, 0xaf, 0xfc, 0x29, 0xc9, 0x4f, 0x86, 0x15, 0x9a, 0xfe, 0x69, 0x01, 0xaa, 0x9b, + 0x9d, 0x1d, 0x4c, 0x98, 0xdf, 0xa7, 0x16, 0xc9, 0x11, 0x34, 0x1b, 0x00, 0xe2, 0x2f, 0x0b, 0x4c, + 0x8b, 0xd8, 0xf5, 0xc2, 0x9a, 0x76, 0xb5, 0x6c, 0x20, 0x25, 0x07, 0x77, 0x63, 0x0e, 0x4e, 0x49, + 0x09, 0xd4, 0x23, 0xc7, 0xb3, 0xe5, 0x69, 0xa7, 0x50, 0xdf, 0x71, 0x3c, 0x1b, 0x4b, 0x0e, 0xba, + 0x03, 0xc5, 0x63, 0x42, 0xf7, 0xc5, 0xfe, 0x8b, 0x80, 0xf8, 0x66, 0xbe, 0xe5, 0x3d, 0x10, 0x2a, + 0x46, 0xe5, 0x6c, 0xd0, 0x28, 0xca, 0x9f, 0x38, 0x04, 0x41, 0x4d, 0x00, 0x76, 0xe8, 0x53, 0x2e, + 0xdd, 0xa9, 0x17, 0xd7, 0xa6, 0xaf, 0x56, 0x8c, 0x79, 0xe1, 0xdf, 0x5e, 0x4c, 0xc5, 0x29, 0x09, + 0x74, 0x1d, 0xe6, 0x98, 0xe3, 0x75, 0xfb, 0xae, 0x49, 0x05, 0xa1, 0x5e, 0x92, 0x7e, 0x2e, 0x2b, + 0x3f, 0xe7, 0xf6, 0x52, 0x3c, 0x9c, 0x91, 0x14, 0x96, 0x2c, 0x93, 0x93, 0xae, 0x4f, 0x1d, 0xc2, + 0xea, 0xb3, 0x89, 0xa5, 0xad, 0x98, 0x8a, 0x53, 0x12, 0xfa, 0x5f, 0x34, 0x58, 0x48, 0xed, 0xb7, + 0x3c, 0xdb, 0xeb, 0x30, 0xd7, 0x4d, 0x45, 0xb6, 0xda, 0xfb, 0xd8, 0x7a, 0x3a, 0xea, 0x71, 0x46, + 0x12, 0x11, 0xa8, 0x50, 0x85, 0x14, 0xdd, 0xe0, 0xf5, 0xdc, 0x81, 0x11, 0xf9, 0x90, 0x58, 0x4a, + 0x11, 0x19, 0x4e, 0x90, 0xf5, 0x7f, 0x6b, 0x32, 0x48, 0xa2, 0x3b, 0x8d, 0xae, 0xa6, 0xf2, 0x86, + 0x26, 0x97, 0x3c, 0x37, 0xe6, 0xce, 0x5f, 0x72, 0xd9, 0x0a, 0x5f, 0x8a, 0xcb, 0x76, 0xa3, 0xfc, + 0x87, 0x0f, 0x1b, 0x53, 0x1f, 0xfc, 0x6b, 0x6d, 0x4a, 0xff, 0xa4, 0x00, 0xb5, 0x36, 0x71, 0x09, + 0x27, 0xf7, 0x02, 0x2e, 0x57, 0x70, 0x0b, 0x50, 0x97, 0x9a, 0x16, 0xe9, 0x10, 0xea, 0xf8, 0xf6, + 0x1e, 0xb1, 0x7c, 0xcf, 0x66, 0xf2, 0x88, 0xa6, 0x8d, 0xaf, 0x9c, 0x0d, 0x1a, 0xe8, 0xf6, 0x08, + 0x17, 0x5f, 0xa0, 0x81, 0x5c, 0xa8, 0x05, 0x54, 0xfe, 0x76, 0xb8, 0x4a, 0xb8, 0x22, 0xd0, 0xdf, + 0xca, 0xb7, 0xf6, 0x4e, 0x5a, 0xd5, 0x58, 0x3a, 0x1b, 0x34, 0x6a, 0x19, 0x12, 0xce, 0x82, 0xa3, + 0x1f, 0xc1, 0xa2, 0x4f, 0x83, 0x43, 0xd3, 0x6b, 0x93, 0x80, 0x78, 0x36, 0xf1, 0x38, 0x93, 0x97, + 0xaf, 0x6c, 0x2c, 0x8b, 0x34, 0x79, 0x6f, 0x88, 0x87, 0x47, 0xa4, 0xd1, 0x43, 0x58, 0x0a, 0xa8, + 0x1f, 0x98, 0x5d, 0x53, 0x20, 0x76, 0x7c, 0xd7, 0xb1, 0x4e, 0xe5, 0xe5, 0xac, 0x18, 0xd7, 0xce, + 0x06, 0x8d, 0xa5, 0xce, 0x30, 0xf3, 0x7c, 0xd0, 0x78, 0x49, 0x6e, 0x9d, 0xa0, 0x24, 0x4c, 0x3c, + 0x0a, 0xa3, 0xef, 0x40, 0xb9, 0xdd, 0xa7, 0x92, 0x82, 0x7e, 0x00, 0x65, 0x5b, 0xfd, 0x56, 0xbb, + 0xfa, 0x4a, 0x54, 0x43, 0x22, 0x99, 0xf3, 0x41, 0xa3, 0x26, 0x4a, 0x65, 0x33, 0x22, 0xe0, 0x58, + 0x45, 0x7f, 0x04, 0xb5, 0xed, 0x93, 0xc0, 0xa7, 0x3c, 0x3a, 0xaf, 0xd7, 0xa1, 0x44, 0x24, 0x41, + 0xa2, 0x95, 0x93, 0xc4, 0x17, 0x8a, 0x61, 0xc5, 0x45, 0xaf, 0x42, 0x91, 0x9c, 0x98, 0x16, 0x57, + 0x19, 0xac, 0xa6, 0xc4, 0x8a, 0xdb, 0x82, 0x88, 0x43, 0x9e, 0xfe, 0x54, 0x03, 0xb8, 0x4d, 0x62, + 0xec, 0x4d, 0x58, 0x88, 0x2e, 0x45, 0xf6, 0xae, 0x7e, 0x55, 0x69, 0x2f, 0xe0, 0x2c, 0x1b, 0x0f, + 0xcb, 0xa3, 0x0e, 0x2c, 0x3b, 0x9e, 0xe5, 0xf6, 0x6d, 0x72, 0xdf, 0x73, 0x3c, 0x87, 0x3b, 0xa6, + 0xeb, 0xfc, 0x32, 0xce, 0xa3, 0x5f, 0x53, 0x38, 0xcb, 0x3b, 0x17, 0xc8, 0xe0, 0x0b, 0x35, 0xf5, + 0x47, 0x50, 0x91, 0x19, 0x42, 0x24, 0x53, 0xb1, 0x2a, 0x99, 0x20, 0x94, 0x5f, 0xf1, 0xaa, 0xa4, + 0x04, 0x0e, 0x79, 0x71, 0x36, 0x2e, 0x8c, 0xcb, 0xc6, 0xa9, 0x0b, 0xe1, 0x42, 0x2d, 0xd4, 0x8d, + 0x0a, 0x44, 0x2e, 0x0b, 0xd7, 0xa0, 0x1c, 0x2d, 0x5c, 0x59, 0x89, 0x1b, 0x83, 0x08, 0x08, 0xc7, + 0x12, 0x29, 0x6b, 0x87, 0x90, 0xc9, 0x76, 0xf9, 0x8c, 0xbd, 0x01, 0xb3, 0x2a, 0xdf, 0x28, 0x5b, + 0x0b, 0x4a, 0x6c, 0x36, 0x3a, 0x85, 0x88, 0x9f, 0xb2, 0xf4, 0x2b, 0xa8, 0x8f, 0xeb, 0x26, 0x5e, + 0x20, 0x1f, 0xe7, 0x77, 0x45, 0xff, 0xbd, 0x06, 0x8b, 0x69, 0xa4, 0xfc, 0xc7, 0x97, 0xdf, 0xc8, + 0xe5, 0x75, 0x37, 0xb5, 0x23, 0x7f, 0xd4, 0x60, 0x39, 0xb3, 0xb4, 0x89, 0x4e, 0x7c, 0x02, 0xa7, + 0xd2, 0xc1, 0x31, 0x3d, 0x41, 0x70, 0xb4, 0xa0, 0xba, 0x13, 0xc7, 0x3d, 0xbd, 0xbc, 0x53, 0xd1, + 0xff, 0xaa, 0xc1, 0x5c, 0x4a, 0x83, 0xa1, 0x47, 0x30, 0x2b, 0xf2, 0x9b, 0xe3, 0x75, 0x55, 0x17, + 0x95, 0xb3, 0x58, 0xa6, 0x40, 0x92, 0x75, 0x75, 0x42, 0x24, 0x1c, 0x41, 0xa2, 0x0e, 0x94, 0x28, + 0x61, 0x7d, 0x97, 0xab, 0xd4, 0x7e, 0x2d, 0x67, 0x59, 0xe3, 0x26, 0xef, 0x33, 0x03, 0x44, 0x8e, + 0xc2, 0x52, 0x1f, 0x2b, 0x1c, 0xfd, 0x1f, 0x05, 0xa8, 0xdd, 0x31, 0xf7, 0x89, 0xbb, 0x47, 0x5c, + 0x62, 0x71, 0x9f, 0xa2, 0xf7, 0xa1, 0xda, 0x33, 0xb9, 0x75, 0x28, 0xa9, 0x51, 0x2f, 0xd8, 0xce, + 0x67, 0x28, 0x83, 0xd4, 0xdc, 0x4d, 0x60, 0xb6, 0x3d, 0x4e, 0x4f, 0x8d, 0x97, 0xd4, 0xc2, 0xaa, + 0x29, 0x0e, 0x4e, 0x5b, 0x93, 0x0d, 0xbc, 0xfc, 0xde, 0x3e, 0x09, 0x44, 0x11, 0x9d, 0xfc, 0xdd, + 0x90, 0x71, 0x01, 0x93, 0xf7, 0xfa, 0x0e, 0x25, 0x3d, 0xe2, 0xf1, 0xa4, 0x81, 0xdf, 0x1d, 0xc2, + 0xc7, 0x23, 0x16, 0x57, 0x6e, 0xc2, 0xe2, 0xb0, 0xf3, 0x68, 0x11, 0xa6, 0x8f, 0xc8, 0x69, 0x18, + 0x0b, 0x58, 0xfc, 0x44, 0xcb, 0x50, 0x3c, 0x36, 0xdd, 0xbe, 0xca, 0x3f, 0x38, 0xfc, 0xb8, 0x51, + 0xb8, 0xae, 0xe9, 0x7f, 0xd6, 0xa0, 0x3e, 0xce, 0x11, 0xf4, 0xf5, 0x14, 0x90, 0x51, 0x55, 0x5e, + 0x4d, 0xbf, 0x43, 0x4e, 0x43, 0xd4, 0x6d, 0x28, 0xfb, 0x81, 0x78, 0x72, 0xf9, 0x54, 0xc5, 0xf9, + 0x1b, 0x51, 0xec, 0xde, 0x53, 0xf4, 0xf3, 0x41, 0xe3, 0x4a, 0x06, 0x3e, 0x62, 0xe0, 0x58, 0x15, + 0xe9, 0x50, 0x92, 0xfe, 0x88, 0xa2, 0x2c, 0xda, 0x27, 0x79, 0xf8, 0x0f, 0x24, 0x05, 0x2b, 0x8e, + 0xfe, 0x3e, 0x94, 0x45, 0x77, 0xb8, 0x4b, 0xb8, 0x29, 0xae, 0x0c, 0x23, 0xee, 0xc1, 0x1d, 0xc7, + 0x3b, 0x52, 0xae, 0xc5, 0x57, 0x66, 0x4f, 0xd1, 0x71, 0x2c, 0x71, 0x51, 0x99, 0x2a, 0x4c, 0x56, + 0xa6, 0xf4, 0xff, 0x16, 0xa0, 0x2a, 0xac, 0x47, 0x95, 0xef, 0x7b, 0x50, 0x73, 0xd3, 0x6b, 0x52, + 0x5e, 0x5c, 0x51, 0x80, 0xd9, 0x28, 0xc5, 0x59, 0x59, 0xa1, 0x7c, 0xe0, 0x10, 0xd7, 0x8e, 0x95, + 0x0b, 0x59, 0xe5, 0x5b, 0x69, 0x26, 0xce, 0xca, 0x8a, 0xec, 0xf3, 0x58, 0x9c, 0xb6, 0x6a, 0x5f, + 0xe2, 0xec, 0xf3, 0x63, 0x41, 0xc4, 0x21, 0xef, 0xa2, 0x15, 0xcf, 0x4c, 0x58, 0x98, 0x6f, 0xc0, + 0xbc, 0xe8, 0x31, 0xfc, 0x3e, 0x8f, 0x7a, 0xbc, 0xa2, 0xec, 0x46, 0xd0, 0xd9, 0xa0, 0x31, 0xff, + 0x6e, 0x86, 0x83, 0x87, 0x24, 0xc7, 0x16, 0xf5, 0xd2, 0xe7, 0x2e, 0xea, 0xef, 0x41, 0x65, 0xd7, + 0xb1, 0xa8, 0x2f, 0x0c, 0x8b, 0xdc, 0xca, 0x32, 0x7d, 0x67, 0x9c, 0x83, 0x22, 0x87, 0x22, 0xbe, + 0xd8, 0x2d, 0xcf, 0xf4, 0xfc, 0xb0, 0xbb, 0x2c, 0x26, 0xbb, 0x75, 0x57, 0x10, 0x71, 0xc8, 0xbb, + 0xb1, 0x2c, 0x52, 0xea, 0x6f, 0x9f, 0x36, 0xa6, 0x9e, 0x3c, 0x6d, 0x4c, 0x7d, 0xf8, 0x54, 0xa5, + 0xd7, 0x4f, 0x01, 0xe0, 0xde, 0xfe, 0x2f, 0x88, 0x15, 0x86, 0xdc, 0xe5, 0x0f, 0x41, 0x51, 0x26, + 0xd5, 0xfc, 0x41, 0x3e, 0x9a, 0x0a, 0x43, 0x65, 0x32, 0xc5, 0xc3, 0x19, 0x49, 0xd4, 0x82, 0x4a, + 0xfc, 0x38, 0x54, 0x25, 0x60, 0x49, 0xa9, 0x55, 0xe2, 0x17, 0x24, 0x4e, 0x64, 0x32, 0xf1, 0x3f, + 0x73, 0x69, 0xfc, 0x1b, 0x30, 0xdd, 0x77, 0x6c, 0x79, 0x7e, 0x15, 0xe3, 0x5b, 0xd1, 0x1d, 0xbe, + 0xbf, 0xd3, 0x3e, 0x1f, 0x34, 0x5e, 0x19, 0x37, 0x56, 0xe1, 0xa7, 0x01, 0x61, 0xcd, 0xfb, 0x3b, + 0x6d, 0x2c, 0x94, 0x2f, 0x8a, 0xa8, 0xd2, 0x84, 0x11, 0xb5, 0x01, 0xa0, 0x56, 0x2d, 0xb4, 0x67, + 0xc3, 0x68, 0x8a, 0x1e, 0xca, 0xb7, 0x63, 0x0e, 0x4e, 0x49, 0x21, 0x06, 0x4b, 0x16, 0x25, 0xf2, + 0xb7, 0x38, 0x7a, 0xc6, 0xcd, 0x5e, 0x50, 0x2f, 0xcb, 0x72, 0xf2, 0x8d, 0x7c, 0x29, 0x56, 0xa8, + 0x19, 0x2f, 0x2b, 0x33, 0x4b, 0x5b, 0xc3, 0x60, 0x78, 0x14, 0x1f, 0xf9, 0xb0, 0x64, 0xab, 0xc6, + 0x3d, 0x31, 0x5a, 0x99, 0xd8, 0xe8, 0x15, 0x61, 0xb0, 0x3d, 0x0c, 0x84, 0x47, 0xb1, 0xd1, 0xcf, + 0x60, 0x25, 0x22, 0x8e, 0xbe, 0x9e, 0xea, 0x20, 0x77, 0x6a, 0x55, 0xbc, 0xe7, 0xda, 0x63, 0xa5, + 0xf0, 0x67, 0x20, 0x20, 0x1b, 0x4a, 0x6e, 0x58, 0x20, 0xab, 0xb2, 0x3a, 0x7d, 0x3f, 0xdf, 0x2a, + 0x92, 0xe8, 0x6f, 0xa6, 0x0b, 0x63, 0xfc, 0x82, 0x50, 0x35, 0x51, 0x61, 0xa3, 0x13, 0xa8, 0x9a, + 0x9e, 0xe7, 0x73, 0x33, 0x7c, 0xcf, 0xcd, 0x49, 0x53, 0x9b, 0x13, 0x9b, 0xda, 0x4c, 0x30, 0x86, + 0x0a, 0x71, 0x8a, 0x83, 0xd3, 0xa6, 0xd0, 0x63, 0x58, 0xf0, 0x1f, 0x7b, 0x84, 0x62, 0x72, 0x40, + 0x28, 0xf1, 0xc4, 0xe3, 0xbf, 0x26, 0xad, 0x7f, 0x3b, 0xa7, 0xf5, 0x8c, 0x72, 0x12, 0xd2, 0x59, + 0x3a, 0xc3, 0xc3, 0x56, 0x50, 0x13, 0xe0, 0xc0, 0xf1, 0x54, 0x3b, 0x55, 0x9f, 0x4f, 0xa6, 0x1d, + 0xb7, 0x62, 0x2a, 0x4e, 0x49, 0xa0, 0xef, 0x40, 0xd5, 0x72, 0xfb, 0x8c, 0x93, 0x70, 0xac, 0xb2, + 0x20, 0x6f, 0x50, 0xbc, 0xbe, 0xad, 0x84, 0x85, 0xd3, 0x72, 0xe8, 0x10, 0xe6, 0x9c, 0x54, 0xdf, + 0x56, 0x5f, 0x94, 0xb1, 0xb8, 0x31, 0x71, 0xb3, 0xc6, 0x8c, 0x45, 0x91, 0x89, 0xd2, 0x14, 0x9c, + 0x41, 0x5e, 0xf9, 0x2e, 0x54, 0x3f, 0x67, 0x1b, 0x21, 0xda, 0x90, 0xe1, 0xa3, 0x9b, 0xa8, 0x0d, + 0xf9, 0x5b, 0x01, 0xe6, 0xb3, 0x1b, 0x1e, 0xb7, 0xeb, 0xda, 0xd8, 0x31, 0x59, 0x94, 0x95, 0xa7, + 0xc7, 0x66, 0x65, 0x95, 0xfc, 0x66, 0x5e, 0x24, 0xf9, 0x6d, 0x00, 0x98, 0x81, 0x13, 0xe5, 0xbd, + 0x30, 0x8f, 0xc6, 0x99, 0x2b, 0x19, 0x04, 0xe1, 0x94, 0x94, 0x1c, 0x84, 0xf9, 0x1e, 0xa7, 0xbe, + 0xeb, 0x12, 0xaa, 0x2a, 0x5f, 0x38, 0x08, 0x8b, 0xa9, 0x38, 0x25, 0x81, 0x6e, 0x01, 0xda, 0x77, + 0x7d, 0xeb, 0x48, 0x6e, 0x41, 0x74, 0xcf, 0x65, 0x96, 0x2c, 0x87, 0x73, 0x15, 0x63, 0x84, 0x8b, + 0x2f, 0xd0, 0xd0, 0xef, 0x41, 0x76, 0x12, 0x82, 0x6e, 0x86, 0x1b, 0xa0, 0xc5, 0xa3, 0x8a, 0xc9, + 0x16, 0xaf, 0x5f, 0x83, 0x0a, 0xf6, 0x7d, 0xde, 0x31, 0xf9, 0x21, 0x43, 0x0d, 0x28, 0x06, 0xe2, + 0x87, 0x1a, 0x73, 0xc9, 0x49, 0xa3, 0xe4, 0xe0, 0x90, 0xae, 0xff, 0x4e, 0x83, 0x97, 0xc7, 0x4e, + 0x9d, 0xc4, 0x46, 0x5a, 0xf1, 0x97, 0x72, 0x29, 0xde, 0xc8, 0x44, 0x0e, 0xa7, 0xa4, 0x44, 0xb7, + 0x94, 0x19, 0x55, 0x0d, 0x77, 0x4b, 0x19, 0x6b, 0x38, 0x2b, 0xab, 0xff, 0xa7, 0x00, 0xa5, 0xf0, + 0x41, 0x81, 0x1e, 0x41, 0x59, 0x5c, 0x09, 0xdb, 0xe4, 0xa6, 0xb4, 0x9c, 0x7b, 0x66, 0x1c, 0x75, + 0x9d, 0x49, 0x8d, 0x8d, 0x28, 0x38, 0x46, 0x44, 0xaf, 0x43, 0x89, 0x49, 0x3b, 0xca, 0xbd, 0x38, + 0x49, 0x86, 0xd6, 0xb1, 0xe2, 0x8a, 0xde, 0xa5, 0x47, 0x18, 0x33, 0xbb, 0x51, 0xcc, 0xc6, 0xbd, + 0xcb, 0x6e, 0x48, 0xc6, 0x11, 0x1f, 0xbd, 0x2d, 0xde, 0x4f, 0x26, 0x8b, 0x7b, 0xb7, 0xd5, 0x08, + 0x12, 0x4b, 0xea, 0xf9, 0xa0, 0x31, 0xa7, 0xc0, 0xe5, 0x37, 0x56, 0xd2, 0xe8, 0x21, 0xcc, 0xda, + 0x84, 0x9b, 0x8e, 0x1b, 0xb6, 0x6c, 0xb9, 0x67, 0x6a, 0x21, 0x58, 0x3b, 0x54, 0x35, 0xaa, 0xc2, + 0x27, 0xf5, 0x81, 0x23, 0x40, 0x71, 0xdf, 0x2c, 0xdf, 0x0e, 0x07, 0xc2, 0xc5, 0xe4, 0xbe, 0x6d, + 0xf9, 0x36, 0xc1, 0x92, 0xa3, 0x3f, 0xd1, 0xa0, 0x1a, 0x22, 0x6d, 0x99, 0x7d, 0x46, 0xd0, 0x7a, + 0xbc, 0x8a, 0xf0, 0xb8, 0xa3, 0x52, 0x3c, 0xf3, 0xee, 0x69, 0x40, 0xce, 0x07, 0x8d, 0x8a, 0x14, + 0x13, 0x1f, 0xf1, 0x02, 0x52, 0x7b, 0x54, 0xb8, 0x64, 0x8f, 0x5e, 0x85, 0xa2, 0x6c, 0x8f, 0xd5, + 0x66, 0xc6, 0xfd, 0x9d, 0x6c, 0xa1, 0x71, 0xc8, 0xd3, 0x3f, 0x2e, 0x40, 0x2d, 0xb3, 0xb8, 0x1c, + 0xcd, 0x5c, 0xfc, 0xc8, 0x2f, 0xe4, 0x18, 0x1c, 0x8d, 0x1f, 0xe3, 0xff, 0x04, 0x4a, 0x96, 0x58, + 0x5f, 0xf4, 0x7f, 0x94, 0xf5, 0x49, 0x8e, 0x42, 0xee, 0x4c, 0x12, 0x49, 0xf2, 0x93, 0x61, 0x05, + 0x88, 0x6e, 0xc3, 0x12, 0x25, 0x9c, 0x9e, 0x6e, 0x1e, 0x70, 0x42, 0xd3, 0x3d, 0x7a, 0x31, 0x69, + 0x77, 0xf0, 0xb0, 0x00, 0x1e, 0xd5, 0x89, 0x32, 0x64, 0xe9, 0x05, 0x32, 0xa4, 0xee, 0xc2, 0xcc, + 0xff, 0xb1, 0x35, 0xff, 0x29, 0x54, 0x92, 0xe6, 0xe9, 0x0b, 0x36, 0xa9, 0xff, 0x1c, 0xca, 0x22, + 0x1a, 0xa3, 0xa6, 0xff, 0x92, 0x02, 0x94, 0x2d, 0x0d, 0x85, 0x3c, 0xa5, 0x41, 0xdf, 0x80, 0xf0, + 0xbf, 0x33, 0x22, 0x9b, 0x3a, 0x9c, 0xf4, 0x32, 0xd9, 0x74, 0x47, 0x10, 0x70, 0x48, 0x4f, 0x0d, + 0x7b, 0x7e, 0xa3, 0x01, 0xc8, 0x27, 0xde, 0xf6, 0xb1, 0x78, 0x96, 0xaf, 0xc1, 0x8c, 0x38, 0x81, + 0x61, 0xc7, 0xe4, 0x35, 0x92, 0x1c, 0x74, 0x1f, 0x4a, 0xbe, 0x6c, 0xaa, 0xd4, 0xf4, 0xe5, 0xcd, + 0xb1, 0x91, 0xa7, 0xfe, 0xf1, 0xda, 0xc4, 0xe6, 0xe3, 0xed, 0x13, 0x4e, 0x3c, 0xe1, 0x63, 0x12, + 0x75, 0x61, 0x67, 0x86, 0x15, 0x98, 0xf1, 0xda, 0xb3, 0xe7, 0xab, 0x53, 0x1f, 0x3d, 0x5f, 0x9d, + 0xfa, 0xe7, 0xf3, 0xd5, 0xa9, 0x0f, 0xce, 0x56, 0xb5, 0x67, 0x67, 0xab, 0xda, 0x47, 0x67, 0xab, + 0xda, 0xc7, 0x67, 0xab, 0xda, 0x93, 0x4f, 0x56, 0xa7, 0x1e, 0x16, 0x8e, 0xd7, 0xff, 0x17, 0x00, + 0x00, 0xff, 0xff, 0xe0, 0x97, 0x37, 0xbe, 0xba, 0x1e, 0x00, 0x00, } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index e73ebce9..a6be57a8 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -81,6 +81,9 @@ message APIResource { // shortNames is a list of suggested short names of the resource. repeated string shortNames = 5; + + // categories is a list of the grouped resources this resource belongs to (e.g. 'all') + repeated string categories = 7; } // APIResourceList is a list of APIResource, it is used to expose the name of the @@ -302,7 +305,7 @@ message ListMeta { // Value must be treated as opaque by clients and passed unmodified back to the server. // Populated by the system. // Read-only. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency // +optional optional string resourceVersion = 2; } @@ -342,6 +345,24 @@ message ListOptions { optional int64 timeoutSeconds = 5; } +// MicroTime is version of Time with microsecond level precision. +// +// +protobuf.options.marshal=false +// +protobuf.as=Timestamp +// +protobuf.options.(gogoproto.goproto_stringer)=false +message MicroTime { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + optional int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. This field may be limited in precision depending on context. + optional int32 nanos = 2; +} + // ObjectMeta is metadata that all persisted resources must have, which includes all objects // users must create. message ObjectMeta { @@ -368,7 +389,7 @@ message ObjectMeta { // should retry (optionally after the time indicated in the Retry-After header). // // Applied only if Name is not specified. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#idempotency + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency // +optional optional string generateName = 2; @@ -408,7 +429,7 @@ message ObjectMeta { // Populated by the system. // Read-only. // Value must be treated as opaque by clients and . - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency // +optional optional string resourceVersion = 6; @@ -424,7 +445,7 @@ message ObjectMeta { // Populated by the system. // Read-only. // Null for lists. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional optional Time creationTimestamp = 8; @@ -444,7 +465,7 @@ message ObjectMeta { // // Populated by the system when a graceful deletion is requested. // Read-only. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional optional Time deletionTimestamp = 9; @@ -512,7 +533,7 @@ message OwnerReference { optional string apiVersion = 5; // Kind of the referent. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds optional string kind = 1; // Name of the referent. @@ -564,13 +585,13 @@ message ServerAddressByClientCIDR { // Status is a return value for calls that don't return other objects. message Status { // Standard list metadata. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds // +optional optional ListMeta metadata = 1; // Status of the operation. // One of: "Success" or "Failure". - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status // +optional optional string status = 2; @@ -641,7 +662,7 @@ message StatusDetails { // The kind attribute of the resource associated with the status StatusReason. // On some operations may differ from the requested resource Kind. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds // +optional optional string kind = 3; @@ -705,14 +726,14 @@ message TypeMeta { // Servers may infer this from the endpoint the client submits requests to. // Cannot be updated. // In CamelCase. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds // +optional optional string kind = 1; // APIVersion defines the versioned schema of this representation of an object. // Servers should convert recognized schemas to the latest internal value, and // may reject unrecognized values. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources // +optional optional string apiVersion = 2; } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go index 8b6fdef5..bd4c6d9b 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go @@ -29,8 +29,8 @@ import ( // // +protobuf.options.(gogoproto.goproto_stringer)=false type GroupResource struct { - Group string `protobuf:"bytes,1,opt,name=group"` - Resource string `protobuf:"bytes,2,opt,name=resource"` + Group string `json:"group" protobuf:"bytes,1,opt,name=group"` + Resource string `json:"resource" protobuf:"bytes,2,opt,name=resource"` } func (gr *GroupResource) String() string { @@ -45,9 +45,9 @@ func (gr *GroupResource) String() string { // // +protobuf.options.(gogoproto.goproto_stringer)=false type GroupVersionResource struct { - Group string `protobuf:"bytes,1,opt,name=group"` - Version string `protobuf:"bytes,2,opt,name=version"` - Resource string `protobuf:"bytes,3,opt,name=resource"` + Group string `json:"group" protobuf:"bytes,1,opt,name=group"` + Version string `json:"version" protobuf:"bytes,2,opt,name=version"` + Resource string `json:"resource" protobuf:"bytes,3,opt,name=resource"` } func (gvr *GroupVersionResource) String() string { @@ -59,8 +59,8 @@ func (gvr *GroupVersionResource) String() string { // // +protobuf.options.(gogoproto.goproto_stringer)=false type GroupKind struct { - Group string `protobuf:"bytes,1,opt,name=group"` - Kind string `protobuf:"bytes,2,opt,name=kind"` + Group string `json:"group" protobuf:"bytes,1,opt,name=group"` + Kind string `json:"kind" protobuf:"bytes,2,opt,name=kind"` } func (gk *GroupKind) String() string { @@ -75,9 +75,9 @@ func (gk *GroupKind) String() string { // // +protobuf.options.(gogoproto.goproto_stringer)=false type GroupVersionKind struct { - Group string `protobuf:"bytes,1,opt,name=group"` - Version string `protobuf:"bytes,2,opt,name=version"` - Kind string `protobuf:"bytes,3,opt,name=kind"` + Group string `json:"group" protobuf:"bytes,1,opt,name=group"` + Version string `json:"version" protobuf:"bytes,2,opt,name=version"` + Kind string `json:"kind" protobuf:"bytes,3,opt,name=kind"` } func (gvk GroupVersionKind) String() string { @@ -88,8 +88,8 @@ func (gvk GroupVersionKind) String() string { // // +protobuf.options.(gogoproto.goproto_stringer)=false type GroupVersion struct { - Group string `protobuf:"bytes,1,opt,name=group"` - Version string `protobuf:"bytes,2,opt,name=version"` + Group string `json:"group" protobuf:"bytes,1,opt,name=group"` + Version string `json:"version" protobuf:"bytes,2,opt,name=version"` } // Empty returns true if group and version are empty diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go index c00eafcc..0ee7d99c 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go @@ -149,6 +149,9 @@ func (meta *ObjectMeta) GetFinalizers() []string { return m func (meta *ObjectMeta) SetFinalizers(finalizers []string) { meta.Finalizers = finalizers } func (meta *ObjectMeta) GetOwnerReferences() []OwnerReference { + if meta.OwnerReferences == nil { + return nil + } ret := make([]OwnerReference, len(meta.OwnerReferences)) for i := 0; i < len(meta.OwnerReferences); i++ { ret[i].Kind = meta.OwnerReferences[i].Kind @@ -168,6 +171,10 @@ func (meta *ObjectMeta) GetOwnerReferences() []OwnerReference { } func (meta *ObjectMeta) SetOwnerReferences(references []OwnerReference) { + if references == nil { + meta.OwnerReferences = nil + return + } newReferences := make([]OwnerReference, len(references)) for i := 0; i < len(references); i++ { newReferences[i].Kind = references[i].Kind diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go new file mode 100644 index 00000000..d55f446b --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go @@ -0,0 +1,184 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "encoding/json" + "time" + + "k8s.io/apimachinery/pkg/openapi" + + "github.com/go-openapi/spec" + "github.com/google/gofuzz" +) + +const RFC3339Micro = "2006-01-02T15:04:05.000000Z07:00" + +// MicroTime is version of Time with microsecond level precision. +// +// +protobuf.options.marshal=false +// +protobuf.as=Timestamp +// +protobuf.options.(gogoproto.goproto_stringer)=false +type MicroTime struct { + time.Time `protobuf:"-"` +} + +// DeepCopy returns a deep-copy of the MicroTime value. The underlying time.Time +// type is effectively immutable in the time API, so it is safe to +// copy-by-assign, despite the presence of (unexported) Pointer fields. +func (t MicroTime) DeepCopy() MicroTime { + return t +} + +// String returns the representation of the time. +func (t MicroTime) String() string { + return t.Time.String() +} + +// NewMicroTime returns a wrapped instance of the provided time +func NewMicroTime(time time.Time) MicroTime { + return MicroTime{time} +} + +// DateMicro returns the MicroTime corresponding to the supplied parameters +// by wrapping time.Date. +func DateMicro(year int, month time.Month, day, hour, min, sec, nsec int, loc *time.Location) MicroTime { + return MicroTime{time.Date(year, month, day, hour, min, sec, nsec, loc)} +} + +// NowMicro returns the current local time. +func NowMicro() MicroTime { + return MicroTime{time.Now()} +} + +// IsZero returns true if the value is nil or time is zero. +func (t *MicroTime) IsZero() bool { + if t == nil { + return true + } + return t.Time.IsZero() +} + +// Before reports whether the time instant t is before u. +func (t MicroTime) Before(u MicroTime) bool { + return t.Time.Before(u.Time) +} + +// Equal reports whether the time instant t is equal to u. +func (t MicroTime) Equal(u MicroTime) bool { + return t.Time.Equal(u.Time) +} + +// BeforeTime reports whether the time instant t is before second-lever precision u. +func (t MicroTime) BeforeTime(u Time) bool { + return t.Time.Before(u.Time) +} + +// EqualTime reports whether the time instant t is equal to second-lever precision u. +func (t MicroTime) EqualTime(u Time) bool { + return t.Time.Equal(u.Time) +} + +// UnixMicro returns the local time corresponding to the given Unix time +// by wrapping time.Unix. +func UnixMicro(sec int64, nsec int64) MicroTime { + return MicroTime{time.Unix(sec, nsec)} +} + +// UnmarshalJSON implements the json.Unmarshaller interface. +func (t *MicroTime) UnmarshalJSON(b []byte) error { + if len(b) == 4 && string(b) == "null" { + t.Time = time.Time{} + return nil + } + + var str string + json.Unmarshal(b, &str) + + pt, err := time.Parse(RFC3339Micro, str) + if err != nil { + return err + } + + t.Time = pt.Local() + return nil +} + +// UnmarshalQueryParameter converts from a URL query parameter value to an object +func (t *MicroTime) UnmarshalQueryParameter(str string) error { + if len(str) == 0 { + t.Time = time.Time{} + return nil + } + // Tolerate requests from older clients that used JSON serialization to build query params + if len(str) == 4 && str == "null" { + t.Time = time.Time{} + return nil + } + + pt, err := time.Parse(RFC3339Micro, str) + if err != nil { + return err + } + + t.Time = pt.Local() + return nil +} + +// MarshalJSON implements the json.Marshaler interface. +func (t MicroTime) MarshalJSON() ([]byte, error) { + if t.IsZero() { + // Encode unset/nil objects as JSON's "null". + return []byte("null"), nil + } + + return json.Marshal(t.UTC().Format(RFC3339Micro)) +} + +func (_ MicroTime) OpenAPIDefinition() openapi.OpenAPIDefinition { + return openapi.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "date-time", + }, + }, + } +} + +// MarshalQueryParameter converts to a URL query parameter value +func (t MicroTime) MarshalQueryParameter() (string, error) { + if t.IsZero() { + // Encode unset/nil objects as an empty string + return "", nil + } + + return t.UTC().Format(RFC3339Micro), nil +} + +// Fuzz satisfies fuzz.Interface. +func (t *MicroTime) Fuzz(c fuzz.Continue) { + if t == nil { + return + } + // Allow for about 1000 years of randomness. Leave off nanoseconds + // because JSON doesn't represent them so they can't round-trip + // properly. + t.Time = time.Unix(c.Rand.Int63n(1000*365*24*60*60*1000*1000), 0) +} + +var _ fuzz.Interface = &MicroTime{} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_proto.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_proto.go new file mode 100644 index 00000000..14841be5 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_proto.go @@ -0,0 +1,72 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "time" +) + +// Timestamp is declared in time_proto.go + +// Timestamp returns the Time as a new Timestamp value. +func (m *MicroTime) ProtoMicroTime() *Timestamp { + if m == nil { + return &Timestamp{} + } + return &Timestamp{ + Seconds: m.Time.Unix(), + Nanos: int32(m.Time.Nanosecond()), + } +} + +// Size implements the protobuf marshalling interface. +func (m *MicroTime) Size() (n int) { + if m == nil || m.Time.IsZero() { + return 0 + } + return m.ProtoMicroTime().Size() +} + +// Reset implements the protobuf marshalling interface. +func (m *MicroTime) Unmarshal(data []byte) error { + if len(data) == 0 { + m.Time = time.Time{} + return nil + } + p := Timestamp{} + if err := p.Unmarshal(data); err != nil { + return err + } + m.Time = time.Unix(p.Seconds, int64(p.Nanos)).Local() + return nil +} + +// Marshal implements the protobuf marshalling interface. +func (m *MicroTime) Marshal() (data []byte, err error) { + if m == nil || m.Time.IsZero() { + return nil, nil + } + return m.ProtoMicroTime().Marshal() +} + +// MarshalTo implements the protobuf marshalling interface. +func (m *MicroTime) MarshalTo(data []byte) (int, error) { + if m == nil || m.Time.IsZero() { + return 0, nil + } + return m.ProtoMicroTime().MarshalTo(data) +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go index 8645d1ab..6e449a43 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go @@ -27,6 +27,10 @@ const GroupName = "meta.k8s.io" // SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} +// Unversioned is group version for unversioned API objects +// TODO: this should be v1 probably +var Unversioned = schema.GroupVersion{Group: "", Version: "v1"} + // WatchEventKind is name reserved for serializing watch events. const WatchEventKind = "WatchEvent" @@ -56,6 +60,15 @@ func AddToGroupVersion(scheme *runtime.Scheme, groupVersion schema.GroupVersion) Convert_versioned_Event_to_versioned_InternalEvent, ) + // Register Unversioned types under their own special group + scheme.AddUnversionedTypes(Unversioned, + &Status{}, + &APIVersions{}, + &APIGroupList{}, + &APIGroup{}, + &APIResourceList{}, + ) + // register manually. This usually goes through the SchemeBuilder, which we cannot use here. scheme.AddGeneratedDeepCopyFuncs(GetGeneratedDeepCopyFuncs()...) AddConversionFuncs(scheme) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index 38833ce7..c5ac31f7 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -40,14 +40,14 @@ type TypeMeta struct { // Servers may infer this from the endpoint the client submits requests to. // Cannot be updated. // In CamelCase. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds // +optional Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"` // APIVersion defines the versioned schema of this representation of an object. // Servers should convert recognized schemas to the latest internal value, and // may reject unrecognized values. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources // +optional APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"` } @@ -66,7 +66,7 @@ type ListMeta struct { // Value must be treated as opaque by clients and passed unmodified back to the server. // Populated by the system. // Read-only. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency // +optional ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,2,opt,name=resourceVersion"` } @@ -103,7 +103,7 @@ type ObjectMeta struct { // should retry (optionally after the time indicated in the Retry-After header). // // Applied only if Name is not specified. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#idempotency + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency // +optional GenerateName string `json:"generateName,omitempty" protobuf:"bytes,2,opt,name=generateName"` @@ -143,7 +143,7 @@ type ObjectMeta struct { // Populated by the system. // Read-only. // Value must be treated as opaque by clients and . - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency // +optional ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,6,opt,name=resourceVersion"` @@ -159,7 +159,7 @@ type ObjectMeta struct { // Populated by the system. // Read-only. // Null for lists. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional CreationTimestamp Time `json:"creationTimestamp,omitempty" protobuf:"bytes,8,opt,name=creationTimestamp"` @@ -179,7 +179,7 @@ type ObjectMeta struct { // // Populated by the system when a graceful deletion is requested. // Read-only. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional DeletionTimestamp *Time `json:"deletionTimestamp,omitempty" protobuf:"bytes,9,opt,name=deletionTimestamp"` @@ -277,7 +277,7 @@ type OwnerReference struct { // API version of the referent. APIVersion string `json:"apiVersion" protobuf:"bytes,5,opt,name=apiVersion"` // Kind of the referent. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds Kind string `json:"kind" protobuf:"bytes,1,opt,name=kind"` // Name of the referent. // More info: http://kubernetes.io/docs/user-guide/identifiers#names @@ -412,13 +412,13 @@ type Preconditions struct { type Status struct { TypeMeta `json:",inline"` // Standard list metadata. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds // +optional ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` // Status of the operation. // One of: "Success" or "Failure". - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status // +optional Status string `json:"status,omitempty" protobuf:"bytes,2,opt,name=status"` // A human-readable description of the status of this operation. @@ -457,7 +457,7 @@ type StatusDetails struct { Group string `json:"group,omitempty" protobuf:"bytes,2,opt,name=group"` // The kind attribute of the resource associated with the status StatusReason. // On some operations may differ from the requested resource Kind. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds // +optional Kind string `json:"kind,omitempty" protobuf:"bytes,3,opt,name=kind"` // UID of the resource. @@ -740,6 +740,8 @@ type APIResource struct { Verbs Verbs `json:"verbs" protobuf:"bytes,4,opt,name=verbs"` // shortNames is a list of suggested short names of the resource. ShortNames []string `json:"shortNames,omitempty" protobuf:"bytes,5,rep,name=shortNames"` + // categories is a list of the grouped resources this resource belongs to (e.g. 'all') + Categories []string `json:"categories,omitempty" protobuf:"bytes,7,rep,name=categories"` } // Verbs masks the value so protobuf can generate diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go index ed74548b..159164d7 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go @@ -56,6 +56,7 @@ var map_APIResource = map[string]string{ "kind": "kind is the kind for the resource (e.g. 'Foo' is the kind for a resource 'foo')", "verbs": "verbs is a list of supported kube verbs (this includes get, list, watch, create, update, patch, delete, deletecollection, and proxy)", "shortNames": "shortNames is a list of suggested short names of the resource.", + "categories": "categories is a list of the grouped resources this resource belongs to (e.g. 'all')", } func (APIResource) SwaggerDoc() map[string]string { @@ -167,7 +168,7 @@ func (LabelSelectorRequirement) SwaggerDoc() map[string]string { var map_ListMeta = map[string]string{ "": "ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.", "selfLink": "SelfLink is a URL representing this object. Populated by the system. Read-only.", - "resourceVersion": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency", + "resourceVersion": "String that identifies the server's internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency", } func (ListMeta) SwaggerDoc() map[string]string { @@ -191,14 +192,14 @@ func (ListOptions) SwaggerDoc() map[string]string { var map_ObjectMeta = map[string]string{ "": "ObjectMeta is metadata that all persisted resources must have, which includes all objects users must create.", "name": "Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/identifiers#names", - "generateName": "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#idempotency", + "generateName": "GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.\n\nIf this field is specified and the generated name exists, the server will NOT return a 409 - instead, it will either return 201 Created or 500 with Reason ServerTimeout indicating a unique name could not be found in the time allotted, and the client should retry (optionally after the time indicated in the Retry-After header).\n\nApplied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#idempotency", "namespace": "Namespace defines the space within each name must be unique. An empty namespace is equivalent to the \"default\" namespace, but \"default\" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.\n\nMust be a DNS_LABEL. Cannot be updated. More info: http://kubernetes.io/docs/user-guide/namespaces", "selfLink": "SelfLink is a URL representing this object. Populated by the system. Read-only.", "uid": "UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.\n\nPopulated by the system. Read-only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids", - "resourceVersion": "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency", + "resourceVersion": "An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.\n\nPopulated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#concurrency-control-and-consistency", "generation": "A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.", - "creationTimestamp": "CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\n\nPopulated by the system. Read-only. Null for lists. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", - "deletionTimestamp": "DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field. Once set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.\n\nPopulated by the system when a graceful deletion is requested. Read-only. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", + "creationTimestamp": "CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.\n\nPopulated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "deletionTimestamp": "DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field. Once set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.\n\nPopulated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", "deletionGracePeriodSeconds": "Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.", "labels": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: http://kubernetes.io/docs/user-guide/labels", "annotations": "Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations", @@ -215,7 +216,7 @@ func (ObjectMeta) SwaggerDoc() map[string]string { var map_OwnerReference = map[string]string{ "": "OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.", "apiVersion": "API version of the referent.", - "kind": "Kind of the referent. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", + "kind": "Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", "name": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", "uid": "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids", "controller": "If true, this reference points to the managing controller.", @@ -264,8 +265,8 @@ func (ServerAddressByClientCIDR) SwaggerDoc() map[string]string { var map_Status = map[string]string{ "": "Status is a return value for calls that don't return other objects.", - "metadata": "Standard list metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", - "status": "Status of the operation. One of: \"Success\" or \"Failure\". More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "status": "Status of the operation. One of: \"Success\" or \"Failure\". More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status", "message": "A human-readable description of the status of this operation.", "reason": "A machine-readable description of why this operation is in the \"Failure\" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.", "details": "Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type.", @@ -291,7 +292,7 @@ var map_StatusDetails = map[string]string{ "": "StatusDetails is a set of additional properties that MAY be set by the server to provide additional information about a response. The Reason field of a Status object defines what attributes will be set. Clients must ignore fields that do not match the defined type of each attribute, and should assume that any attribute may be empty, invalid, or under defined.", "name": "The name attribute of the resource associated with the status StatusReason (when there is a single name which can be described).", "group": "The group attribute of the resource associated with the status StatusReason.", - "kind": "The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", + "kind": "The kind attribute of the resource associated with the status StatusReason. On some operations may differ from the requested resource Kind. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", "uid": "UID of the resource. (when there is a single resource which can be described). More info: http://kubernetes.io/docs/user-guide/identifiers#uids", "causes": "The Causes array includes more details associated with the StatusReason failure. Not all StatusReasons may provide detailed causes.", "retryAfterSeconds": "If specified, the time in seconds before the operation should be retried.", @@ -303,8 +304,8 @@ func (StatusDetails) SwaggerDoc() map[string]string { var map_TypeMeta = map[string]string{ "": "TypeMeta describes an individual object in an API response or request with strings representing the type of the object and its API schema version. Structures that are versioned or persisted should inline TypeMeta.", - "kind": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", - "apiVersion": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources", + "kind": "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "apiVersion": "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", } func (TypeMeta) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD index 0b4366c9..b6b0d2bb 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/BUILD @@ -22,9 +22,11 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/conversion/unstructured:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", ], ) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go index a74ed026..fed687e9 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go @@ -27,10 +27,12 @@ import ( "github.com/golang/glog" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/conversion/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/json" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) // Unstructured allows objects that do not have Golang structs registered to be manipulated @@ -248,22 +250,19 @@ func extractOwnerReference(src interface{}) metav1.OwnerReference { func setOwnerReference(src metav1.OwnerReference) map[string]interface{} { ret := make(map[string]interface{}) - controllerPtr := src.Controller - if controllerPtr != nil { - controller := *controllerPtr - controllerPtr = &controller - } - blockOwnerDeletionPtr := src.BlockOwnerDeletion - if blockOwnerDeletionPtr != nil { - blockOwnerDeletion := *blockOwnerDeletionPtr - blockOwnerDeletionPtr = &blockOwnerDeletion - } setNestedField(ret, src.Kind, "kind") setNestedField(ret, src.Name, "name") setNestedField(ret, src.APIVersion, "apiVersion") setNestedField(ret, string(src.UID), "uid") - setNestedField(ret, controllerPtr, "controller") - setNestedField(ret, blockOwnerDeletionPtr, "blockOwnerDeletion") + // json.Unmarshal() extracts boolean json fields as bool, not as *bool and hence extractOwnerReference() + // expects bool or a missing field, not *bool. So if pointer is nil, fields are omitted from the ret object. + // If pointer is non-nil, they are set to the referenced value. + if src.Controller != nil { + setNestedField(ret, *src.Controller, "controller") + } + if src.BlockOwnerDeletion != nil { + setNestedField(ret, *src.BlockOwnerDeletion, "blockOwnerDeletion") + } return ret } @@ -452,12 +451,34 @@ func (u *Unstructured) GroupVersionKind() schema.GroupVersionKind { return gvk } +var converter = unstructured.NewConverter(false) + func (u *Unstructured) GetInitializers() *metav1.Initializers { - panic("not implemented") + field := getNestedField(u.Object, "metadata", "initializers") + if field == nil { + return nil + } + obj, ok := field.(map[string]interface{}) + if !ok { + return nil + } + out := &metav1.Initializers{} + if err := converter.FromUnstructured(obj, out); err != nil { + utilruntime.HandleError(fmt.Errorf("unable to retrieve initializers for object: %v", err)) + } + return out } func (u *Unstructured) SetInitializers(initializers *metav1.Initializers) { - panic("not implemented") + if initializers == nil { + setNestedField(u.Object, nil, "metadata", "initializers") + return + } + out := make(map[string]interface{}) + if err := converter.ToUnstructured(initializers, &out); err != nil { + utilruntime.HandleError(fmt.Errorf("unable to retrieve initializers for object: %v", err)) + } + setNestedField(u.Object, out, "metadata", "initializers") } func (u *Unstructured) GetFinalizers() []string { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/well_known_labels.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/well_known_labels.go deleted file mode 100644 index 6d0b4696..00000000 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/well_known_labels.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2015 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1 - -const ( - LabelHostname = "kubernetes.io/hostname" - LabelZoneFailureDomain = "failure-domain.beta.kubernetes.io/zone" - LabelZoneRegion = "failure-domain.beta.kubernetes.io/region" - - LabelInstanceType = "beta.kubernetes.io/instance-type" - - LabelOS = "beta.kubernetes.io/os" - LabelArch = "beta.kubernetes.io/arch" - - // When feature-gate for TaintBasedEvictions=true flag is enabled, - // TaintNodeNotReady would be automatically added by node controller - // when node is not ready, and removed when node becomes ready. - TaintNodeNotReady = "node.alpha.kubernetes.io/notReady" - - // When feature-gate for TaintBasedEvictions=true flag is enabled, - // TaintNodeUnreachable would be automatically added by node controller - // when node becomes unreachable (corresponding to NodeReady status ConditionUnknown) - // and removed when node becomes reachable (NodeReady status ConditionTrue). - TaintNodeUnreachable = "node.alpha.kubernetes.io/unreachable" - - // When kubelet is started with the "external" cloud provider, then - // it sets this taint on a node to mark it as unusable, until a controller - // from the cloud-controller-manager intitializes this node, and then removes - // the taint - TaintExternalCloudProvider = "node.cloudprovider.kubernetes.io/uninitialized" -) - -// Role labels are applied to Nodes to mark their purpose. In particular, we -// usually want to distinguish the master, so that we can isolate privileged -// pods and operations. -// -// Originally we relied on not registering the master, on the fact that the -// master was Unschedulable, and on static manifests for master components. -// But we now do register masters in many environments, are generally moving -// away from static manifests (for better manageability), and working towards -// deprecating the unschedulable field (replacing it with taints & tolerations -// instead). -// -// Even with tainting, a label remains the easiest way of making a positive -// selection, so that pods can schedule only to master nodes for example, and -// thus installations will likely define a label for their master nodes. -// -// So that we can recognize master nodes in consequent places though (such as -// kubectl get nodes), we encourage installations to use the well-known labels. -// We define NodeLabelRole, which is the preferred form, but we will also recognize -// other forms that are known to be in widespread use (NodeLabelKubeadmAlphaRole). - -const ( - // NodeLabelRole is the preferred label applied to a Node as a hint that it has a particular purpose (defined by the value). - NodeLabelRole = "kubernetes.io/role" - - // NodeLabelKubeadmAlphaRole is a label that kubeadm applies to a Node as a hint that it has a particular purpose. - // Use of NodeLabelRole is preferred. - NodeLabelKubeadmAlphaRole = "kubeadm.alpha.kubernetes.io/role" - - // NodeLabelRoleMaster is the value of a NodeLabelRole or NodeLabelKubeadmAlphaRole label, indicating a master node. - // A master node typically runs kubernetes system components and will not typically run user workloads. - NodeLabelRoleMaster = "master" - - // NodeLabelRoleNode is the value of a NodeLabelRole or NodeLabelKubeadmAlphaRole label, indicating a "normal" node, - // as opposed to a RoleMaster node. - NodeLabelRoleNode = "node" -) diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go index 55293e03..6fac96be 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go @@ -52,6 +52,7 @@ func GetGeneratedDeepCopyFuncs() []conversion.GeneratedDeepCopyFunc { {Fn: DeepCopy_v1_LabelSelectorRequirement, InType: reflect.TypeOf(&LabelSelectorRequirement{})}, {Fn: DeepCopy_v1_ListMeta, InType: reflect.TypeOf(&ListMeta{})}, {Fn: DeepCopy_v1_ListOptions, InType: reflect.TypeOf(&ListOptions{})}, + {Fn: DeepCopy_v1_MicroTime, InType: reflect.TypeOf(&MicroTime{})}, {Fn: DeepCopy_v1_ObjectMeta, InType: reflect.TypeOf(&ObjectMeta{})}, {Fn: DeepCopy_v1_OwnerReference, InType: reflect.TypeOf(&OwnerReference{})}, {Fn: DeepCopy_v1_Patch, InType: reflect.TypeOf(&Patch{})}, @@ -125,6 +126,11 @@ func DeepCopy_v1_APIResource(in interface{}, out interface{}, c *conversion.Clon *out = make([]string, len(*in)) copy(*out, *in) } + if in.Categories != nil { + in, out := &in.Categories, &out.Categories + *out = make([]string, len(*in)) + copy(*out, *in) + } return nil } } @@ -412,6 +418,16 @@ func DeepCopy_v1_ListOptions(in interface{}, out interface{}, c *conversion.Clon } } +// DeepCopy_v1_MicroTime is an autogenerated deepcopy function. +func DeepCopy_v1_MicroTime(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*MicroTime) + out := out.(*MicroTime) + *out = in.DeepCopy() + return nil + } +} + // DeepCopy_v1_ObjectMeta is an autogenerated deepcopy function. func DeepCopy_v1_ObjectMeta(in interface{}, out interface{}, c *conversion.Cloner) error { { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD index dbcfb820..e60fab88 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/BUILD @@ -14,7 +14,9 @@ go_library( "generated.pb.go", "register.go", "types.go", + "types_swagger_doc_generated.go", "zz_generated.deepcopy.go", + "zz_generated.defaults.go", ], tags = ["automanaged"], deps = [ diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.pb.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.pb.go index 5130bb56..de423344 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.pb.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.pb.go @@ -26,6 +26,7 @@ limitations under the License. It has these top-level messages: PartialObjectMetadata + PartialObjectMetadataList TableOptions */ package v1alpha1 @@ -54,12 +55,19 @@ func (m *PartialObjectMetadata) Reset() { *m = PartialObjectM func (*PartialObjectMetadata) ProtoMessage() {} func (*PartialObjectMetadata) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{0} } +func (m *PartialObjectMetadataList) Reset() { *m = PartialObjectMetadataList{} } +func (*PartialObjectMetadataList) ProtoMessage() {} +func (*PartialObjectMetadataList) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{1} +} + func (m *TableOptions) Reset() { *m = TableOptions{} } func (*TableOptions) ProtoMessage() {} -func (*TableOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{1} } +func (*TableOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{2} } func init() { proto.RegisterType((*PartialObjectMetadata)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1alpha1.PartialObjectMetadata") + proto.RegisterType((*PartialObjectMetadataList)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1alpha1.PartialObjectMetadataList") proto.RegisterType((*TableOptions)(nil), "k8s.io.apimachinery.pkg.apis.meta.v1alpha1.TableOptions") } func (m *PartialObjectMetadata) Marshal() (dAtA []byte, err error) { @@ -88,6 +96,36 @@ func (m *PartialObjectMetadata) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *PartialObjectMetadataList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PartialObjectMetadataList) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } + return i, nil +} + func (m *TableOptions) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -145,6 +183,18 @@ func (m *PartialObjectMetadata) Size() (n int) { return n } +func (m *PartialObjectMetadataList) Size() (n int) { + var l int + _ = l + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *TableOptions) Size() (n int) { var l int _ = l @@ -176,6 +226,16 @@ func (this *PartialObjectMetadata) String() string { }, "") return s } +func (this *PartialObjectMetadataList) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PartialObjectMetadataList{`, + `Items:` + strings.Replace(fmt.Sprintf("%v", this.Items), "PartialObjectMetadata", "PartialObjectMetadata", 1) + `,`, + `}`, + }, "") + return s +} func (this *TableOptions) String() string { if this == nil { return "nil" @@ -274,6 +334,87 @@ func (m *PartialObjectMetadata) Unmarshal(dAtA []byte) error { } return nil } +func (m *PartialObjectMetadataList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PartialObjectMetadataList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PartialObjectMetadataList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, &PartialObjectMetadata{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TableOptions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -463,27 +604,30 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 344 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x3f, 0x4f, 0xf3, 0x30, - 0x10, 0x87, 0x93, 0xad, 0x6f, 0x5e, 0xba, 0x04, 0x21, 0xa1, 0x0e, 0x2e, 0xea, 0x84, 0x2a, 0xb0, - 0x29, 0x20, 0xc4, 0xdc, 0x8d, 0x01, 0xb5, 0x2a, 0x4c, 0x4c, 0x38, 0xc9, 0x91, 0x98, 0x24, 0x76, - 0x64, 0x5f, 0x2a, 0x75, 0xe3, 0x23, 0xf0, 0xb1, 0x3a, 0x76, 0x64, 0xaa, 0x68, 0xf8, 0x16, 0x4c, - 0xa8, 0x69, 0x4b, 0xff, 0xa9, 0xa2, 0xdb, 0xdd, 0xef, 0xf2, 0x3c, 0x39, 0x5b, 0x76, 0x1e, 0xe2, - 0x5b, 0x43, 0x85, 0x62, 0x71, 0xee, 0x81, 0x96, 0x80, 0x60, 0x58, 0x1f, 0x64, 0xa0, 0x34, 0x9b, - 0x0f, 0x78, 0x26, 0x52, 0xee, 0x47, 0x42, 0x82, 0x1e, 0xb0, 0x2c, 0x0e, 0xa7, 0x81, 0x61, 0x29, - 0x20, 0x67, 0xfd, 0x16, 0x4f, 0xb2, 0x88, 0xb7, 0x58, 0x08, 0x12, 0x34, 0x47, 0x08, 0x68, 0xa6, - 0x15, 0x2a, 0xb7, 0x39, 0x63, 0xe9, 0x2a, 0x4b, 0xb3, 0x38, 0x9c, 0x06, 0x86, 0x4e, 0x59, 0xba, - 0x60, 0x6b, 0xe7, 0xa1, 0xc0, 0x28, 0xf7, 0xa8, 0xaf, 0x52, 0x16, 0xaa, 0x50, 0xb1, 0x52, 0xe1, - 0xe5, 0x2f, 0x65, 0x57, 0x36, 0x65, 0x35, 0x53, 0xd7, 0xae, 0xf7, 0x59, 0x6b, 0x73, 0xa1, 0xda, - 0xce, 0xc3, 0xe8, 0x5c, 0xa2, 0x48, 0x61, 0x0b, 0xb8, 0xf9, 0x0b, 0x30, 0x7e, 0x04, 0x29, 0xdf, - 0xe2, 0xae, 0x76, 0x71, 0x39, 0x8a, 0x84, 0x09, 0x89, 0x06, 0xf5, 0x26, 0xd4, 0x18, 0x38, 0x47, - 0x5d, 0xae, 0x51, 0xf0, 0xa4, 0xe3, 0xbd, 0x82, 0x8f, 0xf7, 0x80, 0x3c, 0xe0, 0xc8, 0xdd, 0x67, - 0xa7, 0x92, 0xce, 0xeb, 0x63, 0xfb, 0xc4, 0x3e, 0xfd, 0x7f, 0x79, 0x41, 0xf7, 0xb9, 0x5a, 0xba, - 0xf4, 0xb4, 0xdd, 0xe1, 0xb8, 0x6e, 0x15, 0xe3, 0xba, 0xb3, 0xcc, 0x7a, 0xbf, 0xd6, 0x86, 0xe7, - 0x1c, 0x3c, 0x72, 0x2f, 0x81, 0x4e, 0x86, 0x42, 0x49, 0xe3, 0xf6, 0x9c, 0xaa, 0x90, 0x7e, 0x92, - 0x07, 0x30, 0xfb, 0xbc, 0xfc, 0xed, 0xbf, 0xf6, 0xd9, 0x5c, 0x52, 0xbd, 0x5b, 0x1d, 0x7e, 0x8f, - 0xeb, 0x87, 0x6b, 0x41, 0x57, 0x25, 0xc2, 0x1f, 0xf4, 0xd6, 0x15, 0xed, 0xe6, 0x70, 0x42, 0xac, - 0xd1, 0x84, 0x58, 0x1f, 0x13, 0x62, 0xbd, 0x15, 0xc4, 0x1e, 0x16, 0xc4, 0x1e, 0x15, 0xc4, 0xfe, - 0x2c, 0x88, 0xfd, 0xfe, 0x45, 0xac, 0xa7, 0xca, 0xe2, 0x35, 0xfc, 0x04, 0x00, 0x00, 0xff, 0xff, - 0x20, 0xf7, 0xa9, 0xe2, 0x8f, 0x02, 0x00, 0x00, + // 388 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xbf, 0x6e, 0xd4, 0x40, + 0x10, 0x87, 0x6d, 0xa1, 0x48, 0xc9, 0x86, 0x34, 0x46, 0x48, 0xe1, 0x8a, 0x75, 0x74, 0x55, 0x14, + 0xc1, 0x2e, 0x09, 0x08, 0xd1, 0xe2, 0x2e, 0x12, 0x28, 0x91, 0xa1, 0xa2, 0x62, 0x6d, 0x0f, 0xf6, + 0x62, 0x7b, 0xd7, 0xda, 0x1d, 0x47, 0xba, 0x0a, 0x1e, 0x81, 0xc7, 0xba, 0x32, 0x25, 0x95, 0xc5, + 0x99, 0xb7, 0xa0, 0x42, 0xb6, 0x2f, 0xe4, 0xfe, 0x2a, 0xd7, 0xcd, 0xfc, 0x46, 0xdf, 0xe7, 0x19, + 0x2f, 0xf9, 0x98, 0xbf, 0xb5, 0x4c, 0x6a, 0x9e, 0xd7, 0x11, 0x18, 0x05, 0x08, 0x96, 0xdf, 0x80, + 0x4a, 0xb4, 0xe1, 0xf3, 0x81, 0xa8, 0x64, 0x29, 0xe2, 0x4c, 0x2a, 0x30, 0x13, 0x5e, 0xe5, 0x69, + 0x17, 0x58, 0x5e, 0x02, 0x0a, 0x7e, 0x73, 0x2e, 0x8a, 0x2a, 0x13, 0xe7, 0x3c, 0x05, 0x05, 0x46, + 0x20, 0x24, 0xac, 0x32, 0x1a, 0xb5, 0x77, 0x36, 0xb0, 0x6c, 0x91, 0x65, 0x55, 0x9e, 0x76, 0x81, + 0x65, 0x1d, 0xcb, 0xee, 0xd8, 0xd1, 0x8b, 0x54, 0x62, 0x56, 0x47, 0x2c, 0xd6, 0x25, 0x4f, 0x75, + 0xaa, 0x79, 0xaf, 0x88, 0xea, 0xaf, 0x7d, 0xd7, 0x37, 0x7d, 0x35, 0xa8, 0x47, 0xaf, 0x77, 0x59, + 0x6b, 0x75, 0xa1, 0xd1, 0xd6, 0x63, 0x4c, 0xad, 0x50, 0x96, 0xb0, 0x06, 0xbc, 0x79, 0x08, 0xb0, + 0x71, 0x06, 0xa5, 0x58, 0xe3, 0x5e, 0x6d, 0xe3, 0x6a, 0x94, 0x05, 0x97, 0x0a, 0x2d, 0x9a, 0x55, + 0x68, 0x3c, 0x21, 0x4f, 0xaf, 0x85, 0x41, 0x29, 0x8a, 0xab, 0xe8, 0x1b, 0xc4, 0xf8, 0x01, 0x50, + 0x24, 0x02, 0x85, 0xf7, 0x85, 0xec, 0x97, 0xf3, 0xfa, 0xd8, 0x3d, 0x71, 0x4f, 0x0f, 0x2f, 0x5e, + 0xb2, 0x5d, 0x7e, 0x2d, 0xbb, 0xf7, 0x04, 0xde, 0xb4, 0xf1, 0x9d, 0xb6, 0xf1, 0xc9, 0x7d, 0x16, + 0xfe, 0xb7, 0x8e, 0xbf, 0x93, 0x67, 0x1b, 0x3f, 0xfd, 0x5e, 0x5a, 0xf4, 0x22, 0xb2, 0x27, 0x11, + 0x4a, 0x7b, 0xec, 0x9e, 0x3c, 0x3a, 0x3d, 0xbc, 0x78, 0xc7, 0x76, 0x7f, 0x56, 0xb6, 0xd1, 0x1a, + 0x1c, 0xb4, 0x8d, 0xbf, 0x77, 0xd9, 0x39, 0xc3, 0x41, 0x3d, 0x8e, 0xc8, 0xe3, 0x4f, 0x22, 0x2a, + 0xe0, 0xaa, 0x42, 0xa9, 0x95, 0xf5, 0x42, 0x72, 0x24, 0x55, 0x5c, 0xd4, 0x09, 0x0c, 0x68, 0x7f, + 0xf7, 0x41, 0xf0, 0x7c, 0x7e, 0xc5, 0xd1, 0xe5, 0xe2, 0xf0, 0x6f, 0xe3, 0x3f, 0x59, 0x0a, 0xae, + 0x75, 0x21, 0xe3, 0x49, 0xb8, 0xac, 0x08, 0xce, 0xa6, 0x33, 0xea, 0xdc, 0xce, 0xa8, 0xf3, 0x6b, + 0x46, 0x9d, 0x1f, 0x2d, 0x75, 0xa7, 0x2d, 0x75, 0x6f, 0x5b, 0xea, 0xfe, 0x6e, 0xa9, 0xfb, 0xf3, + 0x0f, 0x75, 0x3e, 0xef, 0xdf, 0xed, 0xfd, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x08, 0x1a, 0xd9, 0x53, + 0x10, 0x03, 0x00, 0x00, } diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.proto b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.proto index 22e2eb85..06833dbd 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.proto +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/generated.proto @@ -33,11 +33,17 @@ option go_package = "v1alpha1"; // to get access to a particular ObjectMeta schema without knowing the details of the version. message PartialObjectMetadata { // Standard object's metadata. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; } +// PartialObjectMetadataList contains a list of objects containing only their metadata +message PartialObjectMetadataList { + // items contains each of the included items. + repeated PartialObjectMetadata items = 1; +} + // TableOptions are used when a Table is requested by the caller. message TableOptions { // includeObject decides whether to include each object along with its columnar information. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go index 9caf2771..89f08f38 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/register.go @@ -43,6 +43,7 @@ func init() { &Table{}, &TableOptions{}, &PartialObjectMetadata{}, + &PartialObjectMetadataList{}, ) // register manually. This usually goes through the SchemeBuilder, which we cannot use here. diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go index a6800fc1..ef992180 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types.go @@ -22,36 +22,44 @@ import ( "k8s.io/apimachinery/pkg/runtime" ) +// TODO: Table does not generate to protobuf because of the interface{} - fix protobuf +// generation to support a meta type that can accept any valid JSON. + // Table is a tabular representation of a set of API resources. The server transforms the // object into a set of preferred columns for quickly reviewing the objects. // +protobuf=false type Table struct { v1.TypeMeta `json:",inline"` // Standard list metadata. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds // +optional - v1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + v1.ListMeta `json:"metadata,omitempty"` // columnDefinitions describes each column in the returned items array. The number of cells per row // will always match the number of column definitions. - ColumnDefinitions []TableColumnDefinitions `json:"columnDefinitions"` + ColumnDefinitions []TableColumnDefinition `json:"columnDefinitions"` // rows is the list of items in the table. Rows []TableRow `json:"rows"` } -// TableColumnDefinitions contains information about a column returned in the Table. +// TableColumnDefinition contains information about a column returned in the Table. // +protobuf=false -type TableColumnDefinitions struct { +type TableColumnDefinition struct { // name is a human readable name for the column. Name string `json:"name"` // type is an OpenAPI type definition for this column. // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. Type string `json:"type"` - // format is an optional OpenAPI type definition for this column. + // format is an optional OpenAPI type definition for this column. The 'name' format is applied + // to the primary identifier column to assist in clients identifying column is the resource name. // See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more. Format string `json:"format"` // description is a human readable description of this column. Description string `json:"description"` + // priority is an integer defining the relative importance of this column compared to others. Lower + // numbers are considered higher priority. Columns that may be omitted in limited space scenarios + // should be given a higher priority. + Priority int32 `json:"priority"` } // TableRow is an individual row in a table. @@ -60,13 +68,54 @@ type TableRow struct { // cells will be as wide as headers and may contain strings, numbers, booleans, simple maps, or lists, or // null. See the type field of the column definition for a more detailed description. Cells []interface{} `json:"cells"` + // conditions describe additional status of a row that are relevant for a human user. + // +optional + Conditions []TableRowCondition `json:"conditions,omitempty"` // This field contains the requested additional information about each object based on the includeObject // policy when requesting the Table. If "None", this field is empty, if "Object" this will be the // default serialization of the object for the current API version, and if "Metadata" (the default) will // contain the object metadata. Check the returned kind and apiVersion of the object before parsing. - Object runtime.RawExtension `json:"object"` + // +optional + Object runtime.RawExtension `json:"object,omitempty"` +} + +// TableRowCondition allows a row to be marked with additional information. +// +protobuf=false +type TableRowCondition struct { + // Type of row condition. + Type RowConditionType `json:"type"` + // Status of the condition, one of True, False, Unknown. + Status ConditionStatus `json:"status"` + // (brief) machine readable reason for the condition's last transition. + // +optional + Reason string `json:"reason,omitempty"` + // Human readable message indicating details about last transition. + // +optional + Message string `json:"message,omitempty"` } +type RowConditionType string + +// These are valid conditions of a row. This list is not exhaustive and new conditions may be +// inculded by other resources. +const ( + // RowCompleted means the underlying resource has reached completion and may be given less + // visual priority than other resources. + RowCompleted RowConditionType = "Completed" +) + +type ConditionStatus string + +// These are valid condition statuses. "ConditionTrue" means a resource is in the condition. +// "ConditionFalse" means a resource is not in the condition. "ConditionUnknown" means kubernetes +// can't decide if a resource is in the condition or not. In the future, we could add other +// intermediate conditions, e.g. ConditionDegraded. +const ( + ConditionTrue ConditionStatus = "True" + ConditionFalse ConditionStatus = "False" + ConditionUnknown ConditionStatus = "Unknown" +) + // IncludeObjectPolicy controls which portion of the object is returned with a Table. type IncludeObjectPolicy string @@ -86,7 +135,7 @@ type TableOptions struct { // Specifying "None" will return no object, specifying "Object" will return the full object contents, and // specifying "Metadata" (the default) will return the object's metadata in the PartialObjectMetadata kind // in version v1alpha1 of the meta.k8s.io API group. - IncludeObject IncludeObjectPolicy `json:"includeObject,omitempty" protobuf:"bytes,1,opt,name=includeObject"` + IncludeObject IncludeObjectPolicy `json:"includeObject,omitempty" protobuf:"bytes,1,opt,name=includeObject,casttype=IncludeObjectPolicy"` } // PartialObjectMetadata is a generic representation of any object with ObjectMeta. It allows clients @@ -94,7 +143,15 @@ type TableOptions struct { type PartialObjectMetadata struct { v1.TypeMeta `json:",inline"` // Standard object's metadata. - // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata + // More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata // +optional v1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` } + +// PartialObjectMetadataList contains a list of objects containing only their metadata +type PartialObjectMetadataList struct { + v1.TypeMeta `json:",inline"` + + // items contains each of the included items. + Items []*PartialObjectMetadata `json:"items" protobuf:"bytes,1,rep,name=items"` +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types_swagger_doc_generated.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types_swagger_doc_generated.go new file mode 100644 index 00000000..e8bb6260 --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/types_swagger_doc_generated.go @@ -0,0 +1,104 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE +var map_PartialObjectMetadata = map[string]string{ + "": "PartialObjectMetadata is a generic representation of any object with ObjectMeta. It allows clients to get access to a particular ObjectMeta schema without knowing the details of the version.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", +} + +func (PartialObjectMetadata) SwaggerDoc() map[string]string { + return map_PartialObjectMetadata +} + +var map_PartialObjectMetadataList = map[string]string{ + "": "PartialObjectMetadataList contains a list of objects containing only their metadata", + "items": "items contains each of the included items.", +} + +func (PartialObjectMetadataList) SwaggerDoc() map[string]string { + return map_PartialObjectMetadataList +} + +var map_Table = map[string]string{ + "": "Table is a tabular representation of a set of API resources. The server transforms the object into a set of preferred columns for quickly reviewing the objects.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + "columnDefinitions": "columnDefinitions describes each column in the returned items array. The number of cells per row will always match the number of column definitions.", + "rows": "rows is the list of items in the table.", +} + +func (Table) SwaggerDoc() map[string]string { + return map_Table +} + +var map_TableColumnDefinition = map[string]string{ + "": "TableColumnDefinition contains information about a column returned in the Table.", + "name": "name is a human readable name for the column.", + "type": "type is an OpenAPI type definition for this column. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.", + "format": "format is an optional OpenAPI type definition for this column. The 'name' format is applied to the primary identifier column to assist in clients identifying column is the resource name. See https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types for more.", + "description": "description is a human readable description of this column.", + "priority": "priority is an integer defining the relative importance of this column compared to others. Lower numbers are considered higher priority. Columns that may be omitted in limited space scenarios should be given a higher priority.", +} + +func (TableColumnDefinition) SwaggerDoc() map[string]string { + return map_TableColumnDefinition +} + +var map_TableOptions = map[string]string{ + "": "TableOptions are used when a Table is requested by the caller.", + "includeObject": "includeObject decides whether to include each object along with its columnar information. Specifying \"None\" will return no object, specifying \"Object\" will return the full object contents, and specifying \"Metadata\" (the default) will return the object's metadata in the PartialObjectMetadata kind in version v1alpha1 of the meta.k8s.io API group.", +} + +func (TableOptions) SwaggerDoc() map[string]string { + return map_TableOptions +} + +var map_TableRow = map[string]string{ + "": "TableRow is an individual row in a table.", + "cells": "cells will be as wide as headers and may contain strings, numbers, booleans, simple maps, or lists, or null. See the type field of the column definition for a more detailed description.", + "conditions": "conditions describe additional status of a row that are relevant for a human user.", + "object": "This field contains the requested additional information about each object based on the includeObject policy when requesting the Table. If \"None\", this field is empty, if \"Object\" this will be the default serialization of the object for the current API version, and if \"Metadata\" (the default) will contain the object metadata. Check the returned kind and apiVersion of the object before parsing.", +} + +func (TableRow) SwaggerDoc() map[string]string { + return map_TableRow +} + +var map_TableRowCondition = map[string]string{ + "": "TableRowCondition allows a row to be marked with additional information.", + "type": "Type of row condition.", + "status": "Status of the condition, one of True, False, Unknown.", + "reason": "(brief) machine readable reason for the condition's last transition.", + "message": "Human readable message indicating details about last transition.", +} + +func (TableRowCondition) SwaggerDoc() map[string]string { + return map_TableRowCondition +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/zz_generated.deepcopy.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/zz_generated.deepcopy.go index 367b11d9..ef8a117d 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/zz_generated.deepcopy.go @@ -31,10 +31,12 @@ import ( func GetGeneratedDeepCopyFuncs() []conversion.GeneratedDeepCopyFunc { return []conversion.GeneratedDeepCopyFunc{ {Fn: DeepCopy_v1alpha1_PartialObjectMetadata, InType: reflect.TypeOf(&PartialObjectMetadata{})}, + {Fn: DeepCopy_v1alpha1_PartialObjectMetadataList, InType: reflect.TypeOf(&PartialObjectMetadataList{})}, {Fn: DeepCopy_v1alpha1_Table, InType: reflect.TypeOf(&Table{})}, - {Fn: DeepCopy_v1alpha1_TableColumnDefinitions, InType: reflect.TypeOf(&TableColumnDefinitions{})}, + {Fn: DeepCopy_v1alpha1_TableColumnDefinition, InType: reflect.TypeOf(&TableColumnDefinition{})}, {Fn: DeepCopy_v1alpha1_TableOptions, InType: reflect.TypeOf(&TableOptions{})}, {Fn: DeepCopy_v1alpha1_TableRow, InType: reflect.TypeOf(&TableRow{})}, + {Fn: DeepCopy_v1alpha1_TableRowCondition, InType: reflect.TypeOf(&TableRowCondition{})}, } } @@ -53,6 +55,27 @@ func DeepCopy_v1alpha1_PartialObjectMetadata(in interface{}, out interface{}, c } } +// DeepCopy_v1alpha1_PartialObjectMetadataList is an autogenerated deepcopy function. +func DeepCopy_v1alpha1_PartialObjectMetadataList(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*PartialObjectMetadataList) + out := out.(*PartialObjectMetadataList) + *out = *in + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]*PartialObjectMetadata, len(*in)) + for i := range *in { + if newVal, err := c.DeepCopy(&(*in)[i]); err != nil { + return err + } else { + (*out)[i] = *newVal.(**PartialObjectMetadata) + } + } + } + return nil + } +} + // DeepCopy_v1alpha1_Table is an autogenerated deepcopy function. func DeepCopy_v1alpha1_Table(in interface{}, out interface{}, c *conversion.Cloner) error { { @@ -61,7 +84,7 @@ func DeepCopy_v1alpha1_Table(in interface{}, out interface{}, c *conversion.Clon *out = *in if in.ColumnDefinitions != nil { in, out := &in.ColumnDefinitions, &out.ColumnDefinitions - *out = make([]TableColumnDefinitions, len(*in)) + *out = make([]TableColumnDefinition, len(*in)) copy(*out, *in) } if in.Rows != nil { @@ -79,11 +102,11 @@ func DeepCopy_v1alpha1_Table(in interface{}, out interface{}, c *conversion.Clon } } -// DeepCopy_v1alpha1_TableColumnDefinitions is an autogenerated deepcopy function. -func DeepCopy_v1alpha1_TableColumnDefinitions(in interface{}, out interface{}, c *conversion.Cloner) error { +// DeepCopy_v1alpha1_TableColumnDefinition is an autogenerated deepcopy function. +func DeepCopy_v1alpha1_TableColumnDefinition(in interface{}, out interface{}, c *conversion.Cloner) error { { - in := in.(*TableColumnDefinitions) - out := out.(*TableColumnDefinitions) + in := in.(*TableColumnDefinition) + out := out.(*TableColumnDefinition) *out = *in return nil } @@ -116,6 +139,11 @@ func DeepCopy_v1alpha1_TableRow(in interface{}, out interface{}, c *conversion.C } } } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]TableRowCondition, len(*in)) + copy(*out, *in) + } if newVal, err := c.DeepCopy(&in.Object); err != nil { return err } else { @@ -124,3 +152,13 @@ func DeepCopy_v1alpha1_TableRow(in interface{}, out interface{}, c *conversion.C return nil } } + +// DeepCopy_v1alpha1_TableRowCondition is an autogenerated deepcopy function. +func DeepCopy_v1alpha1_TableRowCondition(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*TableRowCondition) + out := out.(*TableRowCondition) + *out = *in + return nil + } +} diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/well_known_annotations.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/zz_generated.defaults.go similarity index 56% rename from vendor/k8s.io/apimachinery/pkg/apis/meta/v1/well_known_annotations.go rename to vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/zz_generated.defaults.go index 937c54c7..7e6df29d 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/well_known_annotations.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1alpha1/zz_generated.defaults.go @@ -1,3 +1,5 @@ +// +build !ignore_autogenerated + /* Copyright 2017 The Kubernetes Authors. @@ -14,12 +16,17 @@ See the License for the specific language governing permissions and limitations under the License. */ -package v1 +// This file was autogenerated by defaulter-gen. Do not edit it manually! + +package v1alpha1 -const ( - // When kubelet is started with the "external" cloud provider, then - // it sets this annotation on the node to denote an ip address set from the - // cmd line flag. This ip is verified with the cloudprovider as valid by - // the cloud-controller-manager - AnnotationProvidedIPAddr = "alpha.kubernetes.io/provided-node-ip" +import ( + runtime "k8s.io/apimachinery/pkg/runtime" ) + +// RegisterDefaults adds defaulters functions to the given scheme. +// Public to allow building arbitrary schemes. +// All generated defaulters are covering - they call all nested defaulters. +func RegisterDefaults(scheme *runtime.Scheme) error { + return nil +} diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/OWNERS b/vendor/k8s.io/apimachinery/pkg/conversion/OWNERS deleted file mode 100644 index c25e7faf..00000000 --- a/vendor/k8s.io/apimachinery/pkg/conversion/OWNERS +++ /dev/null @@ -1,10 +0,0 @@ -approvers: -- derekwaynecarr -- lavalamp -- smarterclayton -- wojtek-t -reviewers: -- derekwaynecarr -- lavalamp -- smarterclayton -- wojtek-t diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD b/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD index b0337b40..0804afc3 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/BUILD @@ -31,7 +31,6 @@ go_library( deps = [ "//vendor/github.com/golang/glog:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", - "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/json:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", diff --git a/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/converter.go b/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/converter.go index fc28406b..cf84a619 100644 --- a/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/converter.go +++ b/vendor/k8s.io/apimachinery/pkg/conversion/unstructured/converter.go @@ -29,7 +29,6 @@ import ( "sync/atomic" apiequality "k8s.io/apimachinery/pkg/api/equality" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/diff" "k8s.io/apimachinery/pkg/util/json" utilruntime "k8s.io/apimachinery/pkg/util/runtime" @@ -37,11 +36,11 @@ import ( "github.com/golang/glog" ) -// Converter is an interface for converting between runtime.Object +// Converter is an interface for converting between interface{} // and map[string]interface representation. type Converter interface { - ToUnstructured(obj runtime.Object, u *map[string]interface{}) error - FromUnstructured(u map[string]interface{}, obj runtime.Object) error + ToUnstructured(obj interface{}, u *map[string]interface{}) error + FromUnstructured(u map[string]interface{}, obj interface{}) error } type structField struct { @@ -92,7 +91,7 @@ func parseBool(key string) bool { return value } -// ConverterImpl knows how to convert betweek runtime.Object and +// ConverterImpl knows how to convert between interface{} and // Unstructured in both ways. type converterImpl struct { // If true, we will be additionally running conversion via json @@ -107,10 +106,15 @@ func NewConverter(mismatchDetection bool) Converter { } } -func (c *converterImpl) FromUnstructured(u map[string]interface{}, obj runtime.Object) error { - err := fromUnstructured(reflect.ValueOf(u), reflect.ValueOf(obj).Elem()) +func (c *converterImpl) FromUnstructured(u map[string]interface{}, obj interface{}) error { + t := reflect.TypeOf(obj) + value := reflect.ValueOf(obj) + if t.Kind() != reflect.Ptr || value.IsNil() { + return fmt.Errorf("FromUnstructured requires a non-nil pointer to an object, got %v", t) + } + err := fromUnstructured(reflect.ValueOf(u), value.Elem()) if c.mismatchDetection { - newObj := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object) + newObj := reflect.New(t.Elem()).Interface() newErr := fromUnstructuredViaJSON(u, newObj) if (err != nil) != (newErr != nil) { glog.Fatalf("FromUnstructured unexpected error for %v: error: %v", u, err) @@ -122,7 +126,7 @@ func (c *converterImpl) FromUnstructured(u map[string]interface{}, obj runtime.O return err } -func fromUnstructuredViaJSON(u map[string]interface{}, obj runtime.Object) error { +func fromUnstructuredViaJSON(u map[string]interface{}, obj interface{}) error { data, err := json.Marshal(u) if err != nil { return err @@ -384,8 +388,13 @@ func interfaceFromUnstructured(sv, dv reflect.Value) error { return nil } -func (c *converterImpl) ToUnstructured(obj runtime.Object, u *map[string]interface{}) error { - err := toUnstructured(reflect.ValueOf(obj).Elem(), reflect.ValueOf(u).Elem()) +func (c *converterImpl) ToUnstructured(obj interface{}, u *map[string]interface{}) error { + t := reflect.TypeOf(obj) + value := reflect.ValueOf(obj) + if t.Kind() != reflect.Ptr || value.IsNil() { + return fmt.Errorf("ToUnstructured requires a non-nil pointer to an object, got %v", t) + } + err := toUnstructured(value.Elem(), reflect.ValueOf(u).Elem()) if c.mismatchDetection { newUnstr := &map[string]interface{}{} newErr := toUnstructuredViaJSON(obj, newUnstr) @@ -399,7 +408,7 @@ func (c *converterImpl) ToUnstructured(obj runtime.Object, u *map[string]interfa return err } -func toUnstructuredViaJSON(obj runtime.Object, u *map[string]interface{}) error { +func toUnstructuredViaJSON(obj interface{}, u *map[string]interface{}) error { data, err := json.Marshal(obj) if err != nil { return err diff --git a/vendor/k8s.io/apimachinery/pkg/fields/selector.go b/vendor/k8s.io/apimachinery/pkg/fields/selector.go index bb156b4c..1305dde0 100644 --- a/vendor/k8s.io/apimachinery/pkg/fields/selector.go +++ b/vendor/k8s.io/apimachinery/pkg/fields/selector.go @@ -40,6 +40,8 @@ type Selector interface { // Transform returns a new copy of the selector after TransformFunc has been // applied to the entire selector, or an error if fn returns an error. + // If for a given requirement both field and value are transformed to empty + // string, the requirement is skipped. Transform(fn TransformFunc) (Selector, error) // Requirements converts this interface to Requirements to expose @@ -79,6 +81,9 @@ func (t *hasTerm) Transform(fn TransformFunc) (Selector, error) { if err != nil { return nil, err } + if len(field) == 0 && len(value) == 0 { + return Everything(), nil + } return &hasTerm{field, value}, nil } @@ -115,6 +120,9 @@ func (t *notHasTerm) Transform(fn TransformFunc) (Selector, error) { if err != nil { return nil, err } + if len(field) == 0 && len(value) == 0 { + return Everything(), nil + } return ¬HasTerm{field, value}, nil } @@ -169,13 +177,15 @@ func (t andTerm) RequiresExactMatch(field string) (string, bool) { } func (t andTerm) Transform(fn TransformFunc) (Selector, error) { - next := make([]Selector, len([]Selector(t))) - for i, s := range []Selector(t) { + next := make([]Selector, 0, len([]Selector(t))) + for _, s := range []Selector(t) { n, err := s.Transform(fn) if err != nil { return nil, err } - next[i] = n + if !n.Empty() { + next = append(next, n) + } } return andTerm(next), nil } @@ -222,7 +232,7 @@ var valueEscaper = strings.NewReplacer( `=`, `\=`, ) -// Escapes an arbitrary literal string for use as a fieldSelector value +// EscapeValue escapes an arbitrary literal string for use as a fieldSelector value func EscapeValue(s string) string { return valueEscaper.Replace(s) } @@ -245,7 +255,7 @@ func (i UnescapedRune) Error() string { return fmt.Sprintf("invalid field selector: unescaped character in value: %v", i.r) } -// Unescapes a fieldSelector value and returns the original literal value. +// UnescapeValue unescapes a fieldSelector value and returns the original literal value. // May return the original string if it contains no escaped or special characters. func UnescapeValue(s string) (string, error) { // if there's no escaping or special characters, just return to avoid allocation @@ -307,12 +317,12 @@ func ParseSelector(selector string) (Selector, error) { }) } -// Parses the selector and runs them through the given TransformFunc. +// ParseAndTransformSelector parses the selector and runs them through the given TransformFunc. func ParseAndTransformSelector(selector string, fn TransformFunc) (Selector, error) { return parseSelector(selector, fn) } -// Function to transform selectors. +// TransformFunc transforms selectors. type TransformFunc func(field, value string) (newField, newValue string, err error) // splitTerms returns the comma-separated terms contained in the given fieldSelector. diff --git a/vendor/k8s.io/apimachinery/pkg/labels/selector.go b/vendor/k8s.io/apimachinery/pkg/labels/selector.go index 9bddc35a..50b41f99 100644 --- a/vendor/k8s.io/apimachinery/pkg/labels/selector.go +++ b/vendor/k8s.io/apimachinery/pkg/labels/selector.go @@ -71,13 +71,14 @@ func Nothing() Selector { return nothingSelector{} } +// NewSelector returns a nil selector func NewSelector() Selector { return internalSelector(nil) } type internalSelector []Requirement -// Sort by key to obtain determisitic parser +// ByKey sorts requirements by key to obtain deterministic parser type ByKey []Requirement func (a ByKey) Len() int { return len(a) } @@ -215,12 +216,17 @@ func (r *Requirement) Matches(ls Labels) bool { } } +// Key returns requirement key func (r *Requirement) Key() string { return r.key } + +// Operator returns requirement operator func (r *Requirement) Operator() selection.Operator { return r.operator } + +// Values returns requirement values func (r *Requirement) Values() sets.String { ret := sets.String{} for i := range r.strValues { @@ -229,7 +235,7 @@ func (r *Requirement) Values() sets.String { return ret } -// Return true if the internalSelector doesn't restrict selection space +// Empty returns true if the internalSelector doesn't restrict selection space func (lsel internalSelector) Empty() bool { if lsel == nil { return true @@ -320,23 +326,37 @@ func (lsel internalSelector) String() string { return strings.Join(reqs, ",") } -// constants definition for lexer token +// Token represents constant definition for lexer token type Token int const ( + // ErrorToken represents scan error ErrorToken Token = iota + // EndOfStringToken represents end of string EndOfStringToken + // ClosedParToken represents close parenthesis ClosedParToken + // CommaToken represents the comma CommaToken + // DoesNotExistToken represents logic not DoesNotExistToken + // DoubleEqualsToken represents double equals DoubleEqualsToken + // EqualsToken represents equal EqualsToken + // GreaterThanToken represents greater than GreaterThanToken - IdentifierToken // to represent keys and values + // IdentifierToken represents identifier, e.g. keys and values + IdentifierToken + // InToken represents in InToken + // LessThanToken represents less than LessThanToken + // NotEqualsToken represents not equal NotEqualsToken + // NotInToken represents not in NotInToken + // OpenParToken represents open parenthesis OpenParToken ) @@ -356,7 +376,7 @@ var string2token = map[string]Token{ "(": OpenParToken, } -// The item produced by the lexer. It contains the Token and the literal. +// ScannedItem contains the Token and the literal produced by the lexer. type ScannedItem struct { tok Token literal string @@ -401,8 +421,8 @@ func (l *Lexer) unread() { l.pos-- } -// scanIdOrKeyword scans string to recognize literal token (for example 'in') or an identifier. -func (l *Lexer) scanIdOrKeyword() (tok Token, lit string) { +// scanIDOrKeyword scans string to recognize literal token (for example 'in') or an identifier. +func (l *Lexer) scanIDOrKeyword() (tok Token, lit string) { var buffer []byte IdentifierLoop: for { @@ -474,7 +494,7 @@ func (l *Lexer) Lex() (tok Token, lit string) { return l.scanSpecialSymbol() default: l.unread() - return l.scanIdOrKeyword() + return l.scanIDOrKeyword() } } @@ -485,14 +505,16 @@ type Parser struct { position int } -// Parser context represents context during parsing: +// ParserContext represents context during parsing: // some literal for example 'in' and 'notin' can be // recognized as operator for example 'x in (a)' but // it can be recognized as value for example 'value in (in)' type ParserContext int const ( + // KeyAndOperator represents key and operator KeyAndOperator ParserContext = iota + // Values represents values Values ) @@ -798,11 +820,12 @@ func SelectorFromSet(ls Set) Selector { } var requirements internalSelector for label, value := range ls { - if r, err := NewRequirement(label, selection.Equals, []string{value}); err != nil { + r, err := NewRequirement(label, selection.Equals, []string{value}) + if err == nil { + requirements = append(requirements, *r) + } else { //TODO: double check errors when input comes from serialization? return internalSelector{} - } else { - requirements = append(requirements, *r) } } // sort to have deterministic string representation diff --git a/vendor/k8s.io/apimachinery/pkg/openapi/common.go b/vendor/k8s.io/apimachinery/pkg/openapi/common.go index e38f2b6c..bfab64a1 100644 --- a/vendor/k8s.io/apimachinery/pkg/openapi/common.go +++ b/vendor/k8s.io/apimachinery/pkg/openapi/common.go @@ -65,11 +65,11 @@ type Config struct { GetDefinitions GetOpenAPIDefinitions // GetOperationIDAndTags returns operation id and tags for a restful route. It is an optional function to customize operation IDs. - GetOperationIDAndTags func(servePath string, r *restful.Route) (string, []string, error) + GetOperationIDAndTags func(r *restful.Route) (string, []string, error) // GetDefinitionName returns a friendly name for a definition base on the serving path. parameter `name` is the full name of the definition. // It is an optional function to customize model names. - GetDefinitionName func(servePath string, name string) (string, spec.Extensions) + GetDefinitionName func(name string) (string, spec.Extensions) // PostProcessSpec runs after the spec is ready to serve. It allows a final modification to the spec before serving. PostProcessSpec func(*spec.Swagger) (*spec.Swagger, error) diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/OWNERS b/vendor/k8s.io/apimachinery/pkg/runtime/OWNERS deleted file mode 100644 index a49419f7..00000000 --- a/vendor/k8s.io/apimachinery/pkg/runtime/OWNERS +++ /dev/null @@ -1,19 +0,0 @@ -approvers: -- caesarxuchao -- deads2k -- lavalamp -- smarterclayton -reviewers: -- lavalamp -- smarterclayton -- wojtek-t -- deads2k -- derekwaynecarr -- caesarxuchao -- mikedanese -- nikhiljindal -- gmarek -- krousey -- timothysc -- piosz -- mbohlool diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go b/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go index 1d34ec1a..510444a4 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go @@ -28,8 +28,7 @@ import ( // object. (Will modify internalObject.) (Assumes JSON serialization.) // TODO: verify that the correct external version is chosen on encode... func CheckCodec(c Codec, internalType Object, externalTypes ...schema.GroupVersionKind) error { - _, err := Encode(c, internalType) - if err != nil { + if _, err := Encode(c, internalType); err != nil { return fmt.Errorf("Internal type not encodable: %v", err) } for _, et := range externalTypes { @@ -41,9 +40,8 @@ func CheckCodec(c Codec, internalType Object, externalTypes ...schema.GroupVersi if reflect.TypeOf(obj) != reflect.TypeOf(internalType) { return fmt.Errorf("decode of external type %s produced: %#v", et, obj) } - err = DecodeInto(c, exBytes, internalType) - if err != nil { - return fmt.Errorf("external type %s not convertable to internal type: %v", et, err) + if err = DecodeInto(c, exBytes, internalType); err != nil { + return fmt.Errorf("external type %s not convertible to internal type: %v", et, err) } } return nil diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go index d4f5f4a8..6c9475fa 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/scheme.go @@ -151,8 +151,8 @@ func (s *Scheme) AddUnversionedTypes(version schema.GroupVersion, types ...Objec t := reflect.TypeOf(obj).Elem() gvk := version.WithKind(t.Name()) s.unversionedTypes[t] = gvk - if _, ok := s.unversionedKinds[gvk.Kind]; ok { - panic(fmt.Sprintf("%v has already been registered as unversioned kind %q - kind name must be unique", reflect.TypeOf(t), gvk.Kind)) + if old, ok := s.unversionedKinds[gvk.Kind]; ok && t != old { + panic(fmt.Sprintf("%v.%v has already been registered as unversioned kind %q - kind name must be unique", old.PkgPath(), old.Name(), gvk)) } s.unversionedKinds[gvk.Kind] = t } diff --git a/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go b/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go index de62fe39..bdea0e16 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go +++ b/vendor/k8s.io/apimachinery/pkg/util/errors/errors.go @@ -21,6 +21,9 @@ import ( "fmt" ) +// MessagesgCountMap contains occurance for each error message. +type MessageCountMap map[string]int + // Aggregate represents an object that contains multiple errors, but does not // necessarily have singular semantic meaning. type Aggregate interface { @@ -147,6 +150,22 @@ func Flatten(agg Aggregate) Aggregate { return NewAggregate(result) } +// CreateAggregateFromMessageCountMap converts MessageCountMap Aggregate +func CreateAggregateFromMessageCountMap(m MessageCountMap) Aggregate { + if m == nil { + return nil + } + result := make([]error, 0, len(m)) + for errStr, count := range m { + var countStr string + if count > 1 { + countStr = fmt.Sprintf(" (repeated %v times)", count) + } + result = append(result, fmt.Errorf("%v%v", errStr, countStr)) + } + return NewAggregate(result) +} + // Reduce will return err or, if err is an Aggregate and only has one item, // the first item in the aggregate. func Reduce(err error) error { diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/OWNERS b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/OWNERS new file mode 100644 index 00000000..8e8d9fce --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/OWNERS @@ -0,0 +1,5 @@ +approvers: +- pwittrock +reviewers: +- mengqiy +- apelisse diff --git a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/errors.go b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/errors.go index 7b7fc6a2..ac3c1e8c 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/mergepatch/errors.go +++ b/vendor/k8s.io/apimachinery/pkg/util/mergepatch/errors.go @@ -19,20 +19,41 @@ package mergepatch import ( "errors" "fmt" + "reflect" ) var ( - ErrBadJSONDoc = errors.New("Invalid JSON document") - ErrNoListOfLists = errors.New("Lists of lists are not supported") - ErrBadPatchFormatForPrimitiveList = errors.New("Invalid patch format of primitive list") + ErrBadJSONDoc = errors.New("invalid JSON document") + ErrNoListOfLists = errors.New("lists of lists are not supported") + ErrBadPatchFormatForPrimitiveList = errors.New("invalid patch format of primitive list") + ErrBadPatchFormatForRetainKeys = errors.New("invalid patch format of retainKeys") + ErrBadPatchFormatForSetElementOrderList = errors.New("invalid patch format of setElementOrder list") + ErrPatchContentNotMatchRetainKeys = errors.New("patch content doesn't match retainKeys list") ) func ErrNoMergeKey(m map[string]interface{}, k string) error { return fmt.Errorf("map: %v does not contain declared merge key: %s", m, k) } -func ErrBadArgType(expected, actual string) error { - return fmt.Errorf("expected a %s, but received a %s", expected, actual) +func ErrBadArgType(expected, actual interface{}) error { + return fmt.Errorf("expected a %s, but received a %s", + reflect.TypeOf(expected), + reflect.TypeOf(actual)) +} + +func ErrBadArgKind(expected, actual interface{}) error { + var expectedKindString, actualKindString string + if expected == nil { + expectedKindString = "nil" + } else { + expectedKindString = reflect.TypeOf(expected).Kind().String() + } + if actual == nil { + actualKindString = "nil" + } else { + actualKindString = reflect.TypeOf(actual).Kind().String() + } + return fmt.Errorf("expected a %s, but received a %s", expectedKindString, actualKindString) } func ErrBadPatchType(t interface{}, m map[string]interface{}) error { diff --git a/vendor/k8s.io/apimachinery/pkg/util/net/http.go b/vendor/k8s.io/apimachinery/pkg/util/net/http.go index b3b2c988..adb80813 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/net/http.go +++ b/vendor/k8s.io/apimachinery/pkg/util/net/http.go @@ -150,13 +150,13 @@ func GetHTTPClient(req *http.Request) string { return "unknown" } -// Extracts and returns the clients IP from the given request. -// Looks at X-Forwarded-For header, X-Real-Ip header and request.RemoteAddr in that order. -// Returns nil if none of them are set or is set to an invalid value. -func GetClientIP(req *http.Request) net.IP { +// SourceIPs splits the comma separated X-Forwarded-For header or returns the X-Real-Ip header or req.RemoteAddr, +// in that order, ignoring invalid IPs. It returns nil if all of these are empty or invalid. +func SourceIPs(req *http.Request) []net.IP { hdr := req.Header // First check the X-Forwarded-For header for requests via proxy. hdrForwardedFor := hdr.Get("X-Forwarded-For") + forwardedForIPs := []net.IP{} if hdrForwardedFor != "" { // X-Forwarded-For can be a csv of IPs in case of multiple proxies. // Use the first valid one. @@ -164,17 +164,20 @@ func GetClientIP(req *http.Request) net.IP { for _, part := range parts { ip := net.ParseIP(strings.TrimSpace(part)) if ip != nil { - return ip + forwardedForIPs = append(forwardedForIPs, ip) } } } + if len(forwardedForIPs) > 0 { + return forwardedForIPs + } // Try the X-Real-Ip header. hdrRealIp := hdr.Get("X-Real-Ip") if hdrRealIp != "" { ip := net.ParseIP(hdrRealIp) if ip != nil { - return ip + return []net.IP{ip} } } @@ -182,11 +185,43 @@ func GetClientIP(req *http.Request) net.IP { // Remote Address in Go's HTTP server is in the form host:port so we need to split that first. host, _, err := net.SplitHostPort(req.RemoteAddr) if err == nil { - return net.ParseIP(host) + if remoteIP := net.ParseIP(host); remoteIP != nil { + return []net.IP{remoteIP} + } } // Fallback if Remote Address was just IP. - return net.ParseIP(req.RemoteAddr) + if remoteIP := net.ParseIP(req.RemoteAddr); remoteIP != nil { + return []net.IP{remoteIP} + } + + return nil +} + +// Extracts and returns the clients IP from the given request. +// Looks at X-Forwarded-For header, X-Real-Ip header and request.RemoteAddr in that order. +// Returns nil if none of them are set or is set to an invalid value. +func GetClientIP(req *http.Request) net.IP { + ips := SourceIPs(req) + if len(ips) == 0 { + return nil + } + return ips[0] +} + +// Prepares the X-Forwarded-For header for another forwarding hop by appending the previous sender's +// IP address to the X-Forwarded-For chain. +func AppendForwardedForHeader(req *http.Request) { + // Copied from net/http/httputil/reverseproxy.go: + if clientIP, _, err := net.SplitHostPort(req.RemoteAddr); err == nil { + // If we aren't the first proxy retain prior + // X-Forwarded-For information as a comma+space + // separated list and fold multiple headers into one. + if prior, ok := req.Header["X-Forwarded-For"]; ok { + clientIP = strings.Join(prior, ", ") + ", " + clientIP + } + req.Header.Set("X-Forwarded-For", clientIP) + } } var defaultProxyFuncPointer = fmt.Sprintf("%p", http.ProxyFromEnvironment) diff --git a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD b/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD index 6fa1f76f..97b4bb90 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD +++ b/vendor/k8s.io/apimachinery/pkg/util/sets/BUILD @@ -2,22 +2,32 @@ package(default_visibility = ["//visibility:public"]) licenses(["notice"]) +load("@io_kubernetes_build//defs:go.bzl", "go_genrule") load( "@io_bazel_rules_go//go:def.bzl", "go_library", "go_test", ) -go_test( - name = "go_default_test", - srcs = ["set_test.go"], - library = ":go_default_library", +go_library( + name = "go_default_library", + srcs = [ + "byte.go", + "doc.go", + "empty.go", + "int.go", + "int64.go", + "string.go", + ], tags = ["automanaged"], ) -go_library( - name = "go_default_library", +go_genrule( + name = "set-gen", srcs = [ + "//hack/boilerplate:boilerplate.go.txt", + ], + outs = [ "byte.go", "doc.go", "empty.go", @@ -25,5 +35,24 @@ go_library( "int64.go", "string.go", ], + cmd = """ +$(location //cmd/libs/go2idl/set-gen) \ + --input-dirs ./vendor/k8s.io/apimachinery/pkg/util/sets/types \ + --output-base $(GENDIR)/vendor/k8s.io/apimachinery/pkg/util \ + --go-header-file $(location //hack/boilerplate:boilerplate.go.txt) \ + --output-package sets + """, + go_deps = [ + "//vendor/k8s.io/apimachinery/pkg/util/sets/types:go_default_library", + ], + tools = [ + "//cmd/libs/go2idl/set-gen", + ], +) + +go_test( + name = "go_default_test", + srcs = ["set_test.go"], + library = ":go_default_library", tags = ["automanaged"], ) diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS new file mode 100644 index 00000000..8e8d9fce --- /dev/null +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/OWNERS @@ -0,0 +1,5 @@ +approvers: +- pwittrock +reviewers: +- mengqiy +- apelisse diff --git a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go index 9b1e325f..828df443 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go +++ b/vendor/k8s.io/apimachinery/pkg/util/strategicpatch/patch.go @@ -43,7 +43,11 @@ const ( replaceDirective = "replace" mergeDirective = "merge" + retainKeysStrategy = "retainKeys" + deleteFromPrimitiveListDirectivePrefix = "$deleteFromPrimitiveList" + retainKeysDirective = "$" + retainKeysStrategy + setElementOrderDirectivePrefix = "$setElementOrder" ) // JSONMap is a representations of JSON object encoded as map[string]interface{} @@ -54,15 +58,27 @@ const ( type JSONMap map[string]interface{} type DiffOptions struct { + // SetElementOrder determines whether we generate the $setElementOrder parallel list. + SetElementOrder bool // IgnoreChangesAndAdditions indicates if we keep the changes and additions in the patch. IgnoreChangesAndAdditions bool // IgnoreDeletions indicates if we keep the deletions in the patch. IgnoreDeletions bool + // We introduce a new value retainKeys for patchStrategy. + // It indicates that all fields needing to be preserved must be + // present in the `retainKeys` list. + // And the fields that are present will be merged with live object. + // All the missing fields will be cleared when patching. + BuildRetainKeysDirective bool } type MergeOptions struct { - // MergeDeleteList indicates if we are merging the delete parallel list. - MergeDeleteList bool + // MergeParallelList indicates if we are merging the parallel list. + // We don't merge parallel list when calling mergeMap() in CreateThreeWayMergePatch() + // which is called client-side. + // We merge parallel list iff when calling mergeMap() in StrategicMergeMapPatch() + // which is called server-side + MergeParallelList bool // IgnoreUnmatchedNulls indicates if we should process the unmatched nulls. IgnoreUnmatchedNulls bool } @@ -108,8 +124,7 @@ func CreateTwoWayMergeMapPatch(original, modified JSONMap, dataStruct interface{ } diffOptions := DiffOptions{ - IgnoreChangesAndAdditions: false, - IgnoreDeletions: false, + SetElementOrder: true, } patchMap, err := diffMaps(original, modified, t, diffOptions) if err != nil { @@ -127,13 +142,31 @@ func CreateTwoWayMergeMapPatch(original, modified JSONMap, dataStruct interface{ } // Returns a (recursive) strategic merge patch that yields modified when applied to original. +// Including: +// - Adding fields to the patch present in modified, missing from original +// - Setting fields to the patch present in modified and original with different values +// - Delete fields present in original, missing from modified through +// - IFF map field - set to nil in patch +// - IFF list of maps && merge strategy - use deleteDirective for the elements +// - IFF list of primitives && merge strategy - use parallel deletion list +// - IFF list of maps or primitives with replace strategy (default) - set patch value to the value in modified +// - Build $retainKeys directive for fields with retainKeys patch strategy func diffMaps(original, modified map[string]interface{}, t reflect.Type, diffOptions DiffOptions) (map[string]interface{}, error) { patch := map[string]interface{}{} + // Get the underlying type for pointers if t.Kind() == reflect.Ptr { t = t.Elem() } + // This will be used to build the $retainKeys directive sent in the patch + retainKeysList := make([]interface{}, 0, len(modified)) + // Compare each value in the modified map against the value in the original map for key, modifiedValue := range modified { + // Get the underlying type for pointers + if diffOptions.BuildRetainKeysDirective && modifiedValue != nil { + retainKeysList = append(retainKeysList, key) + } + originalValue, ok := original[key] if !ok { // Key was added, so add to patch @@ -144,6 +177,7 @@ func diffMaps(original, modified map[string]interface{}, t reflect.Type, diffOpt } // The patch may have a patch directive + // TODO: figure out if we need this. This shouldn't be needed by apply. When would the original map have patch directives in it? foundDirectiveMarker, err := handleDirectiveMarker(key, originalValue, modifiedValue, patch) if err != nil { return nil, err @@ -177,6 +211,14 @@ func diffMaps(original, modified map[string]interface{}, t reflect.Type, diffOpt } updatePatchIfMissing(original, modified, patch, diffOptions) + // Insert the retainKeysList iff there are values present in the retainKeysList and + // either of the following is true: + // - the patch is not empty + // - there are additional field in original that need to be cleared + if len(retainKeysList) > 0 && + (len(patch) > 0 || hasAdditionalNewField(original, modified)) { + patch[retainKeysDirective] = sortScalars(retainKeysList) + } return patch, nil } @@ -207,7 +249,7 @@ func handleDirectiveMarker(key string, originalValue, modifiedValue interface{}, // diffOptions contains multiple options to control how we do the diff. func handleMapDiff(key string, originalValue, modifiedValue, patch map[string]interface{}, t reflect.Type, diffOptions DiffOptions) error { - fieldType, fieldPatchStrategy, _, err := forkedjson.LookupPatchMetadata(t, key) + fieldType, fieldPatchStrategies, _, err := forkedjson.LookupPatchMetadata(t, key) if err != nil { // We couldn't look up metadata for the field // If the values are identical, this doesn't matter, no patch is needed @@ -217,7 +259,12 @@ func handleMapDiff(key string, originalValue, modifiedValue, patch map[string]in // Otherwise, return the error return err } - switch fieldPatchStrategy { + retainKeys, patchStrategy, err := extractRetainKeysPatchStrategy(fieldPatchStrategies) + if err != nil { + return err + } + diffOptions.BuildRetainKeysDirective = retainKeys + switch patchStrategy { // The patch strategic from metadata tells us to replace the entire object instead of diffing it case replaceDirective: if !diffOptions.IgnoreChangesAndAdditions { @@ -244,7 +291,7 @@ func handleMapDiff(key string, originalValue, modifiedValue, patch map[string]in // diffOptions contains multiple options to control how we do the diff. func handleSliceDiff(key string, originalValue, modifiedValue []interface{}, patch map[string]interface{}, t reflect.Type, diffOptions DiffOptions) error { - fieldType, fieldPatchStrategy, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(t, key) + fieldType, fieldPatchStrategies, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(t, key) if err != nil { // We couldn't look up metadata for the field // If the values are identical, this doesn't matter, no patch is needed @@ -254,11 +301,15 @@ func handleSliceDiff(key string, originalValue, modifiedValue []interface{}, pat // Otherwise, return the error return err } - - switch fieldPatchStrategy { + retainKeys, patchStrategy, err := extractRetainKeysPatchStrategy(fieldPatchStrategies) + if err != nil { + return err + } + switch patchStrategy { // Merge the 2 slices using mergePatchKey case mergeDirective: - addList, deletionList, err := diffLists(originalValue, modifiedValue, fieldType.Elem(), fieldPatchMergeKey, diffOptions) + diffOptions.BuildRetainKeysDirective = retainKeys + addList, deletionList, setOrderList, err := diffLists(originalValue, modifiedValue, fieldType.Elem(), fieldPatchMergeKey, diffOptions) if err != nil { return err } @@ -270,6 +321,10 @@ func handleSliceDiff(key string, originalValue, modifiedValue []interface{}, pat parallelDeletionListKey := fmt.Sprintf("%s/%s", deleteFromPrimitiveListDirectivePrefix, key) patch[parallelDeletionListKey] = deletionList } + if len(setOrderList) > 0 { + parallelSetOrderListKey := fmt.Sprintf("%s/%s", setElementOrderDirectivePrefix, key) + patch[parallelSetOrderListKey] = setOrderList + } default: replacePatchFieldIfNotEqual(key, originalValue, modifiedValue, patch, diffOptions) } @@ -311,44 +366,254 @@ func updatePatchIfMissing(original, modified, patch map[string]interface{}, diff } } -// Returns a (recursive) strategic merge patch and a parallel deletion list if necessary. +// validateMergeKeyInLists checks if each map in the list has the mentryerge key. +func validateMergeKeyInLists(mergeKey string, lists ...[]interface{}) error { + for _, list := range lists { + for _, item := range list { + m, ok := item.(map[string]interface{}) + if !ok { + return mergepatch.ErrBadArgType(m, item) + } + if _, ok = m[mergeKey]; !ok { + return mergepatch.ErrNoMergeKey(m, mergeKey) + } + } + } + return nil +} + +// normalizeElementOrder sort `patch` list by `patchOrder` and sort `serverOnly` list by `serverOrder`. +// Then it merges the 2 sorted lists. +// It guarantee the relative order in the patch list and in the serverOnly list is kept. +// `patch` is a list of items in the patch, and `serverOnly` is a list of items in the live object. +// `patchOrder` is the order we want `patch` list to have and +// `serverOrder` is the order we want `serverOnly` list to have. +// kind is the kind of each item in the lists `patch` and `serverOnly`. +func normalizeElementOrder(patch, serverOnly, patchOrder, serverOrder []interface{}, mergeKey string, kind reflect.Kind) ([]interface{}, error) { + patch, err := normalizeSliceOrder(patch, patchOrder, mergeKey, kind) + if err != nil { + return nil, err + } + serverOnly, err = normalizeSliceOrder(serverOnly, serverOrder, mergeKey, kind) + if err != nil { + return nil, err + } + all := mergeSortedSlice(serverOnly, patch, serverOrder, mergeKey, kind) + + return all, nil +} + +// mergeSortedSlice merges the 2 sorted lists by serverOrder with best effort. +// It will insert each item in `left` list to `right` list. In most cases, the 2 lists will be interleaved. +// The relative order of left and right are guaranteed to be kept. +// They have higher precedence than the order in the live list. +// The place for a item in `left` is found by: +// scan from the place of last insertion in `right` to the end of `right`, +// the place is before the first item that is greater than the item we want to insert. +// example usage: using server-only items as left and patch items as right. We insert server-only items +// to patch list. We use the order of live object as record for comparision. +func mergeSortedSlice(left, right, serverOrder []interface{}, mergeKey string, kind reflect.Kind) []interface{} { + // Returns if l is less than r, and if both have been found. + // If l and r both present and l is in front of r, l is less than r. + less := func(l, r interface{}) (bool, bool) { + li := index(serverOrder, l, mergeKey, kind) + ri := index(serverOrder, r, mergeKey, kind) + if li >= 0 && ri >= 0 { + return li < ri, true + } else { + return false, false + } + } + + // left and right should be non-overlapping. + size := len(left) + len(right) + i, j := 0, 0 + s := make([]interface{}, size, size) + + for k := 0; k < size; k++ { + if i >= len(left) && j < len(right) { + // have items left in `right` list + s[k] = right[j] + j++ + } else if j >= len(right) && i < len(left) { + // have items left in `left` list + s[k] = left[i] + i++ + } else { + // compare them if i and j are both in bound + less, foundBoth := less(left[i], right[j]) + if foundBoth && less { + s[k] = left[i] + i++ + } else { + s[k] = right[j] + j++ + } + } + } + return s +} + +// index returns the index of the item in the given items, or -1 if it doesn't exist +// l must NOT be a slice of slices, this should be checked before calling. +func index(l []interface{}, valToLookUp interface{}, mergeKey string, kind reflect.Kind) int { + var getValFn func(interface{}) interface{} + // Get the correct `getValFn` based on item `kind`. + // It should return the value of merge key for maps and + // return the item for other kinds. + switch kind { + case reflect.Map: + getValFn = func(item interface{}) interface{} { + typedItem, ok := item.(map[string]interface{}) + if !ok { + return nil + } + val := typedItem[mergeKey] + return val + } + default: + getValFn = func(item interface{}) interface{} { + return item + } + } + + for i, v := range l { + if getValFn(valToLookUp) == getValFn(v) { + return i + } + } + return -1 +} + +// extractToDeleteItems takes a list and +// returns 2 lists: one contains items that should be kept and the other contains items to be deleted. +func extractToDeleteItems(l []interface{}) ([]interface{}, []interface{}, error) { + var nonDelete, toDelete []interface{} + for _, v := range l { + m, ok := v.(map[string]interface{}) + if !ok { + return nil, nil, mergepatch.ErrBadArgType(m, v) + } + + directive, foundDirective := m[directiveMarker] + if foundDirective && directive == deleteDirective { + toDelete = append(toDelete, v) + } else { + nonDelete = append(nonDelete, v) + } + } + return nonDelete, toDelete, nil +} + +// normalizeSliceOrder sort `toSort` list by `order` +func normalizeSliceOrder(toSort, order []interface{}, mergeKey string, kind reflect.Kind) ([]interface{}, error) { + var toDelete []interface{} + if kind == reflect.Map { + // make sure each item in toSort, order has merge key + err := validateMergeKeyInLists(mergeKey, toSort, order) + if err != nil { + return nil, err + } + toSort, toDelete, err = extractToDeleteItems(toSort) + } + + sort.SliceStable(toSort, func(i, j int) bool { + if ii := index(order, toSort[i], mergeKey, kind); ii >= 0 { + if ij := index(order, toSort[j], mergeKey, kind); ij >= 0 { + return ii < ij + } + } + return true + }) + toSort = append(toSort, toDelete...) + return toSort, nil +} + +// Returns a (recursive) strategic merge patch, a parallel deletion list if necessary and +// another list to set the order of the list // Only list of primitives with merge strategy will generate a parallel deletion list. // These two lists should yield modified when applied to original, for lists with merge semantics. -func diffLists(original, modified []interface{}, t reflect.Type, mergeKey string, diffOptions DiffOptions) ([]interface{}, []interface{}, error) { +func diffLists(original, modified []interface{}, t reflect.Type, mergeKey string, diffOptions DiffOptions) ([]interface{}, []interface{}, []interface{}, error) { if len(original) == 0 { // Both slices are empty - do nothing if len(modified) == 0 || diffOptions.IgnoreChangesAndAdditions { - return nil, nil, nil + return nil, nil, nil, nil } // Old slice was empty - add all elements from the new slice - return modified, nil, nil + return modified, nil, nil, nil } elementType, err := sliceElementType(original, modified) if err != nil { - return nil, nil, err + return nil, nil, nil, err } - switch elementType.Kind() { + var patchList, deleteList, setOrderList []interface{} + kind := elementType.Kind() + switch kind { case reflect.Map: - patchList, err := diffListsOfMaps(original, modified, t, mergeKey, diffOptions) - return patchList, nil, err + patchList, deleteList, err = diffListsOfMaps(original, modified, t, mergeKey, diffOptions) + patchList, err = normalizeSliceOrder(patchList, modified, mergeKey, kind) + orderSame, err := isOrderSame(original, modified, mergeKey) + if err != nil { + return nil, nil, nil, err + } + // append the deletions to the end of the patch list. + patchList = append(patchList, deleteList...) + deleteList = nil + // generate the setElementOrder list when there are content changes or order changes + if diffOptions.SetElementOrder && + ((!diffOptions.IgnoreChangesAndAdditions && (len(patchList) > 0 || !orderSame)) || + (!diffOptions.IgnoreDeletions && len(patchList) > 0)) { + // Generate a list of maps that each item contains only the merge key. + setOrderList = make([]interface{}, len(modified)) + for i, v := range modified { + typedV := v.(map[string]interface{}) + setOrderList[i] = map[string]interface{}{ + mergeKey: typedV[mergeKey], + } + } + } case reflect.Slice: // Lists of Lists are not permitted by the api - return nil, nil, mergepatch.ErrNoListOfLists + return nil, nil, nil, mergepatch.ErrNoListOfLists default: - return diffListsOfScalars(original, modified, diffOptions) + patchList, deleteList, err = diffListsOfScalars(original, modified, diffOptions) + patchList, err = normalizeSliceOrder(patchList, modified, mergeKey, kind) + // generate the setElementOrder list when there are content changes or order changes + if diffOptions.SetElementOrder && ((!diffOptions.IgnoreDeletions && len(deleteList) > 0) || + (!diffOptions.IgnoreChangesAndAdditions && !reflect.DeepEqual(original, modified))) { + setOrderList = modified + } + } + return patchList, deleteList, setOrderList, err +} + +// isOrderSame checks if the order in a list has changed +func isOrderSame(original, modified []interface{}, mergeKey string) (bool, error) { + if len(original) != len(modified) { + return false, nil + } + for i, modifiedItem := range modified { + equal, err := mergeKeyValueEqual(original[i], modifiedItem, mergeKey) + if err != nil || !equal { + return equal, err + } } + return true, nil } // diffListsOfScalars returns 2 lists, the first one is addList and the second one is deletionList. // Argument diffOptions.IgnoreChangesAndAdditions controls if calculate addList. true means not calculate. // Argument diffOptions.IgnoreDeletions controls if calculate deletionList. true means not calculate. +// original may be changed, but modified is guaranteed to not be changed func diffListsOfScalars(original, modified []interface{}, diffOptions DiffOptions) ([]interface{}, []interface{}, error) { + modifiedCopy := make([]interface{}, len(modified)) + copy(modifiedCopy, modified) // Sort the scalars for easier calculating the diff originalScalars := sortScalars(original) - modifiedScalars := sortScalars(modified) + modifiedScalars := sortScalars(modifiedCopy) originalIndex, modifiedIndex := 0, 0 addList := []interface{}{} @@ -394,7 +659,7 @@ func diffListsOfScalars(original, modified []interface{}, diffOptions DiffOption } } - return addList, deletionList, nil + return addList, deduplicateScalars(deletionList), nil } // If first return value is non-nil, list1 contains an element not present in list2 @@ -422,18 +687,20 @@ func compareListValuesAtIndex(list1Inbounds, list2Inbounds bool, list1Value, lis } } -// Returns a (recursive) strategic merge patch that yields modified when applied to original, -// for a pair of lists of maps with merge semantics. -func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey string, diffOptions DiffOptions) ([]interface{}, error) { - patch := make([]interface{}, 0) +// diffListsOfMaps takes a pair of lists and +// returns a (recursive) strategic merge patch list contains additions and changes and +// a deletion list contains deletions +func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey string, diffOptions DiffOptions) ([]interface{}, []interface{}, error) { + patch := make([]interface{}, 0, len(modified)) + deletionList := make([]interface{}, 0, len(original)) originalSorted, err := sortMergeListsByNameArray(original, t, mergeKey, false) if err != nil { - return nil, err + return nil, nil, err } modifiedSorted, err := sortMergeListsByNameArray(modified, t, mergeKey, false) if err != nil { - return nil, err + return nil, nil, err } originalIndex, modifiedIndex := 0, 0 @@ -451,14 +718,14 @@ func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey if originalInBounds { originalElement, originalElementMergeKeyValue, err = getMapAndMergeKeyValueByIndex(originalIndex, mergeKey, originalSorted) if err != nil { - return nil, err + return nil, nil, err } originalElementMergeKeyValueString = fmt.Sprintf("%v", originalElementMergeKeyValue) } if modifiedInBounds { modifiedElement, modifiedElementMergeKeyValue, err = getMapAndMergeKeyValueByIndex(modifiedIndex, mergeKey, modifiedSorted) if err != nil { - return nil, err + return nil, nil, err } modifiedElementMergeKeyValueString = fmt.Sprintf("%v", modifiedElementMergeKeyValue) } @@ -468,7 +735,7 @@ func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey // Merge key values are equal, so recurse patchValue, err := diffMaps(originalElement, modifiedElement, t, diffOptions) if err != nil { - return nil, err + return nil, nil, err } if len(patchValue) > 0 { patchValue[mergeKey] = modifiedElementMergeKeyValue @@ -492,21 +759,20 @@ func diffListsOfMaps(original, modified []interface{}, t reflect.Type, mergeKey case bothInBounds && ItemRemovedFromModifiedSlice(originalElementMergeKeyValueString, modifiedElementMergeKeyValueString): if !diffOptions.IgnoreDeletions { // Item was deleted, so add delete directive - patch = append(patch, CreateDeleteDirective(mergeKey, originalElementMergeKeyValue)) + deletionList = append(deletionList, CreateDeleteDirective(mergeKey, originalElementMergeKeyValue)) } originalIndex++ } } - return patch, nil + return patch, deletionList, nil } // getMapAndMergeKeyValueByIndex return a map in the list and its merge key value given the index of the map. func getMapAndMergeKeyValueByIndex(index int, mergeKey string, listOfMaps []interface{}) (map[string]interface{}, interface{}, error) { m, ok := listOfMaps[index].(map[string]interface{}) if !ok { - t := reflect.TypeOf(listOfMaps[index]) - return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.Kind().String()) + return nil, nil, mergepatch.ErrBadArgType(m, listOfMaps[index]) } val, ok := m[mergeKey] @@ -560,7 +826,7 @@ func StrategicMergeMapPatch(original, patch JSONMap, dataStruct interface{}) (JS return nil, err } mergeOptions := MergeOptions{ - MergeDeleteList: true, + MergeParallelList: true, IgnoreUnmatchedNulls: true, } return mergeMap(original, patch, t, mergeOptions) @@ -568,16 +834,17 @@ func StrategicMergeMapPatch(original, patch JSONMap, dataStruct interface{}) (JS func getTagStructType(dataStruct interface{}) (reflect.Type, error) { if dataStruct == nil { - return nil, mergepatch.ErrBadArgType("struct", "nil") + return nil, mergepatch.ErrBadArgKind(struct{}{}, nil) } t := reflect.TypeOf(dataStruct) + // Get the underlying type for pointers if t.Kind() == reflect.Ptr { t = t.Elem() } if t.Kind() != reflect.Struct { - return nil, mergepatch.ErrBadArgType("struct", t.Kind().String()) + return nil, mergepatch.ErrBadArgKind(struct{}{}, dataStruct) } return t, nil @@ -602,6 +869,106 @@ func handleDirectiveInMergeMap(directive interface{}, patch map[string]interface return nil, mergepatch.ErrBadPatchType(directive, patch) } +func containsDirectiveMarker(item interface{}) bool { + m, ok := item.(map[string]interface{}) + if ok { + if _, foundDirectiveMarker := m[directiveMarker]; foundDirectiveMarker { + return true + } + } + return false +} + +func mergeKeyValueEqual(left, right interface{}, mergeKey string) (bool, error) { + if len(mergeKey) == 0 { + return left == right, nil + } + typedLeft, ok := left.(map[string]interface{}) + if !ok { + return false, mergepatch.ErrBadArgType(typedLeft, left) + } + typedRight, ok := right.(map[string]interface{}) + if !ok { + return false, mergepatch.ErrBadArgType(typedRight, right) + } + mergeKeyLeft, ok := typedLeft[mergeKey] + if !ok { + return false, mergepatch.ErrNoMergeKey(typedLeft, mergeKey) + } + mergeKeyRight, ok := typedRight[mergeKey] + if !ok { + return false, mergepatch.ErrNoMergeKey(typedRight, mergeKey) + } + return mergeKeyLeft == mergeKeyRight, nil +} + +// extractKey trims the prefix and return the original key +func extractKey(s, prefix string) (string, error) { + substrings := strings.SplitN(s, "/", 2) + if len(substrings) <= 1 || substrings[0] != prefix { + switch prefix { + case deleteFromPrimitiveListDirectivePrefix: + return "", mergepatch.ErrBadPatchFormatForPrimitiveList + case setElementOrderDirectivePrefix: + return "", mergepatch.ErrBadPatchFormatForSetElementOrderList + default: + return "", fmt.Errorf("fail to find unknown prefix %q in %s\n", prefix, s) + } + } + return substrings[1], nil +} + +// validatePatchUsingSetOrderList verifies: +// the relative order of any two items in the setOrderList list matches that in the patch list. +// the items in the patch list must be a subset or the same as the $setElementOrder list (deletions are ignored). +func validatePatchWithSetOrderList(patchList, setOrderList interface{}, mergeKey string) error { + typedSetOrderList, ok := setOrderList.([]interface{}) + if !ok { + return mergepatch.ErrBadPatchFormatForSetElementOrderList + } + typedPatchList, ok := patchList.([]interface{}) + if !ok { + return mergepatch.ErrBadPatchFormatForSetElementOrderList + } + if len(typedSetOrderList) == 0 || len(typedPatchList) == 0 { + return nil + } + + var nonDeleteList, toDeleteList []interface{} + var err error + if len(mergeKey) > 0 { + nonDeleteList, toDeleteList, err = extractToDeleteItems(typedPatchList) + if err != nil { + return err + } + } else { + nonDeleteList = typedPatchList + } + + patchIndex, setOrderIndex := 0, 0 + for patchIndex < len(nonDeleteList) && setOrderIndex < len(typedSetOrderList) { + if containsDirectiveMarker(nonDeleteList[patchIndex]) { + patchIndex++ + continue + } + mergeKeyEqual, err := mergeKeyValueEqual(nonDeleteList[patchIndex], typedSetOrderList[setOrderIndex], mergeKey) + if err != nil { + return err + } + if mergeKeyEqual { + patchIndex++ + } + setOrderIndex++ + } + // If patchIndex is inbound but setOrderIndex if out of bound mean there are items mismatching between the patch list and setElementOrder list. + // the second check is is a sanity check, and should always be true if the first is true. + if patchIndex < len(nonDeleteList) && setOrderIndex >= len(typedSetOrderList) { + return fmt.Errorf("The order in patch list:\n%v\n doesn't match %s list:\n%v\n", typedPatchList, setElementOrderDirectivePrefix, setOrderList) + } + typedPatchList = append(nonDeleteList, toDeleteList...) + return nil +} + // preprocessDeletionListForMerging preprocesses the deletion list. // it returns shouldContinue, isDeletionList, noPrefixKey func preprocessDeletionListForMerging(key string, original map[string]interface{}, @@ -614,19 +981,247 @@ func preprocessDeletionListForMerging(key string, original map[string]interface{ original[key] = patchVal return true, false, "", nil } - substrings := strings.SplitN(key, "/", 2) - if len(substrings) <= 1 { - return false, false, "", mergepatch.ErrBadPatchFormatForPrimitiveList - } - return false, true, substrings[1], nil + originalKey, err := extractKey(key, deleteFromPrimitiveListDirectivePrefix) + return false, true, originalKey, err } return false, false, "", nil } +// applyRetainKeysDirective looks for a retainKeys directive and applies to original +// - if no directive exists do nothing +// - if directive is found, clear keys in original missing from the directive list +// - validate that all keys present in the patch are present in the retainKeys directive +// note: original may be another patch request, e.g. applying the add+modified patch to the deletions patch. In this case it may have directives +func applyRetainKeysDirective(original, patch map[string]interface{}, options MergeOptions) error { + retainKeysInPatch, foundInPatch := patch[retainKeysDirective] + if !foundInPatch { + return nil + } + // cleanup the directive + delete(patch, retainKeysDirective) + + if !options.MergeParallelList { + // If original is actually a patch, make sure the retainKeys directives are the same in both patches if present in both. + // If not present in the original patch, copy from the modified patch. + retainKeysInOriginal, foundInOriginal := original[retainKeysDirective] + if foundInOriginal { + if !reflect.DeepEqual(retainKeysInOriginal, retainKeysInPatch) { + // This error actually should never happen. + return fmt.Errorf("%v and %v are not deep equal: this may happen when calculating the 3-way diff patch", retainKeysInOriginal, retainKeysInPatch) + } + } else { + original[retainKeysDirective] = retainKeysInPatch + } + return nil + } + + retainKeysList, ok := retainKeysInPatch.([]interface{}) + if !ok { + return mergepatch.ErrBadPatchFormatForRetainKeys + } + + // validate patch to make sure all fields in the patch are present in the retainKeysList. + // The map is used only as a set, the value is never referenced + m := map[interface{}]struct{}{} + for _, v := range retainKeysList { + m[v] = struct{}{} + } + for k, v := range patch { + if v == nil || strings.HasPrefix(k, deleteFromPrimitiveListDirectivePrefix) || + strings.HasPrefix(k, setElementOrderDirectivePrefix) { + continue + } + // If there is an item present in the patch but not in the retainKeys list, + // the patch is invalid. + if _, found := m[k]; !found { + return mergepatch.ErrBadPatchFormatForRetainKeys + } + } + + // clear not present fields + for k := range original { + if _, found := m[k]; !found { + delete(original, k) + } + } + return nil +} + +// mergePatchIntoOriginal processes $setElementOrder list. +// When not merging the directive, it will make sure $setElementOrder list exist only in original. +// When merging the directive, it will try to find the $setElementOrder list and +// its corresponding patch list, validate it and merge it. +// Then, sort them by the relative order in setElementOrder, patch list and live list. +// The precedence is $setElementOrder > order in patch list > order in live list. +// This function will delete the item after merging it to prevent process it again in the future. +// Ref: https://git.k8s.io/community/contributors/design-proposals/preserve-order-in-strategic-merge-patch.md +func mergePatchIntoOriginal(original, patch map[string]interface{}, t reflect.Type, mergeOptions MergeOptions) error { + for key, patchV := range patch { + // Do nothing if there is no ordering directive + if !strings.HasPrefix(key, setElementOrderDirectivePrefix) { + continue + } + + setElementOrderInPatch := patchV + // Copies directive from the second patch (`patch`) to the first patch (`original`) + // and checks they are equal and delete the directive in the second patch + if !mergeOptions.MergeParallelList { + setElementOrderListInOriginal, ok := original[key] + if ok { + // check if the setElementOrder list in original and the one in patch matches + if !reflect.DeepEqual(setElementOrderListInOriginal, setElementOrderInPatch) { + return mergepatch.ErrBadPatchFormatForSetElementOrderList + } + } else { + // move the setElementOrder list from patch to original + original[key] = setElementOrderInPatch + } + } + delete(patch, key) + + var ( + ok bool + originalFieldValue, patchFieldValue, merged []interface{} + patchStrategy, mergeKey string + patchStrategies []string + fieldType reflect.Type + ) + typedSetElementOrderList, ok := setElementOrderInPatch.([]interface{}) + if !ok { + return mergepatch.ErrBadArgType(typedSetElementOrderList, setElementOrderInPatch) + } + // Trim the setElementOrderDirectivePrefix to get the key of the list field in original. + originalKey, err := extractKey(key, setElementOrderDirectivePrefix) + if err != nil { + return err + } + // try to find the list with `originalKey` in `original` and `modified` and merge them. + originalList, foundOriginal := original[originalKey] + patchList, foundPatch := patch[originalKey] + if foundOriginal { + originalFieldValue, ok = originalList.([]interface{}) + if !ok { + return mergepatch.ErrBadArgType(originalFieldValue, originalList) + } + } + if foundPatch { + patchFieldValue, ok = patchList.([]interface{}) + if !ok { + return mergepatch.ErrBadArgType(patchFieldValue, patchList) + } + } + fieldType, patchStrategies, mergeKey, err = forkedjson.LookupPatchMetadata(t, originalKey) + if err != nil { + return err + } + _, patchStrategy, err = extractRetainKeysPatchStrategy(patchStrategies) + if err != nil { + return err + } + // Check for consistency between the element order list and the field it applies to + err = validatePatchWithSetOrderList(patchFieldValue, typedSetElementOrderList, mergeKey) + if err != nil { + return err + } + + switch { + case foundOriginal && !foundPatch: + // no change to list contents + merged = originalFieldValue + case !foundOriginal && foundPatch: + // list was added + merged = patchFieldValue + case foundOriginal && foundPatch: + merged, err = mergeSliceHandler(originalList, patchList, fieldType, + patchStrategy, mergeKey, false, mergeOptions) + if err != nil { + return err + } + case !foundOriginal && !foundPatch: + return nil + } + + // Split all items into patch items and server-only items and then enforce the order. + var patchItems, serverOnlyItems []interface{} + if len(mergeKey) == 0 { + // Primitives doesn't need merge key to do partitioning. + patchItems, serverOnlyItems = partitionPrimitivesByPresentInList(merged, typedSetElementOrderList) + + } else { + // Maps need merge key to do partitioning. + patchItems, serverOnlyItems, err = partitionMapsByPresentInList(merged, typedSetElementOrderList, mergeKey) + if err != nil { + return err + } + } + + elementType, err := sliceElementType(originalFieldValue, patchFieldValue) + if err != nil { + return err + } + kind := elementType.Kind() + // normalize merged list + // typedSetElementOrderList contains all the relative order in typedPatchList, + // so don't need to use typedPatchList + both, err := normalizeElementOrder(patchItems, serverOnlyItems, typedSetElementOrderList, originalFieldValue, mergeKey, kind) + if err != nil { + return err + } + original[originalKey] = both + // delete patch list from patch to prevent process again in the future + delete(patch, originalKey) + } + return nil +} + +// partitionPrimitivesByPresentInList partitions elements into 2 slices, the first containing items present in partitionBy, the other not. +func partitionPrimitivesByPresentInList(original, partitionBy []interface{}) ([]interface{}, []interface{}) { + patch := make([]interface{}, 0, len(original)) + serverOnly := make([]interface{}, 0, len(original)) + inPatch := map[interface{}]bool{} + for _, v := range partitionBy { + inPatch[v] = true + } + for _, v := range original { + if !inPatch[v] { + serverOnly = append(serverOnly, v) + } else { + patch = append(patch, v) + } + } + return patch, serverOnly +} + +// partitionMapsByPresentInList partitions elements into 2 slices, the first containing items present in partitionBy, the other not. +func partitionMapsByPresentInList(original, partitionBy []interface{}, mergeKey string) ([]interface{}, []interface{}, error) { + patch := make([]interface{}, 0, len(original)) + serverOnly := make([]interface{}, 0, len(original)) + for _, v := range original { + typedV, ok := v.(map[string]interface{}) + if !ok { + return nil, nil, mergepatch.ErrBadArgType(typedV, v) + } + mergeKeyValue, foundMergeKey := typedV[mergeKey] + if !foundMergeKey { + return nil, nil, mergepatch.ErrNoMergeKey(typedV, mergeKey) + } + _, _, found, err := findMapInSliceBasedOnKeyValue(partitionBy, mergeKey, mergeKeyValue) + if err != nil { + return nil, nil, err + } + if !found { + serverOnly = append(serverOnly, v) + } else { + patch = append(patch, v) + } + } + return patch, serverOnly, nil +} + // Merge fields from a patch map into the original map. Note: This may modify // both the original map and the patch because getting a deep copy of a map in // golang is highly non-trivial. -// flag mergeOptions.MergeDeleteList controls if using the parallel list to delete or keeping the list. +// flag mergeOptions.MergeParallelList controls if using the parallel list to delete or keeping the list. // If patch contains any null field (e.g. field_1: null) that is not // present in original, then to propagate it to the end result use // mergeOptions.IgnoreUnmatchedNulls == false. @@ -641,9 +1236,23 @@ func mergeMap(original, patch map[string]interface{}, t reflect.Type, mergeOptio original = map[string]interface{}{} } + err := applyRetainKeysDirective(original, patch, mergeOptions) + if err != nil { + return nil, err + } + + // Process $setElementOrder list and other lists sharing the same key. + // When not merging the directive, it will make sure $setElementOrder list exist only in original. + // When merging the directive, it will process $setElementOrder and its patch list together. + // This function will delete the merged elements from patch so they will not be reprocessed + err = mergePatchIntoOriginal(original, patch, t, mergeOptions) + if err != nil { + return nil, err + } + // Start merging the patch into the original. for k, patchV := range patch { - skipProcessing, isDeleteList, noPrefixKey, err := preprocessDeletionListForMerging(k, original, patchV, mergeOptions.MergeDeleteList) + skipProcessing, isDeleteList, noPrefixKey, err := preprocessDeletionListForMerging(k, original, patchV, mergeOptions.MergeParallelList) if err != nil { return nil, err } @@ -687,16 +1296,21 @@ func mergeMap(original, patch map[string]interface{}, t reflect.Type, mergeOptio } // If they're both maps or lists, recurse into the value. // First find the fieldPatchStrategy and fieldPatchMergeKey. - fieldType, fieldPatchStrategy, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(t, k) + fieldType, fieldPatchStrategies, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(t, k) if err != nil { return nil, err } + _, patchStrategy, err := extractRetainKeysPatchStrategy(fieldPatchStrategies) + if err != nil { + return nil, err + } + switch originalType.Kind() { case reflect.Map: - original[k], err = mergeMapHandler(original[k], patchV, fieldType, fieldPatchStrategy, mergeOptions) + original[k], err = mergeMapHandler(original[k], patchV, fieldType, patchStrategy, mergeOptions) case reflect.Slice: - original[k], err = mergeSliceHandler(original[k], patchV, fieldType, fieldPatchStrategy, fieldPatchMergeKey, isDeleteList, mergeOptions) + original[k], err = mergeSliceHandler(original[k], patchV, fieldType, patchStrategy, fieldPatchMergeKey, isDeleteList, mergeOptions) default: original[k] = patchV } @@ -754,27 +1368,45 @@ func mergeSlice(original, patch []interface{}, elemType reflect.Type, mergeKey s return nil, err } + var merged []interface{} + kind := t.Kind() // If the elements are not maps, merge the slices of scalars. - if t.Kind() != reflect.Map { - if mergeOptions.MergeDeleteList && isDeleteList { + if kind != reflect.Map { + if mergeOptions.MergeParallelList && isDeleteList { return deleteFromSlice(original, patch), nil } // Maybe in the future add a "concat" mode that doesn't - // uniqify. + // deduplicate. both := append(original, patch...) - return uniqifyScalars(both), nil - } + merged = deduplicateScalars(both) - if mergeKey == "" { - return nil, fmt.Errorf("cannot merge lists without merge key for type %s", elemType.Kind().String()) - } + } else { + if mergeKey == "" { + return nil, fmt.Errorf("cannot merge lists without merge key for type %s", elemType.Kind().String()) + } - original, patch, err = mergeSliceWithSpecialElements(original, patch, mergeKey) - if err != nil { - return nil, err + original, patch, err = mergeSliceWithSpecialElements(original, patch, mergeKey) + if err != nil { + return nil, err + } + + merged, err = mergeSliceWithoutSpecialElements(original, patch, mergeKey, elemType, mergeOptions) + if err != nil { + return nil, err + } } - return mergeSliceWithoutSpecialElements(original, patch, mergeKey, elemType, mergeOptions) + // enforce the order + var patchItems, serverOnlyItems []interface{} + if len(mergeKey) == 0 { + patchItems, serverOnlyItems = partitionPrimitivesByPresentInList(merged, patch) + } else { + patchItems, serverOnlyItems, err = partitionMapsByPresentInList(merged, patch, mergeKey) + if err != nil { + return nil, err + } + } + return normalizeElementOrder(patchItems, serverOnlyItems, patch, original, mergeKey, kind) } // mergeSliceWithSpecialElements handles special elements with directiveMarker @@ -799,7 +1431,7 @@ func mergeSliceWithSpecialElements(original, patch []interface{}, mergeKey strin return nil, nil, err } } else { - return nil, nil, fmt.Errorf("delete patch type with no merge key defined") + return nil, nil, mergepatch.ErrNoMergeKey(typedV, mergeKey) } case replaceDirective: replace = true @@ -870,30 +1502,17 @@ func mergeSliceWithoutSpecialElements(original, patch []interface{}, mergeKey st // deleteFromSlice uses the parallel list to delete the items in a list of scalars func deleteFromSlice(current, toDelete []interface{}) []interface{} { - currentScalars := uniqifyAndSortScalars(current) - toDeleteScalars := uniqifyAndSortScalars(toDelete) - - currentIndex, toDeleteIndex := 0, 0 - mergedList := []interface{}{} - - for currentIndex < len(currentScalars) && toDeleteIndex < len(toDeleteScalars) { - originalString := fmt.Sprintf("%v", currentScalars[currentIndex]) - modifiedString := fmt.Sprintf("%v", toDeleteScalars[toDeleteIndex]) - - switch { - // found an item to delete - case originalString == modifiedString: - currentIndex++ - // Request to delete an item that was not found in the current list - case originalString > modifiedString: - toDeleteIndex++ - // Found an item that was not part of the deletion list, keep it - case originalString < modifiedString: - mergedList = append(mergedList, currentScalars[currentIndex]) - currentIndex++ + toDeleteMap := map[interface{}]interface{}{} + processed := make([]interface{}, 0, len(current)) + for _, v := range toDelete { + toDeleteMap[v] = true + } + for _, v := range current { + if _, found := toDeleteMap[v]; !found { + processed = append(processed, v) } } - return append(mergedList, currentScalars[currentIndex:]...) + return processed } // This method no longer panics if any element of the slice is not a map. @@ -936,14 +1555,29 @@ func sortMergeListsByName(mapJSON []byte, dataStruct interface{}) ([]byte, error func sortMergeListsByNameMap(s map[string]interface{}, t reflect.Type) (map[string]interface{}, error) { newS := map[string]interface{}{} for k, v := range s { - if strings.HasPrefix(k, deleteFromPrimitiveListDirectivePrefix) { + if k == retainKeysDirective { + typedV, ok := v.([]interface{}) + if !ok { + return nil, mergepatch.ErrBadPatchFormatForRetainKeys + } + v = sortScalars(typedV) + } else if strings.HasPrefix(k, deleteFromPrimitiveListDirectivePrefix) { typedV, ok := v.([]interface{}) if !ok { return nil, mergepatch.ErrBadPatchFormatForPrimitiveList } - v = uniqifyAndSortScalars(typedV) + v = sortScalars(typedV) + } else if strings.HasPrefix(k, setElementOrderDirectivePrefix) { + _, ok := v.([]interface{}) + if !ok { + return nil, mergepatch.ErrBadPatchFormatForSetElementOrderList + } } else if k != directiveMarker { - fieldType, fieldPatchStrategy, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(t, k) + fieldType, fieldPatchStrategies, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(t, k) + if err != nil { + return nil, err + } + _, patchStrategy, err := extractRetainKeysPatchStrategy(fieldPatchStrategies) if err != nil { return nil, err } @@ -956,7 +1590,7 @@ func sortMergeListsByNameMap(s map[string]interface{}, t reflect.Type) (map[stri return nil, err } } else if typedV, ok := v.([]interface{}); ok { - if fieldPatchStrategy == mergeDirective { + if patchStrategy == mergeDirective { var err error v, err = sortMergeListsByNameArray(typedV, fieldType.Elem(), fieldPatchMergeKey, true) if err != nil { @@ -987,7 +1621,7 @@ func sortMergeListsByNameArray(s []interface{}, elemType reflect.Type, mergeKey // If the elements are not maps... if t.Kind() != reflect.Map { // Sort the elements, because they may have been merged out of order. - return uniqifyAndSortScalars(s), nil + return deduplicateAndSortScalars(s), nil } // Elements are maps - if one of the keys of the map is a map or a @@ -1060,8 +1694,8 @@ func (ss SortableSliceOfMaps) Swap(i, j int) { ss.s[j] = tmp } -func uniqifyAndSortScalars(s []interface{}) []interface{} { - s = uniqifyScalars(s) +func deduplicateAndSortScalars(s []interface{}) []interface{} { + s = deduplicateScalars(s) return sortScalars(s) } @@ -1071,8 +1705,8 @@ func sortScalars(s []interface{}) []interface{} { return ss.s } -func uniqifyScalars(s []interface{}) []interface{} { - // Clever algorithm to uniqify. +func deduplicateScalars(s []interface{}) []interface{} { + // Clever algorithm to deduplicate. length := len(s) - 1 for i := 0; i < length; i++ { for j := i + 1; j <= length; j++ { @@ -1202,15 +1836,19 @@ func mergingMapFieldsHaveConflicts( func mapsHaveConflicts(typedLeft, typedRight map[string]interface{}, structType reflect.Type) (bool, error) { for key, leftValue := range typedLeft { - if key != directiveMarker { + if key != directiveMarker && key != retainKeysDirective { if rightValue, ok := typedRight[key]; ok { - fieldType, fieldPatchStrategy, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(structType, key) + fieldType, fieldPatchStrategies, fieldPatchMergeKey, err := forkedjson.LookupPatchMetadata(structType, key) + if err != nil { + return true, err + } + _, patchStrategy, err := extractRetainKeysPatchStrategy(fieldPatchStrategies) if err != nil { return true, err } if hasConflicts, err := mergingMapFieldsHaveConflicts(leftValue, rightValue, - fieldType, fieldPatchStrategy, fieldPatchMergeKey); hasConflicts { + fieldType, patchStrategy, fieldPatchMergeKey); hasConflicts { return true, err } } @@ -1260,8 +1898,8 @@ func slicesHaveConflicts( // Sort scalar slices to prevent ordering issues // We have no way to sort non-merging lists of maps if elementType.Kind() != reflect.Map { - typedLeft = uniqifyAndSortScalars(typedLeft) - typedRight = uniqifyAndSortScalars(typedRight) + typedLeft = deduplicateAndSortScalars(typedLeft) + typedRight = deduplicateAndSortScalars(typedRight) } // Compare the slices element by element in order @@ -1349,26 +1987,23 @@ func CreateThreeWayMergePatch(original, modified, current []byte, dataStruct int // original to modified, and delta, which is the difference from current to modified without // deletions, and then apply delta to deletions as a patch, which should be strictly additive. deltaMapDiffOptions := DiffOptions{ - IgnoreChangesAndAdditions: false, - IgnoreDeletions: true, + IgnoreDeletions: true, + SetElementOrder: true, } deltaMap, err := diffMaps(currentMap, modifiedMap, t, deltaMapDiffOptions) if err != nil { return nil, err } deletionsMapDiffOptions := DiffOptions{ + SetElementOrder: true, IgnoreChangesAndAdditions: true, - IgnoreDeletions: false, } deletionsMap, err := diffMaps(originalMap, modifiedMap, t, deletionsMapDiffOptions) if err != nil { return nil, err } - mergeOptions := MergeOptions{ - MergeDeleteList: false, - IgnoreUnmatchedNulls: false, - } + mergeOptions := MergeOptions{} patchMap, err := mergeMap(deletionsMap, deltaMap, t, mergeOptions) if err != nil { return nil, err @@ -1384,10 +2019,7 @@ func CreateThreeWayMergePatch(original, modified, current []byte, dataStruct int // If overwrite is false, and the patch contains any keys that were changed differently, // then return a conflict error. if !overwrite { - changeMapDiffOptions := DiffOptions{ - IgnoreChangesAndAdditions: false, - IgnoreDeletions: false, - } + changeMapDiffOptions := DiffOptions{} changedMap, err := diffMaps(originalMap, currentMap, t, changeMapDiffOptions) if err != nil { return nil, err @@ -1419,13 +2051,11 @@ func CreateDeleteDirective(mergeKey string, mergeKeyValue interface{}) map[strin func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[string]interface{}, error) { typedOriginal, ok := original.(map[string]interface{}) if !ok { - t := reflect.TypeOf(original) - return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original) } typedPatch, ok := patch.(map[string]interface{}) if !ok { - t := reflect.TypeOf(patch) - return nil, nil, mergepatch.ErrBadArgType("map[string]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch) } return typedOriginal, typedPatch, nil } @@ -1433,13 +2063,53 @@ func mapTypeAssertion(original, patch interface{}) (map[string]interface{}, map[ func sliceTypeAssertion(original, patch interface{}) ([]interface{}, []interface{}, error) { typedOriginal, ok := original.([]interface{}) if !ok { - t := reflect.TypeOf(original) - return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedOriginal, original) } typedPatch, ok := patch.([]interface{}) if !ok { - t := reflect.TypeOf(patch) - return nil, nil, mergepatch.ErrBadArgType("[]interface{}", t.String()) + return nil, nil, mergepatch.ErrBadArgType(typedPatch, patch) } return typedOriginal, typedPatch, nil } + +// extractRetainKeysPatchStrategy process patch strategy, which is a string may contains multiple +// patch strategies seperated by ",". It returns a boolean var indicating if it has +// retainKeys strategies and a string for the other strategy. +func extractRetainKeysPatchStrategy(strategies []string) (bool, string, error) { + switch len(strategies) { + case 0: + return false, "", nil + case 1: + singleStrategy := strategies[0] + switch singleStrategy { + case retainKeysStrategy: + return true, "", nil + default: + return false, singleStrategy, nil + } + case 2: + switch { + case strategies[0] == retainKeysStrategy: + return true, strategies[1], nil + case strategies[1] == retainKeysStrategy: + return true, strategies[0], nil + default: + return false, "", fmt.Errorf("unexpected patch strategy: %v", strategies) + } + default: + return false, "", fmt.Errorf("unexpected patch strategy: %v", strategies) + } +} + +// hasAdditionalNewField returns if original map has additional key with non-nil value than modified. +func hasAdditionalNewField(original, modified map[string]interface{}) bool { + for k, v := range original { + if v == nil { + continue + } + if _, found := modified[k]; !found { + return true + } + } + return false +} diff --git a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go index 1538550e..badaa215 100644 --- a/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go +++ b/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go @@ -65,9 +65,9 @@ func NonSlidingUntil(f func(), period time.Duration, stopCh <-chan struct{}) { // JitterUntil loops until stop channel is closed, running f every period. // // If jitterFactor is positive, the period is jittered before every run of f. -// If jitterFactor is not positive, the period is unchanged and not jitterd. +// If jitterFactor is not positive, the period is unchanged and not jittered. // -// If slidingis true, the period is computed after f runs. If it is false then +// If sliding is true, the period is computed after f runs. If it is false then // period includes the runtime for f. // // Close stopCh to stop. f may not be invoked if stop channel is already @@ -138,14 +138,14 @@ type ConditionFunc func() (done bool, err error) // Backoff holds parameters applied to a Backoff function. type Backoff struct { Duration time.Duration // the base duration - Factor float64 // Duration is multipled by factor each iteration + Factor float64 // Duration is multiplied by factor each iteration Jitter float64 // The amount of jitter applied each iteration Steps int // Exit with error after this many steps } // ExponentialBackoff repeats a condition check with exponential backoff. // -// It checks the condition up to Steps times, increasing the wait by multipling +// It checks the condition up to Steps times, increasing the wait by multiplying // the previous duration by Factor. // // If Jitter is greater than zero, a random amount of each duration is added diff --git a/vendor/k8s.io/apimachinery/pkg/watch/until.go b/vendor/k8s.io/apimachinery/pkg/watch/until.go index 6e139de5..c2772ddb 100644 --- a/vendor/k8s.io/apimachinery/pkg/watch/until.go +++ b/vendor/k8s.io/apimachinery/pkg/watch/until.go @@ -29,8 +29,8 @@ import ( // from false to true). type ConditionFunc func(event Event) (bool, error) -// errWatchClosed is returned when the watch channel is closed before timeout in Until. -var errWatchClosed = errors.New("watch closed before Until timeout") +// ErrWatchClosed is returned when the watch channel is closed before timeout in Until. +var ErrWatchClosed = errors.New("watch closed before Until timeout") // Until reads items from the watch until each provided condition succeeds, and then returns the last watch // encountered. The first condition that returns an error terminates the watch (and the event is also returned). @@ -65,7 +65,7 @@ func Until(timeout time.Duration, watcher Interface, conditions ...ConditionFunc select { case event, ok := <-ch: if !ok { - return lastEvent, errWatchClosed + return lastEvent, ErrWatchClosed } lastEvent = &event diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/OWNERS b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/OWNERS new file mode 100644 index 00000000..8e8d9fce --- /dev/null +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/OWNERS @@ -0,0 +1,5 @@ +approvers: +- pwittrock +reviewers: +- mengqiy +- apelisse diff --git a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go index 1d17270e..ac6d9cb9 100644 --- a/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go +++ b/vendor/k8s.io/apimachinery/third_party/forked/golang/json/fields.go @@ -17,16 +17,25 @@ import ( "unicode/utf8" ) +const ( + patchStrategyTagKey = "patchStrategy" + patchMergeKeyTagKey = "patchMergeKey" +) + // Finds the patchStrategy and patchMergeKey struct tag fields on a given // struct field given the struct type and the JSON name of the field. +// It returns field type, a slice of patch strategies, merge key and error. // TODO: fix the returned errors to be introspectable. -func LookupPatchMetadata(t reflect.Type, jsonField string) (reflect.Type, string, string, error) { +func LookupPatchMetadata(t reflect.Type, jsonField string) ( + elemType reflect.Type, patchStrategies []string, patchMergeKey string, e error) { if t.Kind() == reflect.Map { - return t.Elem(), "", "", nil + elemType = t.Elem() + return } if t.Kind() != reflect.Struct { - return nil, "", "", fmt.Errorf("merging an object in json but data type is not map or struct, instead is: %s", + e = fmt.Errorf("merging an object in json but data type is not map or struct, instead is: %s", t.Kind().String()) + return } jf := []byte(jsonField) // Find the field that the JSON library would use. @@ -50,11 +59,14 @@ func LookupPatchMetadata(t reflect.Type, jsonField string) (reflect.Type, string for i := 1; i < len(f.index); i++ { tjf = tjf.Type.Field(f.index[i]) } - patchStrategy := tjf.Tag.Get("patchStrategy") - patchMergeKey := tjf.Tag.Get("patchMergeKey") - return tjf.Type, patchStrategy, patchMergeKey, nil + patchStrategy := tjf.Tag.Get(patchStrategyTagKey) + patchMergeKey = tjf.Tag.Get(patchMergeKeyTagKey) + patchStrategies = strings.Split(patchStrategy, ",") + elemType = tjf.Type + return } - return nil, "", "", fmt.Errorf("unable to find api field in struct %s for the json field %q", t.Name(), jsonField) + e = fmt.Errorf("unable to find api field in struct %s for the json field %q", t.Name(), jsonField) + return } // A field represents a single field found in a struct. diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go index 47c62194..403a88a6 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/types.go @@ -66,11 +66,8 @@ const ( type StatefulSetUpdateStrategy struct { // Type indicates the type of the StatefulSetUpdateStrategy. Type StatefulSetUpdateStrategyType - // Partition is used to communicate the ordinal at which to partition - // the StatefulSet when Type is PartitionStatefulSetStrategyType. This - // value must be set when Type is PartitionStatefulSetStrategyType, - // and it must be nil otherwise. - Partition *PartitionStatefulSetStrategy + // RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType. + RollingUpdate *RollingUpdateStatefulSetStrategy } // StatefulSetUpdateStrategyType is a string enumeration type that enumerates @@ -78,14 +75,6 @@ type StatefulSetUpdateStrategy struct { type StatefulSetUpdateStrategyType string const ( - // PartitionStatefulSetStrategyType indicates that updates will only be - // applied to a partition of the StatefulSet. This is useful for canaries - // and phased roll outs. When a scale operation is performed with this - // strategy, new Pods will be created from the specification version indicated - // by the StatefulSet's currentRevision if there ordinal is less than the supplied - // Partition's ordinal. Otherwise, they will be created from the specification - // version indicated by the StatefulSet's updateRevision. - PartitionStatefulSetStrategyType StatefulSetUpdateStrategyType = "Partition" // RollingUpdateStatefulSetStrategyType indicates that update will be // applied to all Pods in the StatefulSet with respect to the StatefulSet // ordering constraints. When a scale operation is performed with this @@ -100,12 +89,11 @@ const ( OnDeleteStatefulSetStrategyType = "OnDelete" ) -// PartitionStatefulSetStrategy contains the parameters used with the -// PartitionStatefulSetStrategyType. -type PartitionStatefulSetStrategy struct { - // Ordinal indicates the ordinal at which the StatefulSet should be +// RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType. +type RollingUpdateStatefulSetStrategy struct { + // Partition indicates the ordinal at which the StatefulSet should be // partitioned. - Ordinal int32 + Partition int32 } // A StatefulSetSpec is the specification of a StatefulSet. diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/conversion.go index e11b8623..a21c37db 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/conversion.go @@ -167,22 +167,23 @@ func Convert_apps_StatefulSetSpec_To_v1beta1_StatefulSetSpec(in *apps.StatefulSe func Convert_v1beta1_StatefulSetUpdateStrategy_To_apps_StatefulSetUpdateStrategy(in *StatefulSetUpdateStrategy, out *apps.StatefulSetUpdateStrategy, s conversion.Scope) error { out.Type = apps.StatefulSetUpdateStrategyType(in.Type) - if in.Partition != nil { - out.Partition = new(apps.PartitionStatefulSetStrategy) - out.Partition.Ordinal = in.Partition.Ordinal + if in.RollingUpdate != nil { + out.RollingUpdate = new(apps.RollingUpdateStatefulSetStrategy) + out.RollingUpdate.Partition = *in.RollingUpdate.Partition } else { - out.Partition = nil + out.RollingUpdate = nil } return nil } func Convert_apps_StatefulSetUpdateStrategy_To_v1beta1_StatefulSetUpdateStrategy(in *apps.StatefulSetUpdateStrategy, out *StatefulSetUpdateStrategy, s conversion.Scope) error { out.Type = StatefulSetUpdateStrategyType(in.Type) - if in.Partition != nil { - out.Partition = new(PartitionStatefulSetStrategy) - out.Partition.Ordinal = in.Partition.Ordinal + if in.RollingUpdate != nil { + out.RollingUpdate = new(RollingUpdateStatefulSetStrategy) + out.RollingUpdate.Partition = new(int32) + *out.RollingUpdate.Partition = in.RollingUpdate.Partition } else { - out.Partition = nil + out.RollingUpdate = nil } return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/defaults.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/defaults.go index 895c8b90..af133d25 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/defaults.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/defaults.go @@ -53,6 +53,12 @@ func SetDefaults_StatefulSet(obj *StatefulSet) { obj.Spec.RevisionHistoryLimit = new(int32) *obj.Spec.RevisionHistoryLimit = 10 } + if obj.Spec.UpdateStrategy.Type == RollingUpdateStatefulSetStrategyType && + obj.Spec.UpdateStrategy.RollingUpdate != nil && + obj.Spec.UpdateStrategy.RollingUpdate.Partition == nil { + obj.Spec.UpdateStrategy.RollingUpdate.Partition = new(int32) + *obj.Spec.UpdateStrategy.RollingUpdate.Partition = 0 + } } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.pb.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.pb.go index c31ccd3f..9bb3eac9 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.pb.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.pb.go @@ -34,9 +34,9 @@ limitations under the License. DeploymentSpec DeploymentStatus DeploymentStrategy - PartitionStatefulSetStrategy RollbackConfig RollingUpdateDeployment + RollingUpdateStatefulSetStrategy Scale ScaleSpec ScaleStatus @@ -110,19 +110,19 @@ func (m *DeploymentStrategy) Reset() { *m = DeploymentStrateg func (*DeploymentStrategy) ProtoMessage() {} func (*DeploymentStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{8} } -func (m *PartitionStatefulSetStrategy) Reset() { *m = PartitionStatefulSetStrategy{} } -func (*PartitionStatefulSetStrategy) ProtoMessage() {} -func (*PartitionStatefulSetStrategy) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{9} -} - func (m *RollbackConfig) Reset() { *m = RollbackConfig{} } func (*RollbackConfig) ProtoMessage() {} -func (*RollbackConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{10} } +func (*RollbackConfig) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{9} } func (m *RollingUpdateDeployment) Reset() { *m = RollingUpdateDeployment{} } func (*RollingUpdateDeployment) ProtoMessage() {} func (*RollingUpdateDeployment) Descriptor() ([]byte, []int) { + return fileDescriptorGenerated, []int{10} +} + +func (m *RollingUpdateStatefulSetStrategy) Reset() { *m = RollingUpdateStatefulSetStrategy{} } +func (*RollingUpdateStatefulSetStrategy) ProtoMessage() {} +func (*RollingUpdateStatefulSetStrategy) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{11} } @@ -170,9 +170,9 @@ func init() { proto.RegisterType((*DeploymentSpec)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.DeploymentSpec") proto.RegisterType((*DeploymentStatus)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.DeploymentStatus") proto.RegisterType((*DeploymentStrategy)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.DeploymentStrategy") - proto.RegisterType((*PartitionStatefulSetStrategy)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.PartitionStatefulSetStrategy") proto.RegisterType((*RollbackConfig)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.RollbackConfig") proto.RegisterType((*RollingUpdateDeployment)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.RollingUpdateDeployment") + proto.RegisterType((*RollingUpdateStatefulSetStrategy)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.RollingUpdateStatefulSetStrategy") proto.RegisterType((*Scale)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.Scale") proto.RegisterType((*ScaleSpec)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.ScaleSpec") proto.RegisterType((*ScaleStatus)(nil), "k8s.io.kubernetes.pkg.apis.apps.v1beta1.ScaleStatus") @@ -599,27 +599,6 @@ func (m *DeploymentStrategy) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *PartitionStatefulSetStrategy) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *PartitionStatefulSetStrategy) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0x8 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Ordinal)) - return i, nil -} - func (m *RollbackConfig) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -679,6 +658,29 @@ func (m *RollingUpdateDeployment) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *RollingUpdateStatefulSetStrategy) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RollingUpdateStatefulSetStrategy) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Partition != nil { + dAtA[i] = 0x8 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.Partition)) + } + return i, nil +} + func (m *Scale) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1000,11 +1002,11 @@ func (m *StatefulSetUpdateStrategy) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) i += copy(dAtA[i:], m.Type) - if m.Partition != nil { + if m.RollingUpdate != nil { dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Partition.Size())) - n28, err := m.Partition.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.RollingUpdate.Size())) + n28, err := m.RollingUpdate.MarshalTo(dAtA[i:]) if err != nil { return 0, err } @@ -1189,13 +1191,6 @@ func (m *DeploymentStrategy) Size() (n int) { return n } -func (m *PartitionStatefulSetStrategy) Size() (n int) { - var l int - _ = l - n += 1 + sovGenerated(uint64(m.Ordinal)) - return n -} - func (m *RollbackConfig) Size() (n int) { var l int _ = l @@ -1217,6 +1212,15 @@ func (m *RollingUpdateDeployment) Size() (n int) { return n } +func (m *RollingUpdateStatefulSetStrategy) Size() (n int) { + var l int + _ = l + if m.Partition != nil { + n += 1 + sovGenerated(uint64(*m.Partition)) + } + return n +} + func (m *Scale) Size() (n int) { var l int _ = l @@ -1331,8 +1335,8 @@ func (m *StatefulSetUpdateStrategy) Size() (n int) { _ = l l = len(m.Type) n += 1 + l + sovGenerated(uint64(l)) - if m.Partition != nil { - l = m.Partition.Size() + if m.RollingUpdate != nil { + l = m.RollingUpdate.Size() n += 1 + l + sovGenerated(uint64(l)) } return n @@ -1480,16 +1484,6 @@ func (this *DeploymentStrategy) String() string { }, "") return s } -func (this *PartitionStatefulSetStrategy) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&PartitionStatefulSetStrategy{`, - `Ordinal:` + fmt.Sprintf("%v", this.Ordinal) + `,`, - `}`, - }, "") - return s -} func (this *RollbackConfig) String() string { if this == nil { return "nil" @@ -1511,6 +1505,16 @@ func (this *RollingUpdateDeployment) String() string { }, "") return s } +func (this *RollingUpdateStatefulSetStrategy) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&RollingUpdateStatefulSetStrategy{`, + `Partition:` + valueToStringGenerated(this.Partition) + `,`, + `}`, + }, "") + return s +} func (this *Scale) String() string { if this == nil { return "nil" @@ -1617,7 +1621,7 @@ func (this *StatefulSetUpdateStrategy) String() string { } s := strings.Join([]string{`&StatefulSetUpdateStrategy{`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, - `Partition:` + strings.Replace(fmt.Sprintf("%v", this.Partition), "PartitionStatefulSetStrategy", "PartitionStatefulSetStrategy", 1) + `,`, + `RollingUpdate:` + strings.Replace(fmt.Sprintf("%v", this.RollingUpdate), "RollingUpdateStatefulSetStrategy", "RollingUpdateStatefulSetStrategy", 1) + `,`, `}`, }, "") return s @@ -3174,7 +3178,7 @@ func (m *DeploymentStrategy) Unmarshal(dAtA []byte) error { } return nil } -func (m *PartitionStatefulSetStrategy) Unmarshal(dAtA []byte) error { +func (m *RollbackConfig) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3197,17 +3201,17 @@ func (m *PartitionStatefulSetStrategy) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PartitionStatefulSetStrategy: wiretype end group for non-group") + return fmt.Errorf("proto: RollbackConfig: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PartitionStatefulSetStrategy: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RollbackConfig: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Ordinal", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) } - m.Ordinal = 0 + m.Revision = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3217,7 +3221,7 @@ func (m *PartitionStatefulSetStrategy) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Ordinal |= (int32(b) & 0x7F) << shift + m.Revision |= (int64(b) & 0x7F) << shift if b < 0x80 { break } @@ -3243,7 +3247,7 @@ func (m *PartitionStatefulSetStrategy) Unmarshal(dAtA []byte) error { } return nil } -func (m *RollbackConfig) Unmarshal(dAtA []byte) error { +func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3266,17 +3270,17 @@ func (m *RollbackConfig) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RollbackConfig: wiretype end group for non-group") + return fmt.Errorf("proto: RollingUpdateDeployment: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RollbackConfig: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RollingUpdateDeployment: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxUnavailable", wireType) } - m.Revision = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3286,11 +3290,58 @@ func (m *RollbackConfig) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Revision |= (int64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxUnavailable == nil { + m.MaxUnavailable = &k8s_io_apimachinery_pkg_util_intstr.IntOrString{} + } + if err := m.MaxUnavailable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxSurge", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxSurge == nil { + m.MaxSurge = &k8s_io_apimachinery_pkg_util_intstr.IntOrString{} + } + if err := m.MaxSurge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3312,7 +3363,7 @@ func (m *RollbackConfig) Unmarshal(dAtA []byte) error { } return nil } -func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { +func (m *RollingUpdateStatefulSetStrategy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3335,50 +3386,17 @@ func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: RollingUpdateDeployment: wiretype end group for non-group") + return fmt.Errorf("proto: RollingUpdateStatefulSetStrategy: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: RollingUpdateDeployment: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RollingUpdateStatefulSetStrategy: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxUnavailable", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.MaxUnavailable == nil { - m.MaxUnavailable = &k8s_io_apimachinery_pkg_util_intstr.IntOrString{} - } - if err := m.MaxUnavailable.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxSurge", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Partition", wireType) } - var msglen int + var v int32 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3388,25 +3406,12 @@ func (m *RollingUpdateDeployment) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + v |= (int32(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.MaxSurge == nil { - m.MaxSurge = &k8s_io_apimachinery_pkg_util_intstr.IntOrString{} - } - if err := m.MaxSurge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex + m.Partition = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4638,7 +4643,7 @@ func (m *StatefulSetUpdateStrategy) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partition", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RollingUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -4662,10 +4667,10 @@ func (m *StatefulSetUpdateStrategy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Partition == nil { - m.Partition = &PartitionStatefulSetStrategy{} + if m.RollingUpdate == nil { + m.RollingUpdate = &RollingUpdateStatefulSetStrategy{} } - if err := m.Partition.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.RollingUpdate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -4800,119 +4805,119 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1818 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4f, 0x4f, 0x23, 0xc9, - 0x15, 0xa7, 0xfd, 0x07, 0x4c, 0xb1, 0x98, 0xa1, 0x20, 0xe0, 0x65, 0x37, 0x06, 0xf9, 0xb0, 0xcb, - 0x44, 0x4b, 0x3b, 0xc3, 0x4c, 0x76, 0x67, 0x20, 0x1a, 0x85, 0x66, 0xc8, 0x66, 0x22, 0x08, 0xa8, - 0x0c, 0xa3, 0xec, 0x64, 0x23, 0x6d, 0xb9, 0x5d, 0xd3, 0xf4, 0xd2, 0xff, 0xd4, 0x5d, 0x76, 0xc6, - 0xb7, 0x28, 0x52, 0x6e, 0x39, 0xe4, 0x0b, 0x44, 0xb9, 0x47, 0x91, 0xf2, 0x35, 0x50, 0x72, 0xc8, - 0x6a, 0x4f, 0xa3, 0x1c, 0x50, 0xf0, 0x7c, 0x84, 0x28, 0x97, 0x39, 0x45, 0x55, 0x5d, 0xfd, 0xdf, - 0x0d, 0xb6, 0xa3, 0x70, 0xc9, 0xcd, 0x5d, 0xef, 0xbd, 0xdf, 0x7b, 0x55, 0xf5, 0xde, 0xab, 0xdf, - 0x33, 0xf8, 0xec, 0xe2, 0xb1, 0x27, 0xeb, 0x76, 0xf3, 0xa2, 0xdb, 0x26, 0xae, 0x45, 0x28, 0xf1, - 0x9a, 0xce, 0x85, 0xd6, 0xc4, 0x8e, 0xee, 0x35, 0xb1, 0xe3, 0x78, 0xcd, 0xde, 0x83, 0x36, 0xa1, - 0xf8, 0x41, 0x53, 0x23, 0x16, 0x71, 0x31, 0x25, 0x1d, 0xd9, 0x71, 0x6d, 0x6a, 0xc3, 0x8f, 0x7d, - 0x43, 0x39, 0x32, 0x94, 0x9d, 0x0b, 0x4d, 0x66, 0x86, 0x32, 0x33, 0x94, 0x85, 0xe1, 0xda, 0x96, - 0xa6, 0xd3, 0xf3, 0x6e, 0x5b, 0x56, 0x6d, 0xb3, 0xa9, 0xd9, 0x9a, 0xdd, 0xe4, 0xf6, 0xed, 0xee, - 0x2b, 0xfe, 0xc5, 0x3f, 0xf8, 0x2f, 0x1f, 0x77, 0xed, 0x91, 0x08, 0x08, 0x3b, 0xba, 0x89, 0xd5, - 0x73, 0xdd, 0x22, 0x6e, 0x3f, 0x0a, 0xc9, 0x24, 0x14, 0x37, 0x7b, 0x99, 0x68, 0xd6, 0x9a, 0x79, - 0x56, 0x6e, 0xd7, 0xa2, 0xba, 0x49, 0x32, 0x06, 0x9f, 0xde, 0x66, 0xe0, 0xa9, 0xe7, 0xc4, 0xc4, - 0x19, 0xbb, 0x87, 0x79, 0x76, 0x5d, 0xaa, 0x1b, 0x4d, 0xdd, 0xa2, 0x1e, 0x75, 0x33, 0x46, 0x9f, - 0xe4, 0x1e, 0xf2, 0xb0, 0xbd, 0x3c, 0xb9, 0xe1, 0x4a, 0x1c, 0xdb, 0xd0, 0xd5, 0x7e, 0xde, 0xa5, - 0x34, 0xfe, 0x2d, 0x01, 0xb8, 0x6f, 0x5b, 0xd4, 0xb5, 0x0d, 0x83, 0xb8, 0x88, 0xf4, 0x74, 0x4f, - 0xb7, 0x2d, 0xf8, 0x15, 0xa8, 0xb0, 0x83, 0xeb, 0x60, 0x8a, 0x6b, 0xd2, 0x86, 0xb4, 0x39, 0xb7, - 0xfd, 0x7d, 0x59, 0x5c, 0x5f, 0x7c, 0x1f, 0xd1, 0x05, 0x32, 0x6d, 0xb9, 0xf7, 0x40, 0x3e, 0x6e, - 0x7f, 0x4d, 0x54, 0x7a, 0x44, 0x28, 0x56, 0xe0, 0xe5, 0xd5, 0xfa, 0xd4, 0xe0, 0x6a, 0x1d, 0x44, - 0x6b, 0x28, 0x44, 0x85, 0xc7, 0xa0, 0xc4, 0xd1, 0x0b, 0x1c, 0x7d, 0x2b, 0x17, 0x5d, 0x9c, 0xae, - 0x8c, 0xf0, 0xaf, 0x0e, 0x5e, 0x53, 0x62, 0xb1, 0xf0, 0x94, 0xf7, 0x04, 0x74, 0xe9, 0x19, 0xa6, - 0x18, 0x71, 0x20, 0xf8, 0x09, 0xa8, 0xb8, 0x22, 0xfc, 0x5a, 0x71, 0x43, 0xda, 0x2c, 0x2a, 0xf7, - 0x84, 0x56, 0x25, 0xd8, 0x16, 0x0a, 0x35, 0x1a, 0x6f, 0x24, 0xb0, 0x92, 0xdd, 0xf7, 0xa1, 0xee, - 0x51, 0xf8, 0x65, 0x66, 0xef, 0xf2, 0x68, 0x7b, 0x67, 0xd6, 0x7c, 0xe7, 0xa1, 0xe3, 0x60, 0x25, - 0xb6, 0xef, 0xaf, 0x40, 0x59, 0xa7, 0xc4, 0xf4, 0x6a, 0x85, 0x8d, 0xe2, 0xe6, 0xdc, 0xf6, 0xae, - 0x3c, 0x62, 0x55, 0xc8, 0xd9, 0x68, 0x95, 0x79, 0xe1, 0xa7, 0xfc, 0x9c, 0x21, 0x22, 0x1f, 0xb8, - 0xf1, 0xe7, 0x02, 0x00, 0xcf, 0x88, 0x63, 0xd8, 0x7d, 0x93, 0x58, 0xf4, 0x0e, 0xae, 0xf2, 0x0b, - 0x50, 0xf2, 0x1c, 0xa2, 0x8a, 0xab, 0xfc, 0x6c, 0xe4, 0x1d, 0x45, 0x41, 0xb6, 0x1c, 0xa2, 0x46, - 0x97, 0xca, 0xbe, 0x10, 0x87, 0x84, 0x18, 0x4c, 0x7b, 0x14, 0xd3, 0xae, 0xc7, 0xaf, 0x74, 0x6e, - 0xfb, 0xc9, 0x24, 0xe0, 0x1c, 0x40, 0xa9, 0x0a, 0xf8, 0x69, 0xff, 0x1b, 0x09, 0xe0, 0xc6, 0x75, - 0x11, 0x2c, 0x45, 0xca, 0xfb, 0xb6, 0xd5, 0xd1, 0x29, 0x2b, 0x81, 0x5d, 0x50, 0xa2, 0x7d, 0x87, - 0xf0, 0x33, 0x9b, 0x55, 0x3e, 0x0e, 0x82, 0x3b, 0xed, 0x3b, 0xe4, 0xdd, 0xd5, 0xfa, 0xea, 0x10, - 0x13, 0x26, 0x42, 0xdc, 0x08, 0xbe, 0x08, 0xe3, 0x2e, 0x70, 0xf3, 0xa7, 0x49, 0xe7, 0xef, 0xae, - 0xd6, 0x6f, 0xac, 0x70, 0x39, 0xc4, 0x4c, 0x06, 0x0b, 0x3f, 0x02, 0xd3, 0x2e, 0xc1, 0x9e, 0x6d, - 0xd5, 0x4a, 0x1c, 0x37, 0xdc, 0x14, 0xe2, 0xab, 0x48, 0x48, 0xe1, 0x7d, 0x30, 0x63, 0x12, 0xcf, - 0xc3, 0x1a, 0xa9, 0x95, 0xb9, 0xe2, 0x82, 0x50, 0x9c, 0x39, 0xf2, 0x97, 0x51, 0x20, 0x87, 0x5f, - 0x83, 0xaa, 0x81, 0x3d, 0x7a, 0xe6, 0x74, 0x30, 0x25, 0xa7, 0xba, 0x49, 0x6a, 0xd3, 0xfc, 0xa8, - 0xbf, 0x37, 0x5a, 0x96, 0x30, 0x0b, 0x65, 0x45, 0xa0, 0x57, 0x0f, 0x13, 0x48, 0x28, 0x85, 0x0c, - 0x7b, 0x00, 0xb2, 0x95, 0x53, 0x17, 0x5b, 0x9e, 0x7f, 0x64, 0xcc, 0xdf, 0xcc, 0xd8, 0xfe, 0xd6, - 0x84, 0x3f, 0x78, 0x98, 0x41, 0x43, 0x43, 0x3c, 0x34, 0x2e, 0x25, 0x50, 0x8d, 0x2e, 0xec, 0x0e, - 0xaa, 0xfc, 0xe7, 0xc9, 0x2a, 0x7f, 0x38, 0x41, 0xda, 0xe6, 0x54, 0xf7, 0xef, 0x8a, 0x00, 0x46, - 0x4a, 0xc8, 0x36, 0x8c, 0x36, 0x56, 0x2f, 0xe0, 0x06, 0x28, 0x59, 0xd8, 0x0c, 0xb2, 0x35, 0x2c, - 0xa5, 0x9f, 0x61, 0x93, 0x20, 0x2e, 0x81, 0x7f, 0x94, 0x00, 0xec, 0xf2, 0xab, 0xe8, 0xec, 0x59, - 0x96, 0x4d, 0x31, 0x3b, 0x9d, 0x20, 0xc0, 0xd6, 0x04, 0x01, 0x06, 0xbe, 0xe5, 0xb3, 0x0c, 0xea, - 0x81, 0x45, 0xdd, 0x7e, 0x74, 0x4b, 0x59, 0x05, 0x34, 0x24, 0x14, 0x78, 0x01, 0x80, 0x2b, 0x30, - 0x4f, 0x6d, 0x51, 0xf0, 0xa3, 0x77, 0x93, 0x20, 0x9c, 0x7d, 0xdb, 0x7a, 0xa5, 0x6b, 0x51, 0xcb, - 0x42, 0x21, 0x24, 0x8a, 0xc1, 0xaf, 0x1d, 0x80, 0xd5, 0x9c, 0xb8, 0xe1, 0x3d, 0x50, 0xbc, 0x20, - 0x7d, 0xff, 0x28, 0x11, 0xfb, 0x09, 0x97, 0x41, 0xb9, 0x87, 0x8d, 0x2e, 0xf1, 0xab, 0x19, 0xf9, - 0x1f, 0x3b, 0x85, 0xc7, 0x52, 0xe3, 0x1f, 0xe5, 0x78, 0x66, 0xb1, 0xce, 0x05, 0x37, 0xd9, 0x43, - 0xe4, 0x18, 0xba, 0x8a, 0x3d, 0x8e, 0x51, 0x56, 0xde, 0xf3, 0x1f, 0x21, 0x7f, 0x0d, 0x85, 0x52, - 0xf8, 0x4b, 0x50, 0xf1, 0x88, 0x41, 0x54, 0x6a, 0xbb, 0xa2, 0x79, 0x3e, 0x1c, 0x31, 0x07, 0x71, - 0x9b, 0x18, 0x2d, 0x61, 0xea, 0xc3, 0x07, 0x5f, 0x28, 0x84, 0x84, 0xbf, 0x00, 0x15, 0x4a, 0x4c, - 0xc7, 0xc0, 0x94, 0x88, 0xd3, 0xdc, 0xca, 0x3f, 0x4d, 0x06, 0x7b, 0x62, 0x77, 0x4e, 0x85, 0x01, - 0xef, 0xc8, 0x61, 0x86, 0x07, 0xab, 0x28, 0x04, 0x84, 0x3a, 0xa8, 0x78, 0x94, 0x31, 0x09, 0xad, - 0xcf, 0x7b, 0xd1, 0x38, 0x4f, 0x59, 0xbc, 0x37, 0xfb, 0x10, 0x91, 0xab, 0x60, 0x05, 0x85, 0xf0, - 0x70, 0x0f, 0x2c, 0x98, 0xba, 0x85, 0x08, 0xee, 0xf4, 0x5b, 0x44, 0xb5, 0xad, 0x8e, 0xc7, 0x9b, - 0x5a, 0x59, 0x59, 0x15, 0x46, 0x0b, 0x47, 0x49, 0x31, 0x4a, 0xeb, 0xc3, 0x43, 0xb0, 0x1c, 0x3c, - 0xfd, 0x3f, 0xd1, 0x3d, 0x6a, 0xbb, 0xfd, 0x43, 0xdd, 0xd4, 0x29, 0x6f, 0x75, 0x65, 0xa5, 0x36, - 0xb8, 0x5a, 0x5f, 0x46, 0x43, 0xe4, 0x68, 0xa8, 0x15, 0xeb, 0xc2, 0x0e, 0xee, 0x7a, 0xa4, 0xc3, - 0x5b, 0x57, 0x25, 0xea, 0xc2, 0x27, 0x7c, 0x15, 0x09, 0x29, 0xd4, 0x12, 0x09, 0x5d, 0xf9, 0xef, - 0x12, 0xba, 0x9a, 0x9f, 0xcc, 0xf0, 0x0c, 0xac, 0x3a, 0xae, 0xad, 0xb9, 0xc4, 0xf3, 0x9e, 0x11, - 0xdc, 0x31, 0x74, 0x8b, 0x04, 0x27, 0x35, 0xcb, 0x77, 0xf8, 0xc1, 0xe0, 0x6a, 0x7d, 0xf5, 0x64, - 0xb8, 0x0a, 0xca, 0xb3, 0x6d, 0x7c, 0x5b, 0x02, 0xf7, 0xd2, 0xef, 0x28, 0xfc, 0x29, 0x80, 0x76, - 0xdb, 0x23, 0x6e, 0x8f, 0x74, 0x3e, 0xf7, 0xc9, 0x24, 0x63, 0x5c, 0x12, 0x67, 0x5c, 0x61, 0xc5, - 0x1f, 0x67, 0x34, 0xd0, 0x10, 0x2b, 0x9f, 0xb3, 0x89, 0x52, 0x29, 0xf0, 0x40, 0x63, 0x9c, 0x2d, - 0x53, 0x2e, 0x7b, 0x60, 0x41, 0x74, 0x8d, 0x40, 0xc8, 0xd3, 0x3a, 0x96, 0x07, 0x67, 0x49, 0x31, - 0x4a, 0xeb, 0xc3, 0xcf, 0xc1, 0x22, 0xee, 0x61, 0xdd, 0xc0, 0x6d, 0x83, 0x84, 0x20, 0x25, 0x0e, - 0xf2, 0xbe, 0x00, 0x59, 0xdc, 0x4b, 0x2b, 0xa0, 0xac, 0x0d, 0x3c, 0x02, 0x4b, 0x5d, 0x2b, 0x0b, - 0xe5, 0xe7, 0xe5, 0x07, 0x02, 0x6a, 0xe9, 0x2c, 0xab, 0x82, 0x86, 0xd9, 0x41, 0x07, 0x00, 0x35, - 0x78, 0xf2, 0xbd, 0xda, 0x34, 0xef, 0xc9, 0x3f, 0x9c, 0xa0, 0x9e, 0x42, 0xde, 0x10, 0xf5, 0xbf, - 0x70, 0xc9, 0x43, 0x31, 0x1f, 0x70, 0x17, 0xcc, 0xbb, 0xac, 0x42, 0xc2, 0xd0, 0x67, 0x78, 0xe8, - 0xdf, 0x11, 0x66, 0xf3, 0x28, 0x2e, 0x44, 0x49, 0x5d, 0xb8, 0x03, 0xaa, 0xaa, 0x6d, 0x18, 0xbc, - 0x32, 0xf6, 0xed, 0xae, 0x45, 0x79, 0x72, 0x17, 0x15, 0xc8, 0x38, 0xc0, 0x7e, 0x42, 0x82, 0x52, - 0x9a, 0x8d, 0xbf, 0x49, 0xf1, 0x07, 0x2c, 0x28, 0x77, 0xb8, 0x93, 0xa0, 0x5b, 0x1f, 0xa5, 0xe8, - 0xd6, 0x4a, 0xd6, 0x22, 0xc6, 0xb6, 0xfa, 0x60, 0x9e, 0x15, 0x83, 0x6e, 0x69, 0x7e, 0x02, 0x88, - 0x66, 0xfa, 0xa3, 0xb1, 0x4a, 0x2d, 0xb4, 0x8e, 0x3d, 0xc1, 0x8b, 0xfc, 0x24, 0xe2, 0x42, 0x94, - 0xf4, 0xd4, 0x78, 0x0e, 0x3e, 0x3c, 0xc1, 0x2e, 0x0d, 0xb9, 0x1a, 0x79, 0xd5, 0x35, 0x5a, 0x24, - 0xda, 0xd6, 0x7d, 0x30, 0x63, 0xbb, 0x1d, 0xdd, 0xc2, 0x86, 0x78, 0x0b, 0x42, 0x22, 0x76, 0xec, - 0x2f, 0xa3, 0x40, 0xde, 0x78, 0x0a, 0xaa, 0xc9, 0x92, 0x4f, 0x8c, 0x34, 0xd2, 0xad, 0x23, 0xcd, - 0x5b, 0x09, 0xac, 0xe6, 0x6c, 0x04, 0x1a, 0xa0, 0x6a, 0xe2, 0xd7, 0xb1, 0x74, 0xbc, 0x75, 0x14, - 0x60, 0xd3, 0xa9, 0xec, 0x4f, 0xa7, 0xf2, 0x73, 0x8b, 0x1e, 0xbb, 0x2d, 0xea, 0xea, 0x96, 0xe6, - 0x5f, 0xf1, 0x51, 0x02, 0x0b, 0xa5, 0xb0, 0xe1, 0x4b, 0x50, 0x31, 0xf1, 0xeb, 0x56, 0xd7, 0xd5, - 0x82, 0xab, 0x18, 0xdf, 0x0f, 0x7f, 0xd4, 0x8e, 0x04, 0x0a, 0x0a, 0xf1, 0x1a, 0x7f, 0x28, 0x80, - 0x72, 0x4b, 0xc5, 0x06, 0xb9, 0x83, 0xc1, 0xe6, 0x34, 0x31, 0xd8, 0x6c, 0x8f, 0x9c, 0x4e, 0x3c, - 0xbe, 0xdc, 0x99, 0xe6, 0xcb, 0xd4, 0x4c, 0xf3, 0x68, 0x4c, 0xdc, 0x9b, 0xc7, 0x99, 0x27, 0x60, - 0x36, 0x74, 0x9f, 0xe8, 0xaf, 0xd2, 0x6d, 0xfd, 0xb5, 0xf1, 0xa7, 0x02, 0x98, 0x8b, 0xb9, 0x18, - 0xcf, 0x1a, 0x3a, 0x09, 0x32, 0xc3, 0x1a, 0x98, 0x32, 0xc9, 0xc6, 0xe4, 0x80, 0xc8, 0xf8, 0x1c, - 0x32, 0xe2, 0x05, 0x59, 0x7e, 0xf3, 0x14, 0x54, 0x29, 0x76, 0x35, 0x42, 0x03, 0x19, 0x3f, 0xd0, - 0xd9, 0x68, 0x1a, 0x39, 0x4d, 0x48, 0x51, 0x4a, 0x7b, 0x6d, 0x17, 0xcc, 0x27, 0x9c, 0x8d, 0x45, - 0xfc, 0xfe, 0xc2, 0x0e, 0x2b, 0x2a, 0xf8, 0x3b, 0xc8, 0xc6, 0x97, 0x89, 0x6c, 0x7c, 0x3c, 0xfa, - 0xe1, 0xc6, 0xda, 0x52, 0x5e, 0x4e, 0xb6, 0x53, 0x39, 0xb9, 0x33, 0x11, 0xfa, 0xcd, 0x99, 0xf9, - 0x57, 0x09, 0x2c, 0xc4, 0xb4, 0xef, 0x60, 0x0a, 0xfb, 0x22, 0x39, 0x85, 0x3d, 0x9a, 0x64, 0x53, - 0x39, 0x63, 0xd8, 0xbf, 0xca, 0x89, 0xcd, 0xfc, 0x1f, 0x11, 0xff, 0xdf, 0x4a, 0x60, 0xb9, 0x67, - 0x1b, 0x5d, 0x93, 0xec, 0x1b, 0x58, 0x37, 0x03, 0x0d, 0x46, 0xa3, 0x6e, 0x19, 0x75, 0xb9, 0x27, - 0xe2, 0x7a, 0xba, 0x47, 0x89, 0x45, 0x5f, 0x44, 0x18, 0xca, 0x87, 0xc2, 0xdf, 0xf2, 0x8b, 0x21, - 0xc0, 0x68, 0xa8, 0x3b, 0xf8, 0x03, 0x30, 0xc7, 0xf8, 0xa4, 0xae, 0x12, 0x36, 0xe4, 0x8a, 0xbf, - 0x39, 0x96, 0x04, 0xd0, 0x5c, 0x2b, 0x12, 0xa1, 0xb8, 0x1e, 0x3c, 0x07, 0x4b, 0x8e, 0xdd, 0x39, - 0xc2, 0x16, 0xd6, 0x08, 0x7b, 0x1a, 0x4f, 0xf8, 0xff, 0xa3, 0x7c, 0x10, 0x98, 0x55, 0x3e, 0x0d, - 0x88, 0xdb, 0x49, 0x56, 0xe5, 0x1d, 0x63, 0xd0, 0xd9, 0x65, 0x4e, 0x43, 0x86, 0x41, 0xc2, 0xdf, - 0x48, 0xa0, 0xea, 0xf3, 0xcf, 0x80, 0x0d, 0x88, 0x7f, 0x3a, 0x94, 0x49, 0xf2, 0xf0, 0x2c, 0x81, - 0x14, 0xf5, 0xb8, 0xe4, 0x3a, 0x4a, 0x79, 0xcc, 0x1d, 0x7c, 0x2a, 0x93, 0x0c, 0x3e, 0x8d, 0xbf, - 0x17, 0xc1, 0x62, 0xa6, 0xe0, 0xe1, 0x8f, 0x6f, 0x98, 0x08, 0x56, 0xfe, 0x67, 0xd3, 0x40, 0x86, - 0xc0, 0x16, 0xc7, 0x20, 0xb0, 0x7b, 0x60, 0x41, 0xed, 0xba, 0x2e, 0xb1, 0x68, 0x6a, 0x0a, 0x08, - 0x47, 0x89, 0xfd, 0xa4, 0x18, 0xa5, 0xf5, 0x87, 0x4d, 0x23, 0xe5, 0x31, 0xa7, 0x91, 0x78, 0x14, - 0x82, 0xe6, 0xf9, 0x79, 0x98, 0x8d, 0x42, 0xb0, 0xbd, 0xb4, 0x3e, 0x7b, 0x03, 0x7d, 0xd4, 0x10, - 0x61, 0x26, 0xf9, 0x06, 0x9e, 0x25, 0xa4, 0x28, 0xa5, 0xdd, 0xf8, 0x56, 0x02, 0xef, 0xe7, 0x66, - 0x19, 0xdc, 0x4b, 0x90, 0xf2, 0xad, 0x14, 0x29, 0xff, 0x6e, 0xae, 0x61, 0x8c, 0x9b, 0xbb, 0x60, - 0xd6, 0x09, 0x08, 0xb2, 0xe8, 0x75, 0x07, 0x23, 0xe7, 0xff, 0x4d, 0xd4, 0x5a, 0x99, 0x1f, 0x5c, - 0xad, 0xcf, 0x86, 0x1a, 0x28, 0x72, 0xa3, 0xdc, 0xbf, 0xbc, 0xae, 0x4f, 0x7d, 0x73, 0x5d, 0x9f, - 0x7a, 0x73, 0x5d, 0x9f, 0xfa, 0xf5, 0xa0, 0x2e, 0x5d, 0x0e, 0xea, 0xd2, 0x37, 0x83, 0xba, 0xf4, - 0xcf, 0x41, 0x5d, 0xfa, 0xfd, 0xdb, 0xfa, 0xd4, 0xcb, 0x19, 0xe1, 0xe1, 0x3f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0x4f, 0x0f, 0xec, 0xcc, 0xce, 0x1a, 0x00, 0x00, + // 1809 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0x4f, 0x6f, 0x23, 0x49, + 0x15, 0x4f, 0xfb, 0x4f, 0xe2, 0x54, 0x36, 0xce, 0x4c, 0x25, 0x4c, 0xbc, 0x59, 0x70, 0x22, 0x1f, + 0x76, 0xb3, 0xb0, 0x69, 0x33, 0x99, 0x61, 0x77, 0x26, 0x41, 0x23, 0xd2, 0x99, 0x61, 0x19, 0x94, + 0x90, 0xa8, 0x9c, 0x8c, 0xd8, 0x61, 0x91, 0xb6, 0xdc, 0xae, 0xe9, 0xf4, 0xa6, 0xff, 0xa9, 0xbb, + 0xda, 0x8c, 0x6f, 0x68, 0x25, 0x6e, 0x1c, 0xf8, 0x02, 0x88, 0x3b, 0x42, 0xe2, 0x6b, 0x44, 0x70, + 0x60, 0xc5, 0x69, 0xc5, 0x21, 0x22, 0x9e, 0x8f, 0x80, 0xb8, 0xcc, 0x09, 0x55, 0x75, 0xf5, 0x7f, + 0x77, 0x62, 0x1b, 0x91, 0x0b, 0x37, 0x77, 0xbd, 0xf7, 0x7e, 0xef, 0x55, 0xd5, 0x7b, 0xaf, 0x7e, + 0xcf, 0xe0, 0x93, 0xf3, 0x47, 0x9e, 0xac, 0xdb, 0xed, 0x73, 0xbf, 0x4b, 0x5c, 0x8b, 0x50, 0xe2, + 0xb5, 0x9d, 0x73, 0xad, 0x8d, 0x1d, 0xdd, 0x6b, 0x63, 0xc7, 0xf1, 0xda, 0xfd, 0xfb, 0x5d, 0x42, + 0xf1, 0xfd, 0xb6, 0x46, 0x2c, 0xe2, 0x62, 0x4a, 0x7a, 0xb2, 0xe3, 0xda, 0xd4, 0x86, 0x1f, 0x04, + 0x86, 0x72, 0x6c, 0x28, 0x3b, 0xe7, 0x9a, 0xcc, 0x0c, 0x65, 0x66, 0x28, 0x0b, 0xc3, 0xb5, 0x2d, + 0x4d, 0xa7, 0x67, 0x7e, 0x57, 0x56, 0x6d, 0xb3, 0xad, 0xd9, 0x9a, 0xdd, 0xe6, 0xf6, 0x5d, 0xff, + 0x15, 0xff, 0xe2, 0x1f, 0xfc, 0x57, 0x80, 0xbb, 0xf6, 0x50, 0x04, 0x84, 0x1d, 0xdd, 0xc4, 0xea, + 0x99, 0x6e, 0x11, 0x77, 0x10, 0x87, 0x64, 0x12, 0x8a, 0xdb, 0xfd, 0x5c, 0x34, 0x6b, 0xed, 0x22, + 0x2b, 0xd7, 0xb7, 0xa8, 0x6e, 0x92, 0x9c, 0xc1, 0xc7, 0x37, 0x19, 0x78, 0xea, 0x19, 0x31, 0x71, + 0xce, 0xee, 0x41, 0x91, 0x9d, 0x4f, 0x75, 0xa3, 0xad, 0x5b, 0xd4, 0xa3, 0x6e, 0xce, 0xe8, 0xa3, + 0xc2, 0x43, 0x1e, 0xb5, 0x97, 0xc7, 0xd7, 0x5c, 0x89, 0x63, 0x1b, 0xba, 0x3a, 0x28, 0xba, 0x94, + 0xd6, 0xbf, 0x25, 0x00, 0xf7, 0x6d, 0x8b, 0xba, 0xb6, 0x61, 0x10, 0x17, 0x91, 0xbe, 0xee, 0xe9, + 0xb6, 0x05, 0xbf, 0x00, 0x35, 0x76, 0x70, 0x3d, 0x4c, 0x71, 0x43, 0xda, 0x90, 0x36, 0x17, 0xb6, + 0xbf, 0x2f, 0x8b, 0xeb, 0x4b, 0xee, 0x23, 0xbe, 0x40, 0xa6, 0x2d, 0xf7, 0xef, 0xcb, 0x47, 0xdd, + 0x2f, 0x89, 0x4a, 0x0f, 0x09, 0xc5, 0x0a, 0xbc, 0xb8, 0x5c, 0x9f, 0x19, 0x5e, 0xae, 0x83, 0x78, + 0x0d, 0x45, 0xa8, 0xf0, 0x08, 0x54, 0x38, 0x7a, 0x89, 0xa3, 0x6f, 0x15, 0xa2, 0x8b, 0xd3, 0x95, + 0x11, 0xfe, 0xd5, 0xb3, 0xd7, 0x94, 0x58, 0x2c, 0x3c, 0xe5, 0x1d, 0x01, 0x5d, 0x79, 0x8a, 0x29, + 0x46, 0x1c, 0x08, 0x7e, 0x04, 0x6a, 0xae, 0x08, 0xbf, 0x51, 0xde, 0x90, 0x36, 0xcb, 0xca, 0x1d, + 0xa1, 0x55, 0x0b, 0xb7, 0x85, 0x22, 0x8d, 0xd6, 0x37, 0x12, 0xb8, 0x97, 0xdf, 0xf7, 0x81, 0xee, + 0x51, 0xf8, 0x79, 0x6e, 0xef, 0xf2, 0x78, 0x7b, 0x67, 0xd6, 0x7c, 0xe7, 0x91, 0xe3, 0x70, 0x25, + 0xb1, 0xef, 0x2f, 0x40, 0x55, 0xa7, 0xc4, 0xf4, 0x1a, 0xa5, 0x8d, 0xf2, 0xe6, 0xc2, 0xf6, 0xae, + 0x3c, 0x66, 0x55, 0xc8, 0xf9, 0x68, 0x95, 0x45, 0xe1, 0xa7, 0xfa, 0x9c, 0x21, 0xa2, 0x00, 0xb8, + 0xf5, 0xa7, 0x12, 0x00, 0x4f, 0x89, 0x63, 0xd8, 0x03, 0x93, 0x58, 0xf4, 0x16, 0xae, 0xf2, 0x33, + 0x50, 0xf1, 0x1c, 0xa2, 0x8a, 0xab, 0xfc, 0x64, 0xec, 0x1d, 0xc5, 0x41, 0x76, 0x1c, 0xa2, 0xc6, + 0x97, 0xca, 0xbe, 0x10, 0x87, 0x84, 0x18, 0xcc, 0x7a, 0x14, 0x53, 0xdf, 0xe3, 0x57, 0xba, 0xb0, + 0xfd, 0x78, 0x1a, 0x70, 0x0e, 0xa0, 0xd4, 0x05, 0xfc, 0x6c, 0xf0, 0x8d, 0x04, 0x70, 0xeb, 0xaa, + 0x0c, 0x96, 0x63, 0xe5, 0x7d, 0xdb, 0xea, 0xe9, 0x94, 0x95, 0xc0, 0x2e, 0xa8, 0xd0, 0x81, 0x43, + 0xf8, 0x99, 0xcd, 0x2b, 0x1f, 0x84, 0xc1, 0x9d, 0x0c, 0x1c, 0xf2, 0xf6, 0x72, 0x7d, 0x75, 0x84, + 0x09, 0x13, 0x21, 0x6e, 0x04, 0x5f, 0x44, 0x71, 0x97, 0xb8, 0xf9, 0x93, 0xb4, 0xf3, 0xb7, 0x97, + 0xeb, 0xd7, 0x56, 0xb8, 0x1c, 0x61, 0xa6, 0x83, 0x85, 0xef, 0x83, 0x59, 0x97, 0x60, 0xcf, 0xb6, + 0x1a, 0x15, 0x8e, 0x1b, 0x6d, 0x0a, 0xf1, 0x55, 0x24, 0xa4, 0xf0, 0x43, 0x30, 0x67, 0x12, 0xcf, + 0xc3, 0x1a, 0x69, 0x54, 0xb9, 0xe2, 0x92, 0x50, 0x9c, 0x3b, 0x0c, 0x96, 0x51, 0x28, 0x87, 0x5f, + 0x82, 0xba, 0x81, 0x3d, 0x7a, 0xea, 0xf4, 0x30, 0x25, 0x27, 0xba, 0x49, 0x1a, 0xb3, 0xfc, 0xa8, + 0xbf, 0x3b, 0x5e, 0x96, 0x30, 0x0b, 0xe5, 0x9e, 0x40, 0xaf, 0x1f, 0xa4, 0x90, 0x50, 0x06, 0x19, + 0xf6, 0x01, 0x64, 0x2b, 0x27, 0x2e, 0xb6, 0xbc, 0xe0, 0xc8, 0x98, 0xbf, 0xb9, 0x89, 0xfd, 0xad, + 0x09, 0x7f, 0xf0, 0x20, 0x87, 0x86, 0x46, 0x78, 0x68, 0x5d, 0x48, 0xa0, 0x1e, 0x5f, 0xd8, 0x2d, + 0x54, 0xf9, 0xcf, 0xd3, 0x55, 0xfe, 0x60, 0x8a, 0xb4, 0x2d, 0xa8, 0xee, 0xdf, 0x96, 0x01, 0x8c, + 0x95, 0x90, 0x6d, 0x18, 0x5d, 0xac, 0x9e, 0xc3, 0x0d, 0x50, 0xb1, 0xb0, 0x19, 0x66, 0x6b, 0x54, + 0x4a, 0x3f, 0xc3, 0x26, 0x41, 0x5c, 0x02, 0xff, 0x20, 0x01, 0xe8, 0xf3, 0xab, 0xe8, 0xed, 0x59, + 0x96, 0x4d, 0x31, 0x3b, 0x9d, 0x30, 0xc0, 0xce, 0x14, 0x01, 0x86, 0xbe, 0xe5, 0xd3, 0x1c, 0xea, + 0x33, 0x8b, 0xba, 0x83, 0xf8, 0x96, 0xf2, 0x0a, 0x68, 0x44, 0x28, 0xf0, 0x1c, 0x00, 0x57, 0x60, + 0x9e, 0xd8, 0xa2, 0xe0, 0xc7, 0xef, 0x26, 0x61, 0x38, 0xfb, 0xb6, 0xf5, 0x4a, 0xd7, 0xe2, 0x96, + 0x85, 0x22, 0x48, 0x94, 0x80, 0x5f, 0x7b, 0x06, 0x56, 0x0b, 0xe2, 0x86, 0x77, 0x40, 0xf9, 0x9c, + 0x0c, 0x82, 0xa3, 0x44, 0xec, 0x27, 0x5c, 0x01, 0xd5, 0x3e, 0x36, 0x7c, 0x12, 0x54, 0x33, 0x0a, + 0x3e, 0x76, 0x4a, 0x8f, 0xa4, 0xd6, 0x3f, 0xaa, 0xc9, 0xcc, 0x62, 0x9d, 0x0b, 0x6e, 0xb2, 0x87, + 0xc8, 0x31, 0x74, 0x15, 0x7b, 0x1c, 0xa3, 0xaa, 0xbc, 0x13, 0x3c, 0x42, 0xc1, 0x1a, 0x8a, 0xa4, + 0xf0, 0x97, 0xa0, 0xe6, 0x11, 0x83, 0xa8, 0xd4, 0x76, 0x45, 0xf3, 0x7c, 0x30, 0x66, 0x0e, 0xe2, + 0x2e, 0x31, 0x3a, 0xc2, 0x34, 0x80, 0x0f, 0xbf, 0x50, 0x04, 0x09, 0x7f, 0x01, 0x6a, 0x94, 0x98, + 0x8e, 0x81, 0x29, 0x11, 0xa7, 0xb9, 0x55, 0x7c, 0x9a, 0x0c, 0xf6, 0xd8, 0xee, 0x9d, 0x08, 0x03, + 0xde, 0x91, 0xa3, 0x0c, 0x0f, 0x57, 0x51, 0x04, 0x08, 0x75, 0x50, 0xf3, 0x28, 0x63, 0x12, 0xda, + 0x80, 0xf7, 0xa2, 0x49, 0x9e, 0xb2, 0x64, 0x6f, 0x0e, 0x20, 0x62, 0x57, 0xe1, 0x0a, 0x8a, 0xe0, + 0xe1, 0x1e, 0x58, 0x32, 0x75, 0x0b, 0x11, 0xdc, 0x1b, 0x74, 0x88, 0x6a, 0x5b, 0x3d, 0x8f, 0x37, + 0xb5, 0xaa, 0xb2, 0x2a, 0x8c, 0x96, 0x0e, 0xd3, 0x62, 0x94, 0xd5, 0x87, 0x07, 0x60, 0x25, 0x7c, + 0xfa, 0x7f, 0xa2, 0x7b, 0xd4, 0x76, 0x07, 0x07, 0xba, 0xa9, 0x53, 0xde, 0xea, 0xaa, 0x4a, 0x63, + 0x78, 0xb9, 0xbe, 0x82, 0x46, 0xc8, 0xd1, 0x48, 0x2b, 0xd6, 0x85, 0x1d, 0xec, 0x7b, 0xa4, 0xc7, + 0x5b, 0x57, 0x2d, 0xee, 0xc2, 0xc7, 0x7c, 0x15, 0x09, 0x29, 0xd4, 0x52, 0x09, 0x5d, 0xfb, 0xef, + 0x12, 0xba, 0x5e, 0x9c, 0xcc, 0xf0, 0x14, 0xac, 0x3a, 0xae, 0xad, 0xb9, 0xc4, 0xf3, 0x9e, 0x12, + 0xdc, 0x33, 0x74, 0x8b, 0x84, 0x27, 0x35, 0xcf, 0x77, 0xf8, 0xde, 0xf0, 0x72, 0x7d, 0xf5, 0x78, + 0xb4, 0x0a, 0x2a, 0xb2, 0x6d, 0xfd, 0xbd, 0x02, 0xee, 0x64, 0xdf, 0x51, 0xf8, 0x53, 0x00, 0xed, + 0xae, 0x47, 0xdc, 0x3e, 0xe9, 0x7d, 0x1a, 0x90, 0x49, 0xc6, 0xb8, 0x24, 0xce, 0xb8, 0xa2, 0x8a, + 0x3f, 0xca, 0x69, 0xa0, 0x11, 0x56, 0x01, 0x67, 0x13, 0xa5, 0x52, 0xe2, 0x81, 0x26, 0x38, 0x5b, + 0xae, 0x5c, 0xf6, 0xc0, 0x92, 0xe8, 0x1a, 0xa1, 0x90, 0xa7, 0x75, 0x22, 0x0f, 0x4e, 0xd3, 0x62, + 0x94, 0xd5, 0x87, 0x9f, 0x82, 0xbb, 0xb8, 0x8f, 0x75, 0x03, 0x77, 0x0d, 0x12, 0x81, 0x54, 0x38, + 0xc8, 0xbb, 0x02, 0xe4, 0xee, 0x5e, 0x56, 0x01, 0xe5, 0x6d, 0xe0, 0x21, 0x58, 0xf6, 0xad, 0x3c, + 0x54, 0x90, 0x97, 0xef, 0x09, 0xa8, 0xe5, 0xd3, 0xbc, 0x0a, 0x1a, 0x65, 0x07, 0x1d, 0x00, 0xd4, + 0xf0, 0xc9, 0xf7, 0x1a, 0xb3, 0xbc, 0x27, 0xff, 0x70, 0x8a, 0x7a, 0x8a, 0x78, 0x43, 0xdc, 0xff, + 0xa2, 0x25, 0x0f, 0x25, 0x7c, 0xc0, 0x5d, 0xb0, 0xe8, 0xb2, 0x0a, 0x89, 0x42, 0x9f, 0xe3, 0xa1, + 0x7f, 0x4b, 0x98, 0x2d, 0xa2, 0xa4, 0x10, 0xa5, 0x75, 0xe1, 0x0e, 0xa8, 0xab, 0xb6, 0x61, 0xf0, + 0xca, 0xd8, 0xb7, 0x7d, 0x8b, 0xf2, 0xe4, 0x2e, 0x2b, 0x90, 0x71, 0x80, 0xfd, 0x94, 0x04, 0x65, + 0x34, 0x5b, 0x7f, 0x95, 0x92, 0x0f, 0x58, 0x58, 0xee, 0x70, 0x27, 0x45, 0xb7, 0xde, 0xcf, 0xd0, + 0xad, 0x7b, 0x79, 0x8b, 0x04, 0xdb, 0x1a, 0x80, 0x45, 0x56, 0x0c, 0xba, 0xa5, 0x05, 0x09, 0x20, + 0x9a, 0xe9, 0x8f, 0x26, 0x2a, 0xb5, 0xc8, 0x3a, 0xf1, 0x04, 0xdf, 0xe5, 0x27, 0x91, 0x14, 0xa2, + 0xb4, 0xa7, 0xd6, 0x13, 0x50, 0x4f, 0xd7, 0x69, 0x6a, 0x0e, 0x91, 0x6e, 0x9c, 0x43, 0xde, 0x48, + 0x60, 0xb5, 0xc0, 0x3b, 0x34, 0x40, 0xdd, 0xc4, 0xaf, 0x13, 0x39, 0x74, 0x23, 0x7f, 0x67, 0x23, + 0xa5, 0x1c, 0x8c, 0x94, 0xf2, 0x73, 0x8b, 0x1e, 0xb9, 0x1d, 0xea, 0xea, 0x96, 0x16, 0xdc, 0xcb, + 0x61, 0x0a, 0x0b, 0x65, 0xb0, 0xe1, 0x4b, 0x50, 0x33, 0xf1, 0xeb, 0x8e, 0xef, 0x6a, 0xe1, 0xf9, + 0x4d, 0xee, 0x87, 0xbf, 0x44, 0x87, 0x02, 0x05, 0x45, 0x78, 0xad, 0x23, 0xb0, 0x91, 0xda, 0x24, + 0x6b, 0x25, 0xe4, 0x95, 0x6f, 0x74, 0x48, 0x9c, 0x00, 0xdf, 0x03, 0xf3, 0x0e, 0x76, 0xa9, 0x1e, + 0xb5, 0x93, 0xaa, 0xb2, 0x38, 0xbc, 0x5c, 0x9f, 0x3f, 0x0e, 0x17, 0x51, 0x2c, 0x6f, 0xfd, 0xbe, + 0x04, 0xaa, 0x1d, 0x15, 0x1b, 0xe4, 0x16, 0xc6, 0x9b, 0x93, 0xd4, 0x78, 0xb3, 0x3d, 0x76, 0x52, + 0xf1, 0xf8, 0x0a, 0x27, 0x9b, 0xcf, 0x33, 0x93, 0xcd, 0xc3, 0x09, 0x71, 0xaf, 0x1f, 0x6a, 0x1e, + 0x83, 0xf9, 0xc8, 0x7d, 0xaa, 0xcb, 0x4a, 0x37, 0x75, 0xd9, 0xd6, 0x1f, 0x4b, 0x60, 0x21, 0xe1, + 0x62, 0x32, 0x6b, 0xe8, 0xa4, 0x28, 0x0d, 0x6b, 0x63, 0xca, 0x34, 0x1b, 0x93, 0x43, 0x3a, 0x13, + 0x30, 0xc9, 0x98, 0x1d, 0xe4, 0x59, 0xce, 0x13, 0x50, 0xa7, 0xd8, 0xd5, 0x08, 0x0d, 0x65, 0xfc, + 0x40, 0xe7, 0xe3, 0x99, 0xe4, 0x24, 0x25, 0x45, 0x19, 0xed, 0xb5, 0x5d, 0xb0, 0x98, 0x72, 0x36, + 0x11, 0xfd, 0xfb, 0x33, 0x3b, 0xac, 0x38, 0x99, 0x6f, 0x21, 0x1b, 0x5f, 0xa6, 0xb2, 0xf1, 0xd1, + 0xf8, 0x87, 0x9b, 0x28, 0xb9, 0xa2, 0x9c, 0xec, 0x66, 0x72, 0x72, 0x67, 0x2a, 0xf4, 0xeb, 0x33, + 0xf3, 0x2f, 0x12, 0x58, 0x4a, 0x68, 0xdf, 0xc2, 0x2c, 0xf6, 0x59, 0x7a, 0x16, 0x7b, 0x38, 0xcd, + 0xa6, 0x0a, 0x86, 0xb1, 0x7f, 0x55, 0x53, 0x9b, 0xf9, 0x3f, 0xa2, 0xff, 0xbf, 0x91, 0xc0, 0x4a, + 0xdf, 0x36, 0x7c, 0x93, 0xec, 0x1b, 0x58, 0x37, 0x43, 0x0d, 0x46, 0xa6, 0x6e, 0x18, 0x78, 0xb9, + 0x27, 0xe2, 0x7a, 0xba, 0x47, 0x89, 0x45, 0x5f, 0xc4, 0x18, 0xca, 0xb7, 0x85, 0xbf, 0x95, 0x17, + 0x23, 0x80, 0xd1, 0x48, 0x77, 0xf0, 0x07, 0x60, 0x81, 0xb1, 0x4a, 0x5d, 0x25, 0x6c, 0xd4, 0x15, + 0x7f, 0x76, 0x2c, 0x0b, 0xa0, 0x85, 0x4e, 0x2c, 0x42, 0x49, 0x3d, 0x78, 0x06, 0x96, 0x1d, 0xbb, + 0x77, 0x88, 0x2d, 0xac, 0x11, 0xf6, 0xd6, 0x1e, 0xf3, 0x7f, 0x49, 0xf9, 0x38, 0x30, 0xaf, 0x7c, + 0x1c, 0xd2, 0xb7, 0xe3, 0xbc, 0xca, 0x5b, 0xc6, 0xa3, 0xf3, 0xcb, 0x9c, 0x8c, 0x8c, 0x82, 0x84, + 0x5f, 0x49, 0xa0, 0xee, 0x8b, 0x47, 0x4f, 0x8c, 0x4b, 0xc1, 0xff, 0x1d, 0xca, 0x34, 0x79, 0x78, + 0x9a, 0x42, 0x8a, 0x7b, 0x5c, 0x7a, 0x1d, 0x65, 0x3c, 0x16, 0x8e, 0x3f, 0xb5, 0x69, 0xc6, 0x9f, + 0xd6, 0xdf, 0xca, 0xe0, 0x6e, 0xae, 0xe0, 0xe1, 0x8f, 0xaf, 0x99, 0x0b, 0xee, 0xfd, 0xcf, 0x66, + 0x82, 0x1c, 0x8d, 0x2d, 0x4f, 0x40, 0x63, 0xf7, 0xc0, 0x92, 0xea, 0xbb, 0x2e, 0xb1, 0x68, 0x66, + 0x16, 0x88, 0x06, 0x8a, 0xfd, 0xb4, 0x18, 0x65, 0xf5, 0x47, 0xcd, 0x24, 0xd5, 0x09, 0x67, 0x92, + 0x64, 0x14, 0x82, 0x37, 0x06, 0x79, 0x98, 0x8f, 0x42, 0xd0, 0xc7, 0xac, 0x3e, 0x7b, 0x03, 0x03, + 0xd4, 0x08, 0x61, 0x2e, 0xfd, 0x06, 0x9e, 0xa6, 0xa4, 0x28, 0xa3, 0xcd, 0x58, 0xe8, 0xbb, 0x85, + 0x59, 0x06, 0xf7, 0x52, 0xd4, 0x7c, 0x2b, 0x43, 0xcd, 0xbf, 0x53, 0x68, 0x98, 0x60, 0xe8, 0x5f, + 0x49, 0xa3, 0x29, 0xfa, 0xf3, 0xe9, 0x28, 0xfa, 0x08, 0xfe, 0x78, 0x33, 0x57, 0x57, 0x3e, 0xbc, + 0xb8, 0x6a, 0xce, 0x7c, 0x7d, 0xd5, 0x9c, 0xf9, 0xe6, 0xaa, 0x39, 0xf3, 0xeb, 0x61, 0x53, 0xba, + 0x18, 0x36, 0xa5, 0xaf, 0x87, 0x4d, 0xe9, 0x9f, 0xc3, 0xa6, 0xf4, 0xbb, 0x37, 0xcd, 0x99, 0x97, + 0x73, 0xc2, 0xdb, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xf4, 0x2b, 0x6c, 0xd0, 0xe5, 0x1a, 0x00, + 0x00, } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.proto b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.proto index f0f2aa4b..b67e2718 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.proto +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/generated.proto @@ -224,14 +224,6 @@ message DeploymentStrategy { optional RollingUpdateDeployment rollingUpdate = 2; } -// PartitionStatefulSetStrategy contains the parameters used with the -// PartitionStatefulSetStrategyType. -message PartitionStatefulSetStrategy { - // Ordinal indicates the ordinal at which the StatefulSet should be - // partitioned. - optional int32 ordinal = 1; -} - message RollbackConfig { // The revision to rollback to. If set to 0, rollback to the last revision. // +optional @@ -268,6 +260,13 @@ message RollingUpdateDeployment { optional k8s.io.apimachinery.pkg.util.intstr.IntOrString maxSurge = 2; } +// RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType. +message RollingUpdateStatefulSetStrategy { + // Partition indicates the ordinal at which the StatefulSet should be + // partitioned. + optional int32 partition = 1; +} + // Scale represents a scaling request for a resource. message Scale { // Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata. @@ -436,10 +435,7 @@ message StatefulSetUpdateStrategy { // Type indicates the type of the StatefulSetUpdateStrategy. optional string type = 1; - // Partition is used to communicate the ordinal at which to partition - // the StatefulSet when Type is PartitionStatefulSetStrategyType. This - // value must be set when Type is PartitionStatefulSetStrategyType, - // and it must be nil otherwise. - optional PartitionStatefulSetStrategy partition = 2; + // RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType. + optional RollingUpdateStatefulSetStrategy rollingUpdate = 2; } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.generated.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.generated.go index f7ad6024..df1323eb 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.generated.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.generated.go @@ -1386,7 +1386,7 @@ func (x *StatefulSetUpdateStrategy) CodecEncodeSelf(e *codec1978.Encoder) { _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.Type != "" - yyq2[1] = x.Partition != nil + yyq2[1] = x.RollingUpdate != nil var yynn2 int if yyr2 || yy2arr2 { r.EncodeArrayStart(2) @@ -1418,10 +1418,10 @@ func (x *StatefulSetUpdateStrategy) CodecEncodeSelf(e *codec1978.Encoder) { if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) if yyq2[1] { - if x.Partition == nil { + if x.RollingUpdate == nil { r.EncodeNil() } else { - x.Partition.CodecEncodeSelf(e) + x.RollingUpdate.CodecEncodeSelf(e) } } else { r.EncodeNil() @@ -1429,12 +1429,12 @@ func (x *StatefulSetUpdateStrategy) CodecEncodeSelf(e *codec1978.Encoder) { } else { if yyq2[1] { z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("partition")) + r.EncodeString(codecSelferC_UTF81234, string("rollingUpdate")) z.EncSendContainerState(codecSelfer_containerMapValue1234) - if x.Partition == nil { + if x.RollingUpdate == nil { r.EncodeNil() } else { - x.Partition.CodecEncodeSelf(e) + x.RollingUpdate.CodecEncodeSelf(e) } } } @@ -1506,16 +1506,16 @@ func (x *StatefulSetUpdateStrategy) codecDecodeSelfFromMap(l int, d *codec1978.D yyv4 := &x.Type yyv4.CodecDecodeSelf(d) } - case "partition": + case "rollingUpdate": if r.TryDecodeAsNil() { - if x.Partition != nil { - x.Partition = nil + if x.RollingUpdate != nil { + x.RollingUpdate = nil } } else { - if x.Partition == nil { - x.Partition = new(PartitionStatefulSetStrategy) + if x.RollingUpdate == nil { + x.RollingUpdate = new(RollingUpdateStatefulSetStrategy) } - x.Partition.CodecDecodeSelf(d) + x.RollingUpdate.CodecDecodeSelf(d) } default: z.DecStructFieldNotFound(-1, yys3) @@ -1560,14 +1560,14 @@ func (x *StatefulSetUpdateStrategy) codecDecodeSelfFromArray(l int, d *codec1978 } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - if x.Partition != nil { - x.Partition = nil + if x.RollingUpdate != nil { + x.RollingUpdate = nil } } else { - if x.Partition == nil { - x.Partition = new(PartitionStatefulSetStrategy) + if x.RollingUpdate == nil { + x.RollingUpdate = new(RollingUpdateStatefulSetStrategy) } - x.Partition.CodecDecodeSelf(d) + x.RollingUpdate.CodecDecodeSelf(d) } for { yyj6++ @@ -1611,7 +1611,7 @@ func (x *StatefulSetUpdateStrategyType) CodecDecodeSelf(d *codec1978.Decoder) { } } -func (x *PartitionStatefulSetStrategy) CodecEncodeSelf(e *codec1978.Encoder) { +func (x *RollingUpdateStatefulSetStrategy) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) _, _, _ = h, z, r @@ -1628,11 +1628,12 @@ func (x *PartitionStatefulSetStrategy) CodecEncodeSelf(e *codec1978.Encoder) { var yyq2 [1]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false + yyq2[0] = x.Partition != nil var yynn2 int if yyr2 || yy2arr2 { r.EncodeArrayStart(1) } else { - yynn2 = 1 + yynn2 = 0 for _, b := range yyq2 { if b { yynn2++ @@ -1643,21 +1644,37 @@ func (x *PartitionStatefulSetStrategy) CodecEncodeSelf(e *codec1978.Encoder) { } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayElem1234) - yym4 := z.EncBinary() - _ = yym4 - if false { + if yyq2[0] { + if x.Partition == nil { + r.EncodeNil() + } else { + yy4 := *x.Partition + yym5 := z.EncBinary() + _ = yym5 + if false { + } else { + r.EncodeInt(int64(yy4)) + } + } } else { - r.EncodeInt(int64(x.Ordinal)) + r.EncodeNil() } } else { - z.EncSendContainerState(codecSelfer_containerMapKey1234) - r.EncodeString(codecSelferC_UTF81234, string("ordinal")) - z.EncSendContainerState(codecSelfer_containerMapValue1234) - yym5 := z.EncBinary() - _ = yym5 - if false { - } else { - r.EncodeInt(int64(x.Ordinal)) + if yyq2[0] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("partition")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Partition == nil { + r.EncodeNil() + } else { + yy6 := *x.Partition + yym7 := z.EncBinary() + _ = yym7 + if false { + } else { + r.EncodeInt(int64(yy6)) + } + } } } if yyr2 || yy2arr2 { @@ -1669,7 +1686,7 @@ func (x *PartitionStatefulSetStrategy) CodecEncodeSelf(e *codec1978.Encoder) { } } -func (x *PartitionStatefulSetStrategy) CodecDecodeSelf(d *codec1978.Decoder) { +func (x *RollingUpdateStatefulSetStrategy) CodecDecodeSelf(d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r @@ -1699,7 +1716,7 @@ func (x *PartitionStatefulSetStrategy) CodecDecodeSelf(d *codec1978.Decoder) { } } -func (x *PartitionStatefulSetStrategy) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { +func (x *RollingUpdateStatefulSetStrategy) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r @@ -1721,16 +1738,20 @@ func (x *PartitionStatefulSetStrategy) codecDecodeSelfFromMap(l int, d *codec197 yys3 := string(yys3Slc) z.DecSendContainerState(codecSelfer_containerMapValue1234) switch yys3 { - case "ordinal": + case "partition": if r.TryDecodeAsNil() { - x.Ordinal = 0 + if x.Partition != nil { + x.Partition = nil + } } else { - yyv4 := &x.Ordinal + if x.Partition == nil { + x.Partition = new(int32) + } yym5 := z.DecBinary() _ = yym5 if false { } else { - *((*int32)(yyv4)) = int32(r.DecodeInt(32)) + *((*int32)(x.Partition)) = int32(r.DecodeInt(32)) } } default: @@ -1740,7 +1761,7 @@ func (x *PartitionStatefulSetStrategy) codecDecodeSelfFromMap(l int, d *codec197 z.DecSendContainerState(codecSelfer_containerMapEnd1234) } -func (x *PartitionStatefulSetStrategy) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { +func (x *RollingUpdateStatefulSetStrategy) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r @@ -1759,14 +1780,18 @@ func (x *PartitionStatefulSetStrategy) codecDecodeSelfFromArray(l int, d *codec1 } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.Ordinal = 0 + if x.Partition != nil { + x.Partition = nil + } } else { - yyv7 := &x.Ordinal + if x.Partition == nil { + x.Partition = new(int32) + } yym8 := z.DecBinary() _ = yym8 if false { } else { - *((*int32)(yyv7)) = int32(r.DecodeInt(32)) + *((*int32)(x.Partition)) = int32(r.DecodeInt(32)) } } for { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.go index a8a73193..c0ad09ae 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types.go @@ -118,11 +118,8 @@ const ( type StatefulSetUpdateStrategy struct { // Type indicates the type of the StatefulSetUpdateStrategy. Type StatefulSetUpdateStrategyType `json:"type,omitempty" protobuf:"bytes,1,opt,name=type,casttype=StatefulSetStrategyType"` - // Partition is used to communicate the ordinal at which to partition - // the StatefulSet when Type is PartitionStatefulSetStrategyType. This - // value must be set when Type is PartitionStatefulSetStrategyType, - // and it must be nil otherwise. - Partition *PartitionStatefulSetStrategy `json:"partition,omitempty" protobuf:"bytes,2,opt,name=partition"` + // RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType. + RollingUpdate *RollingUpdateStatefulSetStrategy `json:"rollingUpdate,omitempty" protobuf:"bytes,2,opt,name=rollingUpdate"` } // StatefulSetUpdateStrategyType is a string enumeration type that enumerates @@ -130,14 +127,6 @@ type StatefulSetUpdateStrategy struct { type StatefulSetUpdateStrategyType string const ( - // PartitionStatefulSetStrategyType indicates that updates will only be - // applied to a partition of the StatefulSet. This is useful for canaries - // and phased roll outs. When a scale operation is performed with this - // strategy, new Pods will be created from the specification version indicated - // by the StatefulSet's currentRevision if there ordinal is less than the supplied - // Partition's ordinal. Otherwise, they will be created from the specification - // version indicated by the StatefulSet's updateRevision. - PartitionStatefulSetStrategyType StatefulSetUpdateStrategyType = "Partition" // RollingUpdateStatefulSetStrategyType indicates that update will be // applied to all Pods in the StatefulSet with respect to the StatefulSet // ordering constraints. When a scale operation is performed with this @@ -152,12 +141,11 @@ const ( OnDeleteStatefulSetStrategyType = "OnDelete" ) -// PartitionStatefulSetStrategy contains the parameters used with the -// PartitionStatefulSetStrategyType. -type PartitionStatefulSetStrategy struct { - // Ordinal indicates the ordinal at which the StatefulSet should be +// RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType. +type RollingUpdateStatefulSetStrategy struct { + // Partition indicates the ordinal at which the StatefulSet should be // partitioned. - Ordinal int32 `json:"ordinal" protobuf:"varint,1,opt,name=ordinal"` + Partition *int32 `json:"partition,omitempty" protobuf:"varint,1,opt,name=partition"` } // A StatefulSetSpec is the specification of a StatefulSet. diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go index e5b40330..00d1a617 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go @@ -137,15 +137,6 @@ func (DeploymentStrategy) SwaggerDoc() map[string]string { return map_DeploymentStrategy } -var map_PartitionStatefulSetStrategy = map[string]string{ - "": "PartitionStatefulSetStrategy contains the parameters used with the PartitionStatefulSetStrategyType.", - "ordinal": "Ordinal indicates the ordinal at which the StatefulSet should be partitioned.", -} - -func (PartitionStatefulSetStrategy) SwaggerDoc() map[string]string { - return map_PartitionStatefulSetStrategy -} - var map_RollbackConfig = map[string]string{ "revision": "The revision to rollback to. If set to 0, rollback to the last revision.", } @@ -164,6 +155,15 @@ func (RollingUpdateDeployment) SwaggerDoc() map[string]string { return map_RollingUpdateDeployment } +var map_RollingUpdateStatefulSetStrategy = map[string]string{ + "": "RollingUpdateStatefulSetStrategy is used to communicate parameter for RollingUpdateStatefulSetStrategyType.", + "partition": "Partition indicates the ordinal at which the StatefulSet should be partitioned.", +} + +func (RollingUpdateStatefulSetStrategy) SwaggerDoc() map[string]string { + return map_RollingUpdateStatefulSetStrategy +} + var map_Scale = map[string]string{ "": "Scale represents a scaling request for a resource.", "metadata": "Standard object metadata; More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata.", @@ -245,9 +245,9 @@ func (StatefulSetStatus) SwaggerDoc() map[string]string { } var map_StatefulSetUpdateStrategy = map[string]string{ - "": "StatefulSetUpdateStrategy indicates the strategy that the StatefulSet controller will use to perform updates. It includes any additional parameters necessary to perform the update for the indicated strategy.", - "type": "Type indicates the type of the StatefulSetUpdateStrategy.", - "partition": "Partition is used to communicate the ordinal at which to partition the StatefulSet when Type is PartitionStatefulSetStrategyType. This value must be set when Type is PartitionStatefulSetStrategyType, and it must be nil otherwise.", + "": "StatefulSetUpdateStrategy indicates the strategy that the StatefulSet controller will use to perform updates. It includes any additional parameters necessary to perform the update for the indicated strategy.", + "type": "Type indicates the type of the StatefulSetUpdateStrategy.", + "rollingUpdate": "RollingUpdate is used to communicate parameters when Type is RollingUpdateStatefulSetStrategyType.", } func (StatefulSetUpdateStrategy) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.conversion.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.conversion.go index f1975cc4..32ff4831 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.conversion.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.conversion.go @@ -42,8 +42,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_apps_ControllerRevision_To_v1beta1_ControllerRevision, Convert_v1beta1_ControllerRevisionList_To_apps_ControllerRevisionList, Convert_apps_ControllerRevisionList_To_v1beta1_ControllerRevisionList, - Convert_v1beta1_PartitionStatefulSetStrategy_To_apps_PartitionStatefulSetStrategy, - Convert_apps_PartitionStatefulSetStrategy_To_v1beta1_PartitionStatefulSetStrategy, + Convert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy, + Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy, Convert_v1beta1_StatefulSet_To_apps_StatefulSet, Convert_apps_StatefulSet_To_v1beta1_StatefulSet, Convert_v1beta1_StatefulSetList_To_apps_StatefulSetList, @@ -127,24 +127,28 @@ func Convert_apps_ControllerRevisionList_To_v1beta1_ControllerRevisionList(in *a return autoConvert_apps_ControllerRevisionList_To_v1beta1_ControllerRevisionList(in, out, s) } -func autoConvert_v1beta1_PartitionStatefulSetStrategy_To_apps_PartitionStatefulSetStrategy(in *PartitionStatefulSetStrategy, out *apps.PartitionStatefulSetStrategy, s conversion.Scope) error { - out.Ordinal = in.Ordinal +func autoConvert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy(in *RollingUpdateStatefulSetStrategy, out *apps.RollingUpdateStatefulSetStrategy, s conversion.Scope) error { + if err := v1.Convert_Pointer_int32_To_int32(&in.Partition, &out.Partition, s); err != nil { + return err + } return nil } -// Convert_v1beta1_PartitionStatefulSetStrategy_To_apps_PartitionStatefulSetStrategy is an autogenerated conversion function. -func Convert_v1beta1_PartitionStatefulSetStrategy_To_apps_PartitionStatefulSetStrategy(in *PartitionStatefulSetStrategy, out *apps.PartitionStatefulSetStrategy, s conversion.Scope) error { - return autoConvert_v1beta1_PartitionStatefulSetStrategy_To_apps_PartitionStatefulSetStrategy(in, out, s) +// Convert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy is an autogenerated conversion function. +func Convert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy(in *RollingUpdateStatefulSetStrategy, out *apps.RollingUpdateStatefulSetStrategy, s conversion.Scope) error { + return autoConvert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy(in, out, s) } -func autoConvert_apps_PartitionStatefulSetStrategy_To_v1beta1_PartitionStatefulSetStrategy(in *apps.PartitionStatefulSetStrategy, out *PartitionStatefulSetStrategy, s conversion.Scope) error { - out.Ordinal = in.Ordinal +func autoConvert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy(in *apps.RollingUpdateStatefulSetStrategy, out *RollingUpdateStatefulSetStrategy, s conversion.Scope) error { + if err := v1.Convert_int32_To_Pointer_int32(&in.Partition, &out.Partition, s); err != nil { + return err + } return nil } -// Convert_apps_PartitionStatefulSetStrategy_To_v1beta1_PartitionStatefulSetStrategy is an autogenerated conversion function. -func Convert_apps_PartitionStatefulSetStrategy_To_v1beta1_PartitionStatefulSetStrategy(in *apps.PartitionStatefulSetStrategy, out *PartitionStatefulSetStrategy, s conversion.Scope) error { - return autoConvert_apps_PartitionStatefulSetStrategy_To_v1beta1_PartitionStatefulSetStrategy(in, out, s) +// Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy is an autogenerated conversion function. +func Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy(in *apps.RollingUpdateStatefulSetStrategy, out *RollingUpdateStatefulSetStrategy, s conversion.Scope) error { + return autoConvert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy(in, out, s) } func autoConvert_v1beta1_StatefulSet_To_apps_StatefulSet(in *StatefulSet, out *apps.StatefulSet, s conversion.Scope) error { @@ -291,12 +295,28 @@ func Convert_apps_StatefulSetStatus_To_v1beta1_StatefulSetStatus(in *apps.Statef func autoConvert_v1beta1_StatefulSetUpdateStrategy_To_apps_StatefulSetUpdateStrategy(in *StatefulSetUpdateStrategy, out *apps.StatefulSetUpdateStrategy, s conversion.Scope) error { out.Type = apps.StatefulSetUpdateStrategyType(in.Type) - out.Partition = (*apps.PartitionStatefulSetStrategy)(unsafe.Pointer(in.Partition)) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(apps.RollingUpdateStatefulSetStrategy) + if err := Convert_v1beta1_RollingUpdateStatefulSetStrategy_To_apps_RollingUpdateStatefulSetStrategy(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } return nil } func autoConvert_apps_StatefulSetUpdateStrategy_To_v1beta1_StatefulSetUpdateStrategy(in *apps.StatefulSetUpdateStrategy, out *StatefulSetUpdateStrategy, s conversion.Scope) error { out.Type = StatefulSetUpdateStrategyType(in.Type) - out.Partition = (*PartitionStatefulSetStrategy)(unsafe.Pointer(in.Partition)) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(RollingUpdateStatefulSetStrategy) + if err := Convert_apps_RollingUpdateStatefulSetStrategy_To_v1beta1_RollingUpdateStatefulSetStrategy(*in, *out, s); err != nil { + return err + } + } else { + out.RollingUpdate = nil + } return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go index abf7ccfe..42736c1c 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go @@ -46,9 +46,9 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_DeploymentSpec, InType: reflect.TypeOf(&DeploymentSpec{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_DeploymentStatus, InType: reflect.TypeOf(&DeploymentStatus{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_DeploymentStrategy, InType: reflect.TypeOf(&DeploymentStrategy{})}, - conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_PartitionStatefulSetStrategy, InType: reflect.TypeOf(&PartitionStatefulSetStrategy{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_RollbackConfig, InType: reflect.TypeOf(&RollbackConfig{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_RollingUpdateDeployment, InType: reflect.TypeOf(&RollingUpdateDeployment{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_RollingUpdateStatefulSetStrategy, InType: reflect.TypeOf(&RollingUpdateStatefulSetStrategy{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_Scale, InType: reflect.TypeOf(&Scale{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_ScaleSpec, InType: reflect.TypeOf(&ScaleSpec{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_v1beta1_ScaleStatus, InType: reflect.TypeOf(&ScaleStatus{})}, @@ -253,16 +253,6 @@ func DeepCopy_v1beta1_DeploymentStrategy(in interface{}, out interface{}, c *con } } -// DeepCopy_v1beta1_PartitionStatefulSetStrategy is an autogenerated deepcopy function. -func DeepCopy_v1beta1_PartitionStatefulSetStrategy(in interface{}, out interface{}, c *conversion.Cloner) error { - { - in := in.(*PartitionStatefulSetStrategy) - out := out.(*PartitionStatefulSetStrategy) - *out = *in - return nil - } -} - // DeepCopy_v1beta1_RollbackConfig is an autogenerated deepcopy function. func DeepCopy_v1beta1_RollbackConfig(in interface{}, out interface{}, c *conversion.Cloner) error { { @@ -293,6 +283,21 @@ func DeepCopy_v1beta1_RollingUpdateDeployment(in interface{}, out interface{}, c } } +// DeepCopy_v1beta1_RollingUpdateStatefulSetStrategy is an autogenerated deepcopy function. +func DeepCopy_v1beta1_RollingUpdateStatefulSetStrategy(in interface{}, out interface{}, c *conversion.Cloner) error { + { + in := in.(*RollingUpdateStatefulSetStrategy) + out := out.(*RollingUpdateStatefulSetStrategy) + *out = *in + if in.Partition != nil { + in, out := &in.Partition, &out.Partition + *out = new(int32) + **out = **in + } + return nil + } +} + // DeepCopy_v1beta1_Scale is an autogenerated deepcopy function. func DeepCopy_v1beta1_Scale(in interface{}, out interface{}, c *conversion.Cloner) error { { @@ -442,10 +447,12 @@ func DeepCopy_v1beta1_StatefulSetUpdateStrategy(in interface{}, out interface{}, in := in.(*StatefulSetUpdateStrategy) out := out.(*StatefulSetUpdateStrategy) *out = *in - if in.Partition != nil { - in, out := &in.Partition, &out.Partition - *out = new(PartitionStatefulSetStrategy) - **out = **in + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(RollingUpdateStatefulSetStrategy) + if err := DeepCopy_v1beta1_RollingUpdateStatefulSetStrategy(*in, *out, c); err != nil { + return err + } } return nil } diff --git a/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go b/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go index 763b4b15..cfad33e0 100644 --- a/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go +++ b/vendor/k8s.io/kubernetes/pkg/apis/apps/zz_generated.deepcopy.go @@ -38,7 +38,7 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { return scheme.AddGeneratedDeepCopyFuncs( conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_apps_ControllerRevision, InType: reflect.TypeOf(&ControllerRevision{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_apps_ControllerRevisionList, InType: reflect.TypeOf(&ControllerRevisionList{})}, - conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_apps_PartitionStatefulSetStrategy, InType: reflect.TypeOf(&PartitionStatefulSetStrategy{})}, + conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_apps_RollingUpdateStatefulSetStrategy, InType: reflect.TypeOf(&RollingUpdateStatefulSetStrategy{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_apps_StatefulSet, InType: reflect.TypeOf(&StatefulSet{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_apps_StatefulSetList, InType: reflect.TypeOf(&StatefulSetList{})}, conversion.GeneratedDeepCopyFunc{Fn: DeepCopy_apps_StatefulSetSpec, InType: reflect.TypeOf(&StatefulSetSpec{})}, @@ -89,11 +89,11 @@ func DeepCopy_apps_ControllerRevisionList(in interface{}, out interface{}, c *co } } -// DeepCopy_apps_PartitionStatefulSetStrategy is an autogenerated deepcopy function. -func DeepCopy_apps_PartitionStatefulSetStrategy(in interface{}, out interface{}, c *conversion.Cloner) error { +// DeepCopy_apps_RollingUpdateStatefulSetStrategy is an autogenerated deepcopy function. +func DeepCopy_apps_RollingUpdateStatefulSetStrategy(in interface{}, out interface{}, c *conversion.Cloner) error { { - in := in.(*PartitionStatefulSetStrategy) - out := out.(*PartitionStatefulSetStrategy) + in := in.(*RollingUpdateStatefulSetStrategy) + out := out.(*RollingUpdateStatefulSetStrategy) *out = *in return nil } @@ -198,9 +198,9 @@ func DeepCopy_apps_StatefulSetUpdateStrategy(in interface{}, out interface{}, c in := in.(*StatefulSetUpdateStrategy) out := out.(*StatefulSetUpdateStrategy) *out = *in - if in.Partition != nil { - in, out := &in.Partition, &out.Partition - *out = new(PartitionStatefulSetStrategy) + if in.RollingUpdate != nil { + in, out := &in.RollingUpdate, &out.RollingUpdate + *out = new(RollingUpdateStatefulSetStrategy) **out = **in } return nil diff --git a/vendor/k8s.io/kubernetes/pkg/controller/BUILD b/vendor/k8s.io/kubernetes/pkg/controller/BUILD index beafe906..3f77ff75 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/BUILD +++ b/vendor/k8s.io/kubernetes/pkg/controller/BUILD @@ -25,6 +25,7 @@ go_library( "//pkg/api/v1/pod:go_default_library", "//pkg/api/v1/ref:go_default_library", "//pkg/api/validation:go_default_library", + "//pkg/apis/apps/v1beta1:go_default_library", "//pkg/apis/authentication/v1:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/client/clientset_generated/clientset:go_default_library", diff --git a/vendor/k8s.io/kubernetes/pkg/controller/controller_ref_manager.go b/vendor/k8s.io/kubernetes/pkg/controller/controller_ref_manager.go index 507995c0..96b546f6 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/controller_ref_manager.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/controller_ref_manager.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/kubernetes/pkg/api/v1" + appsv1beta1 "k8s.io/kubernetes/pkg/apis/apps/v1beta1" extensions "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" ) @@ -394,3 +395,121 @@ func RecheckDeletionTimestamp(getObject func() (metav1.Object, error)) func() er return nil } } + +// ControllerRevisionControllerRefManager is used to manage controllerRef of ControllerRevisions. +// Three methods are defined on this object 1: Classify 2: AdoptControllerRevision and +// 3: ReleaseControllerRevision which are used to classify the ControllerRevisions into appropriate +// categories and accordingly adopt or release them. See comments on these functions +// for more details. +type ControllerRevisionControllerRefManager struct { + baseControllerRefManager + controllerKind schema.GroupVersionKind + crControl ControllerRevisionControlInterface +} + +// NewControllerRevisionControllerRefManager returns a ControllerRevisionControllerRefManager that exposes +// methods to manage the controllerRef of ControllerRevisions. +// +// The canAdopt() function can be used to perform a potentially expensive check +// (such as a live GET from the API server) prior to the first adoption. +// It will only be called (at most once) if an adoption is actually attempted. +// If canAdopt() returns a non-nil error, all adoptions will fail. +// +// NOTE: Once canAdopt() is called, it will not be called again by the same +// ControllerRevisionControllerRefManager instance. Create a new instance if it +// makes sense to check canAdopt() again (e.g. in a different sync pass). +func NewControllerRevisionControllerRefManager( + crControl ControllerRevisionControlInterface, + controller metav1.Object, + selector labels.Selector, + controllerKind schema.GroupVersionKind, + canAdopt func() error, +) *ControllerRevisionControllerRefManager { + return &ControllerRevisionControllerRefManager{ + baseControllerRefManager: baseControllerRefManager{ + controller: controller, + selector: selector, + canAdoptFunc: canAdopt, + }, + controllerKind: controllerKind, + crControl: crControl, + } +} + +// ClaimControllerRevisions tries to take ownership of a list of ControllerRevisions. +// +// It will reconcile the following: +// * Adopt orphans if the selector matches. +// * Release owned objects if the selector no longer matches. +// +// A non-nil error is returned if some form of reconciliation was attemped and +// failed. Usually, controllers should try again later in case reconciliation +// is still needed. +// +// If the error is nil, either the reconciliation succeeded, or no +// reconciliation was necessary. The list of ControllerRevisions that you now own is +// returned. +func (m *ControllerRevisionControllerRefManager) ClaimControllerRevisions(histories []*appsv1beta1.ControllerRevision) ([]*appsv1beta1.ControllerRevision, error) { + var claimed []*appsv1beta1.ControllerRevision + var errlist []error + + match := func(obj metav1.Object) bool { + return m.selector.Matches(labels.Set(obj.GetLabels())) + } + adopt := func(obj metav1.Object) error { + return m.AdoptControllerRevision(obj.(*appsv1beta1.ControllerRevision)) + } + release := func(obj metav1.Object) error { + return m.ReleaseControllerRevision(obj.(*appsv1beta1.ControllerRevision)) + } + + for _, h := range histories { + ok, err := m.claimObject(h, match, adopt, release) + if err != nil { + errlist = append(errlist, err) + continue + } + if ok { + claimed = append(claimed, h) + } + } + return claimed, utilerrors.NewAggregate(errlist) +} + +// AdoptControllerRevision sends a patch to take control of the ControllerRevision. It returns the error if +// the patching fails. +func (m *ControllerRevisionControllerRefManager) AdoptControllerRevision(history *appsv1beta1.ControllerRevision) error { + if err := m.canAdopt(); err != nil { + return fmt.Errorf("can't adopt ControllerRevision %v/%v (%v): %v", history.Namespace, history.Name, history.UID, err) + } + // Note that ValidateOwnerReferences() will reject this patch if another + // OwnerReference exists with controller=true. + addControllerPatch := fmt.Sprintf( + `{"metadata":{"ownerReferences":[{"apiVersion":"%s","kind":"%s","name":"%s","uid":"%s","controller":true,"blockOwnerDeletion":true}],"uid":"%s"}}`, + m.controllerKind.GroupVersion(), m.controllerKind.Kind, + m.controller.GetName(), m.controller.GetUID(), history.UID) + return m.crControl.PatchControllerRevision(history.Namespace, history.Name, []byte(addControllerPatch)) +} + +// ReleaseControllerRevision sends a patch to free the ControllerRevision from the control of its controller. +// It returns the error if the patching fails. 404 and 422 errors are ignored. +func (m *ControllerRevisionControllerRefManager) ReleaseControllerRevision(history *appsv1beta1.ControllerRevision) error { + glog.V(2).Infof("patching ControllerRevision %s_%s to remove its controllerRef to %s/%s:%s", + history.Namespace, history.Name, m.controllerKind.GroupVersion(), m.controllerKind.Kind, m.controller.GetName()) + deleteOwnerRefPatch := fmt.Sprintf(`{"metadata":{"ownerReferences":[{"$patch":"delete","uid":"%s"}],"uid":"%s"}}`, m.controller.GetUID(), history.UID) + err := m.crControl.PatchControllerRevision(history.Namespace, history.Name, []byte(deleteOwnerRefPatch)) + if err != nil { + if errors.IsNotFound(err) { + // If the ControllerRevision no longer exists, ignore it. + return nil + } + if errors.IsInvalid(err) { + // Invalid error will be returned in two cases: 1. the ControllerRevision + // has no owner reference, 2. the uid of the ControllerRevision doesn't + // match, which means the ControllerRevision is deleted and then recreated. + // In both cases, the error can be ignored. + return nil + } + } + return err +} diff --git a/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go b/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go index f65e697d..9f1a1776 100644 --- a/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go +++ b/vendor/k8s.io/kubernetes/pkg/controller/controller_utils.go @@ -401,6 +401,26 @@ func (r RealRSControl) PatchReplicaSet(namespace, name string, data []byte) erro return err } +// TODO: merge the controller revision interface in controller_history.go with this one +// ControllerRevisionControlInterface is an interface that knows how to patch +// ControllerRevisions, as well as increment or decrement them. It is used +// by the daemonset controller to ease testing of actions that it takes. +type ControllerRevisionControlInterface interface { + PatchControllerRevision(namespace, name string, data []byte) error +} + +// RealControllerRevisionControl is the default implementation of ControllerRevisionControlInterface. +type RealControllerRevisionControl struct { + KubeClient clientset.Interface +} + +var _ ControllerRevisionControlInterface = &RealControllerRevisionControl{} + +func (r RealControllerRevisionControl) PatchControllerRevision(namespace, name string, data []byte) error { + _, err := r.KubeClient.AppsV1beta1().ControllerRevisions(namespace).Patch(name, types.StrategicMergePatchType, data) + return err +} + // PodControlInterface is an interface that knows how to add or delete pods // created as an interface to allow testing. type PodControlInterface interface { diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go index dcaee08c..70c5bcb0 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_sandbox.go @@ -48,12 +48,32 @@ const ( runtimeName = "docker" ) +// Returns whether the sandbox network is ready, and whether the sandbox is known +func (ds *dockerService) getNetworkReady(podSandboxID string) (bool, bool) { + ds.networkReadyLock.Lock() + defer ds.networkReadyLock.Unlock() + ready, ok := ds.networkReady[podSandboxID] + return ready, ok +} + +func (ds *dockerService) setNetworkReady(podSandboxID string, ready bool) { + ds.networkReadyLock.Lock() + defer ds.networkReadyLock.Unlock() + ds.networkReady[podSandboxID] = ready +} + +func (ds *dockerService) clearNetworkReady(podSandboxID string) { + ds.networkReadyLock.Lock() + defer ds.networkReadyLock.Unlock() + delete(ds.networkReady, podSandboxID) +} + // RunPodSandbox creates and starts a pod-level sandbox. Runtimes should ensure // the sandbox is in ready state. // For docker, PodSandbox is implemented by a container holding the network // namespace for the pod. // Note: docker doesn't use LogDirectory (yet). -func (ds *dockerService) RunPodSandbox(config *runtimeapi.PodSandboxConfig) (string, error) { +func (ds *dockerService) RunPodSandbox(config *runtimeapi.PodSandboxConfig) (id string, err error) { // Step 1: Pull the image for the sandbox. image := defaultSandboxImage podSandboxImage := ds.podSandboxImage @@ -82,6 +102,15 @@ func (ds *dockerService) RunPodSandbox(config *runtimeapi.PodSandboxConfig) (str return "", fmt.Errorf("failed to create a sandbox for pod %q: %v", config.Metadata.Name, err) } + ds.setNetworkReady(createResp.ID, false) + defer func(e *error) { + // Set networking ready depending on the error return of + // the parent function + if *e == nil { + ds.setNetworkReady(createResp.ID, true) + } + }(&err) + // Step 3: Create Sandbox Checkpoint. if err = ds.checkpointHandler.CreateCheckpoint(createResp.ID, constructPodSandboxCheckpoint(config)); err != nil { return createResp.ID, err @@ -199,7 +228,10 @@ func (ds *dockerService) StopPodSandbox(podSandboxID string) error { errList := []error{} if needNetworkTearDown { cID := kubecontainer.BuildContainerID(runtimeName, podSandboxID) - if err := ds.network.TearDownPod(namespace, name, cID); err != nil { + err := ds.network.TearDownPod(namespace, name, cID) + if err == nil { + ds.setNetworkReady(podSandboxID, false) + } else { errList = append(errList, err) } } @@ -241,6 +273,8 @@ func (ds *dockerService) RemovePodSandbox(podSandboxID string) error { errs = append(errs, err) } + ds.clearNetworkReady(podSandboxID) + // Remove the checkpoint of the sandbox. if err := ds.checkpointHandler.RemoveCheckpoint(podSandboxID); err != nil { errs = append(errs, err) @@ -258,9 +292,6 @@ func (ds *dockerService) getIPFromPlugin(sandbox *dockertypes.ContainerJSON) (st cID := kubecontainer.BuildContainerID(runtimeName, sandbox.ID) networkStatus, err := ds.network.GetPodNetworkStatus(metadata.Namespace, metadata.Name, cID) if err != nil { - // This might be a sandbox that somehow ended up without a default - // interface (eth0). We can't distinguish this from a more serious - // error, so callers should probably treat it as non-fatal. return "", err } if networkStatus == nil { @@ -272,29 +303,44 @@ func (ds *dockerService) getIPFromPlugin(sandbox *dockertypes.ContainerJSON) (st // getIP returns the ip given the output of `docker inspect` on a pod sandbox, // first interrogating any registered plugins, then simply trusting the ip // in the sandbox itself. We look for an ipv4 address before ipv6. -func (ds *dockerService) getIP(sandbox *dockertypes.ContainerJSON) (string, error) { +func (ds *dockerService) getIP(podSandboxID string, sandbox *dockertypes.ContainerJSON) string { if sandbox.NetworkSettings == nil { - return "", nil + return "" } if sharesHostNetwork(sandbox) { // For sandboxes using host network, the shim is not responsible for // reporting the IP. - return "", nil + return "" } - if IP, err := ds.getIPFromPlugin(sandbox); err != nil { - glog.Warningf("%v", err) - } else if IP != "" { - return IP, nil + + // Don't bother getting IP if the pod is known and networking isn't ready + ready, ok := ds.getNetworkReady(podSandboxID) + if ok && !ready { + return "" + } + + ip, err := ds.getIPFromPlugin(sandbox) + if err == nil { + return ip } + // TODO: trusting the docker ip is not a great idea. However docker uses // eth0 by default and so does CNI, so if we find a docker IP here, we // conclude that the plugin must have failed setup, or forgotten its ip. // This is not a sensible assumption for plugins across the board, but if // a plugin doesn't want this behavior, it can throw an error. if sandbox.NetworkSettings.IPAddress != "" { - return sandbox.NetworkSettings.IPAddress, nil + return sandbox.NetworkSettings.IPAddress + } + if sandbox.NetworkSettings.GlobalIPv6Address != "" { + return sandbox.NetworkSettings.GlobalIPv6Address } - return sandbox.NetworkSettings.GlobalIPv6Address, nil + + // If all else fails, warn but don't return an error, as pod status + // should generally not return anything except fatal errors + // FIXME: handle network errors by restarting the pod somehow? + glog.Warningf("failed to read pod IP from plugin/docker: %v", err) + return "" } // PodSandboxStatus returns the status of the PodSandbox. @@ -322,12 +368,8 @@ func (ds *dockerService) PodSandboxStatus(podSandboxID string) (*runtimeapi.PodS // TODO: Remove this when sandbox is available on windows // This is a workaround for windows, where sandbox is not in use, and pod IP is determined through containers belonging to the Pod. if IP = ds.determinePodIPBySandboxID(podSandboxID); IP == "" { - IP, err = ds.getIP(r) - if err != nil { - return nil, err - } + IP = ds.getIP(podSandboxID, r) } - network := &runtimeapi.PodSandboxNetworkStatus{Ip: IP} hostNetwork := sharesHostNetwork(r) // If the sandbox has no containerTypeLabelKey label, treat it as a legacy sandbox. @@ -353,7 +395,9 @@ func (ds *dockerService) PodSandboxStatus(podSandboxID string) (*runtimeapi.PodS Metadata: metadata, Labels: labels, Annotations: annotations, - Network: network, + Network: &runtimeapi.PodSandboxNetworkStatus{ + Ip: IP, + }, Linux: &runtimeapi.LinuxPodSandboxStatus{ Namespaces: &runtimeapi.Namespace{ Options: &runtimeapi.NamespaceOption{ diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go index d7aadb4f..59cebc40 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/docker_service.go @@ -21,6 +21,7 @@ import ( "io" "net/http" "strconv" + "sync" "time" "github.com/blang/semver" @@ -175,6 +176,7 @@ func NewDockerService(client libdocker.Interface, seccompProfileRoot string, pod containerManager: cm.NewContainerManager(cgroupsName, client), checkpointHandler: checkpointHandler, disableSharedPID: disableSharedPID, + networkReady: make(map[string]bool), } // check docker version compatibility. @@ -248,8 +250,13 @@ type dockerService struct { podSandboxImage string streamingRuntime *streamingRuntime streamingServer streaming.Server - network *network.PluginManager - containerManager cm.ContainerManager + + network *network.PluginManager + // Map of podSandboxID :: network-is-ready + networkReady map[string]bool + networkReadyLock sync.Mutex + + containerManager cm.ContainerManager // cgroup driver used by Docker runtime. cgroupDriver string checkpointHandler CheckpointHandler @@ -315,7 +322,7 @@ func (ds *dockerService) GetNetNS(podSandboxID string) (string, error) { if err != nil { return "", err } - return getNetworkNamespace(r), nil + return getNetworkNamespace(r) } // GetPodPortMappings returns the port mappings of the given podSandbox ID. diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go index ce82629b..22ab777e 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go @@ -266,14 +266,12 @@ func getApparmorSecurityOpts(sc *runtimeapi.LinuxContainerSecurityContext, separ return fmtOpts, nil } -func getNetworkNamespace(c *dockertypes.ContainerJSON) string { +func getNetworkNamespace(c *dockertypes.ContainerJSON) (string, error) { if c.State.Pid == 0 { - // Docker reports pid 0 for an exited container. We can't use it to - // check the network namespace, so return an empty string instead. - glog.V(4).Infof("Cannot find network namespace for the terminated container %q", c.ID) - return "" + // Docker reports pid 0 for an exited container. + return "", fmt.Errorf("Cannot find network namespace for the terminated container %q", c.ID) } - return fmt.Sprintf(dockerNetNSFmt, c.State.Pid) + return fmt.Sprintf(dockerNetNSFmt, c.State.Pid), nil } // dockerFilter wraps around dockerfilters.Args and provides methods to modify diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/cni/cni.go b/vendor/k8s.io/kubernetes/pkg/kubelet/network/cni/cni.go index 6060c63c..27275f4b 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/cni/cni.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/network/cni/cni.go @@ -251,9 +251,11 @@ func (plugin *cniNetworkPlugin) TearDownPod(namespace string, name string, id ku if err := plugin.checkInitialized(); err != nil { return err } + + // Lack of namespace should not be fatal on teardown netnsPath, err := plugin.host.GetNetNS(id.ID) if err != nil { - return fmt.Errorf("CNI failed to retrieve network namespace path: %v", err) + glog.Warningf("CNI failed to retrieve network namespace path: %v", err) } return plugin.deleteFromNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath) diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go b/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go index 2b9ab97b..a6997e0f 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/network/kubenet/kubenet_linux.go @@ -741,9 +741,9 @@ func podIsExited(p *kubecontainer.Pod) bool { return true } -func (plugin *kubenetNetworkPlugin) buildCNIRuntimeConf(ifName string, id kubecontainer.ContainerID) (*libcni.RuntimeConf, error) { +func (plugin *kubenetNetworkPlugin) buildCNIRuntimeConf(ifName string, id kubecontainer.ContainerID, needNetNs bool) (*libcni.RuntimeConf, error) { netnsPath, err := plugin.host.GetNetNS(id.ID) - if err != nil { + if needNetNs && err != nil { glog.Errorf("Kubenet failed to retrieve network namespace path: %v", err) } @@ -755,7 +755,7 @@ func (plugin *kubenetNetworkPlugin) buildCNIRuntimeConf(ifName string, id kubeco } func (plugin *kubenetNetworkPlugin) addContainerToNetwork(config *libcni.NetworkConfig, ifName, namespace, name string, id kubecontainer.ContainerID) (cnitypes.Result, error) { - rt, err := plugin.buildCNIRuntimeConf(ifName, id) + rt, err := plugin.buildCNIRuntimeConf(ifName, id, true) if err != nil { return nil, fmt.Errorf("Error building CNI config: %v", err) } @@ -769,7 +769,7 @@ func (plugin *kubenetNetworkPlugin) addContainerToNetwork(config *libcni.Network } func (plugin *kubenetNetworkPlugin) delContainerFromNetwork(config *libcni.NetworkConfig, ifName, namespace, name string, id kubecontainer.ContainerID) error { - rt, err := plugin.buildCNIRuntimeConf(ifName, id) + rt, err := plugin.buildCNIRuntimeConf(ifName, id, false) if err != nil { return fmt.Errorf("Error building CNI config: %v", err) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubelet/network/plugins.go b/vendor/k8s.io/kubernetes/pkg/kubelet/network/plugins.go index 859ff46e..a71f7ef8 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubelet/network/plugins.go +++ b/vendor/k8s.io/kubernetes/pkg/kubelet/network/plugins.go @@ -144,6 +144,8 @@ type Host interface { // CNI plugin wrappers like kubenet. type NamespaceGetter interface { // GetNetNS returns network namespace information for the given containerID. + // Runtimes should *never* return an empty namespace and nil error for + // a container; if error is nil then the namespace string must be valid. GetNetNS(containerID string) (string, error) } diff --git a/vendor/k8s.io/kubernetes/pkg/volume/util.go b/vendor/k8s.io/kubernetes/pkg/volume/util.go index aac4c9e5..2e561036 100644 --- a/vendor/k8s.io/kubernetes/pkg/volume/util.go +++ b/vendor/k8s.io/kubernetes/pkg/volume/util.go @@ -434,3 +434,23 @@ func ValidateZone(zone string) error { } return nil } + +// AccessModesContains returns whether the requested mode is contained by modes +func AccessModesContains(modes []v1.PersistentVolumeAccessMode, mode v1.PersistentVolumeAccessMode) bool { + for _, m := range modes { + if m == mode { + return true + } + } + return false +} + +// AccessModesContainedInAll returns whether all of the requested modes are contained by modes +func AccessModesContainedInAll(indexedModes []v1.PersistentVolumeAccessMode, requestedModes []v1.PersistentVolumeAccessMode) bool { + for _, mode := range requestedModes { + if !AccessModesContains(indexedModes, mode) { + return false + } + } + return true +}