diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index c3bd2c87..928c5561 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -80,7 +80,15 @@ }, { "ImportPath": "github.com/json-iterator/go", - "Rev": "13f86432b882000a51c6e610c620974462691a97" + "Rev": "2ddf6d758266fcb080a4f9e054b9f292c85e6798" + }, + { + "ImportPath": "github.com/modern-go/concurrent", + "Rev": "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" + }, + { + "ImportPath": "github.com/modern-go/reflect2", + "Rev": "05fbef0ca5da472bbf96c9322b84a53edc03c9fd" }, { "ImportPath": "github.com/spf13/pflag", @@ -148,763 +156,763 @@ }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "1c973d529bdf4c4f349357ca665fb8e1d13e2d0d" + "Rev": "b39a8bdff32033fd1f645f17f1625f3b691124b6" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "73aa818bbacf185a03468ddc170fb275763dec3d" + "Rev": "6ad68b3c504c71a07c48328779d8b5aabe2e4dd9" }, { "ImportPath": "k8s.io/client-go/discovery", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/discovery/fake", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/apps", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta2", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/batch", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/certificates", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/core", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/core/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/events", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/events/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/extensions", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/internalinterfaces", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/networking", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/networking/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/policy", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/policy/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/rbac", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/scheduling", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/settings", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/storage", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta2", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/core/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/events/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/networking/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/policy/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1beta1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/pkg/version", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/rest", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/rest/watch", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/testing", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/auth", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/cache", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/metrics", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/pager", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/record", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/tools/reference", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/transport", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/util/buffer", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/util/cert", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/util/flowcontrol", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/util/homedir", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/util/integer", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/util/retry", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/client-go/util/workqueue", - "Rev": "467c17c87a25ca63c74dfb8cf2545343fbed2d69" + "Rev": "f0d11262904f0a1cd1d4b6120add0cf6523ba9d4" }, { "ImportPath": "k8s.io/kube-openapi/pkg/util/proto", diff --git a/vendor/github.com/json-iterator/go/Gopkg.lock b/vendor/github.com/json-iterator/go/Gopkg.lock index f34f5b4a..338f1c68 100644 --- a/vendor/github.com/json-iterator/go/Gopkg.lock +++ b/vendor/github.com/json-iterator/go/Gopkg.lock @@ -2,32 +2,20 @@ [[projects]] - name = "github.com/davecgh/go-spew" - packages = ["spew"] - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" - -[[projects]] - branch = "master" - name = "github.com/google/gofuzz" + name = "github.com/modern-go/concurrent" packages = ["."] - revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" + revision = "e0a39a4cb4216ea8db28e22a69f4ec25610d513a" + version = "1.0.0" [[projects]] - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - name = "github.com/stretchr/testify" - packages = ["assert","require"] - revision = "69483b4bd14f5845b5a1e55bca19e954e827f1d0" - version = "v1.1.4" + name = "github.com/modern-go/reflect2" + packages = ["."] + revision = "1df9eeb2bb81f327b96228865c5687bc2194af3f" + version = "1.0.0" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "f8b7cf3941d3792cbbd570bb53c093adaf774334d1162c651565c97a58dc9d09" + inputs-digest = "ac7003b5a981716353a43055ab7d4c5357403cb30a60de2dbdeb446c1544beaa" solver-name = "gps-cdcl" solver-version = 1 diff --git a/vendor/github.com/json-iterator/go/Gopkg.toml b/vendor/github.com/json-iterator/go/Gopkg.toml index 0ac55ef8..5801ffa1 100644 --- a/vendor/github.com/json-iterator/go/Gopkg.toml +++ b/vendor/github.com/json-iterator/go/Gopkg.toml @@ -19,15 +19,8 @@ # name = "github.com/x/y" # version = "2.4.0" +ignored = ["github.com/davecgh/go-spew*","github.com/google/gofuzz*","github.com/stretchr/testify*"] [[constraint]] - name = "github.com/davecgh/go-spew" - version = "1.1.0" - -[[constraint]] - branch = "master" - name = "github.com/google/gofuzz" - -[[constraint]] - name = "github.com/stretchr/testify" - version = "1.1.4" + name = "github.com/modern-go/reflect2" + version = "1.0.0" diff --git a/vendor/github.com/json-iterator/go/README.md b/vendor/github.com/json-iterator/go/README.md index 3a0d6809..54d5afe9 100644 --- a/vendor/github.com/json-iterator/go/README.md +++ b/vendor/github.com/json-iterator/go/README.md @@ -8,6 +8,8 @@ A high-performance 100% compatible drop-in replacement of "encoding/json" +You can also use thrift like JSON using [thrift-iterator](https://github.com/thrift-iterator/go) + ``` Go开发者们请加入我们,滴滴出行平台技术部 taowen@didichuxing.com ``` @@ -29,6 +31,9 @@ Raw Result (easyjson requires static code generation) | easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op | | jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op | +Always benchmark with your own workload. +The result depends heavily on the data input. + # Usage 100% compatibility with standard lib diff --git a/vendor/github.com/json-iterator/go/feature_adapter.go b/vendor/github.com/json-iterator/go/adapter.go similarity index 76% rename from vendor/github.com/json-iterator/go/feature_adapter.go rename to vendor/github.com/json-iterator/go/adapter.go index 0214b711..f371bfed 100644 --- a/vendor/github.com/json-iterator/go/feature_adapter.go +++ b/vendor/github.com/json-iterator/go/adapter.go @@ -16,15 +16,6 @@ func Unmarshal(data []byte, v interface{}) error { return ConfigDefault.Unmarshal(data, v) } -func lastNotSpacePos(data []byte) int { - for i := len(data) - 1; i >= 0; i-- { - if data[i] != ' ' && data[i] != '\t' && data[i] != '\r' && data[i] != '\n' { - return i + 1 - } - } - return 0 -} - // UnmarshalFromString convenient method to read from string instead of []byte func UnmarshalFromString(str string, v interface{}) error { return ConfigDefault.UnmarshalFromString(str, v) @@ -71,6 +62,11 @@ type Decoder struct { // Decode decode JSON into interface{} func (adapter *Decoder) Decode(obj interface{}) error { + if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil { + if !adapter.iter.loadMore() { + return io.EOF + } + } adapter.iter.ReadVal(obj) err := adapter.iter.Error if err == io.EOF { @@ -81,7 +77,14 @@ func (adapter *Decoder) Decode(obj interface{}) error { // More is there more? func (adapter *Decoder) More() bool { - return adapter.iter.head != adapter.iter.tail + iter := adapter.iter + if iter.Error != nil { + return false + } + if iter.head != iter.tail { + return true + } + return iter.loadMore() } // Buffered remaining buffer @@ -90,11 +93,21 @@ func (adapter *Decoder) Buffered() io.Reader { return bytes.NewReader(remaining) } -// UseNumber for number JSON element, use float64 or json.NumberValue (alias of string) +// UseNumber causes the Decoder to unmarshal a number into an interface{} as a +// Number instead of as a float64. func (adapter *Decoder) UseNumber() { - origCfg := adapter.iter.cfg.configBeforeFrozen - origCfg.UseNumber = true - adapter.iter.cfg = origCfg.Froze().(*frozenConfig) + cfg := adapter.iter.cfg.configBeforeFrozen + cfg.UseNumber = true + adapter.iter.cfg = cfg.frozeWithCacheReuse() +} + +// DisallowUnknownFields causes the Decoder to return an error when the destination +// is a struct and the input contains object keys which do not match any +// non-ignored, exported fields in the destination. +func (adapter *Decoder) DisallowUnknownFields() { + cfg := adapter.iter.cfg.configBeforeFrozen + cfg.DisallowUnknownFields = true + adapter.iter.cfg = cfg.frozeWithCacheReuse() } // NewEncoder same as json.NewEncoder @@ -117,14 +130,16 @@ func (adapter *Encoder) Encode(val interface{}) error { // SetIndent set the indention. Prefix is not supported func (adapter *Encoder) SetIndent(prefix, indent string) { - adapter.stream.cfg.indentionStep = len(indent) + config := adapter.stream.cfg.configBeforeFrozen + config.IndentionStep = len(indent) + adapter.stream.cfg = config.frozeWithCacheReuse() } // SetEscapeHTML escape html by default, set to false to disable func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) { config := adapter.stream.cfg.configBeforeFrozen config.EscapeHTML = escapeHTML - adapter.stream.cfg = config.Froze().(*frozenConfig) + adapter.stream.cfg = config.frozeWithCacheReuse() } // Valid reports whether data is a valid JSON encoding. diff --git a/vendor/github.com/json-iterator/go/feature_any.go b/vendor/github.com/json-iterator/go/any.go similarity index 75% rename from vendor/github.com/json-iterator/go/feature_any.go rename to vendor/github.com/json-iterator/go/any.go index 87716d1f..daecfed6 100644 --- a/vendor/github.com/json-iterator/go/feature_any.go +++ b/vendor/github.com/json-iterator/go/any.go @@ -3,8 +3,11 @@ package jsoniter import ( "errors" "fmt" + "github.com/modern-go/reflect2" "io" "reflect" + "strconv" + "unsafe" ) // Any generic object representation. @@ -25,7 +28,6 @@ type Any interface { ToString() string ToVal(val interface{}) Get(path ...interface{}) Any - // TODO: add Set Size() int Keys() []string GetInterface() interface{} @@ -35,7 +37,7 @@ type Any interface { type baseAny struct{} func (any *baseAny) Get(path ...interface{}) Any { - return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)} + return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} } func (any *baseAny) Size() int { @@ -89,7 +91,7 @@ func Wrap(val interface{}) Any { if isAny { return asAny } - typ := reflect.TypeOf(val) + typ := reflect2.TypeOf(val) switch typ.Kind() { case reflect.Slice: return wrapArray(val) @@ -100,6 +102,9 @@ func Wrap(val interface{}) Any { case reflect.String: return WrapString(val.(string)) case reflect.Int: + if strconv.IntSize == 32 { + return WrapInt32(int32(val.(int))) + } return WrapInt64(int64(val.(int))) case reflect.Int8: return WrapInt32(int32(val.(int8))) @@ -110,7 +115,15 @@ func Wrap(val interface{}) Any { case reflect.Int64: return WrapInt64(val.(int64)) case reflect.Uint: + if strconv.IntSize == 32 { + return WrapUint32(uint32(val.(uint))) + } return WrapUint64(uint64(val.(uint))) + case reflect.Uintptr: + if ptrSize == 32 { + return WrapUint32(uint32(val.(uintptr))) + } + return WrapUint64(uint64(val.(uintptr))) case reflect.Uint8: return WrapUint32(uint32(val.(uint8))) case reflect.Uint16: @@ -243,3 +256,66 @@ func locatePath(iter *Iterator, path []interface{}) Any { } return iter.readAny() } + +var anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem() + +func createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ == anyType { + return &directAnyCodec{} + } + if typ.Implements(anyType) { + return &anyCodec{ + valType: typ, + } + } + return nil +} + +func createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ == anyType { + return &directAnyCodec{} + } + if typ.Implements(anyType) { + return &anyCodec{ + valType: typ, + } + } + return nil +} + +type anyCodec struct { + valType reflect2.Type +} + +func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + panic("not implemented") +} + +func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := codec.valType.UnsafeIndirect(ptr) + any := obj.(Any) + any.WriteTo(stream) +} + +func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { + obj := codec.valType.UnsafeIndirect(ptr) + any := obj.(Any) + return any.Size() == 0 +} + +type directAnyCodec struct { +} + +func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *(*Any)(ptr) = iter.readAny() +} + +func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + any := *(*Any)(ptr) + any.WriteTo(stream) +} + +func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool { + any := *(*Any)(ptr) + return any.Size() == 0 +} diff --git a/vendor/github.com/json-iterator/go/feature_any_array.go b/vendor/github.com/json-iterator/go/any_array.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_array.go rename to vendor/github.com/json-iterator/go/any_array.go diff --git a/vendor/github.com/json-iterator/go/feature_any_bool.go b/vendor/github.com/json-iterator/go/any_bool.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_bool.go rename to vendor/github.com/json-iterator/go/any_bool.go diff --git a/vendor/github.com/json-iterator/go/feature_any_float.go b/vendor/github.com/json-iterator/go/any_float.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_float.go rename to vendor/github.com/json-iterator/go/any_float.go diff --git a/vendor/github.com/json-iterator/go/feature_any_int32.go b/vendor/github.com/json-iterator/go/any_int32.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_int32.go rename to vendor/github.com/json-iterator/go/any_int32.go diff --git a/vendor/github.com/json-iterator/go/feature_any_int64.go b/vendor/github.com/json-iterator/go/any_int64.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_int64.go rename to vendor/github.com/json-iterator/go/any_int64.go diff --git a/vendor/github.com/json-iterator/go/feature_any_invalid.go b/vendor/github.com/json-iterator/go/any_invalid.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_invalid.go rename to vendor/github.com/json-iterator/go/any_invalid.go diff --git a/vendor/github.com/json-iterator/go/feature_any_nil.go b/vendor/github.com/json-iterator/go/any_nil.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_nil.go rename to vendor/github.com/json-iterator/go/any_nil.go diff --git a/vendor/github.com/json-iterator/go/feature_any_number.go b/vendor/github.com/json-iterator/go/any_number.go similarity index 76% rename from vendor/github.com/json-iterator/go/feature_any_number.go rename to vendor/github.com/json-iterator/go/any_number.go index 4e1c2764..9d1e901a 100644 --- a/vendor/github.com/json-iterator/go/feature_any_number.go +++ b/vendor/github.com/json-iterator/go/any_number.go @@ -1,6 +1,9 @@ package jsoniter -import "unsafe" +import ( + "io" + "unsafe" +) type numberLazyAny struct { baseAny @@ -29,7 +32,9 @@ func (any *numberLazyAny) ToInt() int { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadInt() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } @@ -37,7 +42,9 @@ func (any *numberLazyAny) ToInt32() int32 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadInt32() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } @@ -45,7 +52,9 @@ func (any *numberLazyAny) ToInt64() int64 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadInt64() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } @@ -53,7 +62,9 @@ func (any *numberLazyAny) ToUint() uint { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadUint() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } @@ -61,7 +72,9 @@ func (any *numberLazyAny) ToUint32() uint32 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadUint32() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } @@ -69,7 +82,9 @@ func (any *numberLazyAny) ToUint64() uint64 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadUint64() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } @@ -77,7 +92,9 @@ func (any *numberLazyAny) ToFloat32() float32 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadFloat32() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } @@ -85,7 +102,9 @@ func (any *numberLazyAny) ToFloat64() float64 { iter := any.cfg.BorrowIterator(any.buf) defer any.cfg.ReturnIterator(iter) val := iter.ReadFloat64() - any.err = iter.Error + if iter.Error != nil && iter.Error != io.EOF { + any.err = iter.Error + } return val } diff --git a/vendor/github.com/json-iterator/go/feature_any_object.go b/vendor/github.com/json-iterator/go/any_object.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_object.go rename to vendor/github.com/json-iterator/go/any_object.go diff --git a/vendor/github.com/json-iterator/go/feature_any_string.go b/vendor/github.com/json-iterator/go/any_str.go similarity index 97% rename from vendor/github.com/json-iterator/go/feature_any_string.go rename to vendor/github.com/json-iterator/go/any_str.go index abf060bd..a4b93c78 100644 --- a/vendor/github.com/json-iterator/go/feature_any_string.go +++ b/vendor/github.com/json-iterator/go/any_str.go @@ -14,7 +14,7 @@ func (any *stringAny) Get(path ...interface{}) Any { if len(path) == 0 { return any } - return &invalidAny{baseAny{}, fmt.Errorf("Get %v from simple value", path)} + return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} } func (any *stringAny) Parse() *Iterator { diff --git a/vendor/github.com/json-iterator/go/feature_any_uint32.go b/vendor/github.com/json-iterator/go/any_uint32.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_uint32.go rename to vendor/github.com/json-iterator/go/any_uint32.go diff --git a/vendor/github.com/json-iterator/go/feature_any_uint64.go b/vendor/github.com/json-iterator/go/any_uint64.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_any_uint64.go rename to vendor/github.com/json-iterator/go/any_uint64.go diff --git a/vendor/github.com/json-iterator/go/feature_config.go b/vendor/github.com/json-iterator/go/config.go similarity index 61% rename from vendor/github.com/json-iterator/go/feature_config.go rename to vendor/github.com/json-iterator/go/config.go index 78a2ce1a..bd66947d 100644 --- a/vendor/github.com/json-iterator/go/feature_config.go +++ b/vendor/github.com/json-iterator/go/config.go @@ -2,10 +2,11 @@ package jsoniter import ( "encoding/json" - "errors" + "github.com/modern-go/concurrent" + "github.com/modern-go/reflect2" "io" "reflect" - "sync/atomic" + "sync" "unsafe" ) @@ -17,23 +18,13 @@ type Config struct { EscapeHTML bool SortMapKeys bool UseNumber bool + DisallowUnknownFields bool TagKey string + OnlyTaggedField bool ValidateJsonRawMessage bool ObjectFieldMustBeSimpleString bool } -type frozenConfig struct { - configBeforeFrozen Config - sortMapKeys bool - indentionStep int - objectFieldMustBeSimpleString bool - decoderCache unsafe.Pointer - encoderCache unsafe.Pointer - extensions []Extension - streamPool chan *Stream - iteratorPool chan *Iterator -} - // API the public interface of this package. // Primary Marshal and Unmarshal. type API interface { @@ -49,6 +40,8 @@ type API interface { NewDecoder(reader io.Reader) *Decoder Valid(data []byte) bool RegisterExtension(extension Extension) + DecoderOf(typ reflect2.Type) ValDecoder + EncoderOf(typ reflect2.Type) ValEncoder } // ConfigDefault the default API @@ -70,35 +63,118 @@ var ConfigFastest = Config{ ObjectFieldMustBeSimpleString: true, // do not unescape object field }.Froze() +type frozenConfig struct { + configBeforeFrozen Config + sortMapKeys bool + indentionStep int + objectFieldMustBeSimpleString bool + onlyTaggedField bool + disallowUnknownFields bool + decoderCache *concurrent.Map + encoderCache *concurrent.Map + extensions []Extension + streamPool *sync.Pool + iteratorPool *sync.Pool +} + +func (cfg *frozenConfig) initCache() { + cfg.decoderCache = concurrent.NewMap() + cfg.encoderCache = concurrent.NewMap() +} + +func (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) { + cfg.decoderCache.Store(cacheKey, decoder) +} + +func (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) { + cfg.encoderCache.Store(cacheKey, encoder) +} + +func (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) ValDecoder { + decoder, found := cfg.decoderCache.Load(cacheKey) + if found { + return decoder.(ValDecoder) + } + return nil +} + +func (cfg *frozenConfig) getEncoderFromCache(cacheKey uintptr) ValEncoder { + encoder, found := cfg.encoderCache.Load(cacheKey) + if found { + return encoder.(ValEncoder) + } + return nil +} + +var cfgCache = concurrent.NewMap() + +func getFrozenConfigFromCache(cfg Config) *frozenConfig { + obj, found := cfgCache.Load(cfg) + if found { + return obj.(*frozenConfig) + } + return nil +} + +func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) { + cfgCache.Store(cfg, frozenConfig) +} + // Froze forge API from config func (cfg Config) Froze() API { - // TODO: cache frozen config - frozenConfig := &frozenConfig{ + api := &frozenConfig{ sortMapKeys: cfg.SortMapKeys, indentionStep: cfg.IndentionStep, objectFieldMustBeSimpleString: cfg.ObjectFieldMustBeSimpleString, - streamPool: make(chan *Stream, 16), - iteratorPool: make(chan *Iterator, 16), + onlyTaggedField: cfg.OnlyTaggedField, + disallowUnknownFields: cfg.DisallowUnknownFields, } - atomic.StorePointer(&frozenConfig.decoderCache, unsafe.Pointer(&map[string]ValDecoder{})) - atomic.StorePointer(&frozenConfig.encoderCache, unsafe.Pointer(&map[string]ValEncoder{})) + api.streamPool = &sync.Pool{ + New: func() interface{} { + return NewStream(api, nil, 512) + }, + } + api.iteratorPool = &sync.Pool{ + New: func() interface{} { + return NewIterator(api) + }, + } + api.initCache() + encoderExtension := EncoderExtension{} + decoderExtension := DecoderExtension{} if cfg.MarshalFloatWith6Digits { - frozenConfig.marshalFloatWith6Digits() + api.marshalFloatWith6Digits(encoderExtension) } if cfg.EscapeHTML { - frozenConfig.escapeHTML() + api.escapeHTML(encoderExtension) } if cfg.UseNumber { - frozenConfig.useNumber() + api.useNumber(decoderExtension) } if cfg.ValidateJsonRawMessage { - frozenConfig.validateJsonRawMessage() + api.validateJsonRawMessage(encoderExtension) } - frozenConfig.configBeforeFrozen = cfg - return frozenConfig + if len(encoderExtension) > 0 { + api.extensions = append(api.extensions, encoderExtension) + } + if len(decoderExtension) > 0 { + api.extensions = append(api.extensions, decoderExtension) + } + api.configBeforeFrozen = cfg + return api } -func (cfg *frozenConfig) validateJsonRawMessage() { +func (cfg Config) frozeWithCacheReuse() *frozenConfig { + api := getFrozenConfigFromCache(cfg) + if api != nil { + return api + } + api = cfg.Froze().(*frozenConfig) + addFrozenConfigToCache(cfg, api) + return api +} + +func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) { encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) { rawMessage := *(*json.RawMessage)(ptr) iter := cfg.BorrowIterator([]byte(rawMessage)) @@ -112,18 +188,23 @@ func (cfg *frozenConfig) validateJsonRawMessage() { }, func(ptr unsafe.Pointer) bool { return false }} - cfg.addEncoderToCache(reflect.TypeOf((*json.RawMessage)(nil)).Elem(), encoder) - cfg.addEncoderToCache(reflect.TypeOf((*RawMessage)(nil)).Elem(), encoder) + extension[reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()] = encoder + extension[reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()] = encoder } -func (cfg *frozenConfig) useNumber() { - cfg.addDecoderToCache(reflect.TypeOf((*interface{})(nil)).Elem(), &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { +func (cfg *frozenConfig) useNumber(extension DecoderExtension) { + extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { + exitingValue := *((*interface{})(ptr)) + if exitingValue != nil && reflect.TypeOf(exitingValue).Kind() == reflect.Ptr { + iter.ReadVal(exitingValue) + return + } if iter.WhatIsNext() == NumberValue { *((*interface{})(ptr)) = json.Number(iter.readNumberAsString()) } else { *((*interface{})(ptr)) = iter.Read() } - }}) + }} } func (cfg *frozenConfig) getTagKey() string { tagKey := cfg.configBeforeFrozen.TagKey @@ -144,10 +225,6 @@ func (encoder *lossyFloat32Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { stream.WriteFloat32Lossy(*((*float32)(ptr))) } -func (encoder *lossyFloat32Encoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - func (encoder *lossyFloat32Encoder) IsEmpty(ptr unsafe.Pointer) bool { return *((*float32)(ptr)) == 0 } @@ -159,20 +236,16 @@ func (encoder *lossyFloat64Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { stream.WriteFloat64Lossy(*((*float64)(ptr))) } -func (encoder *lossyFloat64Encoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool { return *((*float64)(ptr)) == 0 } // EnableLossyFloatMarshalling keeps 10**(-6) precision // for float variables for better performance. -func (cfg *frozenConfig) marshalFloatWith6Digits() { +func (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) { // for better performance - cfg.addEncoderToCache(reflect.TypeOf((*float32)(nil)).Elem(), &lossyFloat32Encoder{}) - cfg.addEncoderToCache(reflect.TypeOf((*float64)(nil)).Elem(), &lossyFloat64Encoder{}) + extension[reflect2.TypeOfPtr((*float32)(nil)).Elem()] = &lossyFloat32Encoder{} + extension[reflect2.TypeOfPtr((*float64)(nil)).Elem()] = &lossyFloat64Encoder{} } type htmlEscapedStringEncoder struct { @@ -183,56 +256,12 @@ func (encoder *htmlEscapedStringEncoder) Encode(ptr unsafe.Pointer, stream *Stre stream.WriteStringWithHTMLEscaped(str) } -func (encoder *htmlEscapedStringEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { return *((*string)(ptr)) == "" } -func (cfg *frozenConfig) escapeHTML() { - cfg.addEncoderToCache(reflect.TypeOf((*string)(nil)).Elem(), &htmlEscapedStringEncoder{}) -} - -func (cfg *frozenConfig) addDecoderToCache(cacheKey reflect.Type, decoder ValDecoder) { - done := false - for !done { - ptr := atomic.LoadPointer(&cfg.decoderCache) - cache := *(*map[reflect.Type]ValDecoder)(ptr) - copied := map[reflect.Type]ValDecoder{} - for k, v := range cache { - copied[k] = v - } - copied[cacheKey] = decoder - done = atomic.CompareAndSwapPointer(&cfg.decoderCache, ptr, unsafe.Pointer(&copied)) - } -} - -func (cfg *frozenConfig) addEncoderToCache(cacheKey reflect.Type, encoder ValEncoder) { - done := false - for !done { - ptr := atomic.LoadPointer(&cfg.encoderCache) - cache := *(*map[reflect.Type]ValEncoder)(ptr) - copied := map[reflect.Type]ValEncoder{} - for k, v := range cache { - copied[k] = v - } - copied[cacheKey] = encoder - done = atomic.CompareAndSwapPointer(&cfg.encoderCache, ptr, unsafe.Pointer(&copied)) - } -} - -func (cfg *frozenConfig) getDecoderFromCache(cacheKey reflect.Type) ValDecoder { - ptr := atomic.LoadPointer(&cfg.decoderCache) - cache := *(*map[reflect.Type]ValDecoder)(ptr) - return cache[cacheKey] -} - -func (cfg *frozenConfig) getEncoderFromCache(cacheKey reflect.Type) ValEncoder { - ptr := atomic.LoadPointer(&cfg.encoderCache) - cache := *(*map[reflect.Type]ValEncoder)(ptr) - return cache[cacheKey] +func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) { + encoderExtension[reflect2.TypeOfPtr((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{} } func (cfg *frozenConfig) cleanDecoders() { @@ -281,24 +310,22 @@ func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([] } newCfg := cfg.configBeforeFrozen newCfg.IndentionStep = len(indent) - return newCfg.Froze().Marshal(v) + return newCfg.frozeWithCacheReuse().Marshal(v) } func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error { data := []byte(str) - data = data[:lastNotSpacePos(data)] iter := cfg.BorrowIterator(data) defer cfg.ReturnIterator(iter) iter.ReadVal(v) - if iter.head == iter.tail { - iter.loadMore() - } - if iter.Error == io.EOF { - return nil - } - if iter.Error == nil { - iter.ReportError("UnmarshalFromString", "there are bytes left after unmarshal") + c := iter.nextToken() + if c == 0 { + if iter.Error == io.EOF { + return nil + } + return iter.Error } + iter.ReportError("Unmarshal", "there are bytes left after unmarshal") return iter.Error } @@ -309,24 +336,17 @@ func (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any { } func (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error { - data = data[:lastNotSpacePos(data)] iter := cfg.BorrowIterator(data) defer cfg.ReturnIterator(iter) - typ := reflect.TypeOf(v) - if typ.Kind() != reflect.Ptr { - // return non-pointer error - return errors.New("the second param must be ptr type") - } iter.ReadVal(v) - if iter.head == iter.tail { - iter.loadMore() - } - if iter.Error == io.EOF { - return nil - } - if iter.Error == nil { - iter.ReportError("Unmarshal", "there are bytes left after unmarshal") + c := iter.nextToken() + if c == 0 { + if iter.Error == io.EOF { + return nil + } + return iter.Error } + iter.ReportError("Unmarshal", "there are bytes left after unmarshal") return iter.Error } diff --git a/vendor/github.com/json-iterator/go/feature_json_number.go b/vendor/github.com/json-iterator/go/feature_json_number.go deleted file mode 100644 index e187b200..00000000 --- a/vendor/github.com/json-iterator/go/feature_json_number.go +++ /dev/null @@ -1,31 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "strconv" -) - -type Number string - -// String returns the literal text of the number. -func (n Number) String() string { return string(n) } - -// Float64 returns the number as a float64. -func (n Number) Float64() (float64, error) { - return strconv.ParseFloat(string(n), 64) -} - -// Int64 returns the number as an int64. -func (n Number) Int64() (int64, error) { - return strconv.ParseInt(string(n), 10, 64) -} - -func CastJsonNumber(val interface{}) (string, bool) { - switch typedVal := val.(type) { - case json.Number: - return string(typedVal), true - case Number: - return string(typedVal), true - } - return "", false -} diff --git a/vendor/github.com/json-iterator/go/feature_reflect.go b/vendor/github.com/json-iterator/go/feature_reflect.go deleted file mode 100644 index bed7764e..00000000 --- a/vendor/github.com/json-iterator/go/feature_reflect.go +++ /dev/null @@ -1,727 +0,0 @@ -package jsoniter - -import ( - "encoding" - "encoding/json" - "fmt" - "reflect" - "time" - "unsafe" -) - -// ValDecoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValDecoder with json.Decoder. -// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link). -// -// Reflection on type to create decoders, which is then cached -// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions -// 1. create instance of new value, for example *int will need a int to be allocated -// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New -// 3. assignment to map, both key and value will be reflect.Value -// For a simple struct binding, it will be reflect.Value free and allocation free -type ValDecoder interface { - Decode(ptr unsafe.Pointer, iter *Iterator) -} - -// ValEncoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValEncoder with json.Encoder. -// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link). -type ValEncoder interface { - IsEmpty(ptr unsafe.Pointer) bool - Encode(ptr unsafe.Pointer, stream *Stream) - EncodeInterface(val interface{}, stream *Stream) -} - -type checkIsEmpty interface { - IsEmpty(ptr unsafe.Pointer) bool -} - -// WriteToStream the default implementation for TypeEncoder method EncodeInterface -func WriteToStream(val interface{}, stream *Stream, encoder ValEncoder) { - e := (*emptyInterface)(unsafe.Pointer(&val)) - if e.word == nil { - stream.WriteNil() - return - } - if reflect.TypeOf(val).Kind() == reflect.Ptr { - encoder.Encode(unsafe.Pointer(&e.word), stream) - } else { - encoder.Encode(e.word, stream) - } -} - -var jsonNumberType reflect.Type -var jsoniterNumberType reflect.Type -var jsonRawMessageType reflect.Type -var jsoniterRawMessageType reflect.Type -var anyType reflect.Type -var marshalerType reflect.Type -var unmarshalerType reflect.Type -var textMarshalerType reflect.Type -var textUnmarshalerType reflect.Type - -func init() { - jsonNumberType = reflect.TypeOf((*json.Number)(nil)).Elem() - jsoniterNumberType = reflect.TypeOf((*Number)(nil)).Elem() - jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem() - jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem() - anyType = reflect.TypeOf((*Any)(nil)).Elem() - marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem() - unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem() - textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() - textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() -} - -type OptionalDecoder struct { - ValueType reflect.Type - ValueDecoder ValDecoder -} - -func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - *((*unsafe.Pointer)(ptr)) = nil - } else { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - value := reflect.New(decoder.ValueType) - newPtr := extractInterface(value.Interface()).word - decoder.ValueDecoder.Decode(newPtr, iter) - *((*uintptr)(ptr)) = uintptr(newPtr) - } else { - //reuse existing instance - decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } - } -} - -type deferenceDecoder struct { - // only to deference a pointer - valueType reflect.Type - valueDecoder ValDecoder -} - -func (decoder *deferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - value := reflect.New(decoder.valueType) - newPtr := extractInterface(value.Interface()).word - decoder.valueDecoder.Decode(newPtr, iter) - *((*uintptr)(ptr)) = uintptr(newPtr) - } else { - //reuse existing instance - decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } -} - -type OptionalEncoder struct { - ValueEncoder ValEncoder -} - -func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *OptionalEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*unsafe.Pointer)(ptr)) == nil -} - -type optionalMapEncoder struct { - valueEncoder ValEncoder -} - -func (encoder *optionalMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.valueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *optionalMapEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *optionalMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - p := *((*unsafe.Pointer)(ptr)) - return p == nil || encoder.valueEncoder.IsEmpty(p) -} - -type placeholderEncoder struct { - cfg *frozenConfig - cacheKey reflect.Type -} - -func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.getRealEncoder().Encode(ptr, stream) -} - -func (encoder *placeholderEncoder) EncodeInterface(val interface{}, stream *Stream) { - encoder.getRealEncoder().EncodeInterface(val, stream) -} - -func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.getRealEncoder().IsEmpty(ptr) -} - -func (encoder *placeholderEncoder) getRealEncoder() ValEncoder { - for i := 0; i < 500; i++ { - realDecoder := encoder.cfg.getEncoderFromCache(encoder.cacheKey) - _, isPlaceholder := realDecoder.(*placeholderEncoder) - if isPlaceholder { - time.Sleep(10 * time.Millisecond) - } else { - return realDecoder - } - } - panic(fmt.Sprintf("real encoder not found for cache key: %v", encoder.cacheKey)) -} - -type placeholderDecoder struct { - cfg *frozenConfig - cacheKey reflect.Type -} - -func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - for i := 0; i < 500; i++ { - realDecoder := decoder.cfg.getDecoderFromCache(decoder.cacheKey) - _, isPlaceholder := realDecoder.(*placeholderDecoder) - if isPlaceholder { - time.Sleep(10 * time.Millisecond) - } else { - realDecoder.Decode(ptr, iter) - return - } - } - panic(fmt.Sprintf("real decoder not found for cache key: %v", decoder.cacheKey)) -} - -// emptyInterface is the header for an interface{} value. -type emptyInterface struct { - typ unsafe.Pointer - word unsafe.Pointer -} - -// emptyInterface is the header for an interface with method (not interface{}) -type nonEmptyInterface struct { - // see ../runtime/iface.go:/Itab - itab *struct { - ityp unsafe.Pointer // static interface type - typ unsafe.Pointer // dynamic concrete type - link unsafe.Pointer - bad int32 - unused int32 - fun [100000]unsafe.Pointer // method table - } - word unsafe.Pointer -} - -// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal -func (iter *Iterator) ReadVal(obj interface{}) { - typ := reflect.TypeOf(obj) - cacheKey := typ.Elem() - decoder, err := decoderOfType(iter.cfg, cacheKey) - if err != nil { - iter.Error = err - return - } - e := (*emptyInterface)(unsafe.Pointer(&obj)) - decoder.Decode(e.word, iter) -} - -// WriteVal copy the go interface into underlying JSON, same as json.Marshal -func (stream *Stream) WriteVal(val interface{}) { - if nil == val { - stream.WriteNil() - return - } - typ := reflect.TypeOf(val) - cacheKey := typ - encoder, err := encoderOfType(stream.cfg, cacheKey) - if err != nil { - stream.Error = err - return - } - encoder.EncodeInterface(val, stream) -} - -type prefix string - -func (p prefix) addToDecoder(decoder ValDecoder, err error) (ValDecoder, error) { - if err != nil { - return nil, fmt.Errorf("%s: %s", p, err.Error()) - } - return decoder, err -} - -func (p prefix) addToEncoder(encoder ValEncoder, err error) (ValEncoder, error) { - if err != nil { - return nil, fmt.Errorf("%s: %s", p, err.Error()) - } - return encoder, err -} - -func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { - cacheKey := typ - decoder := cfg.getDecoderFromCache(cacheKey) - if decoder != nil { - return decoder, nil - } - decoder = getTypeDecoderFromExtension(cfg, typ) - if decoder != nil { - cfg.addDecoderToCache(cacheKey, decoder) - return decoder, nil - } - decoder = &placeholderDecoder{cfg: cfg, cacheKey: cacheKey} - cfg.addDecoderToCache(cacheKey, decoder) - decoder, err := createDecoderOfType(cfg, typ) - for _, extension := range extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - for _, extension := range cfg.extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - cfg.addDecoderToCache(cacheKey, decoder) - return decoder, err -} - -func createDecoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { - typeName := typ.String() - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{}, nil - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{}, nil - } - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{}, nil - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{}, nil - } - if typ.Implements(unmarshalerType) { - templateInterface := reflect.New(typ).Elem().Interface() - var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)} - if typ.Kind() == reflect.Ptr { - decoder = &OptionalDecoder{typ.Elem(), decoder} - } - return decoder, nil - } - if reflect.PtrTo(typ).Implements(unmarshalerType) { - templateInterface := reflect.New(typ).Interface() - var decoder ValDecoder = &unmarshalerDecoder{extractInterface(templateInterface)} - return decoder, nil - } - if typ.Implements(textUnmarshalerType) { - templateInterface := reflect.New(typ).Elem().Interface() - var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)} - if typ.Kind() == reflect.Ptr { - decoder = &OptionalDecoder{typ.Elem(), decoder} - } - return decoder, nil - } - if reflect.PtrTo(typ).Implements(textUnmarshalerType) { - templateInterface := reflect.New(typ).Interface() - var decoder ValDecoder = &textUnmarshalerDecoder{extractInterface(templateInterface)} - return decoder, nil - } - if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 { - sliceDecoder, err := prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ)) - if err != nil { - return nil, err - } - return &base64Codec{sliceDecoder: sliceDecoder}, nil - } - if typ.Implements(anyType) { - return &anyCodec{}, nil - } - switch typ.Kind() { - case reflect.String: - if typeName != "string" { - return decoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem()) - } - return &stringCodec{}, nil - case reflect.Int: - if typeName != "int" { - return decoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem()) - } - return &intCodec{}, nil - case reflect.Int8: - if typeName != "int8" { - return decoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem()) - } - return &int8Codec{}, nil - case reflect.Int16: - if typeName != "int16" { - return decoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem()) - } - return &int16Codec{}, nil - case reflect.Int32: - if typeName != "int32" { - return decoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem()) - } - return &int32Codec{}, nil - case reflect.Int64: - if typeName != "int64" { - return decoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem()) - } - return &int64Codec{}, nil - case reflect.Uint: - if typeName != "uint" { - return decoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem()) - } - return &uintCodec{}, nil - case reflect.Uint8: - if typeName != "uint8" { - return decoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem()) - } - return &uint8Codec{}, nil - case reflect.Uint16: - if typeName != "uint16" { - return decoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem()) - } - return &uint16Codec{}, nil - case reflect.Uint32: - if typeName != "uint32" { - return decoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem()) - } - return &uint32Codec{}, nil - case reflect.Uintptr: - if typeName != "uintptr" { - return decoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem()) - } - return &uintptrCodec{}, nil - case reflect.Uint64: - if typeName != "uint64" { - return decoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem()) - } - return &uint64Codec{}, nil - case reflect.Float32: - if typeName != "float32" { - return decoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem()) - } - return &float32Codec{}, nil - case reflect.Float64: - if typeName != "float64" { - return decoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem()) - } - return &float64Codec{}, nil - case reflect.Bool: - if typeName != "bool" { - return decoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem()) - } - return &boolCodec{}, nil - case reflect.Interface: - if typ.NumMethod() == 0 { - return &emptyInterfaceCodec{}, nil - } - return &nonEmptyInterfaceCodec{}, nil - case reflect.Struct: - return prefix(fmt.Sprintf("[%s]", typeName)).addToDecoder(decoderOfStruct(cfg, typ)) - case reflect.Array: - return prefix("[array]").addToDecoder(decoderOfArray(cfg, typ)) - case reflect.Slice: - return prefix("[slice]").addToDecoder(decoderOfSlice(cfg, typ)) - case reflect.Map: - return prefix("[map]").addToDecoder(decoderOfMap(cfg, typ)) - case reflect.Ptr: - return prefix("[optional]").addToDecoder(decoderOfOptional(cfg, typ)) - default: - return nil, fmt.Errorf("unsupported type: %v", typ) - } -} - -func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { - cacheKey := typ - encoder := cfg.getEncoderFromCache(cacheKey) - if encoder != nil { - return encoder, nil - } - encoder = getTypeEncoderFromExtension(cfg, typ) - if encoder != nil { - cfg.addEncoderToCache(cacheKey, encoder) - return encoder, nil - } - encoder = &placeholderEncoder{cfg: cfg, cacheKey: cacheKey} - cfg.addEncoderToCache(cacheKey, encoder) - encoder, err := createEncoderOfType(cfg, typ) - for _, extension := range extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - for _, extension := range cfg.extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - cfg.addEncoderToCache(cacheKey, encoder) - return encoder, err -} - -func createEncoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{}, nil - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{}, nil - } - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{}, nil - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{}, nil - } - if typ.Implements(marshalerType) { - checkIsEmpty, err := createCheckIsEmpty(cfg, typ) - if err != nil { - return nil, err - } - templateInterface := reflect.New(typ).Elem().Interface() - var encoder ValEncoder = &marshalerEncoder{ - templateInterface: extractInterface(templateInterface), - checkIsEmpty: checkIsEmpty, - } - if typ.Kind() == reflect.Ptr { - encoder = &OptionalEncoder{encoder} - } - return encoder, nil - } - if reflect.PtrTo(typ).Implements(marshalerType) { - checkIsEmpty, err := createCheckIsEmpty(cfg, reflect.PtrTo(typ)) - if err != nil { - return nil, err - } - templateInterface := reflect.New(typ).Interface() - var encoder ValEncoder = &marshalerEncoder{ - templateInterface: extractInterface(templateInterface), - checkIsEmpty: checkIsEmpty, - } - return encoder, nil - } - if typ.Implements(textMarshalerType) { - checkIsEmpty, err := createCheckIsEmpty(cfg, typ) - if err != nil { - return nil, err - } - templateInterface := reflect.New(typ).Elem().Interface() - var encoder ValEncoder = &textMarshalerEncoder{ - templateInterface: extractInterface(templateInterface), - checkIsEmpty: checkIsEmpty, - } - if typ.Kind() == reflect.Ptr { - encoder = &OptionalEncoder{encoder} - } - return encoder, nil - } - if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Uint8 { - return &base64Codec{}, nil - } - if typ.Implements(anyType) { - return &anyCodec{}, nil - } - return createEncoderOfSimpleType(cfg, typ) -} - -func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) (checkIsEmpty, error) { - kind := typ.Kind() - switch kind { - case reflect.String: - return &stringCodec{}, nil - case reflect.Int: - return &intCodec{}, nil - case reflect.Int8: - return &int8Codec{}, nil - case reflect.Int16: - return &int16Codec{}, nil - case reflect.Int32: - return &int32Codec{}, nil - case reflect.Int64: - return &int64Codec{}, nil - case reflect.Uint: - return &uintCodec{}, nil - case reflect.Uint8: - return &uint8Codec{}, nil - case reflect.Uint16: - return &uint16Codec{}, nil - case reflect.Uint32: - return &uint32Codec{}, nil - case reflect.Uintptr: - return &uintptrCodec{}, nil - case reflect.Uint64: - return &uint64Codec{}, nil - case reflect.Float32: - return &float32Codec{}, nil - case reflect.Float64: - return &float64Codec{}, nil - case reflect.Bool: - return &boolCodec{}, nil - case reflect.Interface: - if typ.NumMethod() == 0 { - return &emptyInterfaceCodec{}, nil - } - return &nonEmptyInterfaceCodec{}, nil - case reflect.Struct: - return &structEncoder{}, nil - case reflect.Array: - return &arrayEncoder{}, nil - case reflect.Slice: - return &sliceEncoder{}, nil - case reflect.Map: - return encoderOfMap(cfg, typ) - case reflect.Ptr: - return &OptionalEncoder{}, nil - default: - return nil, fmt.Errorf("unsupported type: %v", typ) - } -} - -func createEncoderOfSimpleType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { - typeName := typ.String() - kind := typ.Kind() - switch kind { - case reflect.String: - if typeName != "string" { - return encoderOfType(cfg, reflect.TypeOf((*string)(nil)).Elem()) - } - return &stringCodec{}, nil - case reflect.Int: - if typeName != "int" { - return encoderOfType(cfg, reflect.TypeOf((*int)(nil)).Elem()) - } - return &intCodec{}, nil - case reflect.Int8: - if typeName != "int8" { - return encoderOfType(cfg, reflect.TypeOf((*int8)(nil)).Elem()) - } - return &int8Codec{}, nil - case reflect.Int16: - if typeName != "int16" { - return encoderOfType(cfg, reflect.TypeOf((*int16)(nil)).Elem()) - } - return &int16Codec{}, nil - case reflect.Int32: - if typeName != "int32" { - return encoderOfType(cfg, reflect.TypeOf((*int32)(nil)).Elem()) - } - return &int32Codec{}, nil - case reflect.Int64: - if typeName != "int64" { - return encoderOfType(cfg, reflect.TypeOf((*int64)(nil)).Elem()) - } - return &int64Codec{}, nil - case reflect.Uint: - if typeName != "uint" { - return encoderOfType(cfg, reflect.TypeOf((*uint)(nil)).Elem()) - } - return &uintCodec{}, nil - case reflect.Uint8: - if typeName != "uint8" { - return encoderOfType(cfg, reflect.TypeOf((*uint8)(nil)).Elem()) - } - return &uint8Codec{}, nil - case reflect.Uint16: - if typeName != "uint16" { - return encoderOfType(cfg, reflect.TypeOf((*uint16)(nil)).Elem()) - } - return &uint16Codec{}, nil - case reflect.Uint32: - if typeName != "uint32" { - return encoderOfType(cfg, reflect.TypeOf((*uint32)(nil)).Elem()) - } - return &uint32Codec{}, nil - case reflect.Uintptr: - if typeName != "uintptr" { - return encoderOfType(cfg, reflect.TypeOf((*uintptr)(nil)).Elem()) - } - return &uintptrCodec{}, nil - case reflect.Uint64: - if typeName != "uint64" { - return encoderOfType(cfg, reflect.TypeOf((*uint64)(nil)).Elem()) - } - return &uint64Codec{}, nil - case reflect.Float32: - if typeName != "float32" { - return encoderOfType(cfg, reflect.TypeOf((*float32)(nil)).Elem()) - } - return &float32Codec{}, nil - case reflect.Float64: - if typeName != "float64" { - return encoderOfType(cfg, reflect.TypeOf((*float64)(nil)).Elem()) - } - return &float64Codec{}, nil - case reflect.Bool: - if typeName != "bool" { - return encoderOfType(cfg, reflect.TypeOf((*bool)(nil)).Elem()) - } - return &boolCodec{}, nil - case reflect.Interface: - if typ.NumMethod() == 0 { - return &emptyInterfaceCodec{}, nil - } - return &nonEmptyInterfaceCodec{}, nil - case reflect.Struct: - return prefix(fmt.Sprintf("[%s]", typeName)).addToEncoder(encoderOfStruct(cfg, typ)) - case reflect.Array: - return prefix("[array]").addToEncoder(encoderOfArray(cfg, typ)) - case reflect.Slice: - return prefix("[slice]").addToEncoder(encoderOfSlice(cfg, typ)) - case reflect.Map: - return prefix("[map]").addToEncoder(encoderOfMap(cfg, typ)) - case reflect.Ptr: - return prefix("[optional]").addToEncoder(encoderOfOptional(cfg, typ)) - default: - return nil, fmt.Errorf("unsupported type: %v", typ) - } -} - -func decoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { - elemType := typ.Elem() - decoder, err := decoderOfType(cfg, elemType) - if err != nil { - return nil, err - } - return &OptionalDecoder{elemType, decoder}, nil -} - -func encoderOfOptional(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { - elemType := typ.Elem() - elemEncoder, err := encoderOfType(cfg, elemType) - if err != nil { - return nil, err - } - encoder := &OptionalEncoder{elemEncoder} - if elemType.Kind() == reflect.Map { - encoder = &OptionalEncoder{encoder} - } - return encoder, nil -} - -func decoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { - decoder, err := decoderOfType(cfg, typ.Elem()) - if err != nil { - return nil, err - } - mapInterface := reflect.New(typ).Interface() - return &mapDecoder{typ, typ.Key(), typ.Elem(), decoder, extractInterface(mapInterface)}, nil -} - -func extractInterface(val interface{}) emptyInterface { - return *((*emptyInterface)(unsafe.Pointer(&val))) -} - -func encoderOfMap(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { - elemType := typ.Elem() - encoder, err := encoderOfType(cfg, elemType) - if err != nil { - return nil, err - } - mapInterface := reflect.New(typ).Elem().Interface() - if cfg.sortMapKeys { - return &sortKeysMapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil - } - return &mapEncoder{typ, elemType, encoder, *((*emptyInterface)(unsafe.Pointer(&mapInterface)))}, nil -} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_array.go b/vendor/github.com/json-iterator/go/feature_reflect_array.go deleted file mode 100644 index d661fb6f..00000000 --- a/vendor/github.com/json-iterator/go/feature_reflect_array.go +++ /dev/null @@ -1,99 +0,0 @@ -package jsoniter - -import ( - "fmt" - "io" - "reflect" - "unsafe" -) - -func decoderOfArray(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { - decoder, err := decoderOfType(cfg, typ.Elem()) - if err != nil { - return nil, err - } - return &arrayDecoder{typ, typ.Elem(), decoder}, nil -} - -func encoderOfArray(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { - encoder, err := encoderOfType(cfg, typ.Elem()) - if err != nil { - return nil, err - } - if typ.Elem().Kind() == reflect.Map { - encoder = &OptionalEncoder{encoder} - } - return &arrayEncoder{typ, typ.Elem(), encoder}, nil -} - -type arrayEncoder struct { - arrayType reflect.Type - elemType reflect.Type - elemEncoder ValEncoder -} - -func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteArrayStart() - elemPtr := unsafe.Pointer(ptr) - encoder.elemEncoder.Encode(elemPtr, stream) - for i := 1; i < encoder.arrayType.Len(); i++ { - stream.WriteMore() - elemPtr = unsafe.Pointer(uintptr(elemPtr) + encoder.elemType.Size()) - encoder.elemEncoder.Encode(unsafe.Pointer(elemPtr), stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error()) - } -} - -func (encoder *arrayEncoder) EncodeInterface(val interface{}, stream *Stream) { - // special optimization for interface{} - e := (*emptyInterface)(unsafe.Pointer(&val)) - if e.word == nil { - stream.WriteArrayStart() - stream.WriteNil() - stream.WriteArrayEnd() - return - } - elemType := encoder.arrayType.Elem() - if encoder.arrayType.Len() == 1 && (elemType.Kind() == reflect.Ptr || elemType.Kind() == reflect.Map) { - ptr := uintptr(e.word) - e.word = unsafe.Pointer(&ptr) - } - if reflect.TypeOf(val).Kind() == reflect.Ptr { - encoder.Encode(unsafe.Pointer(&e.word), stream) - } else { - encoder.Encode(e.word, stream) - } -} - -func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type arrayDecoder struct { - arrayType reflect.Type - elemType reflect.Type - elemDecoder ValDecoder -} - -func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error()) - } -} - -func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - offset := uintptr(0) - iter.ReadArrayCB(func(iter *Iterator) bool { - if offset < decoder.arrayType.Size() { - decoder.elemDecoder.Decode(unsafe.Pointer(uintptr(ptr)+offset), iter) - offset += decoder.elemType.Size() - } else { - iter.Skip() - } - return true - }) -} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_map.go b/vendor/github.com/json-iterator/go/feature_reflect_map.go deleted file mode 100644 index 005671e0..00000000 --- a/vendor/github.com/json-iterator/go/feature_reflect_map.go +++ /dev/null @@ -1,244 +0,0 @@ -package jsoniter - -import ( - "encoding" - "encoding/json" - "reflect" - "sort" - "strconv" - "unsafe" -) - -type mapDecoder struct { - mapType reflect.Type - keyType reflect.Type - elemType reflect.Type - elemDecoder ValDecoder - mapInterface emptyInterface -} - -func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - // dark magic to cast unsafe.Pointer back to interface{} using reflect.Type - mapInterface := decoder.mapInterface - mapInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) - realVal := reflect.ValueOf(*realInterface).Elem() - if iter.ReadNil() { - realVal.Set(reflect.Zero(decoder.mapType)) - return - } - if realVal.IsNil() { - realVal.Set(reflect.MakeMap(realVal.Type())) - } - iter.ReadMapCB(func(iter *Iterator, keyStr string) bool { - elem := reflect.New(decoder.elemType) - decoder.elemDecoder.Decode(unsafe.Pointer(elem.Pointer()), iter) - // to put into map, we have to use reflection - keyType := decoder.keyType - // TODO: remove this from loop - switch { - case keyType.Kind() == reflect.String: - realVal.SetMapIndex(reflect.ValueOf(keyStr).Convert(keyType), elem.Elem()) - return true - case keyType.Implements(textUnmarshalerType): - textUnmarshaler := reflect.New(keyType.Elem()).Interface().(encoding.TextUnmarshaler) - err := textUnmarshaler.UnmarshalText([]byte(keyStr)) - if err != nil { - iter.ReportError("read map key as TextUnmarshaler", err.Error()) - return false - } - realVal.SetMapIndex(reflect.ValueOf(textUnmarshaler), elem.Elem()) - return true - case reflect.PtrTo(keyType).Implements(textUnmarshalerType): - textUnmarshaler := reflect.New(keyType).Interface().(encoding.TextUnmarshaler) - err := textUnmarshaler.UnmarshalText([]byte(keyStr)) - if err != nil { - iter.ReportError("read map key as TextUnmarshaler", err.Error()) - return false - } - realVal.SetMapIndex(reflect.ValueOf(textUnmarshaler).Elem(), elem.Elem()) - return true - default: - switch keyType.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - n, err := strconv.ParseInt(keyStr, 10, 64) - if err != nil || reflect.Zero(keyType).OverflowInt(n) { - iter.ReportError("read map key as int64", "read int64 failed") - return false - } - realVal.SetMapIndex(reflect.ValueOf(n).Convert(keyType), elem.Elem()) - return true - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - n, err := strconv.ParseUint(keyStr, 10, 64) - if err != nil || reflect.Zero(keyType).OverflowUint(n) { - iter.ReportError("read map key as uint64", "read uint64 failed") - return false - } - realVal.SetMapIndex(reflect.ValueOf(n).Convert(keyType), elem.Elem()) - return true - } - } - iter.ReportError("read map key", "unexpected map key type "+keyType.String()) - return true - }) -} - -type mapEncoder struct { - mapType reflect.Type - elemType reflect.Type - elemEncoder ValEncoder - mapInterface emptyInterface -} - -func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - mapInterface := encoder.mapInterface - mapInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) - realVal := reflect.ValueOf(*realInterface) - stream.WriteObjectStart() - for i, key := range realVal.MapKeys() { - if i != 0 { - stream.WriteMore() - } - encodeMapKey(key, stream) - if stream.indention > 0 { - stream.writeTwoBytes(byte(':'), byte(' ')) - } else { - stream.writeByte(':') - } - val := realVal.MapIndex(key).Interface() - encoder.elemEncoder.EncodeInterface(val, stream) - } - stream.WriteObjectEnd() -} - -func encodeMapKey(key reflect.Value, stream *Stream) { - if key.Kind() == reflect.String { - stream.WriteString(key.String()) - return - } - if tm, ok := key.Interface().(encoding.TextMarshaler); ok { - buf, err := tm.MarshalText() - if err != nil { - stream.Error = err - return - } - stream.writeByte('"') - stream.Write(buf) - stream.writeByte('"') - return - } - switch key.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - stream.writeByte('"') - stream.WriteInt64(key.Int()) - stream.writeByte('"') - return - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - stream.writeByte('"') - stream.WriteUint64(key.Uint()) - stream.writeByte('"') - return - } - stream.Error = &json.UnsupportedTypeError{Type: key.Type()} -} - -func (encoder *mapEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - mapInterface := encoder.mapInterface - mapInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) - realVal := reflect.ValueOf(*realInterface) - return realVal.Len() == 0 -} - -type sortKeysMapEncoder struct { - mapType reflect.Type - elemType reflect.Type - elemEncoder ValEncoder - mapInterface emptyInterface -} - -func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - mapInterface := encoder.mapInterface - mapInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) - realVal := reflect.ValueOf(*realInterface) - - // Extract and sort the keys. - keys := realVal.MapKeys() - sv := stringValues(make([]reflectWithString, len(keys))) - for i, v := range keys { - sv[i].v = v - if err := sv[i].resolve(); err != nil { - stream.Error = err - return - } - } - sort.Sort(sv) - - stream.WriteObjectStart() - for i, key := range sv { - if i != 0 { - stream.WriteMore() - } - stream.WriteVal(key.s) // might need html escape, so can not WriteString directly - if stream.indention > 0 { - stream.writeTwoBytes(byte(':'), byte(' ')) - } else { - stream.writeByte(':') - } - val := realVal.MapIndex(key.v).Interface() - encoder.elemEncoder.EncodeInterface(val, stream) - } - stream.WriteObjectEnd() -} - -// stringValues is a slice of reflect.Value holding *reflect.StringValue. -// It implements the methods to sort by string. -type stringValues []reflectWithString - -type reflectWithString struct { - v reflect.Value - s string -} - -func (w *reflectWithString) resolve() error { - if w.v.Kind() == reflect.String { - w.s = w.v.String() - return nil - } - if tm, ok := w.v.Interface().(encoding.TextMarshaler); ok { - buf, err := tm.MarshalText() - w.s = string(buf) - return err - } - switch w.v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - w.s = strconv.FormatInt(w.v.Int(), 10) - return nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - w.s = strconv.FormatUint(w.v.Uint(), 10) - return nil - } - return &json.UnsupportedTypeError{Type: w.v.Type()} -} - -func (sv stringValues) Len() int { return len(sv) } -func (sv stringValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } -func (sv stringValues) Less(i, j int) bool { return sv[i].s < sv[j].s } - -func (encoder *sortKeysMapEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - mapInterface := encoder.mapInterface - mapInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&mapInterface)) - realVal := reflect.ValueOf(*realInterface) - return realVal.Len() == 0 -} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_native.go b/vendor/github.com/json-iterator/go/feature_reflect_native.go deleted file mode 100644 index 95bd1e87..00000000 --- a/vendor/github.com/json-iterator/go/feature_reflect_native.go +++ /dev/null @@ -1,764 +0,0 @@ -package jsoniter - -import ( - "encoding" - "encoding/base64" - "encoding/json" - "reflect" - "unsafe" -) - -type stringCodec struct { -} - -func (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*string)(ptr)) = iter.ReadString() -} - -func (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - str := *((*string)(ptr)) - stream.WriteString(str) -} - -func (codec *stringCodec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*string)(ptr)) == "" -} - -type intCodec struct { -} - -func (codec *intCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int)(ptr)) = iter.ReadInt() - } -} - -func (codec *intCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt(*((*int)(ptr))) -} - -func (codec *intCodec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *intCodec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int)(ptr)) == 0 -} - -type uintptrCodec struct { -} - -func (codec *uintptrCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uintptr)(ptr)) = uintptr(iter.ReadUint64()) - } -} - -func (codec *uintptrCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint64(uint64(*((*uintptr)(ptr)))) -} - -func (codec *uintptrCodec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *uintptrCodec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uintptr)(ptr)) == 0 -} - -type int8Codec struct { -} - -func (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int8)(ptr)) = iter.ReadInt8() - } -} - -func (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt8(*((*int8)(ptr))) -} - -func (codec *int8Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int8)(ptr)) == 0 -} - -type int16Codec struct { -} - -func (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int16)(ptr)) = iter.ReadInt16() - } -} - -func (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt16(*((*int16)(ptr))) -} - -func (codec *int16Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int16)(ptr)) == 0 -} - -type int32Codec struct { -} - -func (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int32)(ptr)) = iter.ReadInt32() - } -} - -func (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt32(*((*int32)(ptr))) -} - -func (codec *int32Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int32)(ptr)) == 0 -} - -type int64Codec struct { -} - -func (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int64)(ptr)) = iter.ReadInt64() - } -} - -func (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt64(*((*int64)(ptr))) -} - -func (codec *int64Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int64)(ptr)) == 0 -} - -type uintCodec struct { -} - -func (codec *uintCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint)(ptr)) = iter.ReadUint() - return - } -} - -func (codec *uintCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint(*((*uint)(ptr))) -} - -func (codec *uintCodec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *uintCodec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint)(ptr)) == 0 -} - -type uint8Codec struct { -} - -func (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint8)(ptr)) = iter.ReadUint8() - } -} - -func (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint8(*((*uint8)(ptr))) -} - -func (codec *uint8Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint8)(ptr)) == 0 -} - -type uint16Codec struct { -} - -func (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint16)(ptr)) = iter.ReadUint16() - } -} - -func (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint16(*((*uint16)(ptr))) -} - -func (codec *uint16Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint16)(ptr)) == 0 -} - -type uint32Codec struct { -} - -func (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint32)(ptr)) = iter.ReadUint32() - } -} - -func (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint32(*((*uint32)(ptr))) -} - -func (codec *uint32Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint32)(ptr)) == 0 -} - -type uint64Codec struct { -} - -func (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint64)(ptr)) = iter.ReadUint64() - } -} - -func (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint64(*((*uint64)(ptr))) -} - -func (codec *uint64Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint64)(ptr)) == 0 -} - -type float32Codec struct { -} - -func (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float32)(ptr)) = iter.ReadFloat32() - } -} - -func (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat32(*((*float32)(ptr))) -} - -func (codec *float32Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float32)(ptr)) == 0 -} - -type float64Codec struct { -} - -func (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float64)(ptr)) = iter.ReadFloat64() - } -} - -func (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat64(*((*float64)(ptr))) -} - -func (codec *float64Codec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float64)(ptr)) == 0 -} - -type boolCodec struct { -} - -func (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*bool)(ptr)) = iter.ReadBool() - } -} - -func (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteBool(*((*bool)(ptr))) -} - -func (codec *boolCodec) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, codec) -} - -func (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool { - return !(*((*bool)(ptr))) -} - -type emptyInterfaceCodec struct { -} - -func (codec *emptyInterfaceCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - existing := *((*interface{})(ptr)) - - // Checking for both typed and untyped nil pointers. - if existing != nil && - reflect.TypeOf(existing).Kind() == reflect.Ptr && - !reflect.ValueOf(existing).IsNil() { - - var ptrToExisting interface{} - for { - elem := reflect.ValueOf(existing).Elem() - if elem.Kind() != reflect.Ptr || elem.IsNil() { - break - } - ptrToExisting = existing - existing = elem.Interface() - } - - if iter.ReadNil() { - if ptrToExisting != nil { - nilPtr := reflect.Zero(reflect.TypeOf(ptrToExisting).Elem()) - reflect.ValueOf(ptrToExisting).Elem().Set(nilPtr) - } else { - *((*interface{})(ptr)) = nil - } - } else { - iter.ReadVal(existing) - } - - return - } - - if iter.ReadNil() { - *((*interface{})(ptr)) = nil - } else { - *((*interface{})(ptr)) = iter.Read() - } -} - -func (codec *emptyInterfaceCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteVal(*((*interface{})(ptr))) -} - -func (codec *emptyInterfaceCodec) EncodeInterface(val interface{}, stream *Stream) { - stream.WriteVal(val) -} - -func (codec *emptyInterfaceCodec) IsEmpty(ptr unsafe.Pointer) bool { - emptyInterface := (*emptyInterface)(ptr) - return emptyInterface.typ == nil -} - -type nonEmptyInterfaceCodec struct { -} - -func (codec *nonEmptyInterfaceCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - nonEmptyInterface := (*nonEmptyInterface)(ptr) - if nonEmptyInterface.itab == nil { - iter.ReportError("read non-empty interface", "do not know which concrete type to decode to") - return - } - var i interface{} - e := (*emptyInterface)(unsafe.Pointer(&i)) - e.typ = nonEmptyInterface.itab.typ - e.word = nonEmptyInterface.word - iter.ReadVal(&i) - if e.word == nil { - nonEmptyInterface.itab = nil - } - nonEmptyInterface.word = e.word -} - -func (codec *nonEmptyInterfaceCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - nonEmptyInterface := (*nonEmptyInterface)(ptr) - var i interface{} - if nonEmptyInterface.itab != nil { - e := (*emptyInterface)(unsafe.Pointer(&i)) - e.typ = nonEmptyInterface.itab.typ - e.word = nonEmptyInterface.word - } - stream.WriteVal(i) -} - -func (codec *nonEmptyInterfaceCodec) EncodeInterface(val interface{}, stream *Stream) { - stream.WriteVal(val) -} - -func (codec *nonEmptyInterfaceCodec) IsEmpty(ptr unsafe.Pointer) bool { - nonEmptyInterface := (*nonEmptyInterface)(ptr) - return nonEmptyInterface.word == nil -} - -type anyCodec struct { -} - -func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*Any)(ptr)) = iter.ReadAny() -} - -func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - (*((*Any)(ptr))).WriteTo(stream) -} - -func (codec *anyCodec) EncodeInterface(val interface{}, stream *Stream) { - (val.(Any)).WriteTo(stream) -} - -func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { - return (*((*Any)(ptr))).Size() == 0 -} - -type jsonNumberCodec struct { -} - -func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*json.Number)(ptr)) = json.Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*json.Number)(ptr)) = "" - default: - *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*json.Number)(ptr)))) -} - -func (codec *jsonNumberCodec) EncodeInterface(val interface{}, stream *Stream) { - stream.WriteRaw(string(val.(json.Number))) -} - -func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.Number)(ptr))) == 0 -} - -type jsoniterNumberCodec struct { -} - -func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*Number)(ptr)) = Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*Number)(ptr)) = "" - default: - *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*Number)(ptr)))) -} - -func (codec *jsoniterNumberCodec) EncodeInterface(val interface{}, stream *Stream) { - stream.WriteRaw(string(val.(Number))) -} - -func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*Number)(ptr))) == 0 -} - -type jsonRawMessageCodec struct { -} - -func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) -} - -func (codec *jsonRawMessageCodec) EncodeInterface(val interface{}, stream *Stream) { - stream.WriteRaw(string(val.(json.RawMessage))) -} - -func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.RawMessage)(ptr))) == 0 -} - -type jsoniterRawMessageCodec struct { -} - -func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*RawMessage)(ptr)))) -} - -func (codec *jsoniterRawMessageCodec) EncodeInterface(val interface{}, stream *Stream) { - stream.WriteRaw(string(val.(RawMessage))) -} - -func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*RawMessage)(ptr))) == 0 -} - -type base64Codec struct { - sliceDecoder ValDecoder -} - -func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - ptrSlice := (*sliceHeader)(ptr) - ptrSlice.Len = 0 - ptrSlice.Cap = 0 - ptrSlice.Data = nil - return - } - switch iter.WhatIsNext() { - case StringValue: - encoding := base64.StdEncoding - src := iter.SkipAndReturnBytes() - src = src[1 : len(src)-1] - decodedLen := encoding.DecodedLen(len(src)) - dst := make([]byte, decodedLen) - len, err := encoding.Decode(dst, src) - if err != nil { - iter.ReportError("decode base64", err.Error()) - } else { - dst = dst[:len] - dstSlice := (*sliceHeader)(unsafe.Pointer(&dst)) - ptrSlice := (*sliceHeader)(ptr) - ptrSlice.Data = dstSlice.Data - ptrSlice.Cap = dstSlice.Cap - ptrSlice.Len = dstSlice.Len - } - case ArrayValue: - codec.sliceDecoder.Decode(ptr, iter) - default: - iter.ReportError("base64Codec", "invalid input") - } -} - -func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - src := *((*[]byte)(ptr)) - if len(src) == 0 { - stream.WriteNil() - return - } - encoding := base64.StdEncoding - stream.writeByte('"') - toGrow := encoding.EncodedLen(len(src)) - stream.ensure(toGrow) - encoding.Encode(stream.buf[stream.n:], src) - stream.n += toGrow - stream.writeByte('"') -} - -func (codec *base64Codec) EncodeInterface(val interface{}, stream *Stream) { - ptr := extractInterface(val).word - src := *((*[]byte)(ptr)) - if len(src) == 0 { - stream.WriteNil() - return - } - encoding := base64.StdEncoding - stream.writeByte('"') - toGrow := encoding.EncodedLen(len(src)) - stream.ensure(toGrow) - encoding.Encode(stream.buf[stream.n:], src) - stream.n += toGrow - stream.writeByte('"') -} - -func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*[]byte)(ptr))) == 0 -} - -type stringModeNumberDecoder struct { - elemDecoder ValDecoder -} - -func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return - } - decoder.elemDecoder.Decode(ptr, iter) - if iter.Error != nil { - return - } - c = iter.readByte() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return - } -} - -type stringModeStringDecoder struct { - elemDecoder ValDecoder - cfg *frozenConfig -} - -func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.elemDecoder.Decode(ptr, iter) - str := *((*string)(ptr)) - tempIter := decoder.cfg.BorrowIterator([]byte(str)) - defer decoder.cfg.ReturnIterator(tempIter) - *((*string)(ptr)) = tempIter.ReadString() -} - -type stringModeNumberEncoder struct { - elemEncoder ValEncoder -} - -func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.writeByte('"') - encoder.elemEncoder.Encode(ptr, stream) - stream.writeByte('"') -} - -func (encoder *stringModeNumberEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) -} - -type stringModeStringEncoder struct { - elemEncoder ValEncoder - cfg *frozenConfig -} - -func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - tempStream := encoder.cfg.BorrowStream(nil) - defer encoder.cfg.ReturnStream(tempStream) - encoder.elemEncoder.Encode(ptr, tempStream) - stream.WriteString(string(tempStream.Buffer())) -} - -func (encoder *stringModeStringEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) -} - -type marshalerEncoder struct { - templateInterface emptyInterface - checkIsEmpty checkIsEmpty -} - -func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - templateInterface := encoder.templateInterface - templateInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) - marshaler, ok := (*realInterface).(json.Marshaler) - if !ok { - stream.WriteVal(nil) - return - } - - bytes, err := marshaler.MarshalJSON() - if err != nil { - stream.Error = err - } else { - stream.Write(bytes) - } -} -func (encoder *marshalerEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type textMarshalerEncoder struct { - templateInterface emptyInterface - checkIsEmpty checkIsEmpty -} - -func (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - templateInterface := encoder.templateInterface - templateInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) - marshaler := (*realInterface).(encoding.TextMarshaler) - bytes, err := marshaler.MarshalText() - if err != nil { - stream.Error = err - } else { - stream.WriteString(string(bytes)) - } -} - -func (encoder *textMarshalerEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type unmarshalerDecoder struct { - templateInterface emptyInterface -} - -func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - templateInterface := decoder.templateInterface - templateInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) - unmarshaler := (*realInterface).(json.Unmarshaler) - iter.nextToken() - iter.unreadByte() // skip spaces - bytes := iter.SkipAndReturnBytes() - err := unmarshaler.UnmarshalJSON(bytes) - if err != nil { - iter.ReportError("unmarshalerDecoder", err.Error()) - } -} - -type textUnmarshalerDecoder struct { - templateInterface emptyInterface -} - -func (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - templateInterface := decoder.templateInterface - templateInterface.word = ptr - realInterface := (*interface{})(unsafe.Pointer(&templateInterface)) - unmarshaler := (*realInterface).(encoding.TextUnmarshaler) - str := iter.ReadString() - err := unmarshaler.UnmarshalText([]byte(str)) - if err != nil { - iter.ReportError("textUnmarshalerDecoder", err.Error()) - } -} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_slice.go b/vendor/github.com/json-iterator/go/feature_reflect_slice.go deleted file mode 100644 index 51a8daec..00000000 --- a/vendor/github.com/json-iterator/go/feature_reflect_slice.go +++ /dev/null @@ -1,147 +0,0 @@ -package jsoniter - -import ( - "fmt" - "io" - "reflect" - "unsafe" -) - -func decoderOfSlice(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { - decoder, err := decoderOfType(cfg, typ.Elem()) - if err != nil { - return nil, err - } - return &sliceDecoder{typ, typ.Elem(), decoder}, nil -} - -func encoderOfSlice(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { - encoder, err := encoderOfType(cfg, typ.Elem()) - if err != nil { - return nil, err - } - if typ.Elem().Kind() == reflect.Map { - encoder = &OptionalEncoder{encoder} - } - return &sliceEncoder{typ, typ.Elem(), encoder}, nil -} - -type sliceEncoder struct { - sliceType reflect.Type - elemType reflect.Type - elemEncoder ValEncoder -} - -func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - slice := (*sliceHeader)(ptr) - if slice.Data == nil { - stream.WriteNil() - return - } - if slice.Len == 0 { - stream.WriteEmptyArray() - return - } - stream.WriteArrayStart() - elemPtr := unsafe.Pointer(slice.Data) - encoder.elemEncoder.Encode(unsafe.Pointer(elemPtr), stream) - for i := 1; i < slice.Len; i++ { - stream.WriteMore() - elemPtr = unsafe.Pointer(uintptr(elemPtr) + encoder.elemType.Size()) - encoder.elemEncoder.Encode(unsafe.Pointer(elemPtr), stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.sliceType, stream.Error.Error()) - } -} - -func (encoder *sliceEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - -func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - slice := (*sliceHeader)(ptr) - return slice.Len == 0 -} - -type sliceDecoder struct { - sliceType reflect.Type - elemType reflect.Type - elemDecoder ValDecoder -} - -// sliceHeader is a safe version of SliceHeader used within this package. -type sliceHeader struct { - Data unsafe.Pointer - Len int - Cap int -} - -func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error()) - } -} - -func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - slice := (*sliceHeader)(ptr) - if iter.ReadNil() { - slice.Len = 0 - slice.Cap = 0 - slice.Data = nil - return - } - reuseSlice(slice, decoder.sliceType, 4) - slice.Len = 0 - offset := uintptr(0) - iter.ReadArrayCB(func(iter *Iterator) bool { - growOne(slice, decoder.sliceType, decoder.elemType) - decoder.elemDecoder.Decode(unsafe.Pointer(uintptr(slice.Data)+offset), iter) - offset += decoder.elemType.Size() - return true - }) -} - -// grow grows the slice s so that it can hold extra more values, allocating -// more capacity if needed. It also returns the old and new slice lengths. -func growOne(slice *sliceHeader, sliceType reflect.Type, elementType reflect.Type) { - newLen := slice.Len + 1 - if newLen <= slice.Cap { - slice.Len = newLen - return - } - newCap := slice.Cap - if newCap == 0 { - newCap = 1 - } else { - for newCap < newLen { - if slice.Len < 1024 { - newCap += newCap - } else { - newCap += newCap / 4 - } - } - } - newVal := reflect.MakeSlice(sliceType, newLen, newCap) - dst := unsafe.Pointer(newVal.Pointer()) - // copy old array into new array - originalBytesCount := slice.Len * int(elementType.Size()) - srcSliceHeader := (unsafe.Pointer)(&sliceHeader{slice.Data, originalBytesCount, originalBytesCount}) - dstSliceHeader := (unsafe.Pointer)(&sliceHeader{dst, originalBytesCount, originalBytesCount}) - copy(*(*[]byte)(dstSliceHeader), *(*[]byte)(srcSliceHeader)) - slice.Data = dst - slice.Len = newLen - slice.Cap = newCap -} - -func reuseSlice(slice *sliceHeader, sliceType reflect.Type, expectedCap int) { - if expectedCap <= slice.Cap { - return - } - newVal := reflect.MakeSlice(sliceType, 0, expectedCap) - dst := unsafe.Pointer(newVal.Pointer()) - slice.Data = dst - slice.Cap = expectedCap -} diff --git a/vendor/github.com/json-iterator/go/feature_stream_int.go b/vendor/github.com/json-iterator/go/feature_stream_int.go deleted file mode 100644 index 7cfd522c..00000000 --- a/vendor/github.com/json-iterator/go/feature_stream_int.go +++ /dev/null @@ -1,320 +0,0 @@ -package jsoniter - -var digits []uint32 - -func init() { - digits = make([]uint32, 1000) - for i := uint32(0); i < 1000; i++ { - digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' - if i < 10 { - digits[i] += 2 << 24 - } else if i < 100 { - digits[i] += 1 << 24 - } - } -} - -func writeFirstBuf(buf []byte, v uint32, n int) int { - start := v >> 24 - if start == 0 { - buf[n] = byte(v >> 16) - n++ - buf[n] = byte(v >> 8) - n++ - } else if start == 1 { - buf[n] = byte(v >> 8) - n++ - } - buf[n] = byte(v) - n++ - return n -} - -func writeBuf(buf []byte, v uint32, n int) { - buf[n] = byte(v >> 16) - buf[n+1] = byte(v >> 8) - buf[n+2] = byte(v) -} - -// WriteUint8 write uint8 to stream -func (stream *Stream) WriteUint8(val uint8) { - stream.ensure(3) - stream.n = writeFirstBuf(stream.buf, digits[val], stream.n) -} - -// WriteInt8 write int8 to stream -func (stream *Stream) WriteInt8(nval int8) { - stream.ensure(4) - n := stream.n - var val uint8 - if nval < 0 { - val = uint8(-nval) - stream.buf[n] = '-' - n++ - } else { - val = uint8(nval) - } - stream.n = writeFirstBuf(stream.buf, digits[val], n) -} - -// WriteUint16 write uint16 to stream -func (stream *Stream) WriteUint16(val uint16) { - stream.ensure(5) - q1 := val / 1000 - if q1 == 0 { - stream.n = writeFirstBuf(stream.buf, digits[val], stream.n) - return - } - r1 := val - q1*1000 - n := writeFirstBuf(stream.buf, digits[q1], stream.n) - writeBuf(stream.buf, digits[r1], n) - stream.n = n + 3 - return -} - -// WriteInt16 write int16 to stream -func (stream *Stream) WriteInt16(nval int16) { - stream.ensure(6) - n := stream.n - var val uint16 - if nval < 0 { - val = uint16(-nval) - stream.buf[n] = '-' - n++ - } else { - val = uint16(nval) - } - q1 := val / 1000 - if q1 == 0 { - stream.n = writeFirstBuf(stream.buf, digits[val], n) - return - } - r1 := val - q1*1000 - n = writeFirstBuf(stream.buf, digits[q1], n) - writeBuf(stream.buf, digits[r1], n) - stream.n = n + 3 - return -} - -// WriteUint32 write uint32 to stream -func (stream *Stream) WriteUint32(val uint32) { - stream.ensure(10) - n := stream.n - q1 := val / 1000 - if q1 == 0 { - stream.n = writeFirstBuf(stream.buf, digits[val], n) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - n := writeFirstBuf(stream.buf, digits[q1], n) - writeBuf(stream.buf, digits[r1], n) - stream.n = n + 3 - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - n = writeFirstBuf(stream.buf, digits[q2], n) - } else { - r3 := q2 - q3*1000 - stream.buf[n] = byte(q3 + '0') - n++ - writeBuf(stream.buf, digits[r3], n) - n += 3 - } - writeBuf(stream.buf, digits[r2], n) - writeBuf(stream.buf, digits[r1], n+3) - stream.n = n + 6 -} - -// WriteInt32 write int32 to stream -func (stream *Stream) WriteInt32(nval int32) { - stream.ensure(11) - n := stream.n - var val uint32 - if nval < 0 { - val = uint32(-nval) - stream.buf[n] = '-' - n++ - } else { - val = uint32(nval) - } - q1 := val / 1000 - if q1 == 0 { - stream.n = writeFirstBuf(stream.buf, digits[val], n) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - n := writeFirstBuf(stream.buf, digits[q1], n) - writeBuf(stream.buf, digits[r1], n) - stream.n = n + 3 - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - n = writeFirstBuf(stream.buf, digits[q2], n) - } else { - r3 := q2 - q3*1000 - stream.buf[n] = byte(q3 + '0') - n++ - writeBuf(stream.buf, digits[r3], n) - n += 3 - } - writeBuf(stream.buf, digits[r2], n) - writeBuf(stream.buf, digits[r1], n+3) - stream.n = n + 6 -} - -// WriteUint64 write uint64 to stream -func (stream *Stream) WriteUint64(val uint64) { - stream.ensure(20) - n := stream.n - q1 := val / 1000 - if q1 == 0 { - stream.n = writeFirstBuf(stream.buf, digits[val], n) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - n := writeFirstBuf(stream.buf, digits[q1], n) - writeBuf(stream.buf, digits[r1], n) - stream.n = n + 3 - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - n = writeFirstBuf(stream.buf, digits[q2], n) - writeBuf(stream.buf, digits[r2], n) - writeBuf(stream.buf, digits[r1], n+3) - stream.n = n + 6 - return - } - r3 := q2 - q3*1000 - q4 := q3 / 1000 - if q4 == 0 { - n = writeFirstBuf(stream.buf, digits[q3], n) - writeBuf(stream.buf, digits[r3], n) - writeBuf(stream.buf, digits[r2], n+3) - writeBuf(stream.buf, digits[r1], n+6) - stream.n = n + 9 - return - } - r4 := q3 - q4*1000 - q5 := q4 / 1000 - if q5 == 0 { - n = writeFirstBuf(stream.buf, digits[q4], n) - writeBuf(stream.buf, digits[r4], n) - writeBuf(stream.buf, digits[r3], n+3) - writeBuf(stream.buf, digits[r2], n+6) - writeBuf(stream.buf, digits[r1], n+9) - stream.n = n + 12 - return - } - r5 := q4 - q5*1000 - q6 := q5 / 1000 - if q6 == 0 { - n = writeFirstBuf(stream.buf, digits[q5], n) - } else { - n = writeFirstBuf(stream.buf, digits[q6], n) - r6 := q5 - q6*1000 - writeBuf(stream.buf, digits[r6], n) - n += 3 - } - writeBuf(stream.buf, digits[r5], n) - writeBuf(stream.buf, digits[r4], n+3) - writeBuf(stream.buf, digits[r3], n+6) - writeBuf(stream.buf, digits[r2], n+9) - writeBuf(stream.buf, digits[r1], n+12) - stream.n = n + 15 -} - -// WriteInt64 write int64 to stream -func (stream *Stream) WriteInt64(nval int64) { - stream.ensure(20) - n := stream.n - var val uint64 - if nval < 0 { - val = uint64(-nval) - stream.buf[n] = '-' - n++ - } else { - val = uint64(nval) - } - q1 := val / 1000 - if q1 == 0 { - stream.n = writeFirstBuf(stream.buf, digits[val], n) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - n := writeFirstBuf(stream.buf, digits[q1], n) - writeBuf(stream.buf, digits[r1], n) - stream.n = n + 3 - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - n = writeFirstBuf(stream.buf, digits[q2], n) - writeBuf(stream.buf, digits[r2], n) - writeBuf(stream.buf, digits[r1], n+3) - stream.n = n + 6 - return - } - r3 := q2 - q3*1000 - q4 := q3 / 1000 - if q4 == 0 { - n = writeFirstBuf(stream.buf, digits[q3], n) - writeBuf(stream.buf, digits[r3], n) - writeBuf(stream.buf, digits[r2], n+3) - writeBuf(stream.buf, digits[r1], n+6) - stream.n = n + 9 - return - } - r4 := q3 - q4*1000 - q5 := q4 / 1000 - if q5 == 0 { - n = writeFirstBuf(stream.buf, digits[q4], n) - writeBuf(stream.buf, digits[r4], n) - writeBuf(stream.buf, digits[r3], n+3) - writeBuf(stream.buf, digits[r2], n+6) - writeBuf(stream.buf, digits[r1], n+9) - stream.n = n + 12 - return - } - r5 := q4 - q5*1000 - q6 := q5 / 1000 - if q6 == 0 { - n = writeFirstBuf(stream.buf, digits[q5], n) - } else { - stream.buf[n] = byte(q6 + '0') - n++ - r6 := q5 - q6*1000 - writeBuf(stream.buf, digits[r6], n) - n += 3 - } - writeBuf(stream.buf, digits[r5], n) - writeBuf(stream.buf, digits[r4], n+3) - writeBuf(stream.buf, digits[r3], n+6) - writeBuf(stream.buf, digits[r2], n+9) - writeBuf(stream.buf, digits[r1], n+12) - stream.n = n + 15 -} - -// WriteInt write int to stream -func (stream *Stream) WriteInt(val int) { - stream.WriteInt64(int64(val)) -} - -// WriteUint write uint to stream -func (stream *Stream) WriteUint(val uint) { - stream.WriteUint64(uint64(val)) -} diff --git a/vendor/github.com/json-iterator/go/feature_iter.go b/vendor/github.com/json-iterator/go/iter.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_iter.go rename to vendor/github.com/json-iterator/go/iter.go diff --git a/vendor/github.com/json-iterator/go/feature_iter_array.go b/vendor/github.com/json-iterator/go/iter_array.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_iter_array.go rename to vendor/github.com/json-iterator/go/iter_array.go diff --git a/vendor/github.com/json-iterator/go/feature_iter_float.go b/vendor/github.com/json-iterator/go/iter_float.go similarity index 98% rename from vendor/github.com/json-iterator/go/feature_iter_float.go rename to vendor/github.com/json-iterator/go/iter_float.go index 86f45991..4f883c09 100644 --- a/vendor/github.com/json-iterator/go/feature_iter_float.go +++ b/vendor/github.com/json-iterator/go/iter_float.go @@ -1,6 +1,7 @@ package jsoniter import ( + "encoding/json" "io" "math/big" "strconv" @@ -339,3 +340,8 @@ func validateFloat(str string) string { } return "" } + +// ReadNumber read json.Number +func (iter *Iterator) ReadNumber() (ret json.Number) { + return json.Number(iter.readNumberAsString()) +} diff --git a/vendor/github.com/json-iterator/go/feature_iter_int.go b/vendor/github.com/json-iterator/go/iter_int.go similarity index 98% rename from vendor/github.com/json-iterator/go/feature_iter_int.go rename to vendor/github.com/json-iterator/go/iter_int.go index 4781c639..21423203 100644 --- a/vendor/github.com/json-iterator/go/feature_iter_int.go +++ b/vendor/github.com/json-iterator/go/iter_int.go @@ -22,11 +22,17 @@ func init() { // ReadUint read uint func (iter *Iterator) ReadUint() uint { + if strconv.IntSize == 32 { + return uint(iter.ReadUint32()) + } return uint(iter.ReadUint64()) } // ReadInt read int func (iter *Iterator) ReadInt() int { + if strconv.IntSize == 32 { + return int(iter.ReadInt32()) + } return int(iter.ReadInt64()) } diff --git a/vendor/github.com/json-iterator/go/feature_iter_object.go b/vendor/github.com/json-iterator/go/iter_object.go similarity index 68% rename from vendor/github.com/json-iterator/go/feature_iter_object.go rename to vendor/github.com/json-iterator/go/iter_object.go index dfd91fa6..ebd3da89 100644 --- a/vendor/github.com/json-iterator/go/feature_iter_object.go +++ b/vendor/github.com/json-iterator/go/iter_object.go @@ -3,7 +3,6 @@ package jsoniter import ( "fmt" "unicode" - "unsafe" ) // ReadObject read one field from object. @@ -19,26 +18,6 @@ func (iter *Iterator) ReadObject() (ret string) { c = iter.nextToken() if c == '"' { iter.unreadByte() - if iter.cfg.objectFieldMustBeSimpleString { - return string(iter.readObjectFieldAsBytes()) - } else { - field := iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - return field - } - } - if c == '}' { - return "" // end of object - } - iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c})) - return - case ',': - if iter.cfg.objectFieldMustBeSimpleString { - return string(iter.readObjectFieldAsBytes()) - } else { field := iter.ReadString() c = iter.nextToken() if c != ':' { @@ -46,6 +25,18 @@ func (iter *Iterator) ReadObject() (ret string) { } return field } + if c == '}' { + return "" // end of object + } + iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c})) + return + case ',': + field := iter.ReadString() + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) + } + return field case '}': return "" // end of object default: @@ -54,97 +45,87 @@ func (iter *Iterator) ReadObject() (ret string) { } } -func (iter *Iterator) readFieldHash() int32 { +// CaseInsensitive +func (iter *Iterator) readFieldHash() int64 { hash := int64(0x811c9dc5) c := iter.nextToken() - if c == '"' { - for { - for i := iter.head; i < iter.tail; i++ { - // require ascii string and no escape - b := iter.buf[i] - if !iter.cfg.objectFieldMustBeSimpleString && b == '\\' { - iter.head = i - for _, b := range iter.readStringSlowPath() { - if 'A' <= b && b <= 'Z' { - b += 'a' - 'A' - } - hash ^= int64(b) - hash *= 0x1000193 + if c != '"' { + iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c})) + return 0 + } + for { + for i := iter.head; i < iter.tail; i++ { + // require ascii string and no escape + b := iter.buf[i] + if b == '\\' { + iter.head = i + for _, b := range iter.readStringSlowPath() { + if 'A' <= b && b <= 'Z' { + b += 'a' - 'A' } - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 - } - return int32(hash) + hash ^= int64(b) + hash *= 0x1000193 } - if b == '"' { - iter.head = i + 1 - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 - } - return int32(hash) + c = iter.nextToken() + if c != ':' { + iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) + return 0 } - if 'A' <= b && b <= 'Z' { - b += 'a' - 'A' - } - hash ^= int64(b) - hash *= 0x1000193 + return hash } - if !iter.loadMore() { - iter.ReportError("readFieldHash", `incomplete field name`) - return 0 + if b == '"' { + iter.head = i + 1 + c = iter.nextToken() + if c != ':' { + iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) + return 0 + } + return hash } + if 'A' <= b && b <= 'Z' { + b += 'a' - 'A' + } + hash ^= int64(b) + hash *= 0x1000193 + } + if !iter.loadMore() { + iter.ReportError("readFieldHash", `incomplete field name`) + return 0 } } - iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c})) - return 0 } -func calcHash(str string) int32 { +func calcHash(str string) int64 { hash := int64(0x811c9dc5) for _, b := range str { hash ^= int64(unicode.ToLower(b)) hash *= 0x1000193 } - return int32(hash) + return int64(hash) } // ReadObjectCB read object with callback, the key is ascii only and field name not copied func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { c := iter.nextToken() - var fieldBytes []byte var field string if c == '{' { c = iter.nextToken() if c == '"' { iter.unreadByte() - if iter.cfg.objectFieldMustBeSimpleString { - fieldBytes = iter.readObjectFieldAsBytes() - field = *(*string)(unsafe.Pointer(&fieldBytes)) - } else { - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } + field = iter.ReadString() + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) } if !callback(iter, field) { return false } c = iter.nextToken() for c == ',' { - if iter.cfg.objectFieldMustBeSimpleString { - fieldBytes = iter.readObjectFieldAsBytes() - field = *(*string)(unsafe.Pointer(&fieldBytes)) - } else { - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } + field = iter.ReadString() + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) } if !callback(iter, field) { return false diff --git a/vendor/github.com/json-iterator/go/feature_iter_skip.go b/vendor/github.com/json-iterator/go/iter_skip.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_iter_skip.go rename to vendor/github.com/json-iterator/go/iter_skip.go diff --git a/vendor/github.com/json-iterator/go/feature_iter_skip_sloppy.go b/vendor/github.com/json-iterator/go/iter_skip_sloppy.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_iter_skip_sloppy.go rename to vendor/github.com/json-iterator/go/iter_skip_sloppy.go diff --git a/vendor/github.com/json-iterator/go/feature_iter_skip_strict.go b/vendor/github.com/json-iterator/go/iter_skip_strict.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_iter_skip_strict.go rename to vendor/github.com/json-iterator/go/iter_skip_strict.go diff --git a/vendor/github.com/json-iterator/go/feature_iter_string.go b/vendor/github.com/json-iterator/go/iter_str.go similarity index 100% rename from vendor/github.com/json-iterator/go/feature_iter_string.go rename to vendor/github.com/json-iterator/go/iter_str.go diff --git a/vendor/github.com/json-iterator/go/feature_pool.go b/vendor/github.com/json-iterator/go/pool.go similarity index 64% rename from vendor/github.com/json-iterator/go/feature_pool.go rename to vendor/github.com/json-iterator/go/pool.go index 52d38e68..e2389b56 100644 --- a/vendor/github.com/json-iterator/go/feature_pool.go +++ b/vendor/github.com/json-iterator/go/pool.go @@ -17,43 +17,26 @@ type StreamPool interface { } func (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream { - select { - case stream := <-cfg.streamPool: - stream.Reset(writer) - return stream - default: - return NewStream(cfg, writer, 512) - } + stream := cfg.streamPool.Get().(*Stream) + stream.Reset(writer) + return stream } func (cfg *frozenConfig) ReturnStream(stream *Stream) { + stream.out = nil stream.Error = nil stream.Attachment = nil - select { - case cfg.streamPool <- stream: - return - default: - return - } + cfg.streamPool.Put(stream) } func (cfg *frozenConfig) BorrowIterator(data []byte) *Iterator { - select { - case iter := <-cfg.iteratorPool: - iter.ResetBytes(data) - return iter - default: - return ParseBytes(cfg, data) - } + iter := cfg.iteratorPool.Get().(*Iterator) + iter.ResetBytes(data) + return iter } func (cfg *frozenConfig) ReturnIterator(iter *Iterator) { iter.Error = nil iter.Attachment = nil - select { - case cfg.iteratorPool <- iter: - return - default: - return - } + cfg.iteratorPool.Put(iter) } diff --git a/vendor/github.com/json-iterator/go/reflect.go b/vendor/github.com/json-iterator/go/reflect.go new file mode 100644 index 00000000..5c7d3a8a --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect.go @@ -0,0 +1,321 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "reflect" + "unsafe" +) + +// ValDecoder is an internal type registered to cache as needed. +// Don't confuse jsoniter.ValDecoder with json.Decoder. +// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link). +// +// Reflection on type to create decoders, which is then cached +// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions +// 1. create instance of new value, for example *int will need a int to be allocated +// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New +// 3. assignment to map, both key and value will be reflect.Value +// For a simple struct binding, it will be reflect.Value free and allocation free +type ValDecoder interface { + Decode(ptr unsafe.Pointer, iter *Iterator) +} + +// ValEncoder is an internal type registered to cache as needed. +// Don't confuse jsoniter.ValEncoder with json.Encoder. +// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link). +type ValEncoder interface { + IsEmpty(ptr unsafe.Pointer) bool + Encode(ptr unsafe.Pointer, stream *Stream) +} + +type checkIsEmpty interface { + IsEmpty(ptr unsafe.Pointer) bool +} + +type ctx struct { + *frozenConfig + prefix string + encoders map[reflect2.Type]ValEncoder + decoders map[reflect2.Type]ValDecoder +} + +func (b *ctx) append(prefix string) *ctx { + return &ctx{ + frozenConfig: b.frozenConfig, + prefix: b.prefix + " " + prefix, + encoders: b.encoders, + decoders: b.decoders, + } +} + +// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal +func (iter *Iterator) ReadVal(obj interface{}) { + cacheKey := reflect2.RTypeOf(obj) + decoder := iter.cfg.getDecoderFromCache(cacheKey) + if decoder == nil { + typ := reflect2.TypeOf(obj) + if typ.Kind() != reflect.Ptr { + iter.ReportError("ReadVal", "can only unmarshal into pointer") + return + } + decoder = iter.cfg.DecoderOf(typ) + } + ptr := reflect2.PtrOf(obj) + if ptr == nil { + iter.ReportError("ReadVal", "can not read into nil pointer") + return + } + decoder.Decode(ptr, iter) +} + +// WriteVal copy the go interface into underlying JSON, same as json.Marshal +func (stream *Stream) WriteVal(val interface{}) { + if nil == val { + stream.WriteNil() + return + } + cacheKey := reflect2.RTypeOf(val) + encoder := stream.cfg.getEncoderFromCache(cacheKey) + if encoder == nil { + typ := reflect2.TypeOf(val) + encoder = stream.cfg.EncoderOf(typ) + } + encoder.Encode(reflect2.PtrOf(val), stream) +} + +func (cfg *frozenConfig) DecoderOf(typ reflect2.Type) ValDecoder { + cacheKey := typ.RType() + decoder := cfg.getDecoderFromCache(cacheKey) + if decoder != nil { + return decoder + } + ctx := &ctx{ + frozenConfig: cfg, + prefix: "", + decoders: map[reflect2.Type]ValDecoder{}, + encoders: map[reflect2.Type]ValEncoder{}, + } + ptrType := typ.(*reflect2.UnsafePtrType) + decoder = decoderOfType(ctx, ptrType.Elem()) + cfg.addDecoderToCache(cacheKey, decoder) + return decoder +} + +func decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := getTypeDecoderFromExtension(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfType(ctx, typ) + for _, extension := range extensions { + decoder = extension.DecorateDecoder(typ, decoder) + } + for _, extension := range ctx.extensions { + decoder = extension.DecorateDecoder(typ, decoder) + } + return decoder +} + +func createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := ctx.decoders[typ] + if decoder != nil { + return decoder + } + placeholder := &placeholderDecoder{} + ctx.decoders[typ] = placeholder + decoder = _createDecoderOfType(ctx, typ) + placeholder.decoder = decoder + return decoder +} + +func _createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := createDecoderOfJsonRawMessage(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfJsonNumber(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfMarshaler(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfAny(ctx, typ) + if decoder != nil { + return decoder + } + decoder = createDecoderOfNative(ctx, typ) + if decoder != nil { + return decoder + } + switch typ.Kind() { + case reflect.Interface: + ifaceType, isIFace := typ.(*reflect2.UnsafeIFaceType) + if isIFace { + return &ifaceDecoder{valType: ifaceType} + } + return &efaceDecoder{} + case reflect.Struct: + return decoderOfStruct(ctx, typ) + case reflect.Array: + return decoderOfArray(ctx, typ) + case reflect.Slice: + return decoderOfSlice(ctx, typ) + case reflect.Map: + return decoderOfMap(ctx, typ) + case reflect.Ptr: + return decoderOfOptional(ctx, typ) + default: + return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} + } +} + +func (cfg *frozenConfig) EncoderOf(typ reflect2.Type) ValEncoder { + cacheKey := typ.RType() + encoder := cfg.getEncoderFromCache(cacheKey) + if encoder != nil { + return encoder + } + ctx := &ctx{ + frozenConfig: cfg, + prefix: "", + decoders: map[reflect2.Type]ValDecoder{}, + encoders: map[reflect2.Type]ValEncoder{}, + } + encoder = encoderOfType(ctx, typ) + if typ.LikePtr() { + encoder = &onePtrEncoder{encoder} + } + cfg.addEncoderToCache(cacheKey, encoder) + return encoder +} + +type onePtrEncoder struct { + encoder ValEncoder +} + +func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) +} + +func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) +} + +func encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := getTypeEncoderFromExtension(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfType(ctx, typ) + for _, extension := range extensions { + encoder = extension.DecorateEncoder(typ, encoder) + } + for _, extension := range ctx.extensions { + encoder = extension.DecorateEncoder(typ, encoder) + } + return encoder +} + +func createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := ctx.encoders[typ] + if encoder != nil { + return encoder + } + placeholder := &placeholderEncoder{} + ctx.encoders[typ] = placeholder + encoder = _createEncoderOfType(ctx, typ) + placeholder.encoder = encoder + return encoder +} +func _createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := createEncoderOfJsonRawMessage(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfJsonNumber(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfMarshaler(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfAny(ctx, typ) + if encoder != nil { + return encoder + } + encoder = createEncoderOfNative(ctx, typ) + if encoder != nil { + return encoder + } + kind := typ.Kind() + switch kind { + case reflect.Interface: + return &dynamicEncoder{typ} + case reflect.Struct: + return encoderOfStruct(ctx, typ) + case reflect.Array: + return encoderOfArray(ctx, typ) + case reflect.Slice: + return encoderOfSlice(ctx, typ) + case reflect.Map: + return encoderOfMap(ctx, typ) + case reflect.Ptr: + return encoderOfOptional(ctx, typ) + default: + return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} + } +} + +type lazyErrorDecoder struct { + err error +} + +func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.WhatIsNext() != NilValue { + if iter.Error == nil { + iter.Error = decoder.err + } + } else { + iter.Skip() + } +} + +type lazyErrorEncoder struct { + err error +} + +func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if ptr == nil { + stream.WriteNil() + } else if stream.Error == nil { + stream.Error = encoder.err + } +} + +func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type placeholderDecoder struct { + decoder ValDecoder +} + +func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.decoder.Decode(ptr, iter) +} + +type placeholderEncoder struct { + encoder ValEncoder +} + +func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.encoder.Encode(ptr, stream) +} + +func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.encoder.IsEmpty(ptr) +} diff --git a/vendor/github.com/json-iterator/go/reflect_array.go b/vendor/github.com/json-iterator/go/reflect_array.go new file mode 100644 index 00000000..13a0b7b0 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_array.go @@ -0,0 +1,104 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "io" + "unsafe" +) + +func decoderOfArray(ctx *ctx, typ reflect2.Type) ValDecoder { + arrayType := typ.(*reflect2.UnsafeArrayType) + decoder := decoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) + return &arrayDecoder{arrayType, decoder} +} + +func encoderOfArray(ctx *ctx, typ reflect2.Type) ValEncoder { + arrayType := typ.(*reflect2.UnsafeArrayType) + if arrayType.Len() == 0 { + return emptyArrayEncoder{} + } + encoder := encoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) + return &arrayEncoder{arrayType, encoder} +} + +type emptyArrayEncoder struct{} + +func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteEmptyArray() +} + +func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return true +} + +type arrayEncoder struct { + arrayType *reflect2.UnsafeArrayType + elemEncoder ValEncoder +} + +func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteArrayStart() + elemPtr := unsafe.Pointer(ptr) + encoder.elemEncoder.Encode(elemPtr, stream) + for i := 1; i < encoder.arrayType.Len(); i++ { + stream.WriteMore() + elemPtr = encoder.arrayType.UnsafeGetIndex(ptr, i) + encoder.elemEncoder.Encode(elemPtr, stream) + } + stream.WriteArrayEnd() + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error()) + } +} + +func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type arrayDecoder struct { + arrayType *reflect2.UnsafeArrayType + elemDecoder ValDecoder +} + +func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.doDecode(ptr, iter) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error()) + } +} + +func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + arrayType := decoder.arrayType + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + return + } + if c != '[' { + iter.ReportError("decode array", "expect [ or n, but found "+string([]byte{c})) + return + } + c = iter.nextToken() + if c == ']' { + return + } + iter.unreadByte() + elemPtr := arrayType.UnsafeGetIndex(ptr, 0) + decoder.elemDecoder.Decode(elemPtr, iter) + length := 1 + for c = iter.nextToken(); c == ','; c = iter.nextToken() { + if length >= arrayType.Len() { + iter.Skip() + continue + } + idx := length + length += 1 + elemPtr = arrayType.UnsafeGetIndex(ptr, idx) + decoder.elemDecoder.Decode(elemPtr, iter) + } + if c != ']' { + iter.ReportError("decode array", "expect ], but found "+string([]byte{c})) + return + } +} diff --git a/vendor/github.com/json-iterator/go/reflect_dynamic.go b/vendor/github.com/json-iterator/go/reflect_dynamic.go new file mode 100644 index 00000000..8b6bc8b4 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_dynamic.go @@ -0,0 +1,70 @@ +package jsoniter + +import ( + "github.com/modern-go/reflect2" + "reflect" + "unsafe" +) + +type dynamicEncoder struct { + valType reflect2.Type +} + +func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + stream.WriteVal(obj) +} + +func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.valType.UnsafeIndirect(ptr) == nil +} + +type efaceDecoder struct { +} + +func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + pObj := (*interface{})(ptr) + obj := *pObj + if obj == nil { + *pObj = iter.Read() + return + } + typ := reflect2.TypeOf(obj) + if typ.Kind() != reflect.Ptr { + *pObj = iter.Read() + return + } + ptrType := typ.(*reflect2.UnsafePtrType) + ptrElemType := ptrType.Elem() + if iter.WhatIsNext() == NilValue { + if ptrElemType.Kind() != reflect.Ptr { + iter.skipFourBytes('n', 'u', 'l', 'l') + *pObj = nil + return + } + } + if reflect2.IsNil(obj) { + obj := ptrElemType.New() + iter.ReadVal(obj) + *pObj = obj + return + } + iter.ReadVal(obj) +} + +type ifaceDecoder struct { + valType *reflect2.UnsafeIFaceType +} + +func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew()) + return + } + obj := decoder.valType.UnsafeIndirect(ptr) + if reflect2.IsNil(obj) { + iter.ReportError("decode non empty interface", "can not unmarshal into nil") + return + } + iter.ReadVal(obj) +} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_extension.go b/vendor/github.com/json-iterator/go/reflect_extension.go similarity index 57% rename from vendor/github.com/json-iterator/go/feature_reflect_extension.go rename to vendor/github.com/json-iterator/go/reflect_extension.go index c129076b..917bbe84 100644 --- a/vendor/github.com/json-iterator/go/feature_reflect_extension.go +++ b/vendor/github.com/json-iterator/go/reflect_extension.go @@ -2,6 +2,7 @@ package jsoniter import ( "fmt" + "github.com/modern-go/reflect2" "reflect" "sort" "strings" @@ -17,17 +18,15 @@ var extensions = []Extension{} // StructDescriptor describe how should we encode/decode the struct type StructDescriptor struct { - onePtrEmbedded bool - onePtrOptimization bool - Type reflect.Type - Fields []*Binding + Type reflect2.Type + Fields []*Binding } // GetField get one field from the descriptor by its name. // Can not use map here to keep field orders. func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { for _, binding := range structDescriptor.Fields { - if binding.Field.Name == fieldName { + if binding.Field.Name() == fieldName { return binding } } @@ -37,7 +36,7 @@ func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { // Binding describe how should we encode/decode the struct field type Binding struct { levels []int - Field *reflect.StructField + Field reflect2.StructField FromNames []string ToNames []string Encoder ValEncoder @@ -48,10 +47,12 @@ type Binding struct { // Can also rename fields by UpdateStructDescriptor. type Extension interface { UpdateStructDescriptor(structDescriptor *StructDescriptor) - CreateDecoder(typ reflect.Type) ValDecoder - CreateEncoder(typ reflect.Type) ValEncoder - DecorateDecoder(typ reflect.Type, decoder ValDecoder) ValDecoder - DecorateEncoder(typ reflect.Type, encoder ValEncoder) ValEncoder + CreateMapKeyDecoder(typ reflect2.Type) ValDecoder + CreateMapKeyEncoder(typ reflect2.Type) ValEncoder + CreateDecoder(typ reflect2.Type) ValDecoder + CreateEncoder(typ reflect2.Type) ValEncoder + DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder + DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder } // DummyExtension embed this type get dummy implementation for all methods of Extension @@ -62,23 +63,105 @@ type DummyExtension struct { func (extension *DummyExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { } +// CreateMapKeyDecoder No-op +func (extension *DummyExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateMapKeyEncoder No-op +func (extension *DummyExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { + return nil +} + // CreateDecoder No-op -func (extension *DummyExtension) CreateDecoder(typ reflect.Type) ValDecoder { +func (extension *DummyExtension) CreateDecoder(typ reflect2.Type) ValDecoder { return nil } // CreateEncoder No-op -func (extension *DummyExtension) CreateEncoder(typ reflect.Type) ValEncoder { +func (extension *DummyExtension) CreateEncoder(typ reflect2.Type) ValEncoder { return nil } // DecorateDecoder No-op -func (extension *DummyExtension) DecorateDecoder(typ reflect.Type, decoder ValDecoder) ValDecoder { +func (extension *DummyExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { return decoder } // DecorateEncoder No-op -func (extension *DummyExtension) DecorateEncoder(typ reflect.Type, encoder ValEncoder) ValEncoder { +func (extension *DummyExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { + return encoder +} + +type EncoderExtension map[reflect2.Type]ValEncoder + +// UpdateStructDescriptor No-op +func (extension EncoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { +} + +// CreateDecoder No-op +func (extension EncoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateEncoder get encoder from map +func (extension EncoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { + return extension[typ] +} + +// CreateMapKeyDecoder No-op +func (extension EncoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateMapKeyEncoder No-op +func (extension EncoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// DecorateDecoder No-op +func (extension EncoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { + return decoder +} + +// DecorateEncoder No-op +func (extension EncoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { + return encoder +} + +type DecoderExtension map[reflect2.Type]ValDecoder + +// UpdateStructDescriptor No-op +func (extension DecoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { +} + +// CreateMapKeyDecoder No-op +func (extension DecoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { + return nil +} + +// CreateMapKeyEncoder No-op +func (extension DecoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// CreateDecoder get decoder from map +func (extension DecoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { + return extension[typ] +} + +// CreateEncoder No-op +func (extension DecoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { + return nil +} + +// DecorateDecoder No-op +func (extension DecoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { + return decoder +} + +// DecorateEncoder No-op +func (extension DecoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { return encoder } @@ -99,10 +182,6 @@ func (encoder *funcEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { encoder.fun(ptr, stream) } -func (encoder *funcEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - func (encoder *funcEncoder) IsEmpty(ptr unsafe.Pointer) bool { if encoder.isEmptyFunc == nil { return false @@ -161,26 +240,26 @@ func RegisterExtension(extension Extension) { extensions = append(extensions, extension) } -func getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder { - decoder := _getTypeDecoderFromExtension(cfg, typ) +func getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { + decoder := _getTypeDecoderFromExtension(ctx, typ) if decoder != nil { for _, extension := range extensions { decoder = extension.DecorateDecoder(typ, decoder) } - for _, extension := range cfg.extensions { + for _, extension := range ctx.extensions { decoder = extension.DecorateDecoder(typ, decoder) } } return decoder } -func _getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder { +func _getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { for _, extension := range extensions { decoder := extension.CreateDecoder(typ) if decoder != nil { return decoder } } - for _, extension := range cfg.extensions { + for _, extension := range ctx.extensions { decoder := extension.CreateDecoder(typ) if decoder != nil { return decoder @@ -192,35 +271,36 @@ func _getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecode return decoder } if typ.Kind() == reflect.Ptr { - decoder := typeDecoders[typ.Elem().String()] + ptrType := typ.(*reflect2.UnsafePtrType) + decoder := typeDecoders[ptrType.Elem().String()] if decoder != nil { - return &OptionalDecoder{typ.Elem(), decoder} + return &OptionalDecoder{ptrType.Elem(), decoder} } } return nil } -func getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder { - encoder := _getTypeEncoderFromExtension(cfg, typ) +func getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { + encoder := _getTypeEncoderFromExtension(ctx, typ) if encoder != nil { for _, extension := range extensions { encoder = extension.DecorateEncoder(typ, encoder) } - for _, extension := range cfg.extensions { + for _, extension := range ctx.extensions { encoder = extension.DecorateEncoder(typ, encoder) } } return encoder } -func _getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder { +func _getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { for _, extension := range extensions { encoder := extension.CreateEncoder(typ) if encoder != nil { return encoder } } - for _, extension := range cfg.extensions { + for _, extension := range ctx.extensions { encoder := extension.CreateEncoder(typ) if encoder != nil { return encoder @@ -232,7 +312,8 @@ func _getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncode return encoder } if typ.Kind() == reflect.Ptr { - encoder := typeEncoders[typ.Elem().String()] + typePtr := typ.(*reflect2.UnsafePtrType) + encoder := typeEncoders[typePtr.Elem().String()] if encoder != nil { return &OptionalEncoder{encoder} } @@ -240,72 +321,60 @@ func _getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncode return nil } -func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, error) { +func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { + structType := typ.(*reflect2.UnsafeStructType) embeddedBindings := []*Binding{} bindings := []*Binding{} - for i := 0; i < typ.NumField(); i++ { - field := typ.Field(i) - tag := field.Tag.Get(cfg.getTagKey()) + for i := 0; i < structType.NumField(); i++ { + field := structType.Field(i) + tag, hastag := field.Tag().Lookup(ctx.getTagKey()) + if ctx.onlyTaggedField && !hastag { + continue + } tagParts := strings.Split(tag, ",") if tag == "-" { continue } - if field.Anonymous && (tag == "" || tagParts[0] == "") { - if field.Type.Kind() == reflect.Struct { - structDescriptor, err := describeStruct(cfg, field.Type) - if err != nil { - return nil, err - } + if field.Anonymous() && (tag == "" || tagParts[0] == "") { + if field.Type().Kind() == reflect.Struct { + structDescriptor := describeStruct(ctx, field.Type()) for _, binding := range structDescriptor.Fields { binding.levels = append([]int{i}, binding.levels...) omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &structFieldEncoder{&field, binding.Encoder, omitempty} - binding.Decoder = &structFieldDecoder{&field, binding.Decoder} + binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} + binding.Decoder = &structFieldDecoder{field, binding.Decoder} embeddedBindings = append(embeddedBindings, binding) } continue - } else if field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct { - structDescriptor, err := describeStruct(cfg, field.Type.Elem()) - if err != nil { - return nil, err + } else if field.Type().Kind() == reflect.Ptr { + ptrType := field.Type().(*reflect2.UnsafePtrType) + if ptrType.Elem().Kind() == reflect.Struct { + structDescriptor := describeStruct(ctx, ptrType.Elem()) + for _, binding := range structDescriptor.Fields { + binding.levels = append([]int{i}, binding.levels...) + omitempty := binding.Encoder.(*structFieldEncoder).omitempty + binding.Encoder = &dereferenceEncoder{binding.Encoder} + binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} + binding.Decoder = &dereferenceDecoder{ptrType.Elem(), binding.Decoder} + binding.Decoder = &structFieldDecoder{field, binding.Decoder} + embeddedBindings = append(embeddedBindings, binding) + } + continue } - for _, binding := range structDescriptor.Fields { - binding.levels = append([]int{i}, binding.levels...) - omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &OptionalEncoder{binding.Encoder} - binding.Encoder = &structFieldEncoder{&field, binding.Encoder, omitempty} - binding.Decoder = &deferenceDecoder{field.Type.Elem(), binding.Decoder} - binding.Decoder = &structFieldDecoder{&field, binding.Decoder} - embeddedBindings = append(embeddedBindings, binding) - } - continue } } - fieldNames := calcFieldNames(field.Name, tagParts[0], tag) - fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name) + fieldNames := calcFieldNames(field.Name(), tagParts[0], tag) + fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name()) decoder := fieldDecoders[fieldCacheKey] if decoder == nil { - var err error - decoder, err = decoderOfType(cfg, field.Type) - if len(fieldNames) > 0 && err != nil { - return nil, err - } + decoder = decoderOfType(ctx.append(field.Name()), field.Type()) } encoder := fieldEncoders[fieldCacheKey] if encoder == nil { - var err error - encoder, err = encoderOfType(cfg, field.Type) - if len(fieldNames) > 0 && err != nil { - return nil, err - } - // map is stored as pointer in the struct, - // and treat nil or empty map as empty field - if encoder != nil && field.Type.Kind() == reflect.Map { - encoder = &optionalMapEncoder{encoder} - } + encoder = encoderOfType(ctx.append(field.Name()), field.Type()) } binding := &Binding{ - Field: &field, + Field: field, FromNames: fieldNames, ToNames: fieldNames, Decoder: decoder, @@ -314,38 +383,20 @@ func describeStruct(cfg *frozenConfig, typ reflect.Type) (*StructDescriptor, err binding.levels = []int{i} bindings = append(bindings, binding) } - return createStructDescriptor(cfg, typ, bindings, embeddedBindings), nil + return createStructDescriptor(ctx, typ, bindings, embeddedBindings) } -func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor { - onePtrEmbedded := false - onePtrOptimization := false - if typ.NumField() == 1 { - firstField := typ.Field(0) - switch firstField.Type.Kind() { - case reflect.Ptr: - if firstField.Anonymous && firstField.Type.Elem().Kind() == reflect.Struct { - onePtrEmbedded = true - } - fallthrough - case reflect.Map: - onePtrOptimization = true - case reflect.Struct: - onePtrOptimization = isStructOnePtr(firstField.Type) - } - } +func createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor { structDescriptor := &StructDescriptor{ - onePtrEmbedded: onePtrEmbedded, - onePtrOptimization: onePtrOptimization, - Type: typ, - Fields: bindings, + Type: typ, + Fields: bindings, } for _, extension := range extensions { extension.UpdateStructDescriptor(structDescriptor) } - for _, extension := range cfg.extensions { + for _, extension := range ctx.extensions { extension.UpdateStructDescriptor(structDescriptor) } - processTags(structDescriptor, cfg) + processTags(structDescriptor, ctx.frozenConfig) // merge normal & embedded bindings & sort with original order allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...)) sort.Sort(allBindings) @@ -353,21 +404,6 @@ func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Bin return structDescriptor } -func isStructOnePtr(typ reflect.Type) bool { - if typ.NumField() == 1 { - firstField := typ.Field(0) - switch firstField.Type.Kind() { - case reflect.Ptr: - return true - case reflect.Map: - return true - case reflect.Struct: - return isStructOnePtr(firstField.Type) - } - } - return false -} - type sortableBindings []*Binding func (bindings sortableBindings) Len() int { @@ -395,12 +431,12 @@ func (bindings sortableBindings) Swap(i, j int) { func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { for _, binding := range structDescriptor.Fields { shouldOmitEmpty := false - tagParts := strings.Split(binding.Field.Tag.Get(cfg.getTagKey()), ",") + tagParts := strings.Split(binding.Field.Tag().Get(cfg.getTagKey()), ",") for _, tagPart := range tagParts[1:] { if tagPart == "omitempty" { shouldOmitEmpty = true } else if tagPart == "string" { - if binding.Field.Type.Kind() == reflect.String { + if binding.Field.Type().Kind() == reflect.String { binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg} binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg} } else { diff --git a/vendor/github.com/json-iterator/go/reflect_json_number.go b/vendor/github.com/json-iterator/go/reflect_json_number.go new file mode 100644 index 00000000..98d45c1e --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_json_number.go @@ -0,0 +1,112 @@ +package jsoniter + +import ( + "encoding/json" + "github.com/modern-go/reflect2" + "strconv" + "unsafe" +) + +type Number string + +// String returns the literal text of the number. +func (n Number) String() string { return string(n) } + +// Float64 returns the number as a float64. +func (n Number) Float64() (float64, error) { + return strconv.ParseFloat(string(n), 64) +} + +// Int64 returns the number as an int64. +func (n Number) Int64() (int64, error) { + return strconv.ParseInt(string(n), 10, 64) +} + +func CastJsonNumber(val interface{}) (string, bool) { + switch typedVal := val.(type) { + case json.Number: + return string(typedVal), true + case Number: + return string(typedVal), true + } + return "", false +} + +var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem() +var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem() + +func createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ.AssignableTo(jsonNumberType) { + return &jsonNumberCodec{} + } + if typ.AssignableTo(jsoniterNumberType) { + return &jsoniterNumberCodec{} + } + return nil +} + +func createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ.AssignableTo(jsonNumberType) { + return &jsonNumberCodec{} + } + if typ.AssignableTo(jsoniterNumberType) { + return &jsoniterNumberCodec{} + } + return nil +} + +type jsonNumberCodec struct { +} + +func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + switch iter.WhatIsNext() { + case StringValue: + *((*json.Number)(ptr)) = json.Number(iter.ReadString()) + case NilValue: + iter.skipFourBytes('n', 'u', 'l', 'l') + *((*json.Number)(ptr)) = "" + default: + *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) + } +} + +func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + number := *((*json.Number)(ptr)) + if len(number) == 0 { + stream.writeByte('0') + } else { + stream.WriteRaw(string(number)) + } +} + +func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*json.Number)(ptr))) == 0 +} + +type jsoniterNumberCodec struct { +} + +func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + switch iter.WhatIsNext() { + case StringValue: + *((*Number)(ptr)) = Number(iter.ReadString()) + case NilValue: + iter.skipFourBytes('n', 'u', 'l', 'l') + *((*Number)(ptr)) = "" + default: + *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) + } +} + +func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + number := *((*Number)(ptr)) + if len(number) == 0 { + stream.writeByte('0') + } else { + stream.WriteRaw(string(number)) + } +} + +func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*Number)(ptr))) == 0 +} diff --git a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go b/vendor/github.com/json-iterator/go/reflect_json_raw_message.go new file mode 100644 index 00000000..f2619936 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_json_raw_message.go @@ -0,0 +1,60 @@ +package jsoniter + +import ( + "encoding/json" + "github.com/modern-go/reflect2" + "unsafe" +) + +var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem() +var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem() + +func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ == jsonRawMessageType { + return &jsonRawMessageCodec{} + } + if typ == jsoniterRawMessageType { + return &jsoniterRawMessageCodec{} + } + return nil +} + +func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ == jsonRawMessageType { + return &jsonRawMessageCodec{} + } + if typ == jsoniterRawMessageType { + return &jsoniterRawMessageCodec{} + } + return nil +} + +type jsonRawMessageCodec struct { +} + +func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) +} + +func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) +} + +func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*json.RawMessage)(ptr))) == 0 +} + +type jsoniterRawMessageCodec struct { +} + +func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) +} + +func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteRaw(string(*((*RawMessage)(ptr)))) +} + +func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*RawMessage)(ptr))) == 0 +} diff --git a/vendor/github.com/json-iterator/go/reflect_map.go b/vendor/github.com/json-iterator/go/reflect_map.go new file mode 100644 index 00000000..8812f085 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_map.go @@ -0,0 +1,318 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "io" + "reflect" + "sort" + "unsafe" +) + +func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder { + mapType := typ.(*reflect2.UnsafeMapType) + keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()) + elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem()) + return &mapDecoder{ + mapType: mapType, + keyType: mapType.Key(), + elemType: mapType.Elem(), + keyDecoder: keyDecoder, + elemDecoder: elemDecoder, + } +} + +func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder { + mapType := typ.(*reflect2.UnsafeMapType) + if ctx.sortMapKeys { + return &sortKeysMapEncoder{ + mapType: mapType, + keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), + elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), + } + } + return &mapEncoder{ + mapType: mapType, + keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), + elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), + } +} + +func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder { + for _, extension := range ctx.extensions { + decoder := extension.CreateMapKeyDecoder(typ) + if decoder != nil { + return decoder + } + } + switch typ.Kind() { + case reflect.String: + return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) + case reflect.Bool, + reflect.Uint8, reflect.Int8, + reflect.Uint16, reflect.Int16, + reflect.Uint32, reflect.Int32, + reflect.Uint64, reflect.Int64, + reflect.Uint, reflect.Int, + reflect.Float32, reflect.Float64, + reflect.Uintptr: + typ = reflect2.DefaultTypeOfKind(typ.Kind()) + return &numericMapKeyDecoder{decoderOfType(ctx, typ)} + default: + ptrType := reflect2.PtrTo(typ) + if ptrType.Implements(textMarshalerType) { + return &referenceDecoder{ + &textUnmarshalerDecoder{ + valType: ptrType, + }, + } + } + if typ.Implements(textMarshalerType) { + return &textUnmarshalerDecoder{ + valType: typ, + } + } + return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)} + } +} + +func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder { + for _, extension := range ctx.extensions { + encoder := extension.CreateMapKeyEncoder(typ) + if encoder != nil { + return encoder + } + } + switch typ.Kind() { + case reflect.String: + return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) + case reflect.Bool, + reflect.Uint8, reflect.Int8, + reflect.Uint16, reflect.Int16, + reflect.Uint32, reflect.Int32, + reflect.Uint64, reflect.Int64, + reflect.Uint, reflect.Int, + reflect.Float32, reflect.Float64, + reflect.Uintptr: + typ = reflect2.DefaultTypeOfKind(typ.Kind()) + return &numericMapKeyEncoder{encoderOfType(ctx, typ)} + default: + if typ == textMarshalerType { + return &directTextMarshalerEncoder{ + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + } + } + if typ.Implements(textMarshalerType) { + return &textMarshalerEncoder{ + valType: typ, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + } + } + if typ.Kind() == reflect.Interface { + return &dynamicMapKeyEncoder{ctx, typ} + } + return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)} + } +} + +type mapDecoder struct { + mapType *reflect2.UnsafeMapType + keyType reflect2.Type + elemType reflect2.Type + keyDecoder ValDecoder + elemDecoder ValDecoder +} + +func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + mapType := decoder.mapType + c := iter.nextToken() + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + *(*unsafe.Pointer)(ptr) = nil + mapType.UnsafeSet(ptr, mapType.UnsafeNew()) + return + } + if mapType.UnsafeIsNil(ptr) { + mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0)) + } + if c != '{' { + iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) + return + } + c = iter.nextToken() + if c == '}' { + return + } + if c != '"' { + iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) + return + } + iter.unreadByte() + key := decoder.keyType.UnsafeNew() + decoder.keyDecoder.Decode(key, iter) + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + return + } + elem := decoder.elemType.UnsafeNew() + decoder.elemDecoder.Decode(elem, iter) + decoder.mapType.UnsafeSetIndex(ptr, key, elem) + for c = iter.nextToken(); c == ','; c = iter.nextToken() { + key := decoder.keyType.UnsafeNew() + decoder.keyDecoder.Decode(key, iter) + c = iter.nextToken() + if c != ':' { + iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) + return + } + elem := decoder.elemType.UnsafeNew() + decoder.elemDecoder.Decode(elem, iter) + decoder.mapType.UnsafeSetIndex(ptr, key, elem) + } + if c != '}' { + iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c})) + } +} + +type numericMapKeyDecoder struct { + decoder ValDecoder +} + +func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + if c != '"' { + iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) + return + } + decoder.decoder.Decode(ptr, iter) + c = iter.nextToken() + if c != '"' { + iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) + return + } +} + +type numericMapKeyEncoder struct { + encoder ValEncoder +} + +func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.writeByte('"') + encoder.encoder.Encode(ptr, stream) + stream.writeByte('"') +} + +func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return false +} + +type dynamicMapKeyEncoder struct { + ctx *ctx + valType reflect2.Type +} + +func (encoder *dynamicMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).Encode(reflect2.PtrOf(obj), stream) +} + +func (encoder *dynamicMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { + obj := encoder.valType.UnsafeIndirect(ptr) + return encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).IsEmpty(reflect2.PtrOf(obj)) +} + +type mapEncoder struct { + mapType *reflect2.UnsafeMapType + keyEncoder ValEncoder + elemEncoder ValEncoder +} + +func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteObjectStart() + iter := encoder.mapType.UnsafeIterate(ptr) + for i := 0; iter.HasNext(); i++ { + if i != 0 { + stream.WriteMore() + } + key, elem := iter.UnsafeNext() + encoder.keyEncoder.Encode(key, stream) + if stream.indention > 0 { + stream.writeTwoBytes(byte(':'), byte(' ')) + } else { + stream.writeByte(':') + } + encoder.elemEncoder.Encode(elem, stream) + } + stream.WriteObjectEnd() +} + +func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool { + iter := encoder.mapType.UnsafeIterate(ptr) + return !iter.HasNext() +} + +type sortKeysMapEncoder struct { + mapType *reflect2.UnsafeMapType + keyEncoder ValEncoder + elemEncoder ValEncoder +} + +func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if *(*unsafe.Pointer)(ptr) == nil { + stream.WriteNil() + return + } + stream.WriteObjectStart() + mapIter := encoder.mapType.UnsafeIterate(ptr) + subStream := stream.cfg.BorrowStream(nil) + subIter := stream.cfg.BorrowIterator(nil) + keyValues := encodedKeyValues{} + for mapIter.HasNext() { + subStream.buf = make([]byte, 0, 64) + key, elem := mapIter.UnsafeNext() + encoder.keyEncoder.Encode(key, subStream) + if subStream.Error != nil && subStream.Error != io.EOF && stream.Error == nil { + stream.Error = subStream.Error + } + encodedKey := subStream.Buffer() + subIter.ResetBytes(encodedKey) + decodedKey := subIter.ReadString() + if stream.indention > 0 { + subStream.writeTwoBytes(byte(':'), byte(' ')) + } else { + subStream.writeByte(':') + } + encoder.elemEncoder.Encode(elem, subStream) + keyValues = append(keyValues, encodedKV{ + key: decodedKey, + keyValue: subStream.Buffer(), + }) + } + sort.Sort(keyValues) + for i, keyValue := range keyValues { + if i != 0 { + stream.WriteMore() + } + stream.Write(keyValue.keyValue) + } + stream.WriteObjectEnd() + stream.cfg.ReturnStream(subStream) + stream.cfg.ReturnIterator(subIter) +} + +func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { + iter := encoder.mapType.UnsafeIterate(ptr) + return !iter.HasNext() +} + +type encodedKeyValues []encodedKV + +type encodedKV struct { + key string + keyValue []byte +} + +func (sv encodedKeyValues) Len() int { return len(sv) } +func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } +func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key } diff --git a/vendor/github.com/json-iterator/go/reflect_marshaler.go b/vendor/github.com/json-iterator/go/reflect_marshaler.go new file mode 100644 index 00000000..58ac959a --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_marshaler.go @@ -0,0 +1,218 @@ +package jsoniter + +import ( + "encoding" + "encoding/json" + "github.com/modern-go/reflect2" + "unsafe" +) + +var marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem() +var unmarshalerType = reflect2.TypeOfPtr((*json.Unmarshaler)(nil)).Elem() +var textMarshalerType = reflect2.TypeOfPtr((*encoding.TextMarshaler)(nil)).Elem() +var textUnmarshalerType = reflect2.TypeOfPtr((*encoding.TextUnmarshaler)(nil)).Elem() + +func createDecoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValDecoder { + ptrType := reflect2.PtrTo(typ) + if ptrType.Implements(unmarshalerType) { + return &referenceDecoder{ + &unmarshalerDecoder{ptrType}, + } + } + if ptrType.Implements(textUnmarshalerType) { + return &referenceDecoder{ + &textUnmarshalerDecoder{ptrType}, + } + } + return nil +} + +func createEncoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ == marshalerType { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &directMarshalerEncoder{ + checkIsEmpty: checkIsEmpty, + } + return encoder + } + if typ.Implements(marshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &marshalerEncoder{ + valType: typ, + checkIsEmpty: checkIsEmpty, + } + return encoder + } + ptrType := reflect2.PtrTo(typ) + if ctx.prefix != "" && ptrType.Implements(marshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, ptrType) + var encoder ValEncoder = &marshalerEncoder{ + valType: ptrType, + checkIsEmpty: checkIsEmpty, + } + return &referenceEncoder{encoder} + } + if typ == textMarshalerType { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &directTextMarshalerEncoder{ + checkIsEmpty: checkIsEmpty, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + } + return encoder + } + if typ.Implements(textMarshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, typ) + var encoder ValEncoder = &textMarshalerEncoder{ + valType: typ, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + checkIsEmpty: checkIsEmpty, + } + return encoder + } + // if prefix is empty, the type is the root type + if ctx.prefix != "" && ptrType.Implements(textMarshalerType) { + checkIsEmpty := createCheckIsEmpty(ctx, ptrType) + var encoder ValEncoder = &textMarshalerEncoder{ + valType: ptrType, + stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), + checkIsEmpty: checkIsEmpty, + } + return &referenceEncoder{encoder} + } + return nil +} + +type marshalerEncoder struct { + checkIsEmpty checkIsEmpty + valType reflect2.Type +} + +func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + if encoder.valType.IsNullable() && reflect2.IsNil(obj) { + stream.WriteNil() + return + } + marshaler := obj.(json.Marshaler) + bytes, err := marshaler.MarshalJSON() + if err != nil { + stream.Error = err + } else { + stream.Write(bytes) + } +} + +func (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type directMarshalerEncoder struct { + checkIsEmpty checkIsEmpty +} + +func (encoder *directMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + marshaler := *(*json.Marshaler)(ptr) + if marshaler == nil { + stream.WriteNil() + return + } + bytes, err := marshaler.MarshalJSON() + if err != nil { + stream.Error = err + } else { + stream.Write(bytes) + } +} + +func (encoder *directMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type textMarshalerEncoder struct { + valType reflect2.Type + stringEncoder ValEncoder + checkIsEmpty checkIsEmpty +} + +func (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + obj := encoder.valType.UnsafeIndirect(ptr) + if encoder.valType.IsNullable() && reflect2.IsNil(obj) { + stream.WriteNil() + return + } + marshaler := (obj).(encoding.TextMarshaler) + bytes, err := marshaler.MarshalText() + if err != nil { + stream.Error = err + } else { + str := string(bytes) + encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) + } +} + +func (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type directTextMarshalerEncoder struct { + stringEncoder ValEncoder + checkIsEmpty checkIsEmpty +} + +func (encoder *directTextMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + marshaler := *(*encoding.TextMarshaler)(ptr) + if marshaler == nil { + stream.WriteNil() + return + } + bytes, err := marshaler.MarshalText() + if err != nil { + stream.Error = err + } else { + str := string(bytes) + encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) + } +} + +func (encoder *directTextMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.checkIsEmpty.IsEmpty(ptr) +} + +type unmarshalerDecoder struct { + valType reflect2.Type +} + +func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + valType := decoder.valType + obj := valType.UnsafeIndirect(ptr) + unmarshaler := obj.(json.Unmarshaler) + iter.nextToken() + iter.unreadByte() // skip spaces + bytes := iter.SkipAndReturnBytes() + err := unmarshaler.UnmarshalJSON(bytes) + if err != nil { + iter.ReportError("unmarshalerDecoder", err.Error()) + } +} + +type textUnmarshalerDecoder struct { + valType reflect2.Type +} + +func (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + valType := decoder.valType + obj := valType.UnsafeIndirect(ptr) + if reflect2.IsNil(obj) { + ptrType := valType.(*reflect2.UnsafePtrType) + elemType := ptrType.Elem() + elem := elemType.UnsafeNew() + ptrType.UnsafeSet(ptr, unsafe.Pointer(&elem)) + obj = valType.UnsafeIndirect(ptr) + } + unmarshaler := (obj).(encoding.TextUnmarshaler) + str := iter.ReadString() + err := unmarshaler.UnmarshalText([]byte(str)) + if err != nil { + iter.ReportError("textUnmarshalerDecoder", err.Error()) + } +} diff --git a/vendor/github.com/json-iterator/go/reflect_native.go b/vendor/github.com/json-iterator/go/reflect_native.go new file mode 100644 index 00000000..fac4d9f7 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_native.go @@ -0,0 +1,461 @@ +package jsoniter + +import ( + "bytes" + "encoding/base64" + "reflect" + "strconv" + "unsafe" + + "github.com/modern-go/reflect2" +) + +const ptrSize = 32 << uintptr(^uintptr(0)>>63) + +func createEncoderOfNative(ctx *ctx, typ reflect2.Type) ValEncoder { + if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { + sliceDecoder := decoderOfSlice(ctx, typ) + return &base64Codec{sliceDecoder: sliceDecoder} + } + typeName := typ.String() + kind := typ.Kind() + switch kind { + case reflect.String: + if typeName != "string" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) + } + return &stringCodec{} + case reflect.Int: + if typeName != "int" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &int32Codec{} + } + return &int64Codec{} + case reflect.Int8: + if typeName != "int8" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) + } + return &int8Codec{} + case reflect.Int16: + if typeName != "int16" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) + } + return &int16Codec{} + case reflect.Int32: + if typeName != "int32" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) + } + return &int32Codec{} + case reflect.Int64: + if typeName != "int64" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) + } + return &int64Codec{} + case reflect.Uint: + if typeName != "uint" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint8: + if typeName != "uint8" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) + } + return &uint8Codec{} + case reflect.Uint16: + if typeName != "uint16" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) + } + return &uint16Codec{} + case reflect.Uint32: + if typeName != "uint32" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) + } + return &uint32Codec{} + case reflect.Uintptr: + if typeName != "uintptr" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) + } + if ptrSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint64: + if typeName != "uint64" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) + } + return &uint64Codec{} + case reflect.Float32: + if typeName != "float32" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) + } + return &float32Codec{} + case reflect.Float64: + if typeName != "float64" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) + } + return &float64Codec{} + case reflect.Bool: + if typeName != "bool" { + return encoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) + } + return &boolCodec{} + } + return nil +} + +func createDecoderOfNative(ctx *ctx, typ reflect2.Type) ValDecoder { + if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { + sliceDecoder := decoderOfSlice(ctx, typ) + return &base64Codec{sliceDecoder: sliceDecoder} + } + typeName := typ.String() + switch typ.Kind() { + case reflect.String: + if typeName != "string" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) + } + return &stringCodec{} + case reflect.Int: + if typeName != "int" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &int32Codec{} + } + return &int64Codec{} + case reflect.Int8: + if typeName != "int8" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) + } + return &int8Codec{} + case reflect.Int16: + if typeName != "int16" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) + } + return &int16Codec{} + case reflect.Int32: + if typeName != "int32" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) + } + return &int32Codec{} + case reflect.Int64: + if typeName != "int64" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) + } + return &int64Codec{} + case reflect.Uint: + if typeName != "uint" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) + } + if strconv.IntSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint8: + if typeName != "uint8" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) + } + return &uint8Codec{} + case reflect.Uint16: + if typeName != "uint16" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) + } + return &uint16Codec{} + case reflect.Uint32: + if typeName != "uint32" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) + } + return &uint32Codec{} + case reflect.Uintptr: + if typeName != "uintptr" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) + } + if ptrSize == 32 { + return &uint32Codec{} + } + return &uint64Codec{} + case reflect.Uint64: + if typeName != "uint64" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) + } + return &uint64Codec{} + case reflect.Float32: + if typeName != "float32" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) + } + return &float32Codec{} + case reflect.Float64: + if typeName != "float64" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) + } + return &float64Codec{} + case reflect.Bool: + if typeName != "bool" { + return decoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) + } + return &boolCodec{} + } + return nil +} + +type stringCodec struct { +} + +func (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + *((*string)(ptr)) = iter.ReadString() +} + +func (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + str := *((*string)(ptr)) + stream.WriteString(str) +} + +func (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*string)(ptr)) == "" +} + +type int8Codec struct { +} + +func (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int8)(ptr)) = iter.ReadInt8() + } +} + +func (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt8(*((*int8)(ptr))) +} + +func (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int8)(ptr)) == 0 +} + +type int16Codec struct { +} + +func (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int16)(ptr)) = iter.ReadInt16() + } +} + +func (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt16(*((*int16)(ptr))) +} + +func (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int16)(ptr)) == 0 +} + +type int32Codec struct { +} + +func (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int32)(ptr)) = iter.ReadInt32() + } +} + +func (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt32(*((*int32)(ptr))) +} + +func (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int32)(ptr)) == 0 +} + +type int64Codec struct { +} + +func (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*int64)(ptr)) = iter.ReadInt64() + } +} + +func (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteInt64(*((*int64)(ptr))) +} + +func (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*int64)(ptr)) == 0 +} + +type uint8Codec struct { +} + +func (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint8)(ptr)) = iter.ReadUint8() + } +} + +func (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint8(*((*uint8)(ptr))) +} + +func (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint8)(ptr)) == 0 +} + +type uint16Codec struct { +} + +func (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint16)(ptr)) = iter.ReadUint16() + } +} + +func (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint16(*((*uint16)(ptr))) +} + +func (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint16)(ptr)) == 0 +} + +type uint32Codec struct { +} + +func (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint32)(ptr)) = iter.ReadUint32() + } +} + +func (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint32(*((*uint32)(ptr))) +} + +func (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint32)(ptr)) == 0 +} + +type uint64Codec struct { +} + +func (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*uint64)(ptr)) = iter.ReadUint64() + } +} + +func (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteUint64(*((*uint64)(ptr))) +} + +func (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*uint64)(ptr)) == 0 +} + +type float32Codec struct { +} + +func (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*float32)(ptr)) = iter.ReadFloat32() + } +} + +func (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat32(*((*float32)(ptr))) +} + +func (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float32)(ptr)) == 0 +} + +type float64Codec struct { +} + +func (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*float64)(ptr)) = iter.ReadFloat64() + } +} + +func (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteFloat64(*((*float64)(ptr))) +} + +func (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return *((*float64)(ptr)) == 0 +} + +type boolCodec struct { +} + +func (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if !iter.ReadNil() { + *((*bool)(ptr)) = iter.ReadBool() + } +} + +func (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.WriteBool(*((*bool)(ptr))) +} + +func (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool { + return !(*((*bool)(ptr))) +} + +type base64Codec struct { + sliceType *reflect2.UnsafeSliceType + sliceDecoder ValDecoder +} + +func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + codec.sliceType.UnsafeSetNil(ptr) + return + } + switch iter.WhatIsNext() { + case StringValue: + encoding := base64.StdEncoding + src := iter.SkipAndReturnBytes() + // New line characters (\r and \n) are ignored. + // Refer to https://golang.org/pkg/encoding/base64/#Encoding.Decode + src = bytes.Replace(src, []byte(`\r`), []byte{}, -1) + src = bytes.Replace(src, []byte(`\n`), []byte{}, -1) + src = src[1 : len(src)-1] + decodedLen := encoding.DecodedLen(len(src)) + dst := make([]byte, decodedLen) + len, err := encoding.Decode(dst, src) + if err != nil { + iter.ReportError("decode base64", err.Error()) + } else { + dst = dst[:len] + codec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst)) + } + case ArrayValue: + codec.sliceDecoder.Decode(ptr, iter) + default: + iter.ReportError("base64Codec", "invalid input") + } +} + +func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { + src := *((*[]byte)(ptr)) + if len(src) == 0 { + stream.WriteNil() + return + } + encoding := base64.StdEncoding + stream.writeByte('"') + size := encoding.EncodedLen(len(src)) + buf := make([]byte, size) + encoding.Encode(buf, src) + stream.buf = append(stream.buf, buf...) + stream.writeByte('"') +} + +func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool { + return len(*((*[]byte)(ptr))) == 0 +} diff --git a/vendor/github.com/json-iterator/go/reflect_optional.go b/vendor/github.com/json-iterator/go/reflect_optional.go new file mode 100644 index 00000000..43ec71d6 --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_optional.go @@ -0,0 +1,133 @@ +package jsoniter + +import ( + "github.com/modern-go/reflect2" + "reflect" + "unsafe" +) + +func decoderOfOptional(ctx *ctx, typ reflect2.Type) ValDecoder { + ptrType := typ.(*reflect2.UnsafePtrType) + elemType := ptrType.Elem() + decoder := decoderOfType(ctx, elemType) + if ctx.prefix == "" && elemType.Kind() == reflect.Ptr { + return &dereferenceDecoder{elemType, decoder} + } + return &OptionalDecoder{elemType, decoder} +} + +func encoderOfOptional(ctx *ctx, typ reflect2.Type) ValEncoder { + ptrType := typ.(*reflect2.UnsafePtrType) + elemType := ptrType.Elem() + elemEncoder := encoderOfType(ctx, elemType) + encoder := &OptionalEncoder{elemEncoder} + return encoder +} + +type OptionalDecoder struct { + ValueType reflect2.Type + ValueDecoder ValDecoder +} + +func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if iter.ReadNil() { + *((*unsafe.Pointer)(ptr)) = nil + } else { + if *((*unsafe.Pointer)(ptr)) == nil { + //pointer to null, we have to allocate memory to hold the value + newPtr := decoder.ValueType.UnsafeNew() + decoder.ValueDecoder.Decode(newPtr, iter) + *((*unsafe.Pointer)(ptr)) = newPtr + } else { + //reuse existing instance + decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) + } + } +} + +type dereferenceDecoder struct { + // only to deference a pointer + valueType reflect2.Type + valueDecoder ValDecoder +} + +func (decoder *dereferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + if *((*unsafe.Pointer)(ptr)) == nil { + //pointer to null, we have to allocate memory to hold the value + newPtr := decoder.valueType.UnsafeNew() + decoder.valueDecoder.Decode(newPtr, iter) + *((*unsafe.Pointer)(ptr)) = newPtr + } else { + //reuse existing instance + decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) + } +} + +type OptionalEncoder struct { + ValueEncoder ValEncoder +} + +func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if *((*unsafe.Pointer)(ptr)) == nil { + stream.WriteNil() + } else { + encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) + } +} + +func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return *((*unsafe.Pointer)(ptr)) == nil +} + +type dereferenceEncoder struct { + ValueEncoder ValEncoder +} + +func (encoder *dereferenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if *((*unsafe.Pointer)(ptr)) == nil { + stream.WriteNil() + } else { + encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) + } +} + +func (encoder *dereferenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { + dePtr := *((*unsafe.Pointer)(ptr)) + if dePtr == nil { + return true + } + return encoder.ValueEncoder.IsEmpty(dePtr) +} + +func (encoder *dereferenceEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { + deReferenced := *((*unsafe.Pointer)(ptr)) + if deReferenced == nil { + return true + } + isEmbeddedPtrNil, converted := encoder.ValueEncoder.(IsEmbeddedPtrNil) + if !converted { + return false + } + fieldPtr := unsafe.Pointer(deReferenced) + return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) +} + +type referenceEncoder struct { + encoder ValEncoder +} + +func (encoder *referenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) +} + +func (encoder *referenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) +} + +type referenceDecoder struct { + decoder ValDecoder +} + +func (decoder *referenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.decoder.Decode(unsafe.Pointer(&ptr), iter) +} diff --git a/vendor/github.com/json-iterator/go/reflect_slice.go b/vendor/github.com/json-iterator/go/reflect_slice.go new file mode 100644 index 00000000..9441d79d --- /dev/null +++ b/vendor/github.com/json-iterator/go/reflect_slice.go @@ -0,0 +1,99 @@ +package jsoniter + +import ( + "fmt" + "github.com/modern-go/reflect2" + "io" + "unsafe" +) + +func decoderOfSlice(ctx *ctx, typ reflect2.Type) ValDecoder { + sliceType := typ.(*reflect2.UnsafeSliceType) + decoder := decoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) + return &sliceDecoder{sliceType, decoder} +} + +func encoderOfSlice(ctx *ctx, typ reflect2.Type) ValEncoder { + sliceType := typ.(*reflect2.UnsafeSliceType) + encoder := encoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) + return &sliceEncoder{sliceType, encoder} +} + +type sliceEncoder struct { + sliceType *reflect2.UnsafeSliceType + elemEncoder ValEncoder +} + +func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + if encoder.sliceType.UnsafeIsNil(ptr) { + stream.WriteNil() + return + } + length := encoder.sliceType.UnsafeLengthOf(ptr) + if length == 0 { + stream.WriteEmptyArray() + return + } + stream.WriteArrayStart() + encoder.elemEncoder.Encode(encoder.sliceType.UnsafeGetIndex(ptr, 0), stream) + for i := 1; i < length; i++ { + stream.WriteMore() + elemPtr := encoder.sliceType.UnsafeGetIndex(ptr, i) + encoder.elemEncoder.Encode(elemPtr, stream) + } + stream.WriteArrayEnd() + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v: %s", encoder.sliceType, stream.Error.Error()) + } +} + +func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.sliceType.UnsafeLengthOf(ptr) == 0 +} + +type sliceDecoder struct { + sliceType *reflect2.UnsafeSliceType + elemDecoder ValDecoder +} + +func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.doDecode(ptr, iter) + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error()) + } +} + +func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + sliceType := decoder.sliceType + if c == 'n' { + iter.skipThreeBytes('u', 'l', 'l') + sliceType.UnsafeSetNil(ptr) + return + } + if c != '[' { + iter.ReportError("decode slice", "expect [ or n, but found "+string([]byte{c})) + return + } + c = iter.nextToken() + if c == ']' { + sliceType.UnsafeSet(ptr, sliceType.UnsafeMakeSlice(0, 0)) + return + } + iter.unreadByte() + sliceType.UnsafeGrow(ptr, 1) + elemPtr := sliceType.UnsafeGetIndex(ptr, 0) + decoder.elemDecoder.Decode(elemPtr, iter) + length := 1 + for c = iter.nextToken(); c == ','; c = iter.nextToken() { + idx := length + length += 1 + sliceType.UnsafeGrow(ptr, length) + elemPtr = sliceType.UnsafeGetIndex(ptr, idx) + decoder.elemDecoder.Decode(elemPtr, iter) + } + if c != ']' { + iter.ReportError("decode slice", "expect ], but found "+string([]byte{c})) + return + } +} diff --git a/vendor/github.com/json-iterator/go/feature_reflect_struct_decoder.go b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go similarity index 68% rename from vendor/github.com/json-iterator/go/feature_reflect_struct_decoder.go rename to vendor/github.com/json-iterator/go/reflect_struct_decoder.go index e6ced77c..fd766478 100644 --- a/vendor/github.com/json-iterator/go/feature_reflect_struct_decoder.go +++ b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go @@ -2,39 +2,73 @@ package jsoniter import ( "fmt" + "github.com/modern-go/reflect2" "io" - "reflect" "strings" "unsafe" ) -func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder) (ValDecoder, error) { - knownHash := map[int32]struct{}{ +func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder { + bindings := map[string]*Binding{} + structDescriptor := describeStruct(ctx, typ) + for _, binding := range structDescriptor.Fields { + for _, fromName := range binding.FromNames { + old := bindings[fromName] + if old == nil { + bindings[fromName] = binding + continue + } + ignoreOld, ignoreNew := resolveConflictBinding(ctx.frozenConfig, old, binding) + if ignoreOld { + delete(bindings, fromName) + } + if !ignoreNew { + bindings[fromName] = binding + } + } + } + fields := map[string]*structFieldDecoder{} + for k, binding := range bindings { + fields[k] = binding.Decoder.(*structFieldDecoder) + } + for k, binding := range bindings { + if _, found := fields[strings.ToLower(k)]; !found { + fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) + } + } + return createStructDecoder(ctx, typ, fields) +} + +func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structFieldDecoder) ValDecoder { + if ctx.disallowUnknownFields { + return &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true} + } + knownHash := map[int64]struct{}{ 0: {}, } switch len(fields) { case 0: - return &skipObjectDecoder{typ}, nil + return &skipObjectDecoder{typ} case 1: for fieldName, fieldDecoder := range fields { fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} - return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder}, nil + return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder} } case 2: - var fieldHash1 int32 - var fieldHash2 int32 + var fieldHash1 int64 + var fieldHash2 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder for fieldName, fieldDecoder := range fields { fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldHash1 == 0 { @@ -45,11 +79,11 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldDecoder2 = fieldDecoder } } - return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2}, nil + return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2} case 3: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -57,7 +91,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -72,12 +106,14 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &threeFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3} case 4: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 - var fieldName4 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -86,7 +122,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -104,14 +140,16 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &fourFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4} case 5: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 - var fieldName4 int32 - var fieldName5 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -121,7 +159,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -142,15 +180,18 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &fiveFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5} case 6: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 - var fieldName4 int32 - var fieldName5 int32 - var fieldName6 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -161,7 +202,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -185,16 +226,20 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &sixFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6} case 7: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 - var fieldName4 int32 - var fieldName5 int32 - var fieldName6 int32 - var fieldName7 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -206,7 +251,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -233,18 +278,22 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &sevenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7} case 8: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 - var fieldName4 int32 - var fieldName5 int32 - var fieldName6 int32 - var fieldName7 int32 - var fieldName8 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 + var fieldName8 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -257,7 +306,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -287,19 +336,24 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &eightFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, fieldName8, fieldDecoder8}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, + fieldName8, fieldDecoder8} case 9: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 - var fieldName4 int32 - var fieldName5 int32 - var fieldName6 int32 - var fieldName7 int32 - var fieldName8 int32 - var fieldName9 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 + var fieldName8 int64 + var fieldName9 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -313,7 +367,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -346,20 +400,26 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &nineFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, + fieldName8, fieldDecoder8, + fieldName9, fieldDecoder9} case 10: - var fieldName1 int32 - var fieldName2 int32 - var fieldName3 int32 - var fieldName4 int32 - var fieldName5 int32 - var fieldName6 int32 - var fieldName7 int32 - var fieldName8 int32 - var fieldName9 int32 - var fieldName10 int32 + var fieldName1 int64 + var fieldName2 int64 + var fieldName3 int64 + var fieldName4 int64 + var fieldName5 int64 + var fieldName6 int64 + var fieldName7 int64 + var fieldName8 int64 + var fieldName9 int64 + var fieldName10 int64 var fieldDecoder1 *structFieldDecoder var fieldDecoder2 *structFieldDecoder var fieldDecoder3 *structFieldDecoder @@ -374,7 +434,7 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder fieldHash := calcHash(fieldName) _, known := knownHash[fieldHash] if known { - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } knownHash[fieldHash] = struct{}{} if fieldName1 == 0 { @@ -410,66 +470,80 @@ func createStructDecoder(typ reflect.Type, fields map[string]*structFieldDecoder } } return &tenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, fieldName2, fieldDecoder2, fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, fieldName5, fieldDecoder5, fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, fieldName8, fieldDecoder8, fieldName9, fieldDecoder9, - fieldName10, fieldDecoder10}, nil + fieldName1, fieldDecoder1, + fieldName2, fieldDecoder2, + fieldName3, fieldDecoder3, + fieldName4, fieldDecoder4, + fieldName5, fieldDecoder5, + fieldName6, fieldDecoder6, + fieldName7, fieldDecoder7, + fieldName8, fieldDecoder8, + fieldName9, fieldDecoder9, + fieldName10, fieldDecoder10} } - return &generalStructDecoder{typ, fields}, nil + return &generalStructDecoder{typ, fields, false} } type generalStructDecoder struct { - typ reflect.Type - fields map[string]*structFieldDecoder + typ reflect2.Type + fields map[string]*structFieldDecoder + disallowUnknownFields bool } func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { if !iter.readObjectStart() { return } - var fieldBytes []byte + var c byte + for c = ','; c == ','; c = iter.nextToken() { + decoder.decodeOneField(ptr, iter) + } + if iter.Error != nil && iter.Error != io.EOF { + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) + } + if c != '}' { + iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c})) + } +} + +func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) { var field string + var fieldDecoder *structFieldDecoder if iter.cfg.objectFieldMustBeSimpleString { - fieldBytes = iter.readObjectFieldAsBytes() + fieldBytes := iter.ReadStringAsSlice() field = *(*string)(unsafe.Pointer(&fieldBytes)) + fieldDecoder = decoder.fields[field] + if fieldDecoder == nil { + fieldDecoder = decoder.fields[strings.ToLower(field)] + } } else { field = iter.ReadString() + fieldDecoder = decoder.fields[field] + if fieldDecoder == nil { + fieldDecoder = decoder.fields[strings.ToLower(field)] + } + } + if fieldDecoder == nil { + msg := "found unknown field: " + field + if decoder.disallowUnknownFields { + iter.ReportError("ReadObject", msg) + } c := iter.nextToken() if c != ':' { iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) } - } - fieldDecoder := decoder.fields[strings.ToLower(field)] - if fieldDecoder == nil { iter.Skip() - } else { - fieldDecoder.Decode(ptr, iter) + return } - for iter.nextToken() == ',' { - if iter.cfg.objectFieldMustBeSimpleString { - fieldBytes := iter.readObjectFieldAsBytes() - field = *(*string)(unsafe.Pointer(&fieldBytes)) - } else { - field = iter.ReadString() - c := iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - } - fieldDecoder = decoder.fields[strings.ToLower(field)] - if fieldDecoder == nil { - iter.Skip() - } else { - fieldDecoder.Decode(ptr, iter) - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + c := iter.nextToken() + if c != ':' { + iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) } + fieldDecoder.Decode(ptr, iter) } type skipObjectDecoder struct { - typ reflect.Type + typ reflect2.Type } func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { @@ -482,8 +556,8 @@ func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { } type oneFieldStructDecoder struct { - typ reflect.Type - fieldHash int32 + typ reflect2.Type + fieldHash int64 fieldDecoder *structFieldDecoder } @@ -502,15 +576,15 @@ func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type twoFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder } @@ -532,17 +606,17 @@ func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type threeFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder } @@ -566,19 +640,19 @@ func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type fourFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder - fieldHash4 int32 + fieldHash4 int64 fieldDecoder4 *structFieldDecoder } @@ -604,21 +678,21 @@ func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type fiveFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder - fieldHash4 int32 + fieldHash4 int64 fieldDecoder4 *structFieldDecoder - fieldHash5 int32 + fieldHash5 int64 fieldDecoder5 *structFieldDecoder } @@ -646,23 +720,23 @@ func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type sixFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder - fieldHash4 int32 + fieldHash4 int64 fieldDecoder4 *structFieldDecoder - fieldHash5 int32 + fieldHash5 int64 fieldDecoder5 *structFieldDecoder - fieldHash6 int32 + fieldHash6 int64 fieldDecoder6 *structFieldDecoder } @@ -692,25 +766,25 @@ func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type sevenFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder - fieldHash4 int32 + fieldHash4 int64 fieldDecoder4 *structFieldDecoder - fieldHash5 int32 + fieldHash5 int64 fieldDecoder5 *structFieldDecoder - fieldHash6 int32 + fieldHash6 int64 fieldDecoder6 *structFieldDecoder - fieldHash7 int32 + fieldHash7 int64 fieldDecoder7 *structFieldDecoder } @@ -742,27 +816,27 @@ func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type eightFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder - fieldHash4 int32 + fieldHash4 int64 fieldDecoder4 *structFieldDecoder - fieldHash5 int32 + fieldHash5 int64 fieldDecoder5 *structFieldDecoder - fieldHash6 int32 + fieldHash6 int64 fieldDecoder6 *structFieldDecoder - fieldHash7 int32 + fieldHash7 int64 fieldDecoder7 *structFieldDecoder - fieldHash8 int32 + fieldHash8 int64 fieldDecoder8 *structFieldDecoder } @@ -796,29 +870,29 @@ func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterat } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type nineFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder - fieldHash4 int32 + fieldHash4 int64 fieldDecoder4 *structFieldDecoder - fieldHash5 int32 + fieldHash5 int64 fieldDecoder5 *structFieldDecoder - fieldHash6 int32 + fieldHash6 int64 fieldDecoder6 *structFieldDecoder - fieldHash7 int32 + fieldHash7 int64 fieldDecoder7 *structFieldDecoder - fieldHash8 int32 + fieldHash8 int64 fieldDecoder8 *structFieldDecoder - fieldHash9 int32 + fieldHash9 int64 fieldDecoder9 *structFieldDecoder } @@ -854,31 +928,31 @@ func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterato } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type tenFieldsStructDecoder struct { - typ reflect.Type - fieldHash1 int32 + typ reflect2.Type + fieldHash1 int64 fieldDecoder1 *structFieldDecoder - fieldHash2 int32 + fieldHash2 int64 fieldDecoder2 *structFieldDecoder - fieldHash3 int32 + fieldHash3 int64 fieldDecoder3 *structFieldDecoder - fieldHash4 int32 + fieldHash4 int64 fieldDecoder4 *structFieldDecoder - fieldHash5 int32 + fieldHash5 int64 fieldDecoder5 *structFieldDecoder - fieldHash6 int32 + fieldHash6 int64 fieldDecoder6 *structFieldDecoder - fieldHash7 int32 + fieldHash7 int64 fieldDecoder7 *structFieldDecoder - fieldHash8 int32 + fieldHash8 int64 fieldDecoder8 *structFieldDecoder - fieldHash9 int32 + fieldHash9 int64 fieldDecoder9 *structFieldDecoder - fieldHash10 int32 + fieldHash10 int64 fieldDecoder10 *structFieldDecoder } @@ -916,19 +990,53 @@ func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator } } if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.typ, iter.Error.Error()) + iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) } } type structFieldDecoder struct { - field *reflect.StructField + field reflect2.StructField fieldDecoder ValDecoder } func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - fieldPtr := unsafe.Pointer(uintptr(ptr) + decoder.field.Offset) + fieldPtr := decoder.field.UnsafeGet(ptr) decoder.fieldDecoder.Decode(fieldPtr, iter) if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%s: %s", decoder.field.Name, iter.Error.Error()) + iter.Error = fmt.Errorf("%s: %s", decoder.field.Name(), iter.Error.Error()) + } +} + +type stringModeStringDecoder struct { + elemDecoder ValDecoder + cfg *frozenConfig +} + +func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + decoder.elemDecoder.Decode(ptr, iter) + str := *((*string)(ptr)) + tempIter := decoder.cfg.BorrowIterator([]byte(str)) + defer decoder.cfg.ReturnIterator(tempIter) + *((*string)(ptr)) = tempIter.ReadString() +} + +type stringModeNumberDecoder struct { + elemDecoder ValDecoder +} + +func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { + c := iter.nextToken() + if c != '"' { + iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) + return + } + decoder.elemDecoder.Decode(ptr, iter) + if iter.Error != nil { + return + } + c = iter.readByte() + if c != '"' { + iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) + return } } diff --git a/vendor/github.com/json-iterator/go/feature_reflect_object.go b/vendor/github.com/json-iterator/go/reflect_struct_encoder.go similarity index 50% rename from vendor/github.com/json-iterator/go/feature_reflect_object.go rename to vendor/github.com/json-iterator/go/reflect_struct_encoder.go index 59b1235c..d0759cf6 100644 --- a/vendor/github.com/json-iterator/go/feature_reflect_object.go +++ b/vendor/github.com/json-iterator/go/reflect_struct_encoder.go @@ -2,23 +2,20 @@ package jsoniter import ( "fmt" + "github.com/modern-go/reflect2" "io" "reflect" - "strings" "unsafe" ) -func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { +func encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder { type bindingTo struct { binding *Binding toName string ignored bool } orderedBindings := []*bindingTo{} - structDescriptor, err := describeStruct(cfg, typ) - if err != nil { - return nil, err - } + structDescriptor := describeStruct(ctx, typ) for _, binding := range structDescriptor.Fields { for _, toName := range binding.ToNames { new := &bindingTo{ @@ -29,13 +26,13 @@ func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { if old.toName != toName { continue } - old.ignored, new.ignored = resolveConflictBinding(cfg, old.binding, new.binding) + old.ignored, new.ignored = resolveConflictBinding(ctx.frozenConfig, old.binding, new.binding) } orderedBindings = append(orderedBindings, new) } } if len(orderedBindings) == 0 { - return &emptyStructEncoder{}, nil + return &emptyStructEncoder{} } finalOrderedFields := []structFieldTo{} for _, bindingTo := range orderedBindings { @@ -46,12 +43,36 @@ func encoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) { }) } } - return &structEncoder{structDescriptor.onePtrEmbedded, structDescriptor.onePtrOptimization, finalOrderedFields}, nil + return &structEncoder{typ, finalOrderedFields} +} + +func createCheckIsEmpty(ctx *ctx, typ reflect2.Type) checkIsEmpty { + encoder := createEncoderOfNative(ctx, typ) + if encoder != nil { + return encoder + } + kind := typ.Kind() + switch kind { + case reflect.Interface: + return &dynamicEncoder{typ} + case reflect.Struct: + return &structEncoder{typ: typ} + case reflect.Array: + return &arrayEncoder{} + case reflect.Slice: + return &sliceEncoder{} + case reflect.Map: + return encoderOfMap(ctx, typ) + case reflect.Ptr: + return &OptionalEncoder{} + default: + return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)} + } } func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) { - newTagged := new.Field.Tag.Get(cfg.getTagKey()) != "" - oldTagged := old.Field.Tag.Get(cfg.getTagKey()) != "" + newTagged := new.Field.Tag().Get(cfg.getTagKey()) != "" + oldTagged := old.Field.Tag().Get(cfg.getTagKey()) != "" if newTagged { if oldTagged { if len(old.levels) > len(new.levels) { @@ -78,62 +99,41 @@ func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ig } } -func decoderOfStruct(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) { - bindings := map[string]*Binding{} - structDescriptor, err := describeStruct(cfg, typ) - if err != nil { - return nil, err - } - for _, binding := range structDescriptor.Fields { - for _, fromName := range binding.FromNames { - old := bindings[fromName] - if old == nil { - bindings[fromName] = binding - continue - } - ignoreOld, ignoreNew := resolveConflictBinding(cfg, old, binding) - if ignoreOld { - delete(bindings, fromName) - } - if !ignoreNew { - bindings[fromName] = binding - } - } - } - fields := map[string]*structFieldDecoder{} - for k, binding := range bindings { - fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) - } - return createStructDecoder(typ, fields) -} - type structFieldEncoder struct { - field *reflect.StructField + field reflect2.StructField fieldEncoder ValEncoder omitempty bool } func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - fieldPtr := unsafe.Pointer(uintptr(ptr) + encoder.field.Offset) + fieldPtr := encoder.field.UnsafeGet(ptr) encoder.fieldEncoder.Encode(fieldPtr, stream) if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%s: %s", encoder.field.Name, stream.Error.Error()) + stream.Error = fmt.Errorf("%s: %s", encoder.field.Name(), stream.Error.Error()) } } -func (encoder *structFieldEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool { - fieldPtr := unsafe.Pointer(uintptr(ptr) + encoder.field.Offset) + fieldPtr := encoder.field.UnsafeGet(ptr) return encoder.fieldEncoder.IsEmpty(fieldPtr) } +func (encoder *structFieldEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { + isEmbeddedPtrNil, converted := encoder.fieldEncoder.(IsEmbeddedPtrNil) + if !converted { + return false + } + fieldPtr := encoder.field.UnsafeGet(ptr) + return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) +} + +type IsEmbeddedPtrNil interface { + IsEmbeddedPtrNil(ptr unsafe.Pointer) bool +} + type structEncoder struct { - onePtrEmbedded bool - onePtrOptimization bool - fields []structFieldTo + typ reflect2.Type + fields []structFieldTo } type structFieldTo struct { @@ -148,6 +148,9 @@ func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { if field.encoder.omitempty && field.encoder.IsEmpty(ptr) { continue } + if field.encoder.IsEmbeddedPtrNil(ptr) { + continue + } if isNotFirst { stream.WriteMore() } @@ -156,23 +159,8 @@ func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { isNotFirst = true } stream.WriteObjectEnd() -} - -func (encoder *structEncoder) EncodeInterface(val interface{}, stream *Stream) { - e := (*emptyInterface)(unsafe.Pointer(&val)) - if encoder.onePtrOptimization { - if e.word == nil && encoder.onePtrEmbedded { - stream.WriteObjectStart() - stream.WriteObjectEnd() - return - } - ptr := uintptr(e.word) - e.word = unsafe.Pointer(&ptr) - } - if reflect.TypeOf(val).Kind() == reflect.Ptr { - encoder.Encode(unsafe.Pointer(&e.word), stream) - } else { - encoder.Encode(e.word, stream) + if stream.Error != nil && stream.Error != io.EOF { + stream.Error = fmt.Errorf("%v.%s", encoder.typ, stream.Error.Error()) } } @@ -187,10 +175,36 @@ func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { stream.WriteEmptyObject() } -func (encoder *emptyStructEncoder) EncodeInterface(val interface{}, stream *Stream) { - WriteToStream(val, stream, encoder) -} - func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { return false } + +type stringModeNumberEncoder struct { + elemEncoder ValEncoder +} + +func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + stream.writeByte('"') + encoder.elemEncoder.Encode(ptr, stream) + stream.writeByte('"') +} + +func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.elemEncoder.IsEmpty(ptr) +} + +type stringModeStringEncoder struct { + elemEncoder ValEncoder + cfg *frozenConfig +} + +func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { + tempStream := encoder.cfg.BorrowStream(nil) + defer encoder.cfg.ReturnStream(tempStream) + encoder.elemEncoder.Encode(ptr, tempStream) + stream.WriteString(string(tempStream.Buffer())) +} + +func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { + return encoder.elemEncoder.IsEmpty(ptr) +} diff --git a/vendor/github.com/json-iterator/go/feature_stream.go b/vendor/github.com/json-iterator/go/stream.go similarity index 62% rename from vendor/github.com/json-iterator/go/feature_stream.go rename to vendor/github.com/json-iterator/go/stream.go index 97355eb5..17662fde 100644 --- a/vendor/github.com/json-iterator/go/feature_stream.go +++ b/vendor/github.com/json-iterator/go/stream.go @@ -10,7 +10,6 @@ type Stream struct { cfg *frozenConfig out io.Writer buf []byte - n int Error error indention int Attachment interface{} // open for customized encoder @@ -24,8 +23,7 @@ func NewStream(cfg API, out io.Writer, bufSize int) *Stream { return &Stream{ cfg: cfg.(*frozenConfig), out: out, - buf: make([]byte, bufSize), - n: 0, + buf: make([]byte, 0, bufSize), Error: nil, indention: 0, } @@ -39,22 +37,27 @@ func (stream *Stream) Pool() StreamPool { // Reset reuse this stream instance by assign a new writer func (stream *Stream) Reset(out io.Writer) { stream.out = out - stream.n = 0 + stream.buf = stream.buf[:0] } // Available returns how many bytes are unused in the buffer. func (stream *Stream) Available() int { - return len(stream.buf) - stream.n + return cap(stream.buf) - len(stream.buf) } // Buffered returns the number of bytes that have been written into the current buffer. func (stream *Stream) Buffered() int { - return stream.n + return len(stream.buf) } // Buffer if writer is nil, use this method to take the result func (stream *Stream) Buffer() []byte { - return stream.buf[:stream.n] + return stream.buf +} + +// SetBuffer allows to append to the internal buffer directly +func (stream *Stream) SetBuffer(buf []byte) { + stream.buf = buf } // Write writes the contents of p into the buffer. @@ -62,97 +65,34 @@ func (stream *Stream) Buffer() []byte { // If nn < len(p), it also returns an error explaining // why the write is short. func (stream *Stream) Write(p []byte) (nn int, err error) { - for len(p) > stream.Available() && stream.Error == nil { - if stream.out == nil { - stream.growAtLeast(len(p)) - } else { - var n int - if stream.Buffered() == 0 { - // Large write, empty buffer. - // Write directly from p to avoid copy. - n, stream.Error = stream.out.Write(p) - } else { - n = copy(stream.buf[stream.n:], p) - stream.n += n - stream.Flush() - } - nn += n - p = p[n:] - } + stream.buf = append(stream.buf, p...) + if stream.out != nil { + nn, err = stream.out.Write(stream.buf) + stream.buf = stream.buf[nn:] + return } - if stream.Error != nil { - return nn, stream.Error - } - n := copy(stream.buf[stream.n:], p) - stream.n += n - nn += n - return nn, nil + return len(p), nil } // WriteByte writes a single byte. func (stream *Stream) writeByte(c byte) { - if stream.Error != nil { - return - } - if stream.Available() < 1 { - stream.growAtLeast(1) - } - stream.buf[stream.n] = c - stream.n++ + stream.buf = append(stream.buf, c) } func (stream *Stream) writeTwoBytes(c1 byte, c2 byte) { - if stream.Error != nil { - return - } - if stream.Available() < 2 { - stream.growAtLeast(2) - } - stream.buf[stream.n] = c1 - stream.buf[stream.n+1] = c2 - stream.n += 2 + stream.buf = append(stream.buf, c1, c2) } func (stream *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) { - if stream.Error != nil { - return - } - if stream.Available() < 3 { - stream.growAtLeast(3) - } - stream.buf[stream.n] = c1 - stream.buf[stream.n+1] = c2 - stream.buf[stream.n+2] = c3 - stream.n += 3 + stream.buf = append(stream.buf, c1, c2, c3) } func (stream *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) { - if stream.Error != nil { - return - } - if stream.Available() < 4 { - stream.growAtLeast(4) - } - stream.buf[stream.n] = c1 - stream.buf[stream.n+1] = c2 - stream.buf[stream.n+2] = c3 - stream.buf[stream.n+3] = c4 - stream.n += 4 + stream.buf = append(stream.buf, c1, c2, c3, c4) } func (stream *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) { - if stream.Error != nil { - return - } - if stream.Available() < 5 { - stream.growAtLeast(5) - } - stream.buf[stream.n] = c1 - stream.buf[stream.n+1] = c2 - stream.buf[stream.n+2] = c3 - stream.buf[stream.n+3] = c4 - stream.buf[stream.n+4] = c5 - stream.n += 5 + stream.buf = append(stream.buf, c1, c2, c3, c4, c5) } // Flush writes any buffered data to the underlying io.Writer. @@ -163,56 +103,20 @@ func (stream *Stream) Flush() error { if stream.Error != nil { return stream.Error } - if stream.n == 0 { - return nil - } - n, err := stream.out.Write(stream.buf[0:stream.n]) - if n < stream.n && err == nil { - err = io.ErrShortWrite - } + n, err := stream.out.Write(stream.buf) if err != nil { - if n > 0 && n < stream.n { - copy(stream.buf[0:stream.n-n], stream.buf[n:stream.n]) + if stream.Error == nil { + stream.Error = err } - stream.n -= n - stream.Error = err return err } - stream.n = 0 + stream.buf = stream.buf[n:] return nil } -func (stream *Stream) ensure(minimal int) { - available := stream.Available() - if available < minimal { - stream.growAtLeast(minimal) - } -} - -func (stream *Stream) growAtLeast(minimal int) { - if stream.out != nil { - stream.Flush() - if stream.Available() >= minimal { - return - } - } - toGrow := len(stream.buf) - if toGrow < minimal { - toGrow = minimal - } - newBuf := make([]byte, len(stream.buf)+toGrow) - copy(newBuf, stream.Buffer()) - stream.buf = newBuf -} - // WriteRaw write string out without quotes, just like []byte func (stream *Stream) WriteRaw(s string) { - stream.ensure(len(s)) - if stream.Error != nil { - return - } - n := copy(stream.buf[stream.n:], s) - stream.n += n + stream.buf = append(stream.buf, s...) } // WriteNil write null to stream @@ -273,6 +177,7 @@ func (stream *Stream) WriteEmptyObject() { func (stream *Stream) WriteMore() { stream.writeByte(',') stream.writeIndention(0) + stream.Flush() } // WriteArrayStart write [ with possible indention @@ -300,9 +205,7 @@ func (stream *Stream) writeIndention(delta int) { } stream.writeByte('\n') toWrite := stream.indention - delta - stream.ensure(toWrite) - for i := 0; i < toWrite && stream.n < len(stream.buf); i++ { - stream.buf[stream.n] = ' ' - stream.n++ + for i := 0; i < toWrite; i++ { + stream.buf = append(stream.buf, ' ') } } diff --git a/vendor/github.com/json-iterator/go/feature_stream_float.go b/vendor/github.com/json-iterator/go/stream_float.go similarity index 85% rename from vendor/github.com/json-iterator/go/feature_stream_float.go rename to vendor/github.com/json-iterator/go/stream_float.go index 9a404e11..f318d2c5 100644 --- a/vendor/github.com/json-iterator/go/feature_stream_float.go +++ b/vendor/github.com/json-iterator/go/stream_float.go @@ -21,7 +21,7 @@ func (stream *Stream) WriteFloat32(val float32) { fmt = 'e' } } - stream.WriteRaw(strconv.FormatFloat(float64(val), fmt, -1, 32)) + stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32) } // WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster @@ -43,13 +43,12 @@ func (stream *Stream) WriteFloat32Lossy(val float32) { return } stream.writeByte('.') - stream.ensure(10) for p := precision - 1; p > 0 && fval < pow10[p]; p-- { stream.writeByte('0') } stream.WriteUint64(fval) - for stream.buf[stream.n-1] == '0' { - stream.n-- + for stream.buf[len(stream.buf)-1] == '0' { + stream.buf = stream.buf[:len(stream.buf)-1] } } @@ -63,7 +62,7 @@ func (stream *Stream) WriteFloat64(val float64) { fmt = 'e' } } - stream.WriteRaw(strconv.FormatFloat(float64(val), fmt, -1, 64)) + stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64) } // WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster @@ -85,12 +84,11 @@ func (stream *Stream) WriteFloat64Lossy(val float64) { return } stream.writeByte('.') - stream.ensure(10) for p := precision - 1; p > 0 && fval < pow10[p]; p-- { stream.writeByte('0') } stream.WriteUint64(fval) - for stream.buf[stream.n-1] == '0' { - stream.n-- + for stream.buf[len(stream.buf)-1] == '0' { + stream.buf = stream.buf[:len(stream.buf)-1] } } diff --git a/vendor/github.com/json-iterator/go/stream_int.go b/vendor/github.com/json-iterator/go/stream_int.go new file mode 100644 index 00000000..d1059ee4 --- /dev/null +++ b/vendor/github.com/json-iterator/go/stream_int.go @@ -0,0 +1,190 @@ +package jsoniter + +var digits []uint32 + +func init() { + digits = make([]uint32, 1000) + for i := uint32(0); i < 1000; i++ { + digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' + if i < 10 { + digits[i] += 2 << 24 + } else if i < 100 { + digits[i] += 1 << 24 + } + } +} + +func writeFirstBuf(space []byte, v uint32) []byte { + start := v >> 24 + if start == 0 { + space = append(space, byte(v>>16), byte(v>>8)) + } else if start == 1 { + space = append(space, byte(v>>8)) + } + space = append(space, byte(v)) + return space +} + +func writeBuf(buf []byte, v uint32) []byte { + return append(buf, byte(v>>16), byte(v>>8), byte(v)) +} + +// WriteUint8 write uint8 to stream +func (stream *Stream) WriteUint8(val uint8) { + stream.buf = writeFirstBuf(stream.buf, digits[val]) +} + +// WriteInt8 write int8 to stream +func (stream *Stream) WriteInt8(nval int8) { + var val uint8 + if nval < 0 { + val = uint8(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint8(nval) + } + stream.buf = writeFirstBuf(stream.buf, digits[val]) +} + +// WriteUint16 write uint16 to stream +func (stream *Stream) WriteUint16(val uint16) { + q1 := val / 1000 + if q1 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[val]) + return + } + r1 := val - q1*1000 + stream.buf = writeFirstBuf(stream.buf, digits[q1]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return +} + +// WriteInt16 write int16 to stream +func (stream *Stream) WriteInt16(nval int16) { + var val uint16 + if nval < 0 { + val = uint16(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint16(nval) + } + stream.WriteUint16(val) +} + +// WriteUint32 write uint32 to stream +func (stream *Stream) WriteUint32(val uint32) { + q1 := val / 1000 + if q1 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[val]) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q1]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q2]) + } else { + r3 := q2 - q3*1000 + stream.buf = append(stream.buf, byte(q3+'0')) + stream.buf = writeBuf(stream.buf, digits[r3]) + } + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) +} + +// WriteInt32 write int32 to stream +func (stream *Stream) WriteInt32(nval int32) { + var val uint32 + if nval < 0 { + val = uint32(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint32(nval) + } + stream.WriteUint32(val) +} + +// WriteUint64 write uint64 to stream +func (stream *Stream) WriteUint64(val uint64) { + q1 := val / 1000 + if q1 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[val]) + return + } + r1 := val - q1*1000 + q2 := q1 / 1000 + if q2 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q1]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r2 := q1 - q2*1000 + q3 := q2 / 1000 + if q3 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q2]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r3 := q2 - q3*1000 + q4 := q3 / 1000 + if q4 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q3]) + stream.buf = writeBuf(stream.buf, digits[r3]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r4 := q3 - q4*1000 + q5 := q4 / 1000 + if q5 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q4]) + stream.buf = writeBuf(stream.buf, digits[r4]) + stream.buf = writeBuf(stream.buf, digits[r3]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) + return + } + r5 := q4 - q5*1000 + q6 := q5 / 1000 + if q6 == 0 { + stream.buf = writeFirstBuf(stream.buf, digits[q5]) + } else { + stream.buf = writeFirstBuf(stream.buf, digits[q6]) + r6 := q5 - q6*1000 + stream.buf = writeBuf(stream.buf, digits[r6]) + } + stream.buf = writeBuf(stream.buf, digits[r5]) + stream.buf = writeBuf(stream.buf, digits[r4]) + stream.buf = writeBuf(stream.buf, digits[r3]) + stream.buf = writeBuf(stream.buf, digits[r2]) + stream.buf = writeBuf(stream.buf, digits[r1]) +} + +// WriteInt64 write int64 to stream +func (stream *Stream) WriteInt64(nval int64) { + var val uint64 + if nval < 0 { + val = uint64(-nval) + stream.buf = append(stream.buf, '-') + } else { + val = uint64(nval) + } + stream.WriteUint64(val) +} + +// WriteInt write int to stream +func (stream *Stream) WriteInt(val int) { + stream.WriteInt64(int64(val)) +} + +// WriteUint write uint to stream +func (stream *Stream) WriteUint(val uint) { + stream.WriteUint64(uint64(val)) +} diff --git a/vendor/github.com/json-iterator/go/feature_stream_string.go b/vendor/github.com/json-iterator/go/stream_str.go similarity index 91% rename from vendor/github.com/json-iterator/go/feature_stream_string.go rename to vendor/github.com/json-iterator/go/stream_str.go index 334282f0..54c2ba0b 100644 --- a/vendor/github.com/json-iterator/go/feature_stream_string.go +++ b/vendor/github.com/json-iterator/go/stream_str.go @@ -219,34 +219,22 @@ var hex = "0123456789abcdef" // WriteStringWithHTMLEscaped write string to stream with html special characters escaped func (stream *Stream) WriteStringWithHTMLEscaped(s string) { - stream.ensure(32) valLen := len(s) - toWriteLen := valLen - bufLengthMinusTwo := len(stream.buf) - 2 // make room for the quotes - if stream.n+toWriteLen > bufLengthMinusTwo { - toWriteLen = bufLengthMinusTwo - stream.n - } - n := stream.n - stream.buf[n] = '"' - n++ + stream.buf = append(stream.buf, '"') // write string, the fast path, without utf8 and escape support i := 0 - for ; i < toWriteLen; i++ { + for ; i < valLen; i++ { c := s[i] if c < utf8.RuneSelf && htmlSafeSet[c] { - stream.buf[n] = c - n++ + stream.buf = append(stream.buf, c) } else { break } } if i == valLen { - stream.buf[n] = '"' - n++ - stream.n = n + stream.buf = append(stream.buf, '"') return } - stream.n = n writeStringSlowPathWithHTMLEscaped(stream, i, s, valLen) } @@ -321,34 +309,22 @@ func writeStringSlowPathWithHTMLEscaped(stream *Stream, i int, s string, valLen // WriteString write string to stream without html escape func (stream *Stream) WriteString(s string) { - stream.ensure(32) valLen := len(s) - toWriteLen := valLen - bufLengthMinusTwo := len(stream.buf) - 2 // make room for the quotes - if stream.n+toWriteLen > bufLengthMinusTwo { - toWriteLen = bufLengthMinusTwo - stream.n - } - n := stream.n - stream.buf[n] = '"' - n++ + stream.buf = append(stream.buf, '"') // write string, the fast path, without utf8 and escape support i := 0 - for ; i < toWriteLen; i++ { + for ; i < valLen; i++ { c := s[i] if c > 31 && c != '"' && c != '\\' { - stream.buf[n] = c - n++ + stream.buf = append(stream.buf, c) } else { break } } if i == valLen { - stream.buf[n] = '"' - n++ - stream.n = n + stream.buf = append(stream.buf, '"') return } - stream.n = n writeStringSlowPath(stream, i, s, valLen) } diff --git a/vendor/github.com/json-iterator/go/test.sh b/vendor/github.com/json-iterator/go/test.sh index 466f1141..f4e7c0b2 100755 --- a/vendor/github.com/json-iterator/go/test.sh +++ b/vendor/github.com/json-iterator/go/test.sh @@ -4,7 +4,7 @@ set -e echo "" > coverage.txt for d in $(go list ./... | grep -v vendor); do - go test -coverprofile=profile.out $d + go test -coverprofile=profile.out -coverpkg=github.com/json-iterator/go $d if [ -f profile.out ]; then cat profile.out >> coverage.txt rm profile.out diff --git a/vendor/github.com/modern-go/concurrent/.gitignore b/vendor/github.com/modern-go/concurrent/.gitignore new file mode 100644 index 00000000..3f2bc474 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/.gitignore @@ -0,0 +1 @@ +/coverage.txt diff --git a/vendor/github.com/modern-go/concurrent/.travis.yml b/vendor/github.com/modern-go/concurrent/.travis.yml new file mode 100644 index 00000000..449e67cd --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/.travis.yml @@ -0,0 +1,14 @@ +language: go + +go: + - 1.8.x + - 1.x + +before_install: + - go get -t -v ./... + +script: + - ./test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/modern-go/concurrent/LICENSE b/vendor/github.com/modern-go/concurrent/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/modern-go/concurrent/README.md b/vendor/github.com/modern-go/concurrent/README.md new file mode 100644 index 00000000..acab3200 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/README.md @@ -0,0 +1,49 @@ +# concurrent + +[![Sourcegraph](https://sourcegraph.com/github.com/modern-go/concurrent/-/badge.svg)](https://sourcegraph.com/github.com/modern-go/concurrent?badge) +[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/modern-go/concurrent) +[![Build Status](https://travis-ci.org/modern-go/concurrent.svg?branch=master)](https://travis-ci.org/modern-go/concurrent) +[![codecov](https://codecov.io/gh/modern-go/concurrent/branch/master/graph/badge.svg)](https://codecov.io/gh/modern-go/concurrent) +[![rcard](https://goreportcard.com/badge/github.com/modern-go/concurrent)](https://goreportcard.com/report/github.com/modern-go/concurrent) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://raw.githubusercontent.com/modern-go/concurrent/master/LICENSE) + +* concurrent.Map: backport sync.Map for go below 1.9 +* concurrent.Executor: goroutine with explicit ownership and cancellable + +# concurrent.Map + +because sync.Map is only available in go 1.9, we can use concurrent.Map to make code portable + +```go +m := concurrent.NewMap() +m.Store("hello", "world") +elem, found := m.Load("hello") +// elem will be "world" +// found will be true +``` + +# concurrent.Executor + +```go +executor := concurrent.NewUnboundedExecutor() +executor.Go(func(ctx context.Context) { + everyMillisecond := time.NewTicker(time.Millisecond) + for { + select { + case <-ctx.Done(): + fmt.Println("goroutine exited") + return + case <-everyMillisecond.C: + // do something + } + } +}) +time.Sleep(time.Second) +executor.StopAndWaitForever() +fmt.Println("executor stopped") +``` + +attach goroutine to executor instance, so that we can + +* cancel it by stop the executor with Stop/StopAndWait/StopAndWaitForever +* handle panic by callback: the default behavior will no longer crash your application \ No newline at end of file diff --git a/vendor/github.com/modern-go/concurrent/executor.go b/vendor/github.com/modern-go/concurrent/executor.go new file mode 100644 index 00000000..623dba1a --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/executor.go @@ -0,0 +1,14 @@ +package concurrent + +import "context" + +// Executor replace go keyword to start a new goroutine +// the goroutine should cancel itself if the context passed in has been cancelled +// the goroutine started by the executor, is owned by the executor +// we can cancel all executors owned by the executor just by stop the executor itself +// however Executor interface does not Stop method, the one starting and owning executor +// should use the concrete type of executor, instead of this interface. +type Executor interface { + // Go starts a new goroutine controlled by the context + Go(handler func(ctx context.Context)) +} diff --git a/vendor/github.com/modern-go/concurrent/go_above_19.go b/vendor/github.com/modern-go/concurrent/go_above_19.go new file mode 100644 index 00000000..aeabf8c4 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/go_above_19.go @@ -0,0 +1,15 @@ +//+build go1.9 + +package concurrent + +import "sync" + +// Map is a wrapper for sync.Map introduced in go1.9 +type Map struct { + sync.Map +} + +// NewMap creates a thread safe Map +func NewMap() *Map { + return &Map{} +} diff --git a/vendor/github.com/modern-go/concurrent/go_below_19.go b/vendor/github.com/modern-go/concurrent/go_below_19.go new file mode 100644 index 00000000..b9c8df7f --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/go_below_19.go @@ -0,0 +1,33 @@ +//+build !go1.9 + +package concurrent + +import "sync" + +// Map implements a thread safe map for go version below 1.9 using mutex +type Map struct { + lock sync.RWMutex + data map[interface{}]interface{} +} + +// NewMap creates a thread safe map +func NewMap() *Map { + return &Map{ + data: make(map[interface{}]interface{}, 32), + } +} + +// Load is same as sync.Map Load +func (m *Map) Load(key interface{}) (elem interface{}, found bool) { + m.lock.RLock() + elem, found = m.data[key] + m.lock.RUnlock() + return +} + +// Load is same as sync.Map Store +func (m *Map) Store(key interface{}, elem interface{}) { + m.lock.Lock() + m.data[key] = elem + m.lock.Unlock() +} diff --git a/vendor/github.com/modern-go/concurrent/log.go b/vendor/github.com/modern-go/concurrent/log.go new file mode 100644 index 00000000..5e8f46a5 --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/log.go @@ -0,0 +1,13 @@ +package concurrent + +import ( + "os" + "log" + "io/ioutil" +) + +// ErrorLogger is used to print out error, can be set to writer other than stderr +var ErrorLogger = log.New(os.Stderr, "", 0) + +// InfoLogger is used to print informational message, default to off +var InfoLogger = log.New(ioutil.Discard, "", 0) diff --git a/vendor/github.com/modern-go/concurrent/test.sh b/vendor/github.com/modern-go/concurrent/test.sh new file mode 100755 index 00000000..d1e6b2ec --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -coverprofile=profile.out -coverpkg=github.com/modern-go/concurrent $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/modern-go/concurrent/unbounded_executor.go b/vendor/github.com/modern-go/concurrent/unbounded_executor.go new file mode 100644 index 00000000..05a77dce --- /dev/null +++ b/vendor/github.com/modern-go/concurrent/unbounded_executor.go @@ -0,0 +1,119 @@ +package concurrent + +import ( + "context" + "fmt" + "runtime" + "runtime/debug" + "sync" + "time" + "reflect" +) + +// HandlePanic logs goroutine panic by default +var HandlePanic = func(recovered interface{}, funcName string) { + ErrorLogger.Println(fmt.Sprintf("%s panic: %v", funcName, recovered)) + ErrorLogger.Println(string(debug.Stack())) +} + +// UnboundedExecutor is a executor without limits on counts of alive goroutines +// it tracks the goroutine started by it, and can cancel them when shutdown +type UnboundedExecutor struct { + ctx context.Context + cancel context.CancelFunc + activeGoroutinesMutex *sync.Mutex + activeGoroutines map[string]int + HandlePanic func(recovered interface{}, funcName string) +} + +// GlobalUnboundedExecutor has the life cycle of the program itself +// any goroutine want to be shutdown before main exit can be started from this executor +// GlobalUnboundedExecutor expects the main function to call stop +// it does not magically knows the main function exits +var GlobalUnboundedExecutor = NewUnboundedExecutor() + +// NewUnboundedExecutor creates a new UnboundedExecutor, +// UnboundedExecutor can not be created by &UnboundedExecutor{} +// HandlePanic can be set with a callback to override global HandlePanic +func NewUnboundedExecutor() *UnboundedExecutor { + ctx, cancel := context.WithCancel(context.TODO()) + return &UnboundedExecutor{ + ctx: ctx, + cancel: cancel, + activeGoroutinesMutex: &sync.Mutex{}, + activeGoroutines: map[string]int{}, + } +} + +// Go starts a new goroutine and tracks its lifecycle. +// Panic will be recovered and logged automatically, except for StopSignal +func (executor *UnboundedExecutor) Go(handler func(ctx context.Context)) { + pc := reflect.ValueOf(handler).Pointer() + f := runtime.FuncForPC(pc) + funcName := f.Name() + file, line := f.FileLine(pc) + executor.activeGoroutinesMutex.Lock() + defer executor.activeGoroutinesMutex.Unlock() + startFrom := fmt.Sprintf("%s:%d", file, line) + executor.activeGoroutines[startFrom] += 1 + go func() { + defer func() { + recovered := recover() + // if you want to quit a goroutine without trigger HandlePanic + // use runtime.Goexit() to quit + if recovered != nil { + if executor.HandlePanic == nil { + HandlePanic(recovered, funcName) + } else { + executor.HandlePanic(recovered, funcName) + } + } + executor.activeGoroutinesMutex.Lock() + executor.activeGoroutines[startFrom] -= 1 + executor.activeGoroutinesMutex.Unlock() + }() + handler(executor.ctx) + }() +} + +// Stop cancel all goroutines started by this executor without wait +func (executor *UnboundedExecutor) Stop() { + executor.cancel() +} + +// StopAndWaitForever cancel all goroutines started by this executor and +// wait until all goroutines exited +func (executor *UnboundedExecutor) StopAndWaitForever() { + executor.StopAndWait(context.Background()) +} + +// StopAndWait cancel all goroutines started by this executor and wait. +// Wait can be cancelled by the context passed in. +func (executor *UnboundedExecutor) StopAndWait(ctx context.Context) { + executor.cancel() + for { + oneHundredMilliseconds := time.NewTimer(time.Millisecond * 100) + select { + case <-oneHundredMilliseconds.C: + if executor.checkNoActiveGoroutines() { + return + } + case <-ctx.Done(): + return + } + } +} + +func (executor *UnboundedExecutor) checkNoActiveGoroutines() bool { + executor.activeGoroutinesMutex.Lock() + defer executor.activeGoroutinesMutex.Unlock() + for startFrom, count := range executor.activeGoroutines { + if count > 0 { + InfoLogger.Println("UnboundedExecutor is still waiting goroutines to quit", + "startFrom", startFrom, + "count", count) + return false + } + } + return true +} diff --git a/vendor/github.com/modern-go/reflect2/.gitignore b/vendor/github.com/modern-go/reflect2/.gitignore new file mode 100644 index 00000000..7b26c946 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/.gitignore @@ -0,0 +1,2 @@ +/vendor +/coverage.txt diff --git a/vendor/github.com/modern-go/reflect2/.travis.yml b/vendor/github.com/modern-go/reflect2/.travis.yml new file mode 100644 index 00000000..449e67cd --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/.travis.yml @@ -0,0 +1,14 @@ +language: go + +go: + - 1.8.x + - 1.x + +before_install: + - go get -t -v ./... + +script: + - ./test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/modern-go/reflect2/Gopkg.lock b/vendor/github.com/modern-go/reflect2/Gopkg.lock new file mode 100644 index 00000000..2a3a6989 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/Gopkg.lock @@ -0,0 +1,15 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/modern-go/concurrent" + packages = ["."] + revision = "e0a39a4cb4216ea8db28e22a69f4ec25610d513a" + version = "1.0.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "daee8a88b3498b61c5640056665b8b9eea062006f5e596bbb6a3ed9119a11ec7" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/vendor/github.com/modern-go/reflect2/Gopkg.toml b/vendor/github.com/modern-go/reflect2/Gopkg.toml new file mode 100644 index 00000000..3593fd04 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/Gopkg.toml @@ -0,0 +1,35 @@ +# Gopkg.toml example +# +# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + +ignored = ["github.com/modern-go/test","github.com/modern-go/test/must","github.com/modern-go/test/should"] + +[[constraint]] + name = "github.com/modern-go/concurrent" + version = "1.0.0" + +[prune] + go-tests = true + unused-packages = true diff --git a/vendor/github.com/modern-go/reflect2/LICENSE b/vendor/github.com/modern-go/reflect2/LICENSE new file mode 100644 index 00000000..261eeb9e --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/vendor/github.com/modern-go/reflect2/README.md b/vendor/github.com/modern-go/reflect2/README.md new file mode 100644 index 00000000..6f968aab --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/README.md @@ -0,0 +1,71 @@ +# reflect2 + +[![Sourcegraph](https://sourcegraph.com/github.com/modern-go/reflect2/-/badge.svg)](https://sourcegraph.com/github.com/modern-go/reflect2?badge) +[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/modern-go/reflect2) +[![Build Status](https://travis-ci.org/modern-go/reflect2.svg?branch=master)](https://travis-ci.org/modern-go/reflect2) +[![codecov](https://codecov.io/gh/modern-go/reflect2/branch/master/graph/badge.svg)](https://codecov.io/gh/modern-go/reflect2) +[![rcard](https://goreportcard.com/badge/github.com/modern-go/reflect2)](https://goreportcard.com/report/github.com/modern-go/reflect2) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://raw.githubusercontent.com/modern-go/reflect2/master/LICENSE) + +reflect api that avoids runtime reflect.Value cost + +* reflect get/set interface{}, with type checking +* reflect get/set unsafe.Pointer, without type checking +* `reflect2.TypeByName` works like `Class.forName` found in java + +[json-iterator](https://github.com/json-iterator/go) use this package to save runtime dispatching cost. +This package is designed for low level libraries to optimize reflection performance. +General application should still use reflect standard library. + +# reflect2.TypeByName + +```go +// given package is github.com/your/awesome-package +type MyStruct struct { + // ... +} + +// will return the type +reflect2.TypeByName("awesome-package.MyStruct") +// however, if the type has not been used +// it will be eliminated by compiler, so we can not get it in runtime +``` + +# reflect2 get/set interface{} + +```go +valType := reflect2.TypeOf(1) +i := 1 +j := 10 +valType.Set(&i, &j) +// i will be 10 +``` + +to get set `type`, always use its pointer `*type` + +# reflect2 get/set unsafe.Pointer + +```go +valType := reflect2.TypeOf(1) +i := 1 +j := 10 +valType.UnsafeSet(unsafe.Pointer(&i), unsafe.Pointer(&j)) +// i will be 10 +``` + +to get set `type`, always use its pointer `*type` + +# benchmark + +Benchmark is not necessary for this package. It does nothing actually. +As it is just a thin wrapper to make go runtime public. +Both `reflect2` and `reflect` call same function +provided by `runtime` package exposed by go language. + +# unsafe safety + +Instead of casting `[]byte` to `sliceHeader` in your application using unsafe. +We can use reflect2 instead. This way, if `sliceHeader` changes in the future, +only reflect2 need to be upgraded. + +reflect2 tries its best to keep the implementation same as reflect (by testing). \ No newline at end of file diff --git a/vendor/github.com/modern-go/reflect2/go_above_17.go b/vendor/github.com/modern-go/reflect2/go_above_17.go new file mode 100644 index 00000000..5c1cea86 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_above_17.go @@ -0,0 +1,8 @@ +//+build go1.7 + +package reflect2 + +import "unsafe" + +//go:linkname resolveTypeOff reflect.resolveTypeOff +func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer diff --git a/vendor/github.com/modern-go/reflect2/go_above_19.go b/vendor/github.com/modern-go/reflect2/go_above_19.go new file mode 100644 index 00000000..c7e3b780 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_above_19.go @@ -0,0 +1,14 @@ +//+build go1.9 + +package reflect2 + +import ( + "unsafe" +) + +//go:linkname makemap reflect.makemap +func makemap(rtype unsafe.Pointer, cap int) (m unsafe.Pointer) + +func makeMapWithSize(rtype unsafe.Pointer, cap int) unsafe.Pointer { + return makemap(rtype, cap) +} diff --git a/vendor/github.com/modern-go/reflect2/go_below_17.go b/vendor/github.com/modern-go/reflect2/go_below_17.go new file mode 100644 index 00000000..65a93c88 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_below_17.go @@ -0,0 +1,9 @@ +//+build !go1.7 + +package reflect2 + +import "unsafe" + +func resolveTypeOff(rtype unsafe.Pointer, off int32) unsafe.Pointer { + return nil +} diff --git a/vendor/github.com/modern-go/reflect2/go_below_19.go b/vendor/github.com/modern-go/reflect2/go_below_19.go new file mode 100644 index 00000000..b050ef70 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/go_below_19.go @@ -0,0 +1,14 @@ +//+build !go1.9 + +package reflect2 + +import ( + "unsafe" +) + +//go:linkname makemap reflect.makemap +func makemap(rtype unsafe.Pointer) (m unsafe.Pointer) + +func makeMapWithSize(rtype unsafe.Pointer, cap int) unsafe.Pointer { + return makemap(rtype) +} diff --git a/vendor/github.com/modern-go/reflect2/reflect2.go b/vendor/github.com/modern-go/reflect2/reflect2.go new file mode 100644 index 00000000..0632b71f --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/reflect2.go @@ -0,0 +1,295 @@ +package reflect2 + +import ( + "github.com/modern-go/concurrent" + "reflect" + "unsafe" +) + +type Type interface { + Kind() reflect.Kind + // New return pointer to data of this type + New() interface{} + // UnsafeNew return the allocated space pointed by unsafe.Pointer + UnsafeNew() unsafe.Pointer + // PackEFace cast a unsafe pointer to object represented pointer + PackEFace(ptr unsafe.Pointer) interface{} + // Indirect dereference object represented pointer to this type + Indirect(obj interface{}) interface{} + // UnsafeIndirect dereference pointer to this type + UnsafeIndirect(ptr unsafe.Pointer) interface{} + // Type1 returns reflect.Type + Type1() reflect.Type + Implements(thatType Type) bool + String() string + RType() uintptr + // interface{} of this type has pointer like behavior + LikePtr() bool + IsNullable() bool + IsNil(obj interface{}) bool + UnsafeIsNil(ptr unsafe.Pointer) bool + Set(obj interface{}, val interface{}) + UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) + AssignableTo(anotherType Type) bool +} + +type ListType interface { + Type + Elem() Type + SetIndex(obj interface{}, index int, elem interface{}) + UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) + GetIndex(obj interface{}, index int) interface{} + UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer +} + +type ArrayType interface { + ListType + Len() int +} + +type SliceType interface { + ListType + MakeSlice(length int, cap int) interface{} + UnsafeMakeSlice(length int, cap int) unsafe.Pointer + Grow(obj interface{}, newLength int) + UnsafeGrow(ptr unsafe.Pointer, newLength int) + Append(obj interface{}, elem interface{}) + UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) + LengthOf(obj interface{}) int + UnsafeLengthOf(ptr unsafe.Pointer) int + SetNil(obj interface{}) + UnsafeSetNil(ptr unsafe.Pointer) + Cap(obj interface{}) int + UnsafeCap(ptr unsafe.Pointer) int +} + +type StructType interface { + Type + NumField() int + Field(i int) StructField + FieldByName(name string) StructField + FieldByIndex(index []int) StructField + FieldByNameFunc(match func(string) bool) StructField +} + +type StructField interface { + Offset() uintptr + Name() string + PkgPath() string + Type() Type + Tag() reflect.StructTag + Index() []int + Anonymous() bool + Set(obj interface{}, value interface{}) + UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) + Get(obj interface{}) interface{} + UnsafeGet(obj unsafe.Pointer) unsafe.Pointer +} + +type MapType interface { + Type + Key() Type + Elem() Type + MakeMap(cap int) interface{} + UnsafeMakeMap(cap int) unsafe.Pointer + SetIndex(obj interface{}, key interface{}, elem interface{}) + UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) + TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) + GetIndex(obj interface{}, key interface{}) interface{} + UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer + Iterate(obj interface{}) MapIterator + UnsafeIterate(obj unsafe.Pointer) MapIterator +} + +type MapIterator interface { + HasNext() bool + Next() (key interface{}, elem interface{}) + UnsafeNext() (key unsafe.Pointer, elem unsafe.Pointer) +} + +type PtrType interface { + Type + Elem() Type +} + +type InterfaceType interface { + NumMethod() int +} + +type Config struct { + UseSafeImplementation bool +} + +type API interface { + TypeOf(obj interface{}) Type + Type2(type1 reflect.Type) Type +} + +var ConfigUnsafe = Config{UseSafeImplementation: false}.Froze() +var ConfigSafe = Config{UseSafeImplementation: true}.Froze() + +type frozenConfig struct { + useSafeImplementation bool + cache *concurrent.Map +} + +func (cfg Config) Froze() *frozenConfig { + return &frozenConfig{ + useSafeImplementation: cfg.UseSafeImplementation, + cache: concurrent.NewMap(), + } +} + +func (cfg *frozenConfig) TypeOf(obj interface{}) Type { + cacheKey := uintptr(unpackEFace(obj).rtype) + typeObj, found := cfg.cache.Load(cacheKey) + if found { + return typeObj.(Type) + } + return cfg.Type2(reflect.TypeOf(obj)) +} + +func (cfg *frozenConfig) Type2(type1 reflect.Type) Type { + cacheKey := uintptr(unpackEFace(type1).data) + typeObj, found := cfg.cache.Load(cacheKey) + if found { + return typeObj.(Type) + } + type2 := cfg.wrapType(type1) + cfg.cache.Store(cacheKey, type2) + return type2 +} + +func (cfg *frozenConfig) wrapType(type1 reflect.Type) Type { + safeType := safeType{Type: type1, cfg: cfg} + switch type1.Kind() { + case reflect.Struct: + if cfg.useSafeImplementation { + return &safeStructType{safeType} + } + return newUnsafeStructType(cfg, type1) + case reflect.Array: + if cfg.useSafeImplementation { + return &safeSliceType{safeType} + } + return newUnsafeArrayType(cfg, type1) + case reflect.Slice: + if cfg.useSafeImplementation { + return &safeSliceType{safeType} + } + return newUnsafeSliceType(cfg, type1) + case reflect.Map: + if cfg.useSafeImplementation { + return &safeMapType{safeType} + } + return newUnsafeMapType(cfg, type1) + case reflect.Ptr, reflect.Chan, reflect.Func: + if cfg.useSafeImplementation { + return &safeMapType{safeType} + } + return newUnsafePtrType(cfg, type1) + case reflect.Interface: + if cfg.useSafeImplementation { + return &safeMapType{safeType} + } + if type1.NumMethod() == 0 { + return newUnsafeEFaceType(cfg, type1) + } + return newUnsafeIFaceType(cfg, type1) + default: + if cfg.useSafeImplementation { + return &safeType + } + return newUnsafeType(cfg, type1) + } +} + +func TypeOf(obj interface{}) Type { + return ConfigUnsafe.TypeOf(obj) +} + +func TypeOfPtr(obj interface{}) PtrType { + return TypeOf(obj).(PtrType) +} + +func Type2(type1 reflect.Type) Type { + if type1 == nil { + return nil + } + return ConfigUnsafe.Type2(type1) +} + +func PtrTo(typ Type) Type { + return Type2(reflect.PtrTo(typ.Type1())) +} + +func PtrOf(obj interface{}) unsafe.Pointer { + return unpackEFace(obj).data +} + +func RTypeOf(obj interface{}) uintptr { + return uintptr(unpackEFace(obj).rtype) +} + +func IsNil(obj interface{}) bool { + if obj == nil { + return true + } + return unpackEFace(obj).data == nil +} + +func IsNullable(kind reflect.Kind) bool { + switch kind { + case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func, reflect.Slice, reflect.Interface: + return true + } + return false +} + +func likePtrKind(kind reflect.Kind) bool { + switch kind { + case reflect.Ptr, reflect.Map, reflect.Chan, reflect.Func: + return true + } + return false +} + +func likePtrType(typ reflect.Type) bool { + if likePtrKind(typ.Kind()) { + return true + } + if typ.Kind() == reflect.Struct { + if typ.NumField() != 1 { + return false + } + return likePtrType(typ.Field(0).Type) + } + if typ.Kind() == reflect.Array { + if typ.Len() != 1 { + return false + } + return likePtrType(typ.Elem()) + } + return false +} + +// NoEscape hides a pointer from escape analysis. noescape is +// the identity function but escape analysis doesn't think the +// output depends on the input. noescape is inlined and currently +// compiles down to zero instructions. +// USE CAREFULLY! +//go:nosplit +func NoEscape(p unsafe.Pointer) unsafe.Pointer { + x := uintptr(p) + return unsafe.Pointer(x ^ 0) +} + +func UnsafeCastString(str string) []byte { + stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&str)) + sliceHeader := &reflect.SliceHeader{ + Data: stringHeader.Data, + Cap: stringHeader.Len, + Len: stringHeader.Len, + } + return *(*[]byte)(unsafe.Pointer(sliceHeader)) +} diff --git a/vendor/github.com/modern-go/reflect2/reflect2_amd64.s b/vendor/github.com/modern-go/reflect2/reflect2_amd64.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/reflect2_kind.go b/vendor/github.com/modern-go/reflect2/reflect2_kind.go new file mode 100644 index 00000000..62f299e4 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/reflect2_kind.go @@ -0,0 +1,30 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +// DefaultTypeOfKind return the non aliased default type for the kind +func DefaultTypeOfKind(kind reflect.Kind) Type { + return kindTypes[kind] +} + +var kindTypes = map[reflect.Kind]Type{ + reflect.Bool: TypeOf(true), + reflect.Uint8: TypeOf(uint8(0)), + reflect.Int8: TypeOf(int8(0)), + reflect.Uint16: TypeOf(uint16(0)), + reflect.Int16: TypeOf(int16(0)), + reflect.Uint32: TypeOf(uint32(0)), + reflect.Int32: TypeOf(int32(0)), + reflect.Uint64: TypeOf(uint64(0)), + reflect.Int64: TypeOf(int64(0)), + reflect.Uint: TypeOf(uint(0)), + reflect.Int: TypeOf(int(0)), + reflect.Float32: TypeOf(float32(0)), + reflect.Float64: TypeOf(float64(0)), + reflect.Uintptr: TypeOf(uintptr(0)), + reflect.String: TypeOf(""), + reflect.UnsafePointer: TypeOf(unsafe.Pointer(nil)), +} diff --git a/vendor/github.com/modern-go/reflect2/relfect2_386.s b/vendor/github.com/modern-go/reflect2/relfect2_386.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s b/vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/relfect2_arm.s b/vendor/github.com/modern-go/reflect2/relfect2_arm.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/relfect2_arm64.s b/vendor/github.com/modern-go/reflect2/relfect2_arm64.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/relfect2_mips64x.s b/vendor/github.com/modern-go/reflect2/relfect2_mips64x.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/relfect2_mipsx.s b/vendor/github.com/modern-go/reflect2/relfect2_mipsx.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s b/vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/relfect2_s390x.s b/vendor/github.com/modern-go/reflect2/relfect2_s390x.s new file mode 100644 index 00000000..e69de29b diff --git a/vendor/github.com/modern-go/reflect2/safe_field.go b/vendor/github.com/modern-go/reflect2/safe_field.go new file mode 100644 index 00000000..d4ba1f4f --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_field.go @@ -0,0 +1,58 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeField struct { + reflect.StructField +} + +func (field *safeField) Offset() uintptr { + return field.StructField.Offset +} + +func (field *safeField) Name() string { + return field.StructField.Name +} + +func (field *safeField) PkgPath() string { + return field.StructField.PkgPath +} + +func (field *safeField) Type() Type { + panic("not implemented") +} + +func (field *safeField) Tag() reflect.StructTag { + return field.StructField.Tag +} + +func (field *safeField) Index() []int { + return field.StructField.Index +} + +func (field *safeField) Anonymous() bool { + return field.StructField.Anonymous +} + +func (field *safeField) Set(obj interface{}, value interface{}) { + val := reflect.ValueOf(obj).Elem() + val.FieldByIndex(field.Index()).Set(reflect.ValueOf(value).Elem()) +} + +func (field *safeField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) { + panic("unsafe operation is not supported") +} + +func (field *safeField) Get(obj interface{}) interface{} { + val := reflect.ValueOf(obj).Elem().FieldByIndex(field.Index()) + ptr := reflect.New(val.Type()) + ptr.Elem().Set(val) + return ptr.Interface() +} + +func (field *safeField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer { + panic("does not support unsafe operation") +} diff --git a/vendor/github.com/modern-go/reflect2/safe_map.go b/vendor/github.com/modern-go/reflect2/safe_map.go new file mode 100644 index 00000000..88362205 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_map.go @@ -0,0 +1,101 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeMapType struct { + safeType +} + +func (type2 *safeMapType) Key() Type { + return type2.safeType.cfg.Type2(type2.Type.Key()) +} + +func (type2 *safeMapType) MakeMap(cap int) interface{} { + ptr := reflect.New(type2.Type) + ptr.Elem().Set(reflect.MakeMap(type2.Type)) + return ptr.Interface() +} + +func (type2 *safeMapType) UnsafeMakeMap(cap int) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeMapType) SetIndex(obj interface{}, key interface{}, elem interface{}) { + keyVal := reflect.ValueOf(key) + elemVal := reflect.ValueOf(elem) + val := reflect.ValueOf(obj) + val.Elem().SetMapIndex(keyVal.Elem(), elemVal.Elem()) +} + +func (type2 *safeMapType) UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeMapType) TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) { + keyVal := reflect.ValueOf(key) + if key == nil { + keyVal = reflect.New(type2.Type.Key()).Elem() + } + val := reflect.ValueOf(obj).MapIndex(keyVal) + if !val.IsValid() { + return nil, false + } + return val.Interface(), true +} + +func (type2 *safeMapType) GetIndex(obj interface{}, key interface{}) interface{} { + val := reflect.ValueOf(obj).Elem() + keyVal := reflect.ValueOf(key).Elem() + elemVal := val.MapIndex(keyVal) + if !elemVal.IsValid() { + ptr := reflect.New(reflect.PtrTo(val.Type().Elem())) + return ptr.Elem().Interface() + } + ptr := reflect.New(elemVal.Type()) + ptr.Elem().Set(elemVal) + return ptr.Interface() +} + +func (type2 *safeMapType) UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeMapType) Iterate(obj interface{}) MapIterator { + m := reflect.ValueOf(obj).Elem() + return &safeMapIterator{ + m: m, + keys: m.MapKeys(), + } +} + +func (type2 *safeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator { + panic("does not support unsafe operation") +} + +type safeMapIterator struct { + i int + m reflect.Value + keys []reflect.Value +} + +func (iter *safeMapIterator) HasNext() bool { + return iter.i != len(iter.keys) +} + +func (iter *safeMapIterator) Next() (interface{}, interface{}) { + key := iter.keys[iter.i] + elem := iter.m.MapIndex(key) + iter.i += 1 + keyPtr := reflect.New(key.Type()) + keyPtr.Elem().Set(key) + elemPtr := reflect.New(elem.Type()) + elemPtr.Elem().Set(elem) + return keyPtr.Interface(), elemPtr.Interface() +} + +func (iter *safeMapIterator) UnsafeNext() (unsafe.Pointer, unsafe.Pointer) { + panic("does not support unsafe operation") +} diff --git a/vendor/github.com/modern-go/reflect2/safe_slice.go b/vendor/github.com/modern-go/reflect2/safe_slice.go new file mode 100644 index 00000000..bcce6fd2 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_slice.go @@ -0,0 +1,92 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeSliceType struct { + safeType +} + +func (type2 *safeSliceType) SetIndex(obj interface{}, index int, value interface{}) { + val := reflect.ValueOf(obj).Elem() + elem := reflect.ValueOf(value).Elem() + val.Index(index).Set(elem) +} + +func (type2 *safeSliceType) UnsafeSetIndex(obj unsafe.Pointer, index int, value unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) GetIndex(obj interface{}, index int) interface{} { + val := reflect.ValueOf(obj).Elem() + elem := val.Index(index) + ptr := reflect.New(elem.Type()) + ptr.Elem().Set(elem) + return ptr.Interface() +} + +func (type2 *safeSliceType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) MakeSlice(length int, cap int) interface{} { + val := reflect.MakeSlice(type2.Type, length, cap) + ptr := reflect.New(val.Type()) + ptr.Elem().Set(val) + return ptr.Interface() +} + +func (type2 *safeSliceType) UnsafeMakeSlice(length int, cap int) unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) Grow(obj interface{}, newLength int) { + oldCap := type2.Cap(obj) + oldSlice := reflect.ValueOf(obj).Elem() + delta := newLength - oldCap + deltaVals := make([]reflect.Value, delta) + newSlice := reflect.Append(oldSlice, deltaVals...) + oldSlice.Set(newSlice) +} + +func (type2 *safeSliceType) UnsafeGrow(ptr unsafe.Pointer, newLength int) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) Append(obj interface{}, elem interface{}) { + val := reflect.ValueOf(obj).Elem() + elemVal := reflect.ValueOf(elem).Elem() + newVal := reflect.Append(val, elemVal) + val.Set(newVal) +} + +func (type2 *safeSliceType) UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) SetNil(obj interface{}) { + val := reflect.ValueOf(obj).Elem() + val.Set(reflect.Zero(val.Type())) +} + +func (type2 *safeSliceType) UnsafeSetNil(ptr unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) LengthOf(obj interface{}) int { + return reflect.ValueOf(obj).Elem().Len() +} + +func (type2 *safeSliceType) UnsafeLengthOf(ptr unsafe.Pointer) int { + panic("does not support unsafe operation") +} + +func (type2 *safeSliceType) Cap(obj interface{}) int { + return reflect.ValueOf(obj).Elem().Cap() +} + +func (type2 *safeSliceType) UnsafeCap(ptr unsafe.Pointer) int { + panic("does not support unsafe operation") +} diff --git a/vendor/github.com/modern-go/reflect2/safe_struct.go b/vendor/github.com/modern-go/reflect2/safe_struct.go new file mode 100644 index 00000000..e5fb9b31 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_struct.go @@ -0,0 +1,29 @@ +package reflect2 + +type safeStructType struct { + safeType +} + +func (type2 *safeStructType) FieldByName(name string) StructField { + field, found := type2.Type.FieldByName(name) + if !found { + panic("field " + name + " not found") + } + return &safeField{StructField: field} +} + +func (type2 *safeStructType) Field(i int) StructField { + return &safeField{StructField: type2.Type.Field(i)} +} + +func (type2 *safeStructType) FieldByIndex(index []int) StructField { + return &safeField{StructField: type2.Type.FieldByIndex(index)} +} + +func (type2 *safeStructType) FieldByNameFunc(match func(string) bool) StructField { + field, found := type2.Type.FieldByNameFunc(match) + if !found { + panic("field match condition not found in " + type2.Type.String()) + } + return &safeField{StructField: field} +} diff --git a/vendor/github.com/modern-go/reflect2/safe_type.go b/vendor/github.com/modern-go/reflect2/safe_type.go new file mode 100644 index 00000000..ee4e7bb6 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/safe_type.go @@ -0,0 +1,78 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type safeType struct { + reflect.Type + cfg *frozenConfig +} + +func (type2 *safeType) New() interface{} { + return reflect.New(type2.Type).Interface() +} + +func (type2 *safeType) UnsafeNew() unsafe.Pointer { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Elem() Type { + return type2.cfg.Type2(type2.Type.Elem()) +} + +func (type2 *safeType) Type1() reflect.Type { + return type2.Type +} + +func (type2 *safeType) PackEFace(ptr unsafe.Pointer) interface{} { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Implements(thatType Type) bool { + return type2.Type.Implements(thatType.Type1()) +} + +func (type2 *safeType) RType() uintptr { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Indirect(obj interface{}) interface{} { + return reflect.Indirect(reflect.ValueOf(obj)).Interface() +} + +func (type2 *safeType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + panic("does not support unsafe operation") +} + +func (type2 *safeType) LikePtr() bool { + panic("does not support unsafe operation") +} + +func (type2 *safeType) IsNullable() bool { + return IsNullable(type2.Kind()) +} + +func (type2 *safeType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + return reflect.ValueOf(obj).Elem().IsNil() +} + +func (type2 *safeType) UnsafeIsNil(ptr unsafe.Pointer) bool { + panic("does not support unsafe operation") +} + +func (type2 *safeType) Set(obj interface{}, val interface{}) { + reflect.ValueOf(obj).Elem().Set(reflect.ValueOf(val).Elem()) +} + +func (type2 *safeType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { + panic("does not support unsafe operation") +} + +func (type2 *safeType) AssignableTo(anotherType Type) bool { + return type2.Type1().AssignableTo(anotherType.Type1()) +} diff --git a/vendor/github.com/modern-go/reflect2/test.sh b/vendor/github.com/modern-go/reflect2/test.sh new file mode 100755 index 00000000..fbcef730 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -coverprofile=profile.out -coverpkg=github.com/modern-go/reflect2 $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/modern-go/reflect2/type_map.go b/vendor/github.com/modern-go/reflect2/type_map.go new file mode 100644 index 00000000..6d489112 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/type_map.go @@ -0,0 +1,103 @@ +package reflect2 + +import ( + "reflect" + "runtime" + "strings" + "unsafe" +) + +// typelinks1 for 1.5 ~ 1.6 +//go:linkname typelinks1 reflect.typelinks +func typelinks1() [][]unsafe.Pointer + +// typelinks2 for 1.7 ~ +//go:linkname typelinks2 reflect.typelinks +func typelinks2() (sections []unsafe.Pointer, offset [][]int32) + +var types = map[string]reflect.Type{} +var packages = map[string]map[string]reflect.Type{} + +func init() { + ver := runtime.Version() + if ver == "go1.5" || strings.HasPrefix(ver, "go1.5.") { + loadGo15Types() + } else if ver == "go1.6" || strings.HasPrefix(ver, "go1.6.") { + loadGo15Types() + } else { + loadGo17Types() + } +} + +func loadGo15Types() { + var obj interface{} = reflect.TypeOf(0) + typePtrss := typelinks1() + for _, typePtrs := range typePtrss { + for _, typePtr := range typePtrs { + (*emptyInterface)(unsafe.Pointer(&obj)).word = typePtr + typ := obj.(reflect.Type) + if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct { + loadedType := typ.Elem() + pkgTypes := packages[loadedType.PkgPath()] + if pkgTypes == nil { + pkgTypes = map[string]reflect.Type{} + packages[loadedType.PkgPath()] = pkgTypes + } + types[loadedType.String()] = loadedType + pkgTypes[loadedType.Name()] = loadedType + } + if typ.Kind() == reflect.Slice && typ.Elem().Kind() == reflect.Ptr && + typ.Elem().Elem().Kind() == reflect.Struct { + loadedType := typ.Elem().Elem() + pkgTypes := packages[loadedType.PkgPath()] + if pkgTypes == nil { + pkgTypes = map[string]reflect.Type{} + packages[loadedType.PkgPath()] = pkgTypes + } + types[loadedType.String()] = loadedType + pkgTypes[loadedType.Name()] = loadedType + } + } + } +} + +func loadGo17Types() { + var obj interface{} = reflect.TypeOf(0) + sections, offset := typelinks2() + for i, offs := range offset { + rodata := sections[i] + for _, off := range offs { + (*emptyInterface)(unsafe.Pointer(&obj)).word = resolveTypeOff(unsafe.Pointer(rodata), off) + typ := obj.(reflect.Type) + if typ.Kind() == reflect.Ptr && typ.Elem().Kind() == reflect.Struct { + loadedType := typ.Elem() + pkgTypes := packages[loadedType.PkgPath()] + if pkgTypes == nil { + pkgTypes = map[string]reflect.Type{} + packages[loadedType.PkgPath()] = pkgTypes + } + types[loadedType.String()] = loadedType + pkgTypes[loadedType.Name()] = loadedType + } + } + } +} + +type emptyInterface struct { + typ unsafe.Pointer + word unsafe.Pointer +} + +// TypeByName return the type by its name, just like Class.forName in java +func TypeByName(typeName string) Type { + return Type2(types[typeName]) +} + +// TypeByPackageName return the type by its package and name +func TypeByPackageName(pkgPath string, name string) Type { + pkgTypes := packages[pkgPath] + if pkgTypes == nil { + return nil + } + return Type2(pkgTypes[name]) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_array.go b/vendor/github.com/modern-go/reflect2/unsafe_array.go new file mode 100644 index 00000000..76cbdba6 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_array.go @@ -0,0 +1,65 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeArrayType struct { + unsafeType + elemRType unsafe.Pointer + pElemRType unsafe.Pointer + elemSize uintptr + likePtr bool +} + +func newUnsafeArrayType(cfg *frozenConfig, type1 reflect.Type) *UnsafeArrayType { + return &UnsafeArrayType{ + unsafeType: *newUnsafeType(cfg, type1), + elemRType: unpackEFace(type1.Elem()).data, + pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data, + elemSize: type1.Elem().Size(), + likePtr: likePtrType(type1), + } +} + +func (type2 *UnsafeArrayType) LikePtr() bool { + return type2.likePtr +} + +func (type2 *UnsafeArrayType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeArrayType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + if type2.likePtr { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) + } + return packEFace(type2.rtype, ptr) +} + +func (type2 *UnsafeArrayType) SetIndex(obj interface{}, index int, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("ArrayType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("ArrayType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) + type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data) +} + +func (type2 *UnsafeArrayType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) { + elemPtr := arrayAt(obj, index, type2.elemSize, "i < s.Len") + typedmemmove(type2.elemRType, elemPtr, elem) +} + +func (type2 *UnsafeArrayType) GetIndex(obj interface{}, index int) interface{} { + objEFace := unpackEFace(obj) + assertType("ArrayType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, index) + return packEFace(type2.pElemRType, elemPtr) +} + +func (type2 *UnsafeArrayType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { + return arrayAt(obj, index, type2.elemSize, "i < s.Len") +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_eface.go b/vendor/github.com/modern-go/reflect2/unsafe_eface.go new file mode 100644 index 00000000..805010f3 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_eface.go @@ -0,0 +1,59 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type eface struct { + rtype unsafe.Pointer + data unsafe.Pointer +} + +func unpackEFace(obj interface{}) *eface { + return (*eface)(unsafe.Pointer(&obj)) +} + +func packEFace(rtype unsafe.Pointer, data unsafe.Pointer) interface{} { + var i interface{} + e := (*eface)(unsafe.Pointer(&i)) + e.rtype = rtype + e.data = data + return i +} + +type UnsafeEFaceType struct { + unsafeType +} + +func newUnsafeEFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeEFaceType { + return &UnsafeEFaceType{ + unsafeType: *newUnsafeType(cfg, type1), + } +} + +func (type2 *UnsafeEFaceType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeEFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return unpackEFace(*(*interface{})(ptr)).data == nil +} + +func (type2 *UnsafeEFaceType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeEFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return *(*interface{})(ptr) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_field.go b/vendor/github.com/modern-go/reflect2/unsafe_field.go new file mode 100644 index 00000000..5eb53130 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_field.go @@ -0,0 +1,74 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeStructField struct { + reflect.StructField + structType *UnsafeStructType + rtype unsafe.Pointer + ptrRType unsafe.Pointer +} + +func newUnsafeStructField(structType *UnsafeStructType, structField reflect.StructField) *UnsafeStructField { + return &UnsafeStructField{ + StructField: structField, + rtype: unpackEFace(structField.Type).data, + ptrRType: unpackEFace(reflect.PtrTo(structField.Type)).data, + structType: structType, + } +} + +func (field *UnsafeStructField) Offset() uintptr { + return field.StructField.Offset +} + +func (field *UnsafeStructField) Name() string { + return field.StructField.Name +} + +func (field *UnsafeStructField) PkgPath() string { + return field.StructField.PkgPath +} + +func (field *UnsafeStructField) Type() Type { + return field.structType.cfg.Type2(field.StructField.Type) +} + +func (field *UnsafeStructField) Tag() reflect.StructTag { + return field.StructField.Tag +} + +func (field *UnsafeStructField) Index() []int { + return field.StructField.Index +} + +func (field *UnsafeStructField) Anonymous() bool { + return field.StructField.Anonymous +} + +func (field *UnsafeStructField) Set(obj interface{}, value interface{}) { + objEFace := unpackEFace(obj) + assertType("StructField.SetIndex argument 1", field.structType.ptrRType, objEFace.rtype) + valueEFace := unpackEFace(value) + assertType("StructField.SetIndex argument 2", field.ptrRType, valueEFace.rtype) + field.UnsafeSet(objEFace.data, valueEFace.data) +} + +func (field *UnsafeStructField) UnsafeSet(obj unsafe.Pointer, value unsafe.Pointer) { + fieldPtr := add(obj, field.StructField.Offset, "same as non-reflect &v.field") + typedmemmove(field.rtype, fieldPtr, value) +} + +func (field *UnsafeStructField) Get(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("StructField.GetIndex argument 1", field.structType.ptrRType, objEFace.rtype) + value := field.UnsafeGet(objEFace.data) + return packEFace(field.ptrRType, value) +} + +func (field *UnsafeStructField) UnsafeGet(obj unsafe.Pointer) unsafe.Pointer { + return add(obj, field.StructField.Offset, "same as non-reflect &v.field") +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_iface.go b/vendor/github.com/modern-go/reflect2/unsafe_iface.go new file mode 100644 index 00000000..b6019553 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_iface.go @@ -0,0 +1,64 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type iface struct { + itab *itab + data unsafe.Pointer +} + +type itab struct { + ignore unsafe.Pointer + rtype unsafe.Pointer +} + +func IFaceToEFace(ptr unsafe.Pointer) interface{} { + iface := (*iface)(ptr) + if iface.itab == nil { + return nil + } + return packEFace(iface.itab.rtype, iface.data) +} + +type UnsafeIFaceType struct { + unsafeType +} + +func newUnsafeIFaceType(cfg *frozenConfig, type1 reflect.Type) *UnsafeIFaceType { + return &UnsafeIFaceType{ + unsafeType: *newUnsafeType(cfg, type1), + } +} + +func (type2 *UnsafeIFaceType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeIFaceType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return IFaceToEFace(ptr) +} + +func (type2 *UnsafeIFaceType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeIFaceType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + iface := (*iface)(ptr) + if iface.itab == nil { + return true + } + return false +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_link.go b/vendor/github.com/modern-go/reflect2/unsafe_link.go new file mode 100644 index 00000000..57229c8d --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_link.go @@ -0,0 +1,70 @@ +package reflect2 + +import "unsafe" + +//go:linkname unsafe_New reflect.unsafe_New +func unsafe_New(rtype unsafe.Pointer) unsafe.Pointer + +//go:linkname typedmemmove reflect.typedmemmove +func typedmemmove(rtype unsafe.Pointer, dst, src unsafe.Pointer) + +//go:linkname unsafe_NewArray reflect.unsafe_NewArray +func unsafe_NewArray(rtype unsafe.Pointer, length int) unsafe.Pointer + +// typedslicecopy copies a slice of elemType values from src to dst, +// returning the number of elements copied. +//go:linkname typedslicecopy reflect.typedslicecopy +//go:noescape +func typedslicecopy(elemType unsafe.Pointer, dst, src sliceHeader) int + +//go:linkname mapassign reflect.mapassign +//go:noescape +func mapassign(rtype unsafe.Pointer, m unsafe.Pointer, key, val unsafe.Pointer) + +//go:linkname mapaccess reflect.mapaccess +//go:noescape +func mapaccess(rtype unsafe.Pointer, m unsafe.Pointer, key unsafe.Pointer) (val unsafe.Pointer) + +// m escapes into the return value, but the caller of mapiterinit +// doesn't let the return value escape. +//go:noescape +//go:linkname mapiterinit reflect.mapiterinit +func mapiterinit(rtype unsafe.Pointer, m unsafe.Pointer) *hiter + +//go:noescape +//go:linkname mapiternext reflect.mapiternext +func mapiternext(it *hiter) + +//go:linkname ifaceE2I reflect.ifaceE2I +func ifaceE2I(rtype unsafe.Pointer, src interface{}, dst unsafe.Pointer) + +// A hash iteration structure. +// If you modify hiter, also change cmd/internal/gc/reflect.go to indicate +// the layout of this structure. +type hiter struct { + key unsafe.Pointer // Must be in first position. Write nil to indicate iteration end (see cmd/internal/gc/range.go). + value unsafe.Pointer // Must be in second position (see cmd/internal/gc/range.go). + // rest fields are ignored +} + +// add returns p+x. +// +// The whySafe string is ignored, so that the function still inlines +// as efficiently as p+x, but all call sites should use the string to +// record why the addition is safe, which is to say why the addition +// does not cause x to advance to the very end of p's allocation +// and therefore point incorrectly at the next block in memory. +func add(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer { + return unsafe.Pointer(uintptr(p) + x) +} + +// arrayAt returns the i-th element of p, +// an array whose elements are eltSize bytes wide. +// The array pointed at by p must have at least i+1 elements: +// it is invalid (but impossible to check here) to pass i >= len, +// because then the result will point outside the array. +// whySafe must explain why i < len. (Passing "i < len" is fine; +// the benefit is to surface this assumption at the call site.) +func arrayAt(p unsafe.Pointer, i int, eltSize uintptr, whySafe string) unsafe.Pointer { + return add(p, uintptr(i)*eltSize, "i < len") +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_map.go b/vendor/github.com/modern-go/reflect2/unsafe_map.go new file mode 100644 index 00000000..f2e76e6b --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_map.go @@ -0,0 +1,138 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeMapType struct { + unsafeType + pKeyRType unsafe.Pointer + pElemRType unsafe.Pointer +} + +func newUnsafeMapType(cfg *frozenConfig, type1 reflect.Type) MapType { + return &UnsafeMapType{ + unsafeType: *newUnsafeType(cfg, type1), + pKeyRType: unpackEFace(reflect.PtrTo(type1.Key())).data, + pElemRType: unpackEFace(reflect.PtrTo(type1.Elem())).data, + } +} + +func (type2 *UnsafeMapType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return *(*unsafe.Pointer)(ptr) == nil +} + +func (type2 *UnsafeMapType) LikePtr() bool { + return true +} + +func (type2 *UnsafeMapType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("MapType.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) +} + +func (type2 *UnsafeMapType) Key() Type { + return type2.cfg.Type2(type2.Type.Key()) +} + +func (type2 *UnsafeMapType) MakeMap(cap int) interface{} { + return packEFace(type2.ptrRType, type2.UnsafeMakeMap(cap)) +} + +func (type2 *UnsafeMapType) UnsafeMakeMap(cap int) unsafe.Pointer { + m := makeMapWithSize(type2.rtype, cap) + return unsafe.Pointer(&m) +} + +func (type2 *UnsafeMapType) SetIndex(obj interface{}, key interface{}, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("MapType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) + keyEFace := unpackEFace(key) + assertType("MapType.SetIndex argument 2", type2.pKeyRType, keyEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("MapType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) + type2.UnsafeSetIndex(objEFace.data, keyEFace.data, elemEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeSetIndex(obj unsafe.Pointer, key unsafe.Pointer, elem unsafe.Pointer) { + mapassign(type2.rtype, *(*unsafe.Pointer)(obj), key, elem) +} + +func (type2 *UnsafeMapType) TryGetIndex(obj interface{}, key interface{}) (interface{}, bool) { + objEFace := unpackEFace(obj) + assertType("MapType.TryGetIndex argument 1", type2.ptrRType, objEFace.rtype) + keyEFace := unpackEFace(key) + assertType("MapType.TryGetIndex argument 2", type2.pKeyRType, keyEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, keyEFace.data) + if elemPtr == nil { + return nil, false + } + return packEFace(type2.pElemRType, elemPtr), true +} + +func (type2 *UnsafeMapType) GetIndex(obj interface{}, key interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("MapType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) + keyEFace := unpackEFace(key) + assertType("MapType.GetIndex argument 2", type2.pKeyRType, keyEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, keyEFace.data) + return packEFace(type2.pElemRType, elemPtr) +} + +func (type2 *UnsafeMapType) UnsafeGetIndex(obj unsafe.Pointer, key unsafe.Pointer) unsafe.Pointer { + return mapaccess(type2.rtype, *(*unsafe.Pointer)(obj), key) +} + +func (type2 *UnsafeMapType) Iterate(obj interface{}) MapIterator { + objEFace := unpackEFace(obj) + assertType("MapType.Iterate argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIterate(objEFace.data) +} + +func (type2 *UnsafeMapType) UnsafeIterate(obj unsafe.Pointer) MapIterator { + return &UnsafeMapIterator{ + hiter: mapiterinit(type2.rtype, *(*unsafe.Pointer)(obj)), + pKeyRType: type2.pKeyRType, + pElemRType: type2.pElemRType, + } +} + +type UnsafeMapIterator struct { + *hiter + pKeyRType unsafe.Pointer + pElemRType unsafe.Pointer +} + +func (iter *UnsafeMapIterator) HasNext() bool { + return iter.key != nil +} + +func (iter *UnsafeMapIterator) Next() (interface{}, interface{}) { + key, elem := iter.UnsafeNext() + return packEFace(iter.pKeyRType, key), packEFace(iter.pElemRType, elem) +} + +func (iter *UnsafeMapIterator) UnsafeNext() (unsafe.Pointer, unsafe.Pointer) { + key := iter.key + elem := iter.value + mapiternext(iter.hiter) + return key, elem +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_ptr.go b/vendor/github.com/modern-go/reflect2/unsafe_ptr.go new file mode 100644 index 00000000..8e5ec9cf --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_ptr.go @@ -0,0 +1,46 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafePtrType struct { + unsafeType +} + +func newUnsafePtrType(cfg *frozenConfig, type1 reflect.Type) *UnsafePtrType { + return &UnsafePtrType{ + unsafeType: *newUnsafeType(cfg, type1), + } +} + +func (type2 *UnsafePtrType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafePtrType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return *(*unsafe.Pointer)(ptr) == nil +} + +func (type2 *UnsafePtrType) LikePtr() bool { + return true +} + +func (type2 *UnsafePtrType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafePtrType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_slice.go b/vendor/github.com/modern-go/reflect2/unsafe_slice.go new file mode 100644 index 00000000..1c6d876c --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_slice.go @@ -0,0 +1,177 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +// sliceHeader is a safe version of SliceHeader used within this package. +type sliceHeader struct { + Data unsafe.Pointer + Len int + Cap int +} + +type UnsafeSliceType struct { + unsafeType + elemRType unsafe.Pointer + pElemRType unsafe.Pointer + elemSize uintptr +} + +func newUnsafeSliceType(cfg *frozenConfig, type1 reflect.Type) SliceType { + elemType := type1.Elem() + return &UnsafeSliceType{ + unsafeType: *newUnsafeType(cfg, type1), + pElemRType: unpackEFace(reflect.PtrTo(elemType)).data, + elemRType: unpackEFace(elemType).data, + elemSize: elemType.Size(), + } +} + +func (type2 *UnsafeSliceType) Set(obj interface{}, val interface{}) { + objEFace := unpackEFace(obj) + assertType("Type.Set argument 1", type2.ptrRType, objEFace.rtype) + valEFace := unpackEFace(val) + assertType("Type.Set argument 2", type2.ptrRType, valEFace.rtype) + type2.UnsafeSet(objEFace.data, valEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { + *(*sliceHeader)(ptr) = *(*sliceHeader)(val) +} + +func (type2 *UnsafeSliceType) IsNil(obj interface{}) bool { + if obj == nil { + return true + } + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeIsNil(ptr unsafe.Pointer) bool { + if ptr == nil { + return true + } + return (*sliceHeader)(ptr).Data == nil +} + +func (type2 *UnsafeSliceType) SetNil(obj interface{}) { + objEFace := unpackEFace(obj) + assertType("SliceType.SetNil argument 1", type2.ptrRType, objEFace.rtype) + type2.UnsafeSetNil(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeSetNil(ptr unsafe.Pointer) { + header := (*sliceHeader)(ptr) + header.Len = 0 + header.Cap = 0 + header.Data = nil +} + +func (type2 *UnsafeSliceType) MakeSlice(length int, cap int) interface{} { + return packEFace(type2.ptrRType, type2.UnsafeMakeSlice(length, cap)) +} + +func (type2 *UnsafeSliceType) UnsafeMakeSlice(length int, cap int) unsafe.Pointer { + header := &sliceHeader{unsafe_NewArray(type2.elemRType, cap), length, cap} + return unsafe.Pointer(header) +} + +func (type2 *UnsafeSliceType) LengthOf(obj interface{}) int { + objEFace := unpackEFace(obj) + assertType("SliceType.Len argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeLengthOf(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeLengthOf(obj unsafe.Pointer) int { + header := (*sliceHeader)(obj) + return header.Len +} + +func (type2 *UnsafeSliceType) SetIndex(obj interface{}, index int, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("SliceType.SetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("SliceType.SetIndex argument 3", type2.pElemRType, elemEFace.rtype) + type2.UnsafeSetIndex(objEFace.data, index, elemEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeSetIndex(obj unsafe.Pointer, index int, elem unsafe.Pointer) { + header := (*sliceHeader)(obj) + elemPtr := arrayAt(header.Data, index, type2.elemSize, "i < s.Len") + typedmemmove(type2.elemRType, elemPtr, elem) +} + +func (type2 *UnsafeSliceType) GetIndex(obj interface{}, index int) interface{} { + objEFace := unpackEFace(obj) + assertType("SliceType.GetIndex argument 1", type2.ptrRType, objEFace.rtype) + elemPtr := type2.UnsafeGetIndex(objEFace.data, index) + return packEFace(type2.pElemRType, elemPtr) +} + +func (type2 *UnsafeSliceType) UnsafeGetIndex(obj unsafe.Pointer, index int) unsafe.Pointer { + header := (*sliceHeader)(obj) + return arrayAt(header.Data, index, type2.elemSize, "i < s.Len") +} + +func (type2 *UnsafeSliceType) Append(obj interface{}, elem interface{}) { + objEFace := unpackEFace(obj) + assertType("SliceType.Append argument 1", type2.ptrRType, objEFace.rtype) + elemEFace := unpackEFace(elem) + assertType("SliceType.Append argument 2", type2.pElemRType, elemEFace.rtype) + type2.UnsafeAppend(objEFace.data, elemEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeAppend(obj unsafe.Pointer, elem unsafe.Pointer) { + header := (*sliceHeader)(obj) + oldLen := header.Len + type2.UnsafeGrow(obj, oldLen+1) + type2.UnsafeSetIndex(obj, oldLen, elem) +} + +func (type2 *UnsafeSliceType) Cap(obj interface{}) int { + objEFace := unpackEFace(obj) + assertType("SliceType.Cap argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeCap(objEFace.data) +} + +func (type2 *UnsafeSliceType) UnsafeCap(ptr unsafe.Pointer) int { + return (*sliceHeader)(ptr).Cap +} + +func (type2 *UnsafeSliceType) Grow(obj interface{}, newLength int) { + objEFace := unpackEFace(obj) + assertType("SliceType.Grow argument 1", type2.ptrRType, objEFace.rtype) + type2.UnsafeGrow(objEFace.data, newLength) +} + +func (type2 *UnsafeSliceType) UnsafeGrow(obj unsafe.Pointer, newLength int) { + header := (*sliceHeader)(obj) + if newLength <= header.Cap { + header.Len = newLength + return + } + newCap := calcNewCap(header.Cap, newLength) + newHeader := (*sliceHeader)(type2.UnsafeMakeSlice(header.Len, newCap)) + typedslicecopy(type2.elemRType, *newHeader, *header) + header.Data = newHeader.Data + header.Cap = newHeader.Cap + header.Len = newLength +} + +func calcNewCap(cap int, expectedCap int) int { + if cap == 0 { + cap = expectedCap + } else { + for cap < expectedCap { + if cap < 1024 { + cap += cap + } else { + cap += cap / 4 + } + } + } + return cap +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_struct.go b/vendor/github.com/modern-go/reflect2/unsafe_struct.go new file mode 100644 index 00000000..804d9166 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_struct.go @@ -0,0 +1,59 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type UnsafeStructType struct { + unsafeType + likePtr bool +} + +func newUnsafeStructType(cfg *frozenConfig, type1 reflect.Type) *UnsafeStructType { + return &UnsafeStructType{ + unsafeType: *newUnsafeType(cfg, type1), + likePtr: likePtrType(type1), + } +} + +func (type2 *UnsafeStructType) LikePtr() bool { + return type2.likePtr +} + +func (type2 *UnsafeStructType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *UnsafeStructType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { + if type2.likePtr { + return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) + } + return packEFace(type2.rtype, ptr) +} + +func (type2 *UnsafeStructType) FieldByName(name string) StructField { + structField, found := type2.Type.FieldByName(name) + if !found { + return nil + } + return newUnsafeStructField(type2, structField) +} + +func (type2 *UnsafeStructType) Field(i int) StructField { + return newUnsafeStructField(type2, type2.Type.Field(i)) +} + +func (type2 *UnsafeStructType) FieldByIndex(index []int) StructField { + return newUnsafeStructField(type2, type2.Type.FieldByIndex(index)) +} + +func (type2 *UnsafeStructType) FieldByNameFunc(match func(string) bool) StructField { + structField, found := type2.Type.FieldByNameFunc(match) + if !found { + panic("field match condition not found in " + type2.Type.String()) + } + return newUnsafeStructField(type2, structField) +} diff --git a/vendor/github.com/modern-go/reflect2/unsafe_type.go b/vendor/github.com/modern-go/reflect2/unsafe_type.go new file mode 100644 index 00000000..13941716 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_type.go @@ -0,0 +1,85 @@ +package reflect2 + +import ( + "reflect" + "unsafe" +) + +type unsafeType struct { + safeType + rtype unsafe.Pointer + ptrRType unsafe.Pointer +} + +func newUnsafeType(cfg *frozenConfig, type1 reflect.Type) *unsafeType { + return &unsafeType{ + safeType: safeType{ + Type: type1, + cfg: cfg, + }, + rtype: unpackEFace(type1).data, + ptrRType: unpackEFace(reflect.PtrTo(type1)).data, + } +} + +func (type2 *unsafeType) Set(obj interface{}, val interface{}) { + objEFace := unpackEFace(obj) + assertType("Type.Set argument 1", type2.ptrRType, objEFace.rtype) + valEFace := unpackEFace(val) + assertType("Type.Set argument 2", type2.ptrRType, valEFace.rtype) + type2.UnsafeSet(objEFace.data, valEFace.data) +} + +func (type2 *unsafeType) UnsafeSet(ptr unsafe.Pointer, val unsafe.Pointer) { + typedmemmove(type2.rtype, ptr, val) +} + +func (type2 *unsafeType) IsNil(obj interface{}) bool { + objEFace := unpackEFace(obj) + assertType("Type.IsNil argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIsNil(objEFace.data) +} + +func (type2 *unsafeType) UnsafeIsNil(ptr unsafe.Pointer) bool { + return ptr == nil +} + +func (type2 *unsafeType) UnsafeNew() unsafe.Pointer { + return unsafe_New(type2.rtype) +} + +func (type2 *unsafeType) New() interface{} { + return packEFace(type2.ptrRType, type2.UnsafeNew()) +} + +func (type2 *unsafeType) PackEFace(ptr unsafe.Pointer) interface{} { + return packEFace(type2.ptrRType, ptr) +} + +func (type2 *unsafeType) RType() uintptr { + return uintptr(type2.rtype) +} + +func (type2 *unsafeType) Indirect(obj interface{}) interface{} { + objEFace := unpackEFace(obj) + assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) + return type2.UnsafeIndirect(objEFace.data) +} + +func (type2 *unsafeType) UnsafeIndirect(obj unsafe.Pointer) interface{} { + return packEFace(type2.rtype, obj) +} + +func (type2 *unsafeType) LikePtr() bool { + return false +} + +func assertType(where string, expectRType unsafe.Pointer, actualRType unsafe.Pointer) { + if expectRType != actualRType { + expectType := reflect.TypeOf(0) + (*iface)(unsafe.Pointer(&expectType)).data = expectRType + actualType := reflect.TypeOf(0) + (*iface)(unsafe.Pointer(&actualType)).data = actualRType + panic(where + ": expect " + expectType.String() + ", actual " + actualType.String()) + } +} diff --git a/vendor/k8s.io/api/core/v1/generated.pb.go b/vendor/k8s.io/api/core/v1/generated.pb.go index 2731dcf3..5406c128 100644 --- a/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/vendor/k8s.io/api/core/v1/generated.pb.go @@ -5266,6 +5266,18 @@ func (m *NodeSelectorTerm) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.MatchFields) > 0 { + for _, msg := range m.MatchFields { + dAtA[i] = 0x12 + 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 } @@ -11903,6 +11915,12 @@ func (m *NodeSelectorTerm) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if len(m.MatchFields) > 0 { + for _, e := range m.MatchFields { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -15016,6 +15034,7 @@ func (this *NodeSelectorTerm) String() string { } s := strings.Join([]string{`&NodeSelectorTerm{`, `MatchExpressions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.MatchExpressions), "NodeSelectorRequirement", "NodeSelectorRequirement", 1), `&`, ``, 1) + `,`, + `MatchFields:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.MatchFields), "NodeSelectorRequirement", "NodeSelectorRequirement", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -30538,6 +30557,37 @@ func (m *NodeSelectorTerm) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MatchFields", 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.MatchFields = append(m.MatchFields, NodeSelectorRequirement{}) + if err := m.MatchFields[len(m.MatchFields)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -48857,767 +48907,769 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 12183 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0x47, - 0x76, 0xd8, 0xf5, 0xcc, 0xf0, 0x63, 0x1e, 0xbf, 0x6b, 0xb9, 0x2b, 0x2e, 0xa5, 0xdd, 0x59, 0xb5, - 0xee, 0x56, 0xab, 0x93, 0x44, 0x5a, 0x2b, 0xe9, 0xb4, 0x3e, 0xdd, 0xc9, 0x26, 0x39, 0xe4, 0x2e, - 0xb5, 0x4b, 0xee, 0xa8, 0x86, 0xbb, 0x7b, 0x77, 0x96, 0xcf, 0xd7, 0x9c, 0x29, 0x92, 0x2d, 0x36, - 0xbb, 0x47, 0xdd, 0x3d, 0xdc, 0xa5, 0x60, 0x03, 0xc9, 0xf9, 0x23, 0x71, 0xec, 0x1f, 0x87, 0xd8, - 0x48, 0x1c, 0xdb, 0x70, 0x80, 0xc4, 0x81, 0x7d, 0x71, 0x12, 0xc0, 0xb1, 0x63, 0x3b, 0x67, 0x27, - 0x71, 0x9c, 0xfc, 0x70, 0xfe, 0x38, 0x4e, 0xfe, 0x9c, 0x01, 0x23, 0x8c, 0x4d, 0x1b, 0x09, 0xfc, - 0x23, 0x41, 0x10, 0x03, 0x01, 0xcc, 0x18, 0x71, 0x50, 0x9f, 0x5d, 0xd5, 0xd3, 0x3d, 0x33, 0x5c, - 0x71, 0x29, 0xd9, 0xb8, 0x7f, 0x33, 0xf5, 0x5e, 0xbd, 0xaa, 0xae, 0x8f, 0x57, 0xaf, 0x5e, 0xbd, - 0x0f, 0x78, 0x73, 0xf7, 0x46, 0x34, 0xe7, 0x06, 0xf3, 0xbb, 0xed, 0x4d, 0x12, 0xfa, 0x24, 0x26, - 0xd1, 0xfc, 0x3e, 0xf1, 0x9b, 0x41, 0x38, 0x2f, 0x00, 0x4e, 0xcb, 0x9d, 0x6f, 0x04, 0x21, 0x99, - 0xdf, 0x7f, 0x65, 0x7e, 0x9b, 0xf8, 0x24, 0x74, 0x62, 0xd2, 0x9c, 0x6b, 0x85, 0x41, 0x1c, 0x20, - 0xc4, 0x71, 0xe6, 0x9c, 0x96, 0x3b, 0x47, 0x71, 0xe6, 0xf6, 0x5f, 0x99, 0x7d, 0x79, 0xdb, 0x8d, - 0x77, 0xda, 0x9b, 0x73, 0x8d, 0x60, 0x6f, 0x7e, 0x3b, 0xd8, 0x0e, 0xe6, 0x19, 0xea, 0x66, 0x7b, - 0x8b, 0xfd, 0x63, 0x7f, 0xd8, 0x2f, 0x4e, 0x62, 0x76, 0x2d, 0x69, 0x86, 0x3c, 0x8a, 0x89, 0x1f, - 0xb9, 0x81, 0x1f, 0xbd, 0xec, 0xb4, 0xdc, 0x88, 0x84, 0xfb, 0x24, 0x9c, 0x6f, 0xed, 0x6e, 0x53, - 0x58, 0x64, 0x22, 0xcc, 0xef, 0xbf, 0xb2, 0x49, 0x62, 0xa7, 0xa3, 0x47, 0xb3, 0xaf, 0x25, 0xe4, - 0xf6, 0x9c, 0xc6, 0x8e, 0xeb, 0x93, 0xf0, 0x40, 0xd2, 0x98, 0x0f, 0x49, 0x14, 0xb4, 0xc3, 0x06, - 0x39, 0x51, 0xad, 0x68, 0x7e, 0x8f, 0xc4, 0x4e, 0xc6, 0xd7, 0xcf, 0xce, 0xe7, 0xd5, 0x0a, 0xdb, - 0x7e, 0xec, 0xee, 0x75, 0x36, 0xf3, 0x99, 0x5e, 0x15, 0xa2, 0xc6, 0x0e, 0xd9, 0x73, 0x3a, 0xea, - 0xbd, 0x9a, 0x57, 0xaf, 0x1d, 0xbb, 0xde, 0xbc, 0xeb, 0xc7, 0x51, 0x1c, 0xa6, 0x2b, 0xd9, 0xdf, - 0xb4, 0xe0, 0xca, 0xc2, 0x83, 0xfa, 0xb2, 0xe7, 0x44, 0xb1, 0xdb, 0x58, 0xf4, 0x82, 0xc6, 0x6e, - 0x3d, 0x0e, 0x42, 0x72, 0x3f, 0xf0, 0xda, 0x7b, 0xa4, 0xce, 0x06, 0x02, 0xbd, 0x04, 0xc3, 0xfb, - 0xec, 0xff, 0x6a, 0x75, 0xc6, 0xba, 0x62, 0x5d, 0x2b, 0x2f, 0x4e, 0xfe, 0xf6, 0x61, 0xe5, 0x13, - 0x47, 0x87, 0x95, 0xe1, 0xfb, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x15, 0x06, 0xb7, 0xa2, 0x8d, 0x83, - 0x16, 0x99, 0x29, 0x30, 0xdc, 0x71, 0x81, 0x3b, 0xb8, 0x52, 0xa7, 0xa5, 0x58, 0x40, 0xd1, 0x3c, - 0x94, 0x5b, 0x4e, 0x18, 0xbb, 0xb1, 0x1b, 0xf8, 0x33, 0xc5, 0x2b, 0xd6, 0xb5, 0x81, 0xc5, 0x29, - 0x81, 0x5a, 0xae, 0x49, 0x00, 0x4e, 0x70, 0x68, 0x37, 0x42, 0xe2, 0x34, 0xef, 0xfa, 0xde, 0xc1, - 0x4c, 0xe9, 0x8a, 0x75, 0x6d, 0x38, 0xe9, 0x06, 0x16, 0xe5, 0x58, 0x61, 0xd8, 0x3f, 0x59, 0x80, - 0xe1, 0x85, 0xad, 0x2d, 0xd7, 0x77, 0xe3, 0x03, 0x74, 0x1f, 0x46, 0xfd, 0xa0, 0x49, 0xe4, 0x7f, - 0xf6, 0x15, 0x23, 0xd7, 0xaf, 0xcc, 0x75, 0xae, 0xcc, 0xb9, 0x75, 0x0d, 0x6f, 0x71, 0xf2, 0xe8, - 0xb0, 0x32, 0xaa, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xd2, 0x0a, 0x9a, 0x8a, 0x6c, 0x81, 0x91, - 0xad, 0x64, 0x91, 0xad, 0x25, 0x68, 0x8b, 0x13, 0x47, 0x87, 0x95, 0x11, 0xad, 0x00, 0xeb, 0x44, - 0xd0, 0x26, 0x4c, 0xd0, 0xbf, 0x7e, 0xec, 0x2a, 0xba, 0x45, 0x46, 0xf7, 0xb9, 0x3c, 0xba, 0x1a, - 0xea, 0xe2, 0xb9, 0xa3, 0xc3, 0xca, 0x44, 0xaa, 0x10, 0xa7, 0x09, 0xda, 0x1f, 0xc0, 0xf8, 0x42, - 0x1c, 0x3b, 0x8d, 0x1d, 0xd2, 0xe4, 0x33, 0x88, 0x5e, 0x83, 0x92, 0xef, 0xec, 0x11, 0x31, 0xbf, - 0x57, 0xc4, 0xc0, 0x96, 0xd6, 0x9d, 0x3d, 0x72, 0x7c, 0x58, 0x99, 0xbc, 0xe7, 0xbb, 0xef, 0xb7, - 0xc5, 0xaa, 0xa0, 0x65, 0x98, 0x61, 0xa3, 0xeb, 0x00, 0x4d, 0xb2, 0xef, 0x36, 0x48, 0xcd, 0x89, - 0x77, 0xc4, 0x7c, 0x23, 0x51, 0x17, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x11, 0x94, 0x17, 0xf6, - 0x03, 0xb7, 0x59, 0x0b, 0x9a, 0x11, 0xda, 0x85, 0x89, 0x56, 0x48, 0xb6, 0x48, 0xa8, 0x8a, 0x66, - 0xac, 0x2b, 0xc5, 0x6b, 0x23, 0xd7, 0xaf, 0x65, 0x7e, 0xac, 0x89, 0xba, 0xec, 0xc7, 0xe1, 0xc1, - 0xe2, 0x53, 0xa2, 0xbd, 0x89, 0x14, 0x14, 0xa7, 0x29, 0xdb, 0xff, 0xbe, 0x00, 0xe7, 0x17, 0x3e, - 0x68, 0x87, 0xa4, 0xea, 0x46, 0xbb, 0xe9, 0x15, 0xde, 0x74, 0xa3, 0xdd, 0xf5, 0x64, 0x04, 0xd4, - 0xd2, 0xaa, 0x8a, 0x72, 0xac, 0x30, 0xd0, 0xcb, 0x30, 0x44, 0x7f, 0xdf, 0xc3, 0xab, 0xe2, 0x93, - 0xcf, 0x09, 0xe4, 0x91, 0xaa, 0x13, 0x3b, 0x55, 0x0e, 0xc2, 0x12, 0x07, 0xad, 0xc1, 0x48, 0x83, - 0x6d, 0xc8, 0xed, 0xb5, 0xa0, 0x49, 0xd8, 0x64, 0x96, 0x17, 0x5f, 0xa4, 0xe8, 0x4b, 0x49, 0xf1, - 0xf1, 0x61, 0x65, 0x86, 0xf7, 0x4d, 0x90, 0xd0, 0x60, 0x58, 0xaf, 0x8f, 0x6c, 0xb5, 0xbf, 0x4a, - 0x8c, 0x12, 0x64, 0xec, 0xad, 0x6b, 0xda, 0x56, 0x19, 0x60, 0x5b, 0x65, 0x34, 0x7b, 0x9b, 0xa0, - 0x57, 0xa0, 0xb4, 0xeb, 0xfa, 0xcd, 0x99, 0x41, 0x46, 0xeb, 0x12, 0x9d, 0xf3, 0xdb, 0xae, 0xdf, - 0x3c, 0x3e, 0xac, 0x4c, 0x19, 0xdd, 0xa1, 0x85, 0x98, 0xa1, 0xda, 0x7f, 0x6a, 0x41, 0x85, 0xc1, - 0x56, 0x5c, 0x8f, 0xd4, 0x48, 0x18, 0xb9, 0x51, 0x4c, 0xfc, 0xd8, 0x18, 0xd0, 0xeb, 0x00, 0x11, - 0x69, 0x84, 0x24, 0xd6, 0x86, 0x54, 0x2d, 0x8c, 0xba, 0x82, 0x60, 0x0d, 0x8b, 0x32, 0x84, 0x68, - 0xc7, 0x09, 0xd9, 0xfa, 0x12, 0x03, 0xab, 0x18, 0x42, 0x5d, 0x02, 0x70, 0x82, 0x63, 0x30, 0x84, - 0x62, 0x2f, 0x86, 0x80, 0x3e, 0x0f, 0x13, 0x49, 0x63, 0x51, 0xcb, 0x69, 0xc8, 0x01, 0x64, 0x5b, - 0xa6, 0x6e, 0x82, 0x70, 0x1a, 0xd7, 0xfe, 0xc7, 0x96, 0x58, 0x3c, 0xf4, 0xab, 0x3f, 0xe6, 0xdf, - 0x6a, 0xff, 0x9a, 0x05, 0x43, 0x8b, 0xae, 0xdf, 0x74, 0xfd, 0x6d, 0xf4, 0x15, 0x18, 0xa6, 0x67, - 0x53, 0xd3, 0x89, 0x1d, 0xc1, 0xf7, 0xbe, 0x4d, 0xdb, 0x5b, 0xea, 0xa8, 0x98, 0x6b, 0xed, 0x6e, - 0xd3, 0x82, 0x68, 0x8e, 0x62, 0xd3, 0xdd, 0x76, 0x77, 0xf3, 0x3d, 0xd2, 0x88, 0xd7, 0x48, 0xec, - 0x24, 0x9f, 0x93, 0x94, 0x61, 0x45, 0x15, 0xdd, 0x86, 0xc1, 0xd8, 0x09, 0xb7, 0x49, 0x2c, 0x18, - 0x60, 0x26, 0xa3, 0xe2, 0x35, 0x31, 0xdd, 0x91, 0xc4, 0x6f, 0x90, 0xe4, 0x58, 0xd8, 0x60, 0x55, - 0xb1, 0x20, 0x61, 0xff, 0xad, 0x41, 0xb8, 0xb8, 0x54, 0x5f, 0xcd, 0x59, 0x57, 0x57, 0x61, 0xb0, - 0x19, 0xba, 0xfb, 0x24, 0x14, 0xe3, 0xac, 0xa8, 0x54, 0x59, 0x29, 0x16, 0x50, 0x74, 0x03, 0x46, - 0xf9, 0x81, 0x74, 0xcb, 0xf1, 0x9b, 0x9e, 0x1c, 0xe2, 0x69, 0x81, 0x3d, 0x7a, 0x5f, 0x83, 0x61, - 0x03, 0xf3, 0x84, 0x8b, 0xea, 0x6a, 0x6a, 0x33, 0xe6, 0x1d, 0x76, 0x3f, 0x6c, 0xc1, 0x24, 0x6f, - 0x66, 0x21, 0x8e, 0x43, 0x77, 0xb3, 0x1d, 0x93, 0x68, 0x66, 0x80, 0x71, 0xba, 0xa5, 0xac, 0xd1, - 0xca, 0x1d, 0x81, 0xb9, 0xfb, 0x29, 0x2a, 0x9c, 0x09, 0xce, 0x88, 0x76, 0x27, 0xd3, 0x60, 0xdc, - 0xd1, 0x2c, 0xfa, 0x7e, 0x0b, 0x66, 0x1b, 0x81, 0x1f, 0x87, 0x81, 0xe7, 0x91, 0xb0, 0xd6, 0xde, - 0xf4, 0xdc, 0x68, 0x87, 0xaf, 0x53, 0x4c, 0xb6, 0x18, 0x27, 0xc8, 0x99, 0x43, 0x85, 0x24, 0xe6, - 0xf0, 0xf2, 0xd1, 0x61, 0x65, 0x76, 0x29, 0x97, 0x14, 0xee, 0xd2, 0x0c, 0xda, 0x05, 0x44, 0x8f, - 0xd2, 0x7a, 0xec, 0x6c, 0x93, 0xa4, 0xf1, 0xa1, 0xfe, 0x1b, 0xbf, 0x70, 0x74, 0x58, 0x41, 0xeb, - 0x1d, 0x24, 0x70, 0x06, 0x59, 0xf4, 0x3e, 0x4c, 0xd3, 0xd2, 0x8e, 0x6f, 0x1d, 0xee, 0xbf, 0xb9, - 0x99, 0xa3, 0xc3, 0xca, 0xf4, 0x7a, 0x06, 0x11, 0x9c, 0x49, 0x7a, 0x76, 0x09, 0xce, 0x67, 0x4e, - 0x15, 0x9a, 0x84, 0xe2, 0x2e, 0xe1, 0x22, 0x48, 0x19, 0xd3, 0x9f, 0x68, 0x1a, 0x06, 0xf6, 0x1d, - 0xaf, 0x2d, 0x56, 0x29, 0xe6, 0x7f, 0x3e, 0x5b, 0xb8, 0x61, 0xd9, 0x0d, 0x18, 0x5d, 0x72, 0x5a, - 0xce, 0xa6, 0xeb, 0xb9, 0xb1, 0x4b, 0x22, 0xf4, 0x3c, 0x14, 0x9d, 0x66, 0x93, 0x1d, 0x91, 0xe5, - 0xc5, 0xf3, 0x47, 0x87, 0x95, 0xe2, 0x42, 0x93, 0xf2, 0x6a, 0x50, 0x58, 0x07, 0x98, 0x62, 0xa0, - 0x4f, 0x43, 0xa9, 0x19, 0x06, 0xad, 0x99, 0x02, 0xc3, 0xa4, 0x43, 0x55, 0xaa, 0x86, 0x41, 0x2b, - 0x85, 0xca, 0x70, 0xec, 0xdf, 0x2c, 0xc0, 0x33, 0x4b, 0xa4, 0xb5, 0xb3, 0x52, 0xcf, 0xd9, 0x74, - 0xd7, 0x60, 0x78, 0x2f, 0xf0, 0xdd, 0x38, 0x08, 0x23, 0xd1, 0x34, 0x3b, 0x4d, 0xd6, 0x44, 0x19, - 0x56, 0x50, 0x74, 0x05, 0x4a, 0xad, 0x44, 0x12, 0x18, 0x95, 0x52, 0x04, 0x93, 0x01, 0x18, 0x84, - 0x62, 0xb4, 0x23, 0x12, 0x8a, 0x53, 0x50, 0x61, 0xdc, 0x8b, 0x48, 0x88, 0x19, 0x24, 0x61, 0xa7, - 0x94, 0xd1, 0x8a, 0x6d, 0x95, 0x62, 0xa7, 0x14, 0x82, 0x35, 0x2c, 0x54, 0x83, 0x72, 0xa4, 0x26, - 0x75, 0xa0, 0xff, 0x49, 0x1d, 0x63, 0xfc, 0x56, 0xcd, 0x64, 0x42, 0xc4, 0x60, 0x03, 0x83, 0x3d, - 0xf9, 0xed, 0xaf, 0x17, 0x00, 0xf1, 0x21, 0xfc, 0x4b, 0x36, 0x70, 0xf7, 0x3a, 0x07, 0x2e, 0x53, - 0xf2, 0xba, 0x13, 0x34, 0x1c, 0x2f, 0xcd, 0xc2, 0x4f, 0x6b, 0xf4, 0x7e, 0xc2, 0x02, 0xb4, 0xe4, - 0xfa, 0x4d, 0x12, 0x9e, 0xc1, 0xb5, 0xe3, 0x64, 0x07, 0xe9, 0x1d, 0x18, 0x5f, 0xf2, 0x5c, 0xe2, - 0xc7, 0xab, 0xb5, 0xa5, 0xc0, 0xdf, 0x72, 0xb7, 0xd1, 0x67, 0x61, 0x9c, 0xde, 0xc2, 0x82, 0x76, - 0x5c, 0x27, 0x8d, 0xc0, 0x67, 0x02, 0x2b, 0xbd, 0xbb, 0xa0, 0xa3, 0xc3, 0xca, 0xf8, 0x86, 0x01, - 0xc1, 0x29, 0x4c, 0xfb, 0xf7, 0xe9, 0x87, 0x06, 0x7b, 0xad, 0xc0, 0x27, 0x7e, 0xbc, 0x14, 0xf8, - 0x4d, 0x7e, 0xb1, 0xf9, 0x2c, 0x94, 0x62, 0xda, 0x71, 0xfe, 0x91, 0x57, 0xe5, 0xd4, 0xd2, 0xee, - 0x1e, 0x1f, 0x56, 0x2e, 0x74, 0xd6, 0x60, 0x1f, 0xc4, 0xea, 0xa0, 0x6f, 0x87, 0xc1, 0x28, 0x76, - 0xe2, 0x76, 0x24, 0x3e, 0xfb, 0x59, 0xf9, 0xd9, 0x75, 0x56, 0x7a, 0x7c, 0x58, 0x99, 0x50, 0xd5, - 0x78, 0x11, 0x16, 0x15, 0xd0, 0x0b, 0x30, 0xb4, 0x47, 0xa2, 0xc8, 0xd9, 0x96, 0x32, 0xe9, 0x84, - 0xa8, 0x3b, 0xb4, 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0xe7, 0x60, 0x80, 0x84, 0x61, 0x10, 0x8a, 0x55, - 0x35, 0x26, 0x10, 0x07, 0x96, 0x69, 0x21, 0xe6, 0x30, 0xfb, 0x3f, 0x5a, 0x30, 0xa1, 0xfa, 0xca, - 0xdb, 0x3a, 0x03, 0xe1, 0xe3, 0x4b, 0x00, 0x0d, 0xf9, 0x81, 0x11, 0xe3, 0x77, 0x23, 0xd7, 0xaf, - 0x66, 0x1e, 0xa9, 0x1d, 0xc3, 0x98, 0x50, 0x56, 0x45, 0x11, 0xd6, 0xa8, 0xd9, 0xff, 0xca, 0x82, - 0x73, 0xa9, 0x2f, 0xba, 0xe3, 0x46, 0x31, 0x7a, 0xb7, 0xe3, 0xab, 0xe6, 0xfa, 0xfb, 0x2a, 0x5a, - 0x9b, 0x7d, 0x93, 0x5a, 0x73, 0xb2, 0x44, 0xfb, 0xa2, 0x5b, 0x30, 0xe0, 0xc6, 0x64, 0x4f, 0x7e, - 0xcc, 0x73, 0x5d, 0x3f, 0x86, 0xf7, 0x2a, 0x99, 0x91, 0x55, 0x5a, 0x13, 0x73, 0x02, 0xf6, 0x8f, - 0x15, 0xa1, 0xcc, 0x97, 0xed, 0x9a, 0xd3, 0x3a, 0x83, 0xb9, 0x58, 0x85, 0x12, 0xa3, 0xce, 0x3b, - 0xfe, 0x7c, 0x76, 0xc7, 0x45, 0x77, 0xe6, 0xe8, 0xcd, 0x82, 0x0b, 0x2f, 0x8a, 0x99, 0xd1, 0x22, - 0xcc, 0x48, 0x20, 0x07, 0x60, 0xd3, 0xf5, 0x9d, 0xf0, 0x80, 0x96, 0xcd, 0x14, 0x19, 0xc1, 0x97, - 0xbb, 0x13, 0x5c, 0x54, 0xf8, 0x9c, 0xac, 0xea, 0x6b, 0x02, 0xc0, 0x1a, 0xd1, 0xd9, 0x37, 0xa0, - 0xac, 0x90, 0x4f, 0x72, 0x2a, 0xcf, 0x7e, 0x1e, 0x26, 0x52, 0x6d, 0xf5, 0xaa, 0x3e, 0xaa, 0x1f, - 0xea, 0xdf, 0x60, 0x5c, 0x40, 0xf4, 0x7a, 0xd9, 0xdf, 0x17, 0xec, 0xee, 0x03, 0x98, 0xf6, 0x32, - 0xb8, 0xac, 0x98, 0xaa, 0xfe, 0xb9, 0xf2, 0x33, 0xe2, 0xb3, 0xa7, 0xb3, 0xa0, 0x38, 0xb3, 0x0d, - 0x7a, 0x50, 0x05, 0x2d, 0xba, 0xe6, 0x1d, 0x8f, 0xf5, 0x57, 0xdc, 0x17, 0xef, 0x8a, 0x32, 0xac, - 0xa0, 0x94, 0x85, 0x4d, 0xab, 0xce, 0xdf, 0x26, 0x07, 0x75, 0xe2, 0x91, 0x46, 0x1c, 0x84, 0x1f, - 0x69, 0xf7, 0x2f, 0xf1, 0xd1, 0xe7, 0x1c, 0x70, 0x44, 0x10, 0x28, 0xde, 0x26, 0x07, 0x7c, 0x2a, - 0xf4, 0xaf, 0x2b, 0x76, 0xfd, 0xba, 0x5f, 0xb4, 0x60, 0x4c, 0x7d, 0xdd, 0x19, 0x6c, 0xf5, 0x45, - 0x73, 0xab, 0x5f, 0xea, 0xba, 0xc0, 0x73, 0x36, 0xf9, 0x5f, 0x30, 0x26, 0x25, 0x70, 0x6a, 0x61, - 0x40, 0x87, 0x86, 0x9e, 0x2a, 0x1f, 0xe5, 0x84, 0xf4, 0xf3, 0x5d, 0xb7, 0xc9, 0xc1, 0x46, 0x40, - 0x05, 0x9c, 0xec, 0xef, 0x32, 0x66, 0xad, 0xd4, 0x75, 0xd6, 0x7e, 0xb9, 0x00, 0xe7, 0xd5, 0x08, - 0x18, 0x22, 0xc4, 0x5f, 0xf6, 0x31, 0x78, 0x05, 0x46, 0x9a, 0x64, 0xcb, 0x69, 0x7b, 0xb1, 0x52, - 0x1d, 0x0d, 0x70, 0xf5, 0x61, 0x35, 0x29, 0xc6, 0x3a, 0xce, 0x09, 0x86, 0xed, 0x67, 0x47, 0xd8, - 0xe9, 0x10, 0x3b, 0x74, 0x05, 0x53, 0xf9, 0x52, 0x53, 0x00, 0x8e, 0xea, 0x0a, 0x40, 0xa1, 0xec, - 0x7b, 0x0e, 0x06, 0xdc, 0x3d, 0x2a, 0x2d, 0x14, 0x4c, 0x21, 0x60, 0x95, 0x16, 0x62, 0x0e, 0x43, - 0x9f, 0x82, 0xa1, 0x46, 0xb0, 0xb7, 0xe7, 0xf8, 0x4d, 0xc6, 0xb4, 0xcb, 0x8b, 0x23, 0x54, 0xa0, - 0x58, 0xe2, 0x45, 0x58, 0xc2, 0xd0, 0x33, 0x50, 0x72, 0xc2, 0xed, 0x68, 0xa6, 0xc4, 0x70, 0x86, - 0x69, 0x4b, 0x0b, 0xe1, 0x76, 0x84, 0x59, 0x29, 0x95, 0x64, 0x1f, 0x06, 0xe1, 0xae, 0xeb, 0x6f, - 0x57, 0xdd, 0x90, 0x89, 0xa5, 0x9a, 0x24, 0xfb, 0x40, 0x41, 0xb0, 0x86, 0x85, 0x56, 0x60, 0xa0, - 0x15, 0x84, 0x71, 0x34, 0x33, 0xc8, 0x86, 0xfb, 0xd9, 0x9c, 0xad, 0xc4, 0xbf, 0xb6, 0x16, 0x84, - 0x71, 0xf2, 0x01, 0xf4, 0x5f, 0x84, 0x79, 0x75, 0xf4, 0xed, 0x50, 0x24, 0xfe, 0xfe, 0xcc, 0x10, - 0xa3, 0x32, 0x9b, 0x45, 0x65, 0xd9, 0xdf, 0xbf, 0xef, 0x84, 0x09, 0x9f, 0x59, 0xf6, 0xf7, 0x31, - 0xad, 0x83, 0xbe, 0x08, 0x65, 0xf9, 0x78, 0x10, 0x89, 0xab, 0x65, 0xe6, 0x12, 0xc3, 0x02, 0x09, - 0x93, 0xf7, 0xdb, 0x6e, 0x48, 0xf6, 0x88, 0x1f, 0x47, 0x89, 0xfa, 0x47, 0x42, 0x23, 0x9c, 0x50, - 0x43, 0x5f, 0x94, 0xfa, 0x8c, 0xb5, 0xa0, 0xed, 0xc7, 0xd1, 0x4c, 0x99, 0x75, 0x2f, 0x53, 0xd3, - 0x7c, 0x3f, 0xc1, 0x4b, 0x2b, 0x3c, 0x78, 0x65, 0x6c, 0x90, 0x42, 0x18, 0xc6, 0x3c, 0x77, 0x9f, - 0xf8, 0x24, 0x8a, 0x6a, 0x61, 0xb0, 0x49, 0x66, 0x80, 0xf5, 0xfc, 0x62, 0xb6, 0x02, 0x36, 0xd8, - 0x24, 0x8b, 0x53, 0x47, 0x87, 0x95, 0xb1, 0x3b, 0x7a, 0x1d, 0x6c, 0x92, 0x40, 0xf7, 0x60, 0x9c, - 0x8a, 0xd0, 0x6e, 0x42, 0x74, 0xa4, 0x17, 0x51, 0x26, 0x3f, 0x63, 0xa3, 0x12, 0x4e, 0x11, 0x41, - 0x6f, 0x43, 0xd9, 0x73, 0xb7, 0x48, 0xe3, 0xa0, 0xe1, 0x91, 0x99, 0x51, 0x46, 0x31, 0x73, 0x5b, - 0xdd, 0x91, 0x48, 0xfc, 0x8a, 0xa2, 0xfe, 0xe2, 0xa4, 0x3a, 0xba, 0x0f, 0x17, 0x62, 0x12, 0xee, - 0xb9, 0xbe, 0x43, 0xb7, 0x83, 0x90, 0x78, 0x99, 0x1a, 0x7b, 0x8c, 0xad, 0xb7, 0xcb, 0x62, 0xe8, - 0x2e, 0x6c, 0x64, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x2e, 0x4c, 0xb0, 0x9d, 0x50, 0x6b, 0x7b, 0x5e, - 0x2d, 0xf0, 0xdc, 0xc6, 0xc1, 0xcc, 0x38, 0x23, 0xf8, 0x29, 0xa9, 0xa7, 0x5e, 0x35, 0xc1, 0xf4, - 0x4e, 0x9e, 0xfc, 0xc3, 0xe9, 0xda, 0x68, 0x93, 0xe9, 0x2d, 0xdb, 0xa1, 0x1b, 0x1f, 0xd0, 0xf5, - 0x4b, 0x1e, 0xc5, 0x33, 0x13, 0x5d, 0x6f, 0xb8, 0x3a, 0xaa, 0x52, 0x6e, 0xea, 0x85, 0x38, 0x4d, - 0x90, 0x6e, 0xed, 0x28, 0x6e, 0xba, 0xfe, 0xcc, 0x24, 0xe3, 0x18, 0x6a, 0x67, 0xd4, 0x69, 0x21, - 0xe6, 0x30, 0xa6, 0xb3, 0xa4, 0x3f, 0xee, 0x52, 0x0e, 0x3a, 0xc5, 0x10, 0x13, 0x9d, 0xa5, 0x04, - 0xe0, 0x04, 0x87, 0x1e, 0xcb, 0x71, 0x7c, 0x30, 0x83, 0x18, 0xaa, 0xda, 0x2e, 0x1b, 0x1b, 0x5f, - 0xc4, 0xb4, 0x1c, 0xdd, 0x81, 0x21, 0xe2, 0xef, 0xaf, 0x84, 0xc1, 0xde, 0xcc, 0xb9, 0xfc, 0x3d, - 0xbb, 0xcc, 0x51, 0x38, 0x43, 0x4f, 0xae, 0x28, 0xa2, 0x18, 0x4b, 0x12, 0xe8, 0x11, 0xcc, 0x64, - 0xcc, 0x08, 0x9f, 0x80, 0x69, 0x36, 0x01, 0x9f, 0x13, 0x75, 0x67, 0x36, 0x72, 0xf0, 0x8e, 0xbb, - 0xc0, 0x70, 0x2e, 0x75, 0xf4, 0xdd, 0x30, 0xc6, 0x37, 0x14, 0x7f, 0xf0, 0x88, 0x66, 0xce, 0xb3, - 0xaf, 0xb9, 0x92, 0xbf, 0x39, 0x39, 0xe2, 0xe2, 0x79, 0xd1, 0xa1, 0x31, 0xbd, 0x34, 0xc2, 0x26, - 0x35, 0x7b, 0x13, 0xc6, 0x15, 0xdf, 0x62, 0x4b, 0x07, 0x55, 0x60, 0x80, 0x32, 0x64, 0xa9, 0x53, - 0x28, 0xd3, 0x99, 0x62, 0x8a, 0x6a, 0xcc, 0xcb, 0xd9, 0x4c, 0xb9, 0x1f, 0x90, 0xc5, 0x83, 0x98, - 0xf0, 0x7b, 0x61, 0x51, 0x9b, 0x29, 0x09, 0xc0, 0x09, 0x8e, 0xfd, 0xff, 0xb8, 0xdc, 0x93, 0x30, - 0xc7, 0x3e, 0x8e, 0x83, 0x97, 0x60, 0x78, 0x27, 0x88, 0x62, 0x8a, 0xcd, 0xda, 0x18, 0x48, 0x24, - 0x9d, 0x5b, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x26, 0x8c, 0x35, 0xf4, 0x06, 0xc4, 0x59, 0xa6, 0x86, - 0xc0, 0x68, 0x1d, 0x9b, 0xb8, 0xe8, 0x06, 0x0c, 0xb3, 0xe7, 0xca, 0x46, 0xe0, 0x89, 0x1b, 0xa8, - 0x3c, 0x90, 0x87, 0x6b, 0xa2, 0xfc, 0x58, 0xfb, 0x8d, 0x15, 0x36, 0xba, 0x0a, 0x83, 0xb4, 0x0b, - 0xab, 0x35, 0x71, 0x8a, 0x28, 0xad, 0xc0, 0x2d, 0x56, 0x8a, 0x05, 0xd4, 0xfe, 0xdb, 0x05, 0x6d, - 0x94, 0xe9, 0x9d, 0x8a, 0xa0, 0x1a, 0x0c, 0x3d, 0x74, 0xdc, 0xd8, 0xf5, 0xb7, 0x85, 0xb8, 0xf0, - 0x42, 0xd7, 0x23, 0x85, 0x55, 0x7a, 0xc0, 0x2b, 0xf0, 0x43, 0x4f, 0xfc, 0xc1, 0x92, 0x0c, 0xa5, - 0x18, 0xb6, 0x7d, 0x9f, 0x52, 0x2c, 0xf4, 0x4b, 0x11, 0xf3, 0x0a, 0x9c, 0xa2, 0xf8, 0x83, 0x25, - 0x19, 0xf4, 0x2e, 0x80, 0x5c, 0x96, 0xa4, 0x29, 0x9e, 0x09, 0x5f, 0xea, 0x4d, 0x74, 0x43, 0xd5, - 0x59, 0x1c, 0xa7, 0x47, 0x6a, 0xf2, 0x1f, 0x6b, 0xf4, 0xec, 0x98, 0x89, 0x55, 0x9d, 0x9d, 0x41, - 0xdf, 0x45, 0x39, 0x81, 0x13, 0xc6, 0xa4, 0xb9, 0x10, 0x8b, 0xc1, 0xf9, 0x74, 0x7f, 0x52, 0xf1, - 0x86, 0xbb, 0x47, 0x74, 0xae, 0x21, 0x88, 0xe0, 0x84, 0x9e, 0xfd, 0xab, 0x45, 0x98, 0xc9, 0xeb, - 0x2e, 0x5d, 0x74, 0xe4, 0x91, 0x1b, 0x2f, 0x51, 0x69, 0xc8, 0x32, 0x17, 0xdd, 0xb2, 0x28, 0xc7, - 0x0a, 0x83, 0xce, 0x7e, 0xe4, 0x6e, 0xcb, 0x4b, 0xcd, 0x40, 0x32, 0xfb, 0x75, 0x56, 0x8a, 0x05, - 0x94, 0xe2, 0x85, 0xc4, 0x89, 0xc4, 0x3b, 0xb4, 0xb6, 0x4a, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0x6b, - 0x4c, 0x4a, 0x3d, 0x34, 0x26, 0xc6, 0x10, 0x0d, 0x9c, 0xee, 0x10, 0xa1, 0x2f, 0x03, 0x6c, 0xb9, - 0xbe, 0x1b, 0xed, 0x30, 0xea, 0x83, 0x27, 0xa6, 0xae, 0x64, 0xa9, 0x15, 0x45, 0x05, 0x6b, 0x14, - 0xd1, 0xeb, 0x30, 0xa2, 0x36, 0xe0, 0x6a, 0x95, 0x29, 0xe5, 0xb5, 0x47, 0xce, 0x84, 0x1b, 0x55, - 0xb1, 0x8e, 0x67, 0xbf, 0x97, 0x5e, 0x2f, 0x62, 0x07, 0x68, 0xe3, 0x6b, 0xf5, 0x3b, 0xbe, 0x85, - 0xee, 0xe3, 0x6b, 0xff, 0x56, 0x11, 0x26, 0x8c, 0xc6, 0xda, 0x51, 0x1f, 0x3c, 0xeb, 0x26, 0x3d, - 0xe7, 0x9c, 0x98, 0x88, 0xfd, 0x67, 0xf7, 0xde, 0x2a, 0xfa, 0x59, 0x48, 0x77, 0x00, 0xaf, 0x8f, - 0xbe, 0x0c, 0x65, 0xcf, 0x89, 0x98, 0xf6, 0x85, 0x88, 0x7d, 0xd7, 0x0f, 0xb1, 0xe4, 0x1e, 0xe1, - 0x44, 0xb1, 0x76, 0xd4, 0x70, 0xda, 0x09, 0x49, 0x7a, 0x20, 0x53, 0xd9, 0x47, 0x1a, 0x3a, 0xa8, - 0x4e, 0x50, 0x01, 0xe9, 0x00, 0x73, 0x18, 0xba, 0x01, 0xa3, 0x21, 0x61, 0xab, 0x62, 0x89, 0x8a, - 0x72, 0x6c, 0x99, 0x0d, 0x24, 0x32, 0x1f, 0xd6, 0x60, 0xd8, 0xc0, 0x4c, 0x44, 0xf9, 0xc1, 0x2e, - 0xa2, 0xfc, 0x0b, 0x30, 0xc4, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0x63, 0x95, 0x17, 0x63, 0x09, 0x4f, - 0x2f, 0x98, 0xe1, 0x3e, 0x17, 0xcc, 0xa7, 0x61, 0xbc, 0xea, 0x90, 0xbd, 0xc0, 0x5f, 0xf6, 0x9b, - 0xad, 0xc0, 0xf5, 0x63, 0x34, 0x03, 0x25, 0x76, 0x3a, 0xf0, 0xbd, 0x5d, 0xa2, 0x14, 0x70, 0x89, - 0x0a, 0xe6, 0xf6, 0x36, 0x9c, 0xaf, 0x06, 0x0f, 0xfd, 0x87, 0x4e, 0xd8, 0x5c, 0xa8, 0xad, 0x6a, - 0xf7, 0xdc, 0x75, 0x79, 0xcf, 0xe2, 0x86, 0x03, 0x99, 0x3c, 0x55, 0xab, 0xc9, 0xcf, 0xda, 0x15, - 0xd7, 0x23, 0x39, 0xf7, 0xe9, 0xbf, 0x5b, 0x30, 0x5a, 0x4a, 0xf0, 0x95, 0x92, 0xde, 0xca, 0x55, - 0xd2, 0xbf, 0x03, 0xc3, 0x5b, 0x2e, 0xf1, 0x9a, 0x98, 0x6c, 0x89, 0x25, 0xf6, 0x7c, 0xfe, 0x5b, - 0xe8, 0x0a, 0xc5, 0x94, 0xfa, 0x13, 0x7e, 0x4b, 0x5b, 0x11, 0x95, 0xb1, 0x22, 0x83, 0x76, 0x61, - 0x52, 0x5e, 0x03, 0x24, 0x54, 0x2c, 0xb8, 0x17, 0xba, 0xdd, 0x2d, 0x4c, 0xe2, 0xd3, 0x47, 0x87, - 0x95, 0x49, 0x9c, 0x22, 0x83, 0x3b, 0x08, 0xd3, 0x6b, 0xd9, 0x1e, 0x65, 0xad, 0x25, 0x36, 0xfc, - 0xec, 0x5a, 0xc6, 0x6e, 0x98, 0xac, 0xd4, 0xfe, 0x69, 0x0b, 0x9e, 0xea, 0x18, 0x19, 0x71, 0xd3, - 0x3e, 0xe5, 0x59, 0x48, 0xdf, 0x7c, 0x0b, 0xbd, 0x6f, 0xbe, 0xf6, 0x3f, 0xb1, 0x60, 0x7a, 0x79, - 0xaf, 0x15, 0x1f, 0x54, 0x5d, 0xf3, 0x21, 0xe1, 0x0d, 0x18, 0xdc, 0x23, 0x4d, 0xb7, 0xbd, 0x27, - 0x66, 0xae, 0x22, 0xd9, 0xcf, 0x1a, 0x2b, 0x3d, 0x3e, 0xac, 0x8c, 0xd5, 0xe3, 0x20, 0x74, 0xb6, - 0x09, 0x2f, 0xc0, 0x02, 0x9d, 0x31, 0x71, 0xf7, 0x03, 0x72, 0xc7, 0xdd, 0x73, 0xe5, 0xdb, 0x76, - 0x57, 0xed, 0xcf, 0x9c, 0x1c, 0xd0, 0xb9, 0x77, 0xda, 0x8e, 0x1f, 0xbb, 0xf1, 0x81, 0x78, 0x23, - 0x91, 0x44, 0x70, 0x42, 0xcf, 0xfe, 0xa6, 0x05, 0x13, 0x72, 0xdd, 0x2f, 0x34, 0x9b, 0x21, 0x89, - 0x22, 0x34, 0x0b, 0x05, 0xb7, 0x25, 0x7a, 0x09, 0xa2, 0x97, 0x85, 0xd5, 0x1a, 0x2e, 0xb8, 0x2d, - 0x54, 0x83, 0x32, 0x7f, 0x22, 0x4f, 0x16, 0x57, 0x5f, 0x0f, 0xed, 0xac, 0x07, 0x1b, 0xb2, 0x26, - 0x4e, 0x88, 0x48, 0x09, 0x8e, 0xf1, 0xcc, 0xa2, 0xf9, 0xc0, 0x72, 0x4b, 0x94, 0x63, 0x85, 0x81, - 0xae, 0xc1, 0xb0, 0x1f, 0x34, 0xb9, 0xc5, 0x02, 0x3f, 0xfd, 0xd8, 0x92, 0x5d, 0x17, 0x65, 0x58, - 0x41, 0xed, 0x1f, 0xb5, 0x60, 0x54, 0x7e, 0x59, 0x9f, 0xc2, 0x24, 0xdd, 0x5a, 0x89, 0x20, 0x99, - 0x6c, 0x2d, 0x2a, 0x0c, 0x32, 0x88, 0x21, 0x03, 0x16, 0x4f, 0x22, 0x03, 0xda, 0x3f, 0x55, 0x80, - 0x71, 0xd9, 0x9d, 0x7a, 0x7b, 0x33, 0x22, 0x31, 0xda, 0x80, 0xb2, 0xc3, 0x87, 0x9c, 0xc8, 0x15, - 0xfb, 0x5c, 0xf6, 0xe5, 0xc3, 0x98, 0x9f, 0xe4, 0x58, 0x5e, 0x90, 0xb5, 0x71, 0x42, 0x08, 0x79, - 0x30, 0xe5, 0x07, 0x31, 0x63, 0xd1, 0x0a, 0xde, 0x4d, 0x89, 0x9f, 0xa6, 0x7e, 0x51, 0x50, 0x9f, - 0x5a, 0x4f, 0x53, 0xc1, 0x9d, 0x84, 0xd1, 0xb2, 0x54, 0x78, 0x14, 0xf3, 0xaf, 0x1b, 0xfa, 0x2c, - 0x64, 0xeb, 0x3b, 0xec, 0xdf, 0xb0, 0xa0, 0x2c, 0xd1, 0xce, 0xe2, 0xbd, 0x66, 0x0d, 0x86, 0x22, - 0x36, 0x09, 0x72, 0x68, 0xec, 0x6e, 0x1d, 0xe7, 0xf3, 0x95, 0x9c, 0x3c, 0xfc, 0x7f, 0x84, 0x25, - 0x0d, 0xa6, 0xb1, 0x55, 0xdd, 0xff, 0x98, 0x68, 0x6c, 0x55, 0x7f, 0x72, 0x4e, 0x98, 0xff, 0xce, - 0xfa, 0xac, 0x5d, 0x6b, 0xa9, 0x80, 0xd4, 0x0a, 0xc9, 0x96, 0xfb, 0x28, 0x2d, 0x20, 0xd5, 0x58, - 0x29, 0x16, 0x50, 0xf4, 0x2e, 0x8c, 0x36, 0xa4, 0xa2, 0x33, 0x61, 0x03, 0x57, 0xbb, 0xaa, 0x8d, - 0xd5, 0x0b, 0x03, 0xb7, 0x66, 0x5c, 0xd2, 0xea, 0x63, 0x83, 0x9a, 0xf9, 0x8a, 0x5e, 0xec, 0xf5, - 0x8a, 0x9e, 0xd0, 0xcd, 0x7d, 0x07, 0xb6, 0x7f, 0xc6, 0x82, 0x41, 0xae, 0x2e, 0xeb, 0x4f, 0xbf, - 0xa8, 0x3d, 0xb8, 0x24, 0x63, 0x77, 0x9f, 0x16, 0x8a, 0x07, 0x14, 0xb4, 0x06, 0x65, 0xf6, 0x83, - 0xa9, 0x0d, 0x8a, 0xf9, 0x66, 0x9c, 0xbc, 0x55, 0xbd, 0x83, 0xf7, 0x65, 0x35, 0x9c, 0x50, 0xb0, - 0x7f, 0xbc, 0x48, 0x59, 0x55, 0x82, 0x6a, 0x9c, 0xe0, 0xd6, 0x93, 0x3b, 0xc1, 0x0b, 0x4f, 0xea, - 0x04, 0xdf, 0x86, 0x89, 0x86, 0xf6, 0x3c, 0x93, 0xcc, 0xe4, 0xb5, 0xae, 0x8b, 0x44, 0x7b, 0xc9, - 0xe1, 0x2a, 0xa3, 0x25, 0x93, 0x08, 0x4e, 0x53, 0x45, 0xdf, 0x05, 0xa3, 0x7c, 0x9e, 0x45, 0x2b, - 0x25, 0xd6, 0xca, 0xa7, 0xf2, 0xd7, 0x8b, 0xde, 0x04, 0x5b, 0x89, 0x75, 0xad, 0x3a, 0x36, 0x88, - 0xd9, 0xbf, 0x3a, 0x0c, 0x03, 0xcb, 0xfb, 0xc4, 0x8f, 0xcf, 0x80, 0x21, 0x35, 0x60, 0xdc, 0xf5, - 0xf7, 0x03, 0x6f, 0x9f, 0x34, 0x39, 0xfc, 0x24, 0x87, 0xeb, 0x05, 0x41, 0x7a, 0x7c, 0xd5, 0x20, - 0x81, 0x53, 0x24, 0x9f, 0xc4, 0x0d, 0xf3, 0x26, 0x0c, 0xf2, 0xb9, 0x17, 0xd7, 0xcb, 0x4c, 0x65, - 0x30, 0x1b, 0x44, 0xb1, 0x0b, 0x92, 0xdb, 0x2f, 0xd7, 0x3e, 0x8b, 0xea, 0xe8, 0x3d, 0x18, 0xdf, - 0x72, 0xc3, 0x28, 0xa6, 0x57, 0xc3, 0x28, 0x76, 0xf6, 0x5a, 0x8f, 0x71, 0xa3, 0x54, 0xe3, 0xb0, - 0x62, 0x50, 0xc2, 0x29, 0xca, 0x68, 0x1b, 0xc6, 0xe8, 0x25, 0x27, 0x69, 0x6a, 0xe8, 0xc4, 0x4d, - 0x29, 0x95, 0xd1, 0x1d, 0x9d, 0x10, 0x36, 0xe9, 0x52, 0x66, 0xd2, 0x60, 0x97, 0xa2, 0x61, 0x26, - 0x51, 0x28, 0x66, 0xc2, 0x6f, 0x43, 0x1c, 0x46, 0x79, 0x12, 0x33, 0xbc, 0x28, 0x9b, 0x3c, 0x49, - 0x33, 0xaf, 0xf8, 0x0a, 0x94, 0x09, 0x1d, 0x42, 0x4a, 0x58, 0x28, 0xc6, 0xe7, 0xfb, 0xeb, 0xeb, - 0x9a, 0xdb, 0x08, 0x03, 0xf3, 0x2e, 0xbf, 0x2c, 0x29, 0xe1, 0x84, 0x28, 0x5a, 0x82, 0xc1, 0x88, - 0x84, 0x2e, 0x89, 0x84, 0x8a, 0xbc, 0xcb, 0x34, 0x32, 0x34, 0x6e, 0xef, 0xcb, 0x7f, 0x63, 0x51, - 0x95, 0x2e, 0x2f, 0x87, 0xdd, 0x86, 0x98, 0x56, 0x5c, 0x5b, 0x5e, 0x0b, 0xac, 0x14, 0x0b, 0x28, - 0x7a, 0x1b, 0x86, 0x42, 0xe2, 0x31, 0x65, 0xd1, 0x58, 0xff, 0x8b, 0x9c, 0xeb, 0x9e, 0x78, 0x3d, - 0x2c, 0x09, 0xa0, 0xdb, 0x80, 0x42, 0x42, 0x65, 0x08, 0xd7, 0xdf, 0x56, 0xe6, 0x08, 0x42, 0xd7, - 0xfd, 0xb4, 0x68, 0xff, 0x1c, 0x4e, 0x30, 0xa4, 0x25, 0x20, 0xce, 0xa8, 0x86, 0x6e, 0xc2, 0x94, - 0x2a, 0x5d, 0xf5, 0xa3, 0xd8, 0xf1, 0x1b, 0x84, 0xa9, 0xb9, 0xcb, 0x89, 0x54, 0x84, 0xd3, 0x08, - 0xb8, 0xb3, 0x8e, 0xfd, 0x75, 0x2a, 0xce, 0xd0, 0xd1, 0x3a, 0x03, 0x59, 0xe0, 0x2d, 0x53, 0x16, - 0xb8, 0x98, 0x3b, 0x73, 0x39, 0x72, 0xc0, 0x91, 0x05, 0x23, 0xda, 0xcc, 0x26, 0x6b, 0xd6, 0xea, - 0xb2, 0x66, 0xdb, 0x30, 0x49, 0x57, 0xfa, 0xdd, 0x4d, 0xe6, 0xfa, 0xd2, 0x64, 0x0b, 0xb3, 0xf0, - 0x78, 0x0b, 0x53, 0x19, 0x8d, 0xde, 0x49, 0x11, 0xc4, 0x1d, 0x4d, 0xa0, 0x37, 0xa4, 0xe6, 0xa4, - 0x68, 0x98, 0x19, 0x71, 0xad, 0xc8, 0xf1, 0x61, 0x65, 0x52, 0xfb, 0x10, 0x5d, 0x53, 0x62, 0x7f, - 0x45, 0x7e, 0x23, 0x67, 0x36, 0xf3, 0x50, 0x6e, 0xa8, 0xc5, 0x62, 0x99, 0x86, 0xcf, 0x6a, 0x39, - 0xe0, 0x04, 0x87, 0xee, 0x51, 0x7a, 0x05, 0x49, 0x5b, 0xc6, 0xd1, 0x0b, 0x0a, 0x66, 0x10, 0xfb, - 0x55, 0x80, 0xe5, 0x47, 0xa4, 0xc1, 0x97, 0xba, 0xfe, 0x00, 0x69, 0xe5, 0x3f, 0x40, 0xda, 0xff, - 0xd9, 0x82, 0xf1, 0x95, 0x25, 0xe3, 0x9a, 0x38, 0x07, 0xc0, 0xef, 0x46, 0x0f, 0x1e, 0xac, 0x4b, - 0xdd, 0x3a, 0x57, 0x8f, 0xaa, 0x52, 0xac, 0x61, 0xa0, 0x8b, 0x50, 0xf4, 0xda, 0xbe, 0xb8, 0xb2, - 0x0c, 0x1d, 0x1d, 0x56, 0x8a, 0x77, 0xda, 0x3e, 0xa6, 0x65, 0x9a, 0x31, 0x5a, 0xb1, 0x6f, 0x63, - 0xb4, 0x9e, 0x2e, 0x2d, 0xa8, 0x02, 0x03, 0x0f, 0x1f, 0xba, 0x4d, 0x6e, 0x38, 0x2c, 0xf4, 0xfe, - 0x0f, 0x1e, 0xac, 0x56, 0x23, 0xcc, 0xcb, 0xed, 0xaf, 0x15, 0x61, 0x76, 0xc5, 0x23, 0x8f, 0x3e, - 0xa4, 0xf1, 0x74, 0xbf, 0xa6, 0x74, 0x27, 0x93, 0x17, 0x4f, 0x6a, 0x37, 0xd8, 0x7b, 0x3c, 0xb6, - 0x60, 0x88, 0x3f, 0x66, 0x4b, 0x53, 0xea, 0x37, 0xb3, 0x5a, 0xcf, 0x1f, 0x90, 0x39, 0xfe, 0x28, - 0x2e, 0x4c, 0xa8, 0xd5, 0x49, 0x2b, 0x4a, 0xb1, 0x24, 0x3e, 0xfb, 0x59, 0x18, 0xd5, 0x31, 0x4f, - 0x64, 0xc1, 0xfb, 0xd7, 0x8b, 0x30, 0x49, 0x7b, 0xf0, 0x44, 0x27, 0xe2, 0x5e, 0xe7, 0x44, 0x9c, - 0xb6, 0x15, 0x67, 0xef, 0xd9, 0x78, 0x37, 0x3d, 0x1b, 0xaf, 0xe4, 0xcd, 0xc6, 0x59, 0xcf, 0xc1, - 0xf7, 0x5b, 0x70, 0x6e, 0xc5, 0x0b, 0x1a, 0xbb, 0x29, 0x03, 0xd3, 0xd7, 0x61, 0x84, 0xf2, 0xf1, - 0xc8, 0xf0, 0xdc, 0x30, 0x7c, 0x79, 0x04, 0x08, 0xeb, 0x78, 0x5a, 0xb5, 0x7b, 0xf7, 0x56, 0xab, - 0x59, 0x2e, 0x40, 0x02, 0x84, 0x75, 0x3c, 0xfb, 0x77, 0x2c, 0xb8, 0x74, 0x73, 0x69, 0x39, 0x59, - 0x8a, 0x1d, 0x5e, 0x48, 0xf4, 0x16, 0xd8, 0xd4, 0xba, 0x92, 0xdc, 0x02, 0xab, 0xac, 0x17, 0x02, - 0xfa, 0x71, 0xf1, 0xb0, 0xfb, 0x79, 0x0b, 0xce, 0xdd, 0x74, 0x63, 0x7a, 0x2c, 0xa7, 0xfd, 0x61, - 0xe8, 0xb9, 0x1c, 0xb9, 0x71, 0x10, 0x1e, 0xa4, 0xfd, 0x61, 0xb0, 0x82, 0x60, 0x0d, 0x8b, 0xb7, - 0xbc, 0xef, 0x46, 0xb4, 0xa7, 0x05, 0x53, 0x15, 0x85, 0x45, 0x39, 0x56, 0x18, 0xf4, 0xc3, 0x9a, - 0x6e, 0xc8, 0xae, 0x12, 0x07, 0x82, 0xc3, 0xaa, 0x0f, 0xab, 0x4a, 0x00, 0x4e, 0x70, 0xec, 0x9f, - 0xb6, 0xe0, 0xfc, 0x4d, 0xaf, 0x1d, 0xc5, 0x24, 0xdc, 0x8a, 0x8c, 0xce, 0xbe, 0x0a, 0x65, 0x22, - 0xaf, 0xeb, 0xa2, 0xaf, 0x4a, 0xc0, 0x54, 0xf7, 0x78, 0xee, 0x8c, 0xa3, 0xf0, 0xfa, 0xb0, 0xd6, - 0x3e, 0x99, 0x95, 0xf1, 0x2f, 0x15, 0x60, 0xec, 0xd6, 0xc6, 0x46, 0xed, 0x26, 0x89, 0xc5, 0x29, - 0xd6, 0x5b, 0xd5, 0x8c, 0x35, 0x8d, 0x59, 0xb7, 0x4b, 0x51, 0x3b, 0x76, 0xbd, 0x39, 0xee, 0xfd, - 0x39, 0xb7, 0xea, 0xc7, 0x77, 0xc3, 0x7a, 0x1c, 0xba, 0xfe, 0x76, 0xa6, 0x8e, 0x4d, 0x9e, 0xb5, - 0xc5, 0xbc, 0xb3, 0x16, 0xbd, 0x0a, 0x83, 0xcc, 0xfd, 0x54, 0x5e, 0x4f, 0x9e, 0x56, 0x77, 0x0a, - 0x56, 0x7a, 0x7c, 0x58, 0x29, 0xdf, 0xc3, 0xab, 0xfc, 0x0f, 0x16, 0xa8, 0xe8, 0x1e, 0x8c, 0xec, - 0xc4, 0x71, 0xeb, 0x16, 0x71, 0x9a, 0x24, 0x94, 0xdc, 0xe1, 0x72, 0x16, 0x77, 0xa0, 0x83, 0xc0, - 0xd1, 0x92, 0x0d, 0x95, 0x94, 0x45, 0x58, 0xa7, 0x63, 0xd7, 0x01, 0x12, 0xd8, 0x29, 0xe9, 0x17, - 0xec, 0x3f, 0xb2, 0x60, 0x88, 0x7b, 0x02, 0x85, 0xe8, 0x73, 0x50, 0x22, 0x8f, 0x48, 0x43, 0x48, - 0x8e, 0x99, 0x1d, 0x4e, 0x04, 0x0f, 0xae, 0x2d, 0xa7, 0xff, 0x31, 0xab, 0x85, 0x6e, 0xc1, 0x10, - 0xed, 0xed, 0x4d, 0xe5, 0x16, 0xf5, 0x6c, 0xde, 0x17, 0xab, 0x69, 0xe7, 0xb2, 0x8a, 0x28, 0xc2, - 0xb2, 0x3a, 0xd3, 0xfc, 0x36, 0x5a, 0x75, 0xca, 0xc0, 0xe2, 0x6e, 0xe7, 0xec, 0xc6, 0x52, 0x8d, - 0x23, 0x09, 0x6a, 0x5c, 0xf3, 0x2b, 0x0b, 0x71, 0x42, 0xc4, 0xde, 0x80, 0x32, 0x9d, 0xd4, 0x05, - 0xcf, 0x75, 0xba, 0x2b, 0x9d, 0x5f, 0x84, 0xb2, 0x54, 0x00, 0x47, 0xc2, 0x99, 0x84, 0x51, 0x95, - 0xfa, 0xe1, 0x08, 0x27, 0x70, 0x7b, 0x0b, 0xa6, 0xd9, 0xcb, 0xbf, 0x13, 0xef, 0x18, 0x7b, 0xac, - 0xf7, 0x62, 0x7e, 0x49, 0x5c, 0xc4, 0xf8, 0xcc, 0xcc, 0x68, 0xd6, 0xef, 0xa3, 0x92, 0x62, 0x72, - 0x29, 0xb3, 0xff, 0xa4, 0x04, 0x4f, 0xaf, 0xd6, 0xf3, 0x9d, 0xc4, 0x6e, 0xc0, 0x28, 0x17, 0xd3, - 0xe8, 0xd2, 0x76, 0x3c, 0xd1, 0xae, 0x7a, 0x17, 0xdb, 0xd0, 0x60, 0xd8, 0xc0, 0x44, 0x97, 0xa0, - 0xe8, 0xbe, 0xef, 0xa7, 0x0d, 0x49, 0x57, 0xdf, 0x59, 0xc7, 0xb4, 0x9c, 0x82, 0xa9, 0xc4, 0xc7, - 0x59, 0xa9, 0x02, 0x2b, 0xa9, 0xef, 0x2d, 0x18, 0x77, 0xa3, 0x46, 0xe4, 0xae, 0xfa, 0x94, 0xcf, - 0x24, 0x0e, 0x86, 0x89, 0x92, 0x80, 0x76, 0x5a, 0x41, 0x71, 0x0a, 0x5b, 0xe3, 0xeb, 0x03, 0x7d, - 0x4b, 0x8d, 0x3d, 0xbd, 0x2b, 0xa8, 0x40, 0xdc, 0x62, 0x5f, 0x17, 0x31, 0xa3, 0x36, 0x21, 0x10, - 0xf3, 0x0f, 0x8e, 0xb0, 0x84, 0xd1, 0x1b, 0x58, 0x63, 0xc7, 0x69, 0x2d, 0xb4, 0xe3, 0x9d, 0xaa, - 0x1b, 0x35, 0x82, 0x7d, 0x12, 0x1e, 0xb0, 0xcb, 0xf3, 0x70, 0x72, 0x03, 0x53, 0x80, 0xa5, 0x5b, - 0x0b, 0x35, 0x8a, 0x89, 0x3b, 0xeb, 0x98, 0x52, 0x21, 0x9c, 0x86, 0x54, 0xb8, 0x00, 0x13, 0xb2, - 0x99, 0x3a, 0x89, 0xd8, 0x19, 0x31, 0xc2, 0x3a, 0xa6, 0x5c, 0x7f, 0x45, 0xb1, 0xea, 0x56, 0x1a, - 0x1f, 0xbd, 0x01, 0x63, 0xae, 0xef, 0xc6, 0xae, 0x13, 0x07, 0x21, 0x3b, 0x61, 0xf9, 0x3d, 0x99, - 0x59, 0xb2, 0xad, 0xea, 0x00, 0x6c, 0xe2, 0xd9, 0x7f, 0x5c, 0x82, 0x29, 0x36, 0x6d, 0xdf, 0x5a, - 0x61, 0x1f, 0x9b, 0x15, 0x76, 0xaf, 0x73, 0x85, 0x9d, 0x86, 0xb8, 0xfb, 0x51, 0x2e, 0xb3, 0xf7, - 0xa0, 0xac, 0x6c, 0x81, 0xa5, 0x39, 0xbb, 0x95, 0x63, 0xce, 0xde, 0x5b, 0xfa, 0x90, 0xcf, 0xb8, - 0xc5, 0xcc, 0x67, 0xdc, 0xbf, 0x67, 0x41, 0x62, 0x12, 0x89, 0x6e, 0x41, 0xb9, 0x15, 0x30, 0xb3, - 0x83, 0x50, 0xda, 0xf2, 0x3c, 0x9d, 0x79, 0x50, 0xf1, 0x43, 0x91, 0x8f, 0x5f, 0x4d, 0xd6, 0xc0, - 0x49, 0x65, 0xb4, 0x08, 0x43, 0xad, 0x90, 0xd4, 0x63, 0xe6, 0x76, 0xd8, 0x93, 0x0e, 0x5f, 0x23, - 0x1c, 0x1f, 0xcb, 0x8a, 0xf6, 0x2f, 0x5b, 0x00, 0xfc, 0xa5, 0xd4, 0xf1, 0xb7, 0xc9, 0x19, 0x68, - 0x7f, 0xab, 0x50, 0x8a, 0x5a, 0xa4, 0xd1, 0xcd, 0x20, 0x24, 0xe9, 0x4f, 0xbd, 0x45, 0x1a, 0xc9, - 0x80, 0xd3, 0x7f, 0x98, 0xd5, 0xb6, 0x7f, 0x10, 0x60, 0x3c, 0x41, 0x5b, 0x8d, 0xc9, 0x1e, 0x7a, - 0xd9, 0x70, 0xea, 0xba, 0x98, 0x72, 0xea, 0x2a, 0x33, 0x6c, 0x4d, 0xd1, 0xf8, 0x1e, 0x14, 0xf7, - 0x9c, 0x47, 0x42, 0x93, 0xf4, 0x62, 0xf7, 0x6e, 0x50, 0xfa, 0x73, 0x6b, 0xce, 0x23, 0x7e, 0x67, - 0x7a, 0x51, 0x2e, 0x90, 0x35, 0xe7, 0xd1, 0x31, 0x37, 0xfb, 0x60, 0x4c, 0xea, 0x8e, 0x1b, 0xc5, - 0x5f, 0xfd, 0xaf, 0xc9, 0x7f, 0xb6, 0xec, 0x68, 0x23, 0xac, 0x2d, 0xd7, 0x17, 0xef, 0x86, 0x7d, - 0xb5, 0xe5, 0xfa, 0xe9, 0xb6, 0x5c, 0xbf, 0x8f, 0xb6, 0x5c, 0x1f, 0x7d, 0x00, 0x43, 0xe2, 0x8d, - 0x9e, 0xd9, 0x7a, 0x9b, 0x5a, 0xaa, 0xbc, 0xf6, 0xc4, 0x13, 0x3f, 0x6f, 0x73, 0x5e, 0xde, 0x09, - 0x45, 0x69, 0xcf, 0x76, 0x65, 0x83, 0xe8, 0xef, 0x58, 0x30, 0x2e, 0x7e, 0x63, 0xf2, 0x7e, 0x9b, - 0x44, 0xb1, 0x90, 0x3d, 0x3f, 0xd3, 0x7f, 0x1f, 0x44, 0x45, 0xde, 0x95, 0xcf, 0x48, 0x36, 0x6b, - 0x02, 0x7b, 0xf6, 0x28, 0xd5, 0x0b, 0xf4, 0xcf, 0x2c, 0x98, 0xde, 0x73, 0x1e, 0xf1, 0x16, 0x79, - 0x19, 0x76, 0x62, 0x37, 0x10, 0xb6, 0xeb, 0x9f, 0xeb, 0x6f, 0xfa, 0x3b, 0xaa, 0xf3, 0x4e, 0x4a, - 0x33, 0xd7, 0xe9, 0x2c, 0x94, 0x9e, 0x5d, 0xcd, 0xec, 0xd7, 0xec, 0x16, 0x0c, 0xcb, 0xf5, 0x96, - 0x71, 0xf3, 0xae, 0xea, 0x82, 0xf5, 0x89, 0x4d, 0x24, 0x74, 0xcf, 0x2a, 0xda, 0x8e, 0x58, 0x6b, - 0x4f, 0xb4, 0x9d, 0xf7, 0x60, 0x54, 0x5f, 0x63, 0x4f, 0xb4, 0xad, 0xf7, 0xe1, 0x5c, 0xc6, 0x5a, - 0x7a, 0xa2, 0x4d, 0x3e, 0x84, 0x8b, 0xb9, 0xeb, 0xe3, 0x49, 0x36, 0x6c, 0xff, 0x92, 0xa5, 0xf3, - 0xc1, 0x33, 0x50, 0xc1, 0x2f, 0x99, 0x2a, 0xf8, 0xcb, 0xdd, 0x77, 0x4e, 0x8e, 0x1e, 0xfe, 0x5d, - 0xbd, 0xd3, 0x94, 0xab, 0xa3, 0xb7, 0x61, 0xd0, 0xa3, 0x25, 0xd2, 0x38, 0xc4, 0xee, 0xbd, 0x23, - 0x13, 0x59, 0x8a, 0x95, 0x47, 0x58, 0x50, 0xb0, 0x7f, 0xcd, 0x82, 0xd2, 0x19, 0x8c, 0x04, 0x36, - 0x47, 0xe2, 0xe5, 0x5c, 0xd2, 0x22, 0x8c, 0xd4, 0x1c, 0x76, 0x1e, 0x2e, 0xcb, 0x50, 0x59, 0x39, - 0x03, 0xf3, 0x3d, 0x70, 0xee, 0x4e, 0xe0, 0x34, 0x17, 0x1d, 0xcf, 0xf1, 0x1b, 0x24, 0x5c, 0xf5, - 0xb7, 0x7b, 0x5a, 0x29, 0xe9, 0x36, 0x45, 0x85, 0x5e, 0x36, 0x45, 0xf6, 0x0e, 0x20, 0xbd, 0x01, - 0x61, 0xc7, 0x89, 0x61, 0xc8, 0xe5, 0x4d, 0x89, 0xe1, 0x7f, 0x3e, 0x5b, 0xba, 0xeb, 0xe8, 0x99, - 0x66, 0xa1, 0xc8, 0x0b, 0xb0, 0x24, 0x64, 0xdf, 0x80, 0x4c, 0xdf, 0xad, 0xde, 0x6a, 0x03, 0xfb, - 0x75, 0x98, 0x62, 0x35, 0x4f, 0x76, 0xa5, 0xb5, 0x7f, 0xd8, 0x82, 0x89, 0xf5, 0x54, 0x3c, 0x80, - 0xab, 0xec, 0xad, 0x2f, 0x43, 0xef, 0x5b, 0x67, 0xa5, 0x58, 0x40, 0x4f, 0x5d, 0xbf, 0xf4, 0x17, - 0x16, 0x94, 0x55, 0x24, 0x9b, 0x33, 0x10, 0xaa, 0x96, 0x0c, 0xa1, 0x2a, 0x53, 0xef, 0xa1, 0xba, - 0x93, 0x27, 0x53, 0xa1, 0xdb, 0xca, 0xb3, 0xbd, 0x8b, 0xca, 0x23, 0x21, 0xc3, 0xfd, 0xa0, 0xc7, - 0x4d, 0xf7, 0x77, 0xe9, 0xeb, 0xce, 0xcc, 0x84, 0x14, 0xee, 0xc7, 0xc4, 0x4c, 0x48, 0xf5, 0x27, - 0x67, 0xf7, 0xd5, 0xb4, 0x2e, 0x33, 0xae, 0xf4, 0x1d, 0xcc, 0xec, 0xdb, 0xf1, 0xdc, 0x0f, 0x88, - 0x0a, 0x28, 0x51, 0x11, 0x66, 0xdc, 0xa2, 0xf4, 0xf8, 0xb0, 0x32, 0xa6, 0xfe, 0xf1, 0xa8, 0x43, - 0x49, 0x15, 0xfb, 0x16, 0x4c, 0xa4, 0x06, 0x0c, 0xbd, 0x0e, 0x03, 0xad, 0x1d, 0x27, 0x22, 0x29, - 0xd3, 0xc8, 0x81, 0x1a, 0x2d, 0x3c, 0x3e, 0xac, 0x8c, 0xab, 0x0a, 0xac, 0x04, 0x73, 0x6c, 0xfb, - 0x7f, 0x59, 0x50, 0x5a, 0x0f, 0x9a, 0x67, 0xb1, 0x98, 0xde, 0x32, 0x16, 0xd3, 0x33, 0x79, 0x31, - 0xdb, 0x72, 0xd7, 0xd1, 0x4a, 0x6a, 0x1d, 0x5d, 0xce, 0xa5, 0xd0, 0x7d, 0x09, 0xed, 0xc1, 0x08, - 0x8b, 0x04, 0x27, 0x4c, 0x35, 0x5f, 0x35, 0xe4, 0xfb, 0x4a, 0x4a, 0xbe, 0x9f, 0xd0, 0x50, 0x35, - 0x29, 0xff, 0x05, 0x18, 0x12, 0xe6, 0x82, 0x69, 0x03, 0x77, 0x81, 0x8b, 0x25, 0xdc, 0xfe, 0x99, - 0x22, 0x18, 0x91, 0xe7, 0xd0, 0x6f, 0x58, 0x30, 0x17, 0x72, 0x8f, 0xc1, 0x66, 0xb5, 0x1d, 0xba, - 0xfe, 0x76, 0xbd, 0xb1, 0x43, 0x9a, 0x6d, 0xcf, 0xf5, 0xb7, 0x57, 0xb7, 0xfd, 0x40, 0x15, 0x2f, - 0x3f, 0x22, 0x8d, 0x36, 0xd3, 0xf9, 0xf7, 0x08, 0x73, 0xa7, 0xcc, 0x71, 0xae, 0x1f, 0x1d, 0x56, - 0xe6, 0xf0, 0x89, 0x68, 0xe3, 0x13, 0xf6, 0x05, 0xfd, 0x8e, 0x05, 0xf3, 0x3c, 0x20, 0x5b, 0xff, - 0xfd, 0xef, 0x72, 0x1b, 0xaa, 0x49, 0x52, 0x09, 0x91, 0x0d, 0x12, 0xee, 0x2d, 0xbe, 0x21, 0x06, - 0x74, 0xbe, 0x76, 0xb2, 0xb6, 0xf0, 0x49, 0x3b, 0x67, 0xff, 0xdb, 0x22, 0x8c, 0xd1, 0x51, 0x4c, - 0xe2, 0x78, 0xbc, 0x6e, 0x2c, 0x89, 0x67, 0x53, 0x4b, 0x62, 0xca, 0x40, 0x3e, 0x9d, 0x10, 0x1e, - 0x11, 0x4c, 0x79, 0x4e, 0x14, 0xdf, 0x22, 0x4e, 0x18, 0x6f, 0x12, 0x87, 0x9b, 0xa9, 0x14, 0x4f, - 0x6c, 0x52, 0xa3, 0xd4, 0x2f, 0x77, 0xd2, 0xc4, 0x70, 0x27, 0x7d, 0xb4, 0x0f, 0x88, 0xd9, 0xda, - 0x84, 0x8e, 0x1f, 0xf1, 0x6f, 0x71, 0xc5, 0x7b, 0xc0, 0xc9, 0x5a, 0x9d, 0x15, 0xad, 0xa2, 0x3b, - 0x1d, 0xd4, 0x70, 0x46, 0x0b, 0x9a, 0x0d, 0xd5, 0x40, 0xbf, 0x36, 0x54, 0x83, 0x3d, 0xbc, 0x48, - 0xf6, 0x60, 0x52, 0xcc, 0xca, 0x96, 0xbb, 0x2d, 0x0e, 0xe9, 0x2f, 0xa6, 0x6c, 0x2c, 0xad, 0xfe, - 0x0d, 0x65, 0x7a, 0x18, 0x58, 0xda, 0xdf, 0x0b, 0xe7, 0x68, 0x73, 0xa6, 0xcf, 0x43, 0x84, 0x08, - 0x4c, 0xec, 0xb6, 0x37, 0x89, 0x47, 0x62, 0x59, 0x26, 0x1a, 0xcd, 0x14, 0x3b, 0xcd, 0xda, 0x89, - 0x72, 0xea, 0xb6, 0x49, 0x02, 0xa7, 0x69, 0xda, 0x3f, 0x67, 0x01, 0xb3, 0xd6, 0x3e, 0x83, 0xe3, - 0xef, 0xf3, 0xe6, 0xf1, 0x37, 0x93, 0xc7, 0x81, 0x72, 0x4e, 0xbe, 0xd7, 0xf8, 0xb4, 0xd4, 0xc2, - 0xe0, 0xd1, 0x81, 0x78, 0xf5, 0xed, 0x43, 0xe2, 0xfa, 0xbf, 0x16, 0xdf, 0x90, 0xca, 0x81, 0x1a, - 0x7d, 0x1f, 0x0c, 0x37, 0x9c, 0x96, 0xd3, 0xe0, 0x21, 0x3f, 0x73, 0xb5, 0x0f, 0x46, 0xa5, 0xb9, - 0x25, 0x51, 0x83, 0xdf, 0xa6, 0xbf, 0x4d, 0x7e, 0xa5, 0x2c, 0xee, 0x79, 0x83, 0x56, 0x4d, 0xce, - 0xee, 0xc2, 0x98, 0x41, 0xec, 0x89, 0x5e, 0xbd, 0xbe, 0x8f, 0x1f, 0x17, 0x2a, 0x1e, 0xc7, 0x1e, - 0x4c, 0xf9, 0xda, 0x7f, 0xca, 0x1c, 0xa5, 0x38, 0xfd, 0xc9, 0x5e, 0x07, 0x02, 0xe3, 0xa4, 0x9a, - 0x35, 0x7a, 0x8a, 0x0c, 0xee, 0xa4, 0x6c, 0xff, 0x03, 0x0b, 0x9e, 0xd2, 0x11, 0x35, 0xdf, 0xf6, - 0x5e, 0xfa, 0xcc, 0x2a, 0x0c, 0x07, 0x2d, 0x12, 0x3a, 0x71, 0x10, 0x0a, 0x0e, 0x78, 0x4d, 0x0e, - 0xfa, 0x5d, 0x51, 0x7e, 0x2c, 0x62, 0xaf, 0x49, 0xea, 0xb2, 0x1c, 0xab, 0x9a, 0xc8, 0x86, 0x41, - 0x36, 0x18, 0x91, 0x88, 0x3b, 0xc0, 0xcc, 0xe4, 0xd8, 0xd3, 0x5e, 0x84, 0x05, 0xc4, 0xfe, 0x41, - 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, 0xe8, 0x7d, 0x98, 0xdc, 0x73, 0xe2, 0xc6, 0xce, 0xf2, 0xa3, 0x56, - 0xc8, 0xd5, 0xb8, 0x72, 0x9c, 0x5e, 0xec, 0x35, 0x4e, 0xda, 0x47, 0x26, 0xc6, 0x54, 0x6b, 0x29, - 0x62, 0xb8, 0x83, 0xbc, 0xfd, 0xd5, 0x22, 0xdf, 0x89, 0x4c, 0xaa, 0x7b, 0x01, 0x86, 0x5a, 0x41, - 0x73, 0x69, 0xb5, 0x8a, 0xc5, 0x08, 0x29, 0x76, 0x55, 0xe3, 0xc5, 0x58, 0xc2, 0xd1, 0x9b, 0x00, - 0xe4, 0x51, 0x4c, 0x42, 0xdf, 0xf1, 0x94, 0xe1, 0x81, 0x32, 0xb5, 0xab, 0x06, 0xeb, 0x41, 0x7c, - 0x2f, 0x22, 0xdf, 0xb3, 0xac, 0x50, 0xb0, 0x86, 0x8e, 0xae, 0x03, 0xb4, 0xc2, 0x60, 0xdf, 0x6d, - 0x32, 0x17, 0xad, 0xa2, 0xf9, 0x2c, 0x5f, 0x53, 0x10, 0xac, 0x61, 0xa1, 0x37, 0x61, 0xac, 0xed, - 0x47, 0xfc, 0x24, 0x74, 0x36, 0x45, 0x54, 0xb1, 0xe1, 0xe4, 0x85, 0xfc, 0x9e, 0x0e, 0xc4, 0x26, - 0x2e, 0x5a, 0x80, 0xc1, 0xd8, 0x61, 0xef, 0xea, 0x03, 0xf9, 0xf6, 0x71, 0x1b, 0x14, 0x43, 0x0f, - 0x06, 0x49, 0x2b, 0x60, 0x51, 0x11, 0x7d, 0x49, 0xf2, 0x62, 0xce, 0x9b, 0x85, 0x61, 0x6a, 0xee, - 0xfa, 0xd5, 0xf9, 0xb8, 0xce, 0x8c, 0x85, 0xc1, 0xab, 0x41, 0xcb, 0xfe, 0x81, 0x32, 0x40, 0x22, - 0xf6, 0xa1, 0x0f, 0x3a, 0x78, 0xc5, 0x4b, 0xdd, 0x05, 0xc5, 0xd3, 0x63, 0x14, 0xe8, 0x87, 0x2c, - 0x18, 0x71, 0x3c, 0x2f, 0x68, 0x38, 0x31, 0x1b, 0xe5, 0x42, 0x77, 0x5e, 0x25, 0xda, 0x5f, 0x48, - 0x6a, 0xf0, 0x2e, 0xbc, 0x2a, 0x9f, 0xcc, 0x35, 0x48, 0xcf, 0x5e, 0xe8, 0x0d, 0xa3, 0x6f, 0x93, - 0xb7, 0x01, 0xbe, 0x3c, 0x66, 0xd3, 0xb7, 0x81, 0x32, 0x63, 0xcb, 0xda, 0x45, 0x00, 0xdd, 0x33, - 0xc2, 0x6f, 0x95, 0xf2, 0xfd, 0xf8, 0x0d, 0xe9, 0xa7, 0x57, 0xe4, 0x2d, 0x54, 0xd3, 0x1d, 0x74, - 0x06, 0xf2, 0x83, 0x5d, 0x68, 0x62, 0x76, 0x0f, 0xe7, 0x9c, 0xf7, 0x60, 0xa2, 0x69, 0x9e, 0xbb, - 0x62, 0x35, 0x3d, 0x9f, 0x47, 0x37, 0x75, 0x4c, 0x27, 0x27, 0x6d, 0x0a, 0x80, 0xd3, 0x84, 0x51, - 0x8d, 0xbb, 0x4a, 0xad, 0xfa, 0x5b, 0x81, 0x30, 0x70, 0xb6, 0x73, 0xe7, 0xf2, 0x20, 0x8a, 0xc9, - 0x1e, 0xc5, 0x4c, 0x0e, 0xd4, 0x75, 0x51, 0x17, 0x2b, 0x2a, 0xe8, 0x6d, 0x18, 0x64, 0xbe, 0x96, - 0xd1, 0xcc, 0x70, 0xbe, 0x42, 0xca, 0x0c, 0x13, 0x90, 0x6c, 0x2a, 0xf6, 0x37, 0xc2, 0x82, 0x02, - 0xba, 0x25, 0x63, 0x89, 0x44, 0xab, 0xfe, 0xbd, 0x88, 0xb0, 0x58, 0x22, 0xe5, 0xc5, 0x4f, 0x26, - 0x61, 0x42, 0x78, 0x79, 0x66, 0xd8, 0x67, 0xa3, 0x26, 0x15, 0x5c, 0xc4, 0x7f, 0x19, 0x4d, 0x7a, - 0x06, 0xf2, 0xbb, 0x67, 0x46, 0x9c, 0x4e, 0x86, 0xf3, 0xbe, 0x49, 0x02, 0xa7, 0x69, 0x9e, 0xe9, - 0x39, 0x3a, 0xeb, 0xc3, 0x64, 0x7a, 0x63, 0x3d, 0xd1, 0x73, 0xfb, 0x8f, 0x4a, 0x30, 0x6e, 0x2e, - 0x04, 0x34, 0x0f, 0x65, 0x41, 0x44, 0x45, 0x3e, 0x54, 0x6b, 0x7b, 0x4d, 0x02, 0x70, 0x82, 0xc3, - 0x22, 0x3f, 0xb2, 0xea, 0x9a, 0x41, 0x5a, 0x12, 0xf9, 0x51, 0x41, 0xb0, 0x86, 0x45, 0xa5, 0xe9, - 0xcd, 0x20, 0x88, 0xd5, 0x51, 0xa0, 0x56, 0xcb, 0x22, 0x2b, 0xc5, 0x02, 0x4a, 0x8f, 0x80, 0x5d, - 0x12, 0xfa, 0xc4, 0xbb, 0x4f, 0x42, 0xf6, 0x26, 0x5a, 0x32, 0x8d, 0xa4, 0x6e, 0xeb, 0x40, 0x6c, - 0xe2, 0xd2, 0xb3, 0x2d, 0x88, 0xd8, 0xf2, 0x13, 0x32, 0x7b, 0x62, 0xe0, 0x57, 0xe7, 0xbe, 0xc6, - 0x12, 0x8e, 0xbe, 0x08, 0x4f, 0x29, 0xd7, 0x60, 0xcc, 0x55, 0x94, 0xb2, 0xc5, 0x41, 0xe3, 0x8a, - 0xfd, 0xd4, 0x52, 0x36, 0x1a, 0xce, 0xab, 0x8f, 0xde, 0x82, 0x71, 0x21, 0x0b, 0x4b, 0x8a, 0x43, - 0xe6, 0xab, 0xf9, 0x6d, 0x03, 0x8a, 0x53, 0xd8, 0xa8, 0x0a, 0x93, 0xb4, 0x84, 0x89, 0xa3, 0x92, - 0x02, 0x77, 0x71, 0x56, 0x87, 0xfe, 0xed, 0x14, 0x1c, 0x77, 0xd4, 0x40, 0x0b, 0x30, 0xc1, 0x85, - 0x15, 0x7a, 0xb9, 0x64, 0xf3, 0x20, 0xfc, 0x0e, 0xd4, 0x46, 0xb8, 0x6b, 0x82, 0x71, 0x1a, 0x1f, - 0xdd, 0x80, 0x51, 0x27, 0x6c, 0xec, 0xb8, 0x31, 0x69, 0xc4, 0xed, 0x90, 0x3b, 0x24, 0x68, 0x66, - 0x07, 0x0b, 0x1a, 0x0c, 0x1b, 0x98, 0xf6, 0x07, 0x70, 0x2e, 0xc3, 0x65, 0x89, 0x2e, 0x1c, 0xa7, - 0xe5, 0xca, 0x6f, 0x4a, 0x99, 0xea, 0x2d, 0xd4, 0x56, 0xe5, 0xd7, 0x68, 0x58, 0x74, 0x75, 0x32, - 0xd7, 0x26, 0x2d, 0xe4, 0xbb, 0x5a, 0x9d, 0x2b, 0x12, 0x80, 0x13, 0x1c, 0xfb, 0x7f, 0x17, 0x60, - 0x22, 0x43, 0xed, 0xca, 0xc2, 0x8e, 0xa7, 0xa4, 0xf9, 0x24, 0xca, 0x38, 0x6d, 0xc6, 0x57, 0x81, - 0xba, 0x53, 0xcd, 0x24, 0x61, 0xba, 0x13, 0x1c, 0xa5, 0xc9, 0x2d, 0xe6, 0x1a, 0x80, 0x2d, 0x42, - 0xb1, 0xed, 0x36, 0xc5, 0x02, 0x96, 0xe7, 0x75, 0xf1, 0xde, 0x6a, 0xf5, 0xf8, 0xb0, 0xf2, 0x6c, - 0x5e, 0xf6, 0x04, 0x7a, 0x45, 0x8f, 0xe6, 0xe8, 0xee, 0xa1, 0x95, 0x53, 0x23, 0x36, 0xd0, 0xd7, - 0x88, 0x2d, 0xc0, 0x84, 0x64, 0x01, 0xe6, 0x92, 0x56, 0x33, 0x8f, 0x4d, 0x30, 0x4e, 0xe3, 0x9b, - 0x83, 0x3e, 0xd4, 0xc7, 0xa0, 0xff, 0x78, 0x01, 0x26, 0xd3, 0xe6, 0x51, 0x67, 0xa0, 0xac, 0x7b, - 0xdb, 0x50, 0xd6, 0x65, 0x07, 0xf1, 0x4f, 0x1b, 0x6d, 0xe5, 0x29, 0xee, 0x70, 0x4a, 0x71, 0xf7, - 0xe9, 0xbe, 0xa8, 0x75, 0x57, 0xe2, 0xfd, 0xc3, 0x02, 0x9c, 0x4f, 0x57, 0x59, 0xf2, 0x1c, 0x77, - 0xef, 0x0c, 0xc6, 0xe6, 0xae, 0x31, 0x36, 0x2f, 0xf7, 0xf3, 0x35, 0xac, 0x6b, 0xb9, 0x03, 0xf4, - 0x20, 0x35, 0x40, 0xf3, 0xfd, 0x93, 0xec, 0x3e, 0x4a, 0xdf, 0x2c, 0xc2, 0xe5, 0xcc, 0x7a, 0x89, - 0xae, 0x6b, 0xc5, 0xd0, 0x75, 0x5d, 0x4f, 0xe9, 0xba, 0xec, 0xee, 0xb5, 0x4f, 0x47, 0xf9, 0x25, - 0x7c, 0xc9, 0x58, 0x68, 0xb0, 0xc7, 0x54, 0x7c, 0x19, 0xbe, 0x64, 0x8a, 0x10, 0x36, 0xe9, 0xfe, - 0x55, 0x52, 0x78, 0xfd, 0x07, 0x0b, 0x2e, 0x66, 0xce, 0xcd, 0x19, 0x28, 0x85, 0xd6, 0x4d, 0xa5, - 0xd0, 0x0b, 0x7d, 0xaf, 0xd6, 0x1c, 0x2d, 0xd1, 0x1f, 0x17, 0x73, 0xbe, 0x85, 0x5d, 0xab, 0xef, - 0xc2, 0x88, 0xd3, 0x68, 0x90, 0x28, 0x5a, 0x0b, 0x9a, 0x2a, 0x54, 0xd6, 0xcb, 0xec, 0x76, 0x94, - 0x14, 0x1f, 0x1f, 0x56, 0x66, 0xd3, 0x24, 0x12, 0x30, 0xd6, 0x29, 0x98, 0xd1, 0xfd, 0x0a, 0xa7, - 0x1a, 0xdd, 0xef, 0x3a, 0xc0, 0xbe, 0x92, 0xb1, 0xd3, 0x57, 0x73, 0x4d, 0xfa, 0xd6, 0xb0, 0xd0, - 0x77, 0xc3, 0x70, 0x24, 0x8e, 0x71, 0xb1, 0x14, 0x5f, 0xed, 0x73, 0xae, 0x9c, 0x4d, 0xe2, 0x99, - 0x4e, 0xcb, 0x4a, 0x9f, 0xa1, 0x48, 0xa2, 0xef, 0x84, 0xc9, 0x88, 0xc7, 0xc4, 0x58, 0xf2, 0x9c, - 0x88, 0x59, 0xc0, 0x8b, 0x55, 0xc8, 0x3c, 0x91, 0xeb, 0x29, 0x18, 0xee, 0xc0, 0x46, 0x2b, 0xf2, - 0xa3, 0x58, 0x00, 0x0f, 0xbe, 0x30, 0xaf, 0x26, 0x1f, 0x24, 0x92, 0x9e, 0x4c, 0xa7, 0x87, 0x9f, - 0x0d, 0xbc, 0x56, 0xd3, 0xfe, 0xf1, 0x12, 0x3c, 0xdd, 0x85, 0x89, 0xa1, 0x05, 0xf3, 0x05, 0xeb, - 0xc5, 0xf4, 0x9d, 0x75, 0x36, 0xb3, 0xb2, 0x71, 0x89, 0x4d, 0xad, 0x95, 0xc2, 0x87, 0x5e, 0x2b, - 0x3f, 0x62, 0x69, 0xda, 0x04, 0x6e, 0x67, 0xf5, 0xf9, 0x13, 0x32, 0xe7, 0x53, 0x54, 0x2f, 0x6c, - 0x65, 0xdc, 0xd1, 0xaf, 0xf7, 0xdd, 0x9d, 0xbe, 0x2f, 0xed, 0x67, 0xab, 0xef, 0xfc, 0xaa, 0x05, - 0xcf, 0x66, 0xf6, 0xd7, 0x78, 0x71, 0x9f, 0x87, 0x72, 0x83, 0x16, 0x6a, 0x5e, 0x35, 0x89, 0xbb, - 0xa1, 0x04, 0xe0, 0x04, 0xc7, 0x78, 0x58, 0x2f, 0xf4, 0x7c, 0x58, 0xff, 0x37, 0x16, 0x74, 0x2c, - 0xe0, 0x33, 0xe0, 0xa4, 0xab, 0x26, 0x27, 0xfd, 0x64, 0x3f, 0x73, 0x99, 0xc3, 0x44, 0x7f, 0x7f, - 0x02, 0x2e, 0xe4, 0x98, 0xd1, 0xef, 0xc3, 0xd4, 0x76, 0x83, 0x98, 0xfe, 0x4a, 0xe2, 0x63, 0x32, - 0x5d, 0xbb, 0xba, 0x3a, 0x37, 0xb1, 0x6c, 0x15, 0x53, 0x1d, 0x28, 0xb8, 0xb3, 0x09, 0xf4, 0x55, - 0x0b, 0xa6, 0x9d, 0x87, 0x51, 0x47, 0x4e, 0x32, 0xb1, 0x66, 0x5e, 0xcb, 0xd4, 0x2d, 0xf4, 0xc8, - 0x61, 0xc6, 0xd3, 0x77, 0x64, 0x61, 0xe1, 0xcc, 0xb6, 0x10, 0x16, 0xd1, 0x0d, 0xa9, 0xbc, 0xdd, - 0xc5, 0xa3, 0x2e, 0xcb, 0xdf, 0x81, 0xf3, 0x54, 0x09, 0xc1, 0x8a, 0x0e, 0xba, 0x0f, 0xe5, 0x6d, - 0xe9, 0x84, 0x24, 0x78, 0x76, 0xe6, 0x21, 0x98, 0xe9, 0xa9, 0xc4, 0x0d, 0x6f, 0x15, 0x08, 0x27, - 0xa4, 0xd0, 0x5b, 0x50, 0xf4, 0xb7, 0xa2, 0x6e, 0x79, 0x2f, 0x52, 0x86, 0x28, 0xdc, 0x5b, 0x75, - 0x7d, 0xa5, 0x8e, 0x69, 0x45, 0x74, 0x0b, 0x8a, 0xe1, 0x66, 0x53, 0xa8, 0xc3, 0x32, 0xe5, 0x52, - 0xbc, 0x58, 0xcd, 0x5e, 0x24, 0x9c, 0x12, 0x5e, 0xac, 0x62, 0x4a, 0x02, 0xd5, 0x60, 0x80, 0x59, - 0x9c, 0x0b, 0xad, 0x57, 0xa6, 0x40, 0xda, 0xc5, 0x73, 0x83, 0xbb, 0xb4, 0x32, 0x04, 0xcc, 0x09, - 0xa1, 0xb7, 0x61, 0xb0, 0xc1, 0x52, 0x43, 0x88, 0x80, 0xba, 0xd9, 0xb1, 0x4e, 0x3a, 0x92, 0x47, - 0x70, 0xf5, 0x3f, 0x2f, 0xc7, 0x82, 0x02, 0xda, 0x80, 0xc1, 0x06, 0x69, 0xed, 0x6c, 0x45, 0xec, - 0xe2, 0x6d, 0x0a, 0xf8, 0x09, 0xad, 0x2e, 0x99, 0x50, 0x04, 0x55, 0x86, 0x81, 0x05, 0x2d, 0xf4, - 0x59, 0x28, 0x6c, 0x35, 0x84, 0x19, 0x7a, 0xa6, 0xde, 0xcb, 0x74, 0x33, 0x5e, 0x1c, 0x3c, 0x3a, - 0xac, 0x14, 0x56, 0x96, 0x70, 0x61, 0xab, 0x81, 0xd6, 0x61, 0x68, 0x8b, 0x3b, 0x26, 0x0a, 0xef, - 0xff, 0xe7, 0xb3, 0x7d, 0x26, 0x3b, 0x7c, 0x17, 0xb9, 0xf9, 0xb4, 0x00, 0x60, 0x49, 0x84, 0x05, - 0x06, 0x54, 0x0e, 0x96, 0x22, 0x42, 0xee, 0xdc, 0xc9, 0x9c, 0x62, 0xb9, 0xcb, 0x73, 0xe2, 0xa6, - 0x89, 0x35, 0x8a, 0xe8, 0x2b, 0x50, 0x76, 0x64, 0x0e, 0x2c, 0x11, 0x41, 0xe0, 0xd5, 0xcc, 0xed, - 0xd8, 0x3d, 0x3d, 0x18, 0x5f, 0xcb, 0x0a, 0x09, 0x27, 0x44, 0xd1, 0x2e, 0x8c, 0xed, 0x47, 0xad, - 0x1d, 0x22, 0xb7, 0x2f, 0x0b, 0x28, 0x90, 0x73, 0x5c, 0xdd, 0x17, 0x88, 0x6e, 0x18, 0xb7, 0x1d, - 0xaf, 0x83, 0xe3, 0x30, 0xab, 0xfb, 0xfb, 0x3a, 0x31, 0x6c, 0xd2, 0xa6, 0xc3, 0xff, 0x7e, 0x3b, - 0xd8, 0x3c, 0x88, 0x89, 0x08, 0xa9, 0x9b, 0x39, 0xfc, 0xef, 0x70, 0x94, 0xce, 0xe1, 0x17, 0x00, - 0x2c, 0x89, 0xd0, 0x0d, 0xee, 0xc8, 0xfc, 0x72, 0x2c, 0x94, 0x6e, 0xce, 0x06, 0xcf, 0x4c, 0x42, - 0xa7, 0x0d, 0x0a, 0xe3, 0x8c, 0x09, 0x29, 0xc6, 0x11, 0x5b, 0x3b, 0x41, 0x1c, 0xf8, 0x29, 0x6e, - 0x3c, 0x95, 0xcf, 0x11, 0x6b, 0x19, 0xf8, 0x9d, 0x1c, 0x31, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0x9a, - 0x30, 0xde, 0x0a, 0xc2, 0xf8, 0x61, 0x10, 0xca, 0xf5, 0x85, 0xba, 0x5c, 0xf2, 0x0d, 0x4c, 0xd1, - 0x22, 0x0b, 0xf1, 0x6c, 0x42, 0x70, 0x8a, 0x26, 0xfa, 0x02, 0x0c, 0x45, 0x0d, 0xc7, 0x23, 0xab, - 0x77, 0x67, 0xce, 0xe5, 0x1f, 0x35, 0x75, 0x8e, 0x92, 0xb3, 0xba, 0xd8, 0xe4, 0x08, 0x14, 0x2c, - 0xc9, 0xa1, 0x15, 0x18, 0x60, 0x71, 0xda, 0x59, 0x34, 0xe0, 0x9c, 0x48, 0x35, 0x1d, 0x86, 0x7e, - 0x9c, 0x23, 0xb1, 0x62, 0xcc, 0xab, 0xd3, 0x3d, 0x20, 0x64, 0xdd, 0x20, 0x9a, 0x39, 0x9f, 0xbf, - 0x07, 0x84, 0x88, 0x7c, 0xb7, 0xde, 0x6d, 0x0f, 0x28, 0x24, 0x9c, 0x10, 0xa5, 0xfc, 0x98, 0xf2, - 0xd0, 0x0b, 0xf9, 0xfc, 0x38, 0x9f, 0x83, 0x32, 0x7e, 0x4c, 0xf9, 0x27, 0x25, 0x61, 0xff, 0xc1, - 0x50, 0xa7, 0x7c, 0xc2, 0x6e, 0x47, 0x3f, 0x60, 0x75, 0x3c, 0x77, 0x7d, 0xa6, 0x5f, 0x65, 0xcd, - 0x29, 0x4a, 0xa6, 0x5f, 0xb5, 0xe0, 0x42, 0x2b, 0xf3, 0x43, 0xc4, 0x61, 0xdf, 0x9f, 0xce, 0x87, - 0x7f, 0xba, 0x8a, 0xd8, 0x9d, 0x0d, 0xc7, 0x39, 0x2d, 0xa5, 0xa5, 0xff, 0xe2, 0x87, 0x96, 0xfe, - 0xd7, 0x60, 0x98, 0x09, 0x94, 0x49, 0x58, 0xa4, 0xbe, 0xac, 0x47, 0x98, 0xd8, 0xb0, 0x24, 0x2a, - 0x62, 0x45, 0x02, 0xfd, 0xa8, 0x05, 0x97, 0xd2, 0x5d, 0xc7, 0x84, 0x81, 0x45, 0x7c, 0x6b, 0x7e, - 0x31, 0x5b, 0x11, 0xdf, 0x7f, 0xa9, 0xd6, 0x0d, 0xf9, 0xb8, 0x17, 0x02, 0xee, 0xde, 0x18, 0xaa, - 0x66, 0xdc, 0x0c, 0x07, 0x4d, 0x6d, 0x78, 0x1f, 0xb7, 0xc3, 0xd7, 0x60, 0x74, 0x2f, 0x68, 0xfb, - 0xb1, 0x30, 0xef, 0x10, 0x8e, 0x63, 0xec, 0xcd, 0x76, 0x4d, 0x2b, 0xc7, 0x06, 0x56, 0xea, 0x4e, - 0x39, 0xfc, 0xb8, 0x77, 0x4a, 0xf4, 0x6e, 0x2a, 0x1f, 0x6c, 0x39, 0x5f, 0xb6, 0x10, 0xd7, 0xef, - 0x13, 0x64, 0x85, 0x3d, 0xdb, 0x7b, 0xd0, 0xd7, 0xad, 0x0c, 0x01, 0x9e, 0xdf, 0x8c, 0x3f, 0x67, - 0xde, 0x8c, 0xaf, 0xa6, 0x6f, 0xc6, 0x1d, 0x9a, 0x50, 0xe3, 0x52, 0xdc, 0x7f, 0x30, 0xde, 0x7e, - 0xa3, 0x5b, 0xd9, 0x1e, 0x5c, 0xe9, 0x75, 0x2c, 0x31, 0x3b, 0x9f, 0xa6, 0x7a, 0xf7, 0x4a, 0xec, - 0x7c, 0x9a, 0xab, 0x55, 0xcc, 0x20, 0xfd, 0x86, 0x3f, 0xb0, 0xff, 0x87, 0x05, 0xc5, 0x5a, 0xd0, - 0x3c, 0x03, 0xcd, 0xee, 0xe7, 0x0d, 0xcd, 0xee, 0xd3, 0x39, 0x79, 0x7a, 0x73, 0xf5, 0xb8, 0xcb, - 0x29, 0x3d, 0xee, 0xa5, 0x3c, 0x02, 0xdd, 0xb5, 0xb6, 0x3f, 0x5b, 0x04, 0x3d, 0xab, 0x30, 0xfa, - 0x77, 0x8f, 0x63, 0x30, 0x5a, 0xec, 0x96, 0x68, 0x58, 0x50, 0x66, 0xe6, 0x41, 0xd2, 0x17, 0xea, - 0x2f, 0x99, 0xdd, 0xe8, 0x03, 0xe2, 0x6e, 0xef, 0xc4, 0xa4, 0x99, 0xfe, 0x9c, 0xb3, 0xb3, 0x1b, - 0xfd, 0x6f, 0x16, 0x4c, 0xa4, 0x5a, 0x47, 0x1e, 0x8c, 0x79, 0xba, 0x5a, 0x4e, 0xac, 0xd3, 0xc7, - 0xd2, 0xe8, 0xf1, 0xec, 0x1c, 0x7a, 0x11, 0x36, 0x89, 0xa3, 0x39, 0x00, 0xf5, 0x6c, 0x26, 0xb5, - 0x5d, 0x4c, 0xea, 0x57, 0xef, 0x6a, 0x11, 0xd6, 0x30, 0xd0, 0xeb, 0x30, 0x12, 0x07, 0xad, 0xc0, - 0x0b, 0xb6, 0x0f, 0x6e, 0x13, 0x19, 0x70, 0x43, 0xc5, 0x67, 0xd8, 0x48, 0x40, 0x58, 0xc7, 0xb3, - 0x7f, 0xbe, 0x08, 0xe9, 0x4c, 0xd4, 0xdf, 0x5a, 0x93, 0x1f, 0xcf, 0x35, 0xf9, 0x4d, 0x0b, 0x26, - 0x69, 0xeb, 0xcc, 0xe2, 0x42, 0x1e, 0xb6, 0x2a, 0x29, 0x88, 0xd5, 0x25, 0x29, 0xc8, 0x55, 0xca, - 0xbb, 0x9a, 0x41, 0x3b, 0x16, 0xda, 0x32, 0x8d, 0x39, 0xd1, 0x52, 0x2c, 0xa0, 0x02, 0x8f, 0x84, - 0xa1, 0x70, 0x57, 0xd1, 0xf1, 0x48, 0x18, 0x62, 0x01, 0x95, 0x39, 0x43, 0x4a, 0x39, 0x39, 0x43, - 0x58, 0xf8, 0x30, 0xf1, 0xca, 0x2f, 0xc4, 0x1e, 0x2d, 0x7c, 0x98, 0x7c, 0xfe, 0x4f, 0x70, 0xec, - 0x5f, 0x2a, 0xc2, 0x68, 0x2d, 0x68, 0x26, 0x0f, 0x57, 0xaf, 0x19, 0x0f, 0x57, 0x57, 0x52, 0x0f, - 0x57, 0x93, 0x3a, 0xee, 0xb7, 0x9e, 0xa9, 0x3e, 0xaa, 0x67, 0xaa, 0x7f, 0x6d, 0xb1, 0x59, 0xab, - 0xae, 0xd7, 0x45, 0xd6, 0xcd, 0x57, 0x60, 0x84, 0x31, 0x24, 0xe6, 0x1f, 0x25, 0x5f, 0x73, 0x58, - 0x38, 0xf0, 0xf5, 0xa4, 0x18, 0xeb, 0x38, 0xe8, 0x1a, 0x0c, 0x47, 0xc4, 0x09, 0x1b, 0x3b, 0x8a, - 0xc7, 0x89, 0xb7, 0x0e, 0x5e, 0x86, 0x15, 0x14, 0xbd, 0x93, 0x44, 0xae, 0x2a, 0xe6, 0xe7, 0x8f, - 0xd4, 0xfb, 0xc3, 0xb7, 0x48, 0x7e, 0xb8, 0x2a, 0xfb, 0x01, 0xa0, 0x4e, 0xfc, 0x3e, 0x62, 0xd4, - 0x54, 0xcc, 0x18, 0x35, 0xe5, 0x8e, 0xf8, 0x34, 0x7f, 0x6e, 0xc1, 0x78, 0x2d, 0x68, 0xd2, 0xad, - 0xfb, 0x57, 0x69, 0x9f, 0xea, 0x61, 0xfb, 0x06, 0xbb, 0x84, 0xed, 0xfb, 0x47, 0x16, 0x0c, 0xd5, - 0x82, 0xe6, 0x19, 0xe8, 0xd8, 0x3f, 0x67, 0xea, 0xd8, 0x9f, 0xca, 0x59, 0x12, 0x39, 0x6a, 0xf5, - 0x5f, 0x29, 0xc2, 0x18, 0xed, 0x67, 0xb0, 0x2d, 0x67, 0xc9, 0x18, 0x11, 0xab, 0x8f, 0x11, 0xa1, - 0x62, 0x6e, 0xe0, 0x79, 0xc1, 0xc3, 0xf4, 0x8c, 0xad, 0xb0, 0x52, 0x2c, 0xa0, 0xe8, 0x25, 0x18, - 0x6e, 0x85, 0x64, 0xdf, 0x0d, 0x84, 0xfc, 0xa8, 0xbd, 0x58, 0xd4, 0x44, 0x39, 0x56, 0x18, 0xf4, - 0xde, 0x15, 0xb9, 0x7e, 0x83, 0xc8, 0xe4, 0xb5, 0x25, 0x96, 0x1d, 0x88, 0xc7, 0xe3, 0xd5, 0xca, - 0xb1, 0x81, 0x85, 0x1e, 0x40, 0x99, 0xfd, 0x67, 0x1c, 0xe5, 0xe4, 0xd9, 0x4c, 0x44, 0x10, 0x7c, - 0x41, 0x00, 0x27, 0xb4, 0xd0, 0x75, 0x80, 0x58, 0xc6, 0x6c, 0x8d, 0x44, 0xa8, 0x11, 0x25, 0x6b, - 0xab, 0x68, 0xae, 0x11, 0xd6, 0xb0, 0xd0, 0x8b, 0x50, 0x8e, 0x1d, 0xd7, 0xbb, 0xe3, 0xfa, 0x24, - 0x62, 0x8a, 0xe6, 0xa2, 0x8c, 0x71, 0x2f, 0x0a, 0x71, 0x02, 0xa7, 0xb2, 0x0e, 0xf3, 0xc3, 0xe5, - 0xb9, 0x90, 0x86, 0x19, 0x36, 0x93, 0x75, 0xee, 0xa8, 0x52, 0xac, 0x61, 0xd8, 0x37, 0xe0, 0x7c, - 0x2d, 0x68, 0xd6, 0x82, 0x30, 0x5e, 0x09, 0xc2, 0x87, 0x4e, 0xd8, 0x94, 0xf3, 0x57, 0x91, 0xe1, - 0xd6, 0x29, 0xef, 0x19, 0xe0, 0x3b, 0xd3, 0x08, 0xa4, 0xfe, 0x2a, 0x93, 0x76, 0x4e, 0xe8, 0xb3, - 0xf0, 0x7f, 0x0a, 0x8c, 0x51, 0xa4, 0x12, 0x74, 0xa1, 0x2f, 0xc3, 0x78, 0x44, 0xee, 0xb8, 0x7e, - 0xfb, 0x91, 0xbc, 0x1f, 0x77, 0x71, 0x08, 0xa9, 0x2f, 0xeb, 0x98, 0x5c, 0xcb, 0x66, 0x96, 0xe1, - 0x14, 0x35, 0x3a, 0x84, 0x61, 0xdb, 0x5f, 0x88, 0xee, 0x45, 0x24, 0x14, 0x09, 0xa2, 0xd8, 0x10, - 0x62, 0x59, 0x88, 0x13, 0x38, 0x5d, 0x32, 0xec, 0xcf, 0x7a, 0xe0, 0xe3, 0x20, 0x88, 0xe5, 0x22, - 0x63, 0x29, 0x46, 0xb4, 0x72, 0x6c, 0x60, 0xa1, 0x15, 0x40, 0x51, 0xbb, 0xd5, 0xf2, 0xd8, 0x03, - 0xb8, 0xe3, 0xdd, 0x0c, 0x83, 0x76, 0x8b, 0x3f, 0x3e, 0x16, 0x79, 0xea, 0xf6, 0x7a, 0x07, 0x14, - 0x67, 0xd4, 0xa0, 0x8c, 0x61, 0x2b, 0x62, 0xbf, 0xd9, 0xc2, 0x2b, 0x0a, 0xcd, 0x77, 0x9d, 0x15, - 0x61, 0x09, 0xa3, 0xf3, 0xcc, 0x9a, 0xe7, 0x98, 0x83, 0xc9, 0x3c, 0x63, 0x55, 0x8a, 0x35, 0x0c, - 0xfb, 0xfb, 0xd8, 0x01, 0xc3, 0xf2, 0x00, 0xc5, 0xed, 0x90, 0xa0, 0x3d, 0x18, 0x6b, 0xb1, 0xa3, - 0x5f, 0x44, 0xa9, 0x15, 0x03, 0xfe, 0x5a, 0x9f, 0x37, 0xc5, 0x87, 0x74, 0xf3, 0x2a, 0x4d, 0x0e, - 0x13, 0xc1, 0x6b, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0x7f, 0x76, 0x92, 0xf1, 0xb1, 0x3a, 0xbf, 0xfe, - 0x0d, 0x09, 0x8b, 0x57, 0x21, 0xeb, 0xce, 0xe6, 0xeb, 0x21, 0x92, 0x23, 0x47, 0x58, 0xcd, 0x62, - 0x59, 0x17, 0xbd, 0xc3, 0x5e, 0x79, 0x39, 0xf3, 0xe8, 0x95, 0x50, 0x94, 0x63, 0x19, 0x0f, 0xba, - 0xa2, 0x22, 0xd6, 0x88, 0xa0, 0x3b, 0x30, 0x26, 0xd2, 0xc6, 0x08, 0x45, 0x53, 0xd1, 0x50, 0x24, - 0x8c, 0x61, 0x1d, 0x78, 0x9c, 0x2e, 0xc0, 0x66, 0x65, 0xb4, 0x0d, 0x97, 0xb4, 0x1c, 0x6a, 0x37, - 0x43, 0x87, 0xbd, 0xfc, 0xb9, 0x6c, 0xf5, 0x6b, 0xbc, 0xe8, 0xd9, 0xa3, 0xc3, 0xca, 0xa5, 0x8d, - 0x6e, 0x88, 0xb8, 0x3b, 0x1d, 0x74, 0x17, 0xce, 0x3b, 0x8d, 0xd8, 0xdd, 0x27, 0x55, 0xe2, 0x34, - 0x3d, 0xd7, 0x57, 0xcc, 0x8e, 0x2f, 0xa0, 0x8b, 0x47, 0x87, 0x95, 0xf3, 0x0b, 0x59, 0x08, 0x38, - 0xbb, 0x1e, 0xfa, 0x1c, 0x94, 0x9b, 0x7e, 0x24, 0xc6, 0x60, 0xd0, 0x48, 0x0f, 0x58, 0xae, 0xae, - 0xd7, 0xd5, 0xf7, 0x27, 0x7f, 0x70, 0x52, 0x01, 0x6d, 0x73, 0x65, 0x93, 0xba, 0xdb, 0x0d, 0xe5, - 0x27, 0x33, 0x16, 0x4b, 0xc2, 0x70, 0x32, 0xe1, 0x5a, 0x56, 0x65, 0xe4, 0x69, 0xf8, 0x9f, 0x18, - 0x84, 0xd1, 0xdb, 0x80, 0xa8, 0xf0, 0xe3, 0x36, 0xc8, 0x42, 0x83, 0x05, 0x0b, 0x66, 0xba, 0xb9, - 0x61, 0xc3, 0x94, 0x1f, 0xd5, 0x3b, 0x30, 0x70, 0x46, 0x2d, 0x74, 0x8b, 0x72, 0x20, 0xbd, 0x54, - 0x18, 0xab, 0x4a, 0x81, 0x79, 0xa6, 0x4a, 0x5a, 0x21, 0x69, 0x38, 0x31, 0x69, 0x9a, 0x14, 0x71, - 0xaa, 0x1e, 0x3d, 0x9f, 0x54, 0xde, 0x10, 0x30, 0x23, 0x02, 0x74, 0xe6, 0x0e, 0xa1, 0x77, 0xcd, - 0x9d, 0x20, 0x8a, 0xd7, 0x49, 0xfc, 0x30, 0x08, 0x77, 0x45, 0x00, 0xa6, 0x24, 0x16, 0x60, 0x02, - 0xc2, 0x3a, 0x1e, 0x95, 0x2d, 0xd9, 0x33, 0xeb, 0x6a, 0x95, 0xbd, 0x7a, 0x0d, 0x27, 0xfb, 0xe4, - 0x16, 0x2f, 0xc6, 0x12, 0x2e, 0x51, 0x57, 0x6b, 0x4b, 0xec, 0x05, 0x2b, 0x85, 0xba, 0x5a, 0x5b, - 0xc2, 0x12, 0x8e, 0x48, 0x67, 0xea, 0xc5, 0xf1, 0x7c, 0x4d, 0x61, 0x27, 0x1f, 0xef, 0x33, 0xfb, - 0xa2, 0x0f, 0x93, 0x2a, 0xe9, 0x23, 0x8f, 0x4c, 0x15, 0xcd, 0x4c, 0xb0, 0x45, 0xd2, 0x7f, 0x58, - 0x2b, 0xa5, 0x7b, 0x5d, 0x4d, 0x51, 0xc2, 0x1d, 0xb4, 0x8d, 0x18, 0x0d, 0x93, 0x3d, 0xf3, 0xbe, - 0xcc, 0x43, 0x39, 0x6a, 0x6f, 0x36, 0x83, 0x3d, 0xc7, 0xf5, 0xd9, 0x83, 0x93, 0x26, 0xb8, 0xd4, - 0x25, 0x00, 0x27, 0x38, 0x68, 0x05, 0x86, 0x1d, 0xa9, 0x58, 0x45, 0xf9, 0x4e, 0xdb, 0x4a, 0x9d, - 0xca, 0xc4, 0x72, 0xa5, 0x4a, 0x55, 0x75, 0xd1, 0x9b, 0x30, 0x26, 0xdc, 0x89, 0xb8, 0x2b, 0x3b, - 0x7b, 0x10, 0xd2, 0x2c, 0xcf, 0xeb, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0xbb, 0x61, 0x9c, 0x52, 0x49, - 0x18, 0xdb, 0xcc, 0x74, 0x3f, 0x1c, 0x51, 0x8b, 0xe7, 0xaf, 0x57, 0xc6, 0x29, 0x62, 0xa8, 0x09, - 0xcf, 0x38, 0xed, 0x38, 0x60, 0xca, 0x69, 0x73, 0xfd, 0x6f, 0x04, 0xbb, 0xc4, 0x67, 0xef, 0x42, - 0xc3, 0x8b, 0x57, 0x8e, 0x0e, 0x2b, 0xcf, 0x2c, 0x74, 0xc1, 0xc3, 0x5d, 0xa9, 0xa0, 0x7b, 0x30, - 0x12, 0x07, 0x1e, 0xb3, 0x01, 0xa7, 0x32, 0xc0, 0x85, 0xfc, 0x18, 0x27, 0x1b, 0x0a, 0x4d, 0x57, - 0xcc, 0xa8, 0xaa, 0x58, 0xa7, 0x83, 0x36, 0xf8, 0x1e, 0x63, 0xd1, 0x1f, 0x49, 0x34, 0xf3, 0x54, - 0xfe, 0xc0, 0xa8, 0x20, 0x91, 0xe6, 0x16, 0x14, 0x35, 0xb1, 0x4e, 0x06, 0xdd, 0x84, 0xa9, 0x56, - 0xe8, 0x06, 0x6c, 0x61, 0xab, 0x87, 0x81, 0x19, 0x33, 0x84, 0x7b, 0x2d, 0x8d, 0x80, 0x3b, 0xeb, - 0xd0, 0x8b, 0x9b, 0x2c, 0x9c, 0xb9, 0xc8, 0xf3, 0x01, 0x71, 0x61, 0x96, 0x97, 0x61, 0x05, 0x45, - 0x6b, 0x8c, 0x2f, 0xf3, 0x2b, 0xd6, 0xcc, 0x6c, 0xbe, 0xb3, 0xbb, 0x7e, 0x15, 0xe3, 0x82, 0x8e, - 0xfa, 0x8b, 0x13, 0x0a, 0xf4, 0xdc, 0x88, 0x76, 0x9c, 0x90, 0xd4, 0xc2, 0xa0, 0x41, 0x78, 0x67, - 0xb8, 0xf9, 0xf9, 0xd3, 0x3c, 0x48, 0x1d, 0x3d, 0x37, 0xea, 0x59, 0x08, 0x38, 0xbb, 0xde, 0xec, - 0x77, 0xc0, 0x54, 0x07, 0x27, 0x3f, 0x51, 0xe4, 0xe2, 0x3f, 0x1b, 0x80, 0xb2, 0x52, 0xfc, 0xa2, - 0x79, 0x53, 0x9f, 0x7f, 0x31, 0xad, 0xcf, 0x1f, 0xa6, 0xf2, 0xa7, 0xae, 0xc2, 0xdf, 0x30, 0x0c, - 0xbf, 0x0a, 0xf9, 0x79, 0x82, 0x74, 0xad, 0x47, 0x4f, 0xdf, 0x2c, 0xed, 0x1e, 0x5f, 0xec, 0xfb, - 0x61, 0xa0, 0xd4, 0x55, 0x35, 0xd0, 0x67, 0x9a, 0x4e, 0x7a, 0xd5, 0x6d, 0x05, 0xcd, 0xd5, 0x5a, - 0x3a, 0x6f, 0x5d, 0x8d, 0x16, 0x62, 0x0e, 0x63, 0x97, 0x15, 0x2a, 0x76, 0xb0, 0xcb, 0xca, 0xd0, - 0x63, 0x5e, 0x56, 0x24, 0x01, 0x9c, 0xd0, 0x42, 0x1e, 0x4c, 0x35, 0xcc, 0x94, 0x83, 0xca, 0x1f, - 0xeb, 0xb9, 0x9e, 0xc9, 0xff, 0xda, 0x5a, 0x7e, 0xa7, 0xa5, 0x34, 0x15, 0xdc, 0x49, 0x18, 0xbd, - 0x09, 0xc3, 0xef, 0x07, 0x11, 0xdb, 0x16, 0xe2, 0xec, 0x95, 0x1e, 0x30, 0xc3, 0xef, 0xdc, 0xad, - 0xb3, 0xf2, 0xe3, 0xc3, 0xca, 0x48, 0x2d, 0x68, 0xca, 0xbf, 0x58, 0x55, 0x40, 0x8f, 0xe0, 0xbc, - 0xc1, 0xb1, 0x54, 0x77, 0xa1, 0xff, 0xee, 0x5e, 0x12, 0xcd, 0x9d, 0x5f, 0xcd, 0xa2, 0x84, 0xb3, - 0x1b, 0xa0, 0x6c, 0xc0, 0x0f, 0x44, 0xba, 0x4e, 0x79, 0xbe, 0xb3, 0x63, 0xbc, 0xac, 0x7b, 0x14, - 0xa7, 0x10, 0x70, 0x67, 0x1d, 0xfb, 0x1b, 0x5c, 0x4f, 0x2e, 0xb4, 0x69, 0x24, 0x6a, 0x7b, 0x67, - 0x91, 0x0d, 0x66, 0xd9, 0x50, 0xf4, 0x3d, 0xf6, 0x5b, 0xcc, 0x6f, 0x59, 0xec, 0x2d, 0x66, 0x83, - 0xec, 0xb5, 0x3c, 0x27, 0x3e, 0x0b, 0xcf, 0x8b, 0x77, 0x60, 0x38, 0x16, 0xad, 0x75, 0x4b, 0x60, - 0xa3, 0x75, 0x8a, 0xbd, 0x47, 0xa9, 0x93, 0x5f, 0x96, 0x62, 0x45, 0xc6, 0xfe, 0x17, 0x7c, 0x06, - 0x24, 0xe4, 0x0c, 0x94, 0x2e, 0x55, 0x53, 0xe9, 0x52, 0xe9, 0xf1, 0x05, 0x39, 0xca, 0x97, 0x7f, - 0x6e, 0xf6, 0x9b, 0x5d, 0xb2, 0x3e, 0xee, 0x8f, 0x80, 0xf6, 0x4f, 0x5a, 0x30, 0x9d, 0x65, 0x35, - 0x43, 0xa5, 0x35, 0x7e, 0xc5, 0x53, 0x8f, 0xa2, 0x6a, 0x04, 0xef, 0x8b, 0x72, 0xac, 0x30, 0xfa, - 0x8e, 0x0d, 0x7f, 0xb2, 0x00, 0x52, 0x77, 0x61, 0xac, 0x16, 0x12, 0xed, 0x0c, 0x78, 0x8b, 0xbb, - 0x52, 0xf1, 0xfe, 0xbc, 0x74, 0x62, 0x37, 0x2a, 0xfb, 0x17, 0x0a, 0x30, 0xcd, 0x5f, 0x35, 0x16, - 0xf6, 0x03, 0xb7, 0x59, 0x0b, 0x9a, 0x22, 0xae, 0xff, 0x97, 0x60, 0xb4, 0xa5, 0xdd, 0xcb, 0xbb, - 0x85, 0xb0, 0xd1, 0xef, 0xef, 0xc9, 0xfd, 0x48, 0x2f, 0xc5, 0x06, 0x2d, 0xd4, 0x84, 0x51, 0xb2, - 0xef, 0x36, 0x94, 0x6a, 0xbc, 0x70, 0xe2, 0xb3, 0x41, 0xb5, 0xb2, 0xac, 0xd1, 0xc1, 0x06, 0xd5, - 0x27, 0x90, 0xea, 0xc9, 0xfe, 0x29, 0x0b, 0x9e, 0xca, 0x09, 0x78, 0x43, 0x9b, 0x7b, 0xc8, 0xde, - 0x8f, 0x44, 0xd6, 0x18, 0xd5, 0x1c, 0x7f, 0x55, 0xc2, 0x02, 0x8a, 0xbe, 0x00, 0xc0, 0x5f, 0x85, - 0xe8, 0x75, 0x41, 0x7c, 0x7a, 0x7f, 0x81, 0x20, 0xb4, 0x20, 0x01, 0xb2, 0x3e, 0xd6, 0x68, 0xd9, - 0x3f, 0x57, 0x84, 0x01, 0x9e, 0x9f, 0x7f, 0x05, 0x86, 0x76, 0x78, 0x78, 0xd7, 0x7e, 0x22, 0xc9, - 0x26, 0xf7, 0x2e, 0x5e, 0x80, 0x65, 0x65, 0xb4, 0x06, 0xe7, 0x78, 0x78, 0x5c, 0xaf, 0x4a, 0x3c, - 0xe7, 0x40, 0x5e, 0xdf, 0x79, 0xa6, 0x15, 0x15, 0xf0, 0x60, 0xb5, 0x13, 0x05, 0x67, 0xd5, 0x43, - 0x6f, 0xc1, 0x78, 0xec, 0xee, 0x91, 0xa0, 0x1d, 0x4b, 0x4a, 0x3c, 0x30, 0xae, 0x12, 0xf6, 0x37, - 0x0c, 0x28, 0x4e, 0x61, 0xd3, 0x8b, 0x48, 0xab, 0x43, 0x51, 0xa1, 0xe5, 0x2e, 0x37, 0x95, 0x13, - 0x26, 0x2e, 0x33, 0x97, 0x69, 0x33, 0xe3, 0xa0, 0x8d, 0x9d, 0x90, 0x44, 0x3b, 0x81, 0xd7, 0x14, - 0x89, 0x7a, 0x13, 0x73, 0x99, 0x14, 0x1c, 0x77, 0xd4, 0xa0, 0x54, 0xb6, 0x1c, 0xd7, 0x6b, 0x87, - 0x24, 0xa1, 0x32, 0x68, 0x52, 0x59, 0x49, 0xc1, 0x71, 0x47, 0x0d, 0xba, 0x8e, 0xce, 0x8b, 0xcc, - 0xb9, 0xd2, 0x0d, 0x5b, 0xd9, 0x40, 0x0d, 0x49, 0xd7, 0x96, 0x2e, 0x31, 0x42, 0x84, 0x95, 0x88, - 0xca, 0xbd, 0xab, 0xe5, 0x65, 0x14, 0x4e, 0x2d, 0x92, 0xca, 0xe3, 0xe4, 0x6f, 0xfd, 0x03, 0x0b, - 0xce, 0x65, 0xd8, 0x5a, 0x72, 0x56, 0xb5, 0xed, 0x46, 0xb1, 0xca, 0x26, 0xa1, 0xb1, 0x2a, 0x5e, - 0x8e, 0x15, 0x06, 0xdd, 0x0f, 0x9c, 0x19, 0xa6, 0x19, 0xa0, 0xb0, 0x65, 0x12, 0xd0, 0x93, 0x31, - 0x40, 0x74, 0x05, 0x4a, 0xed, 0x88, 0x84, 0x32, 0xf1, 0xa9, 0xe4, 0xdf, 0x4c, 0x55, 0xca, 0x20, - 0x54, 0x34, 0xdd, 0x56, 0x5a, 0x4a, 0x4d, 0x34, 0xe5, 0xaa, 0x47, 0x0e, 0xb3, 0xbf, 0x56, 0x84, - 0x8b, 0xb9, 0xb6, 0xd4, 0xb4, 0x4b, 0x7b, 0x81, 0xef, 0xc6, 0x81, 0x7a, 0xe1, 0xe2, 0x31, 0x2c, - 0x48, 0x6b, 0x67, 0x4d, 0x94, 0x63, 0x85, 0x81, 0xae, 0xca, 0x1c, 0xce, 0xe9, 0x7c, 0x19, 0x8b, - 0x55, 0x23, 0x8d, 0x73, 0xbf, 0xb9, 0x88, 0x9e, 0x83, 0x52, 0x2b, 0x50, 0x09, 0xf6, 0xd5, 0xcc, - 0xd2, 0xee, 0x06, 0x81, 0x87, 0x19, 0x10, 0x7d, 0x4a, 0x8c, 0x43, 0xea, 0x49, 0x07, 0x3b, 0xcd, - 0x20, 0xd2, 0x06, 0xe3, 0x05, 0x18, 0xda, 0x25, 0x07, 0xa1, 0xeb, 0x6f, 0xa7, 0x9f, 0xfa, 0x6e, - 0xf3, 0x62, 0x2c, 0xe1, 0x66, 0xb8, 0xf8, 0xa1, 0xd3, 0x4e, 0x22, 0x34, 0xdc, 0xf3, 0x68, 0xfb, - 0x91, 0x22, 0x4c, 0xe0, 0xc5, 0xea, 0xb7, 0x26, 0xe2, 0x5e, 0xe7, 0x44, 0x9c, 0x76, 0x12, 0xa1, - 0xde, 0xb3, 0xf1, 0x2b, 0x16, 0x4c, 0xb0, 0x90, 0xaa, 0x22, 0x06, 0x83, 0x1b, 0xf8, 0x67, 0x20, - 0xba, 0x3d, 0x07, 0x03, 0x21, 0x6d, 0x34, 0x9d, 0x19, 0x84, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x06, - 0x4a, 0xac, 0x0b, 0x74, 0xf2, 0x46, 0x79, 0x50, 0xf5, 0xaa, 0x13, 0x3b, 0x98, 0x95, 0x32, 0xc7, - 0x62, 0x4c, 0x5a, 0x9e, 0xcb, 0x3b, 0x9d, 0xa8, 0xfa, 0x3f, 0x1e, 0x8e, 0xc5, 0x99, 0x5d, 0xfb, - 0x70, 0x8e, 0xc5, 0xd9, 0x24, 0xbb, 0x5f, 0x8b, 0xfe, 0x67, 0x01, 0x2e, 0x67, 0xd6, 0xeb, 0xdb, - 0xb1, 0xb8, 0x7b, 0xed, 0xd3, 0xb1, 0xd8, 0xc8, 0x36, 0xa4, 0x28, 0x9e, 0xa1, 0x21, 0x45, 0xa9, - 0x5f, 0xc9, 0x71, 0xa0, 0x0f, 0x7f, 0xdf, 0xcc, 0x21, 0xfb, 0x98, 0xf8, 0xfb, 0x66, 0xf6, 0x2d, - 0xe7, 0x5a, 0xf7, 0x17, 0x85, 0x9c, 0x6f, 0x61, 0x17, 0xbc, 0x6b, 0x94, 0xcf, 0x30, 0x60, 0x24, - 0x24, 0xe1, 0x51, 0xce, 0x63, 0x78, 0x19, 0x56, 0x50, 0xe4, 0x6a, 0x9e, 0xb3, 0x85, 0xfc, 0xbc, - 0x71, 0xb9, 0x4d, 0xcd, 0x99, 0x2f, 0x33, 0x6a, 0x08, 0x32, 0xbc, 0x68, 0xd7, 0xb4, 0x4b, 0x79, - 0xb1, 0xff, 0x4b, 0xf9, 0x68, 0xf6, 0x85, 0x1c, 0x2d, 0xc0, 0xc4, 0x9e, 0xeb, 0xb3, 0x3c, 0xe0, - 0xa6, 0x28, 0xaa, 0x02, 0x49, 0xac, 0x99, 0x60, 0x9c, 0xc6, 0x9f, 0x7d, 0x13, 0xc6, 0x1e, 0x5f, - 0x1d, 0xf9, 0xcd, 0x22, 0x3c, 0xdd, 0x65, 0xdb, 0x73, 0x5e, 0x6f, 0xcc, 0x81, 0xc6, 0xeb, 0x3b, - 0xe6, 0xa1, 0x06, 0xd3, 0x5b, 0x6d, 0xcf, 0x3b, 0x60, 0xb6, 0x8a, 0xa4, 0x29, 0x31, 0x84, 0xac, - 0x28, 0xb3, 0xbb, 0x4f, 0xaf, 0x64, 0xe0, 0xe0, 0xcc, 0x9a, 0xe8, 0x6d, 0x40, 0x81, 0x48, 0x5a, - 0x79, 0x93, 0xf8, 0x42, 0xdf, 0xcd, 0x06, 0xbe, 0x98, 0x6c, 0xc6, 0xbb, 0x1d, 0x18, 0x38, 0xa3, - 0x16, 0x15, 0xfa, 0xe9, 0xa9, 0x74, 0xa0, 0xba, 0x95, 0x12, 0xfa, 0xb1, 0x0e, 0xc4, 0x26, 0x2e, - 0xba, 0x09, 0x53, 0xce, 0xbe, 0xe3, 0xf2, 0xb0, 0x68, 0x92, 0x00, 0x97, 0xfa, 0x95, 0x12, 0x6c, - 0x21, 0x8d, 0x80, 0x3b, 0xeb, 0xa4, 0x5c, 0x77, 0x07, 0xf3, 0x5d, 0x77, 0xbb, 0xf3, 0xc5, 0x5e, - 0x3a, 0x5d, 0xfb, 0xbf, 0x58, 0xf4, 0xf8, 0xca, 0x48, 0x3c, 0x4d, 0xc7, 0x41, 0xe9, 0x26, 0x35, - 0x2f, 0x5a, 0x35, 0x0e, 0x4b, 0x3a, 0x10, 0x9b, 0xb8, 0x7c, 0x41, 0x44, 0x89, 0x43, 0x87, 0x21, - 0xba, 0x0b, 0x37, 0x79, 0x85, 0x81, 0xbe, 0x08, 0x43, 0x4d, 0x77, 0xdf, 0x8d, 0x82, 0x50, 0x6c, - 0x96, 0x13, 0x9a, 0xc5, 0x27, 0x7c, 0xb0, 0xca, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0x91, 0x02, 0x8c, - 0xc9, 0x16, 0xdf, 0x69, 0x07, 0xb1, 0x73, 0x06, 0xc7, 0xf2, 0x4d, 0xe3, 0x58, 0xfe, 0x54, 0xb7, - 0x58, 0x01, 0xac, 0x4b, 0xb9, 0xc7, 0xf1, 0xdd, 0xd4, 0x71, 0xfc, 0x7c, 0x6f, 0x52, 0xdd, 0x8f, - 0xe1, 0x7f, 0x69, 0xc1, 0x94, 0x81, 0x7f, 0x06, 0xa7, 0xc1, 0x8a, 0x79, 0x1a, 0x3c, 0xdb, 0xf3, - 0x1b, 0x72, 0x4e, 0x81, 0xaf, 0x17, 0x52, 0x7d, 0x67, 0xdc, 0xff, 0x7d, 0x28, 0xed, 0x38, 0x61, - 0xb3, 0x5b, 0x94, 0xcf, 0x8e, 0x4a, 0x73, 0xb7, 0x9c, 0xb0, 0xc9, 0x79, 0xf8, 0x4b, 0x2a, 0xd5, - 0x9d, 0x13, 0x36, 0x7b, 0xfa, 0x2f, 0xb1, 0xa6, 0xd0, 0x0d, 0x18, 0x8c, 0x1a, 0x41, 0x4b, 0x59, - 0x17, 0x5e, 0xe1, 0x69, 0xf0, 0x68, 0xc9, 0xf1, 0x61, 0x05, 0x99, 0xcd, 0xd1, 0x62, 0x2c, 0xf0, - 0x67, 0xb7, 0xa1, 0xac, 0x9a, 0x7e, 0xa2, 0xbe, 0x21, 0xff, 0xa9, 0x08, 0xe7, 0x32, 0xd6, 0x05, - 0x8a, 0x8c, 0xd1, 0x7a, 0xa5, 0xcf, 0xe5, 0xf4, 0x21, 0xc7, 0x2b, 0x62, 0x37, 0x96, 0xa6, 0x98, - 0xff, 0xbe, 0x1b, 0xbd, 0x17, 0x91, 0x74, 0xa3, 0xb4, 0xa8, 0x77, 0xa3, 0xb4, 0xb1, 0x33, 0x1b, - 0x6a, 0xda, 0x90, 0xea, 0xe9, 0x13, 0x9d, 0xd3, 0x3f, 0x2d, 0xc2, 0x74, 0x56, 0x88, 0x11, 0xf4, - 0xbd, 0xa9, 0x9c, 0x15, 0xaf, 0xf5, 0x1b, 0x9c, 0x84, 0x27, 0xb2, 0x10, 0x19, 0x58, 0xe7, 0xcc, - 0x2c, 0x16, 0x3d, 0x87, 0x59, 0xb4, 0xc9, 0x1c, 0x0a, 0x43, 0x9e, 0x6b, 0x44, 0x6e, 0xf1, 0xcf, - 0xf4, 0xdd, 0x01, 0x91, 0xa4, 0x24, 0x4a, 0x39, 0x14, 0xca, 0xe2, 0xde, 0x0e, 0x85, 0xb2, 0xe5, - 0x59, 0x17, 0x46, 0xb4, 0xaf, 0x79, 0xa2, 0x33, 0xbe, 0x4b, 0x4f, 0x14, 0xad, 0xdf, 0x4f, 0x74, - 0xd6, 0x7f, 0xca, 0x82, 0x94, 0x4d, 0x9f, 0x52, 0x49, 0x59, 0xb9, 0x2a, 0xa9, 0x2b, 0x50, 0x0a, - 0x03, 0x8f, 0xa4, 0xd3, 0x48, 0xe0, 0xc0, 0x23, 0x98, 0x41, 0x54, 0x02, 0xfc, 0x62, 0x6e, 0x02, - 0xfc, 0xe7, 0x60, 0xc0, 0x23, 0xfb, 0x44, 0x6a, 0x23, 0x14, 0x4f, 0xbe, 0x43, 0x0b, 0x31, 0x87, - 0xd9, 0xbf, 0x52, 0x82, 0x4b, 0x5d, 0x5d, 0x72, 0xe9, 0x95, 0x65, 0xdb, 0x89, 0xc9, 0x43, 0xe7, - 0x20, 0x1d, 0xe4, 0xf6, 0x26, 0x2f, 0xc6, 0x12, 0xce, 0x2c, 0x90, 0x79, 0x78, 0xbc, 0x94, 0x02, - 0x4f, 0x44, 0xc5, 0x13, 0xd0, 0x27, 0x90, 0x7d, 0xfa, 0x3a, 0x40, 0x14, 0x79, 0xcb, 0x3e, 0x95, - 0xc0, 0x9a, 0xc2, 0xb4, 0x39, 0x09, 0xa3, 0x58, 0xbf, 0x23, 0x20, 0x58, 0xc3, 0x42, 0x55, 0x98, - 0x6c, 0x85, 0x41, 0xcc, 0xf5, 0xa1, 0x55, 0x6e, 0x24, 0x33, 0x60, 0x7a, 0x43, 0xd6, 0x52, 0x70, - 0xdc, 0x51, 0x03, 0xbd, 0x0e, 0x23, 0xc2, 0x43, 0xb2, 0x16, 0x04, 0x9e, 0x50, 0xd5, 0x28, 0x93, - 0x8b, 0x7a, 0x02, 0xc2, 0x3a, 0x9e, 0x56, 0x8d, 0x29, 0x59, 0x87, 0x32, 0xab, 0x71, 0x45, 0xab, - 0x86, 0x97, 0x0a, 0x37, 0x34, 0xdc, 0x57, 0xb8, 0xa1, 0x44, 0x79, 0x55, 0xee, 0xfb, 0x5d, 0x09, - 0x7a, 0xaa, 0x7b, 0x7e, 0xb1, 0x04, 0xe7, 0xc4, 0xc2, 0x79, 0xd2, 0xcb, 0xe5, 0x09, 0xe5, 0xc8, - 0xfe, 0xd6, 0x9a, 0x39, 0xeb, 0x35, 0xf3, 0x8d, 0x22, 0x0c, 0xf2, 0xa9, 0x38, 0x03, 0x19, 0x7e, - 0x45, 0x28, 0xfd, 0xba, 0x04, 0xda, 0xe1, 0x7d, 0x99, 0xab, 0x3a, 0xb1, 0xc3, 0xcf, 0x2f, 0xc5, - 0x46, 0x13, 0xf5, 0x20, 0x9a, 0x33, 0x18, 0xed, 0x6c, 0x4a, 0xab, 0x05, 0x9c, 0x86, 0xc6, 0x76, - 0xbf, 0x0c, 0x10, 0xb1, 0x3c, 0xcd, 0x94, 0x86, 0x08, 0xd9, 0xf4, 0xe9, 0x2e, 0xad, 0xd7, 0x15, - 0x32, 0xef, 0x43, 0xb2, 0x04, 0x15, 0x00, 0x6b, 0x14, 0x67, 0xdf, 0x80, 0xb2, 0x42, 0xee, 0xa5, - 0x02, 0x18, 0xd5, 0x4f, 0xbd, 0xcf, 0xc3, 0x44, 0xaa, 0xad, 0x13, 0x69, 0x10, 0x7e, 0xd5, 0x82, - 0x09, 0xde, 0xe5, 0x65, 0x7f, 0x5f, 0x6c, 0xf6, 0x0f, 0x60, 0xda, 0xcb, 0xd8, 0x74, 0x62, 0x46, - 0xfb, 0xdf, 0xa4, 0x4a, 0x63, 0x90, 0x05, 0xc5, 0x99, 0x6d, 0xa0, 0x6b, 0x30, 0xcc, 0x5d, 0x76, - 0x1c, 0x4f, 0xb8, 0x59, 0x8c, 0xf2, 0xb8, 0xf3, 0xbc, 0x0c, 0x2b, 0xa8, 0xfd, 0x7b, 0x16, 0x4c, - 0xf1, 0x9e, 0xdf, 0x26, 0x07, 0xea, 0x76, 0xfc, 0x51, 0xf6, 0x5d, 0x84, 0xd5, 0x2f, 0xe4, 0x84, - 0xd5, 0xd7, 0x3f, 0xad, 0xd8, 0xf5, 0xd3, 0x7e, 0xc1, 0x02, 0xb1, 0x02, 0xcf, 0xe0, 0x1e, 0xf8, - 0x1d, 0xe6, 0x3d, 0x70, 0x36, 0x7f, 0x51, 0xe7, 0x5c, 0x00, 0xff, 0xdc, 0x82, 0x49, 0x8e, 0x90, - 0x3c, 0x44, 0x7e, 0xa4, 0xf3, 0xd0, 0x4f, 0xae, 0x27, 0x95, 0xdc, 0x35, 0xfb, 0xa3, 0x8c, 0xc9, - 0x2a, 0x75, 0x9d, 0xac, 0xa6, 0xdc, 0x40, 0x27, 0xc8, 0x61, 0x76, 0xe2, 0x60, 0xba, 0xf6, 0x9f, - 0x58, 0x80, 0x78, 0x33, 0xe9, 0xd4, 0xfe, 0xfc, 0xe8, 0xd3, 0x34, 0x41, 0x09, 0xab, 0x51, 0x10, - 0xac, 0x61, 0x9d, 0xca, 0xf0, 0xa4, 0x5e, 0x93, 0x8b, 0xbd, 0x5f, 0x93, 0x4f, 0x30, 0xa2, 0xdf, - 0x28, 0x41, 0xda, 0x46, 0x1b, 0xdd, 0x87, 0xd1, 0x86, 0xd3, 0x72, 0x36, 0x5d, 0xcf, 0x8d, 0x5d, - 0x12, 0x75, 0x33, 0x43, 0x59, 0xd2, 0xf0, 0xc4, 0x3b, 0xa1, 0x56, 0x82, 0x0d, 0x3a, 0x68, 0x0e, - 0xa0, 0x15, 0xba, 0xfb, 0xae, 0x47, 0xb6, 0xd9, 0x55, 0x98, 0x39, 0x76, 0x71, 0xdb, 0x0a, 0x59, - 0x8a, 0x35, 0x8c, 0x0c, 0x47, 0xa0, 0xe2, 0x93, 0x73, 0x04, 0x2a, 0x9d, 0xd0, 0x11, 0x68, 0xa0, - 0x2f, 0x47, 0x20, 0x0c, 0x17, 0xe4, 0xd9, 0x4d, 0xff, 0xaf, 0xb8, 0x1e, 0x11, 0x02, 0x1b, 0x77, - 0xf7, 0x9a, 0x3d, 0x3a, 0xac, 0x5c, 0xc0, 0x99, 0x18, 0x38, 0xa7, 0x26, 0xfa, 0x02, 0xcc, 0x38, - 0x9e, 0x17, 0x3c, 0x54, 0xa3, 0xb6, 0x1c, 0x35, 0x1c, 0x8f, 0xab, 0x7b, 0x87, 0x18, 0xd5, 0x67, - 0x8e, 0x0e, 0x2b, 0x33, 0x0b, 0x39, 0x38, 0x38, 0xb7, 0x76, 0xca, 0x8f, 0x68, 0xb8, 0xa7, 0x1f, - 0xd1, 0x2e, 0x9c, 0xab, 0x93, 0xd0, 0x65, 0x19, 0xd6, 0x9a, 0xc9, 0x96, 0xdc, 0x80, 0x72, 0x98, - 0x62, 0x42, 0x7d, 0xc5, 0x80, 0xd1, 0xe2, 0x84, 0x4a, 0xa6, 0x93, 0x10, 0xb2, 0xff, 0xcc, 0x82, - 0x21, 0x61, 0x27, 0x7e, 0x06, 0xb2, 0xcf, 0x82, 0xa1, 0xbf, 0xac, 0x64, 0x33, 0x6a, 0xd6, 0x99, - 0x5c, 0xcd, 0xe5, 0x6a, 0x4a, 0x73, 0xf9, 0x6c, 0x37, 0x22, 0xdd, 0x75, 0x96, 0x3f, 0x51, 0x84, - 0x71, 0xd3, 0x46, 0xfe, 0x0c, 0x86, 0x60, 0x1d, 0x86, 0x22, 0xe1, 0x90, 0x51, 0xc8, 0x37, 0x9c, - 0x4d, 0x4f, 0x62, 0x62, 0x15, 0x23, 0x5c, 0x30, 0x24, 0x91, 0x4c, 0x4f, 0x8f, 0xe2, 0x13, 0xf4, - 0xf4, 0xe8, 0xe5, 0xa6, 0x50, 0x3a, 0x0d, 0x37, 0x05, 0xfb, 0xd7, 0xd9, 0x61, 0xa1, 0x97, 0x9f, - 0x81, 0x1c, 0x71, 0xd3, 0x3c, 0x56, 0xec, 0x2e, 0x2b, 0x4b, 0x74, 0x2a, 0x47, 0x9e, 0xf8, 0xa7, - 0x16, 0x8c, 0x08, 0xc4, 0x33, 0xe8, 0xf6, 0x77, 0x9a, 0xdd, 0x7e, 0xba, 0x4b, 0xb7, 0x73, 0xfa, - 0xfb, 0xf7, 0x0b, 0xaa, 0xbf, 0xb5, 0x20, 0x8c, 0xfb, 0x38, 0xfd, 0x6f, 0xc0, 0x30, 0xbd, 0x3d, - 0x06, 0x8d, 0xc0, 0x13, 0x87, 0xff, 0x33, 0x89, 0x87, 0x30, 0x2f, 0x3f, 0xd6, 0x7e, 0x63, 0x85, - 0xcd, 0x1c, 0x58, 0x83, 0x30, 0x16, 0x07, 0x6e, 0xe2, 0xc0, 0x1a, 0x84, 0x31, 0x66, 0x10, 0xd4, - 0x04, 0x88, 0x9d, 0x70, 0x9b, 0xc4, 0xb4, 0x4c, 0x04, 0x1b, 0xc8, 0xdf, 0x85, 0xed, 0xd8, 0xf5, - 0xe6, 0x5c, 0x3f, 0x8e, 0xe2, 0x70, 0x6e, 0xd5, 0x8f, 0xef, 0x86, 0xfc, 0x2e, 0xa1, 0xb9, 0xfc, - 0x2a, 0x5a, 0x58, 0xa3, 0x2b, 0x7d, 0xc8, 0x58, 0x1b, 0x03, 0xe6, 0xc3, 0xe2, 0xba, 0x28, 0xc7, - 0x0a, 0xc3, 0x7e, 0x83, 0xf1, 0x64, 0x36, 0x40, 0x27, 0xf3, 0xc6, 0xfd, 0x9d, 0x61, 0x35, 0xb4, - 0xec, 0x55, 0xa1, 0xaa, 0xfb, 0xfc, 0x76, 0x67, 0x81, 0xb4, 0x61, 0xdd, 0x1f, 0x21, 0x71, 0x0c, - 0x46, 0xdf, 0xd5, 0xf1, 0xde, 0xfc, 0x72, 0x0f, 0x5e, 0x7a, 0x82, 0x17, 0x66, 0x16, 0xe0, 0x96, - 0x05, 0x02, 0x5d, 0xad, 0x89, 0xdb, 0xa5, 0x16, 0xe0, 0x56, 0x00, 0x70, 0x82, 0x83, 0xe6, 0xc5, - 0x4d, 0xb4, 0x64, 0x64, 0x8f, 0x92, 0x37, 0x51, 0xf9, 0xf9, 0xda, 0x55, 0xf4, 0x15, 0x18, 0x51, - 0x59, 0xa4, 0x6a, 0x3c, 0x19, 0x8f, 0x08, 0xbd, 0xb0, 0x9c, 0x14, 0x63, 0x1d, 0x07, 0x6d, 0xc0, - 0x44, 0xc4, 0x73, 0x5d, 0xa9, 0x08, 0x5b, 0x5c, 0xcf, 0xf0, 0x69, 0xf9, 0x4e, 0x5d, 0x37, 0xc1, - 0xc7, 0xac, 0x88, 0x6f, 0x56, 0xe9, 0x08, 0x96, 0x26, 0x81, 0xde, 0x82, 0x71, 0x4f, 0xcf, 0xf9, - 0x5b, 0x13, 0x6a, 0x08, 0x65, 0xc6, 0x69, 0x64, 0x04, 0xae, 0xe1, 0x14, 0x36, 0x15, 0x1a, 0xf4, - 0x12, 0x11, 0x15, 0xce, 0xf1, 0xb7, 0x49, 0x24, 0x72, 0xe0, 0x30, 0xa1, 0xe1, 0x4e, 0x0e, 0x0e, - 0xce, 0xad, 0x8d, 0x6e, 0xc0, 0xa8, 0xfc, 0x7c, 0xcd, 0xcd, 0x31, 0x31, 0x16, 0xd6, 0x60, 0xd8, - 0xc0, 0x44, 0x0f, 0xe1, 0xbc, 0xfc, 0xbf, 0x11, 0x3a, 0x5b, 0x5b, 0x6e, 0x43, 0x78, 0x99, 0x72, - 0x8f, 0x89, 0x05, 0xe9, 0x82, 0xb1, 0x9c, 0x85, 0x74, 0x7c, 0x58, 0xb9, 0x22, 0x46, 0x2d, 0x13, - 0xce, 0x26, 0x31, 0x9b, 0x3e, 0x5a, 0x83, 0x73, 0x3b, 0xc4, 0xf1, 0xe2, 0x9d, 0xa5, 0x1d, 0xd2, - 0xd8, 0x95, 0x9b, 0x88, 0x39, 0x4f, 0x6a, 0x26, 0xb6, 0xb7, 0x3a, 0x51, 0x70, 0x56, 0x3d, 0xf4, - 0x2e, 0xcc, 0xb4, 0xda, 0x9b, 0x9e, 0x1b, 0xed, 0xac, 0x07, 0x31, 0x7b, 0x1a, 0x57, 0x49, 0x98, - 0x84, 0x97, 0xa5, 0x72, 0x1c, 0xad, 0xe5, 0xe0, 0xe1, 0x5c, 0x0a, 0xe8, 0x03, 0x38, 0x9f, 0x5a, - 0x0c, 0xc2, 0xe7, 0x6b, 0x3c, 0x3f, 0xc6, 0x66, 0x3d, 0xab, 0x82, 0xf0, 0xe1, 0xca, 0x02, 0xe1, - 0xec, 0x26, 0x3e, 0x9c, 0xc1, 0xc4, 0xfb, 0xb4, 0xb2, 0x26, 0xdd, 0xa0, 0xaf, 0xc0, 0xa8, 0xbe, - 0x8a, 0xc4, 0x01, 0x73, 0xb5, 0x57, 0x7e, 0x6b, 0x21, 0x1b, 0xa9, 0x15, 0xa5, 0xc3, 0xb0, 0x41, - 0xd1, 0x26, 0x90, 0xfd, 0x7d, 0xe8, 0x0e, 0x0c, 0x37, 0x3c, 0x97, 0xf8, 0xf1, 0x6a, 0xad, 0x5b, - 0x34, 0x81, 0x25, 0x81, 0x23, 0x06, 0x4c, 0x04, 0x25, 0xe4, 0x65, 0x58, 0x51, 0xb0, 0x7f, 0xb3, - 0x00, 0x95, 0x1e, 0x11, 0x2e, 0x53, 0x3a, 0x43, 0xab, 0x2f, 0x9d, 0xe1, 0x82, 0x4c, 0x29, 0xb5, - 0x9e, 0xba, 0xaf, 0xa6, 0xd2, 0x45, 0x25, 0xb7, 0xd6, 0x34, 0x7e, 0xdf, 0x76, 0x96, 0xba, 0xda, - 0xb1, 0xd4, 0xd3, 0x02, 0xd8, 0x78, 0x6e, 0x18, 0xe8, 0x5f, 0xa2, 0xcf, 0x55, 0x1d, 0xdb, 0xbf, - 0x5e, 0x80, 0xf3, 0x6a, 0x08, 0xff, 0xea, 0x0e, 0xdc, 0xbd, 0xce, 0x81, 0x3b, 0x05, 0xc5, 0xbb, - 0x7d, 0x17, 0x06, 0xeb, 0x07, 0x51, 0x23, 0xf6, 0xfa, 0x10, 0x80, 0x9e, 0x33, 0xa3, 0xea, 0xa8, - 0x63, 0xda, 0x88, 0xac, 0xf3, 0x37, 0x2c, 0x98, 0xd8, 0x58, 0xaa, 0xd5, 0x83, 0xc6, 0x2e, 0x89, - 0x17, 0xb8, 0x5a, 0x09, 0x0b, 0xf9, 0xc7, 0x7a, 0x4c, 0xb9, 0x26, 0x4b, 0x62, 0xba, 0x02, 0xa5, - 0x9d, 0x20, 0x8a, 0xd3, 0xaf, 0x72, 0xb7, 0x82, 0x28, 0xc6, 0x0c, 0x62, 0xff, 0xbe, 0x05, 0x03, - 0x2c, 0x11, 0x62, 0xaf, 0xcc, 0x99, 0xfd, 0x7c, 0x17, 0x7a, 0x1d, 0x06, 0xc9, 0xd6, 0x16, 0x69, - 0xc4, 0x62, 0x56, 0xa5, 0x5b, 0xdf, 0xe0, 0x32, 0x2b, 0xa5, 0x87, 0x3e, 0x6b, 0x8c, 0xff, 0xc5, - 0x02, 0x19, 0x3d, 0x80, 0x72, 0xec, 0xee, 0x91, 0x85, 0x66, 0x53, 0xbc, 0x6b, 0x3c, 0x86, 0x17, - 0xe5, 0x86, 0x24, 0x80, 0x13, 0x5a, 0xf6, 0xd7, 0x0a, 0x00, 0x89, 0x6b, 0x72, 0xaf, 0x4f, 0x5c, - 0xec, 0x48, 0x0e, 0x7a, 0x35, 0x23, 0x39, 0x28, 0x4a, 0x08, 0x66, 0xa4, 0x06, 0x55, 0xc3, 0x54, - 0xec, 0x6b, 0x98, 0x4a, 0x27, 0x19, 0xa6, 0x25, 0x98, 0x4a, 0x5c, 0xab, 0xcd, 0x38, 0x13, 0x2c, - 0xe2, 0xfd, 0x46, 0x1a, 0x88, 0x3b, 0xf1, 0xed, 0x1f, 0xb2, 0x40, 0xb8, 0x27, 0xf4, 0xb1, 0x98, - 0xbf, 0x24, 0xd3, 0xf7, 0x19, 0x81, 0x72, 0xaf, 0xe4, 0xfb, 0x6b, 0x88, 0xf0, 0xb8, 0xea, 0xf0, - 0x30, 0x82, 0xe2, 0x1a, 0xb4, 0xec, 0x26, 0x08, 0x68, 0x95, 0x30, 0x25, 0x43, 0xef, 0xde, 0x5c, - 0x07, 0x68, 0x32, 0x5c, 0x2d, 0x1d, 0x98, 0x62, 0x55, 0x55, 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0x63, - 0x05, 0x18, 0x91, 0x81, 0x59, 0xe9, 0x3d, 0xbe, 0x77, 0x2b, 0x27, 0xca, 0xca, 0xc0, 0xf2, 0xe7, - 0x51, 0xc2, 0x2a, 0x78, 0xbf, 0x9e, 0x3f, 0x4f, 0x02, 0x70, 0x82, 0x83, 0x5e, 0x80, 0xa1, 0xa8, - 0xbd, 0xc9, 0xd0, 0x53, 0x46, 0xf7, 0x75, 0x5e, 0x8c, 0x25, 0x1c, 0x7d, 0x01, 0x26, 0x79, 0xbd, - 0x30, 0x68, 0x39, 0xdb, 0x5c, 0xe3, 0x34, 0xa0, 0xbc, 0xe0, 0x26, 0xd7, 0x52, 0xb0, 0xe3, 0xc3, - 0xca, 0x74, 0xba, 0x8c, 0xe9, 0x2a, 0x3b, 0xa8, 0xd8, 0x5f, 0x01, 0xd4, 0x19, 0x6b, 0x16, 0xbd, - 0xcd, 0xcd, 0x2a, 0xdc, 0x90, 0x34, 0xfb, 0x4e, 0xe7, 0x3e, 0x2a, 0x8d, 0x27, 0x68, 0x2d, 0xac, - 0xea, 0xd3, 0x9d, 0x37, 0x99, 0x76, 0xe1, 0x41, 0xb7, 0x60, 0x90, 0x33, 0x55, 0x41, 0xbe, 0xcb, - 0x1b, 0x97, 0xe6, 0xf8, 0xc3, 0x02, 0xe1, 0x0b, 0xbe, 0x2c, 0xea, 0xa3, 0x77, 0x61, 0xa4, 0x19, - 0x3c, 0xf4, 0x1f, 0x3a, 0x61, 0x73, 0xa1, 0xb6, 0x2a, 0xd6, 0x65, 0xa6, 0x6c, 0x56, 0x4d, 0xd0, - 0x74, 0x67, 0x22, 0xa6, 0xcf, 0x4d, 0x40, 0x58, 0x27, 0x87, 0x36, 0x58, 0xfc, 0x2c, 0x9e, 0x4b, - 0xbb, 0x9b, 0x1d, 0x9c, 0x4a, 0xbf, 0xad, 0x51, 0x1e, 0x13, 0x41, 0xb6, 0x44, 0x26, 0xee, 0x84, - 0x90, 0xfd, 0xd5, 0x73, 0x60, 0xec, 0x07, 0x23, 0xef, 0x83, 0x75, 0x4a, 0x79, 0x1f, 0x30, 0x0c, - 0x93, 0xbd, 0x56, 0x7c, 0x50, 0x75, 0xc3, 0x6e, 0x89, 0x83, 0x96, 0x05, 0x4e, 0x27, 0x4d, 0x09, - 0xc1, 0x8a, 0x4e, 0x76, 0x72, 0x8e, 0xe2, 0x47, 0x98, 0x9c, 0xa3, 0x74, 0x86, 0xc9, 0x39, 0xd6, - 0x61, 0x68, 0xdb, 0x8d, 0x31, 0x69, 0x05, 0x42, 0xa0, 0xc8, 0x5c, 0x09, 0x37, 0x39, 0x4a, 0x67, - 0x68, 0x78, 0x01, 0xc0, 0x92, 0x08, 0x7a, 0x5b, 0xed, 0x81, 0xc1, 0x7c, 0x79, 0xbc, 0xf3, 0x39, - 0x24, 0x73, 0x17, 0x88, 0x64, 0x1c, 0x43, 0x8f, 0x9b, 0x8c, 0x63, 0x45, 0xa6, 0xd0, 0x18, 0xce, - 0x37, 0x1b, 0x65, 0x19, 0x32, 0x7a, 0x24, 0xce, 0x30, 0x92, 0x8d, 0x94, 0x4f, 0x2f, 0xd9, 0xc8, - 0x0f, 0x59, 0x70, 0xbe, 0x95, 0x95, 0x77, 0x47, 0xa4, 0xc0, 0x78, 0xbd, 0xef, 0xc4, 0x42, 0x46, - 0x83, 0xec, 0x62, 0x96, 0x89, 0x86, 0xb3, 0x9b, 0xa3, 0x03, 0x1d, 0x6e, 0x36, 0x45, 0xde, 0x8c, - 0xe7, 0x72, 0xb2, 0x96, 0x74, 0xc9, 0x55, 0xb2, 0x91, 0x91, 0x2b, 0xe3, 0x93, 0x79, 0xb9, 0x32, - 0xfa, 0xce, 0x90, 0x91, 0xe4, 0x2b, 0x19, 0xfb, 0xd0, 0xf9, 0x4a, 0xde, 0x56, 0xf9, 0x4a, 0xba, - 0x44, 0x1d, 0xe2, 0xd9, 0x48, 0x7a, 0x66, 0x29, 0xd1, 0x32, 0x8d, 0x4c, 0x9c, 0x4e, 0xa6, 0x11, - 0x83, 0xd9, 0xf3, 0x64, 0x17, 0x2f, 0xf6, 0x60, 0xf6, 0x06, 0xdd, 0xee, 0xec, 0x9e, 0x67, 0x55, - 0x99, 0x7a, 0xac, 0xac, 0x2a, 0xf7, 0xf5, 0x2c, 0x25, 0xa8, 0x47, 0x1a, 0x0e, 0x8a, 0xd4, 0x67, - 0x6e, 0x92, 0xfb, 0xfa, 0x11, 0x74, 0x2e, 0x9f, 0xae, 0x3a, 0x69, 0x3a, 0xe9, 0x66, 0x1d, 0x42, - 0x9d, 0x39, 0x4f, 0xa6, 0xcf, 0x26, 0xe7, 0xc9, 0xf9, 0x53, 0xcf, 0x79, 0x72, 0xe1, 0x0c, 0x72, - 0x9e, 0x3c, 0xf5, 0x91, 0xe6, 0x3c, 0x99, 0x79, 0x02, 0x39, 0x4f, 0xd6, 0x93, 0x9c, 0x27, 0x17, - 0xf3, 0xa7, 0x24, 0xc3, 0x4e, 0x2e, 0x27, 0xd3, 0xc9, 0x7d, 0x28, 0xb7, 0xa4, 0x97, 0xb7, 0x08, - 0x8b, 0x94, 0x9d, 0x6c, 0x31, 0xcb, 0x15, 0x9c, 0x4f, 0x89, 0x02, 0xe1, 0x84, 0x14, 0xa5, 0x9b, - 0x64, 0x3e, 0x79, 0xba, 0x8b, 0xea, 0x2d, 0x4b, 0xa9, 0x91, 0x9f, 0xef, 0xc4, 0xfe, 0x9b, 0x05, - 0xb8, 0xdc, 0x7d, 0x5d, 0x27, 0x1a, 0x91, 0x5a, 0xa2, 0xc1, 0x4f, 0x69, 0x44, 0xf8, 0x35, 0x23, - 0xc1, 0xea, 0x3b, 0x14, 0xc6, 0x4d, 0x98, 0x52, 0x06, 0x72, 0x9e, 0xdb, 0x38, 0xd0, 0x92, 0x30, - 0x2a, 0x67, 0x9d, 0x7a, 0x1a, 0x01, 0x77, 0xd6, 0x41, 0x0b, 0x30, 0x61, 0x14, 0xae, 0x56, 0xc5, - 0x75, 0x42, 0xa9, 0x60, 0xea, 0x26, 0x18, 0xa7, 0xf1, 0xed, 0xaf, 0x5b, 0xf0, 0x54, 0x4e, 0x38, - 0xf0, 0xbe, 0x23, 0x3d, 0x6c, 0xc1, 0x44, 0xcb, 0xac, 0xda, 0x23, 0x20, 0x8c, 0x11, 0x74, 0x5c, - 0xf5, 0x35, 0x05, 0xc0, 0x69, 0xa2, 0x8b, 0xd7, 0x7e, 0xfb, 0x0f, 0x2f, 0x7f, 0xe2, 0x77, 0xff, - 0xf0, 0xf2, 0x27, 0x7e, 0xef, 0x0f, 0x2f, 0x7f, 0xe2, 0xaf, 0x1d, 0x5d, 0xb6, 0x7e, 0xfb, 0xe8, - 0xb2, 0xf5, 0xbb, 0x47, 0x97, 0xad, 0xdf, 0x3b, 0xba, 0x6c, 0xfd, 0xc1, 0xd1, 0x65, 0xeb, 0x6b, - 0x7f, 0x74, 0xf9, 0x13, 0x5f, 0x2a, 0xec, 0xbf, 0xf2, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x43, - 0x12, 0xcf, 0x50, 0x3f, 0xdc, 0x00, 0x00, + // 12209 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6f, 0x70, 0x24, 0x49, + 0x56, 0x18, 0x7e, 0xd5, 0xdd, 0xfa, 0xd3, 0x4f, 0xff, 0x73, 0x34, 0xb3, 0x1a, 0xed, 0xce, 0xf4, + 0x6c, 0xed, 0xdd, 0xec, 0xec, 0xed, 0xae, 0xc4, 0xce, 0xee, 0xde, 0x0e, 0xb7, 0x77, 0x0b, 0x92, + 0x5a, 0x9a, 0xd1, 0xce, 0x48, 0xd3, 0x9b, 0xad, 0x99, 0xb9, 0x3b, 0x96, 0xe3, 0x4a, 0xdd, 0x29, + 0xa9, 0x56, 0xa5, 0xaa, 0xde, 0xaa, 0x6a, 0xcd, 0x68, 0x03, 0x22, 0x7e, 0xbf, 0x03, 0x63, 0x63, + 0xf8, 0x70, 0x61, 0x08, 0x1b, 0x03, 0x81, 0x23, 0x6c, 0x1c, 0x70, 0xc6, 0x76, 0x04, 0x06, 0x03, + 0x3e, 0xb0, 0x8d, 0xb1, 0x3f, 0xe0, 0x2f, 0x18, 0xfb, 0xcb, 0x11, 0x41, 0x58, 0x06, 0x41, 0xd8, + 0xc1, 0x07, 0x3b, 0x1c, 0x26, 0xc2, 0x11, 0xc8, 0x84, 0x71, 0xe4, 0xdf, 0xca, 0xac, 0xae, 0xea, + 0x6e, 0xcd, 0x6a, 0xb4, 0xcb, 0xc5, 0x7d, 0xeb, 0xce, 0xf7, 0xf2, 0x65, 0x56, 0xfe, 0x79, 0xf9, + 0xf2, 0xe5, 0xfb, 0x03, 0x6f, 0xee, 0xde, 0x88, 0xe6, 0xdc, 0x60, 0x7e, 0xb7, 0xbd, 0x49, 0x42, + 0x9f, 0xc4, 0x24, 0x9a, 0xdf, 0x27, 0x7e, 0x33, 0x08, 0xe7, 0x05, 0xc0, 0x69, 0xb9, 0xf3, 0x8d, + 0x20, 0x24, 0xf3, 0xfb, 0xaf, 0xcc, 0x6f, 0x13, 0x9f, 0x84, 0x4e, 0x4c, 0x9a, 0x73, 0xad, 0x30, + 0x88, 0x03, 0x84, 0x38, 0xce, 0x9c, 0xd3, 0x72, 0xe7, 0x28, 0xce, 0xdc, 0xfe, 0x2b, 0xb3, 0x2f, + 0x6f, 0xbb, 0xf1, 0x4e, 0x7b, 0x73, 0xae, 0x11, 0xec, 0xcd, 0x6f, 0x07, 0xdb, 0xc1, 0x3c, 0x43, + 0xdd, 0x6c, 0x6f, 0xb1, 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x49, 0xcc, 0xae, 0x25, 0xcd, 0x90, 0x47, + 0x31, 0xf1, 0x23, 0x37, 0xf0, 0xa3, 0x97, 0x9d, 0x96, 0x1b, 0x91, 0x70, 0x9f, 0x84, 0xf3, 0xad, + 0xdd, 0x6d, 0x0a, 0x8b, 0x4c, 0x84, 0xf9, 0xfd, 0x57, 0x36, 0x49, 0xec, 0x74, 0xf4, 0x68, 0xf6, + 0xb5, 0x84, 0xdc, 0x9e, 0xd3, 0xd8, 0x71, 0x7d, 0x12, 0x1e, 0x48, 0x1a, 0xf3, 0x21, 0x89, 0x82, + 0x76, 0xd8, 0x20, 0x27, 0xaa, 0x15, 0xcd, 0xef, 0x91, 0xd8, 0xc9, 0xf8, 0xfa, 0xd9, 0xf9, 0xbc, + 0x5a, 0x61, 0xdb, 0x8f, 0xdd, 0xbd, 0xce, 0x66, 0x3e, 0xd3, 0xab, 0x42, 0xd4, 0xd8, 0x21, 0x7b, + 0x4e, 0x47, 0xbd, 0x57, 0xf3, 0xea, 0xb5, 0x63, 0xd7, 0x9b, 0x77, 0xfd, 0x38, 0x8a, 0xc3, 0x74, + 0x25, 0xfb, 0x9b, 0x16, 0x5c, 0x59, 0x78, 0x50, 0x5f, 0xf6, 0x9c, 0x28, 0x76, 0x1b, 0x8b, 0x5e, + 0xd0, 0xd8, 0xad, 0xc7, 0x41, 0x48, 0xee, 0x07, 0x5e, 0x7b, 0x8f, 0xd4, 0xd9, 0x40, 0xa0, 0x97, + 0x60, 0x78, 0x9f, 0xfd, 0x5f, 0xad, 0xce, 0x58, 0x57, 0xac, 0x6b, 0xe5, 0xc5, 0xc9, 0xdf, 0x39, + 0xac, 0x7c, 0xe2, 0xe8, 0xb0, 0x32, 0x7c, 0x5f, 0x94, 0x63, 0x85, 0x81, 0xae, 0xc2, 0xe0, 0x56, + 0xb4, 0x71, 0xd0, 0x22, 0x33, 0x05, 0x86, 0x3b, 0x2e, 0x70, 0x07, 0x57, 0xea, 0xb4, 0x14, 0x0b, + 0x28, 0x9a, 0x87, 0x72, 0xcb, 0x09, 0x63, 0x37, 0x76, 0x03, 0x7f, 0xa6, 0x78, 0xc5, 0xba, 0x36, + 0xb0, 0x38, 0x25, 0x50, 0xcb, 0x35, 0x09, 0xc0, 0x09, 0x0e, 0xed, 0x46, 0x48, 0x9c, 0xe6, 0x5d, + 0xdf, 0x3b, 0x98, 0x29, 0x5d, 0xb1, 0xae, 0x0d, 0x27, 0xdd, 0xc0, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, + 0xa7, 0x0a, 0x30, 0xbc, 0xb0, 0xb5, 0xe5, 0xfa, 0x6e, 0x7c, 0x80, 0xee, 0xc3, 0xa8, 0x1f, 0x34, + 0x89, 0xfc, 0xcf, 0xbe, 0x62, 0xe4, 0xfa, 0x95, 0xb9, 0xce, 0x95, 0x39, 0xb7, 0xae, 0xe1, 0x2d, + 0x4e, 0x1e, 0x1d, 0x56, 0x46, 0xf5, 0x12, 0x6c, 0xd0, 0x41, 0x18, 0x46, 0x5a, 0x41, 0x53, 0x91, + 0x2d, 0x30, 0xb2, 0x95, 0x2c, 0xb2, 0xb5, 0x04, 0x6d, 0x71, 0xe2, 0xe8, 0xb0, 0x32, 0xa2, 0x15, + 0x60, 0x9d, 0x08, 0xda, 0x84, 0x09, 0xfa, 0xd7, 0x8f, 0x5d, 0x45, 0xb7, 0xc8, 0xe8, 0x3e, 0x97, + 0x47, 0x57, 0x43, 0x5d, 0x3c, 0x77, 0x74, 0x58, 0x99, 0x48, 0x15, 0xe2, 0x34, 0x41, 0xfb, 0x03, + 0x18, 0x5f, 0x88, 0x63, 0xa7, 0xb1, 0x43, 0x9a, 0x7c, 0x06, 0xd1, 0x6b, 0x50, 0xf2, 0x9d, 0x3d, + 0x22, 0xe6, 0xf7, 0x8a, 0x18, 0xd8, 0xd2, 0xba, 0xb3, 0x47, 0x8e, 0x0f, 0x2b, 0x93, 0xf7, 0x7c, + 0xf7, 0xfd, 0xb6, 0x58, 0x15, 0xb4, 0x0c, 0x33, 0x6c, 0x74, 0x1d, 0xa0, 0x49, 0xf6, 0xdd, 0x06, + 0xa9, 0x39, 0xf1, 0x8e, 0x98, 0x6f, 0x24, 0xea, 0x42, 0x55, 0x41, 0xb0, 0x86, 0x65, 0x3f, 0x82, + 0xf2, 0xc2, 0x7e, 0xe0, 0x36, 0x6b, 0x41, 0x33, 0x42, 0xbb, 0x30, 0xd1, 0x0a, 0xc9, 0x16, 0x09, + 0x55, 0xd1, 0x8c, 0x75, 0xa5, 0x78, 0x6d, 0xe4, 0xfa, 0xb5, 0xcc, 0x8f, 0x35, 0x51, 0x97, 0xfd, + 0x38, 0x3c, 0x58, 0x7c, 0x4a, 0xb4, 0x37, 0x91, 0x82, 0xe2, 0x34, 0x65, 0xfb, 0xdf, 0x15, 0xe0, + 0xfc, 0xc2, 0x07, 0xed, 0x90, 0x54, 0xdd, 0x68, 0x37, 0xbd, 0xc2, 0x9b, 0x6e, 0xb4, 0xbb, 0x9e, + 0x8c, 0x80, 0x5a, 0x5a, 0x55, 0x51, 0x8e, 0x15, 0x06, 0x7a, 0x19, 0x86, 0xe8, 0xef, 0x7b, 0x78, + 0x55, 0x7c, 0xf2, 0x39, 0x81, 0x3c, 0x52, 0x75, 0x62, 0xa7, 0xca, 0x41, 0x58, 0xe2, 0xa0, 0x35, + 0x18, 0x69, 0xb0, 0x0d, 0xb9, 0xbd, 0x16, 0x34, 0x09, 0x9b, 0xcc, 0xf2, 0xe2, 0x8b, 0x14, 0x7d, + 0x29, 0x29, 0x3e, 0x3e, 0xac, 0xcc, 0xf0, 0xbe, 0x09, 0x12, 0x1a, 0x0c, 0xeb, 0xf5, 0x91, 0xad, + 0xf6, 0x57, 0x89, 0x51, 0x82, 0x8c, 0xbd, 0x75, 0x4d, 0xdb, 0x2a, 0x03, 0x6c, 0xab, 0x8c, 0x66, + 0x6f, 0x13, 0xf4, 0x0a, 0x94, 0x76, 0x5d, 0xbf, 0x39, 0x33, 0xc8, 0x68, 0x5d, 0xa2, 0x73, 0x7e, + 0xdb, 0xf5, 0x9b, 0xc7, 0x87, 0x95, 0x29, 0xa3, 0x3b, 0xb4, 0x10, 0x33, 0x54, 0xfb, 0xcf, 0x2c, + 0xa8, 0x30, 0xd8, 0x8a, 0xeb, 0x91, 0x1a, 0x09, 0x23, 0x37, 0x8a, 0x89, 0x1f, 0x1b, 0x03, 0x7a, + 0x1d, 0x20, 0x22, 0x8d, 0x90, 0xc4, 0xda, 0x90, 0xaa, 0x85, 0x51, 0x57, 0x10, 0xac, 0x61, 0x51, + 0x86, 0x10, 0xed, 0x38, 0x21, 0x5b, 0x5f, 0x62, 0x60, 0x15, 0x43, 0xa8, 0x4b, 0x00, 0x4e, 0x70, + 0x0c, 0x86, 0x50, 0xec, 0xc5, 0x10, 0xd0, 0xe7, 0x61, 0x22, 0x69, 0x2c, 0x6a, 0x39, 0x0d, 0x39, + 0x80, 0x6c, 0xcb, 0xd4, 0x4d, 0x10, 0x4e, 0xe3, 0xda, 0xff, 0xc8, 0x12, 0x8b, 0x87, 0x7e, 0xf5, + 0xc7, 0xfc, 0x5b, 0xed, 0x5f, 0xb7, 0x60, 0x68, 0xd1, 0xf5, 0x9b, 0xae, 0xbf, 0x8d, 0xbe, 0x02, + 0xc3, 0xf4, 0x6c, 0x6a, 0x3a, 0xb1, 0x23, 0xf8, 0xde, 0x77, 0x68, 0x7b, 0x4b, 0x1d, 0x15, 0x73, + 0xad, 0xdd, 0x6d, 0x5a, 0x10, 0xcd, 0x51, 0x6c, 0xba, 0xdb, 0xee, 0x6e, 0xbe, 0x47, 0x1a, 0xf1, + 0x1a, 0x89, 0x9d, 0xe4, 0x73, 0x92, 0x32, 0xac, 0xa8, 0xa2, 0xdb, 0x30, 0x18, 0x3b, 0xe1, 0x36, + 0x89, 0x05, 0x03, 0xcc, 0x64, 0x54, 0xbc, 0x26, 0xa6, 0x3b, 0x92, 0xf8, 0x0d, 0x92, 0x1c, 0x0b, + 0x1b, 0xac, 0x2a, 0x16, 0x24, 0xec, 0xbf, 0x39, 0x08, 0x17, 0x97, 0xea, 0xab, 0x39, 0xeb, 0xea, + 0x2a, 0x0c, 0x36, 0x43, 0x77, 0x9f, 0x84, 0x62, 0x9c, 0x15, 0x95, 0x2a, 0x2b, 0xc5, 0x02, 0x8a, + 0x6e, 0xc0, 0x28, 0x3f, 0x90, 0x6e, 0x39, 0x7e, 0xd3, 0x93, 0x43, 0x3c, 0x2d, 0xb0, 0x47, 0xef, + 0x6b, 0x30, 0x6c, 0x60, 0x9e, 0x70, 0x51, 0x5d, 0x4d, 0x6d, 0xc6, 0xbc, 0xc3, 0xee, 0x47, 0x2c, + 0x98, 0xe4, 0xcd, 0x2c, 0xc4, 0x71, 0xe8, 0x6e, 0xb6, 0x63, 0x12, 0xcd, 0x0c, 0x30, 0x4e, 0xb7, + 0x94, 0x35, 0x5a, 0xb9, 0x23, 0x30, 0x77, 0x3f, 0x45, 0x85, 0x33, 0xc1, 0x19, 0xd1, 0xee, 0x64, + 0x1a, 0x8c, 0x3b, 0x9a, 0x45, 0x3f, 0x68, 0xc1, 0x6c, 0x23, 0xf0, 0xe3, 0x30, 0xf0, 0x3c, 0x12, + 0xd6, 0xda, 0x9b, 0x9e, 0x1b, 0xed, 0xf0, 0x75, 0x8a, 0xc9, 0x16, 0xe3, 0x04, 0x39, 0x73, 0xa8, + 0x90, 0xc4, 0x1c, 0x5e, 0x3e, 0x3a, 0xac, 0xcc, 0x2e, 0xe5, 0x92, 0xc2, 0x5d, 0x9a, 0x41, 0xbb, + 0x80, 0xe8, 0x51, 0x5a, 0x8f, 0x9d, 0x6d, 0x92, 0x34, 0x3e, 0xd4, 0x7f, 0xe3, 0x17, 0x8e, 0x0e, + 0x2b, 0x68, 0xbd, 0x83, 0x04, 0xce, 0x20, 0x8b, 0xde, 0x87, 0x69, 0x5a, 0xda, 0xf1, 0xad, 0xc3, + 0xfd, 0x37, 0x37, 0x73, 0x74, 0x58, 0x99, 0x5e, 0xcf, 0x20, 0x82, 0x33, 0x49, 0xcf, 0x2e, 0xc1, + 0xf9, 0xcc, 0xa9, 0x42, 0x93, 0x50, 0xdc, 0x25, 0x5c, 0x04, 0x29, 0x63, 0xfa, 0x13, 0x4d, 0xc3, + 0xc0, 0xbe, 0xe3, 0xb5, 0xc5, 0x2a, 0xc5, 0xfc, 0xcf, 0x67, 0x0b, 0x37, 0x2c, 0xbb, 0x01, 0xa3, + 0x4b, 0x4e, 0xcb, 0xd9, 0x74, 0x3d, 0x37, 0x76, 0x49, 0x84, 0x9e, 0x87, 0xa2, 0xd3, 0x6c, 0xb2, + 0x23, 0xb2, 0xbc, 0x78, 0xfe, 0xe8, 0xb0, 0x52, 0x5c, 0x68, 0x52, 0x5e, 0x0d, 0x0a, 0xeb, 0x00, + 0x53, 0x0c, 0xf4, 0x69, 0x28, 0x35, 0xc3, 0xa0, 0x35, 0x53, 0x60, 0x98, 0x74, 0xa8, 0x4a, 0xd5, + 0x30, 0x68, 0xa5, 0x50, 0x19, 0x8e, 0xfd, 0x5b, 0x05, 0x78, 0x66, 0x89, 0xb4, 0x76, 0x56, 0xea, + 0x39, 0x9b, 0xee, 0x1a, 0x0c, 0xef, 0x05, 0xbe, 0x1b, 0x07, 0x61, 0x24, 0x9a, 0x66, 0xa7, 0xc9, + 0x9a, 0x28, 0xc3, 0x0a, 0x8a, 0xae, 0x40, 0xa9, 0x95, 0x48, 0x02, 0xa3, 0x52, 0x8a, 0x60, 0x32, + 0x00, 0x83, 0x50, 0x8c, 0x76, 0x44, 0x42, 0x71, 0x0a, 0x2a, 0x8c, 0x7b, 0x11, 0x09, 0x31, 0x83, + 0x24, 0xec, 0x94, 0x32, 0x5a, 0xb1, 0xad, 0x52, 0xec, 0x94, 0x42, 0xb0, 0x86, 0x85, 0x6a, 0x50, + 0x8e, 0xd4, 0xa4, 0x0e, 0xf4, 0x3f, 0xa9, 0x63, 0x8c, 0xdf, 0xaa, 0x99, 0x4c, 0x88, 0x18, 0x6c, + 0x60, 0xb0, 0x27, 0xbf, 0xfd, 0x8d, 0x02, 0x20, 0x3e, 0x84, 0x7f, 0xc5, 0x06, 0xee, 0x5e, 0xe7, + 0xc0, 0x65, 0x4a, 0x5e, 0x77, 0x82, 0x86, 0xe3, 0xa5, 0x59, 0xf8, 0x69, 0x8d, 0xde, 0x4f, 0x5a, + 0x80, 0x96, 0x5c, 0xbf, 0x49, 0xc2, 0x33, 0xb8, 0x76, 0x9c, 0xec, 0x20, 0xbd, 0x03, 0xe3, 0x4b, + 0x9e, 0x4b, 0xfc, 0x78, 0xb5, 0xb6, 0x14, 0xf8, 0x5b, 0xee, 0x36, 0xfa, 0x2c, 0x8c, 0xd3, 0x5b, + 0x58, 0xd0, 0x8e, 0xeb, 0xa4, 0x11, 0xf8, 0x4c, 0x60, 0xa5, 0x77, 0x17, 0x74, 0x74, 0x58, 0x19, + 0xdf, 0x30, 0x20, 0x38, 0x85, 0x69, 0xff, 0x01, 0xfd, 0xd0, 0x60, 0xaf, 0x15, 0xf8, 0xc4, 0x8f, + 0x97, 0x02, 0xbf, 0xc9, 0x2f, 0x36, 0x9f, 0x85, 0x52, 0x4c, 0x3b, 0xce, 0x3f, 0xf2, 0xaa, 0x9c, + 0x5a, 0xda, 0xdd, 0xe3, 0xc3, 0xca, 0x85, 0xce, 0x1a, 0xec, 0x83, 0x58, 0x1d, 0xf4, 0x9d, 0x30, + 0x18, 0xc5, 0x4e, 0xdc, 0x8e, 0xc4, 0x67, 0x3f, 0x2b, 0x3f, 0xbb, 0xce, 0x4a, 0x8f, 0x0f, 0x2b, + 0x13, 0xaa, 0x1a, 0x2f, 0xc2, 0xa2, 0x02, 0x7a, 0x01, 0x86, 0xf6, 0x48, 0x14, 0x39, 0xdb, 0x52, + 0x26, 0x9d, 0x10, 0x75, 0x87, 0xd6, 0x78, 0x31, 0x96, 0x70, 0xf4, 0x1c, 0x0c, 0x90, 0x30, 0x0c, + 0x42, 0xb1, 0xaa, 0xc6, 0x04, 0xe2, 0xc0, 0x32, 0x2d, 0xc4, 0x1c, 0x66, 0xff, 0x07, 0x0b, 0x26, + 0x54, 0x5f, 0x79, 0x5b, 0x67, 0x20, 0x7c, 0x7c, 0x09, 0xa0, 0x21, 0x3f, 0x30, 0x62, 0xfc, 0x6e, + 0xe4, 0xfa, 0xd5, 0xcc, 0x23, 0xb5, 0x63, 0x18, 0x13, 0xca, 0xaa, 0x28, 0xc2, 0x1a, 0x35, 0xfb, + 0x5f, 0x5a, 0x70, 0x2e, 0xf5, 0x45, 0x77, 0xdc, 0x28, 0x46, 0xef, 0x76, 0x7c, 0xd5, 0x5c, 0x7f, + 0x5f, 0x45, 0x6b, 0xb3, 0x6f, 0x52, 0x6b, 0x4e, 0x96, 0x68, 0x5f, 0x74, 0x0b, 0x06, 0xdc, 0x98, + 0xec, 0xc9, 0x8f, 0x79, 0xae, 0xeb, 0xc7, 0xf0, 0x5e, 0x25, 0x33, 0xb2, 0x4a, 0x6b, 0x62, 0x4e, + 0xc0, 0xfe, 0xf1, 0x22, 0x94, 0xf9, 0xb2, 0x5d, 0x73, 0x5a, 0x67, 0x30, 0x17, 0xab, 0x50, 0x62, + 0xd4, 0x79, 0xc7, 0x9f, 0xcf, 0xee, 0xb8, 0xe8, 0xce, 0x1c, 0xbd, 0x59, 0x70, 0xe1, 0x45, 0x31, + 0x33, 0x5a, 0x84, 0x19, 0x09, 0xe4, 0x00, 0x6c, 0xba, 0xbe, 0x13, 0x1e, 0xd0, 0xb2, 0x99, 0x22, + 0x23, 0xf8, 0x72, 0x77, 0x82, 0x8b, 0x0a, 0x9f, 0x93, 0x55, 0x7d, 0x4d, 0x00, 0x58, 0x23, 0x3a, + 0xfb, 0x06, 0x94, 0x15, 0xf2, 0x49, 0x4e, 0xe5, 0xd9, 0xcf, 0xc3, 0x44, 0xaa, 0xad, 0x5e, 0xd5, + 0x47, 0xf5, 0x43, 0xfd, 0x1b, 0x8c, 0x0b, 0x88, 0x5e, 0x2f, 0xfb, 0xfb, 0x82, 0xdd, 0x7d, 0x00, + 0xd3, 0x5e, 0x06, 0x97, 0x15, 0x53, 0xd5, 0x3f, 0x57, 0x7e, 0x46, 0x7c, 0xf6, 0x74, 0x16, 0x14, + 0x67, 0xb6, 0x41, 0x0f, 0xaa, 0xa0, 0x45, 0xd7, 0xbc, 0xe3, 0xb1, 0xfe, 0x8a, 0xfb, 0xe2, 0x5d, + 0x51, 0x86, 0x15, 0x94, 0xb2, 0xb0, 0x69, 0xd5, 0xf9, 0xdb, 0xe4, 0xa0, 0x4e, 0x3c, 0xd2, 0x88, + 0x83, 0xf0, 0x23, 0xed, 0xfe, 0x25, 0x3e, 0xfa, 0x9c, 0x03, 0x8e, 0x08, 0x02, 0xc5, 0xdb, 0xe4, + 0x80, 0x4f, 0x85, 0xfe, 0x75, 0xc5, 0xae, 0x5f, 0xf7, 0x4b, 0x16, 0x8c, 0xa9, 0xaf, 0x3b, 0x83, + 0xad, 0xbe, 0x68, 0x6e, 0xf5, 0x4b, 0x5d, 0x17, 0x78, 0xce, 0x26, 0xff, 0x4b, 0xc6, 0xa4, 0x04, + 0x4e, 0x2d, 0x0c, 0xe8, 0xd0, 0xd0, 0x53, 0xe5, 0xa3, 0x9c, 0x90, 0x7e, 0xbe, 0xeb, 0x36, 0x39, + 0xd8, 0x08, 0xa8, 0x80, 0x93, 0xfd, 0x5d, 0xc6, 0xac, 0x95, 0xba, 0xce, 0xda, 0xaf, 0x14, 0xe0, + 0xbc, 0x1a, 0x01, 0x43, 0x84, 0xf8, 0xab, 0x3e, 0x06, 0xaf, 0xc0, 0x48, 0x93, 0x6c, 0x39, 0x6d, + 0x2f, 0x56, 0xaa, 0xa3, 0x01, 0xae, 0x3e, 0xac, 0x26, 0xc5, 0x58, 0xc7, 0x39, 0xc1, 0xb0, 0xfd, + 0xdc, 0x08, 0x3b, 0x1d, 0x62, 0x87, 0xae, 0x60, 0x2a, 0x5f, 0x6a, 0x0a, 0xc0, 0x51, 0x5d, 0x01, + 0x28, 0x94, 0x7d, 0xcf, 0xc1, 0x80, 0xbb, 0x47, 0xa5, 0x85, 0x82, 0x29, 0x04, 0xac, 0xd2, 0x42, + 0xcc, 0x61, 0xe8, 0x53, 0x30, 0xd4, 0x08, 0xf6, 0xf6, 0x1c, 0xbf, 0xc9, 0x98, 0x76, 0x79, 0x71, + 0x84, 0x0a, 0x14, 0x4b, 0xbc, 0x08, 0x4b, 0x18, 0x7a, 0x06, 0x4a, 0x4e, 0xb8, 0x1d, 0xcd, 0x94, + 0x18, 0xce, 0x30, 0x6d, 0x69, 0x21, 0xdc, 0x8e, 0x30, 0x2b, 0xa5, 0x92, 0xec, 0xc3, 0x20, 0xdc, + 0x75, 0xfd, 0xed, 0xaa, 0x1b, 0x32, 0xb1, 0x54, 0x93, 0x64, 0x1f, 0x28, 0x08, 0xd6, 0xb0, 0xd0, + 0x0a, 0x0c, 0xb4, 0x82, 0x30, 0x8e, 0x66, 0x06, 0xd9, 0x70, 0x3f, 0x9b, 0xb3, 0x95, 0xf8, 0xd7, + 0xd6, 0x82, 0x30, 0x4e, 0x3e, 0x80, 0xfe, 0x8b, 0x30, 0xaf, 0x8e, 0xbe, 0x13, 0x8a, 0xc4, 0xdf, + 0x9f, 0x19, 0x62, 0x54, 0x66, 0xb3, 0xa8, 0x2c, 0xfb, 0xfb, 0xf7, 0x9d, 0x30, 0xe1, 0x33, 0xcb, + 0xfe, 0x3e, 0xa6, 0x75, 0xd0, 0x17, 0xa1, 0x2c, 0x1f, 0x0f, 0x22, 0x71, 0xb5, 0xcc, 0x5c, 0x62, + 0x58, 0x20, 0x61, 0xf2, 0x7e, 0xdb, 0x0d, 0xc9, 0x1e, 0xf1, 0xe3, 0x28, 0x51, 0xff, 0x48, 0x68, + 0x84, 0x13, 0x6a, 0xe8, 0x8b, 0x52, 0x9f, 0xb1, 0x16, 0xb4, 0xfd, 0x38, 0x9a, 0x29, 0xb3, 0xee, + 0x65, 0x6a, 0x9a, 0xef, 0x27, 0x78, 0x69, 0x85, 0x07, 0xaf, 0x8c, 0x0d, 0x52, 0x08, 0xc3, 0x98, + 0xe7, 0xee, 0x13, 0x9f, 0x44, 0x51, 0x2d, 0x0c, 0x36, 0xc9, 0x0c, 0xb0, 0x9e, 0x5f, 0xcc, 0x56, + 0xc0, 0x06, 0x9b, 0x64, 0x71, 0xea, 0xe8, 0xb0, 0x32, 0x76, 0x47, 0xaf, 0x83, 0x4d, 0x12, 0xe8, + 0x1e, 0x8c, 0x53, 0x11, 0xda, 0x4d, 0x88, 0x8e, 0xf4, 0x22, 0xca, 0xe4, 0x67, 0x6c, 0x54, 0xc2, + 0x29, 0x22, 0xe8, 0x6d, 0x28, 0x7b, 0xee, 0x16, 0x69, 0x1c, 0x34, 0x3c, 0x32, 0x33, 0xca, 0x28, + 0x66, 0x6e, 0xab, 0x3b, 0x12, 0x89, 0x5f, 0x51, 0xd4, 0x5f, 0x9c, 0x54, 0x47, 0xf7, 0xe1, 0x42, + 0x4c, 0xc2, 0x3d, 0xd7, 0x77, 0xe8, 0x76, 0x10, 0x12, 0x2f, 0x53, 0x63, 0x8f, 0xb1, 0xf5, 0x76, + 0x59, 0x0c, 0xdd, 0x85, 0x8d, 0x4c, 0x2c, 0x9c, 0x53, 0x1b, 0xdd, 0x85, 0x09, 0xb6, 0x13, 0x6a, + 0x6d, 0xcf, 0xab, 0x05, 0x9e, 0xdb, 0x38, 0x98, 0x19, 0x67, 0x04, 0x3f, 0x25, 0xf5, 0xd4, 0xab, + 0x26, 0x98, 0xde, 0xc9, 0x93, 0x7f, 0x38, 0x5d, 0x1b, 0x6d, 0x32, 0xbd, 0x65, 0x3b, 0x74, 0xe3, + 0x03, 0xba, 0x7e, 0xc9, 0xa3, 0x78, 0x66, 0xa2, 0xeb, 0x0d, 0x57, 0x47, 0x55, 0xca, 0x4d, 0xbd, + 0x10, 0xa7, 0x09, 0xd2, 0xad, 0x1d, 0xc5, 0x4d, 0xd7, 0x9f, 0x99, 0x64, 0x1c, 0x43, 0xed, 0x8c, + 0x3a, 0x2d, 0xc4, 0x1c, 0xc6, 0x74, 0x96, 0xf4, 0xc7, 0x5d, 0xca, 0x41, 0xa7, 0x18, 0x62, 0xa2, + 0xb3, 0x94, 0x00, 0x9c, 0xe0, 0xd0, 0x63, 0x39, 0x8e, 0x0f, 0x66, 0x10, 0x43, 0x55, 0xdb, 0x65, + 0x63, 0xe3, 0x8b, 0x98, 0x96, 0xa3, 0x3b, 0x30, 0x44, 0xfc, 0xfd, 0x95, 0x30, 0xd8, 0x9b, 0x39, + 0x97, 0xbf, 0x67, 0x97, 0x39, 0x0a, 0x67, 0xe8, 0xc9, 0x15, 0x45, 0x14, 0x63, 0x49, 0x02, 0x3d, + 0x82, 0x99, 0x8c, 0x19, 0xe1, 0x13, 0x30, 0xcd, 0x26, 0xe0, 0x73, 0xa2, 0xee, 0xcc, 0x46, 0x0e, + 0xde, 0x71, 0x17, 0x18, 0xce, 0xa5, 0x8e, 0xbe, 0x17, 0xc6, 0xf8, 0x86, 0xe2, 0x0f, 0x1e, 0xd1, + 0xcc, 0x79, 0xf6, 0x35, 0x57, 0xf2, 0x37, 0x27, 0x47, 0x5c, 0x3c, 0x2f, 0x3a, 0x34, 0xa6, 0x97, + 0x46, 0xd8, 0xa4, 0x66, 0x6f, 0xc2, 0xb8, 0xe2, 0x5b, 0x6c, 0xe9, 0xa0, 0x0a, 0x0c, 0x50, 0x86, + 0x2c, 0x75, 0x0a, 0x65, 0x3a, 0x53, 0x4c, 0x51, 0x8d, 0x79, 0x39, 0x9b, 0x29, 0xf7, 0x03, 0xb2, + 0x78, 0x10, 0x13, 0x7e, 0x2f, 0x2c, 0x6a, 0x33, 0x25, 0x01, 0x38, 0xc1, 0xb1, 0xff, 0x2f, 0x97, + 0x7b, 0x12, 0xe6, 0xd8, 0xc7, 0x71, 0xf0, 0x12, 0x0c, 0xef, 0x04, 0x51, 0x4c, 0xb1, 0x59, 0x1b, + 0x03, 0x89, 0xa4, 0x73, 0x4b, 0x94, 0x63, 0x85, 0x81, 0xde, 0x84, 0xb1, 0x86, 0xde, 0x80, 0x38, + 0xcb, 0xd4, 0x10, 0x18, 0xad, 0x63, 0x13, 0x17, 0xdd, 0x80, 0x61, 0xf6, 0x5c, 0xd9, 0x08, 0x3c, + 0x71, 0x03, 0x95, 0x07, 0xf2, 0x70, 0x4d, 0x94, 0x1f, 0x6b, 0xbf, 0xb1, 0xc2, 0x46, 0x57, 0x61, + 0x90, 0x76, 0x61, 0xb5, 0x26, 0x4e, 0x11, 0xa5, 0x15, 0xb8, 0xc5, 0x4a, 0xb1, 0x80, 0xda, 0x7f, + 0xab, 0xa0, 0x8d, 0x32, 0xbd, 0x53, 0x11, 0x54, 0x83, 0xa1, 0x87, 0x8e, 0x1b, 0xbb, 0xfe, 0xb6, + 0x10, 0x17, 0x5e, 0xe8, 0x7a, 0xa4, 0xb0, 0x4a, 0x0f, 0x78, 0x05, 0x7e, 0xe8, 0x89, 0x3f, 0x58, + 0x92, 0xa1, 0x14, 0xc3, 0xb6, 0xef, 0x53, 0x8a, 0x85, 0x7e, 0x29, 0x62, 0x5e, 0x81, 0x53, 0x14, + 0x7f, 0xb0, 0x24, 0x83, 0xde, 0x05, 0x90, 0xcb, 0x92, 0x34, 0xc5, 0x33, 0xe1, 0x4b, 0xbd, 0x89, + 0x6e, 0xa8, 0x3a, 0x8b, 0xe3, 0xf4, 0x48, 0x4d, 0xfe, 0x63, 0x8d, 0x9e, 0x1d, 0x33, 0xb1, 0xaa, + 0xb3, 0x33, 0xe8, 0x7b, 0x28, 0x27, 0x70, 0xc2, 0x98, 0x34, 0x17, 0x62, 0x31, 0x38, 0x9f, 0xee, + 0x4f, 0x2a, 0xde, 0x70, 0xf7, 0x88, 0xce, 0x35, 0x04, 0x11, 0x9c, 0xd0, 0xb3, 0x7f, 0xad, 0x08, + 0x33, 0x79, 0xdd, 0xa5, 0x8b, 0x8e, 0x3c, 0x72, 0xe3, 0x25, 0x2a, 0x0d, 0x59, 0xe6, 0xa2, 0x5b, + 0x16, 0xe5, 0x58, 0x61, 0xd0, 0xd9, 0x8f, 0xdc, 0x6d, 0x79, 0xa9, 0x19, 0x48, 0x66, 0xbf, 0xce, + 0x4a, 0xb1, 0x80, 0x52, 0xbc, 0x90, 0x38, 0x91, 0x78, 0x87, 0xd6, 0x56, 0x09, 0x66, 0xa5, 0x58, + 0x40, 0x75, 0x8d, 0x49, 0xa9, 0x87, 0xc6, 0xc4, 0x18, 0xa2, 0x81, 0xd3, 0x1d, 0x22, 0xf4, 0x65, + 0x80, 0x2d, 0xd7, 0x77, 0xa3, 0x1d, 0x46, 0x7d, 0xf0, 0xc4, 0xd4, 0x95, 0x2c, 0xb5, 0xa2, 0xa8, + 0x60, 0x8d, 0x22, 0x7a, 0x1d, 0x46, 0xd4, 0x06, 0x5c, 0xad, 0x32, 0xa5, 0xbc, 0xf6, 0xc8, 0x99, + 0x70, 0xa3, 0x2a, 0xd6, 0xf1, 0xec, 0xf7, 0xd2, 0xeb, 0x45, 0xec, 0x00, 0x6d, 0x7c, 0xad, 0x7e, + 0xc7, 0xb7, 0xd0, 0x7d, 0x7c, 0xed, 0xdf, 0x2e, 0xc2, 0x84, 0xd1, 0x58, 0x3b, 0xea, 0x83, 0x67, + 0xdd, 0xa4, 0xe7, 0x9c, 0x13, 0x13, 0xb1, 0xff, 0xec, 0xde, 0x5b, 0x45, 0x3f, 0x0b, 0xe9, 0x0e, + 0xe0, 0xf5, 0xd1, 0x97, 0xa1, 0xec, 0x39, 0x11, 0xd3, 0xbe, 0x10, 0xb1, 0xef, 0xfa, 0x21, 0x96, + 0xdc, 0x23, 0x9c, 0x28, 0xd6, 0x8e, 0x1a, 0x4e, 0x3b, 0x21, 0x49, 0x0f, 0x64, 0x2a, 0xfb, 0x48, + 0x43, 0x07, 0xd5, 0x09, 0x2a, 0x20, 0x1d, 0x60, 0x0e, 0x43, 0x37, 0x60, 0x34, 0x24, 0x6c, 0x55, + 0x2c, 0x51, 0x51, 0x8e, 0x2d, 0xb3, 0x81, 0x44, 0xe6, 0xc3, 0x1a, 0x0c, 0x1b, 0x98, 0x89, 0x28, + 0x3f, 0xd8, 0x45, 0x94, 0x7f, 0x01, 0x86, 0xd8, 0x0f, 0xb5, 0x02, 0xd4, 0x6c, 0xac, 0xf2, 0x62, + 0x2c, 0xe1, 0xe9, 0x05, 0x33, 0xdc, 0xe7, 0x82, 0xf9, 0x34, 0x8c, 0x57, 0x1d, 0xb2, 0x17, 0xf8, + 0xcb, 0x7e, 0xb3, 0x15, 0xb8, 0x7e, 0x8c, 0x66, 0xa0, 0xc4, 0x4e, 0x07, 0xbe, 0xb7, 0x4b, 0x94, + 0x02, 0x2e, 0x51, 0xc1, 0xdc, 0xde, 0x86, 0xf3, 0xd5, 0xe0, 0xa1, 0xff, 0xd0, 0x09, 0x9b, 0x0b, + 0xb5, 0x55, 0xed, 0x9e, 0xbb, 0x2e, 0xef, 0x59, 0xdc, 0x70, 0x20, 0x93, 0xa7, 0x6a, 0x35, 0xf9, + 0x59, 0xbb, 0xe2, 0x7a, 0x24, 0xe7, 0x3e, 0xfd, 0x77, 0x0a, 0x46, 0x4b, 0x09, 0xbe, 0x52, 0xd2, + 0x5b, 0xb9, 0x4a, 0xfa, 0x77, 0x60, 0x78, 0xcb, 0x25, 0x5e, 0x13, 0x93, 0x2d, 0xb1, 0xc4, 0x9e, + 0xcf, 0x7f, 0x0b, 0x5d, 0xa1, 0x98, 0x52, 0x7f, 0xc2, 0x6f, 0x69, 0x2b, 0xa2, 0x32, 0x56, 0x64, + 0xd0, 0x2e, 0x4c, 0xca, 0x6b, 0x80, 0x84, 0x8a, 0x05, 0xf7, 0x42, 0xb7, 0xbb, 0x85, 0x49, 0x7c, + 0xfa, 0xe8, 0xb0, 0x32, 0x89, 0x53, 0x64, 0x70, 0x07, 0x61, 0x7a, 0x2d, 0xdb, 0xa3, 0xac, 0xb5, + 0xc4, 0x86, 0x9f, 0x5d, 0xcb, 0xd8, 0x0d, 0x93, 0x95, 0xda, 0x3f, 0x63, 0xc1, 0x53, 0x1d, 0x23, + 0x23, 0x6e, 0xda, 0xa7, 0x3c, 0x0b, 0xe9, 0x9b, 0x6f, 0xa1, 0xf7, 0xcd, 0xd7, 0xfe, 0xc7, 0x16, + 0x4c, 0x2f, 0xef, 0xb5, 0xe2, 0x83, 0xaa, 0x6b, 0x3e, 0x24, 0xbc, 0x01, 0x83, 0x7b, 0xa4, 0xe9, + 0xb6, 0xf7, 0xc4, 0xcc, 0x55, 0x24, 0xfb, 0x59, 0x63, 0xa5, 0xc7, 0x87, 0x95, 0xb1, 0x7a, 0x1c, + 0x84, 0xce, 0x36, 0xe1, 0x05, 0x58, 0xa0, 0x33, 0x26, 0xee, 0x7e, 0x40, 0xee, 0xb8, 0x7b, 0xae, + 0x7c, 0xdb, 0xee, 0xaa, 0xfd, 0x99, 0x93, 0x03, 0x3a, 0xf7, 0x4e, 0xdb, 0xf1, 0x63, 0x37, 0x3e, + 0x10, 0x6f, 0x24, 0x92, 0x08, 0x4e, 0xe8, 0xd9, 0xdf, 0xb4, 0x60, 0x42, 0xae, 0xfb, 0x85, 0x66, + 0x33, 0x24, 0x51, 0x84, 0x66, 0xa1, 0xe0, 0xb6, 0x44, 0x2f, 0x41, 0xf4, 0xb2, 0xb0, 0x5a, 0xc3, + 0x05, 0xb7, 0x85, 0x6a, 0x50, 0xe6, 0x4f, 0xe4, 0xc9, 0xe2, 0xea, 0xeb, 0xa1, 0x9d, 0xf5, 0x60, + 0x43, 0xd6, 0xc4, 0x09, 0x11, 0x29, 0xc1, 0x31, 0x9e, 0x59, 0x34, 0x1f, 0x58, 0x6e, 0x89, 0x72, + 0xac, 0x30, 0xd0, 0x35, 0x18, 0xf6, 0x83, 0x26, 0xb7, 0x58, 0xe0, 0xa7, 0x1f, 0x5b, 0xb2, 0xeb, + 0xa2, 0x0c, 0x2b, 0xa8, 0xfd, 0x63, 0x16, 0x8c, 0xca, 0x2f, 0xeb, 0x53, 0x98, 0xa4, 0x5b, 0x2b, + 0x11, 0x24, 0x93, 0xad, 0x45, 0x85, 0x41, 0x06, 0x31, 0x64, 0xc0, 0xe2, 0x49, 0x64, 0x40, 0xfb, + 0xa7, 0x0b, 0x30, 0x2e, 0xbb, 0x53, 0x6f, 0x6f, 0x46, 0x24, 0x46, 0x1b, 0x50, 0x76, 0xf8, 0x90, + 0x13, 0xb9, 0x62, 0x9f, 0xcb, 0xbe, 0x7c, 0x18, 0xf3, 0x93, 0x1c, 0xcb, 0x0b, 0xb2, 0x36, 0x4e, + 0x08, 0x21, 0x0f, 0xa6, 0xfc, 0x20, 0x66, 0x2c, 0x5a, 0xc1, 0xbb, 0x29, 0xf1, 0xd3, 0xd4, 0x2f, + 0x0a, 0xea, 0x53, 0xeb, 0x69, 0x2a, 0xb8, 0x93, 0x30, 0x5a, 0x96, 0x0a, 0x8f, 0x62, 0xfe, 0x75, + 0x43, 0x9f, 0x85, 0x6c, 0x7d, 0x87, 0xfd, 0x9b, 0x16, 0x94, 0x25, 0xda, 0x59, 0xbc, 0xd7, 0xac, + 0xc1, 0x50, 0xc4, 0x26, 0x41, 0x0e, 0x8d, 0xdd, 0xad, 0xe3, 0x7c, 0xbe, 0x92, 0x93, 0x87, 0xff, + 0x8f, 0xb0, 0xa4, 0xc1, 0x34, 0xb6, 0xaa, 0xfb, 0x1f, 0x13, 0x8d, 0xad, 0xea, 0x4f, 0xce, 0x09, + 0xf3, 0xdf, 0x58, 0x9f, 0xb5, 0x6b, 0x2d, 0x15, 0x90, 0x5a, 0x21, 0xd9, 0x72, 0x1f, 0xa5, 0x05, + 0xa4, 0x1a, 0x2b, 0xc5, 0x02, 0x8a, 0xde, 0x85, 0xd1, 0x86, 0x54, 0x74, 0x26, 0x6c, 0xe0, 0x6a, + 0x57, 0xb5, 0xb1, 0x7a, 0x61, 0xe0, 0xd6, 0x8c, 0x4b, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0x5f, 0xd1, + 0x8b, 0xbd, 0x5e, 0xd1, 0x13, 0xba, 0xb9, 0xef, 0xc0, 0xf6, 0xcf, 0x5a, 0x30, 0xc8, 0xd5, 0x65, + 0xfd, 0xe9, 0x17, 0xb5, 0x07, 0x97, 0x64, 0xec, 0xee, 0xd3, 0x42, 0xf1, 0x80, 0x82, 0xd6, 0xa0, + 0xcc, 0x7e, 0x30, 0xb5, 0x41, 0x31, 0xdf, 0x8c, 0x93, 0xb7, 0xaa, 0x77, 0xf0, 0xbe, 0xac, 0x86, + 0x13, 0x0a, 0xf6, 0x4f, 0x14, 0x29, 0xab, 0x4a, 0x50, 0x8d, 0x13, 0xdc, 0x7a, 0x72, 0x27, 0x78, + 0xe1, 0x49, 0x9d, 0xe0, 0xdb, 0x30, 0xd1, 0xd0, 0x9e, 0x67, 0x92, 0x99, 0xbc, 0xd6, 0x75, 0x91, + 0x68, 0x2f, 0x39, 0x5c, 0x65, 0xb4, 0x64, 0x12, 0xc1, 0x69, 0xaa, 0xe8, 0x7b, 0x60, 0x94, 0xcf, + 0xb3, 0x68, 0xa5, 0xc4, 0x5a, 0xf9, 0x54, 0xfe, 0x7a, 0xd1, 0x9b, 0x60, 0x2b, 0xb1, 0xae, 0x55, + 0xc7, 0x06, 0x31, 0xfb, 0xd7, 0x86, 0x61, 0x60, 0x79, 0x9f, 0xf8, 0xf1, 0x19, 0x30, 0xa4, 0x06, + 0x8c, 0xbb, 0xfe, 0x7e, 0xe0, 0xed, 0x93, 0x26, 0x87, 0x9f, 0xe4, 0x70, 0xbd, 0x20, 0x48, 0x8f, + 0xaf, 0x1a, 0x24, 0x70, 0x8a, 0xe4, 0x93, 0xb8, 0x61, 0xde, 0x84, 0x41, 0x3e, 0xf7, 0xe2, 0x7a, + 0x99, 0xa9, 0x0c, 0x66, 0x83, 0x28, 0x76, 0x41, 0x72, 0xfb, 0xe5, 0xda, 0x67, 0x51, 0x1d, 0xbd, + 0x07, 0xe3, 0x5b, 0x6e, 0x18, 0xc5, 0xf4, 0x6a, 0x18, 0xc5, 0xce, 0x5e, 0xeb, 0x31, 0x6e, 0x94, + 0x6a, 0x1c, 0x56, 0x0c, 0x4a, 0x38, 0x45, 0x19, 0x6d, 0xc3, 0x18, 0xbd, 0xe4, 0x24, 0x4d, 0x0d, + 0x9d, 0xb8, 0x29, 0xa5, 0x32, 0xba, 0xa3, 0x13, 0xc2, 0x26, 0x5d, 0xca, 0x4c, 0x1a, 0xec, 0x52, + 0x34, 0xcc, 0x24, 0x0a, 0xc5, 0x4c, 0xf8, 0x6d, 0x88, 0xc3, 0x28, 0x4f, 0x62, 0x86, 0x17, 0x65, + 0x93, 0x27, 0x69, 0xe6, 0x15, 0x5f, 0x81, 0x32, 0xa1, 0x43, 0x48, 0x09, 0x0b, 0xc5, 0xf8, 0x7c, + 0x7f, 0x7d, 0x5d, 0x73, 0x1b, 0x61, 0x60, 0xde, 0xe5, 0x97, 0x25, 0x25, 0x9c, 0x10, 0x45, 0x4b, + 0x30, 0x18, 0x91, 0xd0, 0x25, 0x91, 0x50, 0x91, 0x77, 0x99, 0x46, 0x86, 0xc6, 0xed, 0x7d, 0xf9, + 0x6f, 0x2c, 0xaa, 0xd2, 0xe5, 0xe5, 0xb0, 0xdb, 0x10, 0xd3, 0x8a, 0x6b, 0xcb, 0x6b, 0x81, 0x95, + 0x62, 0x01, 0x45, 0x6f, 0xc3, 0x50, 0x48, 0x3c, 0xa6, 0x2c, 0x1a, 0xeb, 0x7f, 0x91, 0x73, 0xdd, + 0x13, 0xaf, 0x87, 0x25, 0x01, 0x74, 0x1b, 0x50, 0x48, 0xa8, 0x0c, 0xe1, 0xfa, 0xdb, 0xca, 0x1c, + 0x41, 0xe8, 0xba, 0x9f, 0x16, 0xed, 0x9f, 0xc3, 0x09, 0x86, 0xb4, 0x04, 0xc4, 0x19, 0xd5, 0xd0, + 0x4d, 0x98, 0x52, 0xa5, 0xab, 0x7e, 0x14, 0x3b, 0x7e, 0x83, 0x30, 0x35, 0x77, 0x39, 0x91, 0x8a, + 0x70, 0x1a, 0x01, 0x77, 0xd6, 0xb1, 0xbf, 0x4e, 0xc5, 0x19, 0x3a, 0x5a, 0x67, 0x20, 0x0b, 0xbc, + 0x65, 0xca, 0x02, 0x17, 0x73, 0x67, 0x2e, 0x47, 0x0e, 0x38, 0xb2, 0x60, 0x44, 0x9b, 0xd9, 0x64, + 0xcd, 0x5a, 0x5d, 0xd6, 0x6c, 0x1b, 0x26, 0xe9, 0x4a, 0xbf, 0xbb, 0xc9, 0x5c, 0x5f, 0x9a, 0x6c, + 0x61, 0x16, 0x1e, 0x6f, 0x61, 0x2a, 0xa3, 0xd1, 0x3b, 0x29, 0x82, 0xb8, 0xa3, 0x09, 0xf4, 0x86, + 0xd4, 0x9c, 0x14, 0x0d, 0x33, 0x23, 0xae, 0x15, 0x39, 0x3e, 0xac, 0x4c, 0x6a, 0x1f, 0xa2, 0x6b, + 0x4a, 0xec, 0xaf, 0xc8, 0x6f, 0xe4, 0xcc, 0x66, 0x1e, 0xca, 0x0d, 0xb5, 0x58, 0x2c, 0xd3, 0xf0, + 0x59, 0x2d, 0x07, 0x9c, 0xe0, 0xd0, 0x3d, 0x4a, 0xaf, 0x20, 0x69, 0xcb, 0x38, 0x7a, 0x41, 0xc1, + 0x0c, 0x62, 0xbf, 0x0a, 0xb0, 0xfc, 0x88, 0x34, 0xf8, 0x52, 0xd7, 0x1f, 0x20, 0xad, 0xfc, 0x07, + 0x48, 0xfb, 0x3f, 0x59, 0x30, 0xbe, 0xb2, 0x64, 0x5c, 0x13, 0xe7, 0x00, 0xf8, 0xdd, 0xe8, 0xc1, + 0x83, 0x75, 0xa9, 0x5b, 0xe7, 0xea, 0x51, 0x55, 0x8a, 0x35, 0x0c, 0x74, 0x11, 0x8a, 0x5e, 0xdb, + 0x17, 0x57, 0x96, 0xa1, 0xa3, 0xc3, 0x4a, 0xf1, 0x4e, 0xdb, 0xc7, 0xb4, 0x4c, 0x33, 0x46, 0x2b, + 0xf6, 0x6d, 0x8c, 0xd6, 0xd3, 0xa5, 0x05, 0x55, 0x60, 0xe0, 0xe1, 0x43, 0xb7, 0xc9, 0x0d, 0x87, + 0x85, 0xde, 0xff, 0xc1, 0x83, 0xd5, 0x6a, 0x84, 0x79, 0xb9, 0xfd, 0xb5, 0x22, 0xcc, 0xae, 0x78, + 0xe4, 0xd1, 0x87, 0x34, 0x9e, 0xee, 0xd7, 0x94, 0xee, 0x64, 0xf2, 0xe2, 0x49, 0xed, 0x06, 0x7b, + 0x8f, 0xc7, 0x16, 0x0c, 0xf1, 0xc7, 0x6c, 0x69, 0x4a, 0xfd, 0x66, 0x56, 0xeb, 0xf9, 0x03, 0x32, + 0xc7, 0x1f, 0xc5, 0x85, 0x09, 0xb5, 0x3a, 0x69, 0x45, 0x29, 0x96, 0xc4, 0x67, 0x3f, 0x0b, 0xa3, + 0x3a, 0xe6, 0x89, 0x2c, 0x78, 0xff, 0xff, 0x22, 0x4c, 0xd2, 0x1e, 0x3c, 0xd1, 0x89, 0xb8, 0xd7, + 0x39, 0x11, 0xa7, 0x6d, 0xc5, 0xd9, 0x7b, 0x36, 0xde, 0x4d, 0xcf, 0xc6, 0x2b, 0x79, 0xb3, 0x71, + 0xd6, 0x73, 0xf0, 0x83, 0x16, 0x9c, 0x5b, 0xf1, 0x82, 0xc6, 0x6e, 0xca, 0xc0, 0xf4, 0x75, 0x18, + 0xa1, 0x7c, 0x3c, 0x32, 0x3c, 0x37, 0x0c, 0x5f, 0x1e, 0x01, 0xc2, 0x3a, 0x9e, 0x56, 0xed, 0xde, + 0xbd, 0xd5, 0x6a, 0x96, 0x0b, 0x90, 0x00, 0x61, 0x1d, 0xcf, 0xfe, 0x5d, 0x0b, 0x2e, 0xdd, 0x5c, + 0x5a, 0x4e, 0x96, 0x62, 0x87, 0x17, 0x12, 0xbd, 0x05, 0x36, 0xb5, 0xae, 0x24, 0xb7, 0xc0, 0x2a, + 0xeb, 0x85, 0x80, 0x7e, 0x5c, 0x3c, 0xec, 0x7e, 0xc1, 0x82, 0x73, 0x37, 0xdd, 0x98, 0x1e, 0xcb, + 0x69, 0x7f, 0x18, 0x7a, 0x2e, 0x47, 0x6e, 0x1c, 0x84, 0x07, 0x69, 0x7f, 0x18, 0xac, 0x20, 0x58, + 0xc3, 0xe2, 0x2d, 0xef, 0xbb, 0x11, 0xed, 0x69, 0xc1, 0x54, 0x45, 0x61, 0x51, 0x8e, 0x15, 0x06, + 0xfd, 0xb0, 0xa6, 0x1b, 0xb2, 0xab, 0xc4, 0x81, 0xe0, 0xb0, 0xea, 0xc3, 0xaa, 0x12, 0x80, 0x13, + 0x1c, 0xfb, 0x67, 0x2c, 0x38, 0x7f, 0xd3, 0x6b, 0x47, 0x31, 0x09, 0xb7, 0x22, 0xa3, 0xb3, 0xaf, + 0x42, 0x99, 0xc8, 0xeb, 0xba, 0xe8, 0xab, 0x12, 0x30, 0xd5, 0x3d, 0x9e, 0x3b, 0xe3, 0x28, 0xbc, + 0x3e, 0xac, 0xb5, 0x4f, 0x66, 0x65, 0xfc, 0xcb, 0x05, 0x18, 0xbb, 0xb5, 0xb1, 0x51, 0xbb, 0x49, + 0x62, 0x71, 0x8a, 0xf5, 0x56, 0x35, 0x63, 0x4d, 0x63, 0xd6, 0xed, 0x52, 0xd4, 0x8e, 0x5d, 0x6f, + 0x8e, 0x7b, 0x7f, 0xce, 0xad, 0xfa, 0xf1, 0xdd, 0xb0, 0x1e, 0x87, 0xae, 0xbf, 0x9d, 0xa9, 0x63, + 0x93, 0x67, 0x6d, 0x31, 0xef, 0xac, 0x45, 0xaf, 0xc2, 0x20, 0x73, 0x3f, 0x95, 0xd7, 0x93, 0xa7, + 0xd5, 0x9d, 0x82, 0x95, 0x1e, 0x1f, 0x56, 0xca, 0xf7, 0xf0, 0x2a, 0xff, 0x83, 0x05, 0x2a, 0xba, + 0x07, 0x23, 0x3b, 0x71, 0xdc, 0xba, 0x45, 0x9c, 0x26, 0x09, 0x25, 0x77, 0xb8, 0x9c, 0xc5, 0x1d, + 0xe8, 0x20, 0x70, 0xb4, 0x64, 0x43, 0x25, 0x65, 0x11, 0xd6, 0xe9, 0xd8, 0x75, 0x80, 0x04, 0x76, + 0x4a, 0xfa, 0x05, 0xfb, 0x8f, 0x2d, 0x18, 0xe2, 0x9e, 0x40, 0x21, 0xfa, 0x1c, 0x94, 0xc8, 0x23, + 0xd2, 0x10, 0x92, 0x63, 0x66, 0x87, 0x13, 0xc1, 0x83, 0x6b, 0xcb, 0xe9, 0x7f, 0xcc, 0x6a, 0xa1, + 0x5b, 0x30, 0x44, 0x7b, 0x7b, 0x53, 0xb9, 0x45, 0x3d, 0x9b, 0xf7, 0xc5, 0x6a, 0xda, 0xb9, 0xac, + 0x22, 0x8a, 0xb0, 0xac, 0xce, 0x34, 0xbf, 0x8d, 0x56, 0x9d, 0x32, 0xb0, 0xb8, 0xdb, 0x39, 0xbb, + 0xb1, 0x54, 0xe3, 0x48, 0x82, 0x1a, 0xd7, 0xfc, 0xca, 0x42, 0x9c, 0x10, 0xb1, 0x37, 0xa0, 0x4c, + 0x27, 0x75, 0xc1, 0x73, 0x9d, 0xee, 0x4a, 0xe7, 0x17, 0xa1, 0x2c, 0x15, 0xc0, 0x91, 0x70, 0x26, + 0x61, 0x54, 0xa5, 0x7e, 0x38, 0xc2, 0x09, 0xdc, 0xde, 0x82, 0x69, 0xf6, 0xf2, 0xef, 0xc4, 0x3b, + 0xc6, 0x1e, 0xeb, 0xbd, 0x98, 0x5f, 0x12, 0x17, 0x31, 0x3e, 0x33, 0x33, 0x9a, 0xf5, 0xfb, 0xa8, + 0xa4, 0x98, 0x5c, 0xca, 0xec, 0x3f, 0x2d, 0xc1, 0xd3, 0xab, 0xf5, 0x7c, 0x27, 0xb1, 0x1b, 0x30, + 0xca, 0xc5, 0x34, 0xba, 0xb4, 0x1d, 0x4f, 0xb4, 0xab, 0xde, 0xc5, 0x36, 0x34, 0x18, 0x36, 0x30, + 0xd1, 0x25, 0x28, 0xba, 0xef, 0xfb, 0x69, 0x43, 0xd2, 0xd5, 0x77, 0xd6, 0x31, 0x2d, 0xa7, 0x60, + 0x2a, 0xf1, 0x71, 0x56, 0xaa, 0xc0, 0x4a, 0xea, 0x7b, 0x0b, 0xc6, 0xdd, 0xa8, 0x11, 0xb9, 0xab, + 0x3e, 0xe5, 0x33, 0x89, 0x83, 0x61, 0xa2, 0x24, 0xa0, 0x9d, 0x56, 0x50, 0x9c, 0xc2, 0xd6, 0xf8, + 0xfa, 0x40, 0xdf, 0x52, 0x63, 0x4f, 0xef, 0x0a, 0x2a, 0x10, 0xb7, 0xd8, 0xd7, 0x45, 0xcc, 0xa8, + 0x4d, 0x08, 0xc4, 0xfc, 0x83, 0x23, 0x2c, 0x61, 0xf4, 0x06, 0xd6, 0xd8, 0x71, 0x5a, 0x0b, 0xed, + 0x78, 0xa7, 0xea, 0x46, 0x8d, 0x60, 0x9f, 0x84, 0x07, 0xec, 0xf2, 0x3c, 0x9c, 0xdc, 0xc0, 0x14, + 0x60, 0xe9, 0xd6, 0x42, 0x8d, 0x62, 0xe2, 0xce, 0x3a, 0xa6, 0x54, 0x08, 0xa7, 0x21, 0x15, 0x2e, + 0xc0, 0x84, 0x6c, 0xa6, 0x4e, 0x22, 0x76, 0x46, 0x8c, 0xb0, 0x8e, 0x29, 0xd7, 0x5f, 0x51, 0xac, + 0xba, 0x95, 0xc6, 0x47, 0x6f, 0xc0, 0x98, 0xeb, 0xbb, 0xb1, 0xeb, 0xc4, 0x41, 0xc8, 0x4e, 0x58, + 0x7e, 0x4f, 0x66, 0x96, 0x6c, 0xab, 0x3a, 0x00, 0x9b, 0x78, 0xf6, 0x9f, 0x94, 0x60, 0x8a, 0x4d, + 0xdb, 0xb7, 0x57, 0xd8, 0xc7, 0x66, 0x85, 0xdd, 0xeb, 0x5c, 0x61, 0xa7, 0x21, 0xee, 0x7e, 0x94, + 0xcb, 0xec, 0x3d, 0x28, 0x2b, 0x5b, 0x60, 0x69, 0xce, 0x6e, 0xe5, 0x98, 0xb3, 0xf7, 0x96, 0x3e, + 0xe4, 0x33, 0x6e, 0x31, 0xf3, 0x19, 0xf7, 0xef, 0x5a, 0x90, 0x98, 0x44, 0xa2, 0x5b, 0x50, 0x6e, + 0x05, 0xcc, 0xec, 0x20, 0x94, 0xb6, 0x3c, 0x4f, 0x67, 0x1e, 0x54, 0xfc, 0x50, 0xe4, 0xe3, 0x57, + 0x93, 0x35, 0x70, 0x52, 0x19, 0x2d, 0xc2, 0x50, 0x2b, 0x24, 0xf5, 0x98, 0xb9, 0x1d, 0xf6, 0xa4, + 0xc3, 0xd7, 0x08, 0xc7, 0xc7, 0xb2, 0xa2, 0xfd, 0x2b, 0x16, 0x00, 0x7f, 0x29, 0x75, 0xfc, 0x6d, + 0x72, 0x06, 0xda, 0xdf, 0x2a, 0x94, 0xa2, 0x16, 0x69, 0x74, 0x33, 0x08, 0x49, 0xfa, 0x53, 0x6f, + 0x91, 0x46, 0x32, 0xe0, 0xf4, 0x1f, 0x66, 0xb5, 0xed, 0xbf, 0x06, 0x30, 0x9e, 0xa0, 0xad, 0xc6, + 0x64, 0x0f, 0xbd, 0x6c, 0x38, 0x75, 0x5d, 0x4c, 0x39, 0x75, 0x95, 0x19, 0xb6, 0xa6, 0x68, 0x7c, + 0x0f, 0x8a, 0x7b, 0xce, 0x23, 0xa1, 0x49, 0x7a, 0xb1, 0x7b, 0x37, 0x28, 0xfd, 0xb9, 0x35, 0xe7, + 0x11, 0xbf, 0x33, 0xbd, 0x28, 0x17, 0xc8, 0x9a, 0xf3, 0xe8, 0x98, 0x9b, 0x7d, 0x30, 0x26, 0x75, + 0xc7, 0x8d, 0xe2, 0xaf, 0xfe, 0x97, 0xe4, 0x3f, 0x5b, 0x76, 0xb4, 0x11, 0xd6, 0x96, 0xeb, 0x8b, + 0x77, 0xc3, 0xbe, 0xda, 0x72, 0xfd, 0x74, 0x5b, 0xae, 0xdf, 0x47, 0x5b, 0xae, 0x8f, 0x3e, 0x80, + 0x21, 0xf1, 0x46, 0xcf, 0x6c, 0xbd, 0x4d, 0x2d, 0x55, 0x5e, 0x7b, 0xe2, 0x89, 0x9f, 0xb7, 0x39, + 0x2f, 0xef, 0x84, 0xa2, 0xb4, 0x67, 0xbb, 0xb2, 0x41, 0xf4, 0xb7, 0x2d, 0x18, 0x17, 0xbf, 0x31, + 0x79, 0xbf, 0x4d, 0xa2, 0x58, 0xc8, 0x9e, 0x9f, 0xe9, 0xbf, 0x0f, 0xa2, 0x22, 0xef, 0xca, 0x67, + 0x24, 0x9b, 0x35, 0x81, 0x3d, 0x7b, 0x94, 0xea, 0x05, 0xfa, 0xa7, 0x16, 0x4c, 0xef, 0x39, 0x8f, + 0x78, 0x8b, 0xbc, 0x0c, 0x3b, 0xb1, 0x1b, 0x08, 0xdb, 0xf5, 0xcf, 0xf5, 0x37, 0xfd, 0x1d, 0xd5, + 0x79, 0x27, 0xa5, 0x99, 0xeb, 0x74, 0x16, 0x4a, 0xcf, 0xae, 0x66, 0xf6, 0x6b, 0x76, 0x0b, 0x86, + 0xe5, 0x7a, 0xcb, 0xb8, 0x79, 0x57, 0x75, 0xc1, 0xfa, 0xc4, 0x26, 0x12, 0xba, 0x67, 0x15, 0x6d, + 0x47, 0xac, 0xb5, 0x27, 0xda, 0xce, 0x7b, 0x30, 0xaa, 0xaf, 0xb1, 0x27, 0xda, 0xd6, 0xfb, 0x70, + 0x2e, 0x63, 0x2d, 0x3d, 0xd1, 0x26, 0x1f, 0xc2, 0xc5, 0xdc, 0xf5, 0xf1, 0x24, 0x1b, 0xb6, 0x7f, + 0xd9, 0xd2, 0xf9, 0xe0, 0x19, 0xa8, 0xe0, 0x97, 0x4c, 0x15, 0xfc, 0xe5, 0xee, 0x3b, 0x27, 0x47, + 0x0f, 0xff, 0xae, 0xde, 0x69, 0xca, 0xd5, 0xd1, 0xdb, 0x30, 0xe8, 0xd1, 0x12, 0x69, 0x1c, 0x62, + 0xf7, 0xde, 0x91, 0x89, 0x2c, 0xc5, 0xca, 0x23, 0x2c, 0x28, 0xd8, 0xbf, 0x6e, 0x41, 0xe9, 0x0c, + 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x72, 0x2e, 0x69, 0x11, 0x46, 0x6a, 0x0e, 0x3b, 0x0f, 0x97, 0x65, + 0xa8, 0xac, 0x9c, 0x81, 0xf9, 0x3e, 0x38, 0x77, 0x27, 0x70, 0x9a, 0x8b, 0x8e, 0xe7, 0xf8, 0x0d, + 0x12, 0xae, 0xfa, 0xdb, 0x3d, 0xad, 0x94, 0x74, 0x9b, 0xa2, 0x42, 0x2f, 0x9b, 0x22, 0x7b, 0x07, + 0x90, 0xde, 0x80, 0xb0, 0xe3, 0xc4, 0x30, 0xe4, 0xf2, 0xa6, 0xc4, 0xf0, 0x3f, 0x9f, 0x2d, 0xdd, + 0x75, 0xf4, 0x4c, 0xb3, 0x50, 0xe4, 0x05, 0x58, 0x12, 0xb2, 0x6f, 0x40, 0xa6, 0xef, 0x56, 0x6f, + 0xb5, 0x81, 0xfd, 0x3a, 0x4c, 0xb1, 0x9a, 0x27, 0xbb, 0xd2, 0xda, 0x3f, 0x62, 0xc1, 0xc4, 0x7a, + 0x2a, 0x1e, 0xc0, 0x55, 0xf6, 0xd6, 0x97, 0xa1, 0xf7, 0xad, 0xb3, 0x52, 0x2c, 0xa0, 0xa7, 0xae, + 0x5f, 0xfa, 0x4b, 0x0b, 0xca, 0x2a, 0x92, 0xcd, 0x19, 0x08, 0x55, 0x4b, 0x86, 0x50, 0x95, 0xa9, + 0xf7, 0x50, 0xdd, 0xc9, 0x93, 0xa9, 0xd0, 0x6d, 0xe5, 0xd9, 0xde, 0x45, 0xe5, 0x91, 0x90, 0xe1, + 0x7e, 0xd0, 0xe3, 0xa6, 0xfb, 0xbb, 0xf4, 0x75, 0x67, 0x66, 0x42, 0x0a, 0xf7, 0x63, 0x62, 0x26, + 0xa4, 0xfa, 0x93, 0xb3, 0xfb, 0x6a, 0x5a, 0x97, 0x19, 0x57, 0xfa, 0x2e, 0x66, 0xf6, 0xed, 0x78, + 0xee, 0x07, 0x44, 0x05, 0x94, 0xa8, 0x08, 0x33, 0x6e, 0x51, 0x7a, 0x7c, 0x58, 0x19, 0x53, 0xff, + 0x78, 0xd4, 0xa1, 0xa4, 0x8a, 0x7d, 0x0b, 0x26, 0x52, 0x03, 0x86, 0x5e, 0x87, 0x81, 0xd6, 0x8e, + 0x13, 0x91, 0x94, 0x69, 0xe4, 0x40, 0x8d, 0x16, 0x1e, 0x1f, 0x56, 0xc6, 0x55, 0x05, 0x56, 0x82, + 0x39, 0xb6, 0xfd, 0x3f, 0x2d, 0x28, 0xad, 0x07, 0xcd, 0xb3, 0x58, 0x4c, 0x6f, 0x19, 0x8b, 0xe9, + 0x99, 0xbc, 0x98, 0x6d, 0xb9, 0xeb, 0x68, 0x25, 0xb5, 0x8e, 0x2e, 0xe7, 0x52, 0xe8, 0xbe, 0x84, + 0xf6, 0x60, 0x84, 0x45, 0x82, 0x13, 0xa6, 0x9a, 0xaf, 0x1a, 0xf2, 0x7d, 0x25, 0x25, 0xdf, 0x4f, + 0x68, 0xa8, 0x9a, 0x94, 0xff, 0x02, 0x0c, 0x09, 0x73, 0xc1, 0xb4, 0x81, 0xbb, 0xc0, 0xc5, 0x12, + 0x6e, 0xff, 0x6c, 0x11, 0x8c, 0xc8, 0x73, 0xe8, 0x37, 0x2d, 0x98, 0x0b, 0xb9, 0xc7, 0x60, 0xb3, + 0xda, 0x0e, 0x5d, 0x7f, 0xbb, 0xde, 0xd8, 0x21, 0xcd, 0xb6, 0xe7, 0xfa, 0xdb, 0xab, 0xdb, 0x7e, + 0xa0, 0x8a, 0x97, 0x1f, 0x91, 0x46, 0x9b, 0xe9, 0xfc, 0x7b, 0x84, 0xb9, 0x53, 0xe6, 0x38, 0xd7, + 0x8f, 0x0e, 0x2b, 0x73, 0xf8, 0x44, 0xb4, 0xf1, 0x09, 0xfb, 0x82, 0x7e, 0xd7, 0x82, 0x79, 0x1e, + 0x90, 0xad, 0xff, 0xfe, 0x77, 0xb9, 0x0d, 0xd5, 0x24, 0xa9, 0x84, 0xc8, 0x06, 0x09, 0xf7, 0x16, + 0xdf, 0x10, 0x03, 0x3a, 0x5f, 0x3b, 0x59, 0x5b, 0xf8, 0xa4, 0x9d, 0xb3, 0xff, 0x4d, 0x11, 0xc6, + 0xe8, 0x28, 0x26, 0x71, 0x3c, 0x5e, 0x37, 0x96, 0xc4, 0xb3, 0xa9, 0x25, 0x31, 0x65, 0x20, 0x9f, + 0x4e, 0x08, 0x8f, 0x08, 0xa6, 0x3c, 0x27, 0x8a, 0x6f, 0x11, 0x27, 0x8c, 0x37, 0x89, 0xc3, 0xcd, + 0x54, 0x8a, 0x27, 0x36, 0xa9, 0x51, 0xea, 0x97, 0x3b, 0x69, 0x62, 0xb8, 0x93, 0x3e, 0xda, 0x07, + 0xc4, 0x6c, 0x6d, 0x42, 0xc7, 0x8f, 0xf8, 0xb7, 0xb8, 0xe2, 0x3d, 0xe0, 0x64, 0xad, 0xce, 0x8a, + 0x56, 0xd1, 0x9d, 0x0e, 0x6a, 0x38, 0xa3, 0x05, 0xcd, 0x86, 0x6a, 0xa0, 0x5f, 0x1b, 0xaa, 0xc1, + 0x1e, 0x5e, 0x24, 0x7b, 0x30, 0x29, 0x66, 0x65, 0xcb, 0xdd, 0x16, 0x87, 0xf4, 0x17, 0x53, 0x36, + 0x96, 0x56, 0xff, 0x86, 0x32, 0x3d, 0x0c, 0x2c, 0xed, 0xef, 0x87, 0x73, 0xb4, 0x39, 0xd3, 0xe7, + 0x21, 0x42, 0x04, 0x26, 0x76, 0xdb, 0x9b, 0xc4, 0x23, 0xb1, 0x2c, 0x13, 0x8d, 0x66, 0x8a, 0x9d, + 0x66, 0xed, 0x44, 0x39, 0x75, 0xdb, 0x24, 0x81, 0xd3, 0x34, 0xed, 0x9f, 0xb7, 0x80, 0x59, 0x6b, + 0x9f, 0xc1, 0xf1, 0xf7, 0x79, 0xf3, 0xf8, 0x9b, 0xc9, 0xe3, 0x40, 0x39, 0x27, 0xdf, 0x6b, 0x7c, + 0x5a, 0x6a, 0x61, 0xf0, 0xe8, 0x40, 0xbc, 0xfa, 0xf6, 0x21, 0x71, 0xfd, 0x1f, 0x8b, 0x6f, 0x48, + 0xe5, 0x40, 0x8d, 0x7e, 0x00, 0x86, 0x1b, 0x4e, 0xcb, 0x69, 0xf0, 0x90, 0x9f, 0xb9, 0xda, 0x07, + 0xa3, 0xd2, 0xdc, 0x92, 0xa8, 0xc1, 0x6f, 0xd3, 0xdf, 0x21, 0xbf, 0x52, 0x16, 0xf7, 0xbc, 0x41, + 0xab, 0x26, 0x67, 0x77, 0x61, 0xcc, 0x20, 0xf6, 0x44, 0xaf, 0x5e, 0x3f, 0xc0, 0x8f, 0x0b, 0x15, + 0x8f, 0x63, 0x0f, 0xa6, 0x7c, 0xed, 0x3f, 0x65, 0x8e, 0x52, 0x9c, 0xfe, 0x64, 0xaf, 0x03, 0x81, + 0x71, 0x52, 0xcd, 0x1a, 0x3d, 0x45, 0x06, 0x77, 0x52, 0xb6, 0xff, 0xbe, 0x05, 0x4f, 0xe9, 0x88, + 0x9a, 0x6f, 0x7b, 0x2f, 0x7d, 0x66, 0x15, 0x86, 0x83, 0x16, 0x09, 0x9d, 0x38, 0x08, 0x05, 0x07, + 0xbc, 0x26, 0x07, 0xfd, 0xae, 0x28, 0x3f, 0x16, 0xb1, 0xd7, 0x24, 0x75, 0x59, 0x8e, 0x55, 0x4d, + 0x64, 0xc3, 0x20, 0x1b, 0x8c, 0x48, 0xc4, 0x1d, 0x60, 0x66, 0x72, 0xec, 0x69, 0x2f, 0xc2, 0x02, + 0x62, 0xff, 0xa9, 0xc5, 0x17, 0x96, 0xde, 0x75, 0xf4, 0x3e, 0x4c, 0xee, 0x39, 0x71, 0x63, 0x67, + 0xf9, 0x51, 0x2b, 0xe4, 0x6a, 0x5c, 0x39, 0x4e, 0x2f, 0xf6, 0x1a, 0x27, 0xed, 0x23, 0x13, 0x63, + 0xaa, 0xb5, 0x14, 0x31, 0xdc, 0x41, 0x1e, 0x6d, 0xc2, 0x08, 0x2b, 0x63, 0x56, 0xbb, 0x51, 0xb7, + 0x63, 0x2e, 0xaf, 0x35, 0xf5, 0x3a, 0xba, 0x96, 0xd0, 0xc1, 0x3a, 0x51, 0xfb, 0xab, 0x45, 0xbe, + 0xdb, 0x99, 0xe4, 0xf8, 0x02, 0x0c, 0xb5, 0x82, 0xe6, 0xd2, 0x6a, 0x15, 0x8b, 0x59, 0x50, 0x2c, + 0xb1, 0xc6, 0x8b, 0xb1, 0x84, 0xa3, 0x37, 0x01, 0xc8, 0xa3, 0x98, 0x84, 0xbe, 0xe3, 0x29, 0xe3, + 0x06, 0x65, 0xce, 0x57, 0x0d, 0xd6, 0x83, 0xf8, 0x5e, 0x44, 0xbe, 0x6f, 0x59, 0xa1, 0x60, 0x0d, + 0x1d, 0x5d, 0x07, 0x68, 0x85, 0xc1, 0xbe, 0xdb, 0x64, 0x6e, 0x60, 0x45, 0xf3, 0xe9, 0xbf, 0xa6, + 0x20, 0x58, 0xc3, 0x42, 0x6f, 0xc2, 0x58, 0xdb, 0x8f, 0xf8, 0x69, 0xeb, 0x6c, 0x8a, 0xc8, 0x65, + 0xc3, 0xc9, 0x2b, 0xfc, 0x3d, 0x1d, 0x88, 0x4d, 0x5c, 0xb4, 0x00, 0x83, 0xb1, 0xc3, 0xde, 0xee, + 0x07, 0xf2, 0x6d, 0xf0, 0x36, 0x28, 0x86, 0x1e, 0x70, 0x92, 0x56, 0xc0, 0xa2, 0x22, 0xfa, 0x92, + 0xe4, 0xf7, 0x9c, 0xff, 0x0b, 0xe3, 0xd7, 0xdc, 0x3d, 0xa2, 0x9f, 0x15, 0x3a, 0xc3, 0x17, 0x46, + 0xb5, 0x06, 0x2d, 0xfb, 0x87, 0xca, 0x00, 0x89, 0x68, 0x89, 0x3e, 0xe8, 0xe0, 0x47, 0x2f, 0x75, + 0x17, 0x46, 0x4f, 0x8f, 0x19, 0xa1, 0x1f, 0xb6, 0x60, 0xc4, 0xf1, 0xbc, 0xa0, 0xe1, 0xc4, 0x6c, + 0x94, 0x0b, 0xdd, 0xf9, 0xa1, 0x68, 0x7f, 0x21, 0xa9, 0xc1, 0xbb, 0xf0, 0xaa, 0x5c, 0x78, 0x1a, + 0xa4, 0x67, 0x2f, 0xf4, 0x86, 0xd1, 0x77, 0xc8, 0x1b, 0x07, 0x5f, 0x1e, 0xb3, 0xe9, 0x1b, 0x47, + 0x99, 0xb1, 0x7e, 0xed, 0xb2, 0x81, 0xee, 0x19, 0x21, 0xbe, 0x4a, 0xf9, 0xb1, 0x02, 0x0c, 0x09, + 0xab, 0x57, 0x74, 0x2f, 0x54, 0xd3, 0x9d, 0x80, 0x06, 0xf2, 0x03, 0x6a, 0x68, 0xa2, 0x7c, 0x0f, + 0x07, 0xa0, 0xf7, 0x60, 0xa2, 0x69, 0x9e, 0xed, 0x62, 0x35, 0x3d, 0x9f, 0x47, 0x37, 0x25, 0x0a, + 0x24, 0xa7, 0x79, 0x0a, 0x80, 0xd3, 0x84, 0x51, 0x8d, 0xbb, 0x63, 0xad, 0xfa, 0x5b, 0x81, 0x30, + 0xa2, 0xb6, 0x73, 0xe7, 0xf2, 0x20, 0x8a, 0xc9, 0x1e, 0xc5, 0x4c, 0x0e, 0xed, 0x75, 0x51, 0x17, + 0x2b, 0x2a, 0xe8, 0x6d, 0x18, 0x64, 0xfe, 0x9c, 0xd1, 0xcc, 0x70, 0xbe, 0xd2, 0xcb, 0x0c, 0x45, + 0x90, 0x6c, 0x2a, 0xf6, 0x37, 0xc2, 0x82, 0x02, 0xba, 0x25, 0xe3, 0x95, 0x44, 0xab, 0xfe, 0xbd, + 0x88, 0xb0, 0x78, 0x25, 0xe5, 0xc5, 0x4f, 0x26, 0xa1, 0x48, 0x78, 0x79, 0x66, 0x68, 0x69, 0xa3, + 0x26, 0x15, 0x8e, 0xc4, 0x7f, 0x19, 0xb1, 0x7a, 0x06, 0xf2, 0xbb, 0x67, 0x46, 0xb5, 0x4e, 0x86, + 0xf3, 0xbe, 0x49, 0x02, 0xa7, 0x69, 0x9e, 0xe9, 0x59, 0x3d, 0xeb, 0xc3, 0x64, 0x7a, 0x63, 0x3d, + 0x51, 0xd9, 0xe0, 0x8f, 0x4b, 0x30, 0x6e, 0x2e, 0x04, 0x34, 0x0f, 0x65, 0x41, 0x44, 0x45, 0x57, + 0x54, 0x6b, 0x7b, 0x4d, 0x02, 0x70, 0x82, 0xc3, 0xa2, 0x4b, 0xb2, 0xea, 0x9a, 0xd1, 0x5b, 0x12, + 0x5d, 0x52, 0x41, 0xb0, 0x86, 0x45, 0x25, 0xf6, 0xcd, 0x20, 0x88, 0xd5, 0x51, 0xa0, 0x56, 0xcb, + 0x22, 0x2b, 0xc5, 0x02, 0x4a, 0x8f, 0x80, 0x5d, 0x12, 0xfa, 0xc4, 0xbb, 0x4f, 0x42, 0xf6, 0xee, + 0x5a, 0x32, 0x0d, 0xb1, 0x6e, 0xeb, 0x40, 0x6c, 0xe2, 0xd2, 0xb3, 0x2d, 0x88, 0xd8, 0xf2, 0x13, + 0xf7, 0x82, 0xc4, 0x88, 0xb0, 0xce, 0xfd, 0x99, 0x25, 0x1c, 0x7d, 0x11, 0x9e, 0x52, 0xee, 0xc7, + 0x98, 0xab, 0x41, 0x65, 0x8b, 0x83, 0xc6, 0x35, 0xfe, 0xa9, 0xa5, 0x6c, 0x34, 0x9c, 0x57, 0x1f, + 0xbd, 0x05, 0xe3, 0x42, 0xde, 0x96, 0x14, 0x87, 0xcc, 0x97, 0xf9, 0xdb, 0x06, 0x14, 0xa7, 0xb0, + 0x51, 0x15, 0x26, 0x69, 0x09, 0x13, 0x79, 0x25, 0x05, 0xee, 0x46, 0xad, 0x04, 0x8b, 0xdb, 0x29, + 0x38, 0xee, 0xa8, 0x81, 0x16, 0x60, 0x82, 0x0b, 0x44, 0xf4, 0x02, 0xcb, 0xe6, 0x41, 0xf8, 0x36, + 0xa8, 0x8d, 0x70, 0xd7, 0x04, 0xe3, 0x34, 0x3e, 0xba, 0x01, 0xa3, 0x4e, 0xd8, 0xd8, 0x71, 0x63, + 0xd2, 0x88, 0xdb, 0x21, 0x77, 0x7a, 0xd0, 0x4c, 0x1b, 0x16, 0x34, 0x18, 0x36, 0x30, 0xed, 0x0f, + 0xe0, 0x5c, 0x86, 0x5b, 0x14, 0x5d, 0x38, 0x4e, 0xcb, 0x95, 0xdf, 0x94, 0x32, 0x07, 0x5c, 0xa8, + 0xad, 0xca, 0xaf, 0xd1, 0xb0, 0xe8, 0xea, 0x64, 0xee, 0x53, 0x5a, 0x58, 0x79, 0xb5, 0x3a, 0x57, + 0x24, 0x00, 0x27, 0x38, 0xf6, 0xff, 0x2a, 0xc0, 0x44, 0x86, 0x6a, 0x97, 0x85, 0x36, 0x4f, 0xdd, + 0x18, 0x92, 0x48, 0xe6, 0xb4, 0x19, 0x5f, 0x05, 0x03, 0x4f, 0x35, 0x93, 0x84, 0x02, 0x4f, 0x70, + 0x94, 0xb6, 0xb8, 0x98, 0x6b, 0x64, 0xb6, 0x08, 0xc5, 0xb6, 0xdb, 0x14, 0x0b, 0x58, 0x9e, 0xd7, + 0xc5, 0x7b, 0xab, 0xd5, 0xe3, 0xc3, 0xca, 0xb3, 0x79, 0x19, 0x1a, 0xe2, 0x83, 0x16, 0x89, 0xe6, + 0xe8, 0xee, 0xa1, 0x95, 0x53, 0x23, 0x36, 0xd0, 0xd7, 0x88, 0x2d, 0xc0, 0x84, 0x64, 0x01, 0xe6, + 0x92, 0x56, 0x33, 0x8f, 0x4d, 0x30, 0x4e, 0xe3, 0x9b, 0x83, 0x3e, 0xd4, 0xc7, 0xa0, 0xff, 0x44, + 0x01, 0x26, 0xd3, 0x26, 0x58, 0x67, 0xa0, 0x10, 0x7c, 0xdb, 0x50, 0x08, 0x66, 0x27, 0x0a, 0x48, + 0x1b, 0x86, 0xe5, 0x29, 0x07, 0x71, 0x4a, 0x39, 0xf8, 0xe9, 0xbe, 0xa8, 0x75, 0x57, 0x14, 0xfe, + 0x83, 0x02, 0x9c, 0x4f, 0x57, 0x59, 0xf2, 0x1c, 0x77, 0xef, 0x0c, 0xc6, 0xe6, 0xae, 0x31, 0x36, + 0x2f, 0xf7, 0xf3, 0x35, 0xac, 0x6b, 0xb9, 0x03, 0xf4, 0x20, 0x35, 0x40, 0xf3, 0xfd, 0x93, 0xec, + 0x3e, 0x4a, 0xdf, 0x2c, 0xc2, 0xe5, 0xcc, 0x7a, 0x89, 0x3e, 0x6d, 0xc5, 0xd0, 0xa7, 0x5d, 0x4f, + 0xe9, 0xd3, 0xec, 0xee, 0xb5, 0x4f, 0x47, 0xc1, 0x26, 0xfc, 0xd5, 0x58, 0xf8, 0xb1, 0xc7, 0x54, + 0xae, 0x19, 0xfe, 0x6a, 0x8a, 0x10, 0x36, 0xe9, 0x7e, 0x2b, 0x29, 0xd5, 0xfe, 0xbd, 0x05, 0x17, + 0x33, 0xe7, 0xe6, 0x0c, 0x14, 0x4f, 0xeb, 0xa6, 0xe2, 0xe9, 0x85, 0xbe, 0x57, 0x6b, 0x8e, 0x26, + 0xea, 0x4f, 0x8a, 0x39, 0xdf, 0xc2, 0xae, 0xd5, 0x77, 0x61, 0xc4, 0x69, 0x34, 0x48, 0x14, 0xad, + 0x05, 0x4d, 0x15, 0x8e, 0xeb, 0x65, 0x76, 0x3b, 0x4a, 0x8a, 0x8f, 0x0f, 0x2b, 0xb3, 0x69, 0x12, + 0x09, 0x18, 0xeb, 0x14, 0xcc, 0x08, 0x82, 0x85, 0x53, 0x8d, 0x20, 0x78, 0x1d, 0x60, 0x5f, 0xc9, + 0xd8, 0xe9, 0xab, 0xb9, 0x26, 0x7d, 0x6b, 0x58, 0xe8, 0x7b, 0x61, 0x38, 0x12, 0xc7, 0xb8, 0x58, + 0x8a, 0xaf, 0xf6, 0x39, 0x57, 0xce, 0x26, 0xf1, 0x4c, 0xc7, 0x68, 0xa5, 0xc5, 0x50, 0x24, 0xd1, + 0x77, 0xc3, 0x64, 0xc4, 0xe3, 0x6e, 0x2c, 0x79, 0x4e, 0xc4, 0xac, 0xec, 0xc5, 0x2a, 0x64, 0xde, + 0xce, 0xf5, 0x14, 0x0c, 0x77, 0x60, 0xa3, 0x15, 0xf9, 0x51, 0x2c, 0x48, 0x08, 0x5f, 0x98, 0x57, + 0x93, 0x0f, 0x12, 0x89, 0x55, 0xa6, 0xd3, 0xc3, 0xcf, 0x06, 0x5e, 0xab, 0x69, 0xff, 0x44, 0x09, + 0x9e, 0xee, 0xc2, 0xc4, 0xd0, 0x82, 0xf9, 0x4a, 0xf6, 0x62, 0xfa, 0xce, 0x3a, 0x9b, 0x59, 0xd9, + 0xb8, 0xc4, 0xa6, 0xd6, 0x4a, 0xe1, 0x43, 0xaf, 0x95, 0x1f, 0xb5, 0x34, 0x6d, 0x02, 0xb7, 0xe5, + 0xfa, 0xfc, 0x09, 0x99, 0xf3, 0x29, 0xaa, 0x17, 0xb6, 0x32, 0xee, 0xe8, 0xd7, 0xfb, 0xee, 0x4e, + 0xdf, 0x97, 0xf6, 0xb3, 0xd5, 0xa9, 0x7e, 0xd5, 0x82, 0x67, 0x33, 0xfb, 0x6b, 0xbc, 0xea, 0xcf, + 0x43, 0xb9, 0x41, 0x0b, 0x35, 0xcf, 0x9d, 0xc4, 0xa5, 0x51, 0x02, 0x70, 0x82, 0x63, 0x3c, 0xde, + 0x17, 0x7a, 0x3e, 0xde, 0xff, 0x6b, 0x0b, 0x3a, 0x16, 0xf0, 0x19, 0x70, 0xd2, 0x55, 0x93, 0x93, + 0x7e, 0xb2, 0x9f, 0xb9, 0xcc, 0x61, 0xa2, 0x7f, 0x30, 0x01, 0x17, 0x72, 0x4c, 0xf5, 0xf7, 0x61, + 0x6a, 0xbb, 0x41, 0x4c, 0x9f, 0x28, 0xf1, 0x31, 0x99, 0xee, 0x63, 0x5d, 0x1d, 0xa8, 0x58, 0x46, + 0x8c, 0xa9, 0x0e, 0x14, 0xdc, 0xd9, 0x04, 0xfa, 0xaa, 0x05, 0xd3, 0xce, 0xc3, 0xa8, 0x23, 0xef, + 0x99, 0x58, 0x33, 0xaf, 0x65, 0xea, 0x16, 0x7a, 0xe4, 0x49, 0xe3, 0x29, 0x42, 0xb2, 0xb0, 0x70, + 0x66, 0x5b, 0x08, 0x8b, 0x08, 0x8a, 0x54, 0xde, 0xee, 0xe2, 0xb5, 0x97, 0xe5, 0x53, 0xc1, 0x79, + 0xaa, 0x84, 0x60, 0x45, 0x07, 0xdd, 0x87, 0xf2, 0xb6, 0x74, 0x74, 0x12, 0x3c, 0x3b, 0xf3, 0x10, + 0xcc, 0xf4, 0x86, 0xe2, 0xc6, 0xbd, 0x0a, 0x84, 0x13, 0x52, 0xe8, 0x2d, 0x28, 0xfa, 0x5b, 0x51, + 0xb7, 0xdc, 0x1a, 0x29, 0x63, 0x17, 0xee, 0x11, 0xbb, 0xbe, 0x52, 0xc7, 0xb4, 0x22, 0xba, 0x05, + 0xc5, 0x70, 0xb3, 0x29, 0xd4, 0x61, 0x99, 0x72, 0x29, 0x5e, 0xac, 0x66, 0x2f, 0x12, 0x4e, 0x09, + 0x2f, 0x56, 0x31, 0x25, 0x81, 0x6a, 0x30, 0xc0, 0xac, 0xda, 0x85, 0xd6, 0x2b, 0x53, 0x20, 0xed, + 0xe2, 0x1d, 0xc2, 0xdd, 0x66, 0x19, 0x02, 0xe6, 0x84, 0xd0, 0xdb, 0x30, 0xd8, 0x60, 0xe9, 0x27, + 0x44, 0xd0, 0xde, 0xec, 0x78, 0x2a, 0x1d, 0x09, 0x2a, 0xf8, 0x13, 0x03, 0x2f, 0xc7, 0x82, 0x02, + 0xda, 0x80, 0xc1, 0x06, 0x69, 0xed, 0x6c, 0x45, 0xec, 0xe2, 0x6d, 0x0a, 0xf8, 0x09, 0xad, 0x2e, + 0xd9, 0x56, 0x04, 0x55, 0x86, 0x81, 0x05, 0x2d, 0xf4, 0x59, 0x28, 0x6c, 0x35, 0x84, 0xa9, 0x7b, + 0xa6, 0xde, 0xcb, 0x74, 0x65, 0x5e, 0x1c, 0x3c, 0x3a, 0xac, 0x14, 0x56, 0x96, 0x70, 0x61, 0xab, + 0x81, 0xd6, 0x61, 0x68, 0x8b, 0x3b, 0x3f, 0x8a, 0x08, 0x03, 0xcf, 0x67, 0xfb, 0x65, 0x76, 0xf8, + 0x47, 0x72, 0x13, 0x6d, 0x01, 0xc0, 0x92, 0x08, 0x0b, 0x3e, 0xa8, 0x9c, 0x38, 0x45, 0x14, 0xde, + 0xb9, 0x93, 0x39, 0xde, 0x72, 0xb7, 0xea, 0xc4, 0x15, 0x14, 0x6b, 0x14, 0xd1, 0x57, 0xa0, 0xec, + 0xc8, 0x3c, 0x5b, 0x22, 0x4a, 0xc1, 0xab, 0x99, 0xdb, 0xb1, 0x7b, 0x0a, 0x32, 0xbe, 0x96, 0x15, + 0x12, 0x4e, 0x88, 0xa2, 0x5d, 0x18, 0xdb, 0x8f, 0x5a, 0x3b, 0x44, 0x6e, 0x5f, 0x16, 0xb4, 0x20, + 0xe7, 0xb8, 0xba, 0x2f, 0x10, 0xdd, 0x30, 0x6e, 0x3b, 0x5e, 0x07, 0xc7, 0x61, 0x96, 0xfd, 0xf7, + 0x75, 0x62, 0xd8, 0xa4, 0x4d, 0x87, 0xff, 0xfd, 0x76, 0xb0, 0x79, 0x10, 0x13, 0x11, 0xb6, 0x37, + 0x73, 0xf8, 0xdf, 0xe1, 0x28, 0x9d, 0xc3, 0x2f, 0x00, 0x58, 0x12, 0xa1, 0x1b, 0xdc, 0x91, 0x39, + 0xec, 0x58, 0xb8, 0xde, 0x9c, 0x0d, 0x9e, 0x99, 0xe8, 0x4e, 0x1b, 0x14, 0xc6, 0x19, 0x13, 0x52, + 0x8c, 0x23, 0xb6, 0x76, 0x82, 0x38, 0xf0, 0x53, 0xdc, 0x78, 0x2a, 0x9f, 0x23, 0xd6, 0x32, 0xf0, + 0x3b, 0x39, 0x62, 0x16, 0x16, 0xce, 0x6c, 0x0b, 0x35, 0x61, 0xbc, 0x15, 0x84, 0xf1, 0xc3, 0x20, + 0x94, 0xeb, 0x0b, 0x75, 0xb9, 0xe4, 0x1b, 0x98, 0xa2, 0x45, 0x16, 0x46, 0xda, 0x84, 0xe0, 0x14, + 0x4d, 0xf4, 0x05, 0x18, 0x8a, 0x1a, 0x8e, 0x47, 0x56, 0xef, 0xce, 0x9c, 0xcb, 0x3f, 0x6a, 0xea, + 0x1c, 0x25, 0x67, 0x75, 0xb1, 0xc9, 0x11, 0x28, 0x58, 0x92, 0x43, 0x2b, 0x30, 0xc0, 0x62, 0xc1, + 0xb3, 0x88, 0xc3, 0x39, 0xd1, 0x70, 0x3a, 0x8c, 0x09, 0x39, 0x47, 0x62, 0xc5, 0x98, 0x57, 0xa7, + 0x7b, 0x40, 0xc8, 0xba, 0x41, 0x34, 0x73, 0x3e, 0x7f, 0x0f, 0x08, 0x11, 0xf9, 0x6e, 0xbd, 0xdb, + 0x1e, 0x50, 0x48, 0x38, 0x21, 0x4a, 0xf9, 0x31, 0xe5, 0xa1, 0x17, 0xf2, 0xf9, 0x71, 0x3e, 0x07, + 0x65, 0xfc, 0x98, 0xf2, 0x4f, 0x4a, 0xc2, 0xfe, 0xc3, 0xa1, 0x4e, 0xf9, 0x84, 0xdd, 0x8e, 0x7e, + 0xc8, 0xea, 0x78, 0xee, 0xfa, 0x4c, 0xbf, 0xca, 0x9a, 0x53, 0x94, 0x4c, 0xbf, 0x6a, 0xc1, 0x85, + 0x56, 0xe6, 0x87, 0x88, 0xc3, 0xbe, 0x3f, 0x9d, 0x0f, 0xff, 0x74, 0x15, 0x15, 0x3c, 0x1b, 0x8e, + 0x73, 0x5a, 0x4a, 0x4b, 0xff, 0xc5, 0x0f, 0x2d, 0xfd, 0xaf, 0xc1, 0x30, 0x13, 0x28, 0x93, 0xd0, + 0x4b, 0x7d, 0x59, 0xa8, 0x30, 0xb1, 0x61, 0x49, 0x54, 0xc4, 0x8a, 0x04, 0xfa, 0x31, 0x0b, 0x2e, + 0xa5, 0xbb, 0x8e, 0x09, 0x03, 0x8b, 0x18, 0xda, 0xfc, 0x62, 0xb6, 0x22, 0xbe, 0xff, 0x52, 0xad, + 0x1b, 0xf2, 0x71, 0x2f, 0x04, 0xdc, 0xbd, 0x31, 0x54, 0xcd, 0xb8, 0x19, 0x0e, 0x9a, 0xda, 0xf0, + 0x3e, 0x6e, 0x87, 0xaf, 0xc1, 0xe8, 0x5e, 0xd0, 0xf6, 0x63, 0x61, 0x42, 0x22, 0x9c, 0xd3, 0xd8, + 0x9b, 0xed, 0x9a, 0x56, 0x8e, 0x0d, 0xac, 0xd4, 0x9d, 0x72, 0xf8, 0x71, 0xef, 0x94, 0xe8, 0xdd, + 0x54, 0xce, 0xd9, 0x72, 0xbe, 0x6c, 0x21, 0xae, 0xdf, 0x27, 0xc8, 0x3c, 0x7b, 0xb6, 0xf7, 0xa0, + 0xaf, 0x5b, 0x19, 0x02, 0x3c, 0xbf, 0x19, 0x7f, 0xce, 0xbc, 0x19, 0x5f, 0x4d, 0xdf, 0x8c, 0x3b, + 0x34, 0xa1, 0xc6, 0xa5, 0xb8, 0xff, 0x80, 0xbf, 0xfd, 0x46, 0xd0, 0xb2, 0x3d, 0xb8, 0xd2, 0xeb, + 0x58, 0x62, 0xb6, 0x44, 0x4d, 0xf5, 0xee, 0x95, 0xd8, 0x12, 0x35, 0x57, 0xab, 0x98, 0x41, 0xfa, + 0x0d, 0xb1, 0x60, 0xff, 0x77, 0x0b, 0x8a, 0xb5, 0xa0, 0x79, 0x06, 0x9a, 0xdd, 0xcf, 0x1b, 0x9a, + 0xdd, 0xa7, 0x73, 0x72, 0x01, 0xe7, 0xea, 0x71, 0x97, 0x53, 0x7a, 0xdc, 0x4b, 0x79, 0x04, 0xba, + 0x6b, 0x6d, 0x7f, 0xae, 0x08, 0x7a, 0xe6, 0x62, 0xf4, 0x6f, 0x1f, 0xc7, 0x28, 0xb5, 0xd8, 0x2d, + 0x99, 0xb1, 0xa0, 0xcc, 0x4c, 0x90, 0xa4, 0xbf, 0xd5, 0x5f, 0x31, 0xdb, 0xd4, 0x07, 0xc4, 0xdd, + 0xde, 0x89, 0x49, 0x33, 0xfd, 0x39, 0x67, 0x67, 0x9b, 0xfa, 0x5f, 0x2d, 0x98, 0x48, 0xb5, 0x8e, + 0x3c, 0x18, 0xf3, 0x74, 0xb5, 0x9c, 0x58, 0xa7, 0x8f, 0xa5, 0xd1, 0xe3, 0x19, 0x40, 0xf4, 0x22, + 0x6c, 0x12, 0x47, 0x73, 0x00, 0xea, 0xd9, 0x4c, 0x6a, 0xbb, 0x98, 0xd4, 0xaf, 0xde, 0xd5, 0x22, + 0xac, 0x61, 0xa0, 0xd7, 0x61, 0x24, 0x0e, 0x5a, 0x81, 0x17, 0x6c, 0x1f, 0xdc, 0x26, 0x32, 0xa8, + 0x87, 0xb2, 0x72, 0xda, 0x48, 0x40, 0x58, 0xc7, 0xb3, 0x7f, 0xa1, 0x08, 0xe9, 0x6c, 0xd7, 0xdf, + 0x5e, 0x93, 0x1f, 0xcf, 0x35, 0xf9, 0x4d, 0x0b, 0x26, 0x69, 0xeb, 0xcc, 0xe2, 0x42, 0x1e, 0xb6, + 0x2a, 0xf1, 0x88, 0xd5, 0x25, 0xf1, 0xc8, 0x55, 0xca, 0xbb, 0x9a, 0x41, 0x3b, 0x16, 0xda, 0x32, + 0x8d, 0x39, 0xd1, 0x52, 0x2c, 0xa0, 0x02, 0x8f, 0x84, 0xa1, 0x70, 0x89, 0xd1, 0xf1, 0x48, 0x18, + 0x62, 0x01, 0x95, 0x79, 0x49, 0x4a, 0x39, 0x79, 0x49, 0x58, 0x88, 0x32, 0xf1, 0xca, 0x2f, 0xc4, + 0x1e, 0x2d, 0x44, 0x99, 0x7c, 0xfe, 0x4f, 0x70, 0xec, 0x5f, 0x2e, 0xc2, 0x68, 0x2d, 0x68, 0x26, + 0x0f, 0x57, 0xaf, 0x19, 0x0f, 0x57, 0x57, 0x52, 0x0f, 0x57, 0x93, 0x3a, 0xee, 0xb7, 0x9f, 0xa9, + 0x3e, 0xaa, 0x67, 0xaa, 0x7f, 0x65, 0xb1, 0x59, 0xab, 0xae, 0xd7, 0x45, 0x66, 0xcf, 0x57, 0x60, + 0x84, 0x31, 0x24, 0xe6, 0x83, 0x25, 0x5f, 0x73, 0x58, 0xc8, 0xf1, 0xf5, 0xa4, 0x18, 0xeb, 0x38, + 0xe8, 0x1a, 0x0c, 0x47, 0xc4, 0x09, 0x1b, 0x3b, 0x8a, 0xc7, 0x89, 0xb7, 0x0e, 0x5e, 0x86, 0x15, + 0x14, 0xbd, 0x93, 0x44, 0xc7, 0x2a, 0xe6, 0xe7, 0xa8, 0xd4, 0xfb, 0xc3, 0xb7, 0x48, 0x7e, 0x48, + 0x2c, 0xfb, 0x01, 0xa0, 0x4e, 0xfc, 0x3e, 0xe2, 0xe0, 0x54, 0xcc, 0x38, 0x38, 0xe5, 0x8e, 0x18, + 0x38, 0x7f, 0x61, 0xc1, 0x78, 0x2d, 0x68, 0xd2, 0xad, 0xfb, 0xad, 0xb4, 0x4f, 0xf5, 0xd0, 0x80, + 0x83, 0x5d, 0x42, 0x03, 0xfe, 0x43, 0x0b, 0x86, 0x6a, 0x41, 0xf3, 0x0c, 0x74, 0xec, 0x9f, 0x33, + 0x75, 0xec, 0x4f, 0xe5, 0x2c, 0x89, 0x1c, 0xb5, 0xfa, 0xaf, 0x16, 0x61, 0x8c, 0xf6, 0x33, 0xd8, + 0x96, 0xb3, 0x64, 0x8c, 0x88, 0xd5, 0xc7, 0x88, 0x50, 0x31, 0x37, 0xf0, 0xbc, 0xe0, 0x61, 0x7a, + 0xc6, 0x56, 0x58, 0x29, 0x16, 0x50, 0xf4, 0x12, 0x0c, 0xb7, 0x42, 0xb2, 0xef, 0x06, 0x42, 0x7e, + 0xd4, 0x5e, 0x2c, 0x6a, 0xa2, 0x1c, 0x2b, 0x0c, 0x7a, 0xef, 0x8a, 0x5c, 0xbf, 0x41, 0x64, 0x82, + 0xdc, 0x12, 0xcb, 0x40, 0xc4, 0x63, 0xfe, 0x6a, 0xe5, 0xd8, 0xc0, 0x42, 0x0f, 0xa0, 0xcc, 0xfe, + 0x33, 0x8e, 0x72, 0xf2, 0x8c, 0x29, 0x22, 0xd0, 0xbe, 0x20, 0x80, 0x13, 0x5a, 0xe8, 0x3a, 0x40, + 0x2c, 0xe3, 0xc2, 0x46, 0x22, 0x9c, 0x89, 0x92, 0xb5, 0x55, 0xc4, 0xd8, 0x08, 0x6b, 0x58, 0xe8, + 0x45, 0x28, 0xc7, 0x8e, 0xeb, 0xdd, 0x71, 0x7d, 0x12, 0x31, 0x45, 0x73, 0x51, 0xc6, 0xd1, 0x17, + 0x85, 0x38, 0x81, 0x53, 0x59, 0x87, 0xf9, 0xfa, 0xf2, 0x7c, 0x4b, 0xc3, 0x0c, 0x9b, 0xc9, 0x3a, + 0x77, 0x54, 0x29, 0xd6, 0x30, 0xec, 0x1b, 0x70, 0xbe, 0x16, 0x34, 0x6b, 0x41, 0x18, 0xaf, 0x04, + 0xe1, 0x43, 0x27, 0x6c, 0xca, 0xf9, 0xab, 0xc8, 0x90, 0xee, 0x94, 0xf7, 0x0c, 0xf0, 0x9d, 0x69, + 0x04, 0x6b, 0x7f, 0x95, 0x49, 0x3b, 0x27, 0xf4, 0x8b, 0xf8, 0xdf, 0x05, 0xc6, 0x28, 0x52, 0x49, + 0xc0, 0xd0, 0x97, 0x61, 0x3c, 0x22, 0x77, 0x5c, 0xbf, 0xfd, 0x48, 0xde, 0x8f, 0xbb, 0x38, 0x9d, + 0xd4, 0x97, 0x75, 0x4c, 0xae, 0x65, 0x33, 0xcb, 0x70, 0x8a, 0x1a, 0x1d, 0xc2, 0xb0, 0xed, 0x2f, + 0x44, 0xf7, 0x22, 0x12, 0x8a, 0x24, 0x54, 0x6c, 0x08, 0xb1, 0x2c, 0xc4, 0x09, 0x9c, 0x2e, 0x19, + 0xf6, 0x67, 0x3d, 0xf0, 0x71, 0x10, 0xc4, 0x72, 0x91, 0xb1, 0x34, 0x26, 0x5a, 0x39, 0x36, 0xb0, + 0xd0, 0x0a, 0xa0, 0xa8, 0xdd, 0x6a, 0x79, 0xec, 0x01, 0xdc, 0xf1, 0x6e, 0x86, 0x41, 0xbb, 0xc5, + 0x1f, 0x1f, 0x8b, 0x3c, 0x3d, 0x7c, 0xbd, 0x03, 0x8a, 0x33, 0x6a, 0x50, 0xc6, 0xb0, 0x15, 0xb1, + 0xdf, 0x6c, 0xe1, 0x15, 0x85, 0xe6, 0xbb, 0xce, 0x8a, 0xb0, 0x84, 0xd1, 0x79, 0x66, 0xcd, 0x73, + 0xcc, 0xc1, 0x64, 0x9e, 0xb1, 0x2a, 0xc5, 0x1a, 0x86, 0xfd, 0x03, 0xec, 0x80, 0x61, 0xb9, 0x86, + 0xe2, 0x76, 0x48, 0xd0, 0x1e, 0x8c, 0xb5, 0xd8, 0xd1, 0x2f, 0x22, 0xe1, 0x8a, 0x01, 0x7f, 0xad, + 0xcf, 0x9b, 0xe2, 0x43, 0xba, 0x79, 0x95, 0x26, 0x87, 0x89, 0xe0, 0x35, 0x9d, 0x1c, 0x36, 0xa9, + 0xdb, 0x3f, 0x37, 0xc9, 0xf8, 0x58, 0x9d, 0x5f, 0xff, 0x86, 0x84, 0xc5, 0xab, 0x90, 0x75, 0x67, + 0xf3, 0xf5, 0x10, 0xc9, 0x91, 0x23, 0xac, 0x66, 0xb1, 0xac, 0x8b, 0xde, 0x61, 0xaf, 0xbc, 0x9c, + 0x79, 0xf4, 0x4a, 0x5a, 0xca, 0xb1, 0x8c, 0x07, 0x5d, 0x51, 0x11, 0x6b, 0x44, 0xd0, 0x1d, 0x18, + 0x13, 0xa9, 0x69, 0x84, 0xa2, 0xa9, 0x68, 0x28, 0x12, 0xc6, 0xb0, 0x0e, 0x3c, 0x4e, 0x17, 0x60, + 0xb3, 0x32, 0xda, 0x86, 0x4b, 0x5a, 0x9e, 0xb6, 0x9b, 0xa1, 0xc3, 0x5e, 0xfe, 0x5c, 0xb6, 0xfa, + 0x35, 0x5e, 0xf4, 0xec, 0xd1, 0x61, 0xe5, 0xd2, 0x46, 0x37, 0x44, 0xdc, 0x9d, 0x0e, 0xba, 0x0b, + 0xe7, 0x9d, 0x46, 0xec, 0xee, 0x93, 0x2a, 0x71, 0x9a, 0x9e, 0xeb, 0x2b, 0x66, 0xc7, 0x17, 0xd0, + 0xc5, 0xa3, 0xc3, 0xca, 0xf9, 0x85, 0x2c, 0x04, 0x9c, 0x5d, 0x0f, 0x7d, 0x0e, 0xca, 0x4d, 0x3f, + 0x12, 0x63, 0x30, 0x68, 0xa4, 0x20, 0x2c, 0x57, 0xd7, 0xeb, 0xea, 0xfb, 0x93, 0x3f, 0x38, 0xa9, + 0x80, 0xb6, 0xb9, 0xb2, 0x49, 0xdd, 0xed, 0x86, 0xf2, 0x13, 0x26, 0x8b, 0x25, 0x61, 0xb8, 0x96, + 0x70, 0x2d, 0xab, 0x32, 0xf2, 0x34, 0xbc, 0x4e, 0x0c, 0xc2, 0xe8, 0x6d, 0x40, 0x54, 0xf8, 0x71, + 0x1b, 0x64, 0xa1, 0xc1, 0x02, 0x12, 0x33, 0xdd, 0xdc, 0xb0, 0x61, 0xca, 0x8f, 0xea, 0x1d, 0x18, + 0x38, 0xa3, 0x16, 0xba, 0x45, 0x39, 0x90, 0x5e, 0x2a, 0x8c, 0x55, 0xa5, 0xc0, 0x3c, 0x53, 0x25, + 0xad, 0x90, 0x34, 0x9c, 0x98, 0x34, 0x4d, 0x8a, 0x38, 0x55, 0x8f, 0x9e, 0x4f, 0x2a, 0x37, 0x09, + 0x98, 0x51, 0x07, 0x3a, 0xf3, 0x93, 0xd0, 0xbb, 0xe6, 0x4e, 0x10, 0xc5, 0xeb, 0x24, 0x7e, 0x18, + 0x84, 0xbb, 0x22, 0xc8, 0x53, 0x12, 0x6f, 0x30, 0x01, 0x61, 0x1d, 0x8f, 0xca, 0x96, 0xec, 0x99, + 0x75, 0xb5, 0xca, 0x5e, 0xbd, 0x86, 0x93, 0x7d, 0x72, 0x8b, 0x17, 0x63, 0x09, 0x97, 0xa8, 0xab, + 0xb5, 0x25, 0xf6, 0x82, 0x95, 0x42, 0x5d, 0xad, 0x2d, 0x61, 0x09, 0x47, 0xa4, 0x33, 0xbd, 0xe3, + 0x78, 0xbe, 0xa6, 0xb0, 0x93, 0x8f, 0xf7, 0x99, 0xe1, 0xd1, 0x87, 0x49, 0x95, 0x58, 0x92, 0x47, + 0xbf, 0x8a, 0x66, 0x26, 0xd8, 0x22, 0xe9, 0x3f, 0x74, 0x96, 0xd2, 0xbd, 0xae, 0xa6, 0x28, 0xe1, + 0x0e, 0xda, 0x46, 0x1c, 0x88, 0xc9, 0x9e, 0xb9, 0x65, 0xe6, 0xa1, 0x1c, 0xb5, 0x37, 0x9b, 0xc1, + 0x9e, 0xe3, 0xfa, 0xec, 0xc1, 0x49, 0x13, 0x5c, 0xea, 0x12, 0x80, 0x13, 0x1c, 0xb4, 0x02, 0xc3, + 0x8e, 0x54, 0xac, 0xa2, 0x7c, 0xc7, 0x70, 0xa5, 0x4e, 0x65, 0x62, 0xb9, 0x52, 0xa5, 0xaa, 0xba, + 0xe8, 0x4d, 0x18, 0x13, 0xee, 0x44, 0xdc, 0x5d, 0x9e, 0x3d, 0x08, 0x69, 0x96, 0xe7, 0x75, 0x1d, + 0x88, 0x4d, 0x5c, 0xf4, 0xbd, 0x30, 0x4e, 0xa9, 0x24, 0x8c, 0x6d, 0x66, 0xba, 0x1f, 0x8e, 0xa8, + 0xe5, 0x0c, 0xd0, 0x2b, 0xe3, 0x14, 0x31, 0xd4, 0x84, 0x67, 0x9c, 0x76, 0x1c, 0x30, 0xe5, 0xb4, + 0xb9, 0xfe, 0x37, 0x82, 0x5d, 0xe2, 0xb3, 0x77, 0xa1, 0xe1, 0xc5, 0x2b, 0x47, 0x87, 0x95, 0x67, + 0x16, 0xba, 0xe0, 0xe1, 0xae, 0x54, 0xd0, 0x3d, 0x18, 0x89, 0x03, 0x8f, 0xd9, 0x80, 0x53, 0x19, + 0xe0, 0x42, 0x7e, 0x1c, 0x95, 0x0d, 0x85, 0xa6, 0x2b, 0x66, 0x54, 0x55, 0xac, 0xd3, 0x41, 0x1b, + 0x7c, 0x8f, 0xb1, 0x08, 0x93, 0x24, 0x9a, 0x79, 0x2a, 0x7f, 0x60, 0x54, 0x20, 0x4a, 0x73, 0x0b, + 0x8a, 0x9a, 0x58, 0x27, 0x83, 0x6e, 0xc2, 0x54, 0x2b, 0x74, 0x03, 0xb6, 0xb0, 0xd5, 0xc3, 0xc0, + 0x8c, 0x19, 0x26, 0xbe, 0x96, 0x46, 0xc0, 0x9d, 0x75, 0xe8, 0xc5, 0x4d, 0x16, 0xce, 0x5c, 0xe4, + 0x39, 0x87, 0xb8, 0x30, 0xcb, 0xcb, 0xb0, 0x82, 0xa2, 0x35, 0xc6, 0x97, 0xf9, 0x15, 0x6b, 0x66, + 0x36, 0xdf, 0xa1, 0x5e, 0xbf, 0x8a, 0x71, 0x41, 0x47, 0xfd, 0xc5, 0x09, 0x05, 0x7a, 0x6e, 0x44, + 0x3b, 0x4e, 0x48, 0x6a, 0x61, 0xd0, 0x20, 0xbc, 0x33, 0xdc, 0xfc, 0xfc, 0x69, 0x1e, 0x08, 0x8f, + 0x9e, 0x1b, 0xf5, 0x2c, 0x04, 0x9c, 0x5d, 0x6f, 0xf6, 0xbb, 0x60, 0xaa, 0x83, 0x93, 0x9f, 0x28, + 0x3a, 0xf2, 0x9f, 0x0f, 0x40, 0x59, 0x29, 0x7e, 0xd1, 0xbc, 0xa9, 0xcf, 0xbf, 0x98, 0xd6, 0xe7, + 0x0f, 0x53, 0xf9, 0x53, 0x57, 0xe1, 0x6f, 0x18, 0x86, 0x5f, 0x85, 0xfc, 0x5c, 0x44, 0xba, 0xd6, + 0xa3, 0xa7, 0x6f, 0x96, 0x76, 0x8f, 0x2f, 0xf6, 0xfd, 0x30, 0x50, 0xea, 0xaa, 0x1a, 0xe8, 0x33, + 0x15, 0x28, 0xbd, 0xea, 0xb6, 0x82, 0xe6, 0x6a, 0x2d, 0x9d, 0x1b, 0xaf, 0x46, 0x0b, 0x31, 0x87, + 0xb1, 0xcb, 0x0a, 0x15, 0x3b, 0xd8, 0x65, 0x65, 0xe8, 0x31, 0x2f, 0x2b, 0x92, 0x00, 0x4e, 0x68, + 0x21, 0x0f, 0xa6, 0x1a, 0x66, 0x5a, 0x43, 0xe5, 0x8f, 0xf5, 0x5c, 0xcf, 0x04, 0x83, 0x6d, 0x2d, + 0x87, 0xd4, 0x52, 0x9a, 0x0a, 0xee, 0x24, 0x8c, 0xde, 0x84, 0xe1, 0xf7, 0x83, 0x88, 0x6d, 0x0b, + 0x71, 0xf6, 0x4a, 0x0f, 0x98, 0xe1, 0x77, 0xee, 0xd6, 0x59, 0xf9, 0xf1, 0x61, 0x65, 0xa4, 0x16, + 0x34, 0xe5, 0x5f, 0xac, 0x2a, 0xa0, 0x47, 0x70, 0xde, 0xe0, 0x58, 0xaa, 0xbb, 0xd0, 0x7f, 0x77, + 0x2f, 0x89, 0xe6, 0xce, 0xaf, 0x66, 0x51, 0xc2, 0xd9, 0x0d, 0x50, 0x36, 0xe0, 0x07, 0x22, 0x25, + 0xa8, 0x3c, 0xdf, 0xd9, 0x31, 0x5e, 0xd6, 0xbd, 0x96, 0x53, 0x08, 0xb8, 0xb3, 0x8e, 0xfd, 0x0d, + 0xae, 0x27, 0x17, 0xda, 0x34, 0x12, 0xb5, 0xbd, 0xb3, 0xc8, 0x38, 0xb3, 0x6c, 0x28, 0xfa, 0x1e, + 0xfb, 0x2d, 0xe6, 0xb7, 0x2d, 0xf6, 0x16, 0xb3, 0x41, 0xf6, 0x5a, 0x9e, 0x13, 0x9f, 0x85, 0xe7, + 0xc5, 0x3b, 0x30, 0x1c, 0x8b, 0xd6, 0xba, 0x25, 0xc9, 0xd1, 0x3a, 0xc5, 0xde, 0xa3, 0xd4, 0xc9, + 0x2f, 0x4b, 0xb1, 0x22, 0x63, 0xff, 0x73, 0x3e, 0x03, 0x12, 0x72, 0x06, 0x4a, 0x97, 0xaa, 0xa9, + 0x74, 0xa9, 0xf4, 0xf8, 0x82, 0x1c, 0xe5, 0xcb, 0x3f, 0x33, 0xfb, 0xcd, 0x2e, 0x59, 0x1f, 0xf7, + 0x47, 0x40, 0xfb, 0xa7, 0x2c, 0x98, 0xce, 0xb2, 0x9a, 0xa1, 0xd2, 0x1a, 0xbf, 0xe2, 0xa9, 0x47, + 0x51, 0x35, 0x82, 0xf7, 0x45, 0x39, 0x56, 0x18, 0x7d, 0xc7, 0x9f, 0x3f, 0x59, 0x90, 0xaa, 0xbb, + 0x30, 0x56, 0x0b, 0x89, 0x76, 0x06, 0xbc, 0xc5, 0x5d, 0xa9, 0x78, 0x7f, 0x5e, 0x3a, 0xb1, 0x1b, + 0x95, 0xfd, 0x8b, 0x05, 0x98, 0xe6, 0xaf, 0x1a, 0x0b, 0xfb, 0x81, 0xdb, 0xac, 0x05, 0x4d, 0x91, + 0x3b, 0xe0, 0x4b, 0x30, 0xda, 0xd2, 0xee, 0xe5, 0xdd, 0xc2, 0xe4, 0xe8, 0xf7, 0xf7, 0xe4, 0x7e, + 0xa4, 0x97, 0x62, 0x83, 0x16, 0x6a, 0xc2, 0x28, 0xd9, 0x77, 0x1b, 0x4a, 0x35, 0x5e, 0x38, 0xf1, + 0xd9, 0xa0, 0x5a, 0x59, 0xd6, 0xe8, 0x60, 0x83, 0xea, 0x13, 0x48, 0x27, 0x65, 0xff, 0xb4, 0x05, + 0x4f, 0xe5, 0x04, 0xd5, 0xa1, 0xcd, 0x3d, 0x64, 0xef, 0x47, 0x22, 0x33, 0x8d, 0x6a, 0x8e, 0xbf, + 0x2a, 0x61, 0x01, 0x45, 0x5f, 0x00, 0xe0, 0xaf, 0x42, 0xf4, 0xba, 0x20, 0x3e, 0xbd, 0xbf, 0x60, + 0x13, 0x5a, 0x90, 0x00, 0x59, 0x1f, 0x6b, 0xb4, 0xec, 0x9f, 0x2f, 0xc2, 0x00, 0x7b, 0x85, 0x40, + 0x2b, 0x30, 0xb4, 0xc3, 0x43, 0xc8, 0xf6, 0x13, 0xad, 0x36, 0xb9, 0x77, 0xf1, 0x02, 0x2c, 0x2b, + 0xa3, 0x35, 0x38, 0xc7, 0x43, 0xf0, 0x7a, 0x55, 0xe2, 0x39, 0x07, 0xf2, 0xfa, 0xce, 0xb3, 0xb9, + 0xa8, 0x80, 0x07, 0xab, 0x9d, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x0b, 0xc6, 0x63, 0x77, 0x8f, 0x04, + 0xed, 0x58, 0x52, 0xe2, 0xc1, 0x77, 0x95, 0xb0, 0xbf, 0x61, 0x40, 0x71, 0x0a, 0x9b, 0x5e, 0x44, + 0x5a, 0x1d, 0x8a, 0x0a, 0x2d, 0x3f, 0xba, 0xa9, 0x9c, 0x30, 0x71, 0x99, 0xb9, 0x4c, 0x9b, 0x19, + 0x07, 0x6d, 0xec, 0x84, 0x24, 0xda, 0x09, 0xbc, 0xa6, 0x48, 0x06, 0x9c, 0x98, 0xcb, 0xa4, 0xe0, + 0xb8, 0xa3, 0x06, 0xa5, 0xb2, 0xe5, 0xb8, 0x5e, 0x3b, 0x24, 0x09, 0x95, 0x41, 0x93, 0xca, 0x4a, + 0x0a, 0x8e, 0x3b, 0x6a, 0xd0, 0x75, 0x74, 0x5e, 0x64, 0xe7, 0x95, 0x6e, 0xd8, 0xca, 0x06, 0x6a, + 0x48, 0xba, 0xb6, 0x74, 0x89, 0x43, 0x22, 0xac, 0x44, 0x54, 0x7e, 0x5f, 0x2d, 0xf7, 0xa3, 0x70, + 0x6a, 0x91, 0x54, 0x1e, 0x27, 0x47, 0xec, 0x1f, 0x5a, 0x70, 0x2e, 0xc3, 0xd6, 0x92, 0xb3, 0xaa, + 0x6d, 0x37, 0x8a, 0x55, 0xc6, 0x0a, 0x8d, 0x55, 0xf1, 0x72, 0xac, 0x30, 0xe8, 0x7e, 0xe0, 0xcc, + 0x30, 0xcd, 0x00, 0x85, 0x2d, 0x93, 0x80, 0x9e, 0x8c, 0x01, 0xa2, 0x2b, 0x50, 0x6a, 0x47, 0x24, + 0x94, 0xc9, 0x55, 0x25, 0xff, 0x66, 0xaa, 0x52, 0x06, 0xa1, 0xa2, 0xe9, 0xb6, 0xd2, 0x52, 0x6a, + 0xa2, 0x29, 0x57, 0x3d, 0x72, 0x98, 0xfd, 0xb5, 0x22, 0x5c, 0xcc, 0xb5, 0xa5, 0xa6, 0x5d, 0xda, + 0x0b, 0x7c, 0x37, 0x0e, 0xd4, 0x0b, 0x17, 0x8f, 0x61, 0x41, 0x5a, 0x3b, 0x6b, 0xa2, 0x1c, 0x2b, + 0x0c, 0x74, 0x55, 0xe6, 0x89, 0x4e, 0xe7, 0xe4, 0x58, 0xac, 0x1a, 0xa9, 0xa2, 0xfb, 0xcd, 0x77, + 0xf4, 0x1c, 0x94, 0x5a, 0x81, 0x4a, 0xe2, 0xaf, 0x66, 0x96, 0x76, 0x37, 0x08, 0x3c, 0xcc, 0x80, + 0xe8, 0x53, 0x62, 0x1c, 0x52, 0x4f, 0x3a, 0xd8, 0x69, 0x06, 0x91, 0x36, 0x18, 0x2f, 0xc0, 0xd0, + 0x2e, 0x39, 0x08, 0x5d, 0x7f, 0x3b, 0xfd, 0xd4, 0x77, 0x9b, 0x17, 0x63, 0x09, 0x37, 0x43, 0xd2, + 0x0f, 0x9d, 0x76, 0xa2, 0xa2, 0xe1, 0x9e, 0x47, 0xdb, 0x8f, 0x16, 0x61, 0x02, 0x2f, 0x56, 0xbf, + 0x3d, 0x11, 0xf7, 0x3a, 0x27, 0xe2, 0xb4, 0x13, 0x15, 0xf5, 0x9e, 0x8d, 0x5f, 0xb5, 0x60, 0x82, + 0x85, 0x6d, 0x15, 0x31, 0x18, 0xdc, 0xc0, 0x3f, 0x03, 0xd1, 0xed, 0x39, 0x18, 0x08, 0x69, 0xa3, + 0xe9, 0xec, 0x23, 0xac, 0x27, 0x98, 0xc3, 0xd0, 0x33, 0x50, 0x62, 0x5d, 0xa0, 0x93, 0x37, 0xca, + 0x03, 0xb7, 0x57, 0x9d, 0xd8, 0xc1, 0xac, 0x94, 0x39, 0x16, 0x63, 0xd2, 0xf2, 0x5c, 0xde, 0xe9, + 0x44, 0xd5, 0xff, 0xf1, 0x70, 0x2c, 0xce, 0xec, 0xda, 0x87, 0x73, 0x2c, 0xce, 0x26, 0xd9, 0xfd, + 0x5a, 0xf4, 0x3f, 0x0a, 0x70, 0x39, 0xb3, 0x5e, 0xdf, 0x8e, 0xc5, 0xdd, 0x6b, 0x9f, 0x8e, 0xc5, + 0x46, 0xb6, 0x21, 0x45, 0xf1, 0x0c, 0x0d, 0x29, 0x4a, 0xfd, 0x4a, 0x8e, 0x03, 0x7d, 0xf8, 0xfb, + 0x66, 0x0e, 0xd9, 0xc7, 0xc4, 0xdf, 0x37, 0xb3, 0x6f, 0x39, 0xd7, 0xba, 0xbf, 0x2c, 0xe4, 0x7c, + 0x0b, 0xbb, 0xe0, 0x5d, 0xa3, 0x7c, 0x86, 0x01, 0x23, 0x21, 0x09, 0x8f, 0x72, 0x1e, 0xc3, 0xcb, + 0xb0, 0x82, 0x22, 0x57, 0xf3, 0x9c, 0x2d, 0xe4, 0xe7, 0xa6, 0xcb, 0x6d, 0x6a, 0xce, 0x7c, 0x99, + 0x51, 0x43, 0x90, 0xe1, 0x45, 0xbb, 0xa6, 0x5d, 0xca, 0x8b, 0xfd, 0x5f, 0xca, 0x47, 0xb3, 0x2f, + 0xe4, 0x68, 0x01, 0x26, 0xf6, 0x5c, 0x9f, 0xe5, 0x1a, 0x37, 0x45, 0x51, 0x15, 0x48, 0x62, 0xcd, + 0x04, 0xe3, 0x34, 0xfe, 0xec, 0x9b, 0x30, 0xf6, 0xf8, 0xea, 0xc8, 0x6f, 0x16, 0xe1, 0xe9, 0x2e, + 0xdb, 0x9e, 0xf3, 0x7a, 0x63, 0x0e, 0x34, 0x5e, 0xdf, 0x31, 0x0f, 0x35, 0x98, 0xde, 0x6a, 0x7b, + 0xde, 0x01, 0xb3, 0x55, 0x24, 0x4d, 0x89, 0x21, 0x64, 0x45, 0x99, 0x41, 0x7e, 0x7a, 0x25, 0x03, + 0x07, 0x67, 0xd6, 0x44, 0x6f, 0x03, 0x0a, 0x44, 0x62, 0xcc, 0x9b, 0xc4, 0x17, 0xfa, 0x6e, 0x36, + 0xf0, 0xc5, 0x64, 0x33, 0xde, 0xed, 0xc0, 0xc0, 0x19, 0xb5, 0xa8, 0xd0, 0x4f, 0x4f, 0xa5, 0x03, + 0xd5, 0xad, 0x94, 0xd0, 0x8f, 0x75, 0x20, 0x36, 0x71, 0xd1, 0x4d, 0x98, 0x72, 0xf6, 0x1d, 0x97, + 0x87, 0x45, 0x93, 0x04, 0xb8, 0xd4, 0xaf, 0x94, 0x60, 0x0b, 0x69, 0x04, 0xdc, 0x59, 0x27, 0xe5, + 0xba, 0x3b, 0x98, 0xef, 0xba, 0xdb, 0x9d, 0x2f, 0xf6, 0xd2, 0xe9, 0xda, 0xff, 0xd9, 0xa2, 0xc7, + 0x57, 0x46, 0x72, 0x6b, 0x3a, 0x0e, 0x4a, 0x37, 0xa9, 0x79, 0xd1, 0xaa, 0x71, 0x58, 0xd2, 0x81, + 0xd8, 0xc4, 0xe5, 0x0b, 0x22, 0x4a, 0x1c, 0x3a, 0x0c, 0xd1, 0x5d, 0xb8, 0xc9, 0x2b, 0x0c, 0xf4, + 0x45, 0x18, 0x6a, 0xba, 0xfb, 0x6e, 0x14, 0x84, 0x62, 0xb3, 0x9c, 0xd0, 0x2c, 0x3e, 0xe1, 0x83, + 0x55, 0x4e, 0x06, 0x4b, 0x7a, 0xf6, 0x8f, 0x16, 0x60, 0x4c, 0xb6, 0xf8, 0x4e, 0x3b, 0x88, 0x9d, + 0x33, 0x38, 0x96, 0x6f, 0x1a, 0xc7, 0xf2, 0xa7, 0xba, 0xc5, 0x0a, 0x60, 0x5d, 0xca, 0x3d, 0x8e, + 0xef, 0xa6, 0x8e, 0xe3, 0xe7, 0x7b, 0x93, 0xea, 0x7e, 0x0c, 0xff, 0x0b, 0x0b, 0xa6, 0x0c, 0xfc, + 0x33, 0x38, 0x0d, 0x56, 0xcc, 0xd3, 0xe0, 0xd9, 0x9e, 0xdf, 0x90, 0x73, 0x0a, 0x7c, 0xbd, 0x90, + 0xea, 0x3b, 0xe3, 0xfe, 0xef, 0x43, 0x69, 0xc7, 0x09, 0x9b, 0xdd, 0x22, 0x89, 0x76, 0x54, 0x9a, + 0xbb, 0xe5, 0x84, 0x4d, 0xce, 0xc3, 0x5f, 0x52, 0xe9, 0xf4, 0x9c, 0xb0, 0xd9, 0xd3, 0x7f, 0x89, + 0x35, 0x85, 0x6e, 0xc0, 0x60, 0xd4, 0x08, 0x5a, 0xca, 0xba, 0xf0, 0x0a, 0x4f, 0xb5, 0x47, 0x4b, + 0x8e, 0x0f, 0x2b, 0xc8, 0x6c, 0x8e, 0x16, 0x63, 0x81, 0x3f, 0xbb, 0x0d, 0x65, 0xd5, 0xf4, 0x13, + 0xf5, 0x0d, 0xf9, 0x8f, 0x45, 0x38, 0x97, 0xb1, 0x2e, 0x50, 0x64, 0x8c, 0xd6, 0x2b, 0x7d, 0x2e, + 0xa7, 0x0f, 0x39, 0x5e, 0x11, 0xbb, 0xb1, 0x34, 0xc5, 0xfc, 0xf7, 0xdd, 0xe8, 0xbd, 0x88, 0xa4, + 0x1b, 0xa5, 0x45, 0xbd, 0x1b, 0xa5, 0x8d, 0x9d, 0xd9, 0x50, 0xd3, 0x86, 0x54, 0x4f, 0x9f, 0xe8, + 0x9c, 0xfe, 0x59, 0x11, 0xa6, 0xb3, 0x42, 0x8c, 0xa0, 0xef, 0x4f, 0xe5, 0xc5, 0x78, 0xad, 0xdf, + 0xe0, 0x24, 0x3c, 0x59, 0x86, 0xc8, 0xf2, 0x3a, 0x67, 0x66, 0xca, 0xe8, 0x39, 0xcc, 0xa2, 0x4d, + 0xe6, 0x50, 0x18, 0xf2, 0x7c, 0x26, 0x72, 0x8b, 0x7f, 0xa6, 0xef, 0x0e, 0x88, 0x44, 0x28, 0x51, + 0xca, 0xa1, 0x50, 0x16, 0xf7, 0x76, 0x28, 0x94, 0x2d, 0xcf, 0xba, 0x30, 0xa2, 0x7d, 0xcd, 0x13, + 0x9d, 0xf1, 0x5d, 0x7a, 0xa2, 0x68, 0xfd, 0x7e, 0xa2, 0xb3, 0xfe, 0xd3, 0x16, 0xa4, 0x6c, 0xfa, + 0x94, 0x4a, 0xca, 0xca, 0x55, 0x49, 0x5d, 0x81, 0x52, 0x18, 0x78, 0x24, 0x9d, 0xaa, 0x02, 0x07, + 0x1e, 0xc1, 0x0c, 0xa2, 0x92, 0xec, 0x17, 0x73, 0x93, 0xec, 0x3f, 0x07, 0x03, 0x1e, 0xd9, 0x27, + 0x52, 0x1b, 0xa1, 0x78, 0xf2, 0x1d, 0x5a, 0x88, 0x39, 0xcc, 0xfe, 0xd5, 0x12, 0x5c, 0xea, 0xea, + 0x92, 0x4b, 0xaf, 0x2c, 0xdb, 0x4e, 0x4c, 0x1e, 0x3a, 0x07, 0xe9, 0x20, 0xb7, 0x37, 0x79, 0x31, + 0x96, 0x70, 0x66, 0x81, 0xcc, 0xc3, 0xe3, 0xa5, 0x14, 0x78, 0x22, 0x2a, 0x9e, 0x80, 0x3e, 0x81, + 0x0c, 0xd7, 0xd7, 0x01, 0xa2, 0xc8, 0x5b, 0xf6, 0xa9, 0x04, 0xd6, 0x14, 0xa6, 0xcd, 0x49, 0x18, + 0xc5, 0xfa, 0x1d, 0x01, 0xc1, 0x1a, 0x16, 0xaa, 0xc2, 0x64, 0x2b, 0x0c, 0x62, 0xae, 0x0f, 0xad, + 0x72, 0x23, 0x99, 0x01, 0xd3, 0x1b, 0xb2, 0x96, 0x82, 0xe3, 0x8e, 0x1a, 0xe8, 0x75, 0x18, 0x11, + 0x1e, 0x92, 0xb5, 0x20, 0xf0, 0x84, 0xaa, 0x46, 0x99, 0x5c, 0xd4, 0x13, 0x10, 0xd6, 0xf1, 0xb4, + 0x6a, 0x4c, 0xc9, 0x3a, 0x94, 0x59, 0x8d, 0x2b, 0x5a, 0x35, 0xbc, 0x54, 0xb8, 0xa1, 0xe1, 0xbe, + 0xc2, 0x0d, 0x25, 0xca, 0xab, 0x72, 0xdf, 0xef, 0x4a, 0xd0, 0x53, 0xdd, 0xf3, 0x4b, 0x25, 0x38, + 0x27, 0x16, 0xce, 0x93, 0x5e, 0x2e, 0x4f, 0x28, 0x0f, 0xf7, 0xb7, 0xd7, 0xcc, 0x59, 0xaf, 0x99, + 0x6f, 0x14, 0x61, 0x90, 0x4f, 0xc5, 0x19, 0xc8, 0xf0, 0x2b, 0x42, 0xe9, 0xd7, 0x25, 0xd0, 0x0e, + 0xef, 0xcb, 0x5c, 0xd5, 0x89, 0x1d, 0x7e, 0x7e, 0x29, 0x36, 0x9a, 0xa8, 0x07, 0xd1, 0x9c, 0xc1, + 0x68, 0x67, 0x53, 0x5a, 0x2d, 0xe0, 0x34, 0x34, 0xb6, 0xfb, 0x65, 0x80, 0x88, 0xe5, 0x82, 0xa6, + 0x34, 0x44, 0xc8, 0xa6, 0x4f, 0x77, 0x69, 0xbd, 0xae, 0x90, 0x79, 0x1f, 0x92, 0x25, 0xa8, 0x00, + 0x58, 0xa3, 0x38, 0xfb, 0x06, 0x94, 0x15, 0x72, 0x2f, 0x15, 0xc0, 0xa8, 0x7e, 0xea, 0x7d, 0x1e, + 0x26, 0x52, 0x6d, 0x9d, 0x48, 0x83, 0xf0, 0x6b, 0x16, 0x4c, 0xf0, 0x2e, 0x2f, 0xfb, 0xfb, 0x62, + 0xb3, 0x7f, 0x00, 0xd3, 0x5e, 0xc6, 0xa6, 0x13, 0x33, 0xda, 0xff, 0x26, 0x55, 0x1a, 0x83, 0x2c, + 0x28, 0xce, 0x6c, 0x03, 0x5d, 0x83, 0x61, 0xee, 0xb2, 0xe3, 0x78, 0xc2, 0xcd, 0x62, 0x94, 0xc7, + 0xb6, 0xe7, 0x65, 0x58, 0x41, 0xed, 0xdf, 0xb7, 0x60, 0x8a, 0xf7, 0xfc, 0x36, 0x39, 0x50, 0xb7, + 0xe3, 0x8f, 0xb2, 0xef, 0x22, 0x74, 0x7f, 0x21, 0x27, 0x74, 0xbf, 0xfe, 0x69, 0xc5, 0xae, 0x9f, + 0xf6, 0x8b, 0x16, 0x88, 0x15, 0x78, 0x06, 0xf7, 0xc0, 0xef, 0x32, 0xef, 0x81, 0xb3, 0xf9, 0x8b, + 0x3a, 0xe7, 0x02, 0xf8, 0x17, 0x16, 0x4c, 0x72, 0x84, 0xe4, 0x21, 0xf2, 0x23, 0x9d, 0x87, 0x7e, + 0xf2, 0x49, 0xa9, 0x04, 0xb2, 0xd9, 0x1f, 0x65, 0x4c, 0x56, 0xa9, 0xeb, 0x64, 0x35, 0xe5, 0x06, + 0x3a, 0x41, 0x9e, 0xb4, 0x13, 0x07, 0xd3, 0xb5, 0xff, 0xd4, 0x02, 0xc4, 0x9b, 0x31, 0xce, 0x65, + 0x7a, 0xda, 0xb1, 0x52, 0x4d, 0x13, 0x94, 0xb0, 0x1a, 0x05, 0xc1, 0x1a, 0xd6, 0xa9, 0x0c, 0x4f, + 0xea, 0x35, 0xb9, 0xd8, 0xfb, 0x35, 0xf9, 0x04, 0x23, 0xfa, 0x8d, 0x12, 0xa4, 0x6d, 0xb4, 0xd1, + 0x7d, 0x18, 0x6d, 0x38, 0x2d, 0x67, 0xd3, 0xf5, 0xdc, 0xd8, 0x25, 0x51, 0x37, 0x33, 0x94, 0x25, + 0x0d, 0x4f, 0xbc, 0x13, 0x6a, 0x25, 0xd8, 0xa0, 0x83, 0xe6, 0x00, 0x5a, 0xa1, 0xbb, 0xef, 0x7a, + 0x64, 0x9b, 0x5d, 0x85, 0x99, 0x63, 0x17, 0xb7, 0xad, 0x90, 0xa5, 0x58, 0xc3, 0xc8, 0x70, 0x04, + 0x2a, 0x3e, 0x39, 0x47, 0xa0, 0xd2, 0x09, 0x1d, 0x81, 0x06, 0xfa, 0x72, 0x04, 0xc2, 0x70, 0x41, + 0x9e, 0xdd, 0xf4, 0xff, 0x8a, 0xeb, 0x11, 0x21, 0xb0, 0x71, 0x77, 0xaf, 0xd9, 0xa3, 0xc3, 0xca, + 0x05, 0x9c, 0x89, 0x81, 0x73, 0x6a, 0xa2, 0x2f, 0xc0, 0x8c, 0xe3, 0x79, 0xc1, 0x43, 0x35, 0x6a, + 0xcb, 0x51, 0xc3, 0xf1, 0xb8, 0xba, 0x77, 0x88, 0x51, 0x7d, 0xe6, 0xe8, 0xb0, 0x32, 0xb3, 0x90, + 0x83, 0x83, 0x73, 0x6b, 0xa7, 0xfc, 0x88, 0x86, 0x7b, 0xfa, 0x11, 0xed, 0xc2, 0xb9, 0x3a, 0x09, + 0x5d, 0x96, 0xc5, 0xad, 0x99, 0x6c, 0xc9, 0x0d, 0x28, 0x87, 0x29, 0x26, 0xd4, 0x57, 0x0c, 0x18, + 0x2d, 0x4e, 0xa8, 0x64, 0x3a, 0x09, 0x21, 0xfb, 0xcf, 0x2d, 0x18, 0x12, 0x76, 0xe2, 0x67, 0x20, + 0xfb, 0x2c, 0x18, 0xfa, 0xcb, 0x4a, 0x36, 0xa3, 0x66, 0x9d, 0xc9, 0xd5, 0x5c, 0xae, 0xa6, 0x34, + 0x97, 0xcf, 0x76, 0x23, 0xd2, 0x5d, 0x67, 0xf9, 0x93, 0x45, 0x18, 0x37, 0x6d, 0xe4, 0xcf, 0x60, + 0x08, 0xd6, 0x61, 0x28, 0x12, 0x0e, 0x19, 0x85, 0x7c, 0xc3, 0xd9, 0xf4, 0x24, 0x26, 0x56, 0x31, + 0xc2, 0x05, 0x43, 0x12, 0xc9, 0xf4, 0xf4, 0x28, 0x3e, 0x41, 0x4f, 0x8f, 0x5e, 0x6e, 0x0a, 0xa5, + 0xd3, 0x70, 0x53, 0xb0, 0x7f, 0x83, 0x1d, 0x16, 0x7a, 0xf9, 0x19, 0xc8, 0x11, 0x37, 0xcd, 0x63, + 0xc5, 0xee, 0xb2, 0xb2, 0x44, 0xa7, 0x72, 0xe4, 0x89, 0x7f, 0x62, 0xc1, 0x88, 0x40, 0x3c, 0x83, + 0x6e, 0x7f, 0xb7, 0xd9, 0xed, 0xa7, 0xbb, 0x74, 0x3b, 0xa7, 0xbf, 0x7f, 0xaf, 0xa0, 0xfa, 0x5b, + 0x0b, 0xc2, 0xb8, 0x8f, 0xd3, 0xff, 0x06, 0x0c, 0xd3, 0xdb, 0x63, 0xd0, 0x08, 0x3c, 0x71, 0xf8, + 0x3f, 0x93, 0x78, 0x08, 0xf3, 0xf2, 0x63, 0xed, 0x37, 0x56, 0xd8, 0xcc, 0x81, 0x35, 0x08, 0x63, + 0x71, 0xe0, 0x26, 0x0e, 0xac, 0x41, 0x18, 0x63, 0x06, 0x41, 0x4d, 0x80, 0xd8, 0x09, 0xb7, 0x49, + 0x4c, 0xcb, 0x44, 0xb0, 0x81, 0xfc, 0x5d, 0xd8, 0x8e, 0x5d, 0x6f, 0xce, 0xf5, 0xe3, 0x28, 0x0e, + 0xe7, 0x56, 0xfd, 0xf8, 0x6e, 0xc8, 0xef, 0x12, 0x9a, 0xcb, 0xaf, 0xa2, 0x85, 0x35, 0xba, 0xd2, + 0x87, 0x8c, 0xb5, 0x31, 0x60, 0x3e, 0x2c, 0xae, 0x8b, 0x72, 0xac, 0x30, 0xec, 0x37, 0x18, 0x4f, + 0x66, 0x03, 0x74, 0x32, 0x6f, 0xdc, 0xdf, 0x1d, 0x56, 0x43, 0xcb, 0x5e, 0x15, 0xaa, 0xba, 0xcf, + 0x6f, 0x77, 0x16, 0x48, 0x1b, 0xd6, 0xfd, 0x11, 0x12, 0xc7, 0x60, 0xf4, 0x3d, 0x1d, 0xef, 0xcd, + 0x2f, 0xf7, 0xe0, 0xa5, 0x27, 0x78, 0x61, 0x66, 0x01, 0x6e, 0x59, 0x20, 0xd0, 0xd5, 0x9a, 0xb8, + 0x5d, 0x6a, 0x01, 0x6e, 0x05, 0x00, 0x27, 0x38, 0x68, 0x5e, 0xdc, 0x44, 0x4b, 0x46, 0xf6, 0x28, + 0x79, 0x13, 0x95, 0x9f, 0xaf, 0x5d, 0x45, 0x5f, 0x81, 0x11, 0x95, 0x45, 0xaa, 0xc6, 0x93, 0xf1, + 0x88, 0xd0, 0x0b, 0xcb, 0x49, 0x31, 0xd6, 0x71, 0xd0, 0x06, 0x4c, 0x44, 0x3c, 0x9f, 0x96, 0x8a, + 0xb0, 0xc5, 0xf5, 0x0c, 0x9f, 0x96, 0xef, 0xd4, 0x75, 0x13, 0x7c, 0xcc, 0x8a, 0xf8, 0x66, 0x95, + 0x8e, 0x60, 0x69, 0x12, 0xe8, 0x2d, 0x18, 0xf7, 0xf4, 0xbc, 0xc2, 0x35, 0xa1, 0x86, 0x50, 0x66, + 0x9c, 0x46, 0xd6, 0xe1, 0x1a, 0x4e, 0x61, 0x53, 0xa1, 0x41, 0x2f, 0x11, 0x51, 0xe1, 0x1c, 0x7f, + 0x9b, 0x44, 0x22, 0x07, 0x0e, 0x13, 0x1a, 0xee, 0xe4, 0xe0, 0xe0, 0xdc, 0xda, 0xe8, 0x06, 0x8c, + 0xca, 0xcf, 0xd7, 0xdc, 0x1c, 0x13, 0x63, 0x61, 0x0d, 0x86, 0x0d, 0x4c, 0xf4, 0x10, 0xce, 0xcb, + 0xff, 0x1b, 0xa1, 0xb3, 0xb5, 0xe5, 0x36, 0x84, 0x97, 0x29, 0xf7, 0x98, 0x58, 0x90, 0x2e, 0x18, + 0xcb, 0x59, 0x48, 0xc7, 0x87, 0x95, 0x2b, 0x62, 0xd4, 0x32, 0xe1, 0x6c, 0x12, 0xb3, 0xe9, 0xa3, + 0x35, 0x38, 0xb7, 0x43, 0x1c, 0x2f, 0xde, 0x59, 0xda, 0x21, 0x8d, 0x5d, 0xb9, 0x89, 0x98, 0xf3, + 0xa4, 0x66, 0x62, 0x7b, 0xab, 0x13, 0x05, 0x67, 0xd5, 0x43, 0xef, 0xc2, 0x4c, 0xab, 0xbd, 0xe9, + 0xb9, 0xd1, 0xce, 0x7a, 0x10, 0xb3, 0xa7, 0x71, 0x95, 0x84, 0x49, 0x78, 0x59, 0x2a, 0xc7, 0xd1, + 0x5a, 0x0e, 0x1e, 0xce, 0xa5, 0x80, 0x3e, 0x80, 0xf3, 0xa9, 0xc5, 0x20, 0x7c, 0xbe, 0xc6, 0xf3, + 0x63, 0x6c, 0xd6, 0xb3, 0x2a, 0x08, 0x1f, 0xae, 0x2c, 0x10, 0xce, 0x6e, 0xe2, 0xc3, 0x19, 0x4c, + 0xbc, 0x4f, 0x2b, 0x6b, 0xd2, 0x0d, 0xfa, 0x0a, 0x8c, 0xea, 0xab, 0x48, 0x1c, 0x30, 0x57, 0x7b, + 0xe5, 0xd0, 0x16, 0xb2, 0x91, 0x5a, 0x51, 0x3a, 0x0c, 0x1b, 0x14, 0x6d, 0x02, 0xd9, 0xdf, 0x87, + 0xee, 0xc0, 0x70, 0xc3, 0x73, 0x89, 0x1f, 0xaf, 0xd6, 0xba, 0x45, 0x13, 0x58, 0x12, 0x38, 0x62, + 0xc0, 0x44, 0x50, 0x42, 0x5e, 0x86, 0x15, 0x05, 0xfb, 0xb7, 0x0a, 0x50, 0xe9, 0x11, 0xe1, 0x32, + 0xa5, 0x33, 0xb4, 0xfa, 0xd2, 0x19, 0x2e, 0xc8, 0x94, 0x52, 0xeb, 0xa9, 0xfb, 0x6a, 0x2a, 0x5d, + 0x54, 0x72, 0x6b, 0x4d, 0xe3, 0xf7, 0x6d, 0x67, 0xa9, 0xab, 0x1d, 0x4b, 0x3d, 0x2d, 0x80, 0x8d, + 0xe7, 0x86, 0x81, 0xfe, 0x25, 0xfa, 0x5c, 0xd5, 0xb1, 0xfd, 0x1b, 0x05, 0x38, 0xaf, 0x86, 0xf0, + 0x5b, 0x77, 0xe0, 0xee, 0x75, 0x0e, 0xdc, 0x29, 0x28, 0xde, 0xed, 0xbb, 0x30, 0x58, 0x3f, 0x88, + 0x1a, 0xb1, 0xd7, 0x87, 0x00, 0xf4, 0x9c, 0x19, 0x55, 0x47, 0x1d, 0xd3, 0x46, 0x64, 0x9d, 0xbf, + 0x6e, 0xc1, 0xc4, 0xc6, 0x52, 0xad, 0x1e, 0x34, 0x76, 0x49, 0xbc, 0xc0, 0xd5, 0x4a, 0x58, 0xc8, + 0x3f, 0xd6, 0x63, 0xca, 0x35, 0x59, 0x12, 0xd3, 0x15, 0x28, 0xed, 0x04, 0x51, 0x9c, 0x7e, 0x95, + 0xbb, 0x15, 0x44, 0x31, 0x66, 0x10, 0xfb, 0x0f, 0x2c, 0x18, 0x60, 0x89, 0x10, 0x7b, 0x65, 0xe7, + 0xec, 0xe7, 0xbb, 0xd0, 0xeb, 0x30, 0x48, 0xb6, 0xb6, 0x48, 0x23, 0x16, 0xb3, 0x2a, 0xdd, 0xfa, + 0x06, 0x97, 0x59, 0x29, 0x3d, 0xf4, 0x59, 0x63, 0xfc, 0x2f, 0x16, 0xc8, 0xe8, 0x01, 0x94, 0x63, + 0x77, 0x8f, 0x2c, 0x34, 0x9b, 0xe2, 0x5d, 0xe3, 0x31, 0xbc, 0x28, 0x37, 0x24, 0x01, 0x9c, 0xd0, + 0xb2, 0xbf, 0x56, 0x00, 0x48, 0x5c, 0x93, 0x7b, 0x7d, 0xe2, 0x62, 0x47, 0x02, 0xd2, 0xab, 0x19, + 0x09, 0x48, 0x51, 0x42, 0x30, 0x23, 0xfd, 0xa8, 0x1a, 0xa6, 0x62, 0x5f, 0xc3, 0x54, 0x3a, 0xc9, + 0x30, 0x2d, 0xc1, 0x54, 0xe2, 0x5a, 0x6d, 0xc6, 0x99, 0x60, 0x11, 0xef, 0x37, 0xd2, 0x40, 0xdc, + 0x89, 0x6f, 0xff, 0xb0, 0x05, 0xc2, 0x3d, 0xa1, 0x8f, 0xc5, 0xfc, 0x25, 0x99, 0xbe, 0xcf, 0x08, + 0x94, 0x7b, 0x25, 0xdf, 0x5f, 0x43, 0x84, 0xc7, 0x55, 0x87, 0x87, 0x11, 0x14, 0xd7, 0xa0, 0x65, + 0x37, 0x41, 0x40, 0xab, 0x84, 0x29, 0x19, 0x7a, 0xf7, 0xe6, 0x3a, 0x40, 0x93, 0xe1, 0x6a, 0xe9, + 0xc0, 0x14, 0xab, 0xaa, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x1f, 0x2f, 0xc0, 0x88, 0x0c, 0xcc, 0x4a, + 0xef, 0xf1, 0xbd, 0x5b, 0x39, 0x51, 0x56, 0x06, 0x96, 0x3f, 0x8f, 0x12, 0x56, 0xc1, 0xfb, 0xf5, + 0xfc, 0x79, 0x12, 0x80, 0x13, 0x1c, 0xf4, 0x02, 0x0c, 0x45, 0xed, 0x4d, 0x86, 0x9e, 0x32, 0xba, + 0xaf, 0xf3, 0x62, 0x2c, 0xe1, 0xe8, 0x0b, 0x30, 0xc9, 0xeb, 0x85, 0x41, 0xcb, 0xd9, 0xe6, 0x1a, + 0xa7, 0x01, 0xe5, 0x05, 0x37, 0xb9, 0x96, 0x82, 0x1d, 0x1f, 0x56, 0xa6, 0xd3, 0x65, 0x4c, 0x57, + 0xd9, 0x41, 0xc5, 0xfe, 0x0a, 0xa0, 0xce, 0x58, 0xb3, 0xe8, 0x6d, 0x6e, 0x56, 0xe1, 0x86, 0xa4, + 0xd9, 0x77, 0xca, 0xf8, 0x51, 0x69, 0x3c, 0x41, 0x6b, 0x61, 0x55, 0x9f, 0xee, 0xbc, 0xc9, 0xb4, + 0x0b, 0x0f, 0xba, 0x05, 0x83, 0x9c, 0xa9, 0x0a, 0xf2, 0x5d, 0xde, 0xb8, 0x34, 0xc7, 0x1f, 0x16, + 0x08, 0x5f, 0xf0, 0x65, 0x51, 0x1f, 0xbd, 0x0b, 0x23, 0xcd, 0xe0, 0xa1, 0xff, 0xd0, 0x09, 0x9b, + 0x0b, 0xb5, 0x55, 0xb1, 0x2e, 0x33, 0x65, 0xb3, 0x6a, 0x82, 0xa6, 0x3b, 0x13, 0x31, 0x7d, 0x6e, + 0x02, 0xc2, 0x3a, 0x39, 0xb4, 0xc1, 0xe2, 0x67, 0xf1, 0x7c, 0xdd, 0xdd, 0xec, 0xe0, 0x54, 0x8a, + 0x6f, 0x8d, 0xf2, 0x98, 0x08, 0xb2, 0x25, 0xb2, 0x7d, 0x27, 0x84, 0xec, 0xaf, 0x9e, 0x03, 0x63, + 0x3f, 0x18, 0x79, 0x1f, 0xac, 0x53, 0xca, 0xfb, 0x80, 0x61, 0x98, 0xec, 0xb5, 0xe2, 0x83, 0xaa, + 0x1b, 0x76, 0x4b, 0x1c, 0xb4, 0x2c, 0x70, 0x3a, 0x69, 0x4a, 0x08, 0x56, 0x74, 0xb2, 0x93, 0x73, + 0x14, 0x3f, 0xc2, 0xe4, 0x1c, 0xa5, 0x33, 0x4c, 0xce, 0xb1, 0x0e, 0x43, 0xdb, 0x6e, 0x8c, 0x49, + 0x2b, 0x10, 0x02, 0x45, 0xe6, 0x4a, 0xb8, 0xc9, 0x51, 0x3a, 0x43, 0xc3, 0x0b, 0x00, 0x96, 0x44, + 0xd0, 0xdb, 0x6a, 0x0f, 0x0c, 0xe6, 0xcb, 0xe3, 0x9d, 0xcf, 0x21, 0x99, 0xbb, 0x40, 0x24, 0xe3, + 0x18, 0x7a, 0xdc, 0x64, 0x1c, 0x2b, 0x32, 0x85, 0xc6, 0x70, 0xbe, 0xd9, 0x28, 0xcb, 0x90, 0xd1, + 0x23, 0x71, 0x86, 0x91, 0x6c, 0xa4, 0x7c, 0x7a, 0xc9, 0x46, 0x7e, 0xd8, 0x82, 0xf3, 0xad, 0xac, + 0xbc, 0x3b, 0x22, 0x05, 0xc6, 0xeb, 0x7d, 0x27, 0x16, 0x32, 0x1a, 0x64, 0x17, 0xb3, 0x4c, 0x34, + 0x9c, 0xdd, 0x1c, 0x1d, 0xe8, 0x70, 0xb3, 0x29, 0xf2, 0x66, 0x3c, 0x97, 0x93, 0xb5, 0xa4, 0x4b, + 0xae, 0x92, 0x8d, 0x8c, 0x5c, 0x19, 0x9f, 0xcc, 0xcb, 0x95, 0xd1, 0x77, 0x86, 0x8c, 0x24, 0x5f, + 0xc9, 0xd8, 0x87, 0xce, 0x57, 0xf2, 0xb6, 0xca, 0x57, 0xd2, 0x25, 0xea, 0x10, 0xcf, 0x46, 0xd2, + 0x33, 0x4b, 0x89, 0x96, 0x69, 0x64, 0xe2, 0x74, 0x32, 0x8d, 0x18, 0xcc, 0x9e, 0x27, 0xbb, 0x78, + 0xb1, 0x07, 0xb3, 0x37, 0xe8, 0x76, 0x67, 0xf7, 0x3c, 0xab, 0xca, 0xd4, 0x63, 0x65, 0x55, 0xb9, + 0xaf, 0x67, 0x29, 0x41, 0x3d, 0xd2, 0x70, 0x50, 0xa4, 0x3e, 0x73, 0x93, 0xdc, 0xd7, 0x8f, 0xa0, + 0x73, 0xf9, 0x74, 0xd5, 0x49, 0xd3, 0x49, 0x37, 0xeb, 0x10, 0xea, 0xcc, 0x79, 0x32, 0x7d, 0x36, + 0x39, 0x4f, 0xce, 0x9f, 0x7a, 0xce, 0x93, 0x0b, 0x67, 0x90, 0xf3, 0xe4, 0xa9, 0x8f, 0x34, 0xe7, + 0xc9, 0xcc, 0x13, 0xc8, 0x79, 0xb2, 0x9e, 0xe4, 0x3c, 0xb9, 0x98, 0x3f, 0x25, 0x19, 0x76, 0x72, + 0x39, 0x99, 0x4e, 0xee, 0x43, 0xb9, 0x25, 0xbd, 0xbc, 0x45, 0x58, 0xa4, 0xec, 0x64, 0x8b, 0x59, + 0xae, 0xe0, 0x7c, 0x4a, 0x14, 0x08, 0x27, 0xa4, 0x28, 0xdd, 0x24, 0xf3, 0xc9, 0xd3, 0x5d, 0x54, + 0x6f, 0x59, 0x4a, 0x8d, 0xfc, 0x7c, 0x27, 0xf6, 0xdf, 0x28, 0xc0, 0xe5, 0xee, 0xeb, 0x3a, 0xd1, + 0x88, 0xd4, 0x12, 0x0d, 0x7e, 0x4a, 0x23, 0xc2, 0xaf, 0x19, 0x09, 0x56, 0xdf, 0xa1, 0x30, 0x6e, + 0xc2, 0x94, 0x32, 0x90, 0xf3, 0xdc, 0xc6, 0x81, 0x96, 0x84, 0x51, 0x39, 0xeb, 0xd4, 0xd3, 0x08, + 0xb8, 0xb3, 0x0e, 0x5a, 0x80, 0x09, 0xa3, 0x70, 0xb5, 0x2a, 0xae, 0x13, 0x4a, 0x05, 0x53, 0x37, + 0xc1, 0x38, 0x8d, 0x6f, 0x7f, 0xdd, 0x82, 0xa7, 0x72, 0xc2, 0x81, 0xf7, 0x1d, 0xe9, 0x61, 0x0b, + 0x26, 0x5a, 0x66, 0xd5, 0x1e, 0x01, 0x61, 0x8c, 0xa0, 0xe3, 0xaa, 0xaf, 0x29, 0x00, 0x4e, 0x13, + 0x5d, 0xbc, 0xf6, 0x3b, 0x7f, 0x74, 0xf9, 0x13, 0xbf, 0xf7, 0x47, 0x97, 0x3f, 0xf1, 0xfb, 0x7f, + 0x74, 0xf9, 0x13, 0xff, 0xdf, 0xd1, 0x65, 0xeb, 0x77, 0x8e, 0x2e, 0x5b, 0xbf, 0x77, 0x74, 0xd9, + 0xfa, 0xfd, 0xa3, 0xcb, 0xd6, 0x1f, 0x1e, 0x5d, 0xb6, 0xbe, 0xf6, 0xc7, 0x97, 0x3f, 0xf1, 0xa5, + 0xc2, 0xfe, 0x2b, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x64, 0x10, 0x79, 0xf1, 0xa3, 0xdc, 0x00, + 0x00, } diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 09f56b23..643d256d 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -1877,10 +1877,16 @@ message NodeSelectorRequirement { repeated string values = 3; } -// A null or empty node selector term matches no objects. +// A null or empty node selector term matches no objects. The requirements of +// them are ANDed. message NodeSelectorTerm { - // Required. A list of node selector requirements. The requirements are ANDed. + // A list of node selector requirements by node's labels. + // +optional repeated NodeSelectorRequirement matchExpressions = 1; + + // A list of node selector requirements by node's fields. + // +optional + repeated NodeSelectorRequirement matchFields = 2; } // NodeSpec describes the attributes that a node is created with. diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index e51c2715..7ccae768 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -2322,10 +2322,15 @@ type NodeSelector struct { NodeSelectorTerms []NodeSelectorTerm `json:"nodeSelectorTerms" protobuf:"bytes,1,rep,name=nodeSelectorTerms"` } -// A null or empty node selector term matches no objects. +// A null or empty node selector term matches no objects. The requirements of +// them are ANDed. type NodeSelectorTerm struct { - //Required. A list of node selector requirements. The requirements are ANDed. - MatchExpressions []NodeSelectorRequirement `json:"matchExpressions" protobuf:"bytes,1,rep,name=matchExpressions"` + // A list of node selector requirements by node's labels. + // +optional + MatchExpressions []NodeSelectorRequirement `json:"matchExpressions,omitempty" protobuf:"bytes,1,rep,name=matchExpressions"` + // A list of node selector requirements by node's fields. + // +optional + MatchFields []NodeSelectorRequirement `json:"matchFields,omitempty" protobuf:"bytes,2,rep,name=matchFields"` } // A node selector requirement is a selector that contains values, a key, and an operator diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index f909b4aa..4177e499 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1034,8 +1034,9 @@ func (NodeSelectorRequirement) SwaggerDoc() map[string]string { } var map_NodeSelectorTerm = map[string]string{ - "": "A null or empty node selector term matches no objects.", - "matchExpressions": "Required. A list of node selector requirements. The requirements are ANDed.", + "": "A null or empty node selector term matches no objects. The requirements of them are ANDed.", + "matchExpressions": "A list of node selector requirements by node's labels.", + "matchFields": "A list of node selector requirements by node's fields.", } func (NodeSelectorTerm) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index 5fc6d570..47b62205 100644 --- a/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -2543,6 +2543,13 @@ func (in *NodeSelectorTerm) DeepCopyInto(out *NodeSelectorTerm) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.MatchFields != nil { + in, out := &in.MatchFields, &out.MatchFields + *out = make([]NodeSelectorRequirement, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go b/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go index 5dc9d89e..91500805 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go @@ -26,7 +26,6 @@ import ( // VersionInterfaces contains the interfaces one should use for dealing with types of a particular version. type VersionInterfaces struct { runtime.ObjectConvertor - MetadataAccessor } type ListMetaAccessor interface { @@ -113,7 +112,6 @@ type RESTMapping struct { Scope RESTScope runtime.ObjectConvertor - MetadataAccessor } // RESTMapper allows clients to map resources to kind, and map kind and version diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go index ff945acd..75dc1c0e 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go @@ -536,8 +536,7 @@ func (m *DefaultRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string GroupVersionKind: gvk, Scope: scope, - ObjectConvertor: interfaces.ObjectConvertor, - MetadataAccessor: interfaces.MetadataAccessor, + ObjectConvertor: interfaces.ObjectConvertor, }) } diff --git a/vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go b/vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go index 4e13efea..47909209 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go +++ b/vendor/k8s.io/apimachinery/pkg/api/meta/unstructured.go @@ -28,8 +28,7 @@ func InterfacesForUnstructuredConversion(parent VersionInterfacesFunc) VersionIn return func(version schema.GroupVersion) (*VersionInterfaces, error) { if i, err := parent(version); err == nil { return &VersionInterfaces{ - ObjectConvertor: i.ObjectConvertor, - MetadataAccessor: NewAccessor(), + ObjectConvertor: i.ObjectConvertor, }, nil } return InterfacesForUnstructured(version) @@ -41,7 +40,6 @@ func InterfacesForUnstructuredConversion(parent VersionInterfacesFunc) VersionIn // other conversions. func InterfacesForUnstructured(schema.GroupVersion) (*VersionInterfaces, error) { return &VersionInterfaces{ - ObjectConvertor: &unstructured.UnstructuredObjectConverter{}, - MetadataAccessor: NewAccessor(), + ObjectConvertor: &unstructured.UnstructuredObjectConverter{}, }, nil } 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 2b710393..548a01e5 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 @@ -58,6 +58,26 @@ func (obj *Unstructured) IsList() bool { _, ok = field.([]interface{}) return ok } +func (obj *Unstructured) ToList() (*UnstructuredList, error) { + if !obj.IsList() { + // return an empty list back + return &UnstructuredList{Object: obj.Object}, nil + } + + ret := &UnstructuredList{} + ret.Object = obj.Object + + err := obj.EachListItem(func(item runtime.Object) error { + castItem := item.(*Unstructured) + ret.Items = append(ret.Items, *castItem) + return nil + }) + if err != nil { + return nil, err + } + + return ret, nil +} func (obj *Unstructured) EachListItem(fn func(runtime.Object) error) error { field, ok := obj.Object["items"] diff --git a/vendor/k8s.io/apimachinery/pkg/fields/selector.go b/vendor/k8s.io/apimachinery/pkg/fields/selector.go index 3785d8c2..e3e4453b 100644 --- a/vendor/k8s.io/apimachinery/pkg/fields/selector.go +++ b/vendor/k8s.io/apimachinery/pkg/fields/selector.go @@ -55,6 +55,21 @@ type Selector interface { DeepCopySelector() Selector } +type nothingSelector struct{} + +func (n nothingSelector) Matches(_ Fields) bool { return false } +func (n nothingSelector) Empty() bool { return false } +func (n nothingSelector) String() string { return "" } +func (n nothingSelector) Requirements() Requirements { return nil } +func (n nothingSelector) DeepCopySelector() Selector { return n } +func (n nothingSelector) RequiresExactMatch(field string) (value string, found bool) { return "", false } +func (n nothingSelector) Transform(fn TransformFunc) (Selector, error) { return n, nil } + +// Nothing returns a selector that matches no fields +func Nothing() Selector { + return nothingSelector{} +} + // Everything returns a selector that matches all fields. func Everything() Selector { return andTerm{} @@ -449,6 +464,12 @@ func OneTermEqualSelector(k, v string) Selector { return &hasTerm{field: k, value: v} } +// OneTermNotEqualSelector returns an object that matches objects where one field/field does not equal one value. +// Cannot return an error. +func OneTermNotEqualSelector(k, v string) Selector { + return ¬HasTerm{field: k, value: v} +} + // AndSelectors creates a selector that is the logical AND of all the given selectors func AndSelectors(selectors ...Selector) Selector { return andTerm(selectors) diff --git a/vendor/k8s.io/client-go/discovery/discovery_client.go b/vendor/k8s.io/client-go/discovery/discovery_client.go index 08350861..8beecb2f 100644 --- a/vendor/k8s.io/client-go/discovery/discovery_client.go +++ b/vendor/k8s.io/client-go/discovery/discovery_client.go @@ -22,6 +22,7 @@ import ( "net/url" "sort" "strings" + "time" "github.com/golang/protobuf/proto" "github.com/googleapis/gnostic/OpenAPIv2" @@ -43,6 +44,13 @@ const ( mimePb = "application/com.github.proto-openapi.spec.v2@v1.0+protobuf" ) +var ( + // defaultTimeout is the maximum amount of time per request when no timeout has been set on a RESTClient. + // Defaults to 32s in order to have a distinguishable length of time, relative to other timeouts that exist. + // It's a variable to be able to change it in tests. + defaultTimeout = 32 * time.Second +) + // DiscoveryInterface holds the methods that discover server-supported API groups, // versions and resources. type DiscoveryInterface interface { @@ -373,6 +381,9 @@ func withRetries(maxRetries int, f func() ([]*metav1.APIResourceList, error)) ([ func setDiscoveryDefaults(config *restclient.Config) error { config.APIPath = "" config.GroupVersion = nil + if config.Timeout == 0 { + config.Timeout = defaultTimeout + } codec := runtime.NoopEncoder{Decoder: scheme.Codecs.UniversalDecoder()} config.NegotiatedSerializer = serializer.NegotiatedSerializerWrapper(runtime.SerializerInfo{Serializer: codec}) if len(config.UserAgent) == 0 { diff --git a/vendor/k8s.io/client-go/rest/request.go b/vendor/k8s.io/client-go/rest/request.go index 6ca9e019..09ffd76d 100644 --- a/vendor/k8s.io/client-go/rest/request.go +++ b/vendor/k8s.io/client-go/rest/request.go @@ -317,10 +317,14 @@ func (r *Request) Param(paramName, s string) *Request { // VersionedParams will not write query parameters that have omitempty set and are empty. If a // parameter has already been set it is appended to (Params and VersionedParams are additive). func (r *Request) VersionedParams(obj runtime.Object, codec runtime.ParameterCodec) *Request { + return r.SpecificallyVersionedParams(obj, codec, *r.content.GroupVersion) +} + +func (r *Request) SpecificallyVersionedParams(obj runtime.Object, codec runtime.ParameterCodec, version schema.GroupVersion) *Request { if r.err != nil { return r } - params, err := codec.EncodeParameters(obj, *r.content.GroupVersion) + params, err := codec.EncodeParameters(obj, version) if err != nil { r.err = err return r @@ -353,8 +357,8 @@ func (r *Request) SetHeader(key string, values ...string) *Request { return r } -// Timeout makes the request use the given duration as a timeout. Sets the "timeout" -// parameter. +// Timeout makes the request use the given duration as an overall timeout for the +// request. Additionally, if set passes the value as "timeout" parameter in URL. func (r *Request) Timeout(d time.Duration) *Request { if r.err != nil { return r @@ -485,6 +489,19 @@ func (r *Request) tryThrottle() { // Watch attempts to begin watching the requested location. // Returns a watch.Interface, or an error. func (r *Request) Watch() (watch.Interface, error) { + return r.WatchWithSpecificDecoders( + func(body io.ReadCloser) streaming.Decoder { + framer := r.serializers.Framer.NewFrameReader(body) + return streaming.NewDecoder(framer, r.serializers.StreamingSerializer) + }, + r.serializers.Decoder, + ) +} + +// WatchWithSpecificDecoders attempts to begin watching the requested location with a *different* decoder. +// Turns out that you want one "standard" decoder for the watch event and one "personal" decoder for the content +// Returns a watch.Interface, or an error. +func (r *Request) WatchWithSpecificDecoders(wrapperDecoderFn func(io.ReadCloser) streaming.Decoder, embeddedDecoder runtime.Decoder) (watch.Interface, error) { // We specifically don't want to rate limit watches, so we // don't use r.throttle here. if r.err != nil { @@ -532,9 +549,8 @@ func (r *Request) Watch() (watch.Interface, error) { } return nil, fmt.Errorf("for request '%+v', got status: %v", url, resp.StatusCode) } - framer := r.serializers.Framer.NewFrameReader(resp.Body) - decoder := streaming.NewDecoder(framer, r.serializers.StreamingSerializer) - return watch.NewStreamWatcher(restclientwatch.NewDecoder(decoder, r.serializers.Decoder)), nil + wrapperDecoder := wrapperDecoderFn(resp.Body) + return watch.NewStreamWatcher(restclientwatch.NewDecoder(wrapperDecoder, embeddedDecoder)), nil } // updateURLMetrics is a convenience function for pushing metrics. @@ -640,7 +656,6 @@ func (r *Request) request(fn func(*http.Request, *http.Response)) error { } // Right now we make about ten retry attempts if we get a Retry-After response. - // TODO: Change to a timeout based approach. maxRetries := 10 retries := 0 for { @@ -649,6 +664,14 @@ func (r *Request) request(fn func(*http.Request, *http.Response)) error { if err != nil { return err } + if r.timeout > 0 { + if r.ctx == nil { + r.ctx = context.Background() + } + var cancelFn context.CancelFunc + r.ctx, cancelFn = context.WithTimeout(r.ctx, r.timeout) + defer cancelFn() + } if r.ctx != nil { req = req.WithContext(r.ctx) } diff --git a/vendor/k8s.io/client-go/testing/actions.go b/vendor/k8s.io/client-go/testing/actions.go index 6f1c3a89..0210b678 100644 --- a/vendor/k8s.io/client-go/testing/actions.go +++ b/vendor/k8s.io/client-go/testing/actions.go @@ -324,6 +324,10 @@ type Action interface { GetResource() schema.GroupVersionResource GetSubresource() string Matches(verb, resource string) bool + + // DeepCopy is used to copy an action to avoid any risk of accidental mutation. Most people never need to call this + // because the invocation logic deep copies before calls to storage and reactors. + DeepCopy() Action } type GenericAction interface { @@ -404,6 +408,10 @@ func (a ActionImpl) Matches(verb, resource string) bool { return strings.ToLower(verb) == strings.ToLower(a.Verb) && strings.ToLower(resource) == strings.ToLower(a.Resource.Resource) } +func (a ActionImpl) DeepCopy() Action { + ret := a + return ret +} type GenericActionImpl struct { ActionImpl @@ -414,6 +422,14 @@ func (a GenericActionImpl) GetValue() interface{} { return a.Value } +func (a GenericActionImpl) DeepCopy() Action { + return GenericActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + // TODO this is wrong, but no worse than before + Value: a.Value, + } +} + type GetActionImpl struct { ActionImpl Name string @@ -423,6 +439,13 @@ func (a GetActionImpl) GetName() string { return a.Name } +func (a GetActionImpl) DeepCopy() Action { + return GetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + } +} + type ListActionImpl struct { ActionImpl Kind schema.GroupVersionKind @@ -438,6 +461,18 @@ func (a ListActionImpl) GetListRestrictions() ListRestrictions { return a.ListRestrictions } +func (a ListActionImpl) DeepCopy() Action { + return ListActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Kind: a.Kind, + Name: a.Name, + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + type CreateActionImpl struct { ActionImpl Name string @@ -448,6 +483,14 @@ func (a CreateActionImpl) GetObject() runtime.Object { return a.Object } +func (a CreateActionImpl) DeepCopy() Action { + return CreateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + Object: a.Object.DeepCopyObject(), + } +} + type UpdateActionImpl struct { ActionImpl Object runtime.Object @@ -457,6 +500,13 @@ func (a UpdateActionImpl) GetObject() runtime.Object { return a.Object } +func (a UpdateActionImpl) DeepCopy() Action { + return UpdateActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Object: a.Object.DeepCopyObject(), + } +} + type PatchActionImpl struct { ActionImpl Name string @@ -471,6 +521,16 @@ func (a PatchActionImpl) GetPatch() []byte { return a.Patch } +func (a PatchActionImpl) DeepCopy() Action { + patch := make([]byte, len(a.Patch)) + copy(patch, a.Patch) + return PatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + Patch: patch, + } +} + type DeleteActionImpl struct { ActionImpl Name string @@ -480,6 +540,13 @@ func (a DeleteActionImpl) GetName() string { return a.Name } +func (a DeleteActionImpl) DeepCopy() Action { + return DeleteActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Name: a.Name, + } +} + type DeleteCollectionActionImpl struct { ActionImpl ListRestrictions ListRestrictions @@ -489,6 +556,16 @@ func (a DeleteCollectionActionImpl) GetListRestrictions() ListRestrictions { return a.ListRestrictions } +func (a DeleteCollectionActionImpl) DeepCopy() Action { + return DeleteCollectionActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + ListRestrictions: ListRestrictions{ + Labels: a.ListRestrictions.Labels.DeepCopySelector(), + Fields: a.ListRestrictions.Fields.DeepCopySelector(), + }, + } +} + type WatchActionImpl struct { ActionImpl WatchRestrictions WatchRestrictions @@ -498,6 +575,17 @@ func (a WatchActionImpl) GetWatchRestrictions() WatchRestrictions { return a.WatchRestrictions } +func (a WatchActionImpl) DeepCopy() Action { + return WatchActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + WatchRestrictions: WatchRestrictions{ + Labels: a.WatchRestrictions.Labels.DeepCopySelector(), + Fields: a.WatchRestrictions.Fields.DeepCopySelector(), + ResourceVersion: a.WatchRestrictions.ResourceVersion, + }, + } +} + type ProxyGetActionImpl struct { ActionImpl Scheme string @@ -526,3 +614,18 @@ func (a ProxyGetActionImpl) GetPath() string { func (a ProxyGetActionImpl) GetParams() map[string]string { return a.Params } + +func (a ProxyGetActionImpl) DeepCopy() Action { + params := map[string]string{} + for k, v := range a.Params { + params[k] = v + } + return ProxyGetActionImpl{ + ActionImpl: a.ActionImpl.DeepCopy().(ActionImpl), + Scheme: a.Scheme, + Name: a.Name, + Port: a.Port, + Path: a.Path, + Params: params, + } +} diff --git a/vendor/k8s.io/client-go/testing/fake.go b/vendor/k8s.io/client-go/testing/fake.go index 900c2636..8b3f31ea 100644 --- a/vendor/k8s.io/client-go/testing/fake.go +++ b/vendor/k8s.io/client-go/testing/fake.go @@ -131,13 +131,13 @@ func (c *Fake) Invokes(action Action, defaultReturnObj runtime.Object) (runtime. c.Lock() defer c.Unlock() - c.actions = append(c.actions, action) + c.actions = append(c.actions, action.DeepCopy()) for _, reactor := range c.ReactionChain { if !reactor.Handles(action) { continue } - handled, ret, err := reactor.React(action) + handled, ret, err := reactor.React(action.DeepCopy()) if !handled { continue } @@ -154,13 +154,13 @@ func (c *Fake) InvokesWatch(action Action) (watch.Interface, error) { c.Lock() defer c.Unlock() - c.actions = append(c.actions, action) + c.actions = append(c.actions, action.DeepCopy()) for _, reactor := range c.WatchReactionChain { if !reactor.Handles(action) { continue } - handled, ret, err := reactor.React(action) + handled, ret, err := reactor.React(action.DeepCopy()) if !handled { continue } @@ -177,13 +177,13 @@ func (c *Fake) InvokesProxy(action Action) restclient.ResponseWrapper { c.Lock() defer c.Unlock() - c.actions = append(c.actions, action) + c.actions = append(c.actions, action.DeepCopy()) for _, reactor := range c.ProxyReactionChain { if !reactor.Handles(action) { continue } - handled, ret, err := reactor.React(action) + handled, ret, err := reactor.React(action.DeepCopy()) if !handled || err != nil { continue } diff --git a/vendor/k8s.io/client-go/transport/cache.go b/vendor/k8s.io/client-go/transport/cache.go index 7c40848c..83291c57 100644 --- a/vendor/k8s.io/client-go/transport/cache.go +++ b/vendor/k8s.io/client-go/transport/cache.go @@ -44,6 +44,7 @@ type tlsCacheKey struct { certData string keyData string serverName string + dial string } func (t tlsCacheKey) String() string { @@ -51,7 +52,7 @@ func (t tlsCacheKey) String() string { if len(t.keyData) > 0 { keyText = "" } - return fmt.Sprintf("insecure:%v, caData:%#v, certData:%#v, keyData:%s, serverName:%s", t.insecure, t.caData, t.certData, keyText, t.serverName) + return fmt.Sprintf("insecure:%v, caData:%#v, certData:%#v, keyData:%s, serverName:%s, dial:%s", t.insecure, t.caData, t.certData, keyText, t.serverName, t.dial) } func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { @@ -75,7 +76,7 @@ func (c *tlsTransportCache) get(config *Config) (http.RoundTripper, error) { return nil, err } // The options didn't require a custom TLS config - if tlsConfig == nil { + if tlsConfig == nil && config.Dial == nil { return http.DefaultTransport, nil } @@ -109,5 +110,6 @@ func tlsConfigKey(c *Config) (tlsCacheKey, error) { certData: string(c.TLS.CertData), keyData: string(c.TLS.KeyData), serverName: c.TLS.ServerName, + dial: fmt.Sprintf("%p", c.Dial), }, nil } diff --git a/vendor/k8s.io/client-go/transport/transport.go b/vendor/k8s.io/client-go/transport/transport.go index 15be0a3e..c2bb7ae5 100644 --- a/vendor/k8s.io/client-go/transport/transport.go +++ b/vendor/k8s.io/client-go/transport/transport.go @@ -52,7 +52,7 @@ func New(config *Config) (http.RoundTripper, error) { // TLSConfigFor returns a tls.Config that will provide the transport level security defined // by the provided Config. Will return nil if no transport level security is requested. func TLSConfigFor(c *Config) (*tls.Config, error) { - if !(c.HasCA() || c.HasCertAuth() || c.TLS.Insecure) { + if !(c.HasCA() || c.HasCertAuth() || c.TLS.Insecure || len(c.TLS.ServerName) > 0) { return nil, nil } if c.HasCA() && c.TLS.Insecure { diff --git a/vendor/k8s.io/client-go/util/cert/io.go b/vendor/k8s.io/client-go/util/cert/io.go index a41f8054..374e8cae 100644 --- a/vendor/k8s.io/client-go/util/cert/io.go +++ b/vendor/k8s.io/client-go/util/cert/io.go @@ -17,7 +17,11 @@ limitations under the License. package cert import ( + "crypto" + "crypto/ecdsa" + "crypto/rsa" "crypto/x509" + "encoding/pem" "fmt" "io/ioutil" "os" @@ -101,6 +105,27 @@ func LoadOrGenerateKeyFile(keyPath string) (data []byte, wasGenerated bool, err return generatedData, true, nil } +// MarshalPrivateKeyToPEM converts a known private key type of RSA or ECDSA to +// a PEM encoded block or returns an error. +func MarshalPrivateKeyToPEM(privateKey crypto.PrivateKey) ([]byte, error) { + switch t := privateKey.(type) { + case *ecdsa.PrivateKey: + derBytes, err := x509.MarshalECPrivateKey(t) + if err != nil { + return nil, err + } + privateKeyPemBlock := &pem.Block{ + Type: ECPrivateKeyBlockType, + Bytes: derBytes, + } + return pem.EncodeToMemory(privateKeyPemBlock), nil + case *rsa.PrivateKey: + return EncodePrivateKeyPEM(t), nil + default: + return nil, fmt.Errorf("private key is not a recognized type: %T", privateKey) + } +} + // NewPool returns an x509.CertPool containing the certificates in the given PEM-encoded file. // Returns an error if the file could not be read, a certificate could not be parsed, or if the file does not contain any certificates func NewPool(filename string) (*x509.CertPool, error) { diff --git a/vendor/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go b/vendor/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go index b5182d69..307cab45 100644 --- a/vendor/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go +++ b/vendor/k8s.io/code-generator/_examples/apiserver/apis/example/install/install.go @@ -27,7 +27,7 @@ import ( ) // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { +func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { if err := announced.NewGroupMetaFactory( &announced.GroupMetaFactoryArgs{ GroupName: example.SchemeGroupVersion.Group, @@ -37,7 +37,7 @@ func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *r announced.VersionToSchemeFunc{ v1.SchemeGroupVersion.Version: v1.AddToScheme, }, - ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { + ).Register(registry, scheme); err != nil { panic(err) } } diff --git a/vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/install/install.go b/vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/install/install.go index ef241a33..9fc20da1 100644 --- a/vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/install/install.go +++ b/vendor/k8s.io/code-generator/_examples/apiserver/apis/example2/install/install.go @@ -27,7 +27,7 @@ import ( ) // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { +func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { if err := announced.NewGroupMetaFactory( &announced.GroupMetaFactoryArgs{ GroupName: example2.SchemeGroupVersion.Group, @@ -37,7 +37,7 @@ func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *r announced.VersionToSchemeFunc{ v1.SchemeGroupVersion.Version: v1.AddToScheme, }, - ).Announce(groupFactoryRegistry).RegisterAndEnable(registry, scheme); err != nil { + ).Register(registry, scheme); err != nil { panic(err) } } diff --git a/vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go b/vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go index f3da9841..e15eb0bb 100644 --- a/vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go +++ b/vendor/k8s.io/code-generator/_examples/apiserver/clientset/internalversion/scheme/register.go @@ -21,7 +21,6 @@ package scheme import ( os "os" - announced "k8s.io/apimachinery/pkg/apimachinery/announced" registered "k8s.io/apimachinery/pkg/apimachinery/registered" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" runtime "k8s.io/apimachinery/pkg/runtime" @@ -36,15 +35,14 @@ var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) var Registry = registered.NewOrDie(os.Getenv("KUBE_API_VERSIONS")) -var GroupFactoryRegistry = make(announced.APIGroupFactoryRegistry) func init() { v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - Install(GroupFactoryRegistry, Registry, Scheme) + Install(Registry, Scheme) } // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { - example.Install(groupFactoryRegistry, registry, scheme) - secondexample.Install(groupFactoryRegistry, registry, scheme) +func Install(registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { + example.Install(registry, scheme) + secondexample.Install(registry, scheme) } diff --git a/vendor/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go b/vendor/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go index 939242ec..3f2ec603 100644 --- a/vendor/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go +++ b/vendor/k8s.io/code-generator/cmd/client-gen/generators/scheme/generator_for_scheme.go @@ -96,16 +96,14 @@ func (g *GenScheme) GenerateType(c *generator.Context, t *types.Type, w io.Write "runtimeScheme": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime", Name: "Scheme"}), "schemaGroupVersion": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/runtime/schema", Name: "GroupVersion"}), "metav1AddToGroupVersion": c.Universe.Function(types.Name{Package: "k8s.io/apimachinery/pkg/apis/meta/v1", Name: "AddToGroupVersion"}), - "announcedAPIGroupFactoryRegistry": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/apimachinery/announced", Name: "APIGroupFactoryRegistry"}), "registeredNewOrDie": c.Universe.Function(types.Name{Package: "k8s.io/apimachinery/pkg/apimachinery/registered", Name: "NewOrDie"}), "registeredAPIRegistrationManager": c.Universe.Type(types.Name{Package: "k8s.io/apimachinery/pkg/apimachinery/registered", Name: "APIRegistrationManager"}), } globals := map[string]string{ - "Scheme": "Scheme", - "Codecs": "Codecs", - "ParameterCodec": "ParameterCodec", - "Registry": "Registry", - "GroupFactoryRegistry": "GroupFactoryRegistry", + "Scheme": "Scheme", + "Codecs": "Codecs", + "ParameterCodec": "ParameterCodec", + "Registry": "Registry", } for k, v := range globals { if g.PrivateScheme { @@ -140,20 +138,19 @@ var $.ParameterCodec$ = $.runtimeNewParameterCodec|raw$($.Scheme$) var registryRegistration = ` var $.Registry$ = $.registeredNewOrDie|raw$($.osGetenv|raw$("KUBE_API_VERSIONS")) -var $.GroupFactoryRegistry$ = make($.announcedAPIGroupFactoryRegistry|raw$) func init() { $.metav1AddToGroupVersion|raw$($.Scheme$, $.schemaGroupVersion|raw${Version: "v1"}) - Install($.GroupFactoryRegistry$, $.Registry$, $.Scheme$) + Install($.Registry$, $.Scheme$) } // Install registers the API group and adds types to a scheme -func Install(groupFactoryRegistry $.announcedAPIGroupFactoryRegistry|raw$, registry *$.registeredAPIRegistrationManager|raw$, scheme *$.runtimeScheme|raw$) { +func Install(registry *$.registeredAPIRegistrationManager|raw$, scheme *$.runtimeScheme|raw$) { $- range .allInstallGroups$ - $.InstallPackageAlias$.Install(groupFactoryRegistry, registry, scheme) + $.InstallPackageAlias$.Install(registry, scheme) $- end$ $if .customRegister$ - ExtraInstall(groupFactoryRegistry, registry, scheme) + ExtraInstall(registry, scheme) $end -$ } `