From 6b7c39a4f8d4c38e8724550cc3e6e41b7ac7a276 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 20 Mar 2018 14:48:26 -0400 Subject: [PATCH 1/8] pkg/kubelet/apis/cri/runtime: add masked_paths and readonly_paths generate runtime protobufs Signed-off-by: Jess Frazelle --- .../apis/cri/runtime/v1alpha2/api.pb.go | 690 +++++++++++------- .../apis/cri/runtime/v1alpha2/api.proto | 6 + 2 files changed, 413 insertions(+), 283 deletions(-) diff --git a/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go b/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go index 76e8e456ce2..6082f9efcd3 100644 --- a/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go +++ b/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go @@ -1513,6 +1513,12 @@ type LinuxContainerSecurityContext struct { // no_new_privs defines if the flag for no_new_privs should be set on the // container. NoNewPrivs bool `protobuf:"varint,11,opt,name=no_new_privs,json=noNewPrivs,proto3" json:"no_new_privs,omitempty"` + // masked_paths is a slice of paths that should be masked by the container + // runtime, this can be passed directly to the OCI spec. + MaskedPaths []string `protobuf:"bytes,13,rep,name=masked_paths,json=maskedPaths" json:"masked_paths,omitempty"` + // readonly_paths is a slice of paths that should be set as readonly by the + // container runtime, this can be passed directly to the OCI spec. + ReadonlyPaths []string `protobuf:"bytes,14,rep,name=readonly_paths,json=readonlyPaths" json:"readonly_paths,omitempty"` } func (m *LinuxContainerSecurityContext) Reset() { *m = LinuxContainerSecurityContext{} } @@ -1605,6 +1611,20 @@ func (m *LinuxContainerSecurityContext) GetNoNewPrivs() bool { return false } +func (m *LinuxContainerSecurityContext) GetMaskedPaths() []string { + if m != nil { + return m.MaskedPaths + } + return nil +} + +func (m *LinuxContainerSecurityContext) GetReadonlyPaths() []string { + if m != nil { + return m.ReadonlyPaths + } + return nil +} + // LinuxContainerConfig contains platform-specific configuration for // Linux-based containers. type LinuxContainerConfig struct { @@ -6343,6 +6363,36 @@ func (m *LinuxContainerSecurityContext) MarshalTo(dAtA []byte) (int, error) { } i += n27 } + if len(m.MaskedPaths) > 0 { + for _, s := range m.MaskedPaths { + dAtA[i] = 0x6a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } + if len(m.ReadonlyPaths) > 0 { + for _, s := range m.ReadonlyPaths { + dAtA[i] = 0x72 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -9669,6 +9719,18 @@ func (m *LinuxContainerSecurityContext) Size() (n int) { l = m.RunAsGroup.Size() n += 1 + l + sovApi(uint64(l)) } + if len(m.MaskedPaths) > 0 { + for _, s := range m.MaskedPaths { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } + if len(m.ReadonlyPaths) > 0 { + for _, s := range m.ReadonlyPaths { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } return n } @@ -11274,6 +11336,8 @@ func (this *LinuxContainerSecurityContext) String() string { `SeccompProfilePath:` + fmt.Sprintf("%v", this.SeccompProfilePath) + `,`, `NoNewPrivs:` + fmt.Sprintf("%v", this.NoNewPrivs) + `,`, `RunAsGroup:` + strings.Replace(fmt.Sprintf("%v", this.RunAsGroup), "Int64Value", "Int64Value", 1) + `,`, + `MaskedPaths:` + fmt.Sprintf("%v", this.MaskedPaths) + `,`, + `ReadonlyPaths:` + fmt.Sprintf("%v", this.ReadonlyPaths) + `,`, `}`, }, "") return s @@ -17565,6 +17629,64 @@ func (m *LinuxContainerSecurityContext) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MaskedPaths", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MaskedPaths = append(m.MaskedPaths, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReadonlyPaths", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReadonlyPaths = append(m.ReadonlyPaths, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -26714,297 +26836,299 @@ var ( func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } var fileDescriptorApi = []byte{ - // 4665 bytes of a gzipped FileDescriptorProto + // 4698 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5c, 0xcd, 0x6f, 0x1b, 0x49, 0x76, 0x57, 0x93, 0xfa, 0x20, 0x1f, 0x45, 0x89, 0x2a, 0xcb, 0x16, 0x4d, 0xdb, 0xb2, 0xd5, 0x1e, 0x7f, 0xce, 0x58, 0x1e, 0x6b, 0x76, 0x3d, 0xb1, 0x3d, 0x6b, 0x9b, 0x96, 0x64, 0x9b, 0x59, 0x9b, 0x52, 0x9a, 0xd2, 0x7c, 0xec, 0x0c, 0xd0, 0xdb, 0x62, 0x97, 0xa8, 0x5e, 0x93, 0x5d, 0x3d, 0xdd, - 0x4d, 0xdb, 0x4a, 0x80, 0x60, 0x81, 0x20, 0x7b, 0x08, 0x10, 0x20, 0xe7, 0x3d, 0x6e, 0x0e, 0x39, - 0xe4, 0x16, 0x20, 0xc8, 0x21, 0xa7, 0x0d, 0xf6, 0xb0, 0x97, 0x00, 0x39, 0x2d, 0xf2, 0x71, 0xc9, - 0x4c, 0x90, 0x4b, 0x0e, 0x41, 0xfe, 0x80, 0x1c, 0x82, 0xfa, 0x6a, 0xf6, 0x27, 0x3f, 0x3c, 0xde, - 0x9d, 0xc9, 0x49, 0x5d, 0xaf, 0xdf, 0x7b, 0xf5, 0xea, 0xd5, 0xeb, 0x57, 0xaf, 0x7e, 0x55, 0x14, - 0x14, 0x0d, 0xc7, 0x5a, 0x77, 0x5c, 0xe2, 0x13, 0x54, 0x71, 0xfb, 0xb6, 0x6f, 0xf5, 0xf0, 0xfa, - 0xcb, 0x5b, 0x46, 0xd7, 0x39, 0x32, 0x36, 0x6a, 0x37, 0x3a, 0x96, 0x7f, 0xd4, 0x3f, 0x58, 0x6f, - 0x93, 0xde, 0xcd, 0x0e, 0xe9, 0x90, 0x9b, 0x8c, 0xf1, 0xa0, 0x7f, 0xc8, 0x5a, 0xac, 0xc1, 0x9e, - 0xb8, 0x02, 0xf5, 0x3a, 0x2c, 0x7c, 0x8c, 0x5d, 0xcf, 0x22, 0xb6, 0x86, 0xbf, 0xec, 0x63, 0xcf, - 0x47, 0x55, 0x98, 0x7b, 0xc9, 0x29, 0x55, 0xe5, 0x82, 0x72, 0xb5, 0xa8, 0xc9, 0xa6, 0xfa, 0x57, - 0x0a, 0x2c, 0x06, 0xcc, 0x9e, 0x43, 0x6c, 0x0f, 0x67, 0x73, 0xa3, 0x35, 0x98, 0x17, 0xc6, 0xe9, - 0xb6, 0xd1, 0xc3, 0xd5, 0x1c, 0x7b, 0x5d, 0x12, 0xb4, 0xa6, 0xd1, 0xc3, 0xe8, 0x0a, 0x2c, 0x4a, - 0x16, 0xa9, 0x24, 0xcf, 0xb8, 0x16, 0x04, 0x59, 0xf4, 0x86, 0xd6, 0xe1, 0x84, 0x64, 0x34, 0x1c, - 0x2b, 0x60, 0x9e, 0x66, 0xcc, 0x4b, 0xe2, 0x55, 0xdd, 0xb1, 0x04, 0xbf, 0xfa, 0x39, 0x14, 0xb7, - 0x9a, 0xad, 0x4d, 0x62, 0x1f, 0x5a, 0x1d, 0x6a, 0xa2, 0x87, 0x5d, 0x2a, 0x53, 0x55, 0x2e, 0xe4, - 0xa9, 0x89, 0xa2, 0x89, 0x6a, 0x50, 0xf0, 0xb0, 0xe1, 0xb6, 0x8f, 0xb0, 0x57, 0xcd, 0xb1, 0x57, - 0x41, 0x9b, 0x4a, 0x11, 0xc7, 0xb7, 0x88, 0xed, 0x55, 0xf3, 0x5c, 0x4a, 0x34, 0xd5, 0x5f, 0x28, - 0x50, 0xda, 0x25, 0xae, 0xff, 0xdc, 0x70, 0x1c, 0xcb, 0xee, 0xa0, 0xdb, 0x50, 0x60, 0xbe, 0x6c, - 0x93, 0x2e, 0xf3, 0xc1, 0xc2, 0x46, 0x6d, 0x3d, 0x3e, 0x2d, 0xeb, 0xbb, 0x82, 0x43, 0x0b, 0x78, - 0xd1, 0x25, 0x58, 0x68, 0x13, 0xdb, 0x37, 0x2c, 0x1b, 0xbb, 0xba, 0x43, 0x5c, 0x9f, 0xb9, 0x68, - 0x46, 0x2b, 0x07, 0x54, 0xda, 0x0b, 0x3a, 0x03, 0xc5, 0x23, 0xe2, 0xf9, 0x9c, 0x23, 0xcf, 0x38, - 0x0a, 0x94, 0xc0, 0x5e, 0xae, 0xc0, 0x1c, 0x7b, 0x69, 0x39, 0xc2, 0x19, 0xb3, 0xb4, 0xd9, 0x70, - 0xd4, 0xdf, 0x28, 0x30, 0xf3, 0x9c, 0xf4, 0x6d, 0x3f, 0xd6, 0x8d, 0xe1, 0x1f, 0x89, 0x89, 0x0a, - 0x75, 0x63, 0xf8, 0x47, 0x83, 0x6e, 0x28, 0x07, 0x9f, 0x2b, 0xde, 0x0d, 0x7d, 0x59, 0x83, 0x82, - 0x8b, 0x0d, 0x93, 0xd8, 0xdd, 0x63, 0x66, 0x42, 0x41, 0x0b, 0xda, 0x74, 0x12, 0x3d, 0xdc, 0xb5, - 0xec, 0xfe, 0x6b, 0xdd, 0xc5, 0x5d, 0xe3, 0x00, 0x77, 0x99, 0x29, 0x05, 0x6d, 0x41, 0x90, 0x35, - 0x4e, 0x45, 0x5b, 0x50, 0x72, 0x5c, 0xe2, 0x18, 0x1d, 0x83, 0xfa, 0xb1, 0x3a, 0xc3, 0x5c, 0xa5, - 0x26, 0x5d, 0xc5, 0xcc, 0xde, 0x1d, 0x70, 0x6a, 0x61, 0x31, 0xf5, 0x6f, 0x14, 0x58, 0xa4, 0xc1, - 0xe3, 0x39, 0x46, 0x1b, 0xef, 0xb0, 0x29, 0x41, 0x77, 0x60, 0xce, 0xc6, 0xfe, 0x2b, 0xe2, 0xbe, - 0x10, 0x13, 0x70, 0x3e, 0xa9, 0x35, 0x90, 0x79, 0x4e, 0x4c, 0xac, 0x49, 0x7e, 0x74, 0x0b, 0xf2, - 0x8e, 0x65, 0xb2, 0x01, 0x8f, 0x21, 0x46, 0x79, 0xa9, 0x88, 0xe5, 0xb4, 0x99, 0x1f, 0xc6, 0x11, - 0xb1, 0x9c, 0xb6, 0xaa, 0x02, 0x34, 0x6c, 0xff, 0xf6, 0xf7, 0x3e, 0x36, 0xba, 0x7d, 0x8c, 0x96, - 0x61, 0xe6, 0x25, 0x7d, 0x60, 0xc6, 0xe6, 0x35, 0xde, 0x50, 0xbf, 0xca, 0xc3, 0x99, 0x67, 0xd4, - 0x5f, 0x2d, 0xc3, 0x36, 0x0f, 0xc8, 0xeb, 0x16, 0x6e, 0xf7, 0x5d, 0xcb, 0x3f, 0xde, 0x24, 0xb6, - 0x8f, 0x5f, 0xfb, 0xa8, 0x09, 0x4b, 0xb6, 0xd4, 0xac, 0xcb, 0xd0, 0xa4, 0x1a, 0x4a, 0x1b, 0x6b, - 0x43, 0x8c, 0xe0, 0x2e, 0xd2, 0x2a, 0x76, 0x94, 0xe0, 0xa1, 0xa7, 0x83, 0x79, 0x93, 0xda, 0x72, - 0x4c, 0x5b, 0xca, 0x90, 0x5a, 0xdb, 0xcc, 0x32, 0xa1, 0x4b, 0x4e, 0xac, 0xd4, 0xf4, 0x11, 0xd0, - 0xaf, 0x5a, 0x37, 0x3c, 0xbd, 0xef, 0x61, 0x97, 0x39, 0xa6, 0xb4, 0x71, 0x36, 0xa9, 0x65, 0xe0, - 0x02, 0xad, 0xe8, 0xf6, 0xed, 0xba, 0xb7, 0xef, 0x61, 0x97, 0x25, 0x01, 0x11, 0x4b, 0xba, 0x4b, - 0x88, 0x7f, 0xe8, 0xc9, 0xf8, 0x91, 0x64, 0x8d, 0x51, 0xd1, 0x4d, 0x38, 0xe1, 0xf5, 0x1d, 0xa7, - 0x8b, 0x7b, 0xd8, 0xf6, 0x8d, 0xae, 0xde, 0x71, 0x49, 0xdf, 0xf1, 0xaa, 0x33, 0x17, 0xf2, 0x57, - 0xf3, 0x1a, 0x0a, 0xbf, 0x7a, 0xc2, 0xde, 0xa0, 0x55, 0x00, 0xc7, 0xb5, 0x5e, 0x5a, 0x5d, 0xdc, - 0xc1, 0x66, 0x75, 0x96, 0x29, 0x0d, 0x51, 0xd0, 0xfb, 0xb0, 0xec, 0xe1, 0x76, 0x9b, 0xf4, 0x1c, - 0xdd, 0x71, 0xc9, 0xa1, 0xd5, 0xc5, 0x3c, 0xfa, 0xe7, 0x58, 0xf4, 0x23, 0xf1, 0x6e, 0x97, 0xbf, - 0x62, 0xdf, 0xc1, 0x7d, 0x96, 0xd3, 0xe8, 0x48, 0x59, 0xe7, 0xd5, 0xc2, 0x18, 0x43, 0x05, 0x36, - 0x54, 0x66, 0x92, 0xfa, 0x8b, 0x1c, 0x9c, 0x64, 0x9e, 0xdc, 0x25, 0xa6, 0x98, 0x66, 0x91, 0xa4, - 0x2e, 0x42, 0xb9, 0xcd, 0x74, 0xea, 0x8e, 0xe1, 0x62, 0xdb, 0x17, 0x1f, 0xe9, 0x3c, 0x27, 0xee, - 0x32, 0x1a, 0xfa, 0x14, 0x2a, 0x9e, 0x88, 0x0a, 0xbd, 0xcd, 0xc3, 0x42, 0xcc, 0xd9, 0x8d, 0xa4, - 0x09, 0x43, 0x62, 0x49, 0x5b, 0xf4, 0x12, 0xc1, 0x35, 0xe7, 0x1d, 0x7b, 0x6d, 0xbf, 0xcb, 0xb3, - 0x5d, 0x69, 0xe3, 0x7b, 0x19, 0x0a, 0xe3, 0x86, 0xaf, 0xb7, 0xb8, 0xd8, 0xb6, 0xed, 0xbb, 0xc7, - 0x9a, 0x54, 0x52, 0xbb, 0x0b, 0xf3, 0xe1, 0x17, 0xa8, 0x02, 0xf9, 0x17, 0xf8, 0x58, 0x0c, 0x8a, - 0x3e, 0x0e, 0x3e, 0x02, 0x9e, 0x6b, 0x78, 0xe3, 0x6e, 0xee, 0xf7, 0x14, 0xd5, 0x05, 0x34, 0xe8, - 0xe5, 0x39, 0xf6, 0x0d, 0xd3, 0xf0, 0x0d, 0x84, 0x60, 0x9a, 0x2d, 0x23, 0x5c, 0x05, 0x7b, 0xa6, - 0x5a, 0xfb, 0xe2, 0xe3, 0x2d, 0x6a, 0xf4, 0x11, 0x9d, 0x85, 0x62, 0x10, 0xe8, 0x62, 0x2d, 0x19, - 0x10, 0x68, 0x4e, 0x37, 0x7c, 0x1f, 0xf7, 0x1c, 0x9f, 0x85, 0x58, 0x59, 0x93, 0x4d, 0xf5, 0xbf, - 0xa7, 0xa1, 0x92, 0x98, 0x93, 0x87, 0x50, 0xe8, 0x89, 0xee, 0xc5, 0x87, 0xf6, 0x4e, 0x4a, 0x62, - 0x4f, 0x98, 0xaa, 0x05, 0x52, 0x34, 0x6f, 0xd2, 0x1c, 0x1a, 0x5a, 0xff, 0x82, 0x36, 0x9d, 0xf1, - 0x2e, 0xe9, 0xe8, 0xa6, 0xe5, 0xe2, 0xb6, 0x4f, 0xdc, 0x63, 0x61, 0xee, 0x7c, 0x97, 0x74, 0xb6, - 0x24, 0x0d, 0xdd, 0x05, 0x30, 0x6d, 0x8f, 0x4e, 0xf6, 0xa1, 0xd5, 0x61, 0x46, 0x97, 0x36, 0xce, - 0x24, 0x8d, 0x08, 0x16, 0x3b, 0xad, 0x68, 0xda, 0x9e, 0x30, 0xff, 0x11, 0x94, 0xe9, 0x9a, 0xa1, - 0xf7, 0xf8, 0x3a, 0xc5, 0xbf, 0x94, 0xd2, 0xc6, 0xb9, 0xb4, 0x31, 0x04, 0xab, 0x99, 0x36, 0xef, - 0x0c, 0x1a, 0x1e, 0x7a, 0x0c, 0xb3, 0x2c, 0x79, 0x7b, 0xd5, 0x59, 0x26, 0xbc, 0x3e, 0xcc, 0x01, - 0x22, 0x22, 0x9e, 0x31, 0x01, 0x1e, 0x10, 0x42, 0x1a, 0xed, 0x43, 0xc9, 0xb0, 0x6d, 0xe2, 0x1b, - 0x3c, 0xd1, 0xcc, 0x31, 0x65, 0x1f, 0x8c, 0xa1, 0xac, 0x3e, 0x90, 0xe2, 0x1a, 0xc3, 0x7a, 0xd0, - 0x0f, 0x60, 0x86, 0x65, 0x22, 0xf1, 0x21, 0x5e, 0x19, 0x33, 0x68, 0x35, 0x2e, 0x55, 0xbb, 0x03, - 0xa5, 0x90, 0xb1, 0x93, 0x04, 0x69, 0xed, 0x3e, 0x54, 0xe2, 0xa6, 0x4d, 0x14, 0xe4, 0x7f, 0x04, - 0xcb, 0x5a, 0xdf, 0x1e, 0x18, 0x26, 0xab, 0xaf, 0xbb, 0x30, 0x2b, 0x26, 0x9b, 0x47, 0x9c, 0x3a, - 0xda, 0x47, 0x9a, 0x90, 0x08, 0x97, 0x53, 0x47, 0x86, 0x6d, 0x76, 0xb1, 0x2b, 0xfa, 0x95, 0xe5, - 0xd4, 0x53, 0x4e, 0x55, 0x7f, 0x00, 0x27, 0x63, 0x9d, 0x8b, 0x6a, 0xee, 0x1d, 0x58, 0x70, 0x88, - 0xa9, 0x7b, 0x9c, 0xac, 0x5b, 0xa6, 0x4c, 0x43, 0x4e, 0xc0, 0xdb, 0x30, 0xa9, 0x78, 0xcb, 0x27, - 0x4e, 0xd2, 0xf8, 0xf1, 0xc4, 0xab, 0x70, 0x2a, 0x2e, 0xce, 0xbb, 0x57, 0x1f, 0xc0, 0x8a, 0x86, - 0x7b, 0xe4, 0x25, 0x7e, 0x53, 0xd5, 0x35, 0xa8, 0x26, 0x15, 0x08, 0xe5, 0x9f, 0xc1, 0xca, 0x80, - 0xda, 0xf2, 0x0d, 0xbf, 0xef, 0x4d, 0xa4, 0x5c, 0x94, 0xba, 0x07, 0xc4, 0xe3, 0xd3, 0x59, 0xd0, - 0x64, 0x53, 0xbd, 0x16, 0x56, 0xdd, 0xe4, 0x95, 0x05, 0xef, 0x01, 0x2d, 0x40, 0xce, 0x72, 0x84, - 0xba, 0x9c, 0xe5, 0xa8, 0x4f, 0xa1, 0x18, 0x2c, 0xcd, 0xe8, 0xde, 0xa0, 0xc6, 0xcc, 0x8d, 0xbb, - 0x90, 0x07, 0x65, 0xe8, 0x5e, 0x62, 0x29, 0x11, 0x5d, 0xde, 0x03, 0x08, 0x52, 0x9e, 0xac, 0x10, - 0xce, 0x0c, 0x51, 0xac, 0x85, 0xd8, 0xd5, 0x7f, 0x8d, 0x24, 0xc2, 0xd0, 0x20, 0xcc, 0x60, 0x10, - 0x66, 0x24, 0x31, 0xe6, 0xde, 0x28, 0x31, 0x7e, 0x08, 0x33, 0x9e, 0x6f, 0xf8, 0x58, 0x54, 0x51, - 0x6b, 0xc3, 0xc4, 0xa9, 0x11, 0x58, 0xe3, 0xfc, 0xe8, 0x1c, 0x40, 0xdb, 0xc5, 0x86, 0x8f, 0x4d, - 0xdd, 0xe0, 0x59, 0x3c, 0xaf, 0x15, 0x05, 0xa5, 0xee, 0xa3, 0xcd, 0x41, 0x25, 0x38, 0xc3, 0x0c, - 0xbb, 0x36, 0x4c, 0x73, 0x64, 0xaa, 0x06, 0x35, 0x61, 0x90, 0x55, 0x66, 0xc7, 0xcc, 0x2a, 0x42, - 0x01, 0x97, 0x0a, 0xe5, 0xcc, 0xb9, 0xd1, 0x39, 0x93, 0x8b, 0x8e, 0x93, 0x33, 0x0b, 0xa3, 0x73, - 0xa6, 0x50, 0x36, 0x34, 0x67, 0x7e, 0x9b, 0x49, 0xef, 0x5f, 0x14, 0xa8, 0x26, 0xbf, 0x41, 0x91, - 0x7b, 0xee, 0xc2, 0xac, 0xc7, 0x28, 0xe3, 0x64, 0x3e, 0x21, 0x2b, 0x24, 0xd0, 0x53, 0x98, 0xb6, - 0xec, 0x43, 0xc2, 0x36, 0x71, 0xa9, 0xb5, 0x4b, 0x56, 0xaf, 0xeb, 0x0d, 0xfb, 0x90, 0x70, 0x27, - 0x31, 0x0d, 0xb5, 0x0f, 0xa1, 0x18, 0x90, 0x26, 0x1a, 0xdb, 0x0e, 0x2c, 0xc7, 0x42, 0x96, 0x17, - 0xfb, 0x41, 0xa4, 0x2b, 0x93, 0x45, 0xba, 0xfa, 0xd3, 0x5c, 0xf8, 0x4b, 0x7c, 0x6c, 0x75, 0x7d, - 0xec, 0x26, 0xbe, 0xc4, 0x8f, 0xa4, 0x76, 0xfe, 0x19, 0x5e, 0x1e, 0xa9, 0x9d, 0xd7, 0xa4, 0xe2, - 0x63, 0xfa, 0x02, 0x16, 0x58, 0xac, 0xe9, 0x1e, 0xee, 0xb2, 0x82, 0x43, 0x14, 0x7f, 0xdf, 0x1f, - 0xa6, 0x86, 0x5b, 0xc2, 0x23, 0xb6, 0x25, 0xe4, 0xb8, 0x07, 0xcb, 0xdd, 0x30, 0xad, 0xf6, 0x10, - 0x50, 0x92, 0x69, 0x22, 0x9f, 0xb6, 0x68, 0x8a, 0xa3, 0x3b, 0xdd, 0x94, 0x55, 0xf2, 0x90, 0x99, - 0x31, 0x4e, 0xac, 0x70, 0x83, 0x35, 0x21, 0xa1, 0xfe, 0x2a, 0x0f, 0x30, 0x78, 0xf9, 0xff, 0x28, - 0xb7, 0x3d, 0x0c, 0xf2, 0x0a, 0x2f, 0xe4, 0xae, 0x0e, 0x53, 0x9c, 0x9a, 0x51, 0x76, 0xa2, 0x19, - 0x85, 0x97, 0x74, 0x37, 0x86, 0xaa, 0xf9, 0xce, 0xe6, 0x92, 0x67, 0x70, 0x2a, 0x1e, 0x1b, 0x22, - 0x91, 0x6c, 0xc0, 0x8c, 0xe5, 0xe3, 0x1e, 0x47, 0x7b, 0x52, 0x77, 0x67, 0x21, 0x21, 0xce, 0xaa, - 0xae, 0x41, 0xb1, 0xd1, 0x33, 0x3a, 0xb8, 0xe5, 0xe0, 0x36, 0xed, 0xd4, 0xa2, 0x0d, 0x61, 0x08, - 0x6f, 0xa8, 0x1b, 0x50, 0xf8, 0x21, 0x3e, 0xe6, 0x1f, 0xf5, 0x98, 0x86, 0xaa, 0x7f, 0x9e, 0x83, - 0x15, 0xb6, 0x56, 0x6c, 0x4a, 0xac, 0x45, 0xc3, 0x1e, 0xe9, 0xbb, 0x6d, 0xec, 0xb1, 0xd9, 0x76, - 0xfa, 0xba, 0x83, 0x5d, 0x8b, 0x98, 0x02, 0x0a, 0x28, 0xb6, 0x9d, 0xfe, 0x2e, 0x23, 0xa0, 0x33, - 0x40, 0x1b, 0xfa, 0x97, 0x7d, 0x22, 0x02, 0x31, 0xaf, 0x15, 0xda, 0x4e, 0xff, 0x0f, 0x68, 0x5b, - 0xca, 0x7a, 0x47, 0x86, 0x8b, 0x3d, 0x16, 0x67, 0x5c, 0xb6, 0xc5, 0x08, 0xe8, 0x16, 0x9c, 0xec, - 0xe1, 0x1e, 0x71, 0x8f, 0xf5, 0xae, 0xd5, 0xb3, 0x7c, 0xdd, 0xb2, 0xf5, 0x83, 0x63, 0x1f, 0x7b, - 0x22, 0xa6, 0x10, 0x7f, 0xf9, 0x8c, 0xbe, 0x6b, 0xd8, 0x8f, 0xe8, 0x1b, 0xa4, 0x42, 0x99, 0x90, - 0x9e, 0xee, 0xb5, 0x89, 0x8b, 0x75, 0xc3, 0xfc, 0x09, 0x5b, 0x3e, 0xf3, 0x5a, 0x89, 0x90, 0x5e, - 0x8b, 0xd2, 0xea, 0xe6, 0x4f, 0xd0, 0x79, 0x28, 0xb5, 0x9d, 0xbe, 0x87, 0x7d, 0x9d, 0xfe, 0x61, - 0xab, 0x63, 0x51, 0x03, 0x4e, 0xda, 0x74, 0xfa, 0x5e, 0x88, 0xa1, 0x47, 0xfd, 0x3f, 0x17, 0x66, - 0x78, 0x4e, 0xdd, 0x6c, 0x40, 0x39, 0x02, 0x25, 0xd0, 0x5d, 0x1d, 0xc3, 0x0c, 0xc4, 0xae, 0x8e, - 0x3e, 0x53, 0x9a, 0x4b, 0xba, 0xd2, 0x93, 0xec, 0x99, 0xd2, 0xfc, 0x63, 0x47, 0x6e, 0xe9, 0xd8, - 0x33, 0x75, 0x79, 0x17, 0xbf, 0x14, 0x70, 0x53, 0x51, 0xe3, 0x0d, 0xd5, 0x04, 0xd8, 0x34, 0x1c, - 0xe3, 0xc0, 0xea, 0x5a, 0xfe, 0x31, 0xba, 0x06, 0x15, 0xc3, 0x34, 0xf5, 0xb6, 0xa4, 0x58, 0x58, - 0x82, 0x80, 0x8b, 0x86, 0x69, 0x6e, 0x86, 0xc8, 0xe8, 0x5d, 0x58, 0x32, 0x5d, 0xe2, 0x44, 0x79, - 0x39, 0x2a, 0x58, 0xa1, 0x2f, 0xc2, 0xcc, 0xea, 0xcf, 0x67, 0xe0, 0x5c, 0x74, 0x62, 0xe3, 0x70, + 0x4d, 0xdb, 0x4a, 0x80, 0x60, 0x81, 0x20, 0x7b, 0x08, 0x10, 0x20, 0xe7, 0x1c, 0x37, 0x87, 0x1c, + 0x72, 0x0b, 0x10, 0xe4, 0x90, 0xd3, 0x06, 0x7b, 0xd8, 0x4b, 0x80, 0x9c, 0x16, 0xf9, 0xb8, 0x64, + 0x26, 0xc9, 0x25, 0x87, 0x20, 0x7f, 0x40, 0x0e, 0x41, 0x7d, 0x35, 0xfb, 0x93, 0x1f, 0x1e, 0xef, + 0xce, 0xe4, 0xa4, 0xae, 0xd7, 0xef, 0xbd, 0x7a, 0xf5, 0xea, 0xf5, 0xab, 0x57, 0xbf, 0x2a, 0x0a, + 0x8a, 0x86, 0x63, 0xad, 0x3b, 0x2e, 0xf1, 0x09, 0xaa, 0xb8, 0x7d, 0xdb, 0xb7, 0x7a, 0x78, 0xfd, + 0xe5, 0x2d, 0xa3, 0xeb, 0x1c, 0x19, 0x1b, 0xb5, 0x1b, 0x1d, 0xcb, 0x3f, 0xea, 0x1f, 0xac, 0xb7, + 0x49, 0xef, 0x66, 0x87, 0x74, 0xc8, 0x4d, 0xc6, 0x78, 0xd0, 0x3f, 0x64, 0x2d, 0xd6, 0x60, 0x4f, + 0x5c, 0x81, 0x7a, 0x1d, 0x16, 0x3e, 0xc6, 0xae, 0x67, 0x11, 0x5b, 0xc3, 0x5f, 0xf6, 0xb1, 0xe7, + 0xa3, 0x2a, 0xcc, 0xbd, 0xe4, 0x94, 0xaa, 0x72, 0x41, 0xb9, 0x5a, 0xd4, 0x64, 0x53, 0xfd, 0x4b, + 0x05, 0x16, 0x03, 0x66, 0xcf, 0x21, 0xb6, 0x87, 0xb3, 0xb9, 0xd1, 0x1a, 0xcc, 0x0b, 0xe3, 0x74, + 0xdb, 0xe8, 0xe1, 0x6a, 0x8e, 0xbd, 0x2e, 0x09, 0x5a, 0xd3, 0xe8, 0x61, 0x74, 0x05, 0x16, 0x25, + 0x8b, 0x54, 0x92, 0x67, 0x5c, 0x0b, 0x82, 0x2c, 0x7a, 0x43, 0xeb, 0x70, 0x42, 0x32, 0x1a, 0x8e, + 0x15, 0x30, 0x4f, 0x33, 0xe6, 0x25, 0xf1, 0xaa, 0xee, 0x58, 0x82, 0x5f, 0xfd, 0x1c, 0x8a, 0x5b, + 0xcd, 0xd6, 0x26, 0xb1, 0x0f, 0xad, 0x0e, 0x35, 0xd1, 0xc3, 0x2e, 0x95, 0xa9, 0x2a, 0x17, 0xf2, + 0xd4, 0x44, 0xd1, 0x44, 0x35, 0x28, 0x78, 0xd8, 0x70, 0xdb, 0x47, 0xd8, 0xab, 0xe6, 0xd8, 0xab, + 0xa0, 0x4d, 0xa5, 0x88, 0xe3, 0x5b, 0xc4, 0xf6, 0xaa, 0x79, 0x2e, 0x25, 0x9a, 0xea, 0xcf, 0x15, + 0x28, 0xed, 0x12, 0xd7, 0x7f, 0x6e, 0x38, 0x8e, 0x65, 0x77, 0xd0, 0x6d, 0x28, 0x30, 0x5f, 0xb6, + 0x49, 0x97, 0xf9, 0x60, 0x61, 0xa3, 0xb6, 0x1e, 0x9f, 0x96, 0xf5, 0x5d, 0xc1, 0xa1, 0x05, 0xbc, + 0xe8, 0x12, 0x2c, 0xb4, 0x89, 0xed, 0x1b, 0x96, 0x8d, 0x5d, 0xdd, 0x21, 0xae, 0xcf, 0x5c, 0x34, + 0xa3, 0x95, 0x03, 0x2a, 0xed, 0x05, 0x9d, 0x81, 0xe2, 0x11, 0xf1, 0x7c, 0xce, 0x91, 0x67, 0x1c, + 0x05, 0x4a, 0x60, 0x2f, 0x57, 0x60, 0x8e, 0xbd, 0xb4, 0x1c, 0xe1, 0x8c, 0x59, 0xda, 0x6c, 0x38, + 0xea, 0xaf, 0x15, 0x98, 0x79, 0x4e, 0xfa, 0xb6, 0x1f, 0xeb, 0xc6, 0xf0, 0x8f, 0xc4, 0x44, 0x85, + 0xba, 0x31, 0xfc, 0xa3, 0x41, 0x37, 0x94, 0x83, 0xcf, 0x15, 0xef, 0x86, 0xbe, 0xac, 0x41, 0xc1, + 0xc5, 0x86, 0x49, 0xec, 0xee, 0x31, 0x33, 0xa1, 0xa0, 0x05, 0x6d, 0x3a, 0x89, 0x1e, 0xee, 0x5a, + 0x76, 0xff, 0xb5, 0xee, 0xe2, 0xae, 0x71, 0x80, 0xbb, 0xcc, 0x94, 0x82, 0xb6, 0x20, 0xc8, 0x1a, + 0xa7, 0xa2, 0x2d, 0x28, 0x39, 0x2e, 0x71, 0x8c, 0x8e, 0x41, 0xfd, 0x58, 0x9d, 0x61, 0xae, 0x52, + 0x93, 0xae, 0x62, 0x66, 0xef, 0x0e, 0x38, 0xb5, 0xb0, 0x98, 0xfa, 0xd7, 0x0a, 0x2c, 0xd2, 0xe0, + 0xf1, 0x1c, 0xa3, 0x8d, 0x77, 0xd8, 0x94, 0xa0, 0x3b, 0x30, 0x67, 0x63, 0xff, 0x15, 0x71, 0x5f, + 0x88, 0x09, 0x38, 0x9f, 0xd4, 0x1a, 0xc8, 0x3c, 0x27, 0x26, 0xd6, 0x24, 0x3f, 0xba, 0x05, 0x79, + 0xc7, 0x32, 0xd9, 0x80, 0xc7, 0x10, 0xa3, 0xbc, 0x54, 0xc4, 0x72, 0xda, 0xcc, 0x0f, 0xe3, 0x88, + 0x58, 0x4e, 0x5b, 0x55, 0x01, 0x1a, 0xb6, 0x7f, 0xfb, 0x7b, 0x1f, 0x1b, 0xdd, 0x3e, 0x46, 0xcb, + 0x30, 0xf3, 0x92, 0x3e, 0x30, 0x63, 0xf3, 0x1a, 0x6f, 0xa8, 0x5f, 0xe5, 0xe1, 0xcc, 0x33, 0xea, + 0xaf, 0x96, 0x61, 0x9b, 0x07, 0xe4, 0x75, 0x0b, 0xb7, 0xfb, 0xae, 0xe5, 0x1f, 0x6f, 0x12, 0xdb, + 0xc7, 0xaf, 0x7d, 0xd4, 0x84, 0x25, 0x5b, 0x6a, 0xd6, 0x65, 0x68, 0x52, 0x0d, 0xa5, 0x8d, 0xb5, + 0x21, 0x46, 0x70, 0x17, 0x69, 0x15, 0x3b, 0x4a, 0xf0, 0xd0, 0xd3, 0xc1, 0xbc, 0x49, 0x6d, 0x39, + 0xa6, 0x2d, 0x65, 0x48, 0xad, 0x6d, 0x66, 0x99, 0xd0, 0x25, 0x27, 0x56, 0x6a, 0xfa, 0x08, 0xe8, + 0x57, 0xad, 0x1b, 0x9e, 0xde, 0xf7, 0xb0, 0xcb, 0x1c, 0x53, 0xda, 0x38, 0x9b, 0xd4, 0x32, 0x70, + 0x81, 0x56, 0x74, 0xfb, 0x76, 0xdd, 0xdb, 0xf7, 0xb0, 0xcb, 0x92, 0x80, 0x88, 0x25, 0xdd, 0x25, + 0xc4, 0x3f, 0xf4, 0x64, 0xfc, 0x48, 0xb2, 0xc6, 0xa8, 0xe8, 0x26, 0x9c, 0xf0, 0xfa, 0x8e, 0xd3, + 0xc5, 0x3d, 0x6c, 0xfb, 0x46, 0x57, 0xef, 0xb8, 0xa4, 0xef, 0x78, 0xd5, 0x99, 0x0b, 0xf9, 0xab, + 0x79, 0x0d, 0x85, 0x5f, 0x3d, 0x61, 0x6f, 0xd0, 0x2a, 0x80, 0xe3, 0x5a, 0x2f, 0xad, 0x2e, 0xee, + 0x60, 0xb3, 0x3a, 0xcb, 0x94, 0x86, 0x28, 0xe8, 0x7d, 0x58, 0xf6, 0x70, 0xbb, 0x4d, 0x7a, 0x8e, + 0xee, 0xb8, 0xe4, 0xd0, 0xea, 0x62, 0x1e, 0xfd, 0x73, 0x2c, 0xfa, 0x91, 0x78, 0xb7, 0xcb, 0x5f, + 0xb1, 0xef, 0xe0, 0x3e, 0xcb, 0x69, 0x74, 0xa4, 0xac, 0xf3, 0x6a, 0x61, 0x8c, 0xa1, 0x02, 0x1b, + 0x2a, 0x33, 0x49, 0xfd, 0x79, 0x0e, 0x4e, 0x32, 0x4f, 0xee, 0x12, 0x53, 0x4c, 0xb3, 0x48, 0x52, + 0x17, 0xa1, 0xdc, 0x66, 0x3a, 0x75, 0xc7, 0x70, 0xb1, 0xed, 0x8b, 0x8f, 0x74, 0x9e, 0x13, 0x77, + 0x19, 0x0d, 0x7d, 0x0a, 0x15, 0x4f, 0x44, 0x85, 0xde, 0xe6, 0x61, 0x21, 0xe6, 0xec, 0x46, 0xd2, + 0x84, 0x21, 0xb1, 0xa4, 0x2d, 0x7a, 0x89, 0xe0, 0x9a, 0xf3, 0x8e, 0xbd, 0xb6, 0xdf, 0xe5, 0xd9, + 0xae, 0xb4, 0xf1, 0xbd, 0x0c, 0x85, 0x71, 0xc3, 0xd7, 0x5b, 0x5c, 0x6c, 0xdb, 0xf6, 0xdd, 0x63, + 0x4d, 0x2a, 0xa9, 0xdd, 0x85, 0xf9, 0xf0, 0x0b, 0x54, 0x81, 0xfc, 0x0b, 0x7c, 0x2c, 0x06, 0x45, + 0x1f, 0x07, 0x1f, 0x01, 0xcf, 0x35, 0xbc, 0x71, 0x37, 0xf7, 0x3b, 0x8a, 0xea, 0x02, 0x1a, 0xf4, + 0xf2, 0x1c, 0xfb, 0x86, 0x69, 0xf8, 0x06, 0x42, 0x30, 0xcd, 0x96, 0x11, 0xae, 0x82, 0x3d, 0x53, + 0xad, 0x7d, 0xf1, 0xf1, 0x16, 0x35, 0xfa, 0x88, 0xce, 0x42, 0x31, 0x08, 0x74, 0xb1, 0x96, 0x0c, + 0x08, 0x34, 0xa7, 0x1b, 0xbe, 0x8f, 0x7b, 0x8e, 0xcf, 0x42, 0xac, 0xac, 0xc9, 0xa6, 0xfa, 0xdf, + 0xd3, 0x50, 0x49, 0xcc, 0xc9, 0x43, 0x28, 0xf4, 0x44, 0xf7, 0xe2, 0x43, 0x7b, 0x27, 0x25, 0xb1, + 0x27, 0x4c, 0xd5, 0x02, 0x29, 0x9a, 0x37, 0x69, 0x0e, 0x0d, 0xad, 0x7f, 0x41, 0x9b, 0xce, 0x78, + 0x97, 0x74, 0x74, 0xd3, 0x72, 0x71, 0xdb, 0x27, 0xee, 0xb1, 0x30, 0x77, 0xbe, 0x4b, 0x3a, 0x5b, + 0x92, 0x86, 0xee, 0x02, 0x98, 0xb6, 0x47, 0x27, 0xfb, 0xd0, 0xea, 0x30, 0xa3, 0x4b, 0x1b, 0x67, + 0x92, 0x46, 0x04, 0x8b, 0x9d, 0x56, 0x34, 0x6d, 0x4f, 0x98, 0xff, 0x08, 0xca, 0x74, 0xcd, 0xd0, + 0x7b, 0x7c, 0x9d, 0xe2, 0x5f, 0x4a, 0x69, 0xe3, 0x5c, 0xda, 0x18, 0x82, 0xd5, 0x4c, 0x9b, 0x77, + 0x06, 0x0d, 0x0f, 0x3d, 0x86, 0x59, 0x96, 0xbc, 0xbd, 0xea, 0x2c, 0x13, 0x5e, 0x1f, 0xe6, 0x00, + 0x11, 0x11, 0xcf, 0x98, 0x00, 0x0f, 0x08, 0x21, 0x8d, 0xf6, 0xa1, 0x64, 0xd8, 0x36, 0xf1, 0x0d, + 0x9e, 0x68, 0xe6, 0x98, 0xb2, 0x0f, 0xc6, 0x50, 0x56, 0x1f, 0x48, 0x71, 0x8d, 0x61, 0x3d, 0xe8, + 0x07, 0x30, 0xc3, 0x32, 0x91, 0xf8, 0x10, 0xaf, 0x8c, 0x19, 0xb4, 0x1a, 0x97, 0xaa, 0xdd, 0x81, + 0x52, 0xc8, 0xd8, 0x49, 0x82, 0xb4, 0x76, 0x1f, 0x2a, 0x71, 0xd3, 0x26, 0x0a, 0xf2, 0x3f, 0x80, + 0x65, 0xad, 0x6f, 0x0f, 0x0c, 0x93, 0xd5, 0xd7, 0x5d, 0x98, 0x15, 0x93, 0xcd, 0x23, 0x4e, 0x1d, + 0xed, 0x23, 0x4d, 0x48, 0x84, 0xcb, 0xa9, 0x23, 0xc3, 0x36, 0xbb, 0xd8, 0x15, 0xfd, 0xca, 0x72, + 0xea, 0x29, 0xa7, 0xaa, 0x3f, 0x80, 0x93, 0xb1, 0xce, 0x45, 0x35, 0xf7, 0x0e, 0x2c, 0x38, 0xc4, + 0xd4, 0x3d, 0x4e, 0xd6, 0x2d, 0x53, 0xa6, 0x21, 0x27, 0xe0, 0x6d, 0x98, 0x54, 0xbc, 0xe5, 0x13, + 0x27, 0x69, 0xfc, 0x78, 0xe2, 0x55, 0x38, 0x15, 0x17, 0xe7, 0xdd, 0xab, 0x0f, 0x60, 0x45, 0xc3, + 0x3d, 0xf2, 0x12, 0xbf, 0xa9, 0xea, 0x1a, 0x54, 0x93, 0x0a, 0x84, 0xf2, 0xcf, 0x60, 0x65, 0x40, + 0x6d, 0xf9, 0x86, 0xdf, 0xf7, 0x26, 0x52, 0x2e, 0x4a, 0xdd, 0x03, 0xe2, 0xf1, 0xe9, 0x2c, 0x68, + 0xb2, 0xa9, 0x5e, 0x0b, 0xab, 0x6e, 0xf2, 0xca, 0x82, 0xf7, 0x80, 0x16, 0x20, 0x67, 0x39, 0x42, + 0x5d, 0xce, 0x72, 0xd4, 0xa7, 0x50, 0x0c, 0x96, 0x66, 0x74, 0x6f, 0x50, 0x63, 0xe6, 0xc6, 0x5d, + 0xc8, 0x83, 0x32, 0x74, 0x2f, 0xb1, 0x94, 0x88, 0x2e, 0xef, 0x01, 0x04, 0x29, 0x4f, 0x56, 0x08, + 0x67, 0x86, 0x28, 0xd6, 0x42, 0xec, 0xea, 0xbf, 0x44, 0x12, 0x61, 0x68, 0x10, 0x66, 0x30, 0x08, + 0x33, 0x92, 0x18, 0x73, 0x6f, 0x94, 0x18, 0x3f, 0x84, 0x19, 0xcf, 0x37, 0x7c, 0x2c, 0xaa, 0xa8, + 0xb5, 0x61, 0xe2, 0xd4, 0x08, 0xac, 0x71, 0x7e, 0x74, 0x0e, 0xa0, 0xed, 0x62, 0xc3, 0xc7, 0xa6, + 0x6e, 0xf0, 0x2c, 0x9e, 0xd7, 0x8a, 0x82, 0x52, 0xf7, 0xd1, 0xe6, 0xa0, 0x12, 0x9c, 0x61, 0x86, + 0x5d, 0x1b, 0xa6, 0x39, 0x32, 0x55, 0x83, 0x9a, 0x30, 0xc8, 0x2a, 0xb3, 0x63, 0x66, 0x15, 0xa1, + 0x80, 0x4b, 0x85, 0x72, 0xe6, 0xdc, 0xe8, 0x9c, 0xc9, 0x45, 0xc7, 0xc9, 0x99, 0x85, 0xd1, 0x39, + 0x53, 0x28, 0x1b, 0x9a, 0x33, 0xbf, 0xcd, 0xa4, 0xf7, 0xcf, 0x0a, 0x54, 0x93, 0xdf, 0xa0, 0xc8, + 0x3d, 0x77, 0x61, 0xd6, 0x63, 0x94, 0x71, 0x32, 0x9f, 0x90, 0x15, 0x12, 0xe8, 0x29, 0x4c, 0x5b, + 0xf6, 0x21, 0x61, 0x9b, 0xb8, 0xd4, 0xda, 0x25, 0xab, 0xd7, 0xf5, 0x86, 0x7d, 0x48, 0xb8, 0x93, + 0x98, 0x86, 0xda, 0x87, 0x50, 0x0c, 0x48, 0x13, 0x8d, 0x6d, 0x07, 0x96, 0x63, 0x21, 0xcb, 0x8b, + 0xfd, 0x20, 0xd2, 0x95, 0xc9, 0x22, 0x5d, 0xfd, 0x69, 0x2e, 0xfc, 0x25, 0x3e, 0xb6, 0xba, 0x3e, + 0x76, 0x13, 0x5f, 0xe2, 0x47, 0x52, 0x3b, 0xff, 0x0c, 0x2f, 0x8f, 0xd4, 0xce, 0x6b, 0x52, 0xf1, + 0x31, 0x7d, 0x01, 0x0b, 0x2c, 0xd6, 0x74, 0x0f, 0x77, 0x59, 0xc1, 0x21, 0x8a, 0xbf, 0xef, 0x0f, + 0x53, 0xc3, 0x2d, 0xe1, 0x11, 0xdb, 0x12, 0x72, 0xdc, 0x83, 0xe5, 0x6e, 0x98, 0x56, 0x7b, 0x08, + 0x28, 0xc9, 0x34, 0x91, 0x4f, 0x5b, 0x34, 0xc5, 0xd1, 0x9d, 0x6e, 0xca, 0x2a, 0x79, 0xc8, 0xcc, + 0x18, 0x27, 0x56, 0xb8, 0xc1, 0x9a, 0x90, 0x50, 0x7f, 0x99, 0x07, 0x18, 0xbc, 0xfc, 0x7f, 0x94, + 0xdb, 0x1e, 0x06, 0x79, 0x85, 0x17, 0x72, 0x57, 0x87, 0x29, 0x4e, 0xcd, 0x28, 0x3b, 0xd1, 0x8c, + 0xc2, 0x4b, 0xba, 0x1b, 0x43, 0xd5, 0x7c, 0x67, 0x73, 0xc9, 0x33, 0x38, 0x15, 0x8f, 0x0d, 0x91, + 0x48, 0x36, 0x60, 0xc6, 0xf2, 0x71, 0x8f, 0xa3, 0x3d, 0xa9, 0xbb, 0xb3, 0x90, 0x10, 0x67, 0x55, + 0xd7, 0xa0, 0xd8, 0xe8, 0x19, 0x1d, 0xdc, 0x72, 0x70, 0x9b, 0x76, 0x6a, 0xd1, 0x86, 0x30, 0x84, + 0x37, 0xd4, 0x0d, 0x28, 0xfc, 0x10, 0x1f, 0xf3, 0x8f, 0x7a, 0x4c, 0x43, 0xd5, 0x3f, 0xcd, 0xc1, + 0x0a, 0x5b, 0x2b, 0x36, 0x25, 0xd6, 0xa2, 0x61, 0x8f, 0xf4, 0xdd, 0x36, 0xf6, 0xd8, 0x6c, 0x3b, + 0x7d, 0xdd, 0xc1, 0xae, 0x45, 0x4c, 0x01, 0x05, 0x14, 0xdb, 0x4e, 0x7f, 0x97, 0x11, 0xd0, 0x19, + 0xa0, 0x0d, 0xfd, 0xcb, 0x3e, 0x11, 0x81, 0x98, 0xd7, 0x0a, 0x6d, 0xa7, 0xff, 0x7b, 0xb4, 0x2d, + 0x65, 0xbd, 0x23, 0xc3, 0xc5, 0x1e, 0x8b, 0x33, 0x2e, 0xdb, 0x62, 0x04, 0x74, 0x0b, 0x4e, 0xf6, + 0x70, 0x8f, 0xb8, 0xc7, 0x7a, 0xd7, 0xea, 0x59, 0xbe, 0x6e, 0xd9, 0xfa, 0xc1, 0xb1, 0x8f, 0x3d, + 0x11, 0x53, 0x88, 0xbf, 0x7c, 0x46, 0xdf, 0x35, 0xec, 0x47, 0xf4, 0x0d, 0x52, 0xa1, 0x4c, 0x48, + 0x4f, 0xf7, 0xda, 0xc4, 0xc5, 0xba, 0x61, 0xfe, 0x84, 0x2d, 0x9f, 0x79, 0xad, 0x44, 0x48, 0xaf, + 0x45, 0x69, 0x75, 0xf3, 0x27, 0xe8, 0x3c, 0x94, 0xda, 0x4e, 0xdf, 0xc3, 0xbe, 0x4e, 0xff, 0xb0, + 0xd5, 0xb1, 0xa8, 0x01, 0x27, 0x6d, 0x3a, 0x7d, 0x2f, 0xc4, 0xd0, 0xa3, 0xfe, 0x9f, 0x0b, 0x33, + 0x3c, 0xa7, 0x6e, 0x36, 0xa0, 0x1c, 0x81, 0x12, 0xe8, 0xae, 0x8e, 0x61, 0x06, 0x62, 0x57, 0x47, + 0x9f, 0x29, 0xcd, 0x25, 0x5d, 0xe9, 0x49, 0xf6, 0x4c, 0x69, 0xfe, 0xb1, 0x23, 0xb7, 0x74, 0xec, + 0x99, 0xba, 0xbc, 0x8b, 0x5f, 0x0a, 0xb8, 0xa9, 0xa8, 0xf1, 0x86, 0x6a, 0x02, 0x6c, 0x1a, 0x8e, + 0x71, 0x60, 0x75, 0x2d, 0xff, 0x18, 0x5d, 0x83, 0x8a, 0x61, 0x9a, 0x7a, 0x5b, 0x52, 0x2c, 0x2c, + 0x41, 0xc0, 0x45, 0xc3, 0x34, 0x37, 0x43, 0x64, 0xf4, 0x2e, 0x2c, 0x99, 0x2e, 0x71, 0xa2, 0xbc, + 0x1c, 0x15, 0xac, 0xd0, 0x17, 0x61, 0x66, 0xf5, 0x3f, 0x66, 0xe0, 0x5c, 0x74, 0x62, 0xe3, 0x70, 0xcd, 0x43, 0x98, 0x8f, 0xf5, 0x9a, 0x01, 0x15, 0x0c, 0xac, 0xd5, 0x22, 0x12, 0x31, 0xf8, 0x22, 0x97, 0x80, 0x2f, 0x52, 0x01, 0xa1, 0xfc, 0x5b, 0x05, 0x84, 0xa6, 0xdf, 0x0a, 0x20, 0x34, 0x33, 0x19, 0x20, 0x74, 0x99, 0x6d, 0x63, 0xa4, 0x34, 0xdb, 0x3b, 0xf3, 0x50, 0x2b, 0x07, 0x3c, 0xb6, 0x44, 0x8f, 0x63, 0xc0, 0xd1, 0xdc, 0x24, 0xc0, 0x51, 0x21, 0x13, 0x38, 0xa2, 0x51, 0xe3, 0x38, 0x86, 0xdb, 0x23, 0xae, 0x44, 0x86, 0xaa, 0x45, 0x66, 0xc2, 0xa2, 0xa4, 0x0b, 0x54, 0x28, 0x13, 0x43, 0x82, 0x4c, 0x0c, 0xe9, 0x02, 0xcc, 0xdb, 0x44, 0xb7, 0xf1, 0x2b, 0x9d, 0xce, 0xa5, 0x57, - 0x2d, 0xf1, 0x89, 0xb5, 0x49, 0x13, 0xbf, 0xda, 0xa5, 0x94, 0x04, 0xca, 0x34, 0x3f, 0x21, 0xca, - 0xf4, 0xf7, 0x0a, 0x2c, 0x47, 0x83, 0x53, 0x20, 0x02, 0x4f, 0xa0, 0xe8, 0xca, 0xfc, 0x23, 0x02, - 0xf2, 0x5a, 0x46, 0x71, 0x9b, 0x4c, 0x58, 0xda, 0x40, 0x16, 0xfd, 0x28, 0x13, 0x88, 0xba, 0x39, - 0x4a, 0xdf, 0x28, 0x28, 0x4a, 0x6d, 0xc0, 0xf9, 0x4f, 0x2c, 0xdb, 0x24, 0xaf, 0xbc, 0xcc, 0x6f, - 0x2b, 0x25, 0x42, 0x94, 0x94, 0x08, 0x51, 0x7f, 0xa9, 0xc0, 0xa9, 0xb8, 0x2e, 0xe1, 0x8a, 0x46, - 0xd2, 0x15, 0xef, 0x26, 0x4d, 0x8f, 0x0b, 0xa7, 0x3a, 0xe3, 0x8b, 0x4c, 0x67, 0xdc, 0x1a, 0xad, - 0x71, 0xa4, 0x3b, 0xfe, 0x5a, 0x81, 0xd3, 0x99, 0x66, 0xc4, 0x16, 0x02, 0x25, 0xbe, 0x10, 0x88, - 0x45, 0xa4, 0x4d, 0xfa, 0xb6, 0x1f, 0x5a, 0x44, 0x36, 0xd9, 0xc1, 0x00, 0xcf, 0xd6, 0x7a, 0xcf, - 0x78, 0x6d, 0xf5, 0xfa, 0x3d, 0xb1, 0x8a, 0x50, 0x75, 0xcf, 0x39, 0xe5, 0x0d, 0x96, 0x11, 0xb5, - 0x0e, 0x4b, 0x81, 0x95, 0x43, 0xa1, 0xbb, 0x10, 0x14, 0x97, 0x8b, 0x42, 0x71, 0x36, 0xcc, 0x6e, - 0xe1, 0x97, 0x56, 0x1b, 0xbf, 0x95, 0x93, 0x8b, 0x0b, 0x50, 0x72, 0xb0, 0xdb, 0xb3, 0x3c, 0x2f, - 0x48, 0x8f, 0x45, 0x2d, 0x4c, 0x52, 0xff, 0x73, 0x16, 0x16, 0xe3, 0xd1, 0xf1, 0x20, 0x81, 0xfc, - 0x5d, 0x4c, 0x49, 0xdc, 0xf1, 0x81, 0x86, 0x6a, 0xc0, 0x5b, 0xb2, 0x84, 0xc8, 0x65, 0x6d, 0xbf, - 0x83, 0x72, 0x43, 0xd4, 0x17, 0xd4, 0x23, 0x6d, 0xd2, 0xeb, 0x19, 0xb6, 0x29, 0x0f, 0x9c, 0x44, - 0x93, 0xfa, 0xcf, 0x70, 0x3b, 0xd4, 0xed, 0x94, 0xcc, 0x9e, 0xe9, 0xe4, 0xd1, 0xbd, 0xaa, 0x65, - 0x33, 0x04, 0x91, 0xa5, 0xd8, 0xa2, 0x06, 0x82, 0xb4, 0x65, 0xb9, 0x68, 0x1d, 0xa6, 0xb1, 0xfd, - 0x52, 0x16, 0x79, 0x29, 0x27, 0x52, 0xb2, 0x98, 0xd1, 0x18, 0x1f, 0xba, 0x09, 0xb3, 0x3d, 0x1a, - 0x16, 0x72, 0xd7, 0xba, 0x92, 0x71, 0x30, 0xa3, 0x09, 0x36, 0xb4, 0x01, 0x73, 0x26, 0x9b, 0x27, - 0xb9, 0x35, 0xad, 0xa6, 0xe0, 0x92, 0x8c, 0x41, 0x93, 0x8c, 0x68, 0x3b, 0x28, 0x61, 0x8b, 0x59, - 0xb5, 0x67, 0x6c, 0x2a, 0x52, 0xeb, 0xd8, 0xbd, 0x68, 0x1d, 0x0b, 0x4c, 0xd7, 0xc6, 0x68, 0x5d, - 0xc3, 0xc1, 0xc4, 0xd3, 0x50, 0xe8, 0x92, 0x0e, 0x0f, 0xa3, 0x12, 0x3f, 0xcb, 0xec, 0x92, 0x0e, - 0x8b, 0xa2, 0x65, 0x5a, 0xd2, 0x9b, 0x96, 0xcd, 0x52, 0x71, 0x41, 0xe3, 0x0d, 0xfa, 0xf1, 0xb1, - 0x07, 0x9d, 0xd8, 0x6d, 0x5c, 0x2d, 0xb3, 0x57, 0x45, 0x46, 0xd9, 0xb1, 0xdb, 0xac, 0x48, 0xf4, - 0xfd, 0xe3, 0xea, 0x02, 0xa3, 0xd3, 0x47, 0xba, 0x5b, 0xe3, 0xc0, 0xc2, 0x62, 0xd6, 0x6e, 0x2d, - 0x2d, 0x6d, 0x4b, 0x5c, 0xe1, 0x11, 0xcc, 0xbd, 0xe2, 0x89, 0xa0, 0x5a, 0x61, 0xf2, 0x57, 0x47, - 0xa7, 0x17, 0xa1, 0x41, 0x0a, 0x7e, 0x9b, 0x05, 0xfb, 0xaf, 0x14, 0x38, 0xb5, 0xc9, 0x36, 0x33, - 0xa1, 0x3c, 0x36, 0x09, 0xfe, 0x76, 0x27, 0x80, 0x46, 0x33, 0xc1, 0xb2, 0xf8, 0xb8, 0x25, 0x32, - 0xda, 0x80, 0x05, 0xa9, 0x5c, 0xa8, 0xc8, 0x8f, 0x8d, 0xae, 0x96, 0xbd, 0x70, 0x53, 0xfd, 0x08, - 0x56, 0x12, 0xa3, 0x10, 0x1b, 0x8f, 0x35, 0x98, 0x1f, 0xe4, 0xab, 0x60, 0x10, 0xa5, 0x80, 0xd6, - 0x30, 0xd5, 0xbb, 0x70, 0xb2, 0xe5, 0x1b, 0xae, 0x9f, 0x70, 0xc1, 0x18, 0xb2, 0x0c, 0x37, 0x8d, - 0xca, 0x0a, 0x68, 0xb3, 0x05, 0xcb, 0x2d, 0x9f, 0x38, 0x6f, 0xa0, 0x94, 0x66, 0x1d, 0x3a, 0x7e, - 0xd2, 0x97, 0xeb, 0x83, 0x6c, 0xaa, 0x2b, 0x1c, 0xe5, 0x4d, 0xf6, 0x76, 0x0f, 0x4e, 0x71, 0x90, - 0xf5, 0x4d, 0x06, 0x71, 0x5a, 0x42, 0xbc, 0x49, 0xbd, 0xcf, 0xe1, 0xc4, 0x60, 0x59, 0x1c, 0x00, - 0x28, 0xb7, 0xa3, 0x00, 0xca, 0x85, 0x21, 0xb3, 0x1e, 0xc1, 0x4f, 0xfe, 0x32, 0x17, 0xca, 0xeb, - 0x19, 0xf0, 0xc9, 0xbd, 0x28, 0x7c, 0x72, 0x69, 0x94, 0xee, 0x08, 0x7a, 0x92, 0x8c, 0xda, 0x7c, - 0x4a, 0xd4, 0x7e, 0x9e, 0xc0, 0x58, 0xa6, 0xb3, 0x40, 0xaa, 0x98, 0xb5, 0xbf, 0x13, 0x88, 0x45, - 0xe3, 0x10, 0x4b, 0xd0, 0x75, 0x80, 0x89, 0xdf, 0x89, 0x41, 0x2c, 0x6b, 0x23, 0xed, 0x0d, 0x10, - 0x96, 0xbf, 0x9d, 0x86, 0x62, 0xf0, 0x2e, 0xe1, 0xf3, 0xa4, 0xdb, 0x72, 0x29, 0x6e, 0x0b, 0xaf, - 0xc0, 0xf9, 0x6f, 0xb4, 0x02, 0x4f, 0x8f, 0xbd, 0x02, 0x9f, 0x81, 0x22, 0x7b, 0xd0, 0x5d, 0x7c, - 0x28, 0x56, 0xd4, 0x02, 0x23, 0x68, 0xf8, 0x70, 0x10, 0x86, 0xb3, 0x13, 0x85, 0x61, 0x0c, 0xd4, - 0x99, 0x8b, 0x83, 0x3a, 0x0f, 0x82, 0x15, 0x91, 0x2f, 0xa2, 0x57, 0x86, 0xe8, 0x4d, 0x5d, 0x0b, - 0x9b, 0xd1, 0xb5, 0x90, 0xaf, 0xab, 0xef, 0x0d, 0xd3, 0xf2, 0x9d, 0x85, 0x74, 0xf6, 0x39, 0xa4, - 0x13, 0x8e, 0x45, 0x91, 0x59, 0xef, 0x01, 0x04, 0x49, 0x44, 0xe2, 0x3a, 0x67, 0x86, 0x8c, 0x51, - 0x0b, 0xb1, 0x53, 0xb5, 0x91, 0xa9, 0x19, 0x9c, 0xfb, 0x8c, 0x97, 0x1f, 0x33, 0x0e, 0x7d, 0xfe, - 0x77, 0x26, 0x94, 0x5f, 0x32, 0x0e, 0x4a, 0x1e, 0x24, 0xc0, 0xc4, 0x09, 0xa3, 0xf8, 0x76, 0x14, - 0x4b, 0x7c, 0xc3, 0xa8, 0x4b, 0x40, 0x89, 0xac, 0x72, 0x31, 0x5c, 0xf1, 0x9a, 0x43, 0x3d, 0x45, - 0x41, 0xa9, 0xb3, 0x9d, 0xc1, 0xa1, 0x65, 0x5b, 0xde, 0x11, 0x7f, 0x3f, 0xcb, 0x77, 0x06, 0x92, - 0x54, 0x67, 0x77, 0x92, 0xf0, 0x6b, 0xcb, 0xd7, 0xdb, 0xc4, 0xc4, 0x2c, 0xa6, 0x67, 0xb4, 0x02, - 0x25, 0x6c, 0x12, 0x13, 0x0f, 0xbe, 0xbc, 0xc2, 0x9b, 0x7d, 0x79, 0xc5, 0xd8, 0x97, 0x77, 0x0a, - 0x66, 0x5d, 0x6c, 0x78, 0xc4, 0x16, 0x9b, 0x6a, 0xd1, 0xa2, 0x53, 0xd3, 0xc3, 0x9e, 0x47, 0x7b, - 0x12, 0xe5, 0x9a, 0x68, 0x86, 0xca, 0xcc, 0xf9, 0x91, 0x65, 0xe6, 0x90, 0x03, 0x98, 0x58, 0x99, - 0x59, 0x1e, 0x59, 0x66, 0x8e, 0x73, 0xfe, 0x12, 0x2a, 0xb4, 0x17, 0xc6, 0x2b, 0xb4, 0xc3, 0x75, - 0xe9, 0x62, 0xa4, 0x2e, 0xfd, 0x36, 0x3f, 0xd6, 0xdf, 0x28, 0xb0, 0x92, 0xf8, 0xac, 0xc4, 0xe7, - 0x7a, 0x27, 0x76, 0x94, 0xb3, 0x36, 0xd2, 0x67, 0xc1, 0x49, 0xce, 0x93, 0xc8, 0x49, 0xce, 0x07, - 0xa3, 0x05, 0xdf, 0xfa, 0x41, 0xce, 0x9f, 0x2a, 0x70, 0x7e, 0xdf, 0x31, 0x63, 0x15, 0x9e, 0xd8, - 0xf6, 0x8f, 0x9f, 0x38, 0x1e, 0xc8, 0x5a, 0x3f, 0x37, 0x29, 0xce, 0xc2, 0xe5, 0x54, 0x15, 0x2e, - 0x64, 0x9b, 0x21, 0x4a, 0xa6, 0x1f, 0xc3, 0xe2, 0xf6, 0x6b, 0xdc, 0x6e, 0x1d, 0xdb, 0xed, 0x09, - 0x4c, 0xab, 0x40, 0xbe, 0xdd, 0x33, 0x05, 0xb6, 0x49, 0x1f, 0xc3, 0x55, 0x60, 0x3e, 0x5a, 0x05, - 0xea, 0x50, 0x19, 0xf4, 0x20, 0xa6, 0xf7, 0x14, 0x9d, 0x5e, 0x93, 0x32, 0x53, 0xe5, 0xf3, 0x9a, - 0x68, 0x09, 0x3a, 0x76, 0xf9, 0xb5, 0x03, 0x4e, 0xc7, 0xae, 0x1b, 0xcd, 0x16, 0xf9, 0x68, 0xb6, - 0x50, 0x7f, 0xae, 0x40, 0x89, 0xf6, 0xf0, 0x8d, 0xec, 0x17, 0x5b, 0xad, 0xfc, 0x60, 0xab, 0x15, - 0xec, 0xd8, 0xa6, 0xc3, 0x3b, 0xb6, 0x81, 0xe5, 0x33, 0x8c, 0x9c, 0xb4, 0x7c, 0x36, 0xa0, 0x63, - 0xd7, 0x55, 0x2f, 0xc0, 0x3c, 0xb7, 0x4d, 0x8c, 0xbc, 0x02, 0xf9, 0xbe, 0xdb, 0x95, 0x71, 0xd4, - 0x77, 0xbb, 0xea, 0x9f, 0x29, 0x50, 0xae, 0xfb, 0xbe, 0xd1, 0x3e, 0x9a, 0x60, 0x00, 0x81, 0x71, - 0xb9, 0xb0, 0x71, 0xc9, 0x41, 0x0c, 0xcc, 0x9d, 0xce, 0x30, 0x77, 0x26, 0x62, 0xae, 0x0a, 0x0b, - 0xd2, 0x96, 0x4c, 0x83, 0x9b, 0x80, 0x76, 0x89, 0xeb, 0x3f, 0x26, 0xee, 0x2b, 0xc3, 0x35, 0x27, - 0xdb, 0x81, 0x21, 0x98, 0x16, 0xf7, 0x54, 0xf3, 0x57, 0x67, 0x34, 0xf6, 0xac, 0x5e, 0x81, 0x13, - 0x11, 0x7d, 0x99, 0x1d, 0x3f, 0x84, 0x12, 0xcb, 0xfb, 0xa2, 0x14, 0xbf, 0x15, 0x3e, 0x64, 0x19, - 0x6b, 0x95, 0x50, 0x7f, 0x1f, 0x96, 0x68, 0x7d, 0xc0, 0xe8, 0xc1, 0xa7, 0xf8, 0xfd, 0x58, 0x9d, - 0x7a, 0x2e, 0x43, 0x51, 0xac, 0x46, 0xfd, 0x3b, 0x05, 0x66, 0x18, 0x3d, 0xb1, 0x66, 0x9f, 0x81, - 0xa2, 0x8b, 0x1d, 0xa2, 0xfb, 0x46, 0x27, 0xb8, 0x15, 0x4c, 0x09, 0x7b, 0x46, 0xc7, 0x63, 0x97, - 0x9a, 0xe9, 0x4b, 0xd3, 0xea, 0x60, 0xcf, 0x97, 0x57, 0x83, 0x4b, 0x94, 0xb6, 0xc5, 0x49, 0xd4, - 0x49, 0x9e, 0xf5, 0x87, 0xbc, 0xee, 0x9c, 0xd6, 0xd8, 0x33, 0x5a, 0xe7, 0x17, 0xd5, 0xc6, 0x01, - 0xc2, 0xd9, 0x35, 0xb6, 0x1a, 0x14, 0x62, 0xd8, 0x77, 0xd0, 0x56, 0xb7, 0x01, 0x85, 0xbd, 0x20, - 0xfc, 0x7d, 0x13, 0x66, 0x99, 0x93, 0x64, 0x75, 0xb4, 0x92, 0xe1, 0x06, 0x4d, 0xb0, 0xa9, 0x06, - 0x20, 0xee, 0xe0, 0x48, 0x45, 0x34, 0xf9, 0xac, 0x0c, 0xa9, 0x90, 0xfe, 0x41, 0x81, 0x13, 0x91, - 0x3e, 0x84, 0xad, 0x37, 0xa2, 0x9d, 0x64, 0x9a, 0x2a, 0x3a, 0xd8, 0x8c, 0x2c, 0x09, 0x37, 0xb3, - 0x4c, 0xfa, 0x2d, 0x2d, 0x07, 0xff, 0xa8, 0x00, 0xd4, 0xfb, 0xfe, 0x91, 0x40, 0x06, 0xc3, 0x33, - 0xa3, 0x44, 0x67, 0x86, 0xbe, 0x73, 0x0c, 0xcf, 0x7b, 0x45, 0x5c, 0xb9, 0xa7, 0x09, 0xda, 0x0c, - 0xc3, 0xeb, 0xfb, 0x47, 0xf2, 0x00, 0x8b, 0x3e, 0xa3, 0x4b, 0xb0, 0xc0, 0x6f, 0xa2, 0xeb, 0x86, - 0x69, 0xba, 0xd8, 0xf3, 0xc4, 0x49, 0x56, 0x99, 0x53, 0xeb, 0x9c, 0x48, 0xd9, 0x2c, 0x13, 0xdb, - 0xbe, 0xe5, 0x1f, 0xeb, 0x3e, 0x79, 0x81, 0x6d, 0xb1, 0x37, 0x29, 0x4b, 0xea, 0x1e, 0x25, 0x52, - 0x36, 0x17, 0x77, 0x2c, 0xcf, 0x77, 0x25, 0x9b, 0x3c, 0x35, 0x11, 0x54, 0xc6, 0x46, 0x27, 0xa5, - 0xb2, 0xdb, 0xef, 0x76, 0xb9, 0x8b, 0xdf, 0x7c, 0xda, 0xdf, 0x17, 0x03, 0xca, 0x65, 0xc5, 0xf4, - 0xc0, 0x69, 0x62, 0xb8, 0x6f, 0x11, 0x84, 0x79, 0x1f, 0x96, 0x42, 0x63, 0x10, 0x61, 0x15, 0x29, - 0x22, 0x95, 0x68, 0x11, 0xa9, 0x3e, 0x01, 0xc4, 0x71, 0x87, 0x6f, 0x38, 0x6e, 0xf5, 0x24, 0x9c, - 0x88, 0x28, 0x12, 0x2b, 0xf1, 0x75, 0x28, 0x8b, 0xdb, 0x44, 0x22, 0x50, 0x4e, 0x43, 0x81, 0x66, - 0xd4, 0xb6, 0x65, 0xca, 0xd3, 0xcd, 0x39, 0x87, 0x98, 0x9b, 0x96, 0xe9, 0xaa, 0x9f, 0x40, 0x59, - 0xe3, 0xfd, 0x08, 0xde, 0xc7, 0xb0, 0x20, 0xee, 0x1e, 0xe9, 0x91, 0xcb, 0x7f, 0x69, 0x97, 0xcb, - 0xc3, 0x9d, 0x68, 0x65, 0x3b, 0xdc, 0x54, 0x4d, 0xa8, 0xf1, 0x92, 0x21, 0xa2, 0x5e, 0x0e, 0xf6, - 0x31, 0xc8, 0x7b, 0x80, 0x23, 0x7b, 0x89, 0xca, 0x97, 0xdd, 0x70, 0x53, 0x3d, 0x07, 0x67, 0x52, - 0x7b, 0x11, 0x9e, 0x70, 0xa0, 0x32, 0x78, 0x61, 0x5a, 0xf2, 0x98, 0x97, 0x1d, 0xdf, 0x2a, 0xa1, - 0xe3, 0xdb, 0x53, 0x41, 0x91, 0x98, 0x93, 0x8b, 0x18, 0xab, 0x00, 0x07, 0xe5, 0x7e, 0x3e, 0xab, - 0xdc, 0x9f, 0x8e, 0x94, 0xfb, 0x6a, 0x2b, 0xf0, 0xa7, 0xd8, 0x86, 0x3d, 0x62, 0xdb, 0x45, 0xde, - 0xb7, 0x4c, 0x88, 0xea, 0xb0, 0x51, 0x72, 0x56, 0x2d, 0x24, 0xa5, 0x5e, 0x83, 0x72, 0x34, 0x35, - 0x86, 0xf2, 0x9c, 0x92, 0xc8, 0x73, 0x0b, 0xb1, 0x14, 0xf7, 0x61, 0xac, 0x02, 0xce, 0xf6, 0x71, - 0xac, 0xfe, 0xbd, 0x1f, 0x49, 0x76, 0xd7, 0x53, 0x4e, 0x5e, 0x7f, 0x4b, 0x79, 0x6e, 0x59, 0xac, - 0x07, 0x8f, 0x3d, 0x2a, 0x2f, 0x06, 0xad, 0x5e, 0x84, 0xd2, 0x7e, 0xd6, 0x2f, 0x17, 0xa6, 0xe5, - 0x2d, 0x87, 0xdb, 0xb0, 0xfc, 0xd8, 0xea, 0x62, 0xef, 0xd8, 0xf3, 0x71, 0xaf, 0xc1, 0x92, 0xd2, - 0xa1, 0x85, 0x5d, 0xb4, 0x0a, 0xc0, 0xb6, 0x30, 0x0e, 0xb1, 0x82, 0x0b, 0xed, 0x21, 0x8a, 0xfa, - 0x5f, 0x0a, 0x2c, 0x0e, 0x04, 0xf7, 0xd9, 0xd6, 0xed, 0x2c, 0x14, 0xe9, 0x78, 0x3d, 0xdf, 0xe8, - 0x39, 0xf2, 0x3c, 0x2b, 0x20, 0xa0, 0x7b, 0x30, 0x73, 0xe8, 0x49, 0xc8, 0x28, 0x15, 0x40, 0x4f, - 0x33, 0x44, 0x9b, 0x3e, 0xf4, 0x1a, 0x26, 0xfa, 0x08, 0xa0, 0xef, 0x61, 0x53, 0x9c, 0x61, 0xe5, - 0xb3, 0xaa, 0x85, 0xfd, 0xf0, 0xa9, 0x34, 0x15, 0xe0, 0x17, 0x24, 0xee, 0x43, 0xc9, 0xb2, 0x89, - 0x89, 0xd9, 0x99, 0xa3, 0x29, 0x50, 0xa5, 0x11, 0xe2, 0xc0, 0x25, 0xf6, 0x3d, 0x6c, 0xaa, 0x58, - 0xac, 0x85, 0xd2, 0xbf, 0x22, 0x50, 0x9a, 0xb0, 0xc4, 0x93, 0xd6, 0x61, 0x60, 0xb8, 0x8c, 0xd8, - 0xb5, 0x61, 0xa3, 0x63, 0xde, 0xd2, 0x2a, 0x96, 0x28, 0x6d, 0xa4, 0xa8, 0x7a, 0x17, 0x4e, 0x46, - 0x76, 0x48, 0x13, 0x6c, 0x59, 0xd4, 0xdd, 0x18, 0x50, 0x32, 0x08, 0x67, 0x01, 0x43, 0xc8, 0x68, - 0x1e, 0x05, 0x43, 0x78, 0x1c, 0x86, 0xf0, 0xd4, 0xcf, 0xe1, 0x74, 0x04, 0xd1, 0x89, 0x58, 0x74, - 0x3f, 0x56, 0xb9, 0x5d, 0x1e, 0xa5, 0x35, 0x56, 0xc2, 0xfd, 0x8f, 0x02, 0xcb, 0x69, 0x0c, 0x6f, - 0x88, 0x38, 0xfe, 0x38, 0xe3, 0x32, 0xdc, 0x9d, 0xf1, 0xcc, 0xfa, 0x9d, 0xa0, 0xb5, 0x7b, 0x50, - 0x4b, 0xf3, 0x67, 0x72, 0x96, 0xf2, 0x93, 0xcc, 0xd2, 0xcf, 0xf2, 0x21, 0xe4, 0xbd, 0xee, 0xfb, - 0xae, 0x75, 0xd0, 0xa7, 0x21, 0xff, 0xd6, 0xd1, 0xac, 0x46, 0x80, 0xcb, 0x70, 0xd7, 0xde, 0x1a, - 0x22, 0x3e, 0xb0, 0x23, 0x15, 0x9b, 0xf9, 0x34, 0x8a, 0xcd, 0x70, 0x4c, 0xfd, 0xf6, 0x78, 0xfa, - 0xbe, 0xb3, 0x00, 0xe8, 0xcf, 0x72, 0xb0, 0x10, 0x9d, 0x22, 0xb4, 0x0d, 0x60, 0x04, 0x96, 0x8b, - 0x0f, 0xe5, 0xd2, 0x58, 0xc3, 0xd4, 0x42, 0x82, 0xe8, 0x3d, 0xc8, 0xb7, 0x9d, 0xbe, 0x98, 0xb5, - 0x94, 0xc3, 0xe0, 0x4d, 0xa7, 0xcf, 0x33, 0x0a, 0x65, 0xa3, 0x7b, 0x2a, 0x7e, 0xb6, 0x9f, 0x9d, - 0x25, 0x9f, 0xb3, 0xf7, 0x5c, 0x46, 0x30, 0xa3, 0xa7, 0xb0, 0xf0, 0xca, 0xb5, 0x7c, 0xe3, 0xa0, - 0x8b, 0xf5, 0xae, 0x71, 0x8c, 0x5d, 0x91, 0x25, 0xc7, 0x48, 0x64, 0x65, 0x29, 0xf8, 0x8c, 0xca, - 0xa9, 0x7f, 0x0c, 0x05, 0x69, 0xd1, 0x88, 0x15, 0x61, 0x0f, 0x56, 0xfa, 0x94, 0x4d, 0x67, 0x17, - 0xd7, 0x6c, 0xc3, 0x26, 0xba, 0x87, 0xe9, 0x32, 0x2e, 0xaf, 0xd4, 0x8f, 0x48, 0xd1, 0xcb, 0x4c, - 0x7a, 0x93, 0xb8, 0xb8, 0x69, 0xd8, 0xa4, 0xc5, 0x45, 0xd5, 0x97, 0x50, 0x0a, 0x0d, 0x70, 0x84, - 0x09, 0x0d, 0x58, 0x92, 0x47, 0xf1, 0x1e, 0xf6, 0xc5, 0xf2, 0x32, 0x56, 0xe7, 0x8b, 0x42, 0xae, - 0x85, 0x7d, 0x7e, 0x7d, 0xe2, 0x3e, 0x9c, 0xd6, 0x30, 0x71, 0xb0, 0x1d, 0xcc, 0xe7, 0x33, 0xd2, - 0x99, 0x20, 0x83, 0x9f, 0x85, 0x5a, 0x9a, 0x3c, 0xcf, 0x0f, 0xd7, 0xcf, 0x42, 0x41, 0xfe, 0x0c, - 0x15, 0xcd, 0x41, 0x7e, 0x6f, 0x73, 0xb7, 0x32, 0x45, 0x1f, 0xf6, 0xb7, 0x76, 0x2b, 0xca, 0xf5, - 0x1e, 0x54, 0xe2, 0xbf, 0xbc, 0x44, 0x2b, 0x70, 0x62, 0x57, 0xdb, 0xd9, 0xad, 0x3f, 0xa9, 0xef, - 0x35, 0x76, 0x9a, 0xfa, 0xae, 0xd6, 0xf8, 0xb8, 0xbe, 0xb7, 0x5d, 0x99, 0x42, 0x6b, 0x70, 0x2e, - 0xfc, 0xe2, 0xe9, 0x4e, 0x6b, 0x4f, 0xdf, 0xdb, 0xd1, 0x37, 0x77, 0x9a, 0x7b, 0xf5, 0x46, 0x73, - 0x5b, 0xab, 0x28, 0xe8, 0x1c, 0x9c, 0x0e, 0xb3, 0x3c, 0x6a, 0x6c, 0x35, 0xb4, 0xed, 0x4d, 0xfa, - 0x5c, 0x7f, 0x56, 0xc9, 0x5d, 0xbf, 0x05, 0xe5, 0xc8, 0x0f, 0x25, 0xa9, 0x21, 0xbb, 0x3b, 0x5b, - 0x95, 0x29, 0x54, 0x86, 0x62, 0x58, 0x4f, 0x01, 0xa6, 0x9b, 0x3b, 0x5b, 0xdb, 0x95, 0xdc, 0xf5, - 0xbb, 0xb0, 0x18, 0xbb, 0x39, 0x8b, 0x96, 0xa0, 0xdc, 0xaa, 0x37, 0xb7, 0x1e, 0xed, 0x7c, 0xaa, - 0x6b, 0xdb, 0xf5, 0xad, 0xcf, 0x2a, 0x53, 0x68, 0x19, 0x2a, 0x92, 0xd4, 0xdc, 0xd9, 0xe3, 0x54, - 0xe5, 0xfa, 0x8b, 0xd8, 0x97, 0x85, 0xd1, 0x49, 0x58, 0x0a, 0xba, 0xd1, 0x37, 0xb5, 0xed, 0xfa, - 0xde, 0x36, 0xed, 0x3d, 0x42, 0xd6, 0xf6, 0x9b, 0xcd, 0x46, 0xf3, 0x49, 0x45, 0xa1, 0x5a, 0x07, - 0xe4, 0xed, 0x4f, 0x1b, 0x94, 0x39, 0x17, 0x65, 0xde, 0x6f, 0xfe, 0xb0, 0xb9, 0xf3, 0x49, 0xb3, - 0x92, 0xdf, 0xf8, 0xe5, 0x12, 0x2c, 0xc8, 0xf2, 0x0e, 0xbb, 0xec, 0x2e, 0xcb, 0x2e, 0xcc, 0xc9, - 0x1f, 0x33, 0xa7, 0xe4, 0xe5, 0xe8, 0x4f, 0xb0, 0x6b, 0x6b, 0x43, 0x38, 0x44, 0x95, 0x3d, 0x85, - 0x0e, 0x58, 0xd5, 0x1b, 0xba, 0xc9, 0x7c, 0x39, 0xb5, 0xc6, 0x4c, 0x5c, 0x9e, 0xae, 0x5d, 0x19, - 0xc9, 0x17, 0xf4, 0x81, 0x69, 0x61, 0x1b, 0xfe, 0xa9, 0x0e, 0xba, 0x92, 0x56, 0x91, 0xa6, 0xfc, - 0x16, 0xa8, 0x76, 0x75, 0x34, 0x63, 0xd0, 0xcd, 0x0b, 0xa8, 0xc4, 0x7f, 0xb6, 0x83, 0x52, 0x00, - 0xd3, 0x8c, 0xdf, 0x06, 0xd5, 0xae, 0x8f, 0xc3, 0x1a, 0xee, 0x2c, 0xf1, 0x03, 0x97, 0x6b, 0xe3, - 0xfc, 0x62, 0x20, 0xb3, 0xb3, 0xac, 0x1f, 0x17, 0x70, 0x07, 0x46, 0x6f, 0x29, 0xa3, 0xd4, 0x5f, - 0x93, 0xa4, 0xdc, 0x71, 0x4f, 0x73, 0x60, 0xfa, 0x85, 0x67, 0x75, 0x0a, 0x1d, 0xc1, 0x62, 0xec, - 0x52, 0x02, 0x4a, 0x11, 0x4f, 0xbf, 0x7d, 0x51, 0xbb, 0x36, 0x06, 0x67, 0x34, 0x22, 0xc2, 0x97, - 0x10, 0xd2, 0x23, 0x22, 0xe5, 0x8a, 0x43, 0x7a, 0x44, 0xa4, 0xde, 0x67, 0x60, 0xc1, 0x1d, 0xb9, - 0x7c, 0x90, 0x16, 0xdc, 0x69, 0x57, 0x1e, 0x6a, 0x57, 0x46, 0xf2, 0x85, 0x9d, 0x16, 0xbb, 0x8a, - 0x90, 0xe6, 0xb4, 0xf4, 0xab, 0x0e, 0xb5, 0x6b, 0x63, 0x70, 0xc6, 0xa3, 0x60, 0x70, 0xb0, 0x99, - 0x15, 0x05, 0x89, 0x63, 0xf8, 0xac, 0x28, 0x48, 0x9e, 0x91, 0x8a, 0x28, 0x88, 0x1d, 0x48, 0x5e, - 0x1d, 0xe3, 0x00, 0x25, 0x3b, 0x0a, 0xd2, 0x8f, 0x5a, 0xd4, 0x29, 0xf4, 0x27, 0x0a, 0x54, 0xb3, - 0x0e, 0x27, 0x50, 0x4a, 0x55, 0x37, 0xe2, 0x3c, 0xa5, 0xb6, 0x31, 0x89, 0x48, 0x60, 0xc5, 0x97, - 0x80, 0x92, 0xab, 0x1d, 0x7a, 0x37, 0x6d, 0x66, 0x32, 0xd6, 0xd4, 0xda, 0x7b, 0xe3, 0x31, 0x07, - 0x5d, 0xb6, 0xa0, 0x20, 0x8f, 0x43, 0x50, 0x4a, 0x96, 0x8e, 0x1d, 0xc6, 0xd4, 0xd4, 0x61, 0x2c, - 0x81, 0xd2, 0x27, 0x30, 0x4d, 0xa9, 0xe8, 0x5c, 0x3a, 0xb7, 0x54, 0xb6, 0x9a, 0xf5, 0x3a, 0x50, - 0xf4, 0x1c, 0x66, 0x39, 0xfe, 0x8f, 0x52, 0xf0, 0x86, 0xc8, 0x29, 0x45, 0xed, 0x42, 0x36, 0x43, - 0xa0, 0xee, 0x0b, 0xfe, 0x7f, 0x2e, 0x04, 0xb4, 0x8f, 0xde, 0x49, 0xff, 0xe1, 0x70, 0xf4, 0x24, - 0xa1, 0x76, 0x69, 0x04, 0x57, 0xf8, 0xa3, 0x88, 0xd5, 0xba, 0x57, 0x46, 0x6e, 0x58, 0xb2, 0x3f, - 0x8a, 0xf4, 0x2d, 0x11, 0x0f, 0x92, 0xe4, 0x96, 0x29, 0x2d, 0x48, 0x32, 0x37, 0xaa, 0x69, 0x41, - 0x92, 0xbd, 0x0b, 0x53, 0xa7, 0x90, 0x0f, 0x27, 0x52, 0x00, 0x32, 0xf4, 0x5e, 0x56, 0x90, 0xa7, - 0xa1, 0x75, 0xb5, 0x1b, 0x63, 0x72, 0x87, 0x27, 0x5f, 0x7c, 0xf4, 0xe7, 0xb3, 0x51, 0xa3, 0xcc, - 0xc9, 0x8f, 0x7f, 0xe2, 0x1b, 0xff, 0x96, 0x87, 0x79, 0x0e, 0x7e, 0x8a, 0x0a, 0xe6, 0x33, 0x80, - 0xc1, 0xb9, 0x03, 0xba, 0x98, 0xee, 0x93, 0xc8, 0xd9, 0x4c, 0xed, 0x9d, 0xe1, 0x4c, 0xe1, 0x40, - 0x0b, 0x61, 0xf8, 0x69, 0x81, 0x96, 0x3c, 0xaa, 0x48, 0x0b, 0xb4, 0x94, 0x83, 0x00, 0x75, 0x0a, - 0x7d, 0x0c, 0xc5, 0x00, 0x2c, 0x46, 0x69, 0x60, 0x73, 0x0c, 0x0d, 0xaf, 0x5d, 0x1c, 0xca, 0x13, - 0xb6, 0x3a, 0x84, 0x04, 0xa7, 0x59, 0x9d, 0x44, 0x9c, 0xd3, 0xac, 0x4e, 0x83, 0x93, 0x07, 0x3e, - 0xe1, 0x78, 0x51, 0xa6, 0x4f, 0x22, 0x70, 0x5d, 0xa6, 0x4f, 0xa2, 0xa0, 0x93, 0x3a, 0xf5, 0xe8, - 0xf2, 0xaf, 0xbf, 0x5a, 0x55, 0xfe, 0xf9, 0xab, 0xd5, 0xa9, 0x9f, 0x7e, 0xbd, 0xaa, 0xfc, 0xfa, - 0xeb, 0x55, 0xe5, 0x9f, 0xbe, 0x5e, 0x55, 0xfe, 0xfd, 0xeb, 0x55, 0xe5, 0x2f, 0xfe, 0x63, 0x75, - 0xea, 0x47, 0x05, 0x29, 0x7d, 0x30, 0xcb, 0xfe, 0x5b, 0xcd, 0x07, 0xff, 0x17, 0x00, 0x00, 0xff, - 0xff, 0x67, 0xaf, 0xa3, 0x92, 0x73, 0x48, 0x00, 0x00, + 0x2d, 0xf1, 0x89, 0xb5, 0x49, 0x13, 0xbf, 0xda, 0xa5, 0x94, 0x04, 0xca, 0x34, 0x3f, 0x19, 0xca, + 0x84, 0xd6, 0x60, 0xbe, 0x67, 0x78, 0x2f, 0xb0, 0xc9, 0x4c, 0xf1, 0xaa, 0x65, 0x16, 0xc4, 0x25, + 0x4e, 0xa3, 0x36, 0x78, 0xe8, 0x12, 0x04, 0x4e, 0x12, 0x4c, 0x0b, 0x8c, 0xa9, 0x2c, 0xa9, 0x8c, + 0x4d, 0xfd, 0x3b, 0x05, 0x96, 0xa3, 0x61, 0x2e, 0xb0, 0x85, 0x27, 0x50, 0x74, 0x65, 0x26, 0x13, + 0xa1, 0x7d, 0x2d, 0xa3, 0x4c, 0x4e, 0xa6, 0x3e, 0x6d, 0x20, 0x8b, 0x7e, 0x94, 0x09, 0x69, 0xdd, + 0x1c, 0xa5, 0x6f, 0x14, 0xa8, 0xa5, 0x36, 0xe0, 0xfc, 0x27, 0x96, 0x6d, 0x92, 0x57, 0x5e, 0xe6, + 0x57, 0x9a, 0x12, 0x6b, 0x4a, 0x4a, 0xac, 0xa9, 0xbf, 0x50, 0xe0, 0x54, 0x5c, 0x97, 0x70, 0x45, + 0x23, 0xe9, 0x8a, 0x77, 0x93, 0xa6, 0xc7, 0x85, 0x53, 0x9d, 0xf1, 0x45, 0xa6, 0x33, 0x6e, 0x8d, + 0xd6, 0x38, 0xd2, 0x1d, 0x7f, 0xa5, 0xc0, 0xe9, 0x4c, 0x33, 0x62, 0x4b, 0x8a, 0x12, 0x5f, 0x52, + 0xc4, 0x72, 0xd4, 0x26, 0x7d, 0xdb, 0x0f, 0x2d, 0x47, 0x9b, 0xec, 0x88, 0x81, 0xe7, 0x7d, 0xbd, + 0x67, 0xbc, 0xb6, 0x7a, 0xfd, 0x9e, 0x58, 0x8f, 0xa8, 0xba, 0xe7, 0x9c, 0xf2, 0x06, 0x0b, 0x92, + 0x5a, 0x87, 0xa5, 0xc0, 0xca, 0xa1, 0x20, 0x60, 0x08, 0xd4, 0xcb, 0x45, 0x41, 0x3d, 0x1b, 0x66, + 0xb7, 0xf0, 0x4b, 0xab, 0x8d, 0xdf, 0xca, 0x19, 0xc8, 0x05, 0x28, 0x39, 0xd8, 0xed, 0x59, 0x9e, + 0x17, 0x24, 0xda, 0xa2, 0x16, 0x26, 0xa9, 0xff, 0x39, 0x0b, 0x8b, 0xf1, 0xe8, 0x78, 0x90, 0xc0, + 0x10, 0x2f, 0xa6, 0x2c, 0x01, 0xf1, 0x81, 0x86, 0xaa, 0xc9, 0x5b, 0xb2, 0x18, 0xc9, 0x65, 0x6d, + 0xe4, 0x83, 0xc2, 0x45, 0x54, 0x2a, 0xd4, 0x23, 0x6d, 0xd2, 0xeb, 0x19, 0xb6, 0x29, 0x8f, 0xae, + 0x44, 0x93, 0xfa, 0xcf, 0x70, 0x3b, 0xd4, 0xed, 0x94, 0xcc, 0x9e, 0xe9, 0xe4, 0xd1, 0x5d, 0xaf, + 0x65, 0x33, 0x2c, 0x92, 0x25, 0xeb, 0xa2, 0x06, 0x82, 0xb4, 0x65, 0xb9, 0x68, 0x1d, 0xa6, 0xb1, + 0xfd, 0x52, 0x96, 0x8b, 0x29, 0x67, 0x5b, 0xb2, 0x2c, 0xd2, 0x18, 0x1f, 0xba, 0x09, 0xb3, 0x3d, + 0x1a, 0x16, 0x72, 0xff, 0xbb, 0x92, 0x71, 0xc4, 0xa3, 0x09, 0x36, 0xb4, 0x01, 0x73, 0x26, 0x9b, + 0x27, 0xb9, 0xc9, 0xad, 0xa6, 0x20, 0x9c, 0x8c, 0x41, 0x93, 0x8c, 0x68, 0x3b, 0x28, 0x86, 0x8b, + 0x59, 0x55, 0x6c, 0x6c, 0x2a, 0x52, 0x2b, 0xe2, 0xbd, 0x68, 0x45, 0x0c, 0x4c, 0xd7, 0xc6, 0x68, + 0x5d, 0xc3, 0x61, 0xc9, 0xd3, 0x50, 0xe8, 0x92, 0x0e, 0x0f, 0xa3, 0x12, 0x3f, 0x15, 0xed, 0x92, + 0x0e, 0x8b, 0xa2, 0x65, 0xba, 0x39, 0x30, 0x2d, 0x9b, 0x25, 0xf5, 0x82, 0xc6, 0x1b, 0xf4, 0xe3, + 0x63, 0x0f, 0x3a, 0xb1, 0xdb, 0xb8, 0x5a, 0x66, 0xaf, 0x8a, 0x8c, 0xb2, 0x63, 0xb7, 0x59, 0xb9, + 0xe9, 0xfb, 0xc7, 0xd5, 0x05, 0x46, 0xa7, 0x8f, 0x74, 0xdf, 0xc7, 0x21, 0x8a, 0xc5, 0xac, 0x7d, + 0x5f, 0x5a, 0xda, 0x96, 0x08, 0xc5, 0x23, 0x98, 0x7b, 0xc5, 0x13, 0x41, 0xb5, 0xc2, 0xe4, 0xaf, + 0x8e, 0x4e, 0x2f, 0x42, 0x83, 0x14, 0xfc, 0x36, 0x4b, 0xff, 0x5f, 0x2a, 0x70, 0x6a, 0x93, 0x6d, + 0x8b, 0x42, 0x79, 0x6c, 0x12, 0x24, 0xef, 0x4e, 0x00, 0xb2, 0x66, 0xc2, 0x6e, 0xf1, 0x71, 0x4b, + 0x8c, 0xb5, 0x01, 0x0b, 0x52, 0xb9, 0x50, 0x91, 0x1f, 0x1b, 0xa7, 0x2d, 0x7b, 0xe1, 0xa6, 0xfa, + 0x11, 0xac, 0x24, 0x46, 0x21, 0xb6, 0x30, 0x6b, 0x30, 0x3f, 0xc8, 0x57, 0xc1, 0x20, 0x4a, 0x01, + 0xad, 0x61, 0xaa, 0x77, 0xe1, 0x64, 0xcb, 0x37, 0x5c, 0x3f, 0xe1, 0x82, 0x31, 0x64, 0x19, 0x02, + 0x1b, 0x95, 0x15, 0x20, 0x69, 0x0b, 0x96, 0x5b, 0x3e, 0x71, 0xde, 0x40, 0x29, 0xcd, 0x3a, 0x74, + 0xfc, 0xa4, 0x2f, 0xd7, 0x07, 0xd9, 0x54, 0x57, 0x38, 0x5e, 0x9c, 0xec, 0xed, 0x1e, 0x9c, 0xe2, + 0x70, 0xed, 0x9b, 0x0c, 0xe2, 0xb4, 0x04, 0x8b, 0x93, 0x7a, 0x9f, 0xc3, 0x89, 0xc1, 0xb2, 0x38, + 0x80, 0x62, 0x6e, 0x47, 0xa1, 0x98, 0x0b, 0x43, 0x66, 0x3d, 0x82, 0xc4, 0xfc, 0x45, 0x2e, 0x94, + 0xd7, 0x33, 0x80, 0x98, 0x7b, 0x51, 0x20, 0xe6, 0xd2, 0x28, 0xdd, 0x11, 0x1c, 0x26, 0x19, 0xb5, + 0xf9, 0x94, 0xa8, 0xfd, 0x3c, 0x81, 0xd6, 0x4c, 0x67, 0xc1, 0x5d, 0x31, 0x6b, 0x7f, 0x2b, 0x60, + 0x8d, 0xc6, 0xc1, 0x9a, 0xa0, 0xeb, 0x00, 0x5d, 0xbf, 0x13, 0x03, 0x6b, 0xd6, 0x46, 0xda, 0x1b, + 0x60, 0x35, 0x7f, 0x33, 0x0d, 0xc5, 0xe0, 0x5d, 0xc2, 0xe7, 0x49, 0xb7, 0xe5, 0x52, 0xdc, 0x16, + 0x5e, 0x81, 0xf3, 0xdf, 0x68, 0x05, 0x9e, 0x1e, 0x7b, 0x05, 0x3e, 0x03, 0x45, 0xf6, 0xa0, 0xbb, + 0xf8, 0x50, 0xac, 0xa8, 0x05, 0x46, 0xd0, 0xf0, 0xe1, 0x20, 0x0c, 0x67, 0x27, 0x0a, 0xc3, 0x18, + 0x3c, 0x34, 0x17, 0x87, 0x87, 0x1e, 0x04, 0x2b, 0x22, 0x5f, 0x44, 0xaf, 0x0c, 0xd1, 0x9b, 0xba, + 0x16, 0x36, 0xa3, 0x6b, 0x21, 0x5f, 0x57, 0xdf, 0x1b, 0xa6, 0xe5, 0x3b, 0x0b, 0x0e, 0xed, 0x73, + 0x70, 0x28, 0x1c, 0x8b, 0x22, 0xb3, 0xde, 0x03, 0x08, 0x92, 0x88, 0x44, 0x88, 0xce, 0x0c, 0x19, + 0xa3, 0x16, 0x62, 0xa7, 0x6a, 0x23, 0x53, 0x33, 0x38, 0x41, 0x1a, 0x2f, 0x3f, 0x66, 0x1c, 0x1f, + 0xfd, 0xef, 0x4c, 0x28, 0xbf, 0x64, 0x1c, 0xb9, 0x3c, 0x48, 0xc0, 0x92, 0x13, 0x46, 0xf1, 0xed, + 0x28, 0x2a, 0xf9, 0x86, 0x51, 0x97, 0x00, 0x25, 0x59, 0xe5, 0x62, 0xb8, 0xe2, 0x35, 0x07, 0x8d, + 0x8a, 0x82, 0x52, 0x67, 0x3b, 0x83, 0x43, 0xcb, 0xb6, 0xbc, 0x23, 0xfe, 0x7e, 0x96, 0xef, 0x0c, + 0x24, 0xa9, 0xce, 0x6e, 0x37, 0xe1, 0xd7, 0x96, 0xaf, 0xb7, 0x89, 0x89, 0x59, 0x4c, 0xcf, 0x68, + 0x05, 0x4a, 0xd8, 0x24, 0x26, 0x1e, 0x7c, 0x79, 0x85, 0x37, 0xfb, 0xf2, 0x8a, 0xb1, 0x2f, 0xef, + 0x14, 0xcc, 0xba, 0xd8, 0xf0, 0x88, 0x2d, 0xb6, 0xe7, 0xa2, 0x45, 0xa7, 0xa6, 0x87, 0x3d, 0x8f, + 0xf6, 0x24, 0xca, 0x35, 0xd1, 0x0c, 0x95, 0x99, 0xf3, 0x23, 0xcb, 0xcc, 0x21, 0x47, 0x39, 0xb1, + 0x32, 0xb3, 0x3c, 0xb2, 0xcc, 0x1c, 0xe7, 0x24, 0x27, 0x54, 0x68, 0x2f, 0x8c, 0x57, 0x68, 0x87, + 0xeb, 0xd2, 0xc5, 0x48, 0x5d, 0xfa, 0x6d, 0x7e, 0xac, 0xbf, 0x56, 0x60, 0x25, 0xf1, 0x59, 0x89, + 0xcf, 0xf5, 0x4e, 0xec, 0x50, 0x68, 0x6d, 0xa4, 0xcf, 0x82, 0x33, 0xa1, 0x27, 0x91, 0x33, 0xa1, + 0x0f, 0x46, 0x0b, 0xbe, 0xf5, 0x23, 0xa1, 0x3f, 0x56, 0xe0, 0xfc, 0xbe, 0x63, 0xc6, 0x2a, 0x3c, + 0xb1, 0xed, 0x1f, 0x3f, 0x71, 0x3c, 0x90, 0xb5, 0x7e, 0x6e, 0x52, 0x9c, 0x85, 0xcb, 0xa9, 0x2a, + 0x5c, 0xc8, 0x36, 0x43, 0x94, 0x4c, 0x3f, 0x86, 0xc5, 0xed, 0xd7, 0xb8, 0xdd, 0x3a, 0xb6, 0xdb, + 0x13, 0x98, 0x56, 0x81, 0x7c, 0xbb, 0x67, 0x0a, 0x94, 0x94, 0x3e, 0x86, 0xab, 0xc0, 0x7c, 0xb4, + 0x0a, 0xd4, 0xa1, 0x32, 0xe8, 0x41, 0x4c, 0xef, 0x29, 0x3a, 0xbd, 0x26, 0x65, 0xa6, 0xca, 0xe7, + 0x35, 0xd1, 0x12, 0x74, 0xec, 0xf2, 0x0b, 0x0c, 0x9c, 0x8e, 0x5d, 0x37, 0x9a, 0x2d, 0xf2, 0xd1, + 0x6c, 0xa1, 0xfe, 0xb9, 0x02, 0x25, 0xda, 0xc3, 0x37, 0xb2, 0x5f, 0x6c, 0xb5, 0xf2, 0x83, 0xad, + 0x56, 0xb0, 0x63, 0x9b, 0x0e, 0xef, 0xd8, 0x06, 0x96, 0xcf, 0x30, 0x72, 0xd2, 0xf2, 0xd9, 0x80, + 0x8e, 0x5d, 0x57, 0xbd, 0x00, 0xf3, 0xdc, 0x36, 0x31, 0xf2, 0x0a, 0xe4, 0xfb, 0x6e, 0x57, 0xc6, + 0x51, 0xdf, 0xed, 0xaa, 0x7f, 0xa2, 0x40, 0xb9, 0xee, 0xfb, 0x46, 0xfb, 0x68, 0x82, 0x01, 0x04, + 0xc6, 0xe5, 0xc2, 0xc6, 0x25, 0x07, 0x31, 0x30, 0x77, 0x3a, 0xc3, 0xdc, 0x99, 0x88, 0xb9, 0x2a, + 0x2c, 0x48, 0x5b, 0x32, 0x0d, 0x6e, 0x02, 0xda, 0x25, 0xae, 0xff, 0x98, 0xb8, 0xaf, 0x0c, 0xd7, + 0x9c, 0x6c, 0x07, 0x86, 0x60, 0x5a, 0xdc, 0x78, 0xcd, 0x5f, 0x9d, 0xd1, 0xd8, 0xb3, 0x7a, 0x05, + 0x4e, 0x44, 0xf4, 0x65, 0x76, 0xfc, 0x10, 0x4a, 0x2c, 0xef, 0x8b, 0x52, 0xfc, 0x56, 0xf8, 0xb8, + 0x66, 0xac, 0x55, 0x42, 0xfd, 0x5d, 0x58, 0xa2, 0xf5, 0x01, 0xa3, 0x07, 0x9f, 0xe2, 0xf7, 0x63, + 0x75, 0xea, 0xb9, 0x0c, 0x45, 0xb1, 0x1a, 0xf5, 0x6f, 0x15, 0x98, 0x61, 0xf4, 0xc4, 0x9a, 0x7d, + 0x06, 0x8a, 0x2e, 0x76, 0x88, 0xee, 0x1b, 0x9d, 0xe0, 0x7e, 0x31, 0x25, 0xec, 0x19, 0x1d, 0x8f, + 0x5d, 0x8f, 0xa6, 0x2f, 0x4d, 0xab, 0x83, 0x3d, 0x5f, 0x5e, 0x32, 0x2e, 0x51, 0xda, 0x16, 0x27, + 0x51, 0x27, 0x79, 0xd6, 0xef, 0xf3, 0xba, 0x73, 0x5a, 0x63, 0xcf, 0x68, 0x9d, 0x5f, 0x79, 0x1b, + 0x07, 0x52, 0x67, 0x17, 0xe2, 0x6a, 0x50, 0x88, 0xa1, 0xe8, 0x41, 0x5b, 0xdd, 0x06, 0x14, 0xf6, + 0x82, 0xf0, 0xf7, 0x4d, 0x98, 0x65, 0x4e, 0x92, 0xd5, 0xd1, 0x4a, 0x86, 0x1b, 0x34, 0xc1, 0xa6, + 0x1a, 0x80, 0xb8, 0x83, 0x23, 0x15, 0xd1, 0xe4, 0xb3, 0x32, 0xa4, 0x42, 0xfa, 0x7b, 0x05, 0x4e, + 0x44, 0xfa, 0x10, 0xb6, 0xde, 0x88, 0x76, 0x92, 0x69, 0xaa, 0xe8, 0x60, 0x33, 0xb2, 0x24, 0xdc, + 0xcc, 0x32, 0xe9, 0x37, 0xb4, 0x1c, 0xfc, 0x83, 0x02, 0x50, 0xef, 0xfb, 0x47, 0x02, 0x19, 0x0c, + 0xcf, 0x8c, 0x12, 0x9d, 0x19, 0xfa, 0xce, 0x31, 0x3c, 0xef, 0x15, 0x71, 0xe5, 0x9e, 0x26, 0x68, + 0x33, 0x0c, 0xaf, 0xef, 0x1f, 0xc9, 0xa3, 0x30, 0xfa, 0x8c, 0x2e, 0xc1, 0x02, 0xbf, 0xd3, 0xae, + 0x1b, 0xa6, 0xe9, 0x62, 0xcf, 0x13, 0x67, 0x62, 0x65, 0x4e, 0xad, 0x73, 0x22, 0x65, 0xb3, 0x4c, + 0x6c, 0xfb, 0x96, 0x7f, 0xac, 0xfb, 0xe4, 0x05, 0xb6, 0xc5, 0xde, 0xa4, 0x2c, 0xa9, 0x7b, 0x94, + 0xc8, 0x0f, 0x07, 0x3a, 0x96, 0xe7, 0xbb, 0x92, 0x4d, 0x9e, 0xbf, 0x08, 0x2a, 0x63, 0xa3, 0x93, + 0x52, 0xd9, 0xed, 0x77, 0xbb, 0xdc, 0xc5, 0x6f, 0x3e, 0xed, 0xef, 0x8b, 0x01, 0xe5, 0xb2, 0x62, + 0x7a, 0xe0, 0x34, 0x31, 0xdc, 0xb7, 0x08, 0xc2, 0xbc, 0x0f, 0x4b, 0xa1, 0x31, 0x88, 0xb0, 0x8a, + 0x14, 0x91, 0x4a, 0xb4, 0x88, 0x54, 0x9f, 0x00, 0xe2, 0xb8, 0xc3, 0x37, 0x1c, 0xb7, 0x7a, 0x12, + 0x4e, 0x44, 0x14, 0x89, 0x95, 0xf8, 0x3a, 0x94, 0xc5, 0xbd, 0x24, 0x11, 0x28, 0xa7, 0xa1, 0x40, + 0x33, 0x6a, 0xdb, 0x32, 0xe5, 0x39, 0xe9, 0x9c, 0x43, 0xcc, 0x4d, 0xcb, 0x74, 0xd5, 0x4f, 0xa0, + 0xac, 0xf1, 0x7e, 0x04, 0xef, 0x63, 0x58, 0x10, 0xb7, 0x98, 0xf4, 0xc8, 0x35, 0xc2, 0xb4, 0x6b, + 0xea, 0xe1, 0x4e, 0xb4, 0xb2, 0x1d, 0x6e, 0xaa, 0x26, 0xd4, 0x78, 0xc9, 0x10, 0x51, 0x2f, 0x07, + 0xfb, 0x18, 0xe4, 0x8d, 0xc2, 0x91, 0xbd, 0x44, 0xe5, 0xcb, 0x6e, 0xb8, 0xa9, 0x9e, 0x83, 0x33, + 0xa9, 0xbd, 0x08, 0x4f, 0x38, 0x50, 0x19, 0xbc, 0x30, 0x2d, 0x79, 0x60, 0xcc, 0x0e, 0x82, 0x95, + 0xd0, 0x41, 0xf0, 0xa9, 0xa0, 0x48, 0xcc, 0xc9, 0x45, 0x8c, 0x55, 0x80, 0x83, 0x72, 0x3f, 0x9f, + 0x55, 0xee, 0x4f, 0x47, 0xca, 0x7d, 0xb5, 0x15, 0xf8, 0x53, 0x6c, 0xc3, 0x1e, 0xb1, 0xed, 0x22, + 0xef, 0x5b, 0x26, 0x44, 0x75, 0xd8, 0x28, 0x39, 0xab, 0x16, 0x92, 0x52, 0xaf, 0x41, 0x39, 0x9a, + 0x1a, 0x43, 0x79, 0x4e, 0x49, 0xe4, 0xb9, 0x85, 0x58, 0x8a, 0xfb, 0x30, 0x56, 0x01, 0x67, 0xfb, + 0x38, 0x56, 0xff, 0xde, 0x8f, 0x24, 0xbb, 0xeb, 0x29, 0x67, 0xb8, 0xbf, 0xa1, 0x3c, 0xb7, 0x2c, + 0xd6, 0x83, 0xc7, 0x1e, 0x95, 0x17, 0x83, 0x56, 0x2f, 0x42, 0x69, 0x3f, 0xeb, 0x37, 0x10, 0xd3, + 0xf2, 0xbe, 0xc4, 0x6d, 0x58, 0x7e, 0x6c, 0x75, 0xb1, 0x77, 0xec, 0xf9, 0xb8, 0xd7, 0x60, 0x49, + 0xe9, 0xd0, 0xc2, 0x2e, 0x5a, 0x05, 0x60, 0x5b, 0x18, 0x87, 0x58, 0xc1, 0xd5, 0xf8, 0x10, 0x45, + 0xfd, 0x2f, 0x05, 0x16, 0x07, 0x82, 0xfb, 0x6c, 0xeb, 0x76, 0x16, 0x8a, 0x74, 0xbc, 0x9e, 0x6f, + 0xf4, 0x1c, 0x79, 0x9e, 0x15, 0x10, 0xd0, 0x3d, 0x98, 0x39, 0xf4, 0x24, 0x64, 0x94, 0x0a, 0xa0, + 0xa7, 0x19, 0xa2, 0x4d, 0x1f, 0x7a, 0x0d, 0x13, 0x7d, 0x04, 0xd0, 0xf7, 0xb0, 0x29, 0xce, 0xb0, + 0xf2, 0x59, 0xd5, 0xc2, 0x7e, 0xf8, 0x7c, 0x9b, 0x0a, 0xf0, 0xab, 0x16, 0xf7, 0xa1, 0x64, 0xd9, + 0xc4, 0xc4, 0xec, 0xcc, 0xd1, 0x14, 0xa8, 0xd2, 0x08, 0x71, 0xe0, 0x12, 0xfb, 0x1e, 0x36, 0x55, + 0x2c, 0xd6, 0x42, 0xe9, 0x5f, 0x11, 0x28, 0x4d, 0x58, 0xe2, 0x49, 0xeb, 0x30, 0x30, 0x5c, 0x46, + 0xec, 0xda, 0xb0, 0xd1, 0x31, 0x6f, 0x69, 0x15, 0x4b, 0x94, 0x36, 0x52, 0x54, 0xbd, 0x0b, 0x27, + 0x23, 0x3b, 0xa4, 0x09, 0xb6, 0x2c, 0xea, 0x6e, 0x0c, 0x28, 0x19, 0x84, 0xb3, 0x80, 0x21, 0x64, + 0x34, 0x8f, 0x82, 0x21, 0x3c, 0x0e, 0x43, 0x78, 0xea, 0xe7, 0x70, 0x3a, 0x82, 0xe8, 0x44, 0x2c, + 0xba, 0x1f, 0xab, 0xdc, 0x2e, 0x8f, 0xd2, 0x1a, 0x2b, 0xe1, 0xfe, 0x47, 0x81, 0xe5, 0x34, 0x86, + 0x37, 0x44, 0x1c, 0x7f, 0x9c, 0x71, 0xad, 0xee, 0xce, 0x78, 0x66, 0xfd, 0x56, 0xd0, 0xda, 0x3d, + 0xa8, 0xa5, 0xf9, 0x33, 0x39, 0x4b, 0xf9, 0x49, 0x66, 0xe9, 0x67, 0xf9, 0x10, 0xf2, 0x5e, 0xf7, + 0x7d, 0xd7, 0x3a, 0xe8, 0xd3, 0x90, 0x7f, 0xeb, 0x68, 0x56, 0x23, 0xc0, 0x65, 0xb8, 0x6b, 0x6f, + 0x0d, 0x11, 0x1f, 0xd8, 0x91, 0x8a, 0xcd, 0x7c, 0x1a, 0xc5, 0x66, 0x38, 0xa6, 0x7e, 0x7b, 0x3c, + 0x7d, 0xdf, 0x59, 0x00, 0xf4, 0x67, 0x39, 0x58, 0x88, 0x4e, 0x11, 0xda, 0x06, 0x30, 0x02, 0xcb, + 0xc5, 0x87, 0x72, 0x69, 0xac, 0x61, 0x6a, 0x21, 0x41, 0xf4, 0x1e, 0xe4, 0xdb, 0x4e, 0x5f, 0xcc, + 0x5a, 0xca, 0x61, 0xf0, 0xa6, 0xd3, 0xe7, 0x19, 0x85, 0xb2, 0xd1, 0x3d, 0x15, 0x3f, 0xdb, 0xcf, + 0xce, 0x92, 0xcf, 0xd9, 0x7b, 0x2e, 0x23, 0x98, 0xd1, 0x53, 0x58, 0x78, 0xe5, 0x5a, 0xbe, 0x71, + 0xd0, 0xc5, 0x7a, 0xd7, 0x38, 0xc6, 0xae, 0xc8, 0x92, 0x63, 0x24, 0xb2, 0xb2, 0x14, 0x7c, 0x46, + 0xe5, 0xd4, 0x3f, 0x84, 0x82, 0xb4, 0x68, 0xc4, 0x8a, 0xb0, 0x07, 0x2b, 0x7d, 0xca, 0xa6, 0xb3, + 0x2b, 0x70, 0xb6, 0x61, 0x13, 0xdd, 0xc3, 0x74, 0x19, 0x97, 0x97, 0xf3, 0x47, 0xa4, 0xe8, 0x65, + 0x26, 0xbd, 0x49, 0x5c, 0xdc, 0x34, 0x6c, 0xd2, 0xe2, 0xa2, 0xea, 0x4b, 0x28, 0x85, 0x06, 0x38, + 0xc2, 0x84, 0x06, 0x2c, 0xc9, 0xa3, 0x78, 0x0f, 0xfb, 0x62, 0x79, 0x19, 0xab, 0xf3, 0x45, 0x21, + 0xd7, 0xc2, 0x3e, 0xbf, 0x3e, 0x71, 0x1f, 0x4e, 0x6b, 0x98, 0x38, 0xd8, 0x0e, 0xe6, 0xf3, 0x19, + 0xe9, 0x4c, 0x90, 0xc1, 0xcf, 0x42, 0x2d, 0x4d, 0x9e, 0xe7, 0x87, 0xeb, 0x67, 0xa1, 0x20, 0x7f, + 0xd0, 0x8a, 0xe6, 0x20, 0xbf, 0xb7, 0xb9, 0x5b, 0x99, 0xa2, 0x0f, 0xfb, 0x5b, 0xbb, 0x15, 0xe5, + 0x7a, 0x0f, 0x2a, 0xf1, 0xdf, 0x70, 0xa2, 0x15, 0x38, 0xb1, 0xab, 0xed, 0xec, 0xd6, 0x9f, 0xd4, + 0xf7, 0x1a, 0x3b, 0x4d, 0x7d, 0x57, 0x6b, 0x7c, 0x5c, 0xdf, 0xdb, 0xae, 0x4c, 0xa1, 0x35, 0x38, + 0x17, 0x7e, 0xf1, 0x74, 0xa7, 0xb5, 0xa7, 0xef, 0xed, 0xe8, 0x9b, 0x3b, 0xcd, 0xbd, 0x7a, 0xa3, + 0xb9, 0xad, 0x55, 0x14, 0x74, 0x0e, 0x4e, 0x87, 0x59, 0x1e, 0x35, 0xb6, 0x1a, 0xda, 0xf6, 0x26, + 0x7d, 0xae, 0x3f, 0xab, 0xe4, 0xae, 0xdf, 0x82, 0x72, 0xe4, 0x27, 0x97, 0xd4, 0x90, 0xdd, 0x9d, + 0xad, 0xca, 0x14, 0x2a, 0x43, 0x31, 0xac, 0xa7, 0x00, 0xd3, 0xcd, 0x9d, 0xad, 0xed, 0x4a, 0xee, + 0xfa, 0x5d, 0x58, 0x8c, 0xdd, 0xc1, 0x45, 0x4b, 0x50, 0x6e, 0xd5, 0x9b, 0x5b, 0x8f, 0x76, 0x3e, + 0xd5, 0xb5, 0xed, 0xfa, 0xd6, 0x67, 0x95, 0x29, 0xb4, 0x0c, 0x15, 0x49, 0x6a, 0xee, 0xec, 0x71, + 0xaa, 0x72, 0xfd, 0x45, 0xec, 0xcb, 0xc2, 0xe8, 0x24, 0x2c, 0x05, 0xdd, 0xe8, 0x9b, 0xda, 0x76, + 0x7d, 0x6f, 0x9b, 0xf6, 0x1e, 0x21, 0x6b, 0xfb, 0xcd, 0x66, 0xa3, 0xf9, 0xa4, 0xa2, 0x50, 0xad, + 0x03, 0xf2, 0xf6, 0xa7, 0x0d, 0xca, 0x9c, 0x8b, 0x32, 0xef, 0x37, 0x7f, 0xd8, 0xdc, 0xf9, 0xa4, + 0x59, 0xc9, 0x6f, 0xfc, 0x62, 0x09, 0x16, 0x64, 0x79, 0x87, 0x5d, 0x76, 0x97, 0x65, 0x17, 0xe6, + 0xe4, 0xcf, 0xa2, 0x53, 0xf2, 0x72, 0xf4, 0xc7, 0xdc, 0xb5, 0xb5, 0x21, 0x1c, 0xa2, 0xca, 0x9e, + 0x42, 0x07, 0xac, 0xea, 0x0d, 0xdd, 0x89, 0xbe, 0x9c, 0x5a, 0x63, 0x26, 0xae, 0x61, 0xd7, 0xae, + 0x8c, 0xe4, 0x0b, 0xfa, 0xc0, 0xb4, 0xb0, 0x0d, 0xff, 0xe8, 0x07, 0x5d, 0x49, 0xab, 0x48, 0x53, + 0x7e, 0x55, 0x54, 0xbb, 0x3a, 0x9a, 0x31, 0xe8, 0xe6, 0x05, 0x54, 0xe2, 0x3f, 0x00, 0x42, 0x29, + 0x80, 0x69, 0xc6, 0xaf, 0x8c, 0x6a, 0xd7, 0xc7, 0x61, 0x0d, 0x77, 0x96, 0xf8, 0xa9, 0xcc, 0xb5, + 0x71, 0x7e, 0x7b, 0x90, 0xd9, 0x59, 0xd6, 0xcf, 0x14, 0xb8, 0x03, 0xa3, 0xf7, 0x9d, 0x51, 0xea, + 0xef, 0x52, 0x52, 0x6e, 0xcb, 0xa7, 0x39, 0x30, 0xfd, 0xea, 0xb4, 0x3a, 0x85, 0x8e, 0x60, 0x31, + 0x76, 0x29, 0x01, 0xa5, 0x88, 0xa7, 0xdf, 0xbe, 0xa8, 0x5d, 0x1b, 0x83, 0x33, 0x1a, 0x11, 0xe1, + 0x4b, 0x08, 0xe9, 0x11, 0x91, 0x72, 0xc5, 0x21, 0x3d, 0x22, 0x52, 0xef, 0x33, 0xb0, 0xe0, 0x8e, + 0x5c, 0x3e, 0x48, 0x0b, 0xee, 0xb4, 0x2b, 0x0f, 0xb5, 0x2b, 0x23, 0xf9, 0xc2, 0x4e, 0x8b, 0x5d, + 0x45, 0x48, 0x73, 0x5a, 0xfa, 0x55, 0x87, 0xda, 0xb5, 0x31, 0x38, 0xe3, 0x51, 0x30, 0x38, 0xd8, + 0xcc, 0x8a, 0x82, 0xc4, 0x31, 0x7c, 0x56, 0x14, 0x24, 0xcf, 0x48, 0x45, 0x14, 0xc4, 0x0e, 0x24, + 0xaf, 0x8e, 0x71, 0x80, 0x92, 0x1d, 0x05, 0xe9, 0x47, 0x2d, 0xea, 0x14, 0xfa, 0x23, 0x05, 0xaa, + 0x59, 0x87, 0x13, 0x28, 0xa5, 0xaa, 0x1b, 0x71, 0x9e, 0x52, 0xdb, 0x98, 0x44, 0x24, 0xb0, 0xe2, + 0x4b, 0x40, 0xc9, 0xd5, 0x0e, 0xbd, 0x9b, 0x36, 0x33, 0x19, 0x6b, 0x6a, 0xed, 0xbd, 0xf1, 0x98, + 0x83, 0x2e, 0x5b, 0x50, 0x90, 0xc7, 0x21, 0x28, 0x25, 0x4b, 0xc7, 0x0e, 0x63, 0x6a, 0xea, 0x30, + 0x96, 0x40, 0xe9, 0x13, 0x98, 0xa6, 0x54, 0x74, 0x2e, 0x9d, 0x5b, 0x2a, 0x5b, 0xcd, 0x7a, 0x1d, + 0x28, 0x7a, 0x0e, 0xb3, 0x1c, 0xff, 0x47, 0x29, 0x78, 0x43, 0xe4, 0x94, 0xa2, 0x76, 0x21, 0x9b, + 0x21, 0x50, 0xf7, 0x05, 0xff, 0x8f, 0x19, 0x02, 0xda, 0x47, 0xef, 0xa4, 0xff, 0x04, 0x39, 0x7a, + 0x92, 0x50, 0xbb, 0x34, 0x82, 0x2b, 0xfc, 0x51, 0xc4, 0x6a, 0xdd, 0x2b, 0x23, 0x37, 0x2c, 0xd9, + 0x1f, 0x45, 0xfa, 0x96, 0x88, 0x07, 0x49, 0x72, 0xcb, 0x94, 0x16, 0x24, 0x99, 0x1b, 0xd5, 0xb4, + 0x20, 0xc9, 0xde, 0x85, 0xa9, 0x53, 0xc8, 0x87, 0x13, 0x29, 0x00, 0x19, 0x7a, 0x2f, 0x2b, 0xc8, + 0xd3, 0xd0, 0xba, 0xda, 0x8d, 0x31, 0xb9, 0xc3, 0x93, 0x2f, 0x3e, 0xfa, 0xf3, 0xd9, 0xa8, 0x51, + 0xe6, 0xe4, 0xc7, 0x3f, 0xf1, 0x8d, 0x7f, 0xcd, 0xc3, 0x3c, 0x07, 0x3f, 0x45, 0x05, 0xf3, 0x19, + 0xc0, 0xe0, 0xdc, 0x01, 0x5d, 0x4c, 0xf7, 0x49, 0xe4, 0x6c, 0xa6, 0xf6, 0xce, 0x70, 0xa6, 0x70, + 0xa0, 0x85, 0x30, 0xfc, 0xb4, 0x40, 0x4b, 0x1e, 0x55, 0xa4, 0x05, 0x5a, 0xca, 0x41, 0x80, 0x3a, + 0x85, 0x3e, 0x86, 0x62, 0x00, 0x16, 0xa3, 0x34, 0xb0, 0x39, 0x86, 0x86, 0xd7, 0x2e, 0x0e, 0xe5, + 0x09, 0x5b, 0x1d, 0x42, 0x82, 0xd3, 0xac, 0x4e, 0x22, 0xce, 0x69, 0x56, 0xa7, 0xc1, 0xc9, 0x03, + 0x9f, 0x70, 0xbc, 0x28, 0xd3, 0x27, 0x11, 0xb8, 0x2e, 0xd3, 0x27, 0x51, 0xd0, 0x49, 0x9d, 0x7a, + 0x74, 0xf9, 0x57, 0x5f, 0xad, 0x2a, 0xff, 0xf4, 0xd5, 0xea, 0xd4, 0x4f, 0xbf, 0x5e, 0x55, 0x7e, + 0xf5, 0xf5, 0xaa, 0xf2, 0x8f, 0x5f, 0xaf, 0x2a, 0xff, 0xf6, 0xf5, 0xaa, 0xf2, 0x67, 0xff, 0xbe, + 0x3a, 0xf5, 0xa3, 0x82, 0x94, 0x3e, 0x98, 0x65, 0xff, 0xf7, 0xe6, 0x83, 0xff, 0x0b, 0x00, 0x00, + 0xff, 0xff, 0xc2, 0xad, 0x03, 0x06, 0xbd, 0x48, 0x00, 0x00, } diff --git a/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto b/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto index bb00c3842c5..8819607692d 100644 --- a/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto +++ b/pkg/kubelet/apis/cri/runtime/v1alpha2/api.proto @@ -593,6 +593,12 @@ message LinuxContainerSecurityContext { // no_new_privs defines if the flag for no_new_privs should be set on the // container. bool no_new_privs = 11; + // masked_paths is a slice of paths that should be masked by the container + // runtime, this can be passed directly to the OCI spec. + repeated string masked_paths = 13; + // readonly_paths is a slice of paths that should be set as readonly by the + // container runtime, this can be passed directly to the OCI spec. + repeated string readonly_paths = 14; } // LinuxContainerConfig contains platform-specific configuration for From 30dcca623369572558389d920b3cdf2fbe227338 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 20 Mar 2018 15:38:42 -0400 Subject: [PATCH 2/8] ProcMount: add api options and feature gate Signed-off-by: Jess Frazelle --- pkg/api/pod/util.go | 20 ++++++ pkg/apis/core/types.go | 19 +++++ pkg/apis/core/v1/conversion.go | 5 ++ pkg/apis/core/v1/defaults.go | 1 + pkg/apis/core/v1/zz_generated.conversion.go | 2 + pkg/apis/core/v1/zz_generated.defaults.go | 18 +++++ pkg/apis/policy/types.go | 4 ++ pkg/features/kube_features.go | 7 ++ pkg/kubelet/kubelet.go | 2 + pkg/kubelet/kuberuntime/security_context.go | 8 ++- pkg/kubelet/lifecycle/handlers.go | 70 +++++++++++++++++++ pkg/security/podsecuritypolicy/provider.go | 15 ++++ .../podsecuritypolicy/provider_test.go | 9 +++ pkg/securitycontext/accessors.go | 13 ++++ pkg/securitycontext/fake.go | 2 + pkg/securitycontext/util.go | 56 ++++++++++++++- pkg/securitycontext/util_test.go | 59 ++++++++++++++++ 17 files changed, 308 insertions(+), 2 deletions(-) diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 32d185727fd..b9f875e57a7 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -262,6 +262,8 @@ func DropDisabledAlphaFields(podSpec *api.PodSpec) { if !utilfeature.DefaultFeatureGate.Enabled(features.RuntimeClass) && podSpec.RuntimeClassName != nil { podSpec.RuntimeClassName = nil } + + DropDisabledProcMountField(podSpec) } // DropDisabledRunAsGroupField removes disabled fields from PodSpec related @@ -284,6 +286,24 @@ func DropDisabledRunAsGroupField(podSpec *api.PodSpec) { } } +// DropDisabledProcMountField removes disabled fields from PodSpec related +// to ProcMount +func DropDisabledProcMountField(podSpec *api.PodSpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.ProcMountType) { + defProcMount := api.DefaultProcMount + for i := range podSpec.Containers { + if podSpec.Containers[i].SecurityContext != nil { + podSpec.Containers[i].SecurityContext.ProcMount = &defProcMount + } + } + for i := range podSpec.InitContainers { + if podSpec.InitContainers[i].SecurityContext != nil { + podSpec.InitContainers[i].SecurityContext.ProcMount = &defProcMount + } + } + } +} + // DropDisabledVolumeMountsAlphaFields removes disabled fields from []VolumeMount. // This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a VolumeMount func DropDisabledVolumeMountsAlphaFields(volumeMounts []api.VolumeMount) { diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index ca3bfacec5c..a9a561c5bc8 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -4616,8 +4616,27 @@ type SecurityContext struct { // the no_new_privs flag will be set on the container process. // +optional AllowPrivilegeEscalation *bool + // ProcMount denotes the type of proc mount to use for the containers. + // The default is DefaultProcMount which uses the container runtime defaults for + // readonly paths and masked paths. + // +optional + ProcMount *ProcMountType } +type ProcMountType string + +const ( + // DefaultProcMount uses the container runtime defaults for readonly and masked + // paths for /proc. Most container runtimes mask certain paths in /proc to avoid + // accidental security exposure of special devices or information. + DefaultProcMount ProcMountType = "Default" + + // UnmaskedProcMount bypasses the default masking behavior of the container + // runtime and ensures the newly created /proc the container stays in tact with + // no modifications. + UnmaskedProcMount ProcMountType = "Unmasked" +) + // SELinuxOptions are the labels to be applied to the container. type SELinuxOptions struct { // SELinux user label diff --git a/pkg/apis/core/v1/conversion.go b/pkg/apis/core/v1/conversion.go index 64d458189a0..bab07f1950c 100644 --- a/pkg/apis/core/v1/conversion.go +++ b/pkg/apis/core/v1/conversion.go @@ -380,6 +380,11 @@ func Convert_core_SecurityContext_To_v1_SecurityContext(in *core.SecurityContext out.RunAsNonRoot = in.RunAsNonRoot out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.AllowPrivilegeEscalation = in.AllowPrivilegeEscalation + if in.ProcMount != nil { + pm := string(*in.ProcMount) + pmt := v1.ProcMountType(pm) + out.ProcMount = &pmt + } return nil } diff --git a/pkg/apis/core/v1/defaults.go b/pkg/apis/core/v1/defaults.go index 622e239025f..1c7e2b32d66 100644 --- a/pkg/apis/core/v1/defaults.go +++ b/pkg/apis/core/v1/defaults.go @@ -93,6 +93,7 @@ func SetDefaults_Container(obj *v1.Container) { obj.TerminationMessagePolicy = v1.TerminationMessageReadFile } } + func SetDefaults_Service(obj *v1.Service) { if obj.Spec.SessionAffinity == "" { obj.Spec.SessionAffinity = v1.ServiceAffinityNone diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index c646e34f2bc..88b711d0d45 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -6724,6 +6724,7 @@ func autoConvert_v1_SecurityContext_To_core_SecurityContext(in *v1.SecurityConte out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot)) out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem)) out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation)) + out.ProcMount = (*core.ProcMountType)(unsafe.Pointer(in.ProcMount)) return nil } @@ -6741,6 +6742,7 @@ func autoConvert_core_SecurityContext_To_v1_SecurityContext(in *core.SecurityCon out.RunAsNonRoot = (*bool)(unsafe.Pointer(in.RunAsNonRoot)) out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem)) out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation)) + out.ProcMount = (*v1.ProcMountType)(unsafe.Pointer(in.ProcMount)) return nil } diff --git a/pkg/apis/core/v1/zz_generated.defaults.go b/pkg/apis/core/v1/zz_generated.defaults.go index 00e0b384aa8..0ea5e0fae05 100644 --- a/pkg/apis/core/v1/zz_generated.defaults.go +++ b/pkg/apis/core/v1/zz_generated.defaults.go @@ -263,6 +263,9 @@ func SetObjectDefaults_Pod(in *v1.Pod) { } } } + if a.SecurityContext != nil { + SetDefaults_SecurityContext(a.SecurityContext) + } } for i := range in.Spec.Containers { a := &in.Spec.Containers[i] @@ -305,6 +308,9 @@ func SetObjectDefaults_Pod(in *v1.Pod) { } } } + if a.SecurityContext != nil { + SetDefaults_SecurityContext(a.SecurityContext) + } } } @@ -409,6 +415,9 @@ func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) { } } } + if a.SecurityContext != nil { + SetDefaults_SecurityContext(a.SecurityContext) + } } for i := range in.Template.Spec.Containers { a := &in.Template.Spec.Containers[i] @@ -451,6 +460,9 @@ func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) { } } } + if a.SecurityContext != nil { + SetDefaults_SecurityContext(a.SecurityContext) + } } } @@ -557,6 +569,9 @@ func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) { } } } + if a.SecurityContext != nil { + SetDefaults_SecurityContext(a.SecurityContext) + } } for i := range in.Spec.Template.Spec.Containers { a := &in.Spec.Template.Spec.Containers[i] @@ -599,6 +614,9 @@ func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) { } } } + if a.SecurityContext != nil { + SetDefaults_SecurityContext(a.SecurityContext) + } } } } diff --git a/pkg/apis/policy/types.go b/pkg/apis/policy/types.go index 1af388bc0e3..7b9628657f1 100644 --- a/pkg/apis/policy/types.go +++ b/pkg/apis/policy/types.go @@ -228,6 +228,10 @@ type PodSecurityPolicySpec struct { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional ForbiddenSysctls []string + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // +optional + AllowedProcMountTypes []api.ProcMountType } // AllowedHostPath defines the host volume conditions that will be enabled by a policy diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index c66e462ef48..7721df6da7f 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -363,6 +363,12 @@ const ( // // Enable volume snapshot data source support. VolumeSnapshotDataSource utilfeature.Feature = "VolumeSnapshotDataSource" + + // owner: @jessfraz + // alpha: v1.12 + // + // Enables control over ProcMountType for containers. + ProcMountType utilfeature.Feature = "ProcMountType" ) func init() { @@ -424,6 +430,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS NodeLease: {Default: false, PreRelease: utilfeature.Alpha}, SCTPSupport: {Default: false, PreRelease: utilfeature.Alpha}, VolumeSnapshotDataSource: {Default: false, PreRelease: utilfeature.Alpha}, + ProcMountType: {Default: false, PreRelease: utilfeature.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index f41ef7d717e..b7827b960d5 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -849,6 +849,8 @@ func NewMainKubelet(kubeCfg *kubeletconfiginternal.KubeletConfiguration, klet.nodeLeaseController = nodelease.NewController(klet.clock, klet.heartbeatClient, string(klet.nodeName), kubeCfg.NodeLeaseDurationSeconds, klet.onRepeatedHeartbeatFailure) } + klet.softAdmitHandlers.AddPodAdmitHandler(lifecycle.NewProcMountAdmitHandler(klet.containerRuntime)) + // Finally, put the most recent version of the config on the Kubelet, so // people can see how it was configured. klet.kubeletConfiguration = *kubeCfg diff --git a/pkg/kubelet/kuberuntime/security_context.go b/pkg/kubelet/kuberuntime/security_context.go index 20e11e7fca5..7195174fc0d 100644 --- a/pkg/kubelet/kuberuntime/security_context.go +++ b/pkg/kubelet/kuberuntime/security_context.go @@ -30,7 +30,10 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po effectiveSc := securitycontext.DetermineEffectiveSecurityContext(pod, container) synthesized := convertToRuntimeSecurityContext(effectiveSc) if synthesized == nil { - synthesized = &runtimeapi.LinuxContainerSecurityContext{} + synthesized = &runtimeapi.LinuxContainerSecurityContext{ + MaskedPaths: securitycontext.ConvertToRuntimeMaskedPaths(effectiveSc.ProcMount), + ReadonlyPaths: securitycontext.ConvertToRuntimeReadonlyPaths(effectiveSc.ProcMount), + } } // set SeccompProfilePath. @@ -67,6 +70,9 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po synthesized.NoNewPrivs = securitycontext.AddNoNewPrivileges(effectiveSc) + synthesized.MaskedPaths = securitycontext.ConvertToRuntimeMaskedPaths(effectiveSc.ProcMount) + synthesized.ReadonlyPaths = securitycontext.ConvertToRuntimeReadonlyPaths(effectiveSc.ProcMount) + return synthesized } diff --git a/pkg/kubelet/lifecycle/handlers.go b/pkg/kubelet/lifecycle/handlers.go index b941d85537d..c0630ebb2aa 100644 --- a/pkg/kubelet/lifecycle/handlers.go +++ b/pkg/kubelet/lifecycle/handlers.go @@ -230,3 +230,73 @@ func noNewPrivsRequired(pod *v1.Pod) bool { } return false } + +func NewProcMountAdmitHandler(runtime kubecontainer.Runtime) PodAdmitHandler { + return &procMountAdmitHandler{ + Runtime: runtime, + } +} + +type procMountAdmitHandler struct { + kubecontainer.Runtime +} + +func (a *procMountAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult { + // If the pod is already running or terminated, no need to recheck NoNewPrivs. + if attrs.Pod.Status.Phase != v1.PodPending { + return PodAdmitResult{Admit: true} + } + + // If the containers in a pod only need the default ProcMountType, admit it. + if procMountIsDefault(attrs.Pod) { + return PodAdmitResult{Admit: true} + } + + // Always admit runtimes except docker. + if a.Runtime.Type() != kubetypes.DockerContainerRuntime { + return PodAdmitResult{Admit: true} + } + + // Make sure docker api version is valid. + // Merged in https://github.com/moby/moby/pull/36644 + rversion, err := a.Runtime.APIVersion() + if err != nil { + return PodAdmitResult{ + Admit: false, + Reason: "ProcMount", + Message: fmt.Sprintf("Cannot enforce ProcMount: %v", err), + } + } + v, err := rversion.Compare("1.38.0") + if err != nil { + return PodAdmitResult{ + Admit: false, + Reason: "ProcMount", + Message: fmt.Sprintf("Cannot enforce ProcMount: %v", err), + } + } + // If the version is less than 1.38 it will return -1 above. + if v == -1 { + return PodAdmitResult{ + Admit: false, + Reason: "ProcMount", + Message: fmt.Sprintf("Cannot enforce ProcMount: docker runtime API version %q must be greater than or equal to 1.38", rversion.String()), + } + } + + return PodAdmitResult{Admit: true} +} + +func procMountIsDefault(pod *v1.Pod) bool { + // Iterate over pod containers and check if we are using the DefaultProcMountType + // for all containers. + for _, c := range pod.Spec.Containers { + if c.SecurityContext != nil { + if c.SecurityContext.ProcMount != nil && *c.SecurityContext.ProcMount != v1.DefaultProcMount { + return false + } + } + } + + return true +} diff --git a/pkg/security/podsecuritypolicy/provider.go b/pkg/security/podsecuritypolicy/provider.go index da82327f329..90d5f967b22 100644 --- a/pkg/security/podsecuritypolicy/provider.go +++ b/pkg/security/podsecuritypolicy/provider.go @@ -289,6 +289,21 @@ func (s *simpleProvider) ValidateContainer(pod *api.Pod, container *api.Containe allErrs = append(allErrs, field.Invalid(scPath.Child("privileged"), *privileged, "Privileged containers are not allowed")) } + procMount := sc.ProcMount() + allowedProcMounts := s.psp.Spec.AllowedProcMountTypes + if len(allowedProcMounts) == 0 { + allowedProcMounts = []api.ProcMountType{api.DefaultProcMount} + } + foundProcMountType := false + for _, pm := range allowedProcMounts { + if pm == procMount { + foundProcMountType = true + } + } + if !foundProcMountType { + allErrs = append(allErrs, field.Invalid(scPath.Child("procMount"), procMount, "ProcMountType is not allowed")) + } + allErrs = append(allErrs, s.strategies.CapabilitiesStrategy.Validate(scPath.Child("capabilities"), pod, container, sc.Capabilities())...) allErrs = append(allErrs, s.hasInvalidHostPort(container, containerPath)...) diff --git a/pkg/security/podsecuritypolicy/provider_test.go b/pkg/security/podsecuritypolicy/provider_test.go index 4ef7129ea67..e774f70f430 100644 --- a/pkg/security/podsecuritypolicy/provider_test.go +++ b/pkg/security/podsecuritypolicy/provider_test.go @@ -485,6 +485,10 @@ func TestValidateContainerFailures(t *testing.T) { var priv bool = true failPrivPod.Spec.Containers[0].SecurityContext.Privileged = &priv + failProcMountPod := defaultPod() + failProcMountPod.Spec.Containers[0].SecurityContext.ProcMount = new(api.ProcMountType) + *failProcMountPod.Spec.Containers[0].SecurityContext.ProcMount = api.UnmaskedProcMount + failCapsPod := defaultPod() failCapsPod.Spec.Containers[0].SecurityContext.Capabilities = &api.Capabilities{ Add: []api.Capability{"foo"}, @@ -540,6 +544,11 @@ func TestValidateContainerFailures(t *testing.T) { psp: defaultPSP(), expectedError: "Privileged containers are not allowed", }, + "failProcMountPSP": { + pod: failProcMountPod, + psp: defaultPSP(), + expectedError: "ProcMountType is not allowed", + }, "failCapsPSP": { pod: failCapsPod, psp: defaultPSP(), diff --git a/pkg/securitycontext/accessors.go b/pkg/securitycontext/accessors.go index 98ac6e0b92a..cf372f28662 100644 --- a/pkg/securitycontext/accessors.go +++ b/pkg/securitycontext/accessors.go @@ -188,6 +188,7 @@ func (w *podSecurityContextWrapper) SetFSGroup(v *int64) { type ContainerSecurityContextAccessor interface { Capabilities() *api.Capabilities Privileged() *bool + ProcMount() api.ProcMountType SELinuxOptions() *api.SELinuxOptions RunAsUser() *int64 RunAsNonRoot() *bool @@ -257,6 +258,15 @@ func (w *containerSecurityContextWrapper) SetPrivileged(v *bool) { w.ensureContainerSC() w.containerSC.Privileged = v } +func (w *containerSecurityContextWrapper) ProcMount() api.ProcMountType { + if w.containerSC == nil { + return api.DefaultProcMount + } + if w.containerSC.ProcMount == nil { + return api.DefaultProcMount + } + return *w.containerSC.ProcMount +} func (w *containerSecurityContextWrapper) SELinuxOptions() *api.SELinuxOptions { if w.containerSC == nil { return nil @@ -356,6 +366,9 @@ func (w *effectiveContainerSecurityContextWrapper) SetPrivileged(v *bool) { w.containerSC.SetPrivileged(v) } } +func (w *effectiveContainerSecurityContextWrapper) ProcMount() api.ProcMountType { + return w.containerSC.ProcMount() +} func (w *effectiveContainerSecurityContextWrapper) SELinuxOptions() *api.SELinuxOptions { if v := w.containerSC.SELinuxOptions(); v != nil { return v diff --git a/pkg/securitycontext/fake.go b/pkg/securitycontext/fake.go index 975445bab06..3303db2126c 100644 --- a/pkg/securitycontext/fake.go +++ b/pkg/securitycontext/fake.go @@ -35,8 +35,10 @@ func ValidSecurityContextWithContainerDefaults() *v1.SecurityContext { // empty container defaults. Used for testing. func ValidInternalSecurityContextWithContainerDefaults() *api.SecurityContext { priv := false + dpm := api.DefaultProcMount return &api.SecurityContext{ Capabilities: &api.Capabilities{}, Privileged: &priv, + ProcMount: &dpm, } } diff --git a/pkg/securitycontext/util.go b/pkg/securitycontext/util.go index 5ade5588146..07489baf56e 100644 --- a/pkg/securitycontext/util.go +++ b/pkg/securitycontext/util.go @@ -72,7 +72,7 @@ func DetermineEffectiveSecurityContext(pod *v1.Pod, container *v1.Container) *v1 containerSc := container.SecurityContext if effectiveSc == nil && containerSc == nil { - return nil + return &v1.SecurityContext{} } if effectiveSc != nil && containerSc == nil { return effectiveSc @@ -121,6 +121,11 @@ func DetermineEffectiveSecurityContext(pod *v1.Pod, container *v1.Container) *v1 *effectiveSc.AllowPrivilegeEscalation = *containerSc.AllowPrivilegeEscalation } + if containerSc.ProcMount != nil { + effectiveSc.ProcMount = new(v1.ProcMountType) + *effectiveSc.ProcMount = *containerSc.ProcMount + } + return effectiveSc } @@ -167,3 +172,52 @@ func AddNoNewPrivileges(sc *v1.SecurityContext) bool { // handle the case where defaultAllowPrivilegeEscalation is false or the user explicitly set allowPrivilegeEscalation to true/false return !*sc.AllowPrivilegeEscalation } + +var ( + // These *must* be kept in sync with moby/moby. + // https://github.com/moby/moby/blob/master/oci/defaults.go#L116-L134 + // @jessfraz will watch changes to those files upstream. + defaultMaskedPaths = []string{ + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + } + defaultReadonlyPaths = []string{ + "/proc/asound", + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger", + } +) + +// ConvertToRuntimeMaskedPaths converts the ProcMountType to the specified or default +// masked paths. +func ConvertToRuntimeMaskedPaths(opt *v1.ProcMountType) []string { + if opt != nil && *opt == v1.UnmaskedProcMount { + // Unmasked proc mount should have no paths set as masked. + return []string{} + } + + // Otherwise, add the default masked paths to the runtime security context. + return defaultMaskedPaths +} + +// ConvertToRuntimeReadonlyPaths converts the ProcMountType to the specified or default +// readonly paths. +func ConvertToRuntimeReadonlyPaths(opt *v1.ProcMountType) []string { + if opt != nil && *opt == v1.UnmaskedProcMount { + // Unmasked proc mount should have no paths set as readonly. + return []string{} + } + + // Otherwise, add the default readonly paths to the runtime security context. + return defaultReadonlyPaths +} diff --git a/pkg/securitycontext/util_test.go b/pkg/securitycontext/util_test.go index 475356c4074..21eafb51e4d 100644 --- a/pkg/securitycontext/util_test.go +++ b/pkg/securitycontext/util_test.go @@ -17,6 +17,7 @@ limitations under the License. package securitycontext import ( + "reflect" "testing" "k8s.io/api/core/v1" @@ -123,3 +124,61 @@ func TestAddNoNewPrivileges(t *testing.T) { } } } + +func TestConvertToRuntimeMaskedPaths(t *testing.T) { + dPM := v1.DefaultProcMount + uPM := v1.UnmaskedProcMount + tests := map[string]struct { + pm *v1.ProcMountType + expect []string + }{ + "procMount nil": { + pm: nil, + expect: defaultMaskedPaths, + }, + "procMount default": { + pm: &dPM, + expect: defaultMaskedPaths, + }, + "procMount unmasked": { + pm: &uPM, + expect: []string{}, + }, + } + + for k, v := range tests { + actual := ConvertToRuntimeMaskedPaths(v.pm) + if !reflect.DeepEqual(actual, v.expect) { + t.Errorf("%s failed, expected %#v but received %#v", k, v.expect, actual) + } + } +} + +func TestConvertToRuntimeReadonlyPaths(t *testing.T) { + dPM := v1.DefaultProcMount + uPM := v1.UnmaskedProcMount + tests := map[string]struct { + pm *v1.ProcMountType + expect []string + }{ + "procMount nil": { + pm: nil, + expect: defaultReadonlyPaths, + }, + "procMount default": { + pm: &dPM, + expect: defaultReadonlyPaths, + }, + "procMount unmasked": { + pm: &uPM, + expect: []string{}, + }, + } + + for k, v := range tests { + actual := ConvertToRuntimeReadonlyPaths(v.pm) + if !reflect.DeepEqual(actual, v.expect) { + t.Errorf("%s failed, expected %#v but received %#v", k, v.expect, actual) + } + } +} From a5234d857522c7bdd74f6754b677899e97843924 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Tue, 20 Mar 2018 16:09:20 -0400 Subject: [PATCH 3/8] ProcMount: update staging types Signed-off-by: Jess Frazelle --- staging/src/k8s.io/api/core/v1/types.go | 19 +++++++++++++++++++ .../k8s.io/api/extensions/v1beta1/types.go | 4 ++++ .../src/k8s.io/api/policy/v1beta1/types.go | 4 ++++ 3 files changed, 27 insertions(+) diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 667f53401bd..7e9a818a14e 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -5198,8 +5198,27 @@ type SecurityContext struct { // 2) has CAP_SYS_ADMIN // +optional AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,7,opt,name=allowPrivilegeEscalation"` + // ProcMount denotes the type of proc mount to use for the containers. + // The default is DefaultProcMount which uses the container runtime defaults for + // readonly paths and masked paths. + // +optional + ProcMount *ProcMountType `json:"procMount,omitEmpty" protobuf:"bytes,9,opt,name=procMount"` } +type ProcMountType string + +const ( + // DefaultProcMount uses the container runtime defaults for readonly and masked + // paths for /proc. Most container runtimes mask certain paths in /proc to avoid + // accidental security exposure of special devices or information. + DefaultProcMount ProcMountType = "Default" + + // UnmaskedProcMount bypasses the default masking behavior of the container + // runtime and ensures the newly created /proc the container stays in tact with + // no modifications. + UnmaskedProcMount ProcMountType = "Unmasked" +) + // SELinuxOptions are the labels to be applied to the container type SELinuxOptions struct { // User is a SELinux user label that applies to the container. diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.go b/staging/src/k8s.io/api/extensions/v1beta1/types.go index b2780368d93..475f9136b55 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.go @@ -965,6 +965,10 @@ type PodSecurityPolicySpec struct { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // +optional + AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty" protobuf:"bytes,21,opt,name=allowedProcMountTypes"` } // AllowedHostPath defines the host volume conditions that will be enabled by a policy diff --git a/staging/src/k8s.io/api/policy/v1beta1/types.go b/staging/src/k8s.io/api/policy/v1beta1/types.go index 3314e0c0e75..07d6710f4fe 100644 --- a/staging/src/k8s.io/api/policy/v1beta1/types.go +++ b/staging/src/k8s.io/api/policy/v1beta1/types.go @@ -221,6 +221,10 @@ type PodSecurityPolicySpec struct { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // +optional + AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty" protobuf:"bytes,21,opt,name=allowedProcMountTypes"` } // AllowedHostPath defines the host volume conditions that will be enabled by a policy From dbf7186beebdab034cc8fded23822fc9b5cd9da7 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 14 Jun 2018 16:09:11 -0400 Subject: [PATCH 4/8] update jsonlog path for updated vendor Signed-off-by: Jess Frazelle --- pkg/kubelet/kuberuntime/logs/logs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubelet/kuberuntime/logs/logs.go b/pkg/kubelet/kuberuntime/logs/logs.go index c887e278086..c81194d1e63 100644 --- a/pkg/kubelet/kuberuntime/logs/logs.go +++ b/pkg/kubelet/kuberuntime/logs/logs.go @@ -28,7 +28,7 @@ import ( "os" "time" - "github.com/docker/docker/pkg/jsonlog" + "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog" "github.com/fsnotify/fsnotify" "github.com/golang/glog" From 31ffd9f88130c1c0cbb991f90b49887327567398 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Mon, 20 Aug 2018 08:05:52 -0400 Subject: [PATCH 5/8] vendor: update docker cadvisor winterm This vendor change was purely for the changes in docker to allow for setting the Masked and Read-only paths. See: moby/moby#36644 But because of the docker dep update it also needed cadvisor to be updated and winterm due to changes in pkg/tlsconfig in docker See: google/cadvisor#1967 Signed-off-by: Jess Frazelle --- Godeps/Godeps.json | 282 +-- Godeps/LICENSES | 1032 +------- pkg/kubelet/kuberuntime/logs/BUILD | 2 +- vendor/BUILD | 7 +- vendor/github.com/Azure/go-ansiterm/BUILD | 1 - .../Azure/go-ansiterm/csi_entry_state.go | 4 +- .../Azure/go-ansiterm/csi_param_state.go | 4 +- .../go-ansiterm/escape_intermediate_state.go | 4 +- .../Azure/go-ansiterm/escape_state.go | 4 +- .../Azure/go-ansiterm/osc_string_state.go | 2 +- vendor/github.com/Azure/go-ansiterm/parser.go | 101 +- .../go-ansiterm/parser_action_helpers.go | 4 - .../Azure/go-ansiterm/parser_actions.go | 17 +- .../Azure/go-ansiterm/winterm/BUILD | 1 - .../Azure/go-ansiterm/winterm/ansi.go | 2 +- .../Azure/go-ansiterm/winterm/api.go | 25 +- .../go-ansiterm/winterm/cursor_helpers.go | 2 +- .../go-ansiterm/winterm/scroll_helper.go | 4 +- .../go-ansiterm/winterm/win_event_handler.go | 117 +- vendor/github.com/docker/docker/AUTHORS | 257 +- vendor/github.com/docker/docker/api/BUILD | 6 - vendor/github.com/docker/docker/api/README.md | 8 +- vendor/github.com/docker/docker/api/common.go | 58 +- .../docker/docker/api/common_unix.go | 2 +- vendor/github.com/docker/docker/api/names.go | 9 - .../github.com/docker/docker/api/swagger.yaml | 2219 +++++++++++++---- .../docker/docker/api/types/client.go | 19 +- .../docker/docker/api/types/configs.go | 15 +- .../api/types/container/container_changes.go | 2 +- .../api/types/container/container_create.go | 2 +- .../api/types/container/container_top.go | 2 +- .../api/types/container/container_update.go | 2 +- .../api/types/container/container_wait.go | 14 +- .../docker/api/types/container/host_config.go | 66 +- .../api/types/container/hostconfig_windows.go | 14 - .../docker/docker/api/types/filters/parse.go | 280 ++- .../docker/api/types/image/image_history.go | 2 +- .../docker/docker/api/types/mount/mount.go | 4 +- .../docker/docker/api/types/plugin.go | 3 + .../docker/docker/api/types/port.go | 2 +- .../docker/docker/api/types/swarm/common.go | 2 +- .../docker/docker/api/types/swarm/config.go | 4 + .../docker/api/types/swarm/container.go | 10 +- .../docker/docker/api/types/swarm/network.go | 2 + .../docker/docker/api/types/swarm/runtime.go | 8 + .../api/types/swarm/runtime/plugin.proto | 2 + .../docker/docker/api/types/swarm/secret.go | 4 + .../docker/docker/api/types/swarm/task.go | 33 +- .../docker/docker/api/types/time/timestamp.go | 15 +- .../docker/docker/api/types/types.go | 12 + .../docker/docker/api/types/volume/BUILD | 4 +- .../{volumes_create.go => volume_create.go} | 6 +- .../{volumes_list.go => volume_list.go} | 6 +- vendor/github.com/docker/docker/client/BUILD | 3 - .../docker/docker/client/build_prune.go | 2 +- .../docker/docker/client/checkpoint_create.go | 3 +- .../docker/docker/client/checkpoint_delete.go | 2 +- .../docker/docker/client/checkpoint_list.go | 8 +- .../github.com/docker/docker/client/client.go | 296 ++- .../docker/docker/client/client_unix.go | 5 +- .../docker/docker/client/client_windows.go | 3 + .../docker/docker/client/config_create.go | 2 +- .../docker/docker/client/config_inspect.go | 11 +- .../docker/docker/client/config_list.go | 4 +- .../docker/docker/client/config_remove.go | 4 +- .../docker/docker/client/config_update.go | 2 +- .../docker/docker/client/container_attach.go | 2 +- .../docker/docker/client/container_commit.go | 4 +- .../docker/docker/client/container_copy.go | 23 +- .../docker/docker/client/container_create.go | 4 +- .../docker/docker/client/container_diff.go | 2 +- .../docker/docker/client/container_exec.go | 4 +- .../docker/docker/client/container_export.go | 3 +- .../docker/docker/client/container_inspect.go | 19 +- .../docker/docker/client/container_kill.go | 3 +- .../docker/docker/client/container_list.go | 2 +- .../docker/docker/client/container_logs.go | 16 +- .../docker/docker/client/container_pause.go | 2 +- .../docker/docker/client/container_prune.go | 2 +- .../docker/docker/client/container_remove.go | 4 +- .../docker/docker/client/container_rename.go | 3 +- .../docker/docker/client/container_resize.go | 2 +- .../docker/docker/client/container_restart.go | 2 +- .../docker/docker/client/container_start.go | 3 +- .../docker/docker/client/container_stats.go | 2 +- .../docker/docker/client/container_stop.go | 11 +- .../docker/docker/client/container_top.go | 2 +- .../docker/docker/client/container_unpause.go | 2 +- .../docker/docker/client/container_update.go | 2 +- .../docker/docker/client/container_wait.go | 3 +- .../docker/docker/client/disk_usage.go | 2 +- .../docker/client/distribution_inspect.go | 5 +- .../github.com/docker/docker/client/errors.go | 248 +- .../github.com/docker/docker/client/events.go | 3 +- .../github.com/docker/docker/client/hijack.go | 137 +- .../docker/docker/client/image_build.go | 15 +- .../docker/docker/client/image_create.go | 7 +- .../docker/docker/client/image_history.go | 2 +- .../docker/docker/client/image_import.go | 7 +- .../docker/docker/client/image_inspect.go | 11 +- .../docker/docker/client/image_list.go | 2 +- .../docker/docker/client/image_load.go | 3 +- .../docker/docker/client/image_prune.go | 2 +- .../docker/docker/client/image_pull.go | 7 +- .../docker/docker/client/image_push.go | 3 +- .../docker/docker/client/image_remove.go | 6 +- .../docker/docker/client/image_save.go | 3 +- .../docker/docker/client/image_search.go | 4 +- .../docker/docker/client/image_tag.go | 2 +- .../github.com/docker/docker/client/info.go | 2 +- .../docker/docker/client/interface.go | 35 +- .../docker/client/interface_experimental.go | 3 +- .../github.com/docker/docker/client/login.go | 2 +- .../docker/docker/client/network_connect.go | 3 +- .../docker/docker/client/network_create.go | 2 +- .../docker/client/network_disconnect.go | 3 +- .../docker/docker/client/network_inspect.go | 11 +- .../docker/docker/client/network_list.go | 2 +- .../docker/docker/client/network_prune.go | 2 +- .../docker/docker/client/network_remove.go | 4 +- .../docker/docker/client/node_inspect.go | 11 +- .../docker/docker/client/node_list.go | 4 +- .../docker/docker/client/node_remove.go | 5 +- .../docker/docker/client/node_update.go | 2 +- .../docker/docker/client/parse_logs.go | 41 - .../github.com/docker/docker/client/ping.go | 10 +- .../docker/docker/client/plugin_create.go | 2 +- .../docker/docker/client/plugin_disable.go | 2 +- .../docker/docker/client/plugin_enable.go | 2 +- .../docker/docker/client/plugin_inspect.go | 11 +- .../docker/docker/client/plugin_install.go | 2 +- .../docker/docker/client/plugin_list.go | 4 +- .../docker/docker/client/plugin_push.go | 3 +- .../docker/docker/client/plugin_remove.go | 4 +- .../docker/docker/client/plugin_set.go | 2 +- .../docker/docker/client/plugin_upgrade.go | 2 +- .../docker/docker/client/request.go | 9 +- .../docker/docker/client/secret_create.go | 2 +- .../docker/docker/client/secret_inspect.go | 11 +- .../docker/docker/client/secret_list.go | 4 +- .../docker/docker/client/secret_remove.go | 4 +- .../docker/docker/client/secret_update.go | 2 +- .../docker/docker/client/service_create.go | 22 +- .../docker/docker/client/service_inspect.go | 11 +- .../docker/docker/client/service_list.go | 4 +- .../docker/docker/client/service_logs.go | 6 +- .../docker/docker/client/service_remove.go | 4 +- .../docker/docker/client/service_update.go | 2 +- .../docker/docker/client/session.go | 3 +- .../docker/client/swarm_get_unlock_key.go | 2 +- .../docker/docker/client/swarm_init.go | 2 +- .../docker/docker/client/swarm_inspect.go | 2 +- .../docker/docker/client/swarm_join.go | 3 +- .../docker/docker/client/swarm_leave.go | 3 +- .../docker/docker/client/swarm_unlock.go | 3 +- .../docker/docker/client/swarm_update.go | 2 +- .../docker/docker/client/task_inspect.go | 12 +- .../docker/docker/client/task_list.go | 4 +- .../docker/docker/client/task_logs.go | 3 +- .../docker/docker/client/transport.go | 8 - .../github.com/docker/docker/client/utils.go | 2 +- .../docker/docker/client/version.go | 2 +- .../docker/docker/client/volume_create.go | 4 +- .../docker/docker/client/volume_inspect.go | 12 +- .../docker/docker/client/volume_list.go | 6 +- .../docker/docker/client/volume_prune.go | 2 +- .../docker/docker/client/volume_remove.go | 4 +- .../logger/jsonfilelog}/jsonlog/BUILD | 6 +- .../logger/jsonfilelog/jsonlog/jsonlog.go | 25 + .../jsonfilelog}/jsonlog/jsonlogbytes.go | 27 +- .../jsonfilelog/jsonlog/time_marshalling.go | 20 + .../docker/docker/pkg/ioutils/buffer.go | 51 - .../docker/docker/pkg/ioutils/bytespipe.go | 186 -- .../docker/docker/pkg/ioutils/fswriters.go | 162 -- .../docker/docker/pkg/ioutils/readers.go | 154 -- .../docker/docker/pkg/ioutils/temp_unix.go | 10 - .../docker/docker/pkg/ioutils/temp_windows.go | 18 - .../docker/docker/pkg/ioutils/writeflusher.go | 92 - .../docker/docker/pkg/ioutils/writers.go | 66 - .../docker/docker/pkg/jsonlog/jsonlog.go | 42 - .../docker/pkg/jsonlog/jsonlog_marshalling.go | 178 -- .../docker/pkg/jsonlog/time_marshalling.go | 27 - .../docker/docker/pkg/jsonmessage/BUILD | 1 - .../docker/pkg/jsonmessage/jsonmessage.go | 52 +- .../docker/docker/pkg/longpath/BUILD | 23 - .../docker/docker/pkg/longpath/longpath.go | 26 - .../github.com/docker/docker/pkg/mount/BUILD | 10 +- .../docker/pkg/mount/flags_unsupported.go | 2 +- .../docker/docker/pkg/mount/mount.go | 105 +- .../docker/pkg/mount/mounter_solaris.go | 33 - .../docker/pkg/mount/mounter_unsupported.go | 2 +- .../docker/docker/pkg/mount/mountinfo.go | 14 - .../docker/pkg/mount/mountinfo_freebsd.go | 16 +- .../docker/pkg/mount/mountinfo_linux.go | 161 +- .../docker/pkg/mount/mountinfo_solaris.go | 37 - .../docker/pkg/mount/mountinfo_unsupported.go | 4 +- .../docker/pkg/mount/mountinfo_windows.go | 2 +- .../docker/pkg/mount/sharedsubtree_linux.go | 2 - .../docker/pkg/mount/sharedsubtree_solaris.go | 58 - .../docker/pkg/parsers/operatingsystem/BUILD | 4 +- .../operatingsystem_solaris.go | 37 - .../operatingsystem_windows.go | 49 +- .../docker/docker/pkg/stdcopy/stdcopy.go | 2 +- .../docker/docker/pkg/sysinfo/BUILD | 8 - .../docker/docker/pkg/sysinfo/numcpu_linux.go | 2 - .../docker/pkg/sysinfo/numcpu_windows.go | 2 - .../docker/pkg/sysinfo/sysinfo_solaris.go | 121 - .../docker/docker/pkg/sysinfo/sysinfo_unix.go | 4 +- .../docker/pkg/sysinfo/sysinfo_windows.go | 2 - .../github.com/docker/docker/pkg/system/BUILD | 121 - .../docker/docker/pkg/system/chtimes.go | 35 - .../docker/docker/pkg/system/chtimes_unix.go | 14 - .../docker/pkg/system/chtimes_windows.go | 28 - .../docker/docker/pkg/system/errors.go | 10 - .../docker/pkg/system/events_windows.go | 85 - .../docker/docker/pkg/system/exitcode.go | 33 - .../docker/docker/pkg/system/filesys.go | 67 - .../docker/pkg/system/filesys_windows.go | 298 --- .../docker/docker/pkg/system/init.go | 22 - .../docker/docker/pkg/system/init_windows.go | 17 - .../docker/docker/pkg/system/lcow_unix.go | 8 - .../docker/docker/pkg/system/lcow_windows.go | 6 - .../docker/docker/pkg/system/lstat_unix.go | 19 - .../docker/docker/pkg/system/lstat_windows.go | 14 - .../docker/docker/pkg/system/meminfo.go | 17 - .../docker/docker/pkg/system/meminfo_linux.go | 65 - .../docker/pkg/system/meminfo_solaris.go | 129 - .../docker/pkg/system/meminfo_unsupported.go | 8 - .../docker/pkg/system/meminfo_windows.go | 45 - .../docker/docker/pkg/system/mknod.go | 22 - .../docker/docker/pkg/system/mknod_windows.go | 13 - .../docker/docker/pkg/system/path.go | 21 - .../docker/docker/pkg/system/path_unix.go | 9 - .../docker/docker/pkg/system/path_windows.go | 33 - .../docker/docker/pkg/system/process_unix.go | 24 - .../github.com/docker/docker/pkg/system/rm.go | 80 - .../docker/docker/pkg/system/stat_darwin.go | 13 - .../docker/docker/pkg/system/stat_freebsd.go | 13 - .../docker/docker/pkg/system/stat_linux.go | 19 - .../docker/docker/pkg/system/stat_openbsd.go | 13 - .../docker/docker/pkg/system/stat_solaris.go | 13 - .../docker/docker/pkg/system/stat_unix.go | 60 - .../docker/docker/pkg/system/stat_windows.go | 49 - .../docker/docker/pkg/system/syscall_unix.go | 17 - .../docker/pkg/system/syscall_windows.go | 122 - .../docker/docker/pkg/system/umask.go | 13 - .../docker/docker/pkg/system/umask_windows.go | 9 - .../docker/pkg/system/utimes_freebsd.go | 24 - .../docker/docker/pkg/system/utimes_linux.go | 25 - .../docker/pkg/system/utimes_unsupported.go | 10 - .../docker/docker/pkg/system/xattrs_linux.go | 29 - .../docker/pkg/system/xattrs_unsupported.go | 13 - .../github.com/docker/docker/pkg/term/BUILD | 3 - .../docker/docker/pkg/term/ascii.go | 2 +- .../docker/docker/pkg/term/proxy.go | 4 + .../github.com/docker/docker/pkg/term/tc.go | 1 - .../docker/docker/pkg/term/tc_solaris_cgo.go | 65 - .../docker/docker/pkg/term/term_windows.go | 33 +- .../docker/docker/pkg/term/termios_bsd.go | 2 +- .../docker/docker/pkg/term/termios_linux.go | 2 + .../docker/docker/pkg/term/windows/windows.go | 2 +- .../docker/docker/pkg/term/winsize.go | 20 +- .../docker/pkg/term/winsize_solaris_cgo.go | 42 - .../docker/docker/pkg/tlsconfig/BUILD | 26 - .../docker/pkg/tlsconfig/tlsconfig_clone.go | 11 - .../pkg/tlsconfig/tlsconfig_clone_go17.go | 33 - vendor/github.com/docker/libtrust/BUILD | 35 - .../docker/libtrust/CONTRIBUTING.md | 13 - vendor/github.com/docker/libtrust/LICENSE | 191 -- vendor/github.com/docker/libtrust/MAINTAINERS | 3 - vendor/github.com/docker/libtrust/README.md | 18 - .../docker/libtrust/certificates.go | 175 -- vendor/github.com/docker/libtrust/doc.go | 9 - vendor/github.com/docker/libtrust/ec_key.go | 428 ---- vendor/github.com/docker/libtrust/filter.go | 50 - vendor/github.com/docker/libtrust/hash.go | 56 - vendor/github.com/docker/libtrust/jsonsign.go | 657 ----- vendor/github.com/docker/libtrust/key.go | 253 -- .../github.com/docker/libtrust/key_files.go | 255 -- .../github.com/docker/libtrust/key_manager.go | 175 -- vendor/github.com/docker/libtrust/rsa_key.go | 427 ---- vendor/github.com/docker/libtrust/util.go | 363 --- .../google/cadvisor/accelerators/nvidia.go | 49 +- vendor/github.com/google/cadvisor/fs/fs.go | 17 +- vendor/golang.org/x/sys/windows/BUILD | 1 + .../x/sys/windows/registry}/BUILD | 23 +- .../golang.org/x/sys/windows/registry/key.go | 200 ++ .../x/sys/windows/registry/mksyscall.go | 7 + .../x/sys/windows/registry/syscall.go | 32 + .../x/sys/windows/registry/value.go | 384 +++ .../sys/windows/registry/zsyscall_windows.go | 120 + 291 files changed, 4231 insertions(+), 9465 deletions(-) delete mode 100644 vendor/github.com/docker/docker/api/names.go rename vendor/github.com/docker/docker/api/types/volume/{volumes_create.go => volume_create.go} (88%) rename vendor/github.com/docker/docker/api/types/volume/{volumes_list.go => volume_list.go} (83%) delete mode 100644 vendor/github.com/docker/docker/client/parse_logs.go rename vendor/github.com/docker/docker/{pkg => daemon/logger/jsonfilelog}/jsonlog/BUILD (75%) create mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go rename vendor/github.com/docker/docker/{pkg => daemon/logger/jsonfilelog}/jsonlog/jsonlogbytes.go (77%) create mode 100644 vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/buffer.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/fswriters.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/readers.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go delete mode 100644 vendor/github.com/docker/docker/pkg/ioutils/writers.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go delete mode 100644 vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go delete mode 100644 vendor/github.com/docker/docker/pkg/longpath/BUILD delete mode 100644 vendor/github.com/docker/docker/pkg/longpath/longpath.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/BUILD delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/chtimes_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/errors.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/events_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/exitcode.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/filesys.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/filesys_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/init.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/init_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lcow_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lcow_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lstat_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/lstat_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/meminfo_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/mknod.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/mknod_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/path.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/path_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/path_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/process_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/rm.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_darwin.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_openbsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_solaris.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/stat_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/syscall_unix.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/syscall_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/umask.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/umask_windows.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/xattrs_linux.go delete mode 100644 vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go delete mode 100644 vendor/github.com/docker/docker/pkg/term/winsize_solaris_cgo.go delete mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/BUILD delete mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go delete mode 100644 vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go delete mode 100644 vendor/github.com/docker/libtrust/BUILD delete mode 100644 vendor/github.com/docker/libtrust/CONTRIBUTING.md delete mode 100644 vendor/github.com/docker/libtrust/LICENSE delete mode 100644 vendor/github.com/docker/libtrust/MAINTAINERS delete mode 100644 vendor/github.com/docker/libtrust/README.md delete mode 100644 vendor/github.com/docker/libtrust/certificates.go delete mode 100644 vendor/github.com/docker/libtrust/doc.go delete mode 100644 vendor/github.com/docker/libtrust/ec_key.go delete mode 100644 vendor/github.com/docker/libtrust/filter.go delete mode 100644 vendor/github.com/docker/libtrust/hash.go delete mode 100644 vendor/github.com/docker/libtrust/jsonsign.go delete mode 100644 vendor/github.com/docker/libtrust/key.go delete mode 100644 vendor/github.com/docker/libtrust/key_files.go delete mode 100644 vendor/github.com/docker/libtrust/key_manager.go delete mode 100644 vendor/github.com/docker/libtrust/rsa_key.go delete mode 100644 vendor/github.com/docker/libtrust/util.go rename vendor/{github.com/docker/docker/pkg/ioutils => golang.org/x/sys/windows/registry}/BUILD (51%) create mode 100644 vendor/golang.org/x/sys/windows/registry/key.go create mode 100644 vendor/golang.org/x/sys/windows/registry/mksyscall.go create mode 100644 vendor/golang.org/x/sys/windows/registry/syscall.go create mode 100644 vendor/golang.org/x/sys/windows/registry/value.go create mode 100644 vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 5a7a01d7bdd..e001467b23b 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -66,11 +66,11 @@ }, { "ImportPath": "github.com/Azure/go-ansiterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/Azure/go-ansiterm/winterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/Azure/go-autorest/autorest", @@ -1310,153 +1310,133 @@ }, { "ImportPath": "github.com/docker/docker/api", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/blkiodev", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/container", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/events", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/filters", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/image", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/mount", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/network", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/registry", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/strslice", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/swarm", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/swarm/runtime", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/time", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/versions", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/api/types/volume", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/client", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { - "ImportPath": "github.com/docker/docker/pkg/ioutils", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/jsonlog", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "ImportPath": "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/jsonmessage", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/longpath", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/mount", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/parsers", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/parsers/operatingsystem", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/stdcopy", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/sysinfo", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/system", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/term", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/term/windows", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" - }, - { - "ImportPath": "github.com/docker/docker/pkg/tlsconfig", - "Comment": "docs-v1.12.0-rc4-2016-07-15-7401-g4f3616fb1", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Comment": "docs-v1.12.0-rc4-2016-07-15-9510-ga9fbbdc8d", + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/go-connections/nat", @@ -1483,10 +1463,6 @@ "Comment": "v0.8.0-dev.2-910-gba46b928", "Rev": "ba46b928444931e6865d8618dc03622cac79aa6f" }, - { - "ImportPath": "github.com/docker/libtrust", - "Rev": "9cbd2a1374f46905c68a4eb3694a130610adc62a" - }, { "ImportPath": "github.com/docker/spdystream", "Rev": "449fdfce4d962303d702fec724ef0ad181c92528" @@ -1794,183 +1770,183 @@ }, { "ImportPath": "github.com/google/cadvisor/accelerators", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/cache/memory", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/client/v2", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/collector", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/common", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/containerd", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/crio", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/docker", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/libcontainer", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/raw", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/rkt", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/container/systemd", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/devicemapper", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/events", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/fs", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/info/v1", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/info/v2", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/machine", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/manager", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/raw", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/manager/watcher/rkt", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/metrics", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/storage", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/summary", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils/cloudinfo", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils/cpuload/netlink", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils/docker", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils/oomparser", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils/sysfs", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/utils/sysinfo", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/version", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/cadvisor/zfs", - "Comment": "v0.30.2", - "Rev": "de723a090f4dd5390dc7c2acee37ba9c62f0cc09" + "Comment": "v0.30.0-12-gf834c0f4", + "Rev": "f834c0f4c100ae524db33139dce953e0003f23ad" }, { "ImportPath": "github.com/google/certificate-transparency-go", @@ -3313,6 +3289,10 @@ "ImportPath": "golang.org/x/sys/windows", "Rev": "95c6576299259db960f6c5b9b69ea52422860fce" }, + { + "ImportPath": "golang.org/x/sys/windows/registry", + "Rev": "95c6576299259db960f6c5b9b69ea52422860fce" + }, { "ImportPath": "golang.org/x/sys/windows/svc", "Rev": "95c6576299259db960f6c5b9b69ea52422860fce" diff --git a/Godeps/LICENSES b/Godeps/LICENSES index e8af706acf9..54444771832 100644 --- a/Godeps/LICENSES +++ b/Godeps/LICENSES @@ -41368,206 +41368,7 @@ Apache License ================================================================================ -= vendor/github.com/docker/docker/pkg/ioutils licensed under: = - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2013-2017 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -= vendor/github.com/docker/docker/LICENSE 9740d093a080530b5c5c6573df9af45a -================================================================================ - - -================================================================================ -= vendor/github.com/docker/docker/pkg/jsonlog licensed under: = += vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog licensed under: = Apache License @@ -41964,205 +41765,6 @@ Apache License ================================================================================ -================================================================================ -= vendor/github.com/docker/docker/pkg/longpath licensed under: = - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2013-2017 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -= vendor/github.com/docker/docker/LICENSE 9740d093a080530b5c5c6573df9af45a -================================================================================ - - ================================================================================ = vendor/github.com/docker/docker/pkg/mount licensed under: = @@ -43158,205 +42760,6 @@ Apache License ================================================================================ -================================================================================ -= vendor/github.com/docker/docker/pkg/system licensed under: = - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2013-2017 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -= vendor/github.com/docker/docker/LICENSE 9740d093a080530b5c5c6573df9af45a -================================================================================ - - ================================================================================ = vendor/github.com/docker/docker/pkg/term licensed under: = @@ -43755,205 +43158,6 @@ Apache License ================================================================================ -================================================================================ -= vendor/github.com/docker/docker/pkg/tlsconfig licensed under: = - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2013-2017 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - -= vendor/github.com/docker/docker/LICENSE 9740d093a080530b5c5c6573df9af45a -================================================================================ - - ================================================================================ = vendor/github.com/docker/go-connections/nat licensed under: = @@ -44960,205 +44164,6 @@ Apache License ================================================================================ -================================================================================ -= vendor/github.com/docker/libtrust licensed under: = - - - 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 - - Copyright 2014 Docker, Inc. - - 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. - -= vendor/github.com/docker/libtrust/LICENSE 435b266b3899aa8a959f17d41c56def8 -================================================================================ - - ================================================================================ = vendor/github.com/docker/spdystream licensed under: = @@ -94711,6 +93716,41 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================================================ +================================================================================ += vendor/golang.org/x/sys/windows/registry licensed under: = + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + += vendor/golang.org/x/sys/LICENSE 5d4950ecb7b26d2c5e4e7b4e0dd74707 +================================================================================ + + ================================================================================ = vendor/golang.org/x/sys/windows/svc licensed under: = diff --git a/pkg/kubelet/kuberuntime/logs/BUILD b/pkg/kubelet/kuberuntime/logs/BUILD index 18080943d5f..ba0dc3f49e9 100644 --- a/pkg/kubelet/kuberuntime/logs/BUILD +++ b/pkg/kubelet/kuberuntime/logs/BUILD @@ -10,7 +10,7 @@ go_library( "//pkg/kubelet/apis/cri/runtime/v1alpha2:go_default_library", "//pkg/util/tail:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//vendor/github.com/docker/docker/pkg/jsonlog:go_default_library", + "//vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog:go_default_library", "//vendor/github.com/fsnotify/fsnotify:go_default_library", "//vendor/github.com/golang/glog:go_default_library", ], diff --git a/vendor/BUILD b/vendor/BUILD index f902424c6f9..7beed017ce7 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -168,23 +168,18 @@ filegroup( "//vendor/github.com/docker/distribution/reference:all-srcs", "//vendor/github.com/docker/docker/api:all-srcs", "//vendor/github.com/docker/docker/client:all-srcs", - "//vendor/github.com/docker/docker/pkg/ioutils:all-srcs", - "//vendor/github.com/docker/docker/pkg/jsonlog:all-srcs", + "//vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog:all-srcs", "//vendor/github.com/docker/docker/pkg/jsonmessage:all-srcs", - "//vendor/github.com/docker/docker/pkg/longpath:all-srcs", "//vendor/github.com/docker/docker/pkg/mount:all-srcs", "//vendor/github.com/docker/docker/pkg/parsers:all-srcs", "//vendor/github.com/docker/docker/pkg/stdcopy:all-srcs", "//vendor/github.com/docker/docker/pkg/sysinfo:all-srcs", - "//vendor/github.com/docker/docker/pkg/system:all-srcs", "//vendor/github.com/docker/docker/pkg/term:all-srcs", - "//vendor/github.com/docker/docker/pkg/tlsconfig:all-srcs", "//vendor/github.com/docker/go-connections/nat:all-srcs", "//vendor/github.com/docker/go-connections/sockets:all-srcs", "//vendor/github.com/docker/go-connections/tlsconfig:all-srcs", "//vendor/github.com/docker/go-units:all-srcs", "//vendor/github.com/docker/libnetwork/ipvs:all-srcs", - "//vendor/github.com/docker/libtrust:all-srcs", "//vendor/github.com/docker/spdystream:all-srcs", "//vendor/github.com/elazarl/go-bindata-assetfs:all-srcs", "//vendor/github.com/elazarl/goproxy:all-srcs", diff --git a/vendor/github.com/Azure/go-ansiterm/BUILD b/vendor/github.com/Azure/go-ansiterm/BUILD index 034f531a42f..d4d03afe167 100644 --- a/vendor/github.com/Azure/go-ansiterm/BUILD +++ b/vendor/github.com/Azure/go-ansiterm/BUILD @@ -21,7 +21,6 @@ go_library( importmap = "k8s.io/kubernetes/vendor/github.com/Azure/go-ansiterm", importpath = "github.com/Azure/go-ansiterm", visibility = ["//visibility:public"], - deps = ["//vendor/github.com/sirupsen/logrus:go_default_library"], ) filegroup( diff --git a/vendor/github.com/Azure/go-ansiterm/csi_entry_state.go b/vendor/github.com/Azure/go-ansiterm/csi_entry_state.go index 1bd6057da8a..bcbe00d0c5e 100644 --- a/vendor/github.com/Azure/go-ansiterm/csi_entry_state.go +++ b/vendor/github.com/Azure/go-ansiterm/csi_entry_state.go @@ -5,7 +5,7 @@ type csiEntryState struct { } func (csiState csiEntryState) Handle(b byte) (s state, e error) { - logger.Infof("CsiEntry::Handle %#x", b) + csiState.parser.logf("CsiEntry::Handle %#x", b) nextState, err := csiState.baseState.Handle(b) if nextState != nil || err != nil { @@ -25,7 +25,7 @@ func (csiState csiEntryState) Handle(b byte) (s state, e error) { } func (csiState csiEntryState) Transition(s state) error { - logger.Infof("CsiEntry::Transition %s --> %s", csiState.Name(), s.Name()) + csiState.parser.logf("CsiEntry::Transition %s --> %s", csiState.Name(), s.Name()) csiState.baseState.Transition(s) switch s { diff --git a/vendor/github.com/Azure/go-ansiterm/csi_param_state.go b/vendor/github.com/Azure/go-ansiterm/csi_param_state.go index 4be35c5fd2a..7ed5e01c342 100644 --- a/vendor/github.com/Azure/go-ansiterm/csi_param_state.go +++ b/vendor/github.com/Azure/go-ansiterm/csi_param_state.go @@ -5,7 +5,7 @@ type csiParamState struct { } func (csiState csiParamState) Handle(b byte) (s state, e error) { - logger.Infof("CsiParam::Handle %#x", b) + csiState.parser.logf("CsiParam::Handle %#x", b) nextState, err := csiState.baseState.Handle(b) if nextState != nil || err != nil { @@ -26,7 +26,7 @@ func (csiState csiParamState) Handle(b byte) (s state, e error) { } func (csiState csiParamState) Transition(s state) error { - logger.Infof("CsiParam::Transition %s --> %s", csiState.Name(), s.Name()) + csiState.parser.logf("CsiParam::Transition %s --> %s", csiState.Name(), s.Name()) csiState.baseState.Transition(s) switch s { diff --git a/vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go b/vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go index 2189eb6b6b0..1c719db9e48 100644 --- a/vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go +++ b/vendor/github.com/Azure/go-ansiterm/escape_intermediate_state.go @@ -5,7 +5,7 @@ type escapeIntermediateState struct { } func (escState escapeIntermediateState) Handle(b byte) (s state, e error) { - logger.Infof("escapeIntermediateState::Handle %#x", b) + escState.parser.logf("escapeIntermediateState::Handle %#x", b) nextState, err := escState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err @@ -24,7 +24,7 @@ func (escState escapeIntermediateState) Handle(b byte) (s state, e error) { } func (escState escapeIntermediateState) Transition(s state) error { - logger.Infof("escapeIntermediateState::Transition %s --> %s", escState.Name(), s.Name()) + escState.parser.logf("escapeIntermediateState::Transition %s --> %s", escState.Name(), s.Name()) escState.baseState.Transition(s) switch s { diff --git a/vendor/github.com/Azure/go-ansiterm/escape_state.go b/vendor/github.com/Azure/go-ansiterm/escape_state.go index 7b1b9ad3f12..6390abd231b 100644 --- a/vendor/github.com/Azure/go-ansiterm/escape_state.go +++ b/vendor/github.com/Azure/go-ansiterm/escape_state.go @@ -5,7 +5,7 @@ type escapeState struct { } func (escState escapeState) Handle(b byte) (s state, e error) { - logger.Infof("escapeState::Handle %#x", b) + escState.parser.logf("escapeState::Handle %#x", b) nextState, err := escState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err @@ -28,7 +28,7 @@ func (escState escapeState) Handle(b byte) (s state, e error) { } func (escState escapeState) Transition(s state) error { - logger.Infof("Escape::Transition %s --> %s", escState.Name(), s.Name()) + escState.parser.logf("Escape::Transition %s --> %s", escState.Name(), s.Name()) escState.baseState.Transition(s) switch s { diff --git a/vendor/github.com/Azure/go-ansiterm/osc_string_state.go b/vendor/github.com/Azure/go-ansiterm/osc_string_state.go index 24062d420eb..593b10ab696 100644 --- a/vendor/github.com/Azure/go-ansiterm/osc_string_state.go +++ b/vendor/github.com/Azure/go-ansiterm/osc_string_state.go @@ -5,7 +5,7 @@ type oscStringState struct { } func (oscState oscStringState) Handle(b byte) (s state, e error) { - logger.Infof("OscString::Handle %#x", b) + oscState.parser.logf("OscString::Handle %#x", b) nextState, err := oscState.baseState.Handle(b) if nextState != nil || err != nil { return nextState, err diff --git a/vendor/github.com/Azure/go-ansiterm/parser.go b/vendor/github.com/Azure/go-ansiterm/parser.go index 3286a9cb5e3..03cec7ada62 100644 --- a/vendor/github.com/Azure/go-ansiterm/parser.go +++ b/vendor/github.com/Azure/go-ansiterm/parser.go @@ -2,14 +2,10 @@ package ansiterm import ( "errors" - "io/ioutil" + "log" "os" - - "github.com/sirupsen/logrus" ) -var logger *logrus.Logger - type AnsiParser struct { currState state eventHandler AnsiEventHandler @@ -23,50 +19,69 @@ type AnsiParser struct { ground state oscString state stateMap []state + + logf func(string, ...interface{}) } -func CreateParser(initialState string, evtHandler AnsiEventHandler) *AnsiParser { - logFile := ioutil.Discard +type Option func(*AnsiParser) - if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" { - logFile, _ = os.Create("ansiParser.log") +func WithLogf(f func(string, ...interface{})) Option { + return func(ap *AnsiParser) { + ap.logf = f } +} - logger = &logrus.Logger{ - Out: logFile, - Formatter: new(logrus.TextFormatter), - Level: logrus.InfoLevel, - } - - parser := &AnsiParser{ +func CreateParser(initialState string, evtHandler AnsiEventHandler, opts ...Option) *AnsiParser { + ap := &AnsiParser{ eventHandler: evtHandler, context: &ansiContext{}, } - - parser.csiEntry = csiEntryState{baseState{name: "CsiEntry", parser: parser}} - parser.csiParam = csiParamState{baseState{name: "CsiParam", parser: parser}} - parser.dcsEntry = dcsEntryState{baseState{name: "DcsEntry", parser: parser}} - parser.escape = escapeState{baseState{name: "Escape", parser: parser}} - parser.escapeIntermediate = escapeIntermediateState{baseState{name: "EscapeIntermediate", parser: parser}} - parser.error = errorState{baseState{name: "Error", parser: parser}} - parser.ground = groundState{baseState{name: "Ground", parser: parser}} - parser.oscString = oscStringState{baseState{name: "OscString", parser: parser}} - - parser.stateMap = []state{ - parser.csiEntry, - parser.csiParam, - parser.dcsEntry, - parser.escape, - parser.escapeIntermediate, - parser.error, - parser.ground, - parser.oscString, + for _, o := range opts { + o(ap) } - parser.currState = getState(initialState, parser.stateMap) + if isDebugEnv := os.Getenv(LogEnv); isDebugEnv == "1" { + logFile, _ := os.Create("ansiParser.log") + logger := log.New(logFile, "", log.LstdFlags) + if ap.logf != nil { + l := ap.logf + ap.logf = func(s string, v ...interface{}) { + l(s, v...) + logger.Printf(s, v...) + } + } else { + ap.logf = logger.Printf + } + } - logger.Infof("CreateParser: parser %p", parser) - return parser + if ap.logf == nil { + ap.logf = func(string, ...interface{}) {} + } + + ap.csiEntry = csiEntryState{baseState{name: "CsiEntry", parser: ap}} + ap.csiParam = csiParamState{baseState{name: "CsiParam", parser: ap}} + ap.dcsEntry = dcsEntryState{baseState{name: "DcsEntry", parser: ap}} + ap.escape = escapeState{baseState{name: "Escape", parser: ap}} + ap.escapeIntermediate = escapeIntermediateState{baseState{name: "EscapeIntermediate", parser: ap}} + ap.error = errorState{baseState{name: "Error", parser: ap}} + ap.ground = groundState{baseState{name: "Ground", parser: ap}} + ap.oscString = oscStringState{baseState{name: "OscString", parser: ap}} + + ap.stateMap = []state{ + ap.csiEntry, + ap.csiParam, + ap.dcsEntry, + ap.escape, + ap.escapeIntermediate, + ap.error, + ap.ground, + ap.oscString, + } + + ap.currState = getState(initialState, ap.stateMap) + + ap.logf("CreateParser: parser %p", ap) + return ap } func getState(name string, states []state) state { @@ -97,7 +112,7 @@ func (ap *AnsiParser) handle(b byte) error { } if newState == nil { - logger.Warning("newState is nil") + ap.logf("WARNING: newState is nil") return errors.New("New state of 'nil' is invalid.") } @@ -111,23 +126,23 @@ func (ap *AnsiParser) handle(b byte) error { } func (ap *AnsiParser) changeState(newState state) error { - logger.Infof("ChangeState %s --> %s", ap.currState.Name(), newState.Name()) + ap.logf("ChangeState %s --> %s", ap.currState.Name(), newState.Name()) // Exit old state if err := ap.currState.Exit(); err != nil { - logger.Infof("Exit state '%s' failed with : '%v'", ap.currState.Name(), err) + ap.logf("Exit state '%s' failed with : '%v'", ap.currState.Name(), err) return err } // Perform transition action if err := ap.currState.Transition(newState); err != nil { - logger.Infof("Transition from '%s' to '%s' failed with: '%v'", ap.currState.Name(), newState.Name, err) + ap.logf("Transition from '%s' to '%s' failed with: '%v'", ap.currState.Name(), newState.Name, err) return err } // Enter new state if err := newState.Enter(); err != nil { - logger.Infof("Enter state '%s' failed with: '%v'", newState.Name(), err) + ap.logf("Enter state '%s' failed with: '%v'", newState.Name(), err) return err } diff --git a/vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go b/vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go index 8b69a67a5aa..de0a1f9cde3 100644 --- a/vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go +++ b/vendor/github.com/Azure/go-ansiterm/parser_action_helpers.go @@ -27,7 +27,6 @@ func parseParams(bytes []byte) ([]string, error) { params = append(params, s) } - logger.Infof("Parsed params: %v with length: %d", params, len(params)) return params, nil } @@ -37,7 +36,6 @@ func parseCmd(context ansiContext) (string, error) { func getInt(params []string, dflt int) int { i := getInts(params, 1, dflt)[0] - logger.Infof("getInt: %v", i) return i } @@ -60,8 +58,6 @@ func getInts(params []string, minCount int, dflt int) []int { } } - logger.Infof("getInts: %v", ints) - return ints } diff --git a/vendor/github.com/Azure/go-ansiterm/parser_actions.go b/vendor/github.com/Azure/go-ansiterm/parser_actions.go index 58750a2d2b1..0bb5e51e9aa 100644 --- a/vendor/github.com/Azure/go-ansiterm/parser_actions.go +++ b/vendor/github.com/Azure/go-ansiterm/parser_actions.go @@ -1,19 +1,15 @@ package ansiterm -import ( - "fmt" -) - func (ap *AnsiParser) collectParam() error { currChar := ap.context.currentChar - logger.Infof("collectParam %#x", currChar) + ap.logf("collectParam %#x", currChar) ap.context.paramBuffer = append(ap.context.paramBuffer, currChar) return nil } func (ap *AnsiParser) collectInter() error { currChar := ap.context.currentChar - logger.Infof("collectInter %#x", currChar) + ap.logf("collectInter %#x", currChar) ap.context.paramBuffer = append(ap.context.interBuffer, currChar) return nil } @@ -21,8 +17,8 @@ func (ap *AnsiParser) collectInter() error { func (ap *AnsiParser) escDispatch() error { cmd, _ := parseCmd(*ap.context) intermeds := ap.context.interBuffer - logger.Infof("escDispatch currentChar: %#x", ap.context.currentChar) - logger.Infof("escDispatch: %v(%v)", cmd, intermeds) + ap.logf("escDispatch currentChar: %#x", ap.context.currentChar) + ap.logf("escDispatch: %v(%v)", cmd, intermeds) switch cmd { case "D": // IND @@ -43,8 +39,9 @@ func (ap *AnsiParser) escDispatch() error { func (ap *AnsiParser) csiDispatch() error { cmd, _ := parseCmd(*ap.context) params, _ := parseParams(ap.context.paramBuffer) + ap.logf("Parsed params: %v with length: %d", params, len(params)) - logger.Infof("csiDispatch: %v(%v)", cmd, params) + ap.logf("csiDispatch: %v(%v)", cmd, params) switch cmd { case "@": @@ -102,7 +99,7 @@ func (ap *AnsiParser) csiDispatch() error { top, bottom := ints[0], ints[1] return ap.eventHandler.DECSTBM(top, bottom) default: - logger.Errorf(fmt.Sprintf("Unsupported CSI command: '%s', with full context: %v", cmd, ap.context)) + ap.logf("ERROR: Unsupported CSI command: '%s', with full context: %v", cmd, ap.context) return nil } diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/BUILD b/vendor/github.com/Azure/go-ansiterm/winterm/BUILD index e9c6b6971c2..7864290b85a 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/BUILD +++ b/vendor/github.com/Azure/go-ansiterm/winterm/BUILD @@ -18,7 +18,6 @@ go_library( deps = select({ "@io_bazel_rules_go//go/platform:windows": [ "//vendor/github.com/Azure/go-ansiterm:go_default_library", - "//vendor/github.com/sirupsen/logrus:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go b/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go index daf2f069615..a6732797263 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/ansi.go @@ -175,7 +175,7 @@ func GetStdFile(nFile int) (*os.File, uintptr) { fd, err := syscall.GetStdHandle(nFile) if err != nil { - panic(fmt.Errorf("Invalid standard handle indentifier: %v -- %v", nFile, err)) + panic(fmt.Errorf("Invalid standard handle identifier: %v -- %v", nFile, err)) } return file, uintptr(fd) diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/api.go b/vendor/github.com/Azure/go-ansiterm/winterm/api.go index 462d92f8ef9..6055e33b912 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/api.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/api.go @@ -49,17 +49,22 @@ var ( const ( // Console modes // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v=vs.85).aspx. - ENABLE_PROCESSED_INPUT = 0x0001 - ENABLE_LINE_INPUT = 0x0002 - ENABLE_ECHO_INPUT = 0x0004 - ENABLE_WINDOW_INPUT = 0x0008 - ENABLE_MOUSE_INPUT = 0x0010 - ENABLE_INSERT_MODE = 0x0020 - ENABLE_QUICK_EDIT_MODE = 0x0040 - ENABLE_EXTENDED_FLAGS = 0x0080 + ENABLE_PROCESSED_INPUT = 0x0001 + ENABLE_LINE_INPUT = 0x0002 + ENABLE_ECHO_INPUT = 0x0004 + ENABLE_WINDOW_INPUT = 0x0008 + ENABLE_MOUSE_INPUT = 0x0010 + ENABLE_INSERT_MODE = 0x0020 + ENABLE_QUICK_EDIT_MODE = 0x0040 + ENABLE_EXTENDED_FLAGS = 0x0080 + ENABLE_AUTO_POSITION = 0x0100 + ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200 - ENABLE_PROCESSED_OUTPUT = 0x0001 - ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002 + ENABLE_PROCESSED_OUTPUT = 0x0001 + ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002 + ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004 + DISABLE_NEWLINE_AUTO_RETURN = 0x0008 + ENABLE_LVB_GRID_WORLDWIDE = 0x0010 // Character attributes // Note: diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go b/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go index f015723ade7..3ee06ea7282 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/cursor_helpers.go @@ -34,7 +34,7 @@ func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, window SMALL if err != nil { return err } - logger.Infof("Cursor position set: (%d, %d)", position.X, position.Y) + h.logf("Cursor position set: (%d, %d)", position.X, position.Y) return err } diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go b/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go index 706d270577e..2d27fa1d028 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/scroll_helper.go @@ -50,8 +50,8 @@ func (h *windowsAnsiEventHandler) insertLines(param int) error { // scroll scrolls the provided scroll region by param lines. The scroll region is in buffer coordinates. func (h *windowsAnsiEventHandler) scroll(param int, sr scrollRegion, info *CONSOLE_SCREEN_BUFFER_INFO) error { - logger.Infof("scroll: scrollTop: %d, scrollBottom: %d", sr.top, sr.bottom) - logger.Infof("scroll: windowTop: %d, windowBottom: %d", info.Window.Top, info.Window.Bottom) + h.logf("scroll: scrollTop: %d, scrollBottom: %d", sr.top, sr.bottom) + h.logf("scroll: windowTop: %d, windowBottom: %d", info.Window.Top, info.Window.Bottom) // Copy from and clip to the scroll region (full buffer width) scrollRect := SMALL_RECT{ diff --git a/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go b/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go index 48998bb051e..2d40fb75ad0 100644 --- a/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go +++ b/vendor/github.com/Azure/go-ansiterm/winterm/win_event_handler.go @@ -4,16 +4,13 @@ package winterm import ( "bytes" - "io/ioutil" + "log" "os" "strconv" "github.com/Azure/go-ansiterm" - "github.com/sirupsen/logrus" ) -var logger *logrus.Logger - type windowsAnsiEventHandler struct { fd uintptr file *os.File @@ -28,32 +25,52 @@ type windowsAnsiEventHandler struct { marginByte byte curInfo *CONSOLE_SCREEN_BUFFER_INFO curPos COORD + logf func(string, ...interface{}) } -func CreateWinEventHandler(fd uintptr, file *os.File) ansiterm.AnsiEventHandler { - logFile := ioutil.Discard +type Option func(*windowsAnsiEventHandler) - if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { - logFile, _ = os.Create("winEventHandler.log") - } - - logger = &logrus.Logger{ - Out: logFile, - Formatter: new(logrus.TextFormatter), - Level: logrus.DebugLevel, +func WithLogf(f func(string, ...interface{})) Option { + return func(w *windowsAnsiEventHandler) { + w.logf = f } +} +func CreateWinEventHandler(fd uintptr, file *os.File, opts ...Option) ansiterm.AnsiEventHandler { infoReset, err := GetConsoleScreenBufferInfo(fd) if err != nil { return nil } - return &windowsAnsiEventHandler{ + h := &windowsAnsiEventHandler{ fd: fd, file: file, infoReset: infoReset, attributes: infoReset.Attributes, } + for _, o := range opts { + o(h) + } + + if isDebugEnv := os.Getenv(ansiterm.LogEnv); isDebugEnv == "1" { + logFile, _ := os.Create("winEventHandler.log") + logger := log.New(logFile, "", log.LstdFlags) + if h.logf != nil { + l := h.logf + h.logf = func(s string, v ...interface{}) { + l(s, v...) + logger.Printf(s, v...) + } + } else { + h.logf = logger.Printf + } + } + + if h.logf == nil { + h.logf = func(string, ...interface{}) {} + } + + return h } type scrollRegion struct { @@ -96,7 +113,7 @@ func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, error) { if err := h.Flush(); err != nil { return false, err } - logger.Info("Simulating LF inside scroll region") + h.logf("Simulating LF inside scroll region") if err := h.scrollUp(1); err != nil { return false, err } @@ -119,7 +136,7 @@ func (h *windowsAnsiEventHandler) simulateLF(includeCR bool) (bool, error) { } else { // The cursor is at the bottom of the screen but outside the scroll // region. Skip the LF. - logger.Info("Simulating LF outside scroll region") + h.logf("Simulating LF outside scroll region") if includeCR { if err := h.Flush(); err != nil { return false, err @@ -151,7 +168,7 @@ func (h *windowsAnsiEventHandler) executeLF() error { if err := h.Flush(); err != nil { return err } - logger.Info("Resetting cursor position for LF without CR") + h.logf("Resetting cursor position for LF without CR") if err := SetConsoleCursorPosition(h.fd, pos); err != nil { return err } @@ -186,7 +203,7 @@ func (h *windowsAnsiEventHandler) Print(b byte) error { func (h *windowsAnsiEventHandler) Execute(b byte) error { switch b { case ansiterm.ANSI_TAB: - logger.Info("Execute(TAB)") + h.logf("Execute(TAB)") // Move to the next tab stop, but preserve auto-wrap if already set. if !h.wrapNext { pos, info, err := h.getCurrentInfo() @@ -269,7 +286,7 @@ func (h *windowsAnsiEventHandler) CUU(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CUU: [%v]", []string{strconv.Itoa(param)}) + h.logf("CUU: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorVertical(-param) } @@ -278,7 +295,7 @@ func (h *windowsAnsiEventHandler) CUD(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CUD: [%v]", []string{strconv.Itoa(param)}) + h.logf("CUD: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorVertical(param) } @@ -287,7 +304,7 @@ func (h *windowsAnsiEventHandler) CUF(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CUF: [%v]", []string{strconv.Itoa(param)}) + h.logf("CUF: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorHorizontal(param) } @@ -296,7 +313,7 @@ func (h *windowsAnsiEventHandler) CUB(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CUB: [%v]", []string{strconv.Itoa(param)}) + h.logf("CUB: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorHorizontal(-param) } @@ -305,7 +322,7 @@ func (h *windowsAnsiEventHandler) CNL(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CNL: [%v]", []string{strconv.Itoa(param)}) + h.logf("CNL: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorLine(param) } @@ -314,7 +331,7 @@ func (h *windowsAnsiEventHandler) CPL(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CPL: [%v]", []string{strconv.Itoa(param)}) + h.logf("CPL: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorLine(-param) } @@ -323,7 +340,7 @@ func (h *windowsAnsiEventHandler) CHA(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CHA: [%v]", []string{strconv.Itoa(param)}) + h.logf("CHA: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.moveCursorColumn(param) } @@ -332,7 +349,7 @@ func (h *windowsAnsiEventHandler) VPA(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("VPA: [[%d]]", param) + h.logf("VPA: [[%d]]", param) h.clearWrap() info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { @@ -348,7 +365,7 @@ func (h *windowsAnsiEventHandler) CUP(row int, col int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("CUP: [[%d %d]]", row, col) + h.logf("CUP: [[%d %d]]", row, col) h.clearWrap() info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { @@ -364,7 +381,7 @@ func (h *windowsAnsiEventHandler) HVP(row int, col int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("HVP: [[%d %d]]", row, col) + h.logf("HVP: [[%d %d]]", row, col) h.clearWrap() return h.CUP(row, col) } @@ -373,7 +390,7 @@ func (h *windowsAnsiEventHandler) DECTCEM(visible bool) error { if err := h.Flush(); err != nil { return err } - logger.Infof("DECTCEM: [%v]", []string{strconv.FormatBool(visible)}) + h.logf("DECTCEM: [%v]", []string{strconv.FormatBool(visible)}) h.clearWrap() return nil } @@ -382,7 +399,7 @@ func (h *windowsAnsiEventHandler) DECOM(enable bool) error { if err := h.Flush(); err != nil { return err } - logger.Infof("DECOM: [%v]", []string{strconv.FormatBool(enable)}) + h.logf("DECOM: [%v]", []string{strconv.FormatBool(enable)}) h.clearWrap() h.originMode = enable return h.CUP(1, 1) @@ -392,7 +409,7 @@ func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error { if err := h.Flush(); err != nil { return err } - logger.Infof("DECCOLM: [%v]", []string{strconv.FormatBool(use132)}) + h.logf("DECCOLM: [%v]", []string{strconv.FormatBool(use132)}) h.clearWrap() if err := h.ED(2); err != nil { return err @@ -407,7 +424,7 @@ func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error { } if info.Size.X < targetWidth { if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil { - logger.Info("set buffer failed:", err) + h.logf("set buffer failed: %v", err) return err } } @@ -415,12 +432,12 @@ func (h *windowsAnsiEventHandler) DECCOLM(use132 bool) error { window.Left = 0 window.Right = targetWidth - 1 if err := SetConsoleWindowInfo(h.fd, true, window); err != nil { - logger.Info("set window failed:", err) + h.logf("set window failed: %v", err) return err } if info.Size.X > targetWidth { if err := SetConsoleScreenBufferSize(h.fd, COORD{targetWidth, info.Size.Y}); err != nil { - logger.Info("set buffer failed:", err) + h.logf("set buffer failed: %v", err) return err } } @@ -431,7 +448,7 @@ func (h *windowsAnsiEventHandler) ED(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("ED: [%v]", []string{strconv.Itoa(param)}) + h.logf("ED: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() // [J -- Erases from the cursor to the end of the screen, including the cursor position. @@ -490,7 +507,7 @@ func (h *windowsAnsiEventHandler) EL(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("EL: [%v]", strconv.Itoa(param)) + h.logf("EL: [%v]", strconv.Itoa(param)) h.clearWrap() // [K -- Erases from the cursor to the end of the line, including the cursor position. @@ -531,7 +548,7 @@ func (h *windowsAnsiEventHandler) IL(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("IL: [%v]", strconv.Itoa(param)) + h.logf("IL: [%v]", strconv.Itoa(param)) h.clearWrap() return h.insertLines(param) } @@ -540,7 +557,7 @@ func (h *windowsAnsiEventHandler) DL(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("DL: [%v]", strconv.Itoa(param)) + h.logf("DL: [%v]", strconv.Itoa(param)) h.clearWrap() return h.deleteLines(param) } @@ -549,7 +566,7 @@ func (h *windowsAnsiEventHandler) ICH(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("ICH: [%v]", strconv.Itoa(param)) + h.logf("ICH: [%v]", strconv.Itoa(param)) h.clearWrap() return h.insertCharacters(param) } @@ -558,7 +575,7 @@ func (h *windowsAnsiEventHandler) DCH(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("DCH: [%v]", strconv.Itoa(param)) + h.logf("DCH: [%v]", strconv.Itoa(param)) h.clearWrap() return h.deleteCharacters(param) } @@ -572,7 +589,7 @@ func (h *windowsAnsiEventHandler) SGR(params []int) error { strings = append(strings, strconv.Itoa(v)) } - logger.Infof("SGR: [%v]", strings) + h.logf("SGR: [%v]", strings) if len(params) <= 0 { h.attributes = h.infoReset.Attributes @@ -606,7 +623,7 @@ func (h *windowsAnsiEventHandler) SU(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("SU: [%v]", []string{strconv.Itoa(param)}) + h.logf("SU: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.scrollUp(param) } @@ -615,13 +632,13 @@ func (h *windowsAnsiEventHandler) SD(param int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("SD: [%v]", []string{strconv.Itoa(param)}) + h.logf("SD: [%v]", []string{strconv.Itoa(param)}) h.clearWrap() return h.scrollDown(param) } func (h *windowsAnsiEventHandler) DA(params []string) error { - logger.Infof("DA: [%v]", params) + h.logf("DA: [%v]", params) // DA cannot be implemented because it must send data on the VT100 input stream, // which is not available to go-ansiterm. return nil @@ -631,7 +648,7 @@ func (h *windowsAnsiEventHandler) DECSTBM(top int, bottom int) error { if err := h.Flush(); err != nil { return err } - logger.Infof("DECSTBM: [%d, %d]", top, bottom) + h.logf("DECSTBM: [%d, %d]", top, bottom) // Windows is 0 indexed, Linux is 1 indexed h.sr.top = int16(top - 1) @@ -646,7 +663,7 @@ func (h *windowsAnsiEventHandler) RI() error { if err := h.Flush(); err != nil { return err } - logger.Info("RI: []") + h.logf("RI: []") h.clearWrap() info, err := GetConsoleScreenBufferInfo(h.fd) @@ -663,21 +680,21 @@ func (h *windowsAnsiEventHandler) RI() error { } func (h *windowsAnsiEventHandler) IND() error { - logger.Info("IND: []") + h.logf("IND: []") return h.executeLF() } func (h *windowsAnsiEventHandler) Flush() error { h.curInfo = nil if h.buffer.Len() > 0 { - logger.Infof("Flush: [%s]", h.buffer.Bytes()) + h.logf("Flush: [%s]", h.buffer.Bytes()) if _, err := h.buffer.WriteTo(h.file); err != nil { return err } } if h.wrapNext && !h.drewMarginByte { - logger.Infof("Flush: drawing margin byte '%c'", h.marginByte) + h.logf("Flush: drawing margin byte '%c'", h.marginByte) info, err := GetConsoleScreenBufferInfo(h.fd) if err != nil { diff --git a/vendor/github.com/docker/docker/AUTHORS b/vendor/github.com/docker/docker/AUTHORS index e091ed7dc1b..46102d7402c 100644 --- a/vendor/github.com/docker/docker/AUTHORS +++ b/vendor/github.com/docker/docker/AUTHORS @@ -21,11 +21,13 @@ Adam Eijdenberg Adam Kunk Adam Miller Adam Mills +Adam Pointer Adam Singer Adam Walz Addam Hardy Aditi Rajagopal Aditya +Adnan Khan Adolfo Ochagavía Adria Casas Adrian Moisey @@ -37,11 +39,13 @@ Ahmed Kamal Ahmet Alp Balkan Aidan Feldman Aidan Hobson Sayers -AJ Bowen +AJ Bowen Ajey Charantimath ajneu +Akash Gupta Akihiro Matsushima Akihiro Suda +Akim Demaille Akira Koyasu Akshay Karle Al Tobey @@ -50,10 +54,11 @@ Alan Scherger Alan Thompson Albert Callarisa Albert Zhang +Alejandro González Hevia Aleksa Sarai Aleksandrs Fadins Alena Prokharchyk -Alessandro Boch +Alessandro Boch Alessio Biancalana Alex Chan Alex Chen @@ -61,6 +66,7 @@ Alex Coventry Alex Crawford Alex Ellis Alex Gaynor +Alex Goodman Alex Olshansky Alex Samorukov Alex Warhawk @@ -73,6 +79,7 @@ Alexander Shopov Alexandre Beslic Alexandre Garnier Alexandre González +Alexandre Jomin Alexandru Sfirlogea Alexey Guskov Alexey Kotlyarov @@ -83,7 +90,7 @@ Ali Dehghani Alicia Lauerman Alihan Demir Allen Madsen -Allen Sun +Allen Sun almoehi Alvaro Saurin Alvin Deng @@ -94,16 +101,19 @@ Amir Goldstein Amit Bakshi Amit Krishnan Amit Shukla +Amr Gawish Amy Lindburg Anand Patil AnandkumarPatel Anatoly Borodin Anchal Agrawal +Anda Xu Anders Janmyr Andre Dublin <81dublin@gmail.com> Andre Granovsky Andrea Luzzardi Andrea Turli +Andreas Elvers Andreas Köhler Andreas Savvides Andreas Tiefenthaler @@ -114,6 +124,7 @@ Andrew Duckworth Andrew France Andrew Gerrand Andrew Guenther +Andrew He Andrew Hsu Andrew Kuklewicz Andrew Macgregor @@ -121,8 +132,9 @@ Andrew Macpherson Andrew Martin Andrew McDonnell Andrew Munsell +Andrew Pennebaker Andrew Po -Andrew Weiss +Andrew Weiss Andrew Williams Andrews Medina Andrey Petrov @@ -142,6 +154,7 @@ Anil Madhavapeddy Ankush Agarwal Anonmily Anran Qiao +Anshul Pundir Anthon van der Neut Anthony Baire Anthony Bishopric @@ -165,6 +178,7 @@ Arthur Barr Arthur Gautier Artur Meyster Arun Gupta +Asad Saeeduddin Asbjørn Enge averagehuman Avi Das @@ -188,34 +202,36 @@ Ben Toews Ben Wiklund Benjamin Atkin Benjamin Boudreau +Benjamin Yolken Benoit Chesneau Bernerd Schaefer +Bernhard M. Wiedemann Bert Goethals Bharath Thiruveedula Bhiraj Butala Bhumika Bayani Bilal Amarni -Bill W -bin liu +Bill Wang +Bin Liu Bingshen Wang Blake Geno Boaz Shuster bobby abbott Boris Pruessmann Boshi Lian -boucher Bouke Haarsma Boyd Hemphill boynux Bradley Cicenas Bradley Wright Brandon Liu -Brandon Philips +Brandon Philips Brandon Rhodes Brendan Dixon Brent Salisbury Brett Higgins Brett Kochendorfer +Brett Randall Brian (bex) Exelbierd Brian Bland Brian DeHamer @@ -239,7 +255,6 @@ Bryan Bess Bryan Boreham Bryan Matsuo Bryan Murphy -buddhamagnet Burke Libbey Byung Kang Caleb Spare @@ -252,17 +267,21 @@ Cao Weiwei Carl Henrik Lunde Carl Loa Odin Carl X. Su +Carlo Mion Carlos Alexandro Becker Carlos Sanchez Carol Fager-Higgins Cary Casey Bisson +Catalin Pirvu Ce Gao Cedric Davies Cezar Sa Espinola Chad Swenson Chance Zibolski -Chander G +Chander Govindarajan +Chanhun Jeong +Chao Wang Charles Chan Charles Hooper Charles Law @@ -280,6 +299,10 @@ Chen Hanxiao Chen Min Chen Mingjie Chen Qiu +Cheng-mean Liu +Chengguang Xu +chenyuzhu +Chetan Birajdar Chewey Chia-liang Kao chli @@ -299,17 +322,21 @@ Chris Snow Chris St. Pierre Chris Stivers Chris Swan +Chris Telfer Chris Wahl Chris Weyl Christian Berendt +Christian Brauner Christian Böhme Christian Persson Christian Rotzoll Christian Simon Christian Stefanescu -ChristoperBiscardi Christophe Mehay Christophe Troestler +Christophe Vidal +Christopher Biscardi +Christopher Crone Christopher Currie Christopher Jones Christopher Latham @@ -319,6 +346,7 @@ Chun Chen Ciro S. Costa Clayton Coleman Clinton Kitson +Cody Roseborough Coenraad Loubser Colin Dunklau Colin Hebert @@ -327,6 +355,7 @@ Colin Walters Collin Guarino Colm Hally companycy +Corbin Coleman Corey Farrell Cory Forsyth cressie176 @@ -356,7 +385,9 @@ Dan Levy Dan McPherson Dan Stine Dan Williams +Dani Louca Daniel Antlinger +Daniel Dao Daniel Exner Daniel Farrell Daniel Garcia @@ -372,23 +403,26 @@ Daniel Nordberg Daniel Robinson Daniel S Daniel Von Fange +Daniel Watkins Daniel X Moore Daniel YC Lin Daniel Zhang -Daniel, Dao Quang Minh Danny Berger Danny Yates +Danyal Khaliq Darren Coxall Darren Shepherd Darren Stahl Dattatraya Kumbhar Davanum Srinivas Dave Barboza +Dave Goodchild Dave Henderson Dave MacDonald Dave Tucker David Anderson David Calavera +David Chung David Corking David Cramer David Currie @@ -410,7 +444,7 @@ David Röthlisberger David Sheets David Sissitka David Trott -David Williamson +David Williamson David Xia David Young Davide Ceretti @@ -425,6 +459,7 @@ Denis Defreyne Denis Gladkikh Denis Ollier Dennis Chen +Dennis Chen Dennis Docter Derek Derek @@ -473,10 +508,12 @@ Doron Podoleanu Doug Davis Doug MacEachern Doug Tangren +Douglas Curtis Dr Nic Williams dragon788 Dražen Lučanin Drew Erny +Drew Hubl Dustin Sallings Ed Costello Edmund Wagner @@ -485,12 +522,15 @@ Eike Herzbach Eivin Giske Skaaren Eivind Uggedal Elan Ruusamäe +Elango Sivanandam Elena Morozova +Eli Uriegas Elias Faxö Elias Probst Elijah Zupancic eluck Elvir Kuric +Emil Davtyan Emil Hernvall Emily Maier Emily Rose @@ -506,8 +546,9 @@ Eric Lee Eric Myhre Eric Paris Eric Rafaloff -Eric Rosenberg +Eric Rosenberg Eric Sage +Eric Soderstrom Eric Yang Eric-Olivier Lamey Erica Windisch @@ -520,19 +561,19 @@ Erik St. Martin Erik Weathers Erno Hopearuoho Erwin van der Koogh -Euan +Ethan Bell +Euan Kemp +Eugen Krizo Eugene Yakubovich -eugenkrizo -evalle Evan Allrich Evan Carmi -Evan Hazlett Evan Hazlett Evan Krall Evan Phoenix Evan Wies Evelyn Xu Everett Toews +Evgeny Shmarnev Evgeny Vereshchagin Ewa Czechowska Eystein Måløy Stenberg @@ -548,6 +589,7 @@ Fabrizio Regini Fabrizio Soppelsa Faiz Khan falmp +Fangming Fang Fangyuan Gao <21551127@zju.edu.cn> Fareed Dudhia Fathi Boudra @@ -555,10 +597,11 @@ Federico Gimenez Felipe Oliveira Felix Abecassis Felix Geisendörfer -Felix Hupfeld +Felix Hupfeld Felix Rabe Felix Ruess Felix Schindler +Feng Yan Fengtu Wang Ferenc Szabo Fernando @@ -566,17 +609,16 @@ Fero Volar Ferran Rodenas Filipe Brandenburger Filipe Oliveira -fl0yd Flavio Castelli Flavio Crisciani -FLGMwt Florian Florian Klein Florian Maier +Florian Noeding Florian Weingarten Florin Asavoaie +Florin Patan fonglh -fortinux Foysal Iqbal Francesc Campoy Francis Chuang @@ -591,8 +633,7 @@ Frederick F. Kautz IV Frederik Loeffert Frederik Nordahl Jul Sabroe Freek Kalter -frosforever -fy2462 +Frieder Bluemle Félix Baylac-Jacqué Félix Cantournet Gabe Rosenhouse @@ -619,7 +660,8 @@ Georgi Hristozov Gereon Frey German DZ Gert van Valkenhoef -Gerwim +Gerwim Feiken +Ghislain Bourgeois Giampaolo Mancini Gianluca Borello Gildas Cuisinier @@ -638,6 +680,7 @@ Grant Reaber Graydon Hoare Greg Fausak Greg Pflaum +Greg Stephens Greg Thornton Grzegorz Jaśkiewicz Guilhem Lettron @@ -645,11 +688,13 @@ Guilherme Salgado Guillaume Dufour Guillaume J. Charmes guoxiuyan +Guri Gurjeet Singh Guruprasad Gustav Sinder gwx296173 Günter Zöchbauer +Hakan Özler Hans Kristian Flaatten Hans Rødtang Hao Shu Wei @@ -661,11 +706,13 @@ Harry Zhang Harshal Patil Harshal Patil He Simei +He Xiaoxi He Xin heartlock <21521209@zju.edu.cn> Hector Castro Helen Xie Henning Sprang +Hiroshi Hatake Hobofan Hollie Teal Hong Xu @@ -681,8 +728,8 @@ Hunter Blanks huqun Huu Nguyen hyeongkyu.lee -hyp3rdino Hyzhou Zhy +Iago López Galeiras Ian Babrou Ian Bishop Ian Bull @@ -696,11 +743,12 @@ Iavael Icaro Seara Ignacio Capurro Igor Dolzhikov +Igor Karpovich Iliana Weller Ilkka Laukkanen Ilya Dmitrichenko Ilya Gusev -ILYA Khlopotov +Ilya Khlopotov imre Fitos inglesp Ingo Gottwald @@ -710,14 +758,17 @@ Isao Jonas Ivan Babrou Ivan Fraixedes Ivan Grcic -Ivan Markin +Ivan Markin J Bruni J. Nunn Jack Danger Canty +Jack Laxson Jacob Atzen Jacob Edelman Jacob Tomlinson +Jacob Vallejo Jacob Wen +Jaivish Kothari Jake Champlin Jake Moshenko Jake Sanders @@ -734,7 +785,7 @@ James Mills James Nesbitt James Nugent James Turnbull -Jamie Hannaford +Jamie Hannaford Jamshid Afshar Jan Keromnes Jan Koprowski @@ -744,7 +795,6 @@ Jan-Gerd Tenberge Jan-Jaap Driessen Jana Radhakrishnan Jannick Fahlbusch -Janonymous Januar Wayong Jared Biel Jared Hocutt @@ -773,7 +823,9 @@ Jean-Christophe Berthon Jean-Paul Calderone Jean-Pierre Huynh Jean-Tiare Le Bigot +Jeeva S. Chelladhurai Jeff Anderson +Jeff Hajewski Jeff Johnston Jeff Lindsay Jeff Mickey @@ -791,17 +843,17 @@ Jeremy Price Jeremy Qian Jeremy Unruh Jeremy Yallop +Jeroen Franse Jeroen Jacobs Jesse Dearing Jesse Dubay Jessica Frazelle Jezeniel Zapanta -jgeiger Jhon Honce Ji.Zhilong Jian Zhang -jianbosun Jie Luo +Jihyun Hwang Jilles Oldenbeuving Jim Alateras Jim Galasyn @@ -828,6 +880,7 @@ Joel Friedly Joel Handwell Joel Hansson Joel Wurtz +Joey Geiger Joey Geiger Joey Gibson Joffrey F @@ -852,11 +905,13 @@ John V. Martinez John Warwick John Willis Jon Johnson +Jon Surrell Jon Wedaman Jonas Pfenniger Jonathan A. Sternberg Jonathan Boulle Jonathan Camp +Jonathan Choy Jonathan Dowland Jonathan Lebon Jonathan Lomas @@ -868,10 +923,11 @@ Jonathan Stoppani Jonh Wendell Joni Sar Joost Cassee -Jordan Jordan Arentsen +Jordan Jennings Jordan Sissel Jorge Marin +Jorit Kleine-Möllhoff Jose Diaz-Gonzalez Joseph Anthony Pasquale Holsten Joseph Hager @@ -879,6 +935,7 @@ Joseph Kern Joseph Rothrock Josh Josh Bodah +Josh Bonczkowski Josh Chorlton Josh Eveleth Josh Hawn @@ -888,9 +945,8 @@ Josh Soref Josh Wilson Josiah Kiehl José Tomás Albornoz +Joyce Jang JP -jrabbit -jroenf Julian Taylor Julien Barbier Julien Bisconti @@ -915,9 +971,9 @@ Jérôme Petazzoni Jörg Thalheim K. Heller Kai Blin -Kai Qiang Wu(Kennan) +Kai Qiang Wu (Kennan) Kamil Domański -kamjar gerami +Kamjar Gerami Kanstantsin Shautsou Kara Alexandra Karan Lyons @@ -925,7 +981,9 @@ Kareem Khazem kargakis Karl Grzeszczak Karol Duleba +Karthik Karanth Karthik Nayak +Kate Heddleston Katie McLaughlin Kato Kazuyoshi Katrina Owen @@ -951,20 +1009,19 @@ Kevin J. Lynagh Kevin Jing Qiu Kevin Kern Kevin Menard +Kevin Meredith Kevin P. Kucharczyk Kevin Richardson Kevin Shi Kevin Wallace Kevin Yap -kevinmeredith Keyvan Fatehi kies Kim BKC Carlbacker Kim Eik Kimbro Staken -Kir Kolyshkin +Kir Kolyshkin Kiran Gangadharan -Kirill Kolyshkin Kirill SIbirev knappe Kohei Tsuruta @@ -1013,6 +1070,7 @@ Levi Gross Lewis Daly Lewis Marshall Lewis Peckover +Li Yi Liam Macgillavry Liana Lo Liang Mingqiang @@ -1036,14 +1094,15 @@ Lloyd Dewolf Lokesh Mandvekar longliqiang88 <394564827@qq.com> Lorenz Leutgeb -Lorenzo Fontana +Lorenzo Fontana Louis Opter -Luca Favatella +Luca Favatella Luca Marturana Luca Orlandi Luca-Bogdan Grigorescu Lucas Chan Lucas Chi +Lucas Molas Luciano Mores Luis Martínez de Bartolomé Izquierdo Luiz Svoboda @@ -1069,16 +1128,20 @@ Manfred Zabarauskas Manjunath A Kumatagi Mansi Nahar Manuel Meurer +Manuel Rüger Manuel Woelker mapk0y Marc Abramowitz Marc Kuo Marc Tamsky +Marcel Edmund Franke +Marcelo Horacio Fortino Marcelo Salazar Marco Hennings Marcus Cobden Marcus Farkas Marcus Linke +Marcus Martins Marcus Ramberg Marek Goldmann Marian Marinov @@ -1091,12 +1154,14 @@ Mark Allen Mark McGranaghan Mark McKinstry Mark Milstein +Mark Oates Mark Parker Mark West Markan Patel Marko Mikulicic Marko Tibold Markus Fix +Markus Kortlang Martijn Dwars Martijn van Oosterhout Martin Honermeyer @@ -1105,10 +1170,12 @@ Martin Mosegaard Amdisen Martin Redmond Mary Anthony Masahito Zembutsu +Masato Ohba Masayuki Morita Mason Malone Mateusz Sulima Mathias Monnerville +Mathieu Champlon Mathieu Le Marec - Pasquet Mathieu Parent Matt Apperson @@ -1119,18 +1186,20 @@ Matt Hoyle Matt McCormick Matt Moore Matt Richardson +Matt Rickard Matt Robenolt +Matt Schurenko +Matt Williams Matthew Heon Matthew Lapworth Matthew Mayer +Matthew Mosesohn Matthew Mueller Matthew Riley Matthias Klumpp Matthias Kühnle Matthias Rampke Matthieu Hauglustaine -mattymo -mattyw Mauricio Garavaglia mauriyouth Max Shytikov @@ -1163,6 +1232,7 @@ Michael Huettermann Michael Irwin Michael Käufl Michael Neale +Michael Nussbaum Michael Prokop Michael Scharf Michael Spetsiotis @@ -1177,6 +1247,7 @@ Michal Minář Michal Wieczorek Michaël Pailloncy Michał Czeraszkiewicz +Michał Gryko Michiel@unhosted Mickaël FORTUNATO Miguel Angel Fernández @@ -1189,9 +1260,11 @@ Mike Chelen Mike Danese Mike Dillon Mike Dougherty +Mike Estes Mike Gaffney Mike Goelzer Mike Leone +Mike Lundy Mike MacCana Mike Naberezny Mike Snitzer @@ -1204,6 +1277,7 @@ mingqing Mingzhen Feng Misty Stanley-Jones Mitch Capper +Mizuki Urushida mlarcher Mohammad Banikazemi Mohammed Aaqib Ansari @@ -1215,16 +1289,14 @@ Morgy93 Morten Siebuhr Morton Fox Moysés Borges -mqliang +mrfly Mrunal Patel -msabansal -mschurenko Muayyad Alsadi -muge Mustafa Akın Muthukumar R Máximo Cuadros Médi-Rémi Hashim +Nace Oroz Nahum Shalman Nakul Pathak Nalin Dahyabhai @@ -1249,20 +1321,22 @@ Neyazul Haque Nghia Tran Niall O'Higgins Nicholas E. Rabenau -nick Nick DeCoursin Nick Irvine +Nick Neisen Nick Parker Nick Payne +Nick Russo Nick Stenning Nick Stinemates NickrenREN Nicola Kabar -Nicolas Borboën -Nicolas De loof +Nicolas Borboën +Nicolas De Loof Nicolas Dudebout Nicolas Goy Nicolas Kaiser +Nicolas Sterchele Nicolás Hock Isaza Nigel Poulton Nik Nyby @@ -1273,7 +1347,9 @@ Nikolay Milovanov Nirmal Mehta Nishant Totla NIWA Hideyuki +Noah Meyerhans Noah Treuhaft +NobodyOnSE noducks Nolan Darilek nponeccop @@ -1281,8 +1357,6 @@ Nuutti Kotivuori nzwsch O.S. Tezer objectified -OddBloke -odk- Oguz Bilgic Oh Jinkyun Ohad Schneider @@ -1292,22 +1366,20 @@ Oliver Neal Olivier Gambier Olle Jonsson Oriol Francès -orkaa Oskar Niburski Otto Kekäläinen +Ouyang Liduo Ovidio Mallo -oyld -ozlerhakan -paetling -pandrew -panticz +Panagiotis Moustafellos Paolo G. Giarrusso +Pascal Pascal Borreli Pascal Hartig Patrick Böänziger Patrick Devine Patrick Hemmer Patrick Stapleton +Patrik Cyvoct pattichen Paul paul @@ -1325,11 +1397,13 @@ Paul Nasrat Paul Weaver Paulo Ribeiro Pavel Lobashov +Pavel Pletenev Pavel Pospisil Pavel Sutyrin Pavel Tikhomirov Pavlos Ratis Pavol Vargovcik +Pawel Konczalski Peeyush Gupta Peggy Li Pei Su @@ -1354,6 +1428,7 @@ Petr Švihlík Phil Phil Estes Phil Spitler +Philip Alexander Etling Philip Monroe Philipp Gillé Philipp Wahala @@ -1372,13 +1447,14 @@ pixelistik Porjo Poul Kjeldager Sørensen Pradeep Chhetri +Pradip Dhara Prasanna Gautam Pratik Karki Prayag Verma +Priya Wadhwa Przemek Hejman Pure White pysqz -qhuang Qiang Huang Qinglan Peng qudongfang @@ -1399,7 +1475,7 @@ Ralph Bean Ramkumar Ramachandra Ramon Brooker Ramon van Alteren -Ray Tsang +Ray Tsang ReadmeCritic Recursive Madman Reficul @@ -1407,9 +1483,9 @@ Regan McCooey Remi Rampin Remy Suen Renato Riccieri Santos Zannon -resouer -rgstephens +Renaud Gaubert Rhys Hiltner +Ri Xu Ricardo N Feliciano Rich Moyse Rich Seymour @@ -1458,7 +1534,6 @@ Roman Strashkin Ron Smits Ron Williams root -root root root root @@ -1481,6 +1556,8 @@ Ryan Liu Ryan McLaughlin Ryan O'Donnell Ryan Seto +Ryan Simmen +Ryan Stelly Ryan Thomas Ryan Trauntvein Ryan Wallner @@ -1494,7 +1571,7 @@ Sabin Basyal Sachin Joshi Sagar Hani Sainath Grandhi -sakeven +Sakeven Jiang Sally O'Malley Sam Abed Sam Alba @@ -1514,8 +1591,9 @@ Sankar சங்கர் Sanket Saurav Santhosh Manohar sapphiredev +Sargun Dhillon +Sascha Andres Satnam Singh -satoru Satoshi Amemiya Satoshi Tagomori Scott Bessler @@ -1545,6 +1623,7 @@ Serhat Gülçiçek Sevki Hasirci Shane Canon Shane da Silva +Shaun Kaasten shaunol Shawn Landden Shawn Siefkas @@ -1556,6 +1635,7 @@ Shengbo Song Shev Yan Shih-Yuan Lee Shijiang Wei +Shijun Qin Shishir Mahajan Shoubhik Bose Shourya Sarcar @@ -1563,6 +1643,7 @@ shuai-z Shukui Yang Shuwei Hao Sian Lerk Lau +Sidhartha Mani sidharthamani Silas Sewell Silvan Jegen @@ -1572,9 +1653,9 @@ Simon Ferquel Simon Leinen Simon Menke Simon Taranto +Simon Vikstrom Sindhu S Sjoerd Langkemper -skaasten Solganik Alexander Solomon Hykes Song Gao @@ -1595,6 +1676,7 @@ Stefan S. Stefan Scherer Stefan Staudenmeyer Stefan Weil +Stephan Spindler Stephen Crosby Stephen Day Stephen Drake @@ -1614,6 +1696,7 @@ Steven Taylor Subhajit Ghosh Sujith Haridasan Sun Gengze <690388648@qq.com> +Sun Jianbo Sunny Gogoi Suryakumar Sudar Sven Dowideit @@ -1621,13 +1704,14 @@ Swapnil Daingade Sylvain Baubeau Sylvain Bellemare Sébastien +Sébastien HOUZÉ Sébastien Luttringer Sébastien Stormacq Tabakhase Tadej Janež TAGOMORI Satoshi tang0th -Tangi COLIN +Tangi Colin Tatsuki Sugiura Tatsushi Inagaki Taylor Jones @@ -1648,7 +1732,7 @@ Thomas Gazagnaire Thomas Grainger Thomas Hansen Thomas Leonard -Thomas LEVEIL +Thomas Léveil Thomas Orozco Thomas Riccardi Thomas Schroeter @@ -1656,6 +1740,7 @@ Thomas Sjögren Thomas Swift Thomas Tanaka Thomas Texier +Ti Zhou Tianon Gravi Tianyi Wang Tibor Vass @@ -1696,6 +1781,7 @@ Tom Fotherby Tom Howe Tom Hulihan Tom Maaswinkel +Tom Sweeney Tom Wilkie Tom X. Tobin Tomas Tomecek @@ -1720,13 +1806,15 @@ Trent Ogren Trevor Trevor Pounds Trevor Sullivan -trishnaguha +Trishna Guha Tristan Carel Troy Denton +Tycho Andersen Tyler Brock Tzu-Jung Lee uhayate Ulysse Carion +Umesh Yadav Utz Bacher vagrant Vaidas Jablonskis @@ -1746,7 +1834,6 @@ Viktor Stanchev Viktor Vojnovski VinayRaghavanKS Vincent Batts -Vincent Bernat Vincent Bernat Vincent Demeester Vincent Giersch @@ -1766,11 +1853,13 @@ Vladimir Pouzanov Vladimir Rutsky Vladimir Varankin VladimirAus +Vlastimil Zeman Vojtech Vitek (V-Teq) waitingkuo Walter Leibbrandt Walter Stanish -WANG Chao +Wang Chao +Wang Guoliang Wang Jie Wang Long Wang Ping @@ -1778,14 +1867,18 @@ Wang Xing Wang Yuexiao Ward Vandewege WarheadsSE +Wassim Dhif Wayne Chang Wayne Song +Weerasak Chongnguluam Wei Wu Wei-Ting Kuo +weipeng weiyan Weiyang Zhu Wen Cheng Ma Wendel Fleming +Wenjun Tang Wenkai Yin Wentao Zhang Wenxuan Zhao @@ -1804,9 +1897,7 @@ William Martin William Riancho William Thurston WiseTrem -wlan0 Wolfgang Powisch -wonderflow Wonjun Kim xamyzhao Xianglin Gao @@ -1818,7 +1909,7 @@ xiekeyang Xinbo Weng Xinzi Zhou Xiuming Chen -xlgao-zju +Xuecong Liao xuzhaokui Yahya YAMADA Tsuyoshi @@ -1826,10 +1917,12 @@ Yamasaki Masahide Yan Feng Yang Bai Yang Pengfei +yangchenliang Yanqiang Miao Yao Zaiyong Yassine Tijani Yasunori Mahata +Yazhong Liu Yestin Sun Yi EungJun Yibai Zhang @@ -1838,20 +1931,22 @@ Ying Li Yohei Ueda Yong Tang Yongzhi Pan -yorkie +Yosef Fertel You-Sheng Yang (楊有勝) Youcef YEKHLEF Yu Changchun Yu Chengxia Yu Peng +Yu-Ju Hong Yuan Sun Yuanhong Peng +Yuhao Fang Yunxiang Huang Yurii Rashkovskii -yuzou +Yves Junqueira Zac Dover Zach Borboa -Zachary Jaffee +Zachary Jaffee Zain Memon Zaiste! Zane DeGraffenried @@ -1860,11 +1955,12 @@ Zen Lin(Zhinan Lin) Zhang Kun Zhang Wei Zhang Wentao +ZhangHang zhangxianwei Zhenan Ye <21551168@zju.edu.cn> zhenghenghuo Zhenkun Bi -zhouhao +Zhou Hao Zhu Guihua Zhu Kunjia Zhuoyun Wei @@ -1874,6 +1970,7 @@ Ziming Dong ZJUshuaizhou <21551191@zju.edu.cn> zmarouf Zoltan Tombol +Zou Yu zqh Zuhayr Elahi Zunayed Ali @@ -1882,4 +1979,6 @@ Zunayed Ali Átila Camurça Alves 尹吉峰 徐俊杰 +慕陶 搏通 +黄艳红00139573 diff --git a/vendor/github.com/docker/docker/api/BUILD b/vendor/github.com/docker/docker/api/BUILD index 557160911da..54ae48a2e48 100644 --- a/vendor/github.com/docker/docker/api/BUILD +++ b/vendor/github.com/docker/docker/api/BUILD @@ -6,16 +6,10 @@ go_library( "common.go", "common_unix.go", "common_windows.go", - "names.go", ], importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/api", importpath = "github.com/docker/docker/api", visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/docker/docker/pkg/ioutils:go_default_library", - "//vendor/github.com/docker/docker/pkg/system:go_default_library", - "//vendor/github.com/docker/libtrust:go_default_library", - ], ) filegroup( diff --git a/vendor/github.com/docker/docker/api/README.md b/vendor/github.com/docker/docker/api/README.md index bb881325248..f136c3433af 100644 --- a/vendor/github.com/docker/docker/api/README.md +++ b/vendor/github.com/docker/docker/api/README.md @@ -10,7 +10,7 @@ It consists of various components in this repository: - `client/` The Go client used by the command-line client. It can also be used by third-party Go programs. - `daemon/` The daemon, which serves the API. -## Swagger definition +## Swagger definition The API is defined by the [Swagger](http://swagger.io/specification/) definition in `api/swagger.yaml`. This definition can be used to: @@ -20,7 +20,7 @@ The API is defined by the [Swagger](http://swagger.io/specification/) definition ## Updating the API documentation -The API documentation is generated entirely from `api/swagger.yaml`. If you make updates to the API, you'll need to edit this file to represent the change in the documentation. +The API documentation is generated entirely from `api/swagger.yaml`. If you make updates to the API, edit this file to represent the change in the documentation. The file is split into two main sections: @@ -29,9 +29,9 @@ The file is split into two main sections: To make an edit, first look for the endpoint you want to edit under `paths`, then make the required edits. Endpoints may reference reusable objects with `$ref`, which can be found in the `definitions` section. -There is hopefully enough example material in the file for you to copy a similar pattern from elsewhere in the file (e.g. adding new fields or endpoints), but for the full reference, see the [Swagger specification](https://github.com/docker/docker/issues/27919) +There is hopefully enough example material in the file for you to copy a similar pattern from elsewhere in the file (e.g. adding new fields or endpoints), but for the full reference, see the [Swagger specification](https://github.com/docker/docker/issues/27919). -`swagger.yaml` is validated by `hack/validate/swagger` to ensure it is a valid Swagger definition. This is useful for when you are making edits to ensure you are doing the right thing. +`swagger.yaml` is validated by `hack/validate/swagger` to ensure it is a valid Swagger definition. This is useful when making edits to ensure you are doing the right thing. ## Viewing the API documentation diff --git a/vendor/github.com/docker/docker/api/common.go b/vendor/github.com/docker/docker/api/common.go index 859daf602cc..2879a110c10 100644 --- a/vendor/github.com/docker/docker/api/common.go +++ b/vendor/github.com/docker/docker/api/common.go @@ -1,65 +1,11 @@ package api -import ( - "encoding/json" - "encoding/pem" - "fmt" - "os" - "path/filepath" - - "github.com/docker/docker/pkg/ioutils" - "github.com/docker/docker/pkg/system" - "github.com/docker/libtrust" -) - // Common constants for daemon and client. const ( // DefaultVersion of Current REST API - DefaultVersion string = "1.31" + DefaultVersion = "1.38" // NoBaseImageSpecifier is the symbol used by the FROM // command to specify that no base image is to be used. - NoBaseImageSpecifier string = "scratch" + NoBaseImageSpecifier = "scratch" ) - -// LoadOrCreateTrustKey attempts to load the libtrust key at the given path, -// otherwise generates a new one -func LoadOrCreateTrustKey(trustKeyPath string) (libtrust.PrivateKey, error) { - err := system.MkdirAll(filepath.Dir(trustKeyPath), 0700, "") - if err != nil { - return nil, err - } - trustKey, err := libtrust.LoadKeyFile(trustKeyPath) - if err == libtrust.ErrKeyFileDoesNotExist { - trustKey, err = libtrust.GenerateECP256PrivateKey() - if err != nil { - return nil, fmt.Errorf("Error generating key: %s", err) - } - encodedKey, err := serializePrivateKey(trustKey, filepath.Ext(trustKeyPath)) - if err != nil { - return nil, fmt.Errorf("Error serializing key: %s", err) - } - if err := ioutils.AtomicWriteFile(trustKeyPath, encodedKey, os.FileMode(0600)); err != nil { - return nil, fmt.Errorf("Error saving key file: %s", err) - } - } else if err != nil { - return nil, fmt.Errorf("Error loading key file %s: %s", trustKeyPath, err) - } - return trustKey, nil -} - -func serializePrivateKey(key libtrust.PrivateKey, ext string) (encoded []byte, err error) { - if ext == ".json" || ext == ".jwk" { - encoded, err = json.Marshal(key) - if err != nil { - return nil, fmt.Errorf("unable to encode private key JWK: %s", err) - } - } else { - pemBlock, err := key.PEMBlock() - if err != nil { - return nil, fmt.Errorf("unable to encode private key PEM: %s", err) - } - encoded = pem.EncodeToMemory(pemBlock) - } - return -} diff --git a/vendor/github.com/docker/docker/api/common_unix.go b/vendor/github.com/docker/docker/api/common_unix.go index 081e61c4511..21fdf775c4c 100644 --- a/vendor/github.com/docker/docker/api/common_unix.go +++ b/vendor/github.com/docker/docker/api/common_unix.go @@ -3,4 +3,4 @@ package api // MinVersion represents Minimum REST API version supported -const MinVersion string = "1.12" +const MinVersion = "1.12" diff --git a/vendor/github.com/docker/docker/api/names.go b/vendor/github.com/docker/docker/api/names.go deleted file mode 100644 index f147d1f4ceb..00000000000 --- a/vendor/github.com/docker/docker/api/names.go +++ /dev/null @@ -1,9 +0,0 @@ -package api - -import "regexp" - -// RestrictedNameChars collects the characters allowed to represent a name, normally used to validate container and volume names. -const RestrictedNameChars = `[a-zA-Z0-9][a-zA-Z0-9_.-]` - -// RestrictedNamePattern is a regular expression to validate names against the collection of restricted characters. -var RestrictedNamePattern = regexp.MustCompile(`^` + RestrictedNameChars + `+$`) diff --git a/vendor/github.com/docker/docker/api/swagger.yaml b/vendor/github.com/docker/docker/api/swagger.yaml index 41f4248a889..86374415fd5 100644 --- a/vendor/github.com/docker/docker/api/swagger.yaml +++ b/vendor/github.com/docker/docker/api/swagger.yaml @@ -19,10 +19,10 @@ produces: consumes: - "application/json" - "text/plain" -basePath: "/v1.31" +basePath: "/v1.38" info: title: "Docker Engine API" - version: "1.31" + version: "1.38" x-logo: url: "https://docs.docker.com/images/logo-docker-main.png" description: | @@ -42,33 +42,26 @@ info: # Versioning - The API is usually changed in each release of Docker, so API calls are versioned to ensure that clients don't break. + The API is usually changed in each release, so API calls are versioned to + ensure that clients don't break. To lock to a specific version of the API, + you prefix the URL with its version, for example, call `/v1.30/info` to use + the v1.30 version of the `/info` endpoint. If the API version specified in + the URL is not supported by the daemon, a HTTP `400 Bad Request` error message + is returned. - For Docker Engine 17.06, the API version is 1.30. To lock to this version, you prefix the URL with `/v1.30`. For example, calling `/info` is the same as calling `/v1.30/info`. + If you omit the version-prefix, the current version of the API (v1.38) is used. + For example, calling `/info` is the same as calling `/v1.38/info`. Using the + API without a version-prefix is deprecated and will be removed in a future release. - Engine releases in the near future should support this version of the API, so your client will continue to work even if it is talking to a newer Engine. + Engine releases in the near future should support this version of the API, + so your client will continue to work even if it is talking to a newer Engine. - In previous versions of Docker, it was possible to access the API without providing a version. This behaviour is now deprecated will be removed in a future version of Docker. + The API uses an open schema model, which means server may add extra properties + to responses. Likewise, the server will ignore any extra query parameters and + request body properties. When you write clients, you need to ignore additional + properties in responses to ensure they do not break when talking to newer + daemons. - The API uses an open schema model, which means server may add extra properties to responses. Likewise, the server will ignore any extra query parameters and request body properties. When you write clients, you need to ignore additional properties in responses to ensure they do not break when talking to newer Docker daemons. - - This documentation is for version 1.31 of the API. Use this table to find documentation for previous versions of the API: - - Docker version | API version | Changes - ----------------|-------------|--------- - 17.06.x | [1.30](https://docs.docker.com/engine/api/v1.30/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-30-api-changes) - 17.05.x | [1.29](https://docs.docker.com/engine/api/v1.29/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-29-api-changes) - 17.04.x | [1.28](https://docs.docker.com/engine/api/v1.28/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-28-api-changes) - 17.03.1 | [1.27](https://docs.docker.com/engine/api/v1.27/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-27-api-changes) - 1.13.1 & 17.03.0 | [1.26](https://docs.docker.com/engine/api/v1.26/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-26-api-changes) - 1.13.0 | [1.25](https://docs.docker.com/engine/api/v1.25/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-25-api-changes) - 1.12.x | [1.24](https://docs.docker.com/engine/api/v1.24/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-24-api-changes) - 1.11.x | [1.23](https://docs.docker.com/engine/api/v1.23/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-23-api-changes) - 1.10.x | [1.22](https://docs.docker.com/engine/api/v1.22/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-22-api-changes) - 1.9.x | [1.21](https://docs.docker.com/engine/api/v1.21/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-21-api-changes) - 1.8.x | [1.20](https://docs.docker.com/engine/api/v1.20/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-20-api-changes) - 1.7.x | [1.19](https://docs.docker.com/engine/api/v1.19/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-19-api-changes) - 1.6.x | [1.18](https://docs.docker.com/engine/api/v1.18/) | [API changes](https://docs.docker.com/engine/api/version-history/#v1-18-api-changes) # Authentication @@ -143,6 +136,10 @@ tags: x-displayName: "Secrets" description: | Secrets are sensitive data that can be used by services. Swarm mode must be enabled for these endpoints to work. + - name: "Config" + x-displayName: "Configs" + description: | + Configs are application configurations that can be used by services. Swarm mode must be enabled for these endpoints to work. # System things - name: "Plugin" x-displayName: "Plugins" @@ -158,6 +155,7 @@ definitions: IP: type: "string" format: "ip-address" + description: "Host IP address that the container's port is mapped to" PrivatePort: type: "integer" format: "uint16" @@ -170,7 +168,7 @@ definitions: Type: type: "string" x-nullable: false - enum: ["tcp", "udp"] + enum: ["tcp", "udp", "sctp"] example: PrivatePort: 8080 PublicPort: 80 @@ -257,6 +255,7 @@ definitions: properties: Propagation: description: "A propagation mode with the value `[r]private`, `[r]shared`, or `[r]slave`." + type: "string" enum: - "private" - "rprivate" @@ -300,6 +299,7 @@ definitions: Mode: description: "The permission mode for the tmpfs mount in an integer." type: "integer" + RestartPolicy: description: | The behavior to apply when the container exits. The default is not to restart. @@ -334,6 +334,7 @@ definitions: Memory: description: "Memory limit in bytes." type: "integer" + format: "int64" default: 0 # Applicable to UNIX platforms CgroupParent: @@ -399,6 +400,7 @@ definitions: CpusetCpus: description: "CPUs in which to allow execution (e.g., `0-3`, `0,1`)" type: "string" + example: "0-3" CpusetMems: description: "Memory nodes (MEMs) in which to allow execution (0-3, 0,1). Only effective on NUMA systems." type: "string" @@ -442,6 +444,10 @@ definitions: OomKillDisable: description: "Disable OOM Killer for the container." type: "boolean" + Init: + description: "Run an init inside the container that forwards signals and reaps processes. This field is omitted if empty, and the default (as configured on the daemon) is used." + type: "boolean" + x-nullable: true PidsLimit: description: "Tune a container's pids limit. Set -1 for unlimited." type: "integer" @@ -493,14 +499,16 @@ definitions: NanoCPUs: type: "integer" format: "int64" + example: 4000000000 MemoryBytes: type: "integer" format: "int64" + example: 8272408576 GenericResources: $ref: "#/definitions/GenericResources" GenericResources: - description: "User defined Resources, can be either Integer resources (e.g: SSD=3) or String resources (e.g: GPU={UUID1, UUID2})" + description: "User-defined resources can be either Integer resources (e.g, `SSD=3`) or String resources (e.g, `GPU=UUID1`)" type: "array" items: type: "object" @@ -520,6 +528,16 @@ definitions: Value: type: "integer" format: "int64" + example: + - DiscreteResourceSpec: + Kind: "SSD" + Value: 3 + - NamedResourceSpec: + Kind: "GPU" + Value: "UUID1" + - NamedResourceSpec: + Kind: "GPU" + Value: "UUID2" HealthConfig: description: "A test to perform to check that the container is healthy." @@ -562,7 +580,7 @@ definitions: A list of volume bindings for this container. Each volume binding is a string in one of these forms: - `host-src:container-dest` to bind-mount a host path into the container. Both `host-src`, and `container-dest` must be an _absolute_ path. - - `host-src:container-dest:ro` to make the bind-mount read-only inside the container. Both `host-src`, and `container-dest` must be an _absolute_ path. + - `host-src:container-dest:ro` to make the bind mount read-only inside the container. Both `host-src`, and `container-dest` must be an _absolute_ path. - `volume-name:container-dest` to bind-mount a volume managed by a volume driver into the container. `container-dest` must be an _absolute_ path. - `volume-name:container-dest:ro` to mount the volume read-only inside the container. `container-dest` must be an _absolute_ path. items: @@ -595,17 +613,7 @@ definitions: description: "Network mode to use for this container. Supported standard values are: `bridge`, `host`, `none`, and `container:`. Any other value is taken as a custom network's name to which this container should connect to." PortBindings: - type: "object" - description: "A map of exposed container ports and the host port they should map to." - additionalProperties: - type: "object" - properties: - HostIp: - type: "string" - description: "The host IP address" - HostPort: - type: "string" - description: "The host port number, as a string" + $ref: "#/definitions/PortMap" RestartPolicy: $ref: "#/definitions/RestartPolicy" AutoRemove: @@ -664,7 +672,17 @@ definitions: type: "string" IpcMode: type: "string" - description: "IPC namespace to use for the container." + description: | + IPC sharing mode for the container. Possible values are: + + - `"none"`: own private IPC namespace, with /dev/shm not mounted + - `"private"`: own private IPC namespace + - `"shareable"`: own private IPC namespace, with a possibility to share it with other containers + - `"container:"`: join another (shareable) container's IPC namespace + - `"host"`: use the host system's IPC namespace + + If not specified, daemon default is used, which can either be `"private"` + or `"shareable"`, depending on daemon version and configuration. Cgroup: type: "string" description: "Cgroup to use for the container." @@ -676,6 +694,7 @@ definitions: OomScoreAdj: type: "integer" description: "An integer value containing the score given to the container in order to tune OOM killer preferences." + example: 500 PidMode: type: "string" description: | @@ -688,7 +707,15 @@ definitions: description: "Gives the container full access to the host." PublishAllPorts: type: "boolean" - description: "Allocates a random host port for all of a container's exposed ports." + description: | + Allocates an ephemeral host port for all of a container's + exposed ports. + + Ports are de-allocated when the container stops and allocated when the container starts. + The allocated port might be changed when restarting the container. + + The port is selected from the ephemeral port range that depends on the kernel. + For example, on Linux the range is defined by `/proc/sys/net/ipv4/ip_local_port_range`. ReadonlyRootfs: type: "boolean" description: "Mount the container's root filesystem as read only." @@ -745,6 +772,16 @@ definitions: - "default" - "process" - "hyperv" + MaskedPaths: + type: "array" + description: "The list of paths to be masked inside the container (this overrides the default set of paths)" + items: + type: "string" + ReadonlyPaths: + type: "array" + description: "The list of paths to be set as read-only inside the container (this overrides the default set of paths)" + items: + type: "string" ContainerConfig: description: "Configuration for a container that is portable between hosts" @@ -775,7 +812,7 @@ definitions: description: | An object mapping ports to an empty object in the form: - `{"/": {}}` + `{"/": {}}` type: "object" additionalProperties: type: "object" @@ -802,9 +839,7 @@ definitions: type: "string" Cmd: description: "Command to run specified as a string or an array of strings." - type: - - "array" - - "string" + type: "array" items: type: "string" Healthcheck: @@ -818,12 +853,11 @@ definitions: Volumes: description: "An object mapping mount point paths inside the container to empty objects." type: "object" - properties: - additionalProperties: - type: "object" - enum: - - {} - default: {} + additionalProperties: + type: "object" + enum: + - {} + default: {} WorkingDir: description: "The working directory for commands to run in." type: "string" @@ -832,9 +866,7 @@ definitions: The entry point for the container as a string or an array of strings. If the array consists of exactly one empty string (`[""]`) then the entry point is reset to system default (i.e., the entry point used by docker when there is no `ENTRYPOINT` instruction in the `Dockerfile`). - type: - - "array" - - "string" + type: "array" items: type: "string" NetworkDisabled: @@ -867,26 +899,223 @@ definitions: items: type: "string" - NetworkConfig: - description: "TODO: check is correct" + NetworkSettings: + description: "NetworkSettings exposes the network settings in the API" type: "object" properties: Bridge: + description: Name of the network'a bridge (for example, `docker0`). type: "string" - Gateway: + example: "docker0" + SandboxID: + description: SandboxID uniquely represents a container's network stack. type: "string" - Address: + example: "9d12daf2c33f5959c8bf90aa513e4f65b561738661003029ec84830cd503a0c3" + HairpinMode: + description: | + Indicates if hairpin NAT should be enabled on the virtual interface. + type: "boolean" + example: false + LinkLocalIPv6Address: + description: IPv6 unicast address using the link-local prefix. type: "string" - IPPrefixLen: + example: "fe80::42:acff:fe11:1" + LinkLocalIPv6PrefixLen: + description: Prefix length of the IPv6 unicast address. type: "integer" - MacAddress: - type: "string" - PortMapping: - type: "string" + example: "64" Ports: + $ref: "#/definitions/PortMap" + SandboxKey: + description: SandboxKey identifies the sandbox + type: "string" + example: "/var/run/docker/netns/8ab54b426c38" + + # TODO is SecondaryIPAddresses actually used? + SecondaryIPAddresses: + description: "" type: "array" items: - $ref: "#/definitions/Port" + $ref: "#/definitions/Address" + x-nullable: true + + # TODO is SecondaryIPv6Addresses actually used? + SecondaryIPv6Addresses: + description: "" + type: "array" + items: + $ref: "#/definitions/Address" + x-nullable: true + + # TODO properties below are part of DefaultNetworkSettings, which is + # marked as deprecated since Docker 1.9 and to be removed in Docker v17.12 + EndpointID: + description: | + EndpointID uniquely represents a service endpoint in a Sandbox. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "b88f5b905aabf2893f3cbc4ee42d1ea7980bbc0a92e2c8922b1e1795298afb0b" + Gateway: + description: | + Gateway address for the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "172.17.0.1" + GlobalIPv6Address: + description: | + Global IPv6 address for the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "2001:db8::5689" + GlobalIPv6PrefixLen: + description: | + Mask length of the global IPv6 address. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "integer" + example: 64 + IPAddress: + description: | + IPv4 address for the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "172.17.0.4" + IPPrefixLen: + description: | + Mask length of the IPv4 address. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "integer" + example: 16 + IPv6Gateway: + description: | + IPv6 gateway address for this network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "2001:db8:2::100" + MacAddress: + description: | + MAC address for the container on the default "bridge" network. + +


+ + > **Deprecated**: This field is only propagated when attached to the + > default "bridge" network. Use the information from the "bridge" + > network inside the `Networks` map instead, which contains the same + > information. This field was deprecated in Docker 1.9 and is scheduled + > to be removed in Docker 17.12.0 + type: "string" + example: "02:42:ac:11:00:04" + Networks: + description: | + Information about all networks that the container is connected to. + type: "object" + additionalProperties: + $ref: "#/definitions/EndpointSettings" + + Address: + description: Address represents an IPv4 or IPv6 IP address. + type: "object" + properties: + Addr: + description: IP address. + type: "string" + PrefixLen: + description: Mask length of the IP address. + type: "integer" + + PortMap: + description: | + PortMap describes the mapping of container ports to host ports, using the + container's port-number and protocol as key in the format `/`, + for example, `80/udp`. + + If a container's port is mapped for multiple protocols, separate entries + are added to the mapping table. + type: "object" + additionalProperties: + type: "array" + items: + $ref: "#/definitions/PortBinding" + example: + "443/tcp": + - HostIp: "127.0.0.1" + HostPort: "4443" + "80/tcp": + - HostIp: "0.0.0.0" + HostPort: "80" + - HostIp: "0.0.0.0" + HostPort: "8080" + "80/udp": + - HostIp: "0.0.0.0" + HostPort: "80" + "53/udp": + - HostIp: "0.0.0.0" + HostPort: "53" + "2377/tcp": null + + PortBinding: + description: | + PortBinding represents a binding between a host IP address and a host + port. + type: "object" + x-nullable: true + properties: + HostIp: + description: "Host IP address that the container's port is mapped to." + type: "string" + example: "127.0.0.1" + HostPort: + description: "Host port number that the container's port is mapped to." + type: "string" + example: "4443" GraphDriverData: description: "Information about a container's graph driver." @@ -1249,6 +1478,7 @@ definitions: type: "object" additionalProperties: type: "string" + NetworkContainer: type: "object" properties: @@ -1280,10 +1510,23 @@ definitions: type: "string" progressDetail: $ref: "#/definitions/ProgressDetail" + aux: + $ref: "#/definitions/ImageID" + + ImageID: + type: "object" + description: "Image ID or Digest" + properties: + ID: + type: "string" + example: + ID: "sha256:85f05633ddc1c50679be2b16a0479ab6f7637f8884e0cfe0f4d20e1ebb3d6e7c" CreateImageInfo: type: "object" properties: + id: + type: "string" error: type: "string" status: @@ -1304,6 +1547,7 @@ definitions: type: "string" progressDetail: $ref: "#/definitions/ProgressDetail" + ErrorDetail: type: "object" properties: @@ -1311,12 +1555,13 @@ definitions: type: "integer" message: type: "string" + ProgressDetail: type: "object" properties: - code: + current: type: "integer" - message: + total: type: "integer" ErrorResponse: @@ -1345,45 +1590,102 @@ definitions: description: "Configuration for a network endpoint." type: "object" properties: + # Configurations IPAMConfig: - description: "IPAM configurations for the endpoint" - type: "object" - properties: - IPv4Address: - type: "string" - IPv6Address: - type: "string" - LinkLocalIPs: - type: "array" - items: - type: "string" + $ref: "#/definitions/EndpointIPAMConfig" Links: type: "array" items: type: "string" + example: + - "container_1" + - "container_2" Aliases: type: "array" items: type: "string" + example: + - "server_x" + - "server_y" + + # Operational data NetworkID: + description: | + Unique ID of the network. type: "string" + example: "08754567f1f40222263eab4102e1c733ae697e8e354aa9cd6e18d7402835292a" EndpointID: + description: | + Unique ID for the service endpoint in a Sandbox. type: "string" + example: "b88f5b905aabf2893f3cbc4ee42d1ea7980bbc0a92e2c8922b1e1795298afb0b" Gateway: + description: | + Gateway address for this network. type: "string" + example: "172.17.0.1" IPAddress: + description: | + IPv4 address. type: "string" + example: "172.17.0.4" IPPrefixLen: + description: | + Mask length of the IPv4 address. type: "integer" + example: 16 IPv6Gateway: + description: | + IPv6 gateway address. type: "string" + example: "2001:db8:2::100" GlobalIPv6Address: + description: | + Global IPv6 address. type: "string" + example: "2001:db8::5689" GlobalIPv6PrefixLen: + description: | + Mask length of the global IPv6 address. type: "integer" format: "int64" + example: 64 MacAddress: + description: | + MAC address for the endpoint on this network. type: "string" + example: "02:42:ac:11:00:04" + DriverOpts: + description: | + DriverOpts is a mapping of driver options and values. These options + are passed directly to the driver and are driver specific. + type: "object" + x-nullable: true + additionalProperties: + type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" + + EndpointIPAMConfig: + description: | + EndpointIPAMConfig represents an endpoint's IPAM configuration. + type: "object" + x-nullable: true + properties: + IPv4Address: + type: "string" + example: "172.20.30.33" + IPv6Address: + type: "string" + example: "2001:db8:abcd::3033" + LinkLocalIPs: + type: "array" + items: + type: "string" + example: + - "169.254.34.68" + - "fe80::3468" PluginMount: type: "object" @@ -1420,6 +1722,7 @@ definitions: example: - "rbind" - "rw" + PluginDevice: type: "object" required: [Name, Description, Settable, Path] @@ -1566,6 +1869,13 @@ definitions: type: "string" x-nullable: false example: "plugins.sock" + ProtocolScheme: + type: "string" + example: "some.protocol/v1.0" + description: "Protocol to use for clients connecting to the plugin." + enum: + - "" + - "moby.plugins.http/v1" Entrypoint: type: "array" items: @@ -1691,7 +2001,8 @@ definitions: properties: Index: type: "integer" - format: "int64" + format: "uint64" + example: 373531 NodeSpec: type: "object" @@ -1699,6 +2010,7 @@ definitions: Name: description: "Name for the node." type: "string" + example: "my-node" Labels: description: "User-defined key/value metadata." type: "object" @@ -1710,6 +2022,7 @@ definitions: enum: - "worker" - "manager" + example: "manager" Availability: description: "Availability of the node." type: "string" @@ -1717,125 +2030,140 @@ definitions: - "active" - "pause" - "drain" + example: "active" example: Availability: "active" Name: "node-name" Role: "manager" Labels: foo: "bar" + Node: type: "object" properties: ID: type: "string" + example: "24ifsmvkjbyhk" Version: $ref: "#/definitions/ObjectVersion" CreatedAt: + description: | + Date and time at which the node was added to the swarm in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. type: "string" format: "dateTime" + example: "2016-08-18T10:44:24.496525531Z" UpdatedAt: + description: | + Date and time at which the node was last updated in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. type: "string" format: "dateTime" + example: "2017-08-09T07:09:37.632105588Z" Spec: $ref: "#/definitions/NodeSpec" Description: - type: "object" - properties: - Hostname: - type: "string" - Platform: - type: "object" - properties: - Architecture: - type: "string" - OS: - type: "string" - Resources: - $ref: "#/definitions/ResourceObject" - Engine: - type: "object" - properties: - EngineVersion: - type: "string" - Labels: - type: "object" - additionalProperties: - type: "string" - Plugins: - type: "array" - items: - type: "object" - properties: - Type: - type: "string" - Name: - type: "string" - TLSInfo: - $ref: "#/definitions/SwarmSpec" - example: - ID: "24ifsmvkjbyhk" - Version: - Index: 8 - CreatedAt: "2016-06-07T20:31:11.853781916Z" - UpdatedAt: "2016-06-07T20:31:11.999868824Z" - Spec: - Name: "my-node" - Role: "manager" - Availability: "active" - Labels: - foo: "bar" - Description: - Hostname: "bf3067039e47" - Platform: - Architecture: "x86_64" - OS: "linux" - Resources: - NanoCPUs: 4000000000 - MemoryBytes: 8272408576 - GenericResources: - - DiscreteResourceSpec: - Kind: "SSD" - Value: 3 - - NamedResourceSpec: - Kind: "GPU" - Value: "UUID1" - - NamedResourceSpec: - Kind: "GPU" - Value: "UUID2" - Engine: - EngineVersion: "17.04.0" - Labels: - foo: "bar" - Plugins: - - Type: "Volume" - Name: "local" - - Type: "Network" - Name: "bridge" - - Type: "Network" - Name: "null" - - Type: "Network" - Name: "overlay" + $ref: "#/definitions/NodeDescription" Status: - State: "ready" - Addr: "172.17.0.2" + $ref: "#/definitions/NodeStatus" ManagerStatus: - Leader: true - Reachability: "reachable" - Addr: "172.17.0.2:2377" + $ref: "#/definitions/ManagerStatus" + + NodeDescription: + description: | + NodeDescription encapsulates the properties of the Node as reported by the + agent. + type: "object" + properties: + Hostname: + type: "string" + example: "bf3067039e47" + Platform: + $ref: "#/definitions/Platform" + Resources: + $ref: "#/definitions/ResourceObject" + Engine: + $ref: "#/definitions/EngineDescription" TLSInfo: - TrustRoot: | - -----BEGIN CERTIFICATE----- - MIIBajCCARCgAwIBAgIUbYqrLSOSQHoxD8CwG6Bi2PJi9c8wCgYIKoZIzj0EAwIw - EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTcwNDI0MjE0MzAwWhcNMzcwNDE5MjE0 - MzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH - A0IABJk/VyMPYdaqDXJb/VXh5n/1Yuv7iNrxV3Qb3l06XD46seovcDWs3IZNV1lf - 3Skyr0ofcchipoiHkXBODojJydSjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB - Af8EBTADAQH/MB0GA1UdDgQWBBRUXxuRcnFjDfR/RIAUQab8ZV/n4jAKBggqhkjO - PQQDAgNIADBFAiAy+JTe6Uc3KyLCMiqGl2GyWGQqQDEcO3/YG36x7om65AIhAJvz - pxv6zFeVEkAEEkqIYi0omA9+CjanB/6Bz4n1uw8H - -----END CERTIFICATE----- - CertIssuerSubject: "MBMxETAPBgNVBAMTCHN3YXJtLWNh" - CertIssuerPublicKey: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmT9XIw9h1qoNclv9VeHmf/Vi6/uI2vFXdBveXTpcPjqx6i9wNazchk1XWV/dKTKvSh9xyGKmiIeRcE4OiMnJ1A==" + $ref: "#/definitions/TLSInfo" + + Platform: + description: | + Platform represents the platform (Arch/OS). + type: "object" + properties: + Architecture: + description: | + Architecture represents the hardware architecture (for example, + `x86_64`). + type: "string" + example: "x86_64" + OS: + description: | + OS represents the Operating System (for example, `linux` or `windows`). + type: "string" + example: "linux" + + EngineDescription: + description: "EngineDescription provides information about an engine." + type: "object" + properties: + EngineVersion: + type: "string" + example: "17.06.0" + Labels: + type: "object" + additionalProperties: + type: "string" + example: + foo: "bar" + Plugins: + type: "array" + items: + type: "object" + properties: + Type: + type: "string" + Name: + type: "string" + example: + - Type: "Log" + Name: "awslogs" + - Type: "Log" + Name: "fluentd" + - Type: "Log" + Name: "gcplogs" + - Type: "Log" + Name: "gelf" + - Type: "Log" + Name: "journald" + - Type: "Log" + Name: "json-file" + - Type: "Log" + Name: "logentries" + - Type: "Log" + Name: "splunk" + - Type: "Log" + Name: "syslog" + - Type: "Network" + Name: "bridge" + - Type: "Network" + Name: "host" + - Type: "Network" + Name: "ipvlan" + - Type: "Network" + Name: "macvlan" + - Type: "Network" + Name: "null" + - Type: "Network" + Name: "overlay" + - Type: "Volume" + Name: "local" + - Type: "Volume" + Name: "localhost:5000/vieux/sshfs:latest" + - Type: "Volume" + Name: "vieux/sshfs:latest" + TLSInfo: description: "Information about the issuer of leaf TLS certificates and the trusted root CA certificate" type: "object" @@ -1863,6 +2191,64 @@ definitions: -----END CERTIFICATE----- CertIssuerSubject: "MBMxETAPBgNVBAMTCHN3YXJtLWNh" CertIssuerPublicKey: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmT9XIw9h1qoNclv9VeHmf/Vi6/uI2vFXdBveXTpcPjqx6i9wNazchk1XWV/dKTKvSh9xyGKmiIeRcE4OiMnJ1A==" + + NodeStatus: + description: | + NodeStatus represents the status of a node. + + It provides the current status of the node, as seen by the manager. + type: "object" + properties: + State: + $ref: "#/definitions/NodeState" + Message: + type: "string" + example: "" + Addr: + description: "IP address of the node." + type: "string" + example: "172.17.0.2" + + NodeState: + description: "NodeState represents the state of a node." + type: "string" + enum: + - "unknown" + - "down" + - "ready" + - "disconnected" + example: "ready" + + ManagerStatus: + description: | + ManagerStatus represents the status of a manager. + + It provides the current status of a node's manager component, if the node + is a manager. + x-nullable: true + type: "object" + properties: + Leader: + type: "boolean" + default: false + example: true + Reachability: + $ref: "#/definitions/Reachability" + Addr: + description: | + The IP address and port at which the manager is reachable. + type: "string" + example: "10.0.0.46:2377" + + Reachability: + description: "Reachability represents the reachability of a node." + type: "string" + enum: + - "unknown" + - "unreachable" + - "reachable" + example: "reachable" + SwarmSpec: description: "User modifiable swarm configuration." type: "object" @@ -1870,19 +2256,25 @@ definitions: Name: description: "Name of the swarm." type: "string" + example: "default" Labels: description: "User-defined key/value metadata." type: "object" additionalProperties: type: "string" + example: + com.example.corp.type: "production" + com.example.corp.department: "engineering" Orchestration: description: "Orchestration configuration." type: "object" + x-nullable: true properties: TaskHistoryRetentionLimit: description: "The number of historic tasks to keep per instance or node. If negative, never remove completed or failed tasks." type: "integer" format: "int64" + example: 10 Raft: description: "Raft configuration." type: "object" @@ -1890,43 +2282,51 @@ definitions: SnapshotInterval: description: "The number of log entries between snapshots." type: "integer" - format: "int64" + format: "uint64" + example: 10000 KeepOldSnapshots: description: "The number of snapshots to keep beyond the current snapshot." type: "integer" - format: "int64" + format: "uint64" LogEntriesForSlowFollowers: description: "The number of log entries to keep around to sync up slow followers after a snapshot is created." type: "integer" - format: "int64" + format: "uint64" + example: 500 ElectionTick: description: | The number of ticks that a follower will wait for a message from the leader before becoming a candidate and starting an election. `ElectionTick` must be greater than `HeartbeatTick`. A tick currently defaults to one second, so these translate directly to seconds currently, but this is NOT guaranteed. type: "integer" + example: 3 HeartbeatTick: description: | The number of ticks between heartbeats. Every HeartbeatTick ticks, the leader will send a heartbeat to the followers. A tick currently defaults to one second, so these translate directly to seconds currently, but this is NOT guaranteed. type: "integer" + example: 1 Dispatcher: description: "Dispatcher configuration." type: "object" + x-nullable: true properties: HeartbeatPeriod: description: "The delay for an agent to send a heartbeat to the dispatcher." type: "integer" format: "int64" + example: 5000000000 CAConfig: description: "CA configuration." type: "object" + x-nullable: true properties: NodeCertExpiry: description: "The duration node certificates are issued for." type: "integer" format: "int64" + example: 7776000000000000 ExternalCAs: description: "Configuration for forwarding signing requests to an external certificate authority." type: "array" @@ -1958,6 +2358,8 @@ definitions: type: "string" ForceRotate: description: "An integer whose purpose is to force swarm to generate a new signing CA certificate and key, if none have been specified in `SigningCACert` and `SigningCAKey`" + format: "uint64" + type: "integer" EncryptionConfig: description: "Parameters related to encryption-at-rest." type: "object" @@ -1965,57 +2367,65 @@ definitions: AutoLockManagers: description: "If set, generate a key and use it to lock data stored on the managers." type: "boolean" + example: false TaskDefaults: description: "Defaults for creating tasks in this cluster." type: "object" properties: LogDriver: description: | - The log driver to use for tasks created in the orchestrator if unspecified by a service. + The log driver to use for tasks created in the orchestrator if + unspecified by a service. - Updating this value will only have an affect on new tasks. Old tasks will continue use their previously configured log driver until recreated. + Updating this value only affects new tasks. Existing tasks continue + to use their previously configured log driver until recreated. type: "object" properties: Name: + description: | + The log driver to use as a default for new tasks. type: "string" + example: "json-file" Options: + description: | + Driver-specific options for the selectd log driver, specified + as key/value pairs. type: "object" additionalProperties: type: "string" - example: - Name: "default" - Orchestration: - TaskHistoryRetentionLimit: 10 - Raft: - SnapshotInterval: 10000 - LogEntriesForSlowFollowers: 500 - HeartbeatTick: 1 - ElectionTick: 3 - Dispatcher: - HeartbeatPeriod: 5000000000 - CAConfig: - NodeCertExpiry: 7776000000000000 - JoinTokens: - Worker: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx" - Manager: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" - EncryptionConfig: - AutoLockManagers: false + example: + "max-file": "10" + "max-size": "100m" + # The Swarm information for `GET /info`. It is the same as `GET /swarm`, but # without `JoinTokens`. ClusterInfo: + description: | + ClusterInfo represents information about the swarm as is returned by the + "/info" endpoint. Join-tokens are not included. + x-nullable: true type: "object" properties: ID: description: "The ID of the swarm." type: "string" + example: "abajmipo7b4xz5ip2nrla6b11" Version: $ref: "#/definitions/ObjectVersion" CreatedAt: + description: | + Date and time at which the swarm was initialised in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. type: "string" format: "dateTime" + example: "2016-08-18T10:44:24.496525531Z" UpdatedAt: + description: | + Date and time at which the swarm was last updated in + [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format with nano-seconds. type: "string" format: "dateTime" + example: "2017-08-09T07:09:37.632105588Z" Spec: $ref: "#/definitions/SwarmSpec" TLSInfo: @@ -2023,13 +2433,48 @@ definitions: RootRotationInProgress: description: "Whether there is currently a root CA rotation in progress for the swarm" type: "boolean" + example: false + + JoinTokens: + description: | + JoinTokens contains the tokens workers and managers need to join the swarm. + type: "object" + properties: + Worker: + description: | + The token workers can use to join the swarm. + type: "string" + example: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx" + Manager: + description: | + The token managers can use to join the swarm. + type: "string" + example: "SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2" + + Swarm: + type: "object" + allOf: + - $ref: "#/definitions/ClusterInfo" + - type: "object" + properties: + JoinTokens: + $ref: "#/definitions/JoinTokens" + TaskSpec: description: "User modifiable task configuration." type: "object" properties: PluginSpec: type: "object" - description: "Invalid when specified with `ContainerSpec`." + description: | + Plugin spec for the service. *(Experimental release only.)* + +


+ + > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are + > mutually exclusive. PluginSpec is only used when the Runtime field + > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime + > field is set to `attachment`. properties: Name: description: "The name or 'alias' to use for the plugin." @@ -2056,7 +2501,15 @@ definitions: type: "string" ContainerSpec: type: "object" - description: "Invalid when specified with `PluginSpec`." + description: | + Container spec for the service. + +


+ + > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are + > mutually exclusive. PluginSpec is only used when the Runtime field + > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime + > field is set to `attachment`. properties: Image: description: "The image name to use for the container" @@ -2172,10 +2625,12 @@ definitions: Hosts: type: "array" description: | - A list of hostnames/IP mappings to add to the container's `/etc/hosts` file. - The format of extra hosts on swarmkit is specified in: - http://man7.org/linux/man-pages/man5/hosts.5.html - IP_address canonical_hostname [aliases...] + A list of hostname/IP mappings to add to the container's `hosts` + file. The format of extra hosts is specified in the + [hosts(5)](http://man7.org/linux/man-pages/man5/hosts.5.html) + man page: + + IP_address canonical_hostname [aliases...] items: type: "string" DNSConfig: @@ -2259,7 +2714,33 @@ definitions: ConfigName is the name of the config that this references, but this is just provided for lookup/display purposes. The config in the reference will be identified by its ID. type: "string" + Isolation: + type: "string" + description: "Isolation technology of the containers running the service. (Windows only)" + enum: + - "default" + - "process" + - "hyperv" + Init: + description: "Run an init inside the container that forwards signals and reaps processes. This field is omitted if empty, and the default (as configured on the daemon) is used." + type: "boolean" + x-nullable: true + NetworkAttachmentSpec: + description: | + Read-only spec type for non-swarm containers attached to swarm overlay + networks. +


+ + > **Note**: ContainerSpec, NetworkAttachmentSpec, and PluginSpec are + > mutually exclusive. PluginSpec is only used when the Runtime field + > is set to `plugin`. NetworkAttachmentSpec is used when the Runtime + > field is set to `attachment`. + type: "object" + properties: + ContainerID: + description: "ID of the container represented by this task" + type: "string" Resources: description: "Resource requirements which apply to each individual container created as part of the service." type: "object" @@ -2303,6 +2784,10 @@ definitions: type: "array" items: type: "string" + example: + - "node.hostname!=node3.corp.example.com" + - "node.role!=manager" + - "node.labels.type==production" Preferences: description: "Preferences provide a way to make the scheduler aware of factors such as topology. They are provided in order from highest to lowest precedence." type: "array" @@ -2315,16 +2800,20 @@ definitions: SpreadDescriptor: description: "label descriptor, such as engine.labels.az" type: "string" + example: + - Spread: + SpreadDescriptor: "node.labels.datacenter" + - Spread: + SpreadDescriptor: "node.labels.rack" Platforms: - description: "An array of supported platforms." + description: | + Platforms stores all the platforms that the service's image can + run on. This field is used in the platform filter for scheduling. + If empty, then the platform filter is off, meaning there are no + scheduling restrictions. type: "array" items: - type: "object" - properties: - Architecture: - type: "string" - OS: - type: "string" + $ref: "#/definitions/Platform" ForceUpdate: description: "A counter that triggers an update even if no relevant parameters have been changed." type: "integer" @@ -2352,6 +2841,7 @@ definitions: type: "object" additionalProperties: type: "string" + TaskState: type: "string" enum: @@ -2368,6 +2858,9 @@ definitions: - "shutdown" - "failed" - "rejected" + - "remove" + - "orphaned" + Task: type: "object" properties: @@ -2491,6 +2984,7 @@ definitions: - NamedResourceSpec: Kind: "GPU" Value: "UUID2" + ServiceSpec: description: "User modifiable configuration for a service." properties: @@ -2595,6 +3089,7 @@ definitions: type: "string" EndpointSpec: $ref: "#/definitions/EndpointSpec" + EndpointPortConfig: type: "object" properties: @@ -2605,12 +3100,32 @@ definitions: enum: - "tcp" - "udp" + - "sctp" TargetPort: description: "The port inside the container." type: "integer" PublishedPort: description: "The port on the swarm hosts." type: "integer" + PublishMode: + description: | + The mode in which port is published. + +


+ + - "ingress" makes the target port accessible on on every node, + regardless of whether there is a task for the service running on + that node or not. + - "host" bypasses the routing mesh and publish the port directly on + the swarm node where that service is running. + + type: "string" + enum: + - "ingress" + - "host" + default: "ingress" + example: "ingress" + EndpointSpec: description: "Properties that can be configured to access and load balance a service." type: "object" @@ -2628,6 +3143,7 @@ definitions: type: "array" items: $ref: "#/definitions/EndpointPortConfig" + Service: type: "object" properties: @@ -2740,6 +3256,7 @@ definitions: - NetworkID: "4qvuz4ko70xaltuqbt8956gd1" Addr: "10.255.0.3/16" + ImageDeleteResponseItem: type: "object" properties: @@ -2749,6 +3266,7 @@ definitions: Deleted: description: "The image ID of an image that was deleted" type: "string" + ServiceUpdateResponse: type: "object" properties: @@ -2759,6 +3277,7 @@ definitions: type: "string" example: Warning: "unable to pin image doesnotexist:latest to digest: image library/doesnotexist:latest not found" + ContainerSummary: type: "array" items: @@ -2827,6 +3346,27 @@ definitions: type: "array" items: $ref: "#/definitions/Mount" + + Driver: + description: "Driver represents a driver (network, logging, secrets)." + type: "object" + required: [Name] + properties: + Name: + description: "Name of the driver." + type: "string" + x-nullable: false + example: "some-driver" + Options: + description: "Key/value map of driver-specific options." + type: "object" + x-nullable: false + additionalProperties: + type: "string" + example: + OptionA: "value for driver-specific option A" + OptionB: "value for driver-specific option B" + SecretSpec: type: "object" properties: @@ -2838,26 +3378,48 @@ definitions: type: "object" additionalProperties: type: "string" + example: + com.example.some-label: "some-value" + com.example.some-other-label: "some-other-value" Data: - description: "Base64-url-safe-encoded secret data" - type: "array" - items: - type: "string" + description: | + Base64-url-safe-encoded ([RFC 4648](https://tools.ietf.org/html/rfc4648#section-3.2)) + data to store as secret. + + This field is only used to _create_ a secret, and is not returned by + other endpoints. + type: "string" + example: "" + Driver: + description: "Name of the secrets driver used to fetch the secret's value from an external secret store" + $ref: "#/definitions/Driver" + Templating: + description: | + Templating driver, if applicable + + Templating controls whether and how to evaluate the config payload as + a template. If no driver is set, no templating is used. + $ref: "#/definitions/Driver" + Secret: type: "object" properties: ID: type: "string" + example: "blt1owaxmitz71s9v5zh81zun" Version: $ref: "#/definitions/ObjectVersion" CreatedAt: type: "string" format: "dateTime" + example: "2017-07-20T13:55:28.678958722Z" UpdatedAt: type: "string" format: "dateTime" + example: "2017-07-20T13:55:28.678958722Z" Spec: $ref: "#/definitions/SecretSpec" + ConfigSpec: type: "object" properties: @@ -2870,10 +3432,18 @@ definitions: additionalProperties: type: "string" Data: - description: "Base64-url-safe-encoded config data" - type: "array" - items: - type: "string" + description: | + Base64-url-safe-encoded ([RFC 4648](https://tools.ietf.org/html/rfc4648#section-3.2)) + config data. + type: "string" + Templating: + description: | + Templating driver, if applicable + + Templating controls whether and how to evaluate the config payload as + a template. If no driver is set, no templating is used. + $ref: "#/definitions/Driver" + Config: type: "object" properties: @@ -2890,6 +3460,774 @@ definitions: Spec: $ref: "#/definitions/ConfigSpec" + SystemInfo: + type: "object" + properties: + ID: + description: | + Unique identifier of the daemon. + +


+ + > **Note**: The format of the ID itself is not part of the API, and + > should not be considered stable. + type: "string" + example: "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS" + Containers: + description: "Total number of containers on the host." + type: "integer" + example: 14 + ContainersRunning: + description: | + Number of containers with status `"running"`. + type: "integer" + example: 3 + ContainersPaused: + description: | + Number of containers with status `"paused"`. + type: "integer" + example: 1 + ContainersStopped: + description: | + Number of containers with status `"stopped"`. + type: "integer" + example: 10 + Images: + description: | + Total number of images on the host. + + Both _tagged_ and _untagged_ (dangling) images are counted. + type: "integer" + example: 508 + Driver: + description: "Name of the storage driver in use." + type: "string" + example: "overlay2" + DriverStatus: + description: | + Information specific to the storage driver, provided as + "label" / "value" pairs. + + This information is provided by the storage driver, and formatted + in a way consistent with the output of `docker info` on the command + line. + +


+ + > **Note**: The information returned in this field, including the + > formatting of values and labels, should not be considered stable, + > and may change without notice. + type: "array" + items: + type: "array" + items: + type: "string" + example: + - ["Backing Filesystem", "extfs"] + - ["Supports d_type", "true"] + - ["Native Overlay Diff", "true"] + DockerRootDir: + description: | + Root directory of persistent Docker state. + + Defaults to `/var/lib/docker` on Linux, and `C:\ProgramData\docker` + on Windows. + type: "string" + example: "/var/lib/docker" + SystemStatus: + description: | + Status information about this node (standalone Swarm API). + +


+ + > **Note**: The information returned in this field is only propagated + > by the Swarm standalone API, and is empty (`null`) when using + > built-in swarm mode. + type: "array" + items: + type: "array" + items: + type: "string" + example: + - ["Role", "primary"] + - ["State", "Healthy"] + - ["Strategy", "spread"] + - ["Filters", "health, port, containerslots, dependency, affinity, constraint, whitelist"] + - ["Nodes", "2"] + - [" swarm-agent-00", "192.168.99.102:2376"] + - [" └ ID", "5CT6:FBGO:RVGO:CZL4:PB2K:WCYN:2JSV:KSHH:GGFW:QOPG:6J5Q:IOZ2|192.168.99.102:2376"] + - [" └ Status", "Healthy"] + - [" └ Containers", "1 (1 Running, 0 Paused, 0 Stopped)"] + - [" └ Reserved CPUs", "0 / 1"] + - [" └ Reserved Memory", "0 B / 1.021 GiB"] + - [" └ Labels", "kernelversion=4.4.74-boot2docker, operatingsystem=Boot2Docker 17.06.0-ce (TCL 7.2); HEAD : 0672754 - Thu Jun 29 00:06:31 UTC 2017, ostype=linux, provider=virtualbox, storagedriver=aufs"] + - [" └ UpdatedAt", "2017-08-09T10:03:46Z"] + - [" └ ServerVersion", "17.06.0-ce"] + - [" swarm-manager", "192.168.99.101:2376"] + - [" └ ID", "TAMD:7LL3:SEF7:LW2W:4Q2X:WVFH:RTXX:JSYS:XY2P:JEHL:ZMJK:JGIW|192.168.99.101:2376"] + - [" └ Status", "Healthy"] + - [" └ Containers", "2 (2 Running, 0 Paused, 0 Stopped)"] + - [" └ Reserved CPUs", "0 / 1"] + - [" └ Reserved Memory", "0 B / 1.021 GiB"] + - [" └ Labels", "kernelversion=4.4.74-boot2docker, operatingsystem=Boot2Docker 17.06.0-ce (TCL 7.2); HEAD : 0672754 - Thu Jun 29 00:06:31 UTC 2017, ostype=linux, provider=virtualbox, storagedriver=aufs"] + - [" └ UpdatedAt", "2017-08-09T10:04:11Z"] + - [" └ ServerVersion", "17.06.0-ce"] + Plugins: + $ref: "#/definitions/PluginsInfo" + MemoryLimit: + description: "Indicates if the host has memory limit support enabled." + type: "boolean" + example: true + SwapLimit: + description: "Indicates if the host has memory swap limit support enabled." + type: "boolean" + example: true + KernelMemory: + description: "Indicates if the host has kernel memory limit support enabled." + type: "boolean" + example: true + CpuCfsPeriod: + description: "Indicates if CPU CFS(Completely Fair Scheduler) period is supported by the host." + type: "boolean" + example: true + CpuCfsQuota: + description: "Indicates if CPU CFS(Completely Fair Scheduler) quota is supported by the host." + type: "boolean" + example: true + CPUShares: + description: "Indicates if CPU Shares limiting is supported by the host." + type: "boolean" + example: true + CPUSet: + description: | + Indicates if CPUsets (cpuset.cpus, cpuset.mems) are supported by the host. + + See [cpuset(7)](https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt) + type: "boolean" + example: true + OomKillDisable: + description: "Indicates if OOM killer disable is supported on the host." + type: "boolean" + IPv4Forwarding: + description: "Indicates IPv4 forwarding is enabled." + type: "boolean" + example: true + BridgeNfIptables: + description: "Indicates if `bridge-nf-call-iptables` is available on the host." + type: "boolean" + example: true + BridgeNfIp6tables: + description: "Indicates if `bridge-nf-call-ip6tables` is available on the host." + type: "boolean" + example: true + Debug: + description: "Indicates if the daemon is running in debug-mode / with debug-level logging enabled." + type: "boolean" + example: true + NFd: + description: | + The total number of file Descriptors in use by the daemon process. + + This information is only returned if debug-mode is enabled. + type: "integer" + example: 64 + NGoroutines: + description: | + The number of goroutines that currently exist. + + This information is only returned if debug-mode is enabled. + type: "integer" + example: 174 + SystemTime: + description: | + Current system-time in [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) + format with nano-seconds. + type: "string" + example: "2017-08-08T20:28:29.06202363Z" + LoggingDriver: + description: | + The logging driver to use as a default for new containers. + type: "string" + CgroupDriver: + description: | + The driver to use for managing cgroups. + type: "string" + enum: ["cgroupfs", "systemd"] + default: "cgroupfs" + example: "cgroupfs" + NEventsListener: + description: "Number of event listeners subscribed." + type: "integer" + example: 30 + KernelVersion: + description: | + Kernel version of the host. + + On Linux, this information obtained from `uname`. On Windows this + information is queried from the HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ + registry value, for example _"10.0 14393 (14393.1198.amd64fre.rs1_release_sec.170427-1353)"_. + type: "string" + example: "4.9.38-moby" + OperatingSystem: + description: | + Name of the host's operating system, for example: "Ubuntu 16.04.2 LTS" + or "Windows Server 2016 Datacenter" + type: "string" + example: "Alpine Linux v3.5" + OSType: + description: | + Generic type of the operating system of the host, as returned by the + Go runtime (`GOOS`). + + Currently returned values are "linux" and "windows". A full list of + possible values can be found in the [Go documentation](https://golang.org/doc/install/source#environment). + type: "string" + example: "linux" + Architecture: + description: | + Hardware architecture of the host, as returned by the Go runtime + (`GOARCH`). + + A full list of possible values can be found in the [Go documentation](https://golang.org/doc/install/source#environment). + type: "string" + example: "x86_64" + NCPU: + description: | + The number of logical CPUs usable by the daemon. + + The number of available CPUs is checked by querying the operating + system when the daemon starts. Changes to operating system CPU + allocation after the daemon is started are not reflected. + type: "integer" + example: 4 + MemTotal: + description: | + Total amount of physical memory available on the host, in kilobytes (kB). + type: "integer" + format: "int64" + example: 2095882240 + + IndexServerAddress: + description: | + Address / URL of the index server that is used for image search, + and as a default for user authentication for Docker Hub and Docker Cloud. + default: "https://index.docker.io/v1/" + type: "string" + example: "https://index.docker.io/v1/" + RegistryConfig: + $ref: "#/definitions/RegistryServiceConfig" + GenericResources: + $ref: "#/definitions/GenericResources" + HttpProxy: + description: | + HTTP-proxy configured for the daemon. This value is obtained from the + [`HTTP_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) environment variable. + + Containers do not automatically inherit this configuration. + type: "string" + example: "http://user:pass@proxy.corp.example.com:8080" + HttpsProxy: + description: | + HTTPS-proxy configured for the daemon. This value is obtained from the + [`HTTPS_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) environment variable. + + Containers do not automatically inherit this configuration. + type: "string" + example: "https://user:pass@proxy.corp.example.com:4443" + NoProxy: + description: | + Comma-separated list of domain extensions for which no proxy should be + used. This value is obtained from the [`NO_PROXY`](https://www.gnu.org/software/wget/manual/html_node/Proxies.html) + environment variable. + + Containers do not automatically inherit this configuration. + type: "string" + example: "*.local, 169.254/16" + Name: + description: "Hostname of the host." + type: "string" + example: "node5.corp.example.com" + Labels: + description: | + User-defined labels (key/value metadata) as set on the daemon. + +


+ + > **Note**: When part of a Swarm, nodes can both have _daemon_ labels, + > set through the daemon configuration, and _node_ labels, set from a + > manager node in the Swarm. Node labels are not included in this + > field. Node labels can be retrieved using the `/nodes/(id)` endpoint + > on a manager node in the Swarm. + type: "array" + items: + type: "string" + example: ["storage=ssd", "production"] + ExperimentalBuild: + description: | + Indicates if experimental features are enabled on the daemon. + type: "boolean" + example: true + ServerVersion: + description: | + Version string of the daemon. + + > **Note**: the [standalone Swarm API](https://docs.docker.com/swarm/swarm-api/) + > returns the Swarm version instead of the daemon version, for example + > `swarm/1.2.8`. + type: "string" + example: "17.06.0-ce" + ClusterStore: + description: | + URL of the distributed storage backend. + + + The storage backend is used for multihost networking (to store + network and endpoint information) and by the node discovery mechanism. + +


+ + > **Note**: This field is only propagated when using standalone Swarm + > mode, and overlay networking using an external k/v store. Overlay + > networks with Swarm mode enabled use the built-in raft store, and + > this field will be empty. + type: "string" + example: "consul://consul.corp.example.com:8600/some/path" + ClusterAdvertise: + description: | + The network endpoint that the Engine advertises for the purpose of + node discovery. ClusterAdvertise is a `host:port` combination on which + the daemon is reachable by other hosts. + +


+ + > **Note**: This field is only propagated when using standalone Swarm + > mode, and overlay networking using an external k/v store. Overlay + > networks with Swarm mode enabled use the built-in raft store, and + > this field will be empty. + type: "string" + example: "node5.corp.example.com:8000" + Runtimes: + description: | + List of [OCI compliant](https://github.com/opencontainers/runtime-spec) + runtimes configured on the daemon. Keys hold the "name" used to + reference the runtime. + + The Docker daemon relies on an OCI compliant runtime (invoked via the + `containerd` daemon) as its interface to the Linux kernel namespaces, + cgroups, and SELinux. + + The default runtime is `runc`, and automatically configured. Additional + runtimes can be configured by the user and will be listed here. + type: "object" + additionalProperties: + $ref: "#/definitions/Runtime" + default: + runc: + path: "docker-runc" + example: + runc: + path: "docker-runc" + runc-master: + path: "/go/bin/runc" + custom: + path: "/usr/local/bin/my-oci-runtime" + runtimeArgs: ["--debug", "--systemd-cgroup=false"] + DefaultRuntime: + description: | + Name of the default OCI runtime that is used when starting containers. + + The default can be overridden per-container at create time. + type: "string" + default: "runc" + example: "runc" + Swarm: + $ref: "#/definitions/SwarmInfo" + LiveRestoreEnabled: + description: | + Indicates if live restore is enabled. + + If enabled, containers are kept running when the daemon is shutdown + or upon daemon start if running containers are detected. + type: "boolean" + default: false + example: false + Isolation: + description: | + Represents the isolation technology to use as a default for containers. + The supported values are platform-specific. + + If no isolation value is specified on daemon start, on Windows client, + the default is `hyperv`, and on Windows server, the default is `process`. + + This option is currently not used on other platforms. + default: "default" + type: "string" + enum: + - "default" + - "hyperv" + - "process" + InitBinary: + description: | + Name and, optional, path of the `docker-init` binary. + + If the path is omitted, the daemon searches the host's `$PATH` for the + binary and uses the first result. + type: "string" + example: "docker-init" + ContainerdCommit: + $ref: "#/definitions/Commit" + RuncCommit: + $ref: "#/definitions/Commit" + InitCommit: + $ref: "#/definitions/Commit" + SecurityOptions: + description: | + List of security features that are enabled on the daemon, such as + apparmor, seccomp, SELinux, and user-namespaces (userns). + + Additional configuration options for each security feature may + be present, and are included as a comma-separated list of key/value + pairs. + type: "array" + items: + type: "string" + example: + - "name=apparmor" + - "name=seccomp,profile=default" + - "name=selinux" + - "name=userns" + + + # PluginsInfo is a temp struct holding Plugins name + # registered with docker daemon. It is used by Info struct + PluginsInfo: + description: | + Available plugins per type. + +


+ + > **Note**: Only unmanaged (V1) plugins are included in this list. + > V1 plugins are "lazily" loaded, and are not returned in this list + > if there is no resource using the plugin. + type: "object" + properties: + Volume: + description: "Names of available volume-drivers, and network-driver plugins." + type: "array" + items: + type: "string" + example: ["local"] + Network: + description: "Names of available network-drivers, and network-driver plugins." + type: "array" + items: + type: "string" + example: ["bridge", "host", "ipvlan", "macvlan", "null", "overlay"] + Authorization: + description: "Names of available authorization plugins." + type: "array" + items: + type: "string" + example: ["img-authz-plugin", "hbm"] + Log: + description: "Names of available logging-drivers, and logging-driver plugins." + type: "array" + items: + type: "string" + example: ["awslogs", "fluentd", "gcplogs", "gelf", "journald", "json-file", "logentries", "splunk", "syslog"] + + + RegistryServiceConfig: + description: | + RegistryServiceConfig stores daemon registry services configuration. + type: "object" + x-nullable: true + properties: + AllowNondistributableArtifactsCIDRs: + description: | + List of IP ranges to which nondistributable artifacts can be pushed, + using the CIDR syntax [RFC 4632](https://tools.ietf.org/html/4632). + + Some images (for example, Windows base images) contain artifacts + whose distribution is restricted by license. When these images are + pushed to a registry, restricted artifacts are not included. + + This configuration override this behavior, and enables the daemon to + push nondistributable artifacts to all registries whose resolved IP + address is within the subnet described by the CIDR syntax. + + This option is useful when pushing images containing + nondistributable artifacts to a registry on an air-gapped network so + hosts on that network can pull the images without connecting to + another server. + + > **Warning**: Nondistributable artifacts typically have restrictions + > on how and where they can be distributed and shared. Only use this + > feature to push artifacts to private registries and ensure that you + > are in compliance with any terms that cover redistributing + > nondistributable artifacts. + + type: "array" + items: + type: "string" + example: ["::1/128", "127.0.0.0/8"] + AllowNondistributableArtifactsHostnames: + description: | + List of registry hostnames to which nondistributable artifacts can be + pushed, using the format `[:]` or `[:]`. + + Some images (for example, Windows base images) contain artifacts + whose distribution is restricted by license. When these images are + pushed to a registry, restricted artifacts are not included. + + This configuration override this behavior for the specified + registries. + + This option is useful when pushing images containing + nondistributable artifacts to a registry on an air-gapped network so + hosts on that network can pull the images without connecting to + another server. + + > **Warning**: Nondistributable artifacts typically have restrictions + > on how and where they can be distributed and shared. Only use this + > feature to push artifacts to private registries and ensure that you + > are in compliance with any terms that cover redistributing + > nondistributable artifacts. + type: "array" + items: + type: "string" + example: ["registry.internal.corp.example.com:3000", "[2001:db8:a0b:12f0::1]:443"] + InsecureRegistryCIDRs: + description: | + List of IP ranges of insecure registries, using the CIDR syntax + ([RFC 4632](https://tools.ietf.org/html/4632)). Insecure registries + accept un-encrypted (HTTP) and/or untrusted (HTTPS with certificates + from unknown CAs) communication. + + By default, local registries (`127.0.0.0/8`) are configured as + insecure. All other registries are secure. Communicating with an + insecure registry is not possible if the daemon assumes that registry + is secure. + + This configuration override this behavior, insecure communication with + registries whose resolved IP address is within the subnet described by + the CIDR syntax. + + Registries can also be marked insecure by hostname. Those registries + are listed under `IndexConfigs` and have their `Secure` field set to + `false`. + + > **Warning**: Using this option can be useful when running a local + > registry, but introduces security vulnerabilities. This option + > should therefore ONLY be used for testing purposes. For increased + > security, users should add their CA to their system's list of trusted + > CAs instead of enabling this option. + type: "array" + items: + type: "string" + example: ["::1/128", "127.0.0.0/8"] + IndexConfigs: + type: "object" + additionalProperties: + $ref: "#/definitions/IndexInfo" + example: + "127.0.0.1:5000": + "Name": "127.0.0.1:5000" + "Mirrors": [] + "Secure": false + "Official": false + "[2001:db8:a0b:12f0::1]:80": + "Name": "[2001:db8:a0b:12f0::1]:80" + "Mirrors": [] + "Secure": false + "Official": false + "docker.io": + Name: "docker.io" + Mirrors: ["https://hub-mirror.corp.example.com:5000/"] + Secure: true + Official: true + "registry.internal.corp.example.com:3000": + Name: "registry.internal.corp.example.com:3000" + Mirrors: [] + Secure: false + Official: false + Mirrors: + description: | + List of registry URLs that act as a mirror for the official + (`docker.io`) registry. + + type: "array" + items: + type: "string" + example: + - "https://hub-mirror.corp.example.com:5000/" + - "https://[2001:db8:a0b:12f0::1]/" + + IndexInfo: + description: + IndexInfo contains information about a registry. + type: "object" + x-nullable: true + properties: + Name: + description: | + Name of the registry, such as "docker.io". + type: "string" + example: "docker.io" + Mirrors: + description: | + List of mirrors, expressed as URIs. + type: "array" + items: + type: "string" + example: + - "https://hub-mirror.corp.example.com:5000/" + - "https://registry-2.docker.io/" + - "https://registry-3.docker.io/" + Secure: + description: | + Indicates if the registry is part of the list of insecure + registries. + + If `false`, the registry is insecure. Insecure registries accept + un-encrypted (HTTP) and/or untrusted (HTTPS with certificates from + unknown CAs) communication. + + > **Warning**: Insecure registries can be useful when running a local + > registry. However, because its use creates security vulnerabilities + > it should ONLY be enabled for testing purposes. For increased + > security, users should add their CA to their system's list of + > trusted CAs instead of enabling this option. + type: "boolean" + example: true + Official: + description: | + Indicates whether this is an official registry (i.e., Docker Hub / docker.io) + type: "boolean" + example: true + + Runtime: + description: | + Runtime describes an [OCI compliant](https://github.com/opencontainers/runtime-spec) + runtime. + + The runtime is invoked by the daemon via the `containerd` daemon. OCI + runtimes act as an interface to the Linux kernel namespaces, cgroups, + and SELinux. + type: "object" + properties: + path: + description: | + Name and, optional, path, of the OCI executable binary. + + If the path is omitted, the daemon searches the host's `$PATH` for the + binary and uses the first result. + type: "string" + example: "/usr/local/bin/my-oci-runtime" + runtimeArgs: + description: | + List of command-line arguments to pass to the runtime when invoked. + type: "array" + x-nullable: true + items: + type: "string" + example: ["--debug", "--systemd-cgroup=false"] + + Commit: + description: | + Commit holds the Git-commit (SHA1) that a binary was built from, as + reported in the version-string of external tools, such as `containerd`, + or `runC`. + type: "object" + properties: + ID: + description: "Actual commit ID of external tool." + type: "string" + example: "cfb82a876ecc11b5ca0977d1733adbe58599088a" + Expected: + description: | + Commit ID of external tool expected by dockerd as set at build time. + type: "string" + example: "2d41c047c83e09a6d61d464906feb2a2f3c52aa4" + + SwarmInfo: + description: | + Represents generic information about swarm. + type: "object" + properties: + NodeID: + description: "Unique identifier of for this node in the swarm." + type: "string" + default: "" + example: "k67qz4598weg5unwwffg6z1m1" + NodeAddr: + description: | + IP address at which this node can be reached by other nodes in the + swarm. + type: "string" + default: "" + example: "10.0.0.46" + LocalNodeState: + $ref: "#/definitions/LocalNodeState" + ControlAvailable: + type: "boolean" + default: false + example: true + Error: + type: "string" + default: "" + RemoteManagers: + description: | + List of ID's and addresses of other managers in the swarm. + type: "array" + default: null + x-nullable: true + items: + $ref: "#/definitions/PeerNode" + example: + - NodeID: "71izy0goik036k48jg985xnds" + Addr: "10.0.0.158:2377" + - NodeID: "79y6h1o4gv8n120drcprv5nmc" + Addr: "10.0.0.159:2377" + - NodeID: "k67qz4598weg5unwwffg6z1m1" + Addr: "10.0.0.46:2377" + Nodes: + description: "Total number of nodes in the swarm." + type: "integer" + x-nullable: true + example: 4 + Managers: + description: "Total number of managers in the swarm." + type: "integer" + x-nullable: true + example: 3 + Cluster: + $ref: "#/definitions/ClusterInfo" + + LocalNodeState: + description: "Current local status of this node." + type: "string" + default: "" + enum: + - "" + - "inactive" + - "pending" + - "active" + - "error" + - "locked" + example: "active" + + PeerNode: + description: "Represents a peer-node in the swarm" + properties: + NodeID: + description: "Unique identifier of for this node in the swarm." + type: "string" + Addr: + description: | + IP address and ports at which this node can be reached. + type: "string" + paths: /containers/json: get: @@ -3238,6 +4576,8 @@ paths: description: "Container created successfully" schema: type: "object" + title: "ContainerCreateResponse" + description: "OK response to ContainerCreate operation" required: [Id, Warnings] properties: Id: @@ -3265,10 +4605,6 @@ paths: examples: application/json: message: "No such container: c2ada9df5af8" - 406: - description: "impossible to attach" - schema: - $ref: "#/definitions/ErrorResponse" 409: description: "conflict" schema: @@ -3290,6 +4626,7 @@ paths: description: "no error" schema: type: "object" + title: "ContainerInspectResponse" properties: Id: description: "The ID of the container" @@ -3379,7 +4716,11 @@ paths: AppArmorProfile: type: "string" ExecIDs: - type: "string" + description: "IDs of exec instances that are running in the container." + type: "array" + items: + type: "string" + x-nullable: true HostConfig: $ref: "#/definitions/HostConfig" GraphDriver: @@ -3399,7 +4740,7 @@ paths: Config: $ref: "#/definitions/ContainerConfig" NetworkSettings: - $ref: "#/definitions/NetworkConfig" + $ref: "#/definitions/NetworkSettings" examples: application/json: AppArmorProfile: "" @@ -3436,6 +4777,9 @@ paths: StopTimeout: 10 Created: "2015-01-06T15:47:31.485331387Z" Driver: "devicemapper" + ExecIDs: + - "b35395de42bc8abd327f9dd65d913b9ba28c74d2f0734eeeae84fa1c616a0fca" + - "3fc1232e5cd20c8de182ed81178503dc6437f4e7ef12b52cc5e8de020652f1c4" HostConfig: MaximumIOps: 0 MaximumIOBps: 0 @@ -3498,8 +4842,6 @@ paths: LinkLocalIPv6Address: "" LinkLocalIPv6PrefixLen: 0 SandboxKey: "" - SecondaryIPAddresses: null - SecondaryIPv6Addresses: null EndpointID: "" Gateway: "" GlobalIPv6Address: "" @@ -3576,6 +4918,8 @@ paths: description: "no error" schema: type: "object" + title: "ContainerTopResponse" + description: "OK response to ContainerTop operation" properties: Titles: description: "The ps column titles" @@ -3700,6 +5044,11 @@ paths: description: "Only return logs since this time, as a UNIX timestamp" type: "integer" default: 0 + - name: "until" + in: "query" + description: "Only return logs before this time, as a UNIX timestamp" + type: "integer" + default: 0 - name: "timestamps" in: "query" description: "Add timestamps to every log line" @@ -3731,6 +5080,8 @@ paths: items: type: "object" x-go-name: "ContainerChangeResponseItem" + title: "ContainerChangeResponseItem" + description: "change item in response to ContainerChanges operation" required: [Path, Kind] properties: Path: @@ -3804,9 +5155,9 @@ paths: This endpoint returns a live stream of a container’s resource usage statistics. - The `precpu_stats` is the CPU statistic of last read, which is used - for calculating the CPU usage percentage. It is not the same as the - `cpu_stats` field. + The `precpu_stats` is the CPU statistic of the *previous* read, and is + used to calculate the CPU usage percentage. It is not an exact copy + of the `cpu_stats` field. If either `precpu_stats.online_cpus` or `cpu_stats.online_cpus` is nil then for compatibility with older daemons the length of the @@ -4081,6 +5432,13 @@ paths: examples: application/json: message: "No such container: c2ada9df5af8" + 409: + description: "container is not running" + schema: + $ref: "#/definitions/ErrorResponse" + examples: + application/json: + message: "Container d37cde0fe4ad63c3a7252023b2f9800282894247d145cb5933ddf6e52cc03a28 is not running" 500: description: "server error" schema: @@ -4109,6 +5467,8 @@ paths: description: "The container has been updated." schema: type: "object" + title: "ContainerUpdateResponse" + description: "OK response to ContainerUpdate operation" properties: Warnings: type: "array" @@ -4462,12 +5822,21 @@ paths: description: "The container has exit." schema: type: "object" + title: "ContainerWaitResponse" + description: "OK response to ContainerWait operation" required: [StatusCode] properties: StatusCode: description: "Exit code of the container" type: "integer" x-nullable: false + Error: + description: "container waiting error, if any" + type: "object" + properties: + Message: + description: "Details of an error" + type: "string" 404: description: "no such container" schema: @@ -4700,6 +6069,7 @@ paths: description: "No error" schema: type: "object" + title: "ContainerPruneResponse" properties: ContainersDeleted: description: "Container IDs that were deleted" @@ -4879,8 +6249,19 @@ paths: type: "integer" - name: "buildargs" in: "query" - description: "JSON map of string pairs for build-time variables. Users pass these values at build-time. Docker uses the buildargs as the environment context for commands run via the `Dockerfile` RUN instruction, or for variable expansion in other `Dockerfile` instructions. This is not meant for passing secret values. [Read more about the buildargs instruction.](https://docs.docker.com/engine/reference/builder/#arg)" - type: "integer" + description: > + JSON map of string pairs for build-time variables. Users pass these values at build-time. Docker + uses the buildargs as the environment context for commands run via the `Dockerfile` RUN + instruction, or for variable expansion in other `Dockerfile` instructions. This is not meant for + passing secret values. + + + For example, the build arg `FOO=bar` would become `{"FOO":"bar"}` in JSON. This would result in the + the query parameter `buildargs={"FOO":"bar"}`. Note that `{"FOO":"bar"}` should be URI component encoded. + + + [Read more about the buildargs instruction.](https://docs.docker.com/engine/reference/builder/#arg) + type: "string" - name: "shmsize" in: "query" description: "Size of `/dev/shm` in bytes. The size must be greater than 0. If omitted the system uses 64MB." @@ -4928,6 +6309,16 @@ paths: Only the registry domain name (and port if not the default 443) are required. However, for legacy reasons, the Docker Hub registry must be specified with both a `https://` prefix and a `/v1/` suffix even though Docker will prefer to use the v2 registry API. type: "string" + - name: "platform" + in: "query" + description: "Platform in the format os[/arch[/variant]]" + type: "string" + default: "" + - name: "target" + in: "query" + description: "Target build stage" + type: "string" + default: "" responses: 200: description: "no error" @@ -4951,6 +6342,7 @@ paths: description: "No error" schema: type: "object" + title: "BuildPruneResponse" properties: SpaceReclaimed: description: "Disk space reclaimed in bytes" @@ -5009,6 +6401,11 @@ paths: in: "header" description: "A base64-encoded auth configuration. [See the authentication section for details.](#section/Authentication)" type: "string" + - name: "platform" + in: "query" + description: "Platform in the format os[/arch[/variant]]" + type: "string" + default: "" tags: ["Image"] /images/{name}/json: get: @@ -5131,6 +6528,8 @@ paths: items: type: "object" x-go-name: HistoryResponseItem + title: "HistoryResponseItem" + description: "individual image layer information in response to ImageHistory operation" required: [Id, Created, CreatedBy, Tags, Size, Comment] properties: Id: @@ -5337,6 +6736,7 @@ paths: type: "array" items: type: "object" + title: "ImageSearchResponseItem" properties: description: type: "string" @@ -5412,6 +6812,7 @@ paths: description: "No error" schema: type: "object" + title: "ImagePruneResponse" properties: ImagesDeleted: description: "Images that were deleted" @@ -5439,6 +6840,7 @@ paths: description: "An identity token was generated successfully." schema: type: "object" + title: "SystemAuthResponse" required: [Status] properties: Status: @@ -5476,209 +6878,7 @@ paths: 200: description: "No error" schema: - type: "object" - properties: - Architecture: - type: "string" - Containers: - type: "integer" - ContainersRunning: - type: "integer" - ContainersStopped: - type: "integer" - ContainersPaused: - type: "integer" - CpuCfsPeriod: - type: "boolean" - CpuCfsQuota: - type: "boolean" - Debug: - type: "boolean" - DiscoveryBackend: - type: "string" - DockerRootDir: - type: "string" - Driver: - type: "string" - DriverStatus: - type: "array" - items: - type: "array" - items: - type: "string" - SystemStatus: - type: "array" - items: - type: "array" - items: - type: "string" - Plugins: - type: "object" - properties: - Volume: - type: "array" - items: - type: "string" - Network: - type: "array" - items: - type: "string" - Log: - type: "array" - items: - type: "string" - ExperimentalBuild: - type: "boolean" - HttpProxy: - type: "string" - HttpsProxy: - type: "string" - ID: - type: "string" - IPv4Forwarding: - type: "boolean" - Images: - type: "integer" - IndexServerAddress: - type: "string" - InitPath: - type: "string" - InitSha1: - type: "string" - KernelVersion: - type: "string" - Labels: - type: "array" - items: - type: "string" - MemTotal: - type: "integer" - GenericResources: - $ref: "#/definitions/GenericResources" - MemoryLimit: - type: "boolean" - NCPU: - type: "integer" - NEventsListener: - type: "integer" - NFd: - type: "integer" - NGoroutines: - type: "integer" - Name: - type: "string" - NoProxy: - type: "string" - OomKillDisable: - type: "boolean" - OSType: - type: "string" - OomScoreAdj: - type: "integer" - OperatingSystem: - type: "string" - RegistryConfig: - type: "object" - properties: - IndexConfigs: - type: "object" - additionalProperties: - type: "object" - properties: - Mirrors: - type: "array" - items: - type: "string" - Name: - type: "string" - Official: - type: "boolean" - Secure: - type: "boolean" - InsecureRegistryCIDRs: - type: "array" - items: - type: "string" - SwapLimit: - type: "boolean" - SystemTime: - type: "string" - ServerVersion: - type: "string" - examples: - application/json: - Architecture: "x86_64" - ClusterStore: "etcd://localhost:2379" - CgroupDriver: "cgroupfs" - Containers: 11 - ContainersRunning: 7 - ContainersStopped: 3 - ContainersPaused: 1 - CpuCfsPeriod: true - CpuCfsQuota: true - Debug: false - DockerRootDir: "/var/lib/docker" - Driver: "btrfs" - DriverStatus: - - - - "" - ExperimentalBuild: false - HttpProxy: "http://test:test@localhost:8080" - HttpsProxy: "https://test:test@localhost:8080" - ID: "7TRN:IPZB:QYBB:VPBQ:UMPP:KARE:6ZNR:XE6T:7EWV:PKF4:ZOJD:TPYS" - IPv4Forwarding: true - Images: 16 - IndexServerAddress: "https://index.docker.io/v1/" - InitPath: "/usr/bin/docker" - InitSha1: "" - KernelMemory: true - KernelVersion: "3.12.0-1-amd64" - Labels: - - "storage=ssd" - MemTotal: 2099236864 - MemoryLimit: true - NCPU: 1 - NEventsListener: 0 - NFd: 11 - NGoroutines: 21 - Name: "prod-server-42" - NoProxy: "9.81.1.160" - OomKillDisable: true - OSType: "linux" - OperatingSystem: "Boot2Docker" - Plugins: - Volume: - - "local" - Network: - - "null" - - "host" - - "bridge" - RegistryConfig: - IndexConfigs: - docker.io: - Name: "docker.io" - Official: true - Secure: true - InsecureRegistryCIDRs: - - "127.0.0.0/8" - SecurityOptions: - - Key: "Name" - Value: "seccomp" - - Key: "Profile" - Value: "default" - - Key: "Name" - Value: "apparmor" - - Key: "Name" - Value: "selinux" - - Key: "Name" - Value: "userns" - ServerVersion: "1.9.0" - SwapLimit: false - SystemStatus: - - - - "State" - - "Healthy" - SystemTime: "2015-03-10T11:11:23.730591467-07:00" + $ref: "#/definitions/SystemInfo" 500: description: "Server error" schema: @@ -5695,7 +6895,30 @@ paths: description: "no error" schema: type: "object" + title: "SystemVersionResponse" properties: + Platform: + type: "object" + required: [Name] + properties: + Name: + type: "string" + Components: + type: "array" + items: + type: "object" + x-go-name: ComponentVersion + required: [Name, Version] + properties: + Name: + type: "string" + Version: + type: "string" + x-nullable: false + Details: + type: "object" + x-nullable: true + Version: type: "string" ApiVersion: @@ -5825,7 +7048,7 @@ paths: Various objects within Docker report events when something happens to them. - Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, and `update` + Containers report these events: `attach`, `commit`, `copy`, `create`, `destroy`, `detach`, `die`, `exec_create`, `exec_detach`, `exec_start`, `exec_die`, `export`, `health_status`, `kill`, `oom`, `pause`, `rename`, `resize`, `restart`, `start`, `stop`, `top`, `unpause`, and `update` Images report these events: `delete`, `import`, `load`, `pull`, `push`, `save`, `tag`, and `untag` @@ -5851,6 +7074,7 @@ paths: description: "no error" schema: type: "object" + title: "SystemEventsResponse" properties: Type: description: "The type of object emitting the event" @@ -5909,16 +7133,20 @@ paths: description: | A JSON encoded value of filters (a `map[string][]string`) to process on the event list. Available filters: + - `config=` config name or ID - `container=` container name or ID - `daemon=` daemon name or ID - `event=` event type - `image=` image name or ID - `label=` image or container label - `network=` network name or ID + - `node=` node ID - `plugin`= plugin name or ID - - `scope`= local or swarm - - `type=` object to filter by, one of `container`, `image`, `volume`, `network`, `daemon`, `plugin`, `node`, `service` or `secret` - - `volume=` volume name or ID + - `scope`= local or swarm + - `secret=` secret name or ID + - `service=` service name or ID + - `type=` object to filter by, one of `container`, `image`, `volume`, `network`, `daemon`, `plugin`, `node`, `service`, `secret` or `config` + - `volume=` volume name type: "string" tags: ["System"] /system/df: @@ -5930,6 +7158,7 @@ paths: description: "no error" schema: type: "object" + title: "SystemDataUsageResponse" properties: LayersSize: type: "integer" @@ -6187,6 +7416,9 @@ paths: User: type: "string" description: "The user, and optionally, group to run the exec process inside the container. Format is one of: `user`, `user:group`, `uid`, or `uid:gid`." + WorkingDir: + type: "string" + description: "The working directory for the exec process inside the container." example: AttachStdin: false AttachStdout: true @@ -6285,7 +7517,12 @@ paths: description: "No error" schema: type: "object" + title: "ExecInspectResponse" properties: + CanRemove: + type: "boolean" + DetachKeys: + type: "string" ID: type: "string" Running: @@ -6351,6 +7588,7 @@ paths: description: "Summary volume data that matches the query" schema: type: "object" + title: "VolumeListResponse" required: [Volumes, Warnings] properties: Volumes: @@ -6532,6 +7770,7 @@ paths: description: "No error" schema: type: "object" + title: "VolumePruneResponse" properties: VolumesDeleted: description: "Volumes that were deleted" @@ -6710,6 +7949,7 @@ paths: description: "No error" schema: type: "object" + title: "NetworkCreateResponse" properties: Id: description: "The ID of the created network." @@ -6810,7 +8050,7 @@ paths: summary: "Connect a container to a network" operationId: "NetworkConnect" consumes: - - "application/octet-stream" + - "application/json" responses: 200: description: "No error" @@ -6912,6 +8152,7 @@ paths: description: "No error" schema: type: "object" + title: "NetworkPruneResponse" properties: NetworksDeleted: description: "Networks that were deleted" @@ -6963,6 +8204,7 @@ paths: items: description: "Describes a permission the user has to accept upon installing the plugin." type: "object" + title: "PluginPrivilegeItem" properties: Name: type: "string" @@ -7449,60 +8691,7 @@ paths: 200: description: "no error" schema: - allOf: - - $ref: "#/definitions/ClusterInfo" - - type: "object" - properties: - JoinTokens: - description: "The tokens workers and managers need to join the swarm." - type: "object" - properties: - Worker: - description: "The token workers can use to join the swarm." - type: "string" - Manager: - description: "The token managers can use to join the swarm." - type: "string" - example: - CreatedAt: "2016-08-15T16:00:20.349727406Z" - Spec: - Dispatcher: - HeartbeatPeriod: 5000000000 - Orchestration: - TaskHistoryRetentionLimit: 10 - CAConfig: - NodeCertExpiry: 7776000000000000 - Raft: - LogEntriesForSlowFollowers: 500 - HeartbeatTick: 1 - SnapshotInterval: 10000 - ElectionTick: 3 - TaskDefaults: {} - EncryptionConfig: - AutoLockManagers: false - Name: "default" - JoinTokens: - Worker: "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-6qmn92w6bu3jdvnglku58u11a" - Manager: "SWMTKN-1-1h8aps2yszaiqmz2l3oc5392pgk8e49qhx2aj3nyv0ui0hez2a-8llk83c4wm9lwioey2s316r9l" - ID: "70ilmkj2f6sp2137c753w2nmt" - UpdatedAt: "2016-08-15T16:32:09.623207604Z" - Version: - Index: 51 - RootRotationInProgress: false - TLSInfo: - TrustRoot: | - -----BEGIN CERTIFICATE----- - MIIBajCCARCgAwIBAgIUbYqrLSOSQHoxD8CwG6Bi2PJi9c8wCgYIKoZIzj0EAwIw - EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTcwNDI0MjE0MzAwWhcNMzcwNDE5MjE0 - MzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH - A0IABJk/VyMPYdaqDXJb/VXh5n/1Yuv7iNrxV3Qb3l06XD46seovcDWs3IZNV1lf - 3Skyr0ofcchipoiHkXBODojJydSjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB - Af8EBTADAQH/MB0GA1UdDgQWBBRUXxuRcnFjDfR/RIAUQab8ZV/n4jAKBggqhkjO - PQQDAgNIADBFAiAy+JTe6Uc3KyLCMiqGl2GyWGQqQDEcO3/YG36x7om65AIhAJvz - pxv6zFeVEkAEEkqIYi0omA9+CjanB/6Bz4n1uw8H - -----END CERTIFICATE----- - CertIssuerSubject: "MBMxETAPBgNVBAMTCHN3YXJtLWNh" - CertIssuerPublicKey: "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmT9XIw9h1qoNclv9VeHmf/Vi6/uI2vFXdBveXTpcPjqx6i9wNazchk1XWV/dKTKvSh9xyGKmiIeRcE4OiMnJ1A==" + $ref: "#/definitions/Swarm" 404: description: "no such swarm" schema: @@ -7718,6 +8907,7 @@ paths: description: "no error" schema: type: "object" + title: "UnlockKeyResponse" properties: UnlockKey: description: "The swarm's unlock key." @@ -7809,6 +8999,7 @@ paths: description: "no error" schema: type: "object" + title: "ServiceCreateResponse" properties: ID: description: "The ID of the created service." @@ -8425,6 +9616,20 @@ paths: items: $ref: "#/definitions/Secret" example: + - ID: "blt1owaxmitz71s9v5zh81zun" + Version: + Index: 85 + CreatedAt: "2017-07-20T13:55:28.678958722Z" + UpdatedAt: "2017-07-20T13:55:28.678958722Z" + Spec: + Name: "mysql-passwd" + Labels: + some.label: "some.value" + Driver: + Name: "secret-bucket" + Options: + OptionA: "value for driver option A" + OptionB: "value for driver option B" - ID: "ktnbjxoalbkvbvedmg1urrz8h" Version: Index: 11 @@ -8432,6 +9637,8 @@ paths: UpdatedAt: "2016-11-05T01:20:17.327670065Z" Spec: Name: "app-dev.crt" + Labels: + foo: "bar" 500: description: "server error" schema: @@ -8464,13 +9671,7 @@ paths: 201: description: "no error" schema: - type: "object" - properties: - ID: - description: "The ID of the created secret." - type: "string" - example: - ID: "ktnbjxoalbkvbvedmg1urrz8h" + $ref: "#/definitions/IdResponse" 409: description: "name conflicts with an existing object" schema: @@ -8495,6 +9696,11 @@ paths: Labels: foo: "bar" Data: "VEhJUyBJUyBOT1QgQSBSRUFMIENFUlRJRklDQVRFCg==" + Driver: + Name: "secret-bucket" + Options: + OptionA: "value for driver option A" + OptionB: "value for driver option B" tags: ["Secret"] /secrets/{id}: get: @@ -8516,6 +9722,14 @@ paths: UpdatedAt: "2016-11-05T01:20:17.327670065Z" Spec: Name: "app-dev.crt" + Labels: + foo: "bar" + Driver: + Name: "secret-bucket" + Options: + OptionA: "value for driver option A" + OptionB: "value for driver option B" + 404: description: "secret not found" schema: @@ -8656,13 +9870,7 @@ paths: 201: description: "no error" schema: - type: "object" - properties: - ID: - description: "The ID of the created config." - type: "string" - example: - ID: "ktnbjxoalbkvbvedmg1urrz8h" + $ref: "#/definitions/IdResponse" 409: description: "name conflicts with an existing object" schema: @@ -8808,6 +10016,7 @@ paths: schema: type: "object" x-go-name: DistributionInspect + title: "DistributionInspectResponse" required: [Descriptor, Platforms] properties: Descriptor: diff --git a/vendor/github.com/docker/docker/api/types/client.go b/vendor/github.com/docker/docker/api/types/client.go index 18a1263f10f..bf5fdfbffc6 100644 --- a/vendor/github.com/docker/docker/api/types/client.go +++ b/vendor/github.com/docker/docker/api/types/client.go @@ -7,7 +7,7 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/filters" - units "github.com/docker/go-units" + "github.com/docker/go-units" ) // CheckpointCreateOptions holds parameters to create a checkpoint from a container @@ -74,6 +74,7 @@ type ContainerLogsOptions struct { ShowStdout bool ShowStderr bool Since string + Until string Timestamps bool Follow bool Tail string @@ -179,10 +180,7 @@ type ImageBuildOptions struct { ExtraHosts []string // List of extra hosts Target string SessionID string - - // TODO @jhowardmsft LCOW Support: This will require extending to include - // `Platform string`, but is ommited for now as it's hard-coded temporarily - // to avoid API changes. + Platform string } // ImageBuildResponse holds information @@ -195,7 +193,8 @@ type ImageBuildResponse struct { // ImageCreateOptions holds information to create images. type ImageCreateOptions struct { - RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry. + Platform string // Platform is the target platform of the image if it needs to be pulled from the registry. } // ImageImportSource holds source information for ImageImport @@ -206,9 +205,10 @@ type ImageImportSource struct { // ImageImportOptions holds information to import images from the client host. type ImageImportOptions struct { - Tag string // Tag is the name to tag this image with. This attribute is deprecated. - Message string // Message is the message to tag the image with - Changes []string // Changes are the raw changes to apply to this image + Tag string // Tag is the name to tag this image with. This attribute is deprecated. + Message string // Message is the message to tag the image with + Changes []string // Changes are the raw changes to apply to this image + Platform string // Platform is the target platform of the image } // ImageListOptions holds parameters to filter the list of images with. @@ -229,6 +229,7 @@ type ImagePullOptions struct { All bool RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry PrivilegeFunc RequestPrivilegeFunc + Platform string } // RequestPrivilegeFunc is a function interface that diff --git a/vendor/github.com/docker/docker/api/types/configs.go b/vendor/github.com/docker/docker/api/types/configs.go index e4d2ce6e366..fd604bce9c3 100644 --- a/vendor/github.com/docker/docker/api/types/configs.go +++ b/vendor/github.com/docker/docker/api/types/configs.go @@ -16,7 +16,6 @@ type ContainerCreateConfig struct { HostConfig *container.HostConfig NetworkingConfig *network.NetworkingConfig AdjustCPUShares bool - Platform string } // ContainerRmConfig holds arguments for the container remove @@ -26,19 +25,6 @@ type ContainerRmConfig struct { ForceRemove, RemoveVolume, RemoveLink bool } -// ContainerCommitConfig contains build configs for commit operation, -// and is used when making a commit with the current state of the container. -type ContainerCommitConfig struct { - Pause bool - Repo string - Tag string - Author string - Comment string - // merge container config into commit config before commit - MergeConfigs bool - Config *container.Config -} - // ExecConfig is a small subset of the Config struct that holds the configuration // for the exec feature of docker. type ExecConfig struct { @@ -51,6 +37,7 @@ type ExecConfig struct { Detach bool // Execute in detach mode DetachKeys string // Escape keys for detach Env []string // Environment variables + WorkingDir string // Working directory Cmd []string // Execution commands and args } diff --git a/vendor/github.com/docker/docker/api/types/container/container_changes.go b/vendor/github.com/docker/docker/api/types/container/container_changes.go index 767945a5325..c909d6ca3e9 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_changes.go +++ b/vendor/github.com/docker/docker/api/types/container/container_changes.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerChangeResponseItem container change response item +// ContainerChangeResponseItem change item in response to ContainerChanges operation // swagger:model ContainerChangeResponseItem type ContainerChangeResponseItem struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_create.go b/vendor/github.com/docker/docker/api/types/container/container_create.go index c95023b814d..49efa0f2c09 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_create.go +++ b/vendor/github.com/docker/docker/api/types/container/container_create.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerCreateCreatedBody container create created body +// ContainerCreateCreatedBody OK response to ContainerCreate operation // swagger:model ContainerCreateCreatedBody type ContainerCreateCreatedBody struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_top.go b/vendor/github.com/docker/docker/api/types/container/container_top.go index 78bc37ee5e9..ba41edcf3f8 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_top.go +++ b/vendor/github.com/docker/docker/api/types/container/container_top.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerTopOKBody container top o k body +// ContainerTopOKBody OK response to ContainerTop operation // swagger:model ContainerTopOKBody type ContainerTopOKBody struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_update.go b/vendor/github.com/docker/docker/api/types/container/container_update.go index 2339366fbd1..7630ae54cd6 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_update.go +++ b/vendor/github.com/docker/docker/api/types/container/container_update.go @@ -7,7 +7,7 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerUpdateOKBody container update o k body +// ContainerUpdateOKBody OK response to ContainerUpdate operation // swagger:model ContainerUpdateOKBody type ContainerUpdateOKBody struct { diff --git a/vendor/github.com/docker/docker/api/types/container/container_wait.go b/vendor/github.com/docker/docker/api/types/container/container_wait.go index 77ecdbaf7ae..9e3910a6b42 100644 --- a/vendor/github.com/docker/docker/api/types/container/container_wait.go +++ b/vendor/github.com/docker/docker/api/types/container/container_wait.go @@ -7,10 +7,22 @@ package container // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// ContainerWaitOKBody container wait o k body +// ContainerWaitOKBodyError container waiting error, if any +// swagger:model ContainerWaitOKBodyError +type ContainerWaitOKBodyError struct { + + // Details of an error + Message string `json:"Message,omitempty"` +} + +// ContainerWaitOKBody OK response to ContainerWait operation // swagger:model ContainerWaitOKBody type ContainerWaitOKBody struct { + // error + // Required: true + Error *ContainerWaitOKBodyError `json:"Error"` + // Exit code of the container // Required: true StatusCode int64 `json:"StatusCode"` diff --git a/vendor/github.com/docker/docker/api/types/container/host_config.go b/vendor/github.com/docker/docker/api/types/container/host_config.go index 9fea9eb04b8..930cf2de388 100644 --- a/vendor/github.com/docker/docker/api/types/container/host_config.go +++ b/vendor/github.com/docker/docker/api/types/container/host_config.go @@ -20,44 +20,70 @@ func (i Isolation) IsDefault() bool { return strings.ToLower(string(i)) == "default" || string(i) == "" } +// IsHyperV indicates the use of a Hyper-V partition for isolation +func (i Isolation) IsHyperV() bool { + return strings.ToLower(string(i)) == "hyperv" +} + +// IsProcess indicates the use of process isolation +func (i Isolation) IsProcess() bool { + return strings.ToLower(string(i)) == "process" +} + +const ( + // IsolationEmpty is unspecified (same behavior as default) + IsolationEmpty = Isolation("") + // IsolationDefault is the default isolation mode on current daemon + IsolationDefault = Isolation("default") + // IsolationProcess is process isolation mode + IsolationProcess = Isolation("process") + // IsolationHyperV is HyperV isolation mode + IsolationHyperV = Isolation("hyperv") +) + // IpcMode represents the container ipc stack. type IpcMode string -// IsPrivate indicates whether the container uses its private ipc stack. +// IsPrivate indicates whether the container uses its own private ipc namespace which can not be shared. func (n IpcMode) IsPrivate() bool { - return !(n.IsHost() || n.IsContainer()) + return n == "private" } -// IsHost indicates whether the container uses the host's ipc stack. +// IsHost indicates whether the container shares the host's ipc namespace. func (n IpcMode) IsHost() bool { return n == "host" } -// IsContainer indicates whether the container uses a container's ipc stack. +// IsShareable indicates whether the container's ipc namespace can be shared with another container. +func (n IpcMode) IsShareable() bool { + return n == "shareable" +} + +// IsContainer indicates whether the container uses another container's ipc namespace. func (n IpcMode) IsContainer() bool { parts := strings.SplitN(string(n), ":", 2) return len(parts) > 1 && parts[0] == "container" } -// Valid indicates whether the ipc stack is valid. +// IsNone indicates whether container IpcMode is set to "none". +func (n IpcMode) IsNone() bool { + return n == "none" +} + +// IsEmpty indicates whether container IpcMode is empty +func (n IpcMode) IsEmpty() bool { + return n == "" +} + +// Valid indicates whether the ipc mode is valid. func (n IpcMode) Valid() bool { - parts := strings.Split(string(n), ":") - switch mode := parts[0]; mode { - case "", "host": - case "container": - if len(parts) != 2 || parts[1] == "" { - return false - } - default: - return false - } - return true + return n.IsEmpty() || n.IsNone() || n.IsPrivate() || n.IsHost() || n.IsShareable() || n.IsContainer() } // Container returns the name of the container ipc stack is going to be used. func (n IpcMode) Container() string { parts := strings.SplitN(string(n), ":", 2) - if len(parts) > 1 { + if len(parts) > 1 && parts[0] == "container" { return parts[1] } return "" @@ -375,6 +401,12 @@ type HostConfig struct { // Mounts specs used by the container Mounts []mount.Mount `json:",omitempty"` + // MaskedPaths is the list of paths to be masked inside the container (this overrides the default set of paths) + MaskedPaths []string + + // ReadonlyPaths is the list of paths to be set as read-only inside the container (this overrides the default set of paths) + ReadonlyPaths []string + // Run a custom init inside the container, if null, use the daemon's configured settings Init *bool `json:",omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go index 469923f7e9a..3374d737f12 100644 --- a/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go +++ b/vendor/github.com/docker/docker/api/types/container/hostconfig_windows.go @@ -1,9 +1,5 @@ package container -import ( - "strings" -) - // IsBridge indicates whether container uses the bridge network stack // in windows it is given the name NAT func (n NetworkMode) IsBridge() bool { @@ -21,16 +17,6 @@ func (n NetworkMode) IsUserDefined() bool { return !n.IsDefault() && !n.IsNone() && !n.IsBridge() && !n.IsContainer() } -// IsHyperV indicates the use of a Hyper-V partition for isolation -func (i Isolation) IsHyperV() bool { - return strings.ToLower(string(i)) == "hyperv" -} - -// IsProcess indicates the use of process isolation -func (i Isolation) IsProcess() bool { - return strings.ToLower(string(i)) == "process" -} - // IsValid indicates if an isolation technology is valid func (i Isolation) IsValid() bool { return i.IsDefault() || i.IsHyperV() || i.IsProcess() diff --git a/vendor/github.com/docker/docker/api/types/filters/parse.go b/vendor/github.com/docker/docker/api/types/filters/parse.go index beec3d49400..d45d0528fb1 100644 --- a/vendor/github.com/docker/docker/api/types/filters/parse.go +++ b/vendor/github.com/docker/docker/api/types/filters/parse.go @@ -1,38 +1,45 @@ -// Package filters provides helper function to parse and handle command line -// filter, used for example in docker ps or docker images commands. +/*Package filters provides tools for encoding a mapping of keys to a set of +multiple values. +*/ package filters import ( "encoding/json" "errors" - "fmt" "regexp" "strings" "github.com/docker/docker/api/types/versions" ) -// Args stores filter arguments as map key:{map key: bool}. -// It contains an aggregation of the map of arguments (which are in the form -// of -f 'key=value') based on the key, and stores values for the same key -// in a map with string keys and boolean values. -// e.g given -f 'label=label1=1' -f 'label=label2=2' -f 'image.name=ubuntu' -// the args will be {"image.name":{"ubuntu":true},"label":{"label1=1":true,"label2=2":true}} +// Args stores a mapping of keys to a set of multiple values. type Args struct { fields map[string]map[string]bool } -// NewArgs initializes a new Args struct. -func NewArgs() Args { - return Args{fields: map[string]map[string]bool{}} +// KeyValuePair are used to initialize a new Args +type KeyValuePair struct { + Key string + Value string } -// ParseFlag parses the argument to the filter flag. Like +// Arg creates a new KeyValuePair for initializing Args +func Arg(key, value string) KeyValuePair { + return KeyValuePair{Key: key, Value: value} +} + +// NewArgs returns a new Args populated with the initial args +func NewArgs(initialArgs ...KeyValuePair) Args { + args := Args{fields: map[string]map[string]bool{}} + for _, arg := range initialArgs { + args.Add(arg.Key, arg.Value) + } + return args +} + +// ParseFlag parses a key=value string and adds it to an Args. // -// `docker ps -f 'created=today' -f 'image.name=ubuntu*'` -// -// If prev map is provided, then it is appended to, and returned. By default a new -// map is created. +// Deprecated: Use Args.Add() func ParseFlag(arg string, prev Args) (Args, error) { filters := prev if len(arg) == 0 { @@ -53,74 +60,95 @@ func ParseFlag(arg string, prev Args) (Args, error) { return filters, nil } -// ErrBadFormat is an error returned in case of bad format for a filter. +// ErrBadFormat is an error returned when a filter is not in the form key=value +// +// Deprecated: this error will be removed in a future version var ErrBadFormat = errors.New("bad format of filter (expected name=value)") -// ToParam packs the Args into a string for easy transport from client to server. +// ToParam encodes the Args as args JSON encoded string +// +// Deprecated: use ToJSON func ToParam(a Args) (string, error) { - // this way we don't URL encode {}, just empty space + return ToJSON(a) +} + +// MarshalJSON returns a JSON byte representation of the Args +func (args Args) MarshalJSON() ([]byte, error) { + if len(args.fields) == 0 { + return []byte{}, nil + } + return json.Marshal(args.fields) +} + +// ToJSON returns the Args as a JSON encoded string +func ToJSON(a Args) (string, error) { if a.Len() == 0 { return "", nil } - - buf, err := json.Marshal(a.fields) - if err != nil { - return "", err - } - return string(buf), nil + buf, err := json.Marshal(a) + return string(buf), err } -// ToParamWithVersion packs the Args into a string for easy transport from client to server. -// The generated string will depend on the specified version (corresponding to the API version). +// ToParamWithVersion encodes Args as a JSON string. If version is less than 1.22 +// then the encoded format will use an older legacy format where the values are a +// list of strings, instead of a set. +// +// Deprecated: Use ToJSON func ToParamWithVersion(version string, a Args) (string, error) { - // this way we don't URL encode {}, just empty space if a.Len() == 0 { return "", nil } - // for daemons older than v1.10, filter must be of the form map[string][]string - var buf []byte - var err error if version != "" && versions.LessThan(version, "1.22") { - buf, err = json.Marshal(convertArgsToSlice(a.fields)) - } else { - buf, err = json.Marshal(a.fields) + buf, err := json.Marshal(convertArgsToSlice(a.fields)) + return string(buf), err } - if err != nil { - return "", err - } - return string(buf), nil + + return ToJSON(a) } -// FromParam unpacks the filter Args. +// FromParam decodes a JSON encoded string into Args +// +// Deprecated: use FromJSON func FromParam(p string) (Args, error) { - if len(p) == 0 { - return NewArgs(), nil - } - - r := strings.NewReader(p) - d := json.NewDecoder(r) - - m := map[string]map[string]bool{} - if err := d.Decode(&m); err != nil { - r.Seek(0, 0) - - // Allow parsing old arguments in slice format. - // Because other libraries might be sending them in this format. - deprecated := map[string][]string{} - if deprecatedErr := d.Decode(&deprecated); deprecatedErr == nil { - m = deprecatedArgs(deprecated) - } else { - return NewArgs(), err - } - } - return Args{m}, nil + return FromJSON(p) } -// Get returns the list of values associates with a field. -// It returns a slice of strings to keep backwards compatibility with old code. -func (filters Args) Get(field string) []string { - values := filters.fields[field] +// FromJSON decodes a JSON encoded string into Args +func FromJSON(p string) (Args, error) { + args := NewArgs() + + if p == "" { + return args, nil + } + + raw := []byte(p) + err := json.Unmarshal(raw, &args) + if err == nil { + return args, nil + } + + // Fallback to parsing arguments in the legacy slice format + deprecated := map[string][]string{} + if legacyErr := json.Unmarshal(raw, &deprecated); legacyErr != nil { + return args, err + } + + args.fields = deprecatedArgs(deprecated) + return args, nil +} + +// UnmarshalJSON populates the Args from JSON encode bytes +func (args Args) UnmarshalJSON(raw []byte) error { + if len(raw) == 0 { + return nil + } + return json.Unmarshal(raw, &args.fields) +} + +// Get returns the list of values associated with the key +func (args Args) Get(key string) []string { + values := args.fields[key] if values == nil { return make([]string, 0) } @@ -131,37 +159,34 @@ func (filters Args) Get(field string) []string { return slice } -// Add adds a new value to a filter field. -func (filters Args) Add(name, value string) { - if _, ok := filters.fields[name]; ok { - filters.fields[name][value] = true +// Add a new value to the set of values +func (args Args) Add(key, value string) { + if _, ok := args.fields[key]; ok { + args.fields[key][value] = true } else { - filters.fields[name] = map[string]bool{value: true} + args.fields[key] = map[string]bool{value: true} } } -// Del removes a value from a filter field. -func (filters Args) Del(name, value string) { - if _, ok := filters.fields[name]; ok { - delete(filters.fields[name], value) - if len(filters.fields[name]) == 0 { - delete(filters.fields, name) +// Del removes a value from the set +func (args Args) Del(key, value string) { + if _, ok := args.fields[key]; ok { + delete(args.fields[key], value) + if len(args.fields[key]) == 0 { + delete(args.fields, key) } } } -// Len returns the number of fields in the arguments. -func (filters Args) Len() int { - return len(filters.fields) +// Len returns the number of keys in the mapping +func (args Args) Len() int { + return len(args.fields) } -// MatchKVList returns true if the values for the specified field matches the ones -// from the sources. -// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, -// field is 'label' and sources are {'label1': '1', 'label2': '2'} -// it returns true. -func (filters Args) MatchKVList(field string, sources map[string]string) bool { - fieldValues := filters.fields[field] +// MatchKVList returns true if all the pairs in sources exist as key=value +// pairs in the mapping at key, or if there are no values at key. +func (args Args) MatchKVList(key string, sources map[string]string) bool { + fieldValues := args.fields[key] //do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { @@ -172,8 +197,8 @@ func (filters Args) MatchKVList(field string, sources map[string]string) bool { return false } - for name2match := range fieldValues { - testKV := strings.SplitN(name2match, "=", 2) + for value := range fieldValues { + testKV := strings.SplitN(value, "=", 2) v, ok := sources[testKV[0]] if !ok { @@ -187,16 +212,13 @@ func (filters Args) MatchKVList(field string, sources map[string]string) bool { return true } -// Match returns true if the values for the specified field matches the source string -// e.g. given Args are {'label': {'label1=1','label2=1'}, 'image.name', {'ubuntu'}}, -// field is 'image.name' and source is 'ubuntu' -// it returns true. -func (filters Args) Match(field, source string) bool { - if filters.ExactMatch(field, source) { +// Match returns true if any of the values at key match the source string +func (args Args) Match(field, source string) bool { + if args.ExactMatch(field, source) { return true } - fieldValues := filters.fields[field] + fieldValues := args.fields[field] for name2match := range fieldValues { match, err := regexp.MatchString(name2match, source) if err != nil { @@ -209,9 +231,9 @@ func (filters Args) Match(field, source string) bool { return false } -// ExactMatch returns true if the source matches exactly one of the filters. -func (filters Args) ExactMatch(field, source string) bool { - fieldValues, ok := filters.fields[field] +// ExactMatch returns true if the source matches exactly one of the values. +func (args Args) ExactMatch(key, source string) bool { + fieldValues, ok := args.fields[key] //do not filter if there is no filter set or cannot determine filter if !ok || len(fieldValues) == 0 { return true @@ -221,14 +243,15 @@ func (filters Args) ExactMatch(field, source string) bool { return fieldValues[source] } -// UniqueExactMatch returns true if there is only one filter and the source matches exactly this one. -func (filters Args) UniqueExactMatch(field, source string) bool { - fieldValues := filters.fields[field] +// UniqueExactMatch returns true if there is only one value and the source +// matches exactly the value. +func (args Args) UniqueExactMatch(key, source string) bool { + fieldValues := args.fields[key] //do not filter if there is no filter set or cannot determine filter if len(fieldValues) == 0 { return true } - if len(filters.fields[field]) != 1 { + if len(args.fields[key]) != 1 { return false } @@ -236,14 +259,14 @@ func (filters Args) UniqueExactMatch(field, source string) bool { return fieldValues[source] } -// FuzzyMatch returns true if the source matches exactly one of the filters, -// or the source has one of the filters as a prefix. -func (filters Args) FuzzyMatch(field, source string) bool { - if filters.ExactMatch(field, source) { +// FuzzyMatch returns true if the source matches exactly one value, or the +// source has one of the values as a prefix. +func (args Args) FuzzyMatch(key, source string) bool { + if args.ExactMatch(key, source) { return true } - fieldValues := filters.fields[field] + fieldValues := args.fields[key] for prefix := range fieldValues { if strings.HasPrefix(source, prefix) { return true @@ -252,30 +275,47 @@ func (filters Args) FuzzyMatch(field, source string) bool { return false } -// Include returns true if the name of the field to filter is in the filters. -func (filters Args) Include(field string) bool { - _, ok := filters.fields[field] +// Include returns true if the key exists in the mapping +// +// Deprecated: use Contains +func (args Args) Include(field string) bool { + _, ok := args.fields[field] return ok } -// Validate ensures that all the fields in the filter are valid. -// It returns an error as soon as it finds an invalid field. -func (filters Args) Validate(accepted map[string]bool) error { - for name := range filters.fields { +// Contains returns true if the key exists in the mapping +func (args Args) Contains(field string) bool { + _, ok := args.fields[field] + return ok +} + +type invalidFilter string + +func (e invalidFilter) Error() string { + return "Invalid filter '" + string(e) + "'" +} + +func (invalidFilter) InvalidParameter() {} + +// Validate compared the set of accepted keys against the keys in the mapping. +// An error is returned if any mapping keys are not in the accepted set. +func (args Args) Validate(accepted map[string]bool) error { + for name := range args.fields { if !accepted[name] { - return fmt.Errorf("Invalid filter '%s'", name) + return invalidFilter(name) } } return nil } -// WalkValues iterates over the list of filtered values for a field. -// It stops the iteration if it finds an error and it returns that error. -func (filters Args) WalkValues(field string, op func(value string) error) error { - if _, ok := filters.fields[field]; !ok { +// WalkValues iterates over the list of values for a key in the mapping and calls +// op() for each value. If op returns an error the iteration stops and the +// error is returned. +func (args Args) WalkValues(field string, op func(value string) error) error { + if _, ok := args.fields[field]; !ok { return nil } - for v := range filters.fields[field] { + for v := range args.fields[field] { if err := op(v); err != nil { return err } diff --git a/vendor/github.com/docker/docker/api/types/image/image_history.go b/vendor/github.com/docker/docker/api/types/image/image_history.go index 0dd30c729a5..d6b354bcdf3 100644 --- a/vendor/github.com/docker/docker/api/types/image/image_history.go +++ b/vendor/github.com/docker/docker/api/types/image/image_history.go @@ -7,7 +7,7 @@ package image // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// HistoryResponseItem history response item +// HistoryResponseItem individual image layer information in response to ImageHistory operation // swagger:model HistoryResponseItem type HistoryResponseItem struct { diff --git a/vendor/github.com/docker/docker/api/types/mount/mount.go b/vendor/github.com/docker/docker/api/types/mount/mount.go index 2744f85d6d1..b7d133cd845 100644 --- a/vendor/github.com/docker/docker/api/types/mount/mount.go +++ b/vendor/github.com/docker/docker/api/types/mount/mount.go @@ -15,6 +15,8 @@ const ( TypeVolume Type = "volume" // TypeTmpfs is the type for mounting tmpfs TypeTmpfs Type = "tmpfs" + // TypeNamedPipe is the type for mounting Windows named pipes + TypeNamedPipe Type = "npipe" ) // Mount represents a mount (volume). @@ -65,7 +67,7 @@ var Propagations = []Propagation{ type Consistency string const ( - // ConsistencyFull guarantees bind-mount-like consistency + // ConsistencyFull guarantees bind mount-like consistency ConsistencyFull Consistency = "consistent" // ConsistencyCached mounts can cache read data and FS structure ConsistencyCached Consistency = "cached" diff --git a/vendor/github.com/docker/docker/api/types/plugin.go b/vendor/github.com/docker/docker/api/types/plugin.go index cab333e01a3..abae48b9ab0 100644 --- a/vendor/github.com/docker/docker/api/types/plugin.go +++ b/vendor/github.com/docker/docker/api/types/plugin.go @@ -121,6 +121,9 @@ type PluginConfigArgs struct { // swagger:model PluginConfigInterface type PluginConfigInterface struct { + // Protocol to use for clients connecting to the plugin. + ProtocolScheme string `json:"ProtocolScheme,omitempty"` + // socket // Required: true Socket string `json:"Socket"` diff --git a/vendor/github.com/docker/docker/api/types/port.go b/vendor/github.com/docker/docker/api/types/port.go index ad52d46d560..d91234744c6 100644 --- a/vendor/github.com/docker/docker/api/types/port.go +++ b/vendor/github.com/docker/docker/api/types/port.go @@ -7,7 +7,7 @@ package types // swagger:model Port type Port struct { - // IP + // Host IP address that the container's port is mapped to IP string `json:"IP,omitempty"` // Port on the container diff --git a/vendor/github.com/docker/docker/api/types/swarm/common.go b/vendor/github.com/docker/docker/api/types/swarm/common.go index 54af82b31b8..2834cf20224 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/common.go +++ b/vendor/github.com/docker/docker/api/types/swarm/common.go @@ -20,7 +20,7 @@ type Annotations struct { Labels map[string]string `json:"Labels"` } -// Driver represents a driver (network, logging). +// Driver represents a driver (network, logging, secrets backend). type Driver struct { Name string `json:",omitempty"` Options map[string]string `json:",omitempty"` diff --git a/vendor/github.com/docker/docker/api/types/swarm/config.go b/vendor/github.com/docker/docker/api/types/swarm/config.go index 0fb021ce927..f473caee927 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/config.go +++ b/vendor/github.com/docker/docker/api/types/swarm/config.go @@ -13,6 +13,10 @@ type Config struct { type ConfigSpec struct { Annotations Data []byte `json:",omitempty"` + + // Templating controls whether and how to evaluate the config payload as + // a template. If it is not set, no templating is used. + Templating *Driver `json:",omitempty"` } // ConfigReferenceFileTarget is a file target in a config reference diff --git a/vendor/github.com/docker/docker/api/types/swarm/container.go b/vendor/github.com/docker/docker/api/types/swarm/container.go index 6f8b45f6bb4..174a943bbaf 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/container.go +++ b/vendor/github.com/docker/docker/api/types/swarm/container.go @@ -55,6 +55,7 @@ type ContainerSpec struct { User string `json:",omitempty"` Groups []string `json:",omitempty"` Privileges *Privileges `json:",omitempty"` + Init *bool `json:",omitempty"` StopSignal string `json:",omitempty"` TTY bool `json:",omitempty"` OpenStdin bool `json:",omitempty"` @@ -65,8 +66,9 @@ type ContainerSpec struct { // The format of extra hosts on swarmkit is specified in: // http://man7.org/linux/man-pages/man5/hosts.5.html // IP_address canonical_hostname [aliases...] - Hosts []string `json:",omitempty"` - DNSConfig *DNSConfig `json:",omitempty"` - Secrets []*SecretReference `json:",omitempty"` - Configs []*ConfigReference `json:",omitempty"` + Hosts []string `json:",omitempty"` + DNSConfig *DNSConfig `json:",omitempty"` + Secrets []*SecretReference `json:",omitempty"` + Configs []*ConfigReference `json:",omitempty"` + Isolation container.Isolation `json:",omitempty"` } diff --git a/vendor/github.com/docker/docker/api/types/swarm/network.go b/vendor/github.com/docker/docker/api/types/swarm/network.go index 97c484e14c7..4b880723399 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/network.go +++ b/vendor/github.com/docker/docker/api/types/swarm/network.go @@ -62,6 +62,8 @@ const ( PortConfigProtocolTCP PortConfigProtocol = "tcp" // PortConfigProtocolUDP UDP PortConfigProtocolUDP PortConfigProtocol = "udp" + // PortConfigProtocolSCTP SCTP + PortConfigProtocolSCTP PortConfigProtocol = "sctp" ) // EndpointVirtualIP represents the virtual ip of a port. diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime.go b/vendor/github.com/docker/docker/api/types/swarm/runtime.go index c4c731dc82a..8a28320f7b8 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/runtime.go +++ b/vendor/github.com/docker/docker/api/types/swarm/runtime.go @@ -11,9 +11,17 @@ const ( RuntimeContainer RuntimeType = "container" // RuntimePlugin is the plugin based runtime RuntimePlugin RuntimeType = "plugin" + // RuntimeNetworkAttachment is the network attachment runtime + RuntimeNetworkAttachment RuntimeType = "attachment" // RuntimeURLContainer is the proto url for the container type RuntimeURLContainer RuntimeURL = "types.docker.com/RuntimeContainer" // RuntimeURLPlugin is the proto url for the plugin type RuntimeURLPlugin RuntimeURL = "types.docker.com/RuntimePlugin" ) + +// NetworkAttachmentSpec represents the runtime spec type for network +// attachment tasks +type NetworkAttachmentSpec struct { + ContainerID string +} diff --git a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto index 06eb7ba6508..6d63b7783fd 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto +++ b/vendor/github.com/docker/docker/api/types/swarm/runtime/plugin.proto @@ -1,5 +1,7 @@ syntax = "proto3"; +option go_package = "github.com/docker/docker/api/types/swarm/runtime;runtime"; + // PluginSpec defines the base payload which clients can specify for creating // a service with the plugin runtime. message PluginSpec { diff --git a/vendor/github.com/docker/docker/api/types/swarm/secret.go b/vendor/github.com/docker/docker/api/types/swarm/secret.go index f9b1e926696..9ea0a7f1f3c 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/secret.go +++ b/vendor/github.com/docker/docker/api/types/swarm/secret.go @@ -14,6 +14,10 @@ type SecretSpec struct { Annotations Data []byte `json:",omitempty"` Driver *Driver `json:",omitempty"` // name of the secrets driver used to fetch the secret's value from an external secret store + + // Templating controls whether and how to evaluate the secret payload as + // a template. If it is not set, no templating is used. + Templating *Driver `json:",omitempty"` } // SecretReferenceFileTarget is a file target in a secret reference diff --git a/vendor/github.com/docker/docker/api/types/swarm/task.go b/vendor/github.com/docker/docker/api/types/swarm/task.go index ff11b07e74f..d3213da95ae 100644 --- a/vendor/github.com/docker/docker/api/types/swarm/task.go +++ b/vendor/github.com/docker/docker/api/types/swarm/task.go @@ -36,6 +36,10 @@ const ( TaskStateFailed TaskState = "failed" // TaskStateRejected REJECTED TaskStateRejected TaskState = "rejected" + // TaskStateRemove REMOVE + TaskStateRemove TaskState = "remove" + // TaskStateOrphaned ORPHANED + TaskStateOrphaned TaskState = "orphaned" ) // Task represents a task. @@ -56,10 +60,13 @@ type Task struct { // TaskSpec represents the spec of a task. type TaskSpec struct { - // ContainerSpec and PluginSpec are mutually exclusive. - // PluginSpec will only be used when the `Runtime` field is set to `plugin` - ContainerSpec *ContainerSpec `json:",omitempty"` - PluginSpec *runtime.PluginSpec `json:",omitempty"` + // ContainerSpec, NetworkAttachmentSpec, and PluginSpec are mutually exclusive. + // PluginSpec is only used when the `Runtime` field is set to `plugin` + // NetworkAttachmentSpec is used if the `Runtime` field is set to + // `attachment`. + ContainerSpec *ContainerSpec `json:",omitempty"` + PluginSpec *runtime.PluginSpec `json:",omitempty"` + NetworkAttachmentSpec *NetworkAttachmentSpec `json:",omitempty"` Resources *ResourceRequirements `json:",omitempty"` RestartPolicy *RestartPolicy `json:",omitempty"` @@ -162,19 +169,19 @@ const ( // TaskStatus represents the status of a task. type TaskStatus struct { - Timestamp time.Time `json:",omitempty"` - State TaskState `json:",omitempty"` - Message string `json:",omitempty"` - Err string `json:",omitempty"` - ContainerStatus ContainerStatus `json:",omitempty"` - PortStatus PortStatus `json:",omitempty"` + Timestamp time.Time `json:",omitempty"` + State TaskState `json:",omitempty"` + Message string `json:",omitempty"` + Err string `json:",omitempty"` + ContainerStatus *ContainerStatus `json:",omitempty"` + PortStatus PortStatus `json:",omitempty"` } // ContainerStatus represents the status of a container. type ContainerStatus struct { - ContainerID string `json:",omitempty"` - PID int `json:",omitempty"` - ExitCode int `json:",omitempty"` + ContainerID string + PID int + ExitCode int } // PortStatus represents the port status of a task's host ports whose diff --git a/vendor/github.com/docker/docker/api/types/time/timestamp.go b/vendor/github.com/docker/docker/api/types/time/timestamp.go index 9aa9702dad4..f97f04e1260 100644 --- a/vendor/github.com/docker/docker/api/types/time/timestamp.go +++ b/vendor/github.com/docker/docker/api/types/time/timestamp.go @@ -29,10 +29,8 @@ func GetTimestamp(value string, reference time.Time) (string, error) { } var format string - var parseInLocation bool - // if the string has a Z or a + or three dashes use parse otherwise use parseinlocation - parseInLocation = !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3) + parseInLocation := !(strings.ContainsAny(value, "zZ+") || strings.Count(value, "-") == 3) if strings.Contains(value, ".") { if parseInLocation { @@ -84,11 +82,14 @@ func GetTimestamp(value string, reference time.Time) (string, error) { } if err != nil { - // if there is a `-` then it's an RFC3339 like timestamp otherwise assume unixtimestamp + // if there is a `-` then it's an RFC3339 like timestamp if strings.Contains(value, "-") { return "", err // was probably an RFC3339 like timestamp but the parser failed with an error } - return value, nil // unixtimestamp in and out case (meaning: the value passed at the command line is already in the right format for passing to the server) + if _, _, err := parseTimestamp(value); err != nil { + return "", fmt.Errorf("failed to parse value as time or duration: %q", value) + } + return value, nil // unix timestamp in and out case (meaning: the value passed at the command line is already in the right format for passing to the server) } return fmt.Sprintf("%d.%09d", t.Unix(), int64(t.Nanosecond())), nil @@ -106,6 +107,10 @@ func ParseTimestamps(value string, def int64) (int64, int64, error) { if value == "" { return def, 0, nil } + return parseTimestamp(value) +} + +func parseTimestamp(value string) (int64, int64, error) { sa := strings.SplitN(value, ".", 2) s, err := strconv.ParseInt(sa[0], 10, 64) if err != nil { diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go index f7ac7729711..7814e6b934a 100644 --- a/vendor/github.com/docker/docker/api/types/types.go +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -107,9 +107,21 @@ type Ping struct { Experimental bool } +// ComponentVersion describes the version information for a specific component. +type ComponentVersion struct { + Name string + Version string + Details map[string]string `json:",omitempty"` +} + // Version contains response of Engine API: // GET "/version" type Version struct { + Platform struct{ Name string } `json:",omitempty"` + Components []ComponentVersion `json:",omitempty"` + + // The following fields are deprecated, they relate to the Engine component and are kept for backwards compatibility + Version string APIVersion string `json:"ApiVersion"` MinAPIVersion string `json:"MinAPIVersion,omitempty"` diff --git a/vendor/github.com/docker/docker/api/types/volume/BUILD b/vendor/github.com/docker/docker/api/types/volume/BUILD index 8af8f1d7955..1d021e2ad53 100644 --- a/vendor/github.com/docker/docker/api/types/volume/BUILD +++ b/vendor/github.com/docker/docker/api/types/volume/BUILD @@ -3,8 +3,8 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ - "volumes_create.go", - "volumes_list.go", + "volume_create.go", + "volume_list.go", ], importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/api/types/volume", importpath = "github.com/docker/docker/api/types/volume", diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_create.go b/vendor/github.com/docker/docker/api/types/volume/volume_create.go similarity index 88% rename from vendor/github.com/docker/docker/api/types/volume/volumes_create.go rename to vendor/github.com/docker/docker/api/types/volume/volume_create.go index 9f70e43ca4a..539e9b97d90 100644 --- a/vendor/github.com/docker/docker/api/types/volume/volumes_create.go +++ b/vendor/github.com/docker/docker/api/types/volume/volume_create.go @@ -7,9 +7,9 @@ package volume // See hack/generate-swagger-api.sh // ---------------------------------------------------------------------------- -// VolumesCreateBody volumes create body -// swagger:model VolumesCreateBody -type VolumesCreateBody struct { +// VolumeCreateBody +// swagger:model VolumeCreateBody +type VolumeCreateBody struct { // Name of the volume driver to use. // Required: true diff --git a/vendor/github.com/docker/docker/api/types/volume/volumes_list.go b/vendor/github.com/docker/docker/api/types/volume/volume_list.go similarity index 83% rename from vendor/github.com/docker/docker/api/types/volume/volumes_list.go rename to vendor/github.com/docker/docker/api/types/volume/volume_list.go index 833dad93306..1bb279dbb3f 100644 --- a/vendor/github.com/docker/docker/api/types/volume/volumes_list.go +++ b/vendor/github.com/docker/docker/api/types/volume/volume_list.go @@ -9,9 +9,9 @@ package volume import "github.com/docker/docker/api/types" -// VolumesListOKBody volumes list o k body -// swagger:model VolumesListOKBody -type VolumesListOKBody struct { +// VolumeListOKBody +// swagger:model VolumeListOKBody +type VolumeListOKBody struct { // List of volumes // Required: true diff --git a/vendor/github.com/docker/docker/client/BUILD b/vendor/github.com/docker/docker/client/BUILD index ead11b3c0c1..cfc15a7e8c5 100644 --- a/vendor/github.com/docker/docker/client/BUILD +++ b/vendor/github.com/docker/docker/client/BUILD @@ -74,7 +74,6 @@ go_library( "node_list.go", "node_remove.go", "node_update.go", - "parse_logs.go", "ping.go", "plugin_create.go", "plugin_disable.go", @@ -135,12 +134,10 @@ go_library( "//vendor/github.com/docker/docker/api/types/time:go_default_library", "//vendor/github.com/docker/docker/api/types/versions:go_default_library", "//vendor/github.com/docker/docker/api/types/volume:go_default_library", - "//vendor/github.com/docker/docker/pkg/tlsconfig:go_default_library", "//vendor/github.com/docker/go-connections/sockets:go_default_library", "//vendor/github.com/docker/go-connections/tlsconfig:go_default_library", "//vendor/github.com/opencontainers/go-digest:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", "//vendor/golang.org/x/net/context/ctxhttp:go_default_library", ], ) diff --git a/vendor/github.com/docker/docker/client/build_prune.go b/vendor/github.com/docker/docker/client/build_prune.go index ccab115d334..538fa99c6bf 100644 --- a/vendor/github.com/docker/docker/client/build_prune.go +++ b/vendor/github.com/docker/docker/client/build_prune.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // BuildCachePrune requests the daemon to delete unused cache data diff --git a/vendor/github.com/docker/docker/client/checkpoint_create.go b/vendor/github.com/docker/docker/client/checkpoint_create.go index 0effe498be1..dcac35e19d2 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_create.go +++ b/vendor/github.com/docker/docker/client/checkpoint_create.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // CheckpointCreate creates a checkpoint from the given container with the given name diff --git a/vendor/github.com/docker/docker/client/checkpoint_delete.go b/vendor/github.com/docker/docker/client/checkpoint_delete.go index e6e75588b14..0552dbfae8e 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_delete.go +++ b/vendor/github.com/docker/docker/client/checkpoint_delete.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // CheckpointDelete deletes the checkpoint with the given name from the given container diff --git a/vendor/github.com/docker/docker/client/checkpoint_list.go b/vendor/github.com/docker/docker/client/checkpoint_list.go index ffe44bc976a..6d5c5023cd1 100644 --- a/vendor/github.com/docker/docker/client/checkpoint_list.go +++ b/vendor/github.com/docker/docker/client/checkpoint_list.go @@ -1,12 +1,11 @@ package client import ( + "context" "encoding/json" - "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // CheckpointList returns the checkpoints of the given container in the docker host @@ -20,10 +19,7 @@ func (cli *Client) CheckpointList(ctx context.Context, container string, options resp, err := cli.get(ctx, "/containers/"+container+"/checkpoints", query, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return checkpoints, containerNotFoundError{container} - } - return checkpoints, err + return checkpoints, wrapResponseError(err, resp, "container", container) } err = json.NewDecoder(resp.body).Decode(&checkpoints) diff --git a/vendor/github.com/docker/docker/client/client.go b/vendor/github.com/docker/docker/client/client.go index 7e145317239..65397788e85 100644 --- a/vendor/github.com/docker/docker/client/client.go +++ b/vendor/github.com/docker/docker/client/client.go @@ -1,10 +1,6 @@ /* Package client is a Go client for the Docker Engine API. -The "docker" command uses this package to communicate with the daemon. It can also -be used by your own Go applications to do anything the command-line interface does -- running containers, pulling images, managing swarms, etc. - For more information about the Engine API, see the documentation: https://docs.docker.com/engine/reference/api/ @@ -46,11 +42,13 @@ For example, to list running containers (the equivalent of "docker ps"): package client import ( - "errors" + "context" "fmt" + "net" "net/http" "net/url" "os" + "path" "path/filepath" "strings" @@ -59,7 +57,7 @@ import ( "github.com/docker/docker/api/types/versions" "github.com/docker/go-connections/sockets" "github.com/docker/go-connections/tlsconfig" - "golang.org/x/net/context" + "github.com/pkg/errors" ) // ErrRedirect is the error returned by checkRedirect when the request is non-GET. @@ -106,12 +104,21 @@ func CheckRedirect(req *http.Request, via []*http.Request) error { } // NewEnvClient initializes a new API client based on environment variables. -// Use DOCKER_HOST to set the url to the docker server. -// Use DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. -// Use DOCKER_CERT_PATH to load the TLS certificates from. -// Use DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. +// See FromEnv for a list of support environment variables. +// +// Deprecated: use NewClientWithOpts(FromEnv) func NewEnvClient() (*Client, error) { - var client *http.Client + return NewClientWithOpts(FromEnv) +} + +// FromEnv configures the client with values from environment variables. +// +// Supported environment variables: +// DOCKER_HOST to set the url to the docker server. +// DOCKER_API_VERSION to set the version of the API to reach, leave empty for latest. +// DOCKER_CERT_PATH to load the TLS certificates from. +// DOCKER_TLS_VERIFY to enable or disable TLS verification, off by default. +func FromEnv(c *Client) error { if dockerCertPath := os.Getenv("DOCKER_CERT_PATH"); dockerCertPath != "" { options := tlsconfig.Options{ CAFile: filepath.Join(dockerCertPath, "ca.pem"), @@ -121,34 +128,159 @@ func NewEnvClient() (*Client, error) { } tlsc, err := tlsconfig.Client(options) if err != nil { - return nil, err + return err } - client = &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: tlsc, - }, + c.client = &http.Client{ + Transport: &http.Transport{TLSClientConfig: tlsc}, CheckRedirect: CheckRedirect, } } - host := os.Getenv("DOCKER_HOST") - if host == "" { - host = DefaultDockerHost - } - version := os.Getenv("DOCKER_API_VERSION") - if version == "" { - version = api.DefaultVersion + if host := os.Getenv("DOCKER_HOST"); host != "" { + if err := WithHost(host)(c); err != nil { + return err + } } - cli, err := NewClient(host, version, client, nil) + if version := os.Getenv("DOCKER_API_VERSION"); version != "" { + c.version = version + c.manualOverride = true + } + return nil +} + +// WithTLSClientConfig applies a tls config to the client transport. +func WithTLSClientConfig(cacertPath, certPath, keyPath string) func(*Client) error { + return func(c *Client) error { + opts := tlsconfig.Options{ + CAFile: cacertPath, + CertFile: certPath, + KeyFile: keyPath, + ExclusiveRootPools: true, + } + config, err := tlsconfig.Client(opts) + if err != nil { + return errors.Wrap(err, "failed to create tls config") + } + if transport, ok := c.client.Transport.(*http.Transport); ok { + transport.TLSClientConfig = config + return nil + } + return errors.Errorf("cannot apply tls config to transport: %T", c.client.Transport) + } +} + +// WithDialer applies the dialer.DialContext to the client transport. This can be +// used to set the Timeout and KeepAlive settings of the client. +func WithDialer(dialer *net.Dialer) func(*Client) error { + return func(c *Client) error { + if transport, ok := c.client.Transport.(*http.Transport); ok { + transport.DialContext = dialer.DialContext + return nil + } + return errors.Errorf("cannot apply dialer to transport: %T", c.client.Transport) + } +} + +// WithVersion overrides the client version with the specified one +func WithVersion(version string) func(*Client) error { + return func(c *Client) error { + c.version = version + return nil + } +} + +// WithHost overrides the client host with the specified one. +func WithHost(host string) func(*Client) error { + return func(c *Client) error { + hostURL, err := ParseHostURL(host) + if err != nil { + return err + } + c.host = host + c.proto = hostURL.Scheme + c.addr = hostURL.Host + c.basePath = hostURL.Path + if transport, ok := c.client.Transport.(*http.Transport); ok { + return sockets.ConfigureTransport(transport, c.proto, c.addr) + } + return errors.Errorf("cannot apply host to transport: %T", c.client.Transport) + } +} + +// WithHTTPClient overrides the client http client with the specified one +func WithHTTPClient(client *http.Client) func(*Client) error { + return func(c *Client) error { + if client != nil { + c.client = client + } + return nil + } +} + +// WithHTTPHeaders overrides the client default http headers +func WithHTTPHeaders(headers map[string]string) func(*Client) error { + return func(c *Client) error { + c.customHTTPHeaders = headers + return nil + } +} + +// NewClientWithOpts initializes a new API client with default values. It takes functors +// to modify values when creating it, like `NewClientWithOpts(WithVersion(…))` +// It also initializes the custom http headers to add to each request. +// +// It won't send any version information if the version number is empty. It is +// highly recommended that you set a version or your client may break if the +// server is upgraded. +func NewClientWithOpts(ops ...func(*Client) error) (*Client, error) { + client, err := defaultHTTPClient(DefaultDockerHost) if err != nil { - return cli, err + return nil, err } - if os.Getenv("DOCKER_API_VERSION") != "" { - cli.manualOverride = true + c := &Client{ + host: DefaultDockerHost, + version: api.DefaultVersion, + scheme: "http", + client: client, + proto: defaultProto, + addr: defaultAddr, } - return cli, nil + + for _, op := range ops { + if err := op(c); err != nil { + return nil, err + } + } + + if _, ok := c.client.Transport.(http.RoundTripper); !ok { + return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", c.client.Transport) + } + tlsConfig := resolveTLSConfig(c.client.Transport) + if tlsConfig != nil { + // TODO(stevvooe): This isn't really the right way to write clients in Go. + // `NewClient` should probably only take an `*http.Client` and work from there. + // Unfortunately, the model of having a host-ish/url-thingy as the connection + // string has us confusing protocol and transport layers. We continue doing + // this to avoid breaking existing clients but this should be addressed. + c.scheme = "https" + } + + return c, nil +} + +func defaultHTTPClient(host string) (*http.Client, error) { + url, err := ParseHostURL(host) + if err != nil { + return nil, err + } + transport := new(http.Transport) + sockets.ConfigureTransport(transport, url.Scheme, url.Host) + return &http.Client{ + Transport: transport, + CheckRedirect: CheckRedirect, + }, nil } // NewClient initializes a new API client for the given host and API version. @@ -158,58 +290,16 @@ func NewEnvClient() (*Client, error) { // It won't send any version information if the version number is empty. It is // highly recommended that you set a version or your client may break if the // server is upgraded. +// Deprecated: use NewClientWithOpts func NewClient(host string, version string, client *http.Client, httpHeaders map[string]string) (*Client, error) { - proto, addr, basePath, err := ParseHost(host) - if err != nil { - return nil, err - } - - if client != nil { - if _, ok := client.Transport.(*http.Transport); !ok { - return nil, fmt.Errorf("unable to verify TLS configuration, invalid transport %v", client.Transport) - } - } else { - transport := new(http.Transport) - sockets.ConfigureTransport(transport, proto, addr) - client = &http.Client{ - Transport: transport, - CheckRedirect: CheckRedirect, - } - } - - scheme := "http" - tlsConfig := resolveTLSConfig(client.Transport) - if tlsConfig != nil { - // TODO(stevvooe): This isn't really the right way to write clients in Go. - // `NewClient` should probably only take an `*http.Client` and work from there. - // Unfortunately, the model of having a host-ish/url-thingy as the connection - // string has us confusing protocol and transport layers. We continue doing - // this to avoid breaking existing clients but this should be addressed. - scheme = "https" - } - - return &Client{ - scheme: scheme, - host: host, - proto: proto, - addr: addr, - basePath: basePath, - client: client, - version: version, - customHTTPHeaders: httpHeaders, - }, nil + return NewClientWithOpts(WithHost(host), WithVersion(version), WithHTTPClient(client), WithHTTPHeaders(httpHeaders)) } -// Close ensures that transport.Client is closed -// especially needed while using NewClient with *http.Client = nil -// for example -// client.NewClient("unix:///var/run/docker.sock", nil, "v1.18", map[string]string{"User-Agent": "engine-api-cli-1.0"}) +// Close the transport used by the client func (cli *Client) Close() error { - if t, ok := cli.client.Transport.(*http.Transport); ok { t.CloseIdleConnections() } - return nil } @@ -219,37 +309,27 @@ func (cli *Client) getAPIPath(p string, query url.Values) string { var apiPath string if cli.version != "" { v := strings.TrimPrefix(cli.version, "v") - apiPath = cli.basePath + "/v" + v + p + apiPath = path.Join(cli.basePath, "/v"+v, p) } else { - apiPath = cli.basePath + p + apiPath = path.Join(cli.basePath, p) } - - u := &url.URL{ - Path: apiPath, - } - if len(query) > 0 { - u.RawQuery = query.Encode() - } - return u.String() + return (&url.URL{Path: apiPath, RawQuery: query.Encode()}).String() } -// ClientVersion returns the version string associated with this -// instance of the Client. Note that this value can be changed -// via the DOCKER_API_VERSION env var. -// This operation doesn't acquire a mutex. +// ClientVersion returns the API version used by this client. func (cli *Client) ClientVersion() string { return cli.version } -// NegotiateAPIVersion updates the version string associated with this -// instance of the Client to match the latest version the server supports +// NegotiateAPIVersion queries the API and updates the version to match the +// API version. Any errors are silently ignored. func (cli *Client) NegotiateAPIVersion(ctx context.Context) { ping, _ := cli.Ping(ctx) cli.NegotiateAPIVersionPing(ping) } -// NegotiateAPIVersionPing updates the version string associated with this -// instance of the Client to match the latest version the server supports +// NegotiateAPIVersionPing updates the client version to match the Ping.APIVersion +// if the ping version is less than the default version. func (cli *Client) NegotiateAPIVersionPing(p types.Ping) { if cli.manualOverride { return @@ -265,23 +345,28 @@ func (cli *Client) NegotiateAPIVersionPing(p types.Ping) { cli.version = api.DefaultVersion } - // if server version is lower than the maximum version supported by the Client, downgrade - if versions.LessThan(p.APIVersion, api.DefaultVersion) { + // if server version is lower than the client version, downgrade + if versions.LessThan(p.APIVersion, cli.version) { cli.version = p.APIVersion } } -// DaemonHost returns the host associated with this instance of the Client. -// This operation doesn't acquire a mutex. +// DaemonHost returns the host address used by the client func (cli *Client) DaemonHost() string { return cli.host } -// ParseHost verifies that the given host strings is valid. -func ParseHost(host string) (string, string, string, error) { +// HTTPClient returns a copy of the HTTP client bound to the server +func (cli *Client) HTTPClient() *http.Client { + return &*cli.client +} + +// ParseHostURL parses a url string, validates the string is a host url, and +// returns the parsed URL +func ParseHostURL(host string) (*url.URL, error) { protoAddrParts := strings.SplitN(host, "://", 2) if len(protoAddrParts) == 1 { - return "", "", "", fmt.Errorf("unable to parse docker host `%s`", host) + return nil, fmt.Errorf("unable to parse docker host `%s`", host) } var basePath string @@ -289,16 +374,19 @@ func ParseHost(host string) (string, string, string, error) { if proto == "tcp" { parsed, err := url.Parse("tcp://" + addr) if err != nil { - return "", "", "", err + return nil, err } addr = parsed.Host basePath = parsed.Path } - return proto, addr, basePath, nil + return &url.URL{ + Scheme: proto, + Host: addr, + Path: basePath, + }, nil } -// CustomHTTPHeaders returns the custom http headers associated with this -// instance of the Client. This operation doesn't acquire a mutex. +// CustomHTTPHeaders returns the custom http headers stored by the client. func (cli *Client) CustomHTTPHeaders() map[string]string { m := make(map[string]string) for k, v := range cli.customHTTPHeaders { @@ -307,8 +395,8 @@ func (cli *Client) CustomHTTPHeaders() map[string]string { return m } -// SetCustomHTTPHeaders updates the custom http headers associated with this -// instance of the Client. This operation doesn't acquire a mutex. +// SetCustomHTTPHeaders that will be set on every HTTP request made by the client. +// Deprecated: use WithHTTPHeaders when creating the client. func (cli *Client) SetCustomHTTPHeaders(headers map[string]string) { cli.customHTTPHeaders = headers } diff --git a/vendor/github.com/docker/docker/client/client_unix.go b/vendor/github.com/docker/docker/client/client_unix.go index 89de892c854..f5c357ca2e9 100644 --- a/vendor/github.com/docker/docker/client/client_unix.go +++ b/vendor/github.com/docker/docker/client/client_unix.go @@ -1,6 +1,9 @@ -// +build linux freebsd solaris openbsd darwin +// +build linux freebsd openbsd darwin package client // DefaultDockerHost defines os specific default if DOCKER_HOST is unset const DefaultDockerHost = "unix:///var/run/docker.sock" + +const defaultProto = "unix" +const defaultAddr = "/var/run/docker.sock" diff --git a/vendor/github.com/docker/docker/client/client_windows.go b/vendor/github.com/docker/docker/client/client_windows.go index 07c0c7a7749..5619cef445d 100644 --- a/vendor/github.com/docker/docker/client/client_windows.go +++ b/vendor/github.com/docker/docker/client/client_windows.go @@ -2,3 +2,6 @@ package client // DefaultDockerHost defines os specific default if DOCKER_HOST is unset const DefaultDockerHost = "npipe:////./pipe/docker_engine" + +const defaultProto = "npipe" +const defaultAddr = "//./pipe/docker_engine" diff --git a/vendor/github.com/docker/docker/client/config_create.go b/vendor/github.com/docker/docker/client/config_create.go index bc4a952b2f6..8dec11ba357 100644 --- a/vendor/github.com/docker/docker/client/config_create.go +++ b/vendor/github.com/docker/docker/client/config_create.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigCreate creates a new Config. diff --git a/vendor/github.com/docker/docker/client/config_inspect.go b/vendor/github.com/docker/docker/client/config_inspect.go index ebb6d636c22..42fce272930 100644 --- a/vendor/github.com/docker/docker/client/config_inspect.go +++ b/vendor/github.com/docker/docker/client/config_inspect.go @@ -2,25 +2,24 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigInspectWithRaw returns the config information with raw data func (cli *Client) ConfigInspectWithRaw(ctx context.Context, id string) (swarm.Config, []byte, error) { + if id == "" { + return swarm.Config{}, nil, objectNotFoundError{object: "config", id: id} + } if err := cli.NewVersionError("1.30", "config inspect"); err != nil { return swarm.Config{}, nil, err } resp, err := cli.get(ctx, "/configs/"+id, nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return swarm.Config{}, nil, configNotFoundError{id} - } - return swarm.Config{}, nil, err + return swarm.Config{}, nil, wrapResponseError(err, resp, "config", id) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/config_list.go b/vendor/github.com/docker/docker/client/config_list.go index 8483ca14d1a..95131d77d96 100644 --- a/vendor/github.com/docker/docker/client/config_list.go +++ b/vendor/github.com/docker/docker/client/config_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigList returns the list of configs. @@ -18,7 +18,7 @@ func (cli *Client) ConfigList(ctx context.Context, options types.ConfigListOptio query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/config_remove.go b/vendor/github.com/docker/docker/client/config_remove.go index 726b5c85303..0288630ca85 100644 --- a/vendor/github.com/docker/docker/client/config_remove.go +++ b/vendor/github.com/docker/docker/client/config_remove.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // ConfigRemove removes a Config. func (cli *Client) ConfigRemove(ctx context.Context, id string) error { @@ -9,5 +9,5 @@ func (cli *Client) ConfigRemove(ctx context.Context, id string) error { } resp, err := cli.delete(ctx, "/configs/"+id, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "config", id) } diff --git a/vendor/github.com/docker/docker/client/config_update.go b/vendor/github.com/docker/docker/client/config_update.go index 823751bb863..861a5cf537c 100644 --- a/vendor/github.com/docker/docker/client/config_update.go +++ b/vendor/github.com/docker/docker/client/config_update.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ConfigUpdate attempts to update a Config diff --git a/vendor/github.com/docker/docker/client/container_attach.go b/vendor/github.com/docker/docker/client/container_attach.go index 0fdf3ed0ce3..f140856b303 100644 --- a/vendor/github.com/docker/docker/client/container_attach.go +++ b/vendor/github.com/docker/docker/client/container_attach.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerAttach attaches a connection to a container in the server. diff --git a/vendor/github.com/docker/docker/client/container_commit.go b/vendor/github.com/docker/docker/client/container_commit.go index 531d796ee74..cc38faca5c7 100644 --- a/vendor/github.com/docker/docker/client/container_commit.go +++ b/vendor/github.com/docker/docker/client/container_commit.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "errors" "net/url" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerCommit applies changes into a container and creates a new tagged image. @@ -39,7 +39,7 @@ func (cli *Client) ContainerCommit(ctx context.Context, container string, option for _, change := range options.Changes { query.Add("changes", change) } - if options.Pause != true { + if !options.Pause { query.Set("pause", "0") } diff --git a/vendor/github.com/docker/docker/client/container_copy.go b/vendor/github.com/docker/docker/client/container_copy.go index 30ba6803f0b..4c221dfb1c3 100644 --- a/vendor/github.com/docker/docker/client/container_copy.go +++ b/vendor/github.com/docker/docker/client/container_copy.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/base64" "encoding/json" "fmt" @@ -10,8 +11,6 @@ import ( "path/filepath" "strings" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" ) @@ -23,17 +22,17 @@ func (cli *Client) ContainerStatPath(ctx context.Context, containerID, path stri urlStr := "/containers/" + containerID + "/archive" response, err := cli.head(ctx, urlStr, query, nil) if err != nil { - return types.ContainerPathStat{}, err + return types.ContainerPathStat{}, wrapResponseError(err, response, "container:path", containerID+":"+path) } defer ensureReaderClosed(response) return getContainerPathStatFromHeader(response.header) } // CopyToContainer copies content into the container filesystem. -// Note that `content` must be a Reader for a TAR -func (cli *Client) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error { +// Note that `content` must be a Reader for a TAR archive +func (cli *Client) CopyToContainer(ctx context.Context, containerID, dstPath string, content io.Reader, options types.CopyToContainerOptions) error { query := url.Values{} - query.Set("path", filepath.ToSlash(path)) // Normalize the paths used in the API. + query.Set("path", filepath.ToSlash(dstPath)) // Normalize the paths used in the API. // Do not allow for an existing directory to be overwritten by a non-directory and vice versa. if !options.AllowOverwriteDirWithFile { query.Set("noOverwriteDirNonDir", "true") @@ -43,11 +42,11 @@ func (cli *Client) CopyToContainer(ctx context.Context, container, path string, query.Set("copyUIDGID", "true") } - apiPath := "/containers/" + container + "/archive" + apiPath := "/containers/" + containerID + "/archive" response, err := cli.putRaw(ctx, apiPath, query, content, nil) if err != nil { - return err + return wrapResponseError(err, response, "container:path", containerID+":"+dstPath) } defer ensureReaderClosed(response) @@ -59,15 +58,15 @@ func (cli *Client) CopyToContainer(ctx context.Context, container, path string, } // CopyFromContainer gets the content from the container and returns it as a Reader -// to manipulate it in the host. It's up to the caller to close the reader. -func (cli *Client) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) { +// for a TAR archive to manipulate it in the host. It's up to the caller to close the reader. +func (cli *Client) CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) { query := make(url.Values, 1) query.Set("path", filepath.ToSlash(srcPath)) // Normalize the paths used in the API. - apiPath := "/containers/" + container + "/archive" + apiPath := "/containers/" + containerID + "/archive" response, err := cli.get(ctx, apiPath, query, nil) if err != nil { - return nil, types.ContainerPathStat{}, err + return nil, types.ContainerPathStat{}, wrapResponseError(err, response, "container:path", containerID+":"+srcPath) } if response.statusCode != http.StatusOK { diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go index 6841b0b2828..7f1ce014cf8 100644 --- a/vendor/github.com/docker/docker/client/container_create.go +++ b/vendor/github.com/docker/docker/client/container_create.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/json" "net/url" "strings" @@ -8,7 +9,6 @@ import ( "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" ) type configWrapper struct { @@ -45,7 +45,7 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config serverResp, err := cli.post(ctx, "/containers/create", query, body, nil) if err != nil { if serverResp.statusCode == 404 && strings.Contains(err.Error(), "No such image") { - return response, imageNotFoundError{config.Image} + return response, objectNotFoundError{object: "image", id: config.Image} } return response, err } diff --git a/vendor/github.com/docker/docker/client/container_diff.go b/vendor/github.com/docker/docker/client/container_diff.go index 884dc9feefa..056a282d6be 100644 --- a/vendor/github.com/docker/docker/client/container_diff.go +++ b/vendor/github.com/docker/docker/client/container_diff.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types/container" - "golang.org/x/net/context" ) // ContainerDiff shows differences in a container filesystem since it was started. diff --git a/vendor/github.com/docker/docker/client/container_exec.go b/vendor/github.com/docker/docker/client/container_exec.go index 0665c54fbd0..9df1fae14e3 100644 --- a/vendor/github.com/docker/docker/client/container_exec.go +++ b/vendor/github.com/docker/docker/client/container_exec.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerExecCreate creates a new exec configuration to run an exec process. @@ -35,7 +35,7 @@ func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config // It returns a types.HijackedConnection with the hijacked connection // and the a reader to get output. It's up to the called to close // the hijacked connection by calling types.HijackedResponse.Close. -func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) { +func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) { headers := map[string][]string{"Content-Type": {"application/json"}} return cli.postHijacked(ctx, "/exec/"+execID+"/start", nil, config, headers) } diff --git a/vendor/github.com/docker/docker/client/container_export.go b/vendor/github.com/docker/docker/client/container_export.go index 52194f3d342..35ee07d39ff 100644 --- a/vendor/github.com/docker/docker/client/container_export.go +++ b/vendor/github.com/docker/docker/client/container_export.go @@ -1,10 +1,9 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" ) // ContainerExport retrieves the raw contents of a container diff --git a/vendor/github.com/docker/docker/client/container_inspect.go b/vendor/github.com/docker/docker/client/container_inspect.go index 17f1809747b..92164e3515e 100644 --- a/vendor/github.com/docker/docker/client/container_inspect.go +++ b/vendor/github.com/docker/docker/client/container_inspect.go @@ -2,23 +2,22 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerInspect returns the container information. func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) { + if containerID == "" { + return types.ContainerJSON{}, objectNotFoundError{object: "container", id: containerID} + } serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ContainerJSON{}, containerNotFoundError{containerID} - } - return types.ContainerJSON{}, err + return types.ContainerJSON{}, wrapResponseError(err, serverResp, "container", containerID) } var response types.ContainerJSON @@ -29,16 +28,16 @@ func (cli *Client) ContainerInspect(ctx context.Context, containerID string) (ty // ContainerInspectWithRaw returns the container information and its raw representation. func (cli *Client) ContainerInspectWithRaw(ctx context.Context, containerID string, getSize bool) (types.ContainerJSON, []byte, error) { + if containerID == "" { + return types.ContainerJSON{}, nil, objectNotFoundError{object: "container", id: containerID} + } query := url.Values{} if getSize { query.Set("size", "1") } serverResp, err := cli.get(ctx, "/containers/"+containerID+"/json", query, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ContainerJSON{}, nil, containerNotFoundError{containerID} - } - return types.ContainerJSON{}, nil, err + return types.ContainerJSON{}, nil, wrapResponseError(err, serverResp, "container", containerID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/container_kill.go b/vendor/github.com/docker/docker/client/container_kill.go index 29f80c73ade..83dc9317e89 100644 --- a/vendor/github.com/docker/docker/client/container_kill.go +++ b/vendor/github.com/docker/docker/client/container_kill.go @@ -1,9 +1,8 @@ package client import ( + "context" "net/url" - - "golang.org/x/net/context" ) // ContainerKill terminates the container process but does not remove the container from the docker host. diff --git a/vendor/github.com/docker/docker/client/container_list.go b/vendor/github.com/docker/docker/client/container_list.go index 43989121970..ecee3dd5911 100644 --- a/vendor/github.com/docker/docker/client/container_list.go +++ b/vendor/github.com/docker/docker/client/container_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "strconv" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // ContainerList returns the list of containers in the docker host. diff --git a/vendor/github.com/docker/docker/client/container_logs.go b/vendor/github.com/docker/docker/client/container_logs.go index 0f32e9f12bd..58ebda7c7a4 100644 --- a/vendor/github.com/docker/docker/client/container_logs.go +++ b/vendor/github.com/docker/docker/client/container_logs.go @@ -1,14 +1,14 @@ package client import ( + "context" "io" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" timetypes "github.com/docker/docker/api/types/time" + "github.com/pkg/errors" ) // ContainerLogs returns the logs generated by a container in an io.ReadCloser. @@ -46,11 +46,19 @@ func (cli *Client) ContainerLogs(ctx context.Context, container string, options if options.Since != "" { ts, err := timetypes.GetTimestamp(options.Since, time.Now()) if err != nil { - return nil, err + return nil, errors.Wrap(err, `invalid value for "since"`) } query.Set("since", ts) } + if options.Until != "" { + ts, err := timetypes.GetTimestamp(options.Until, time.Now()) + if err != nil { + return nil, errors.Wrap(err, `invalid value for "until"`) + } + query.Set("until", ts) + } + if options.Timestamps { query.Set("timestamps", "1") } @@ -66,7 +74,7 @@ func (cli *Client) ContainerLogs(ctx context.Context, container string, options resp, err := cli.get(ctx, "/containers/"+container+"/logs", query, nil) if err != nil { - return nil, err + return nil, wrapResponseError(err, resp, "container", container) } return resp.body, nil } diff --git a/vendor/github.com/docker/docker/client/container_pause.go b/vendor/github.com/docker/docker/client/container_pause.go index 412067a7821..5b2f46c38de 100644 --- a/vendor/github.com/docker/docker/client/container_pause.go +++ b/vendor/github.com/docker/docker/client/container_pause.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // ContainerPause pauses the main process of a given container without terminating it. func (cli *Client) ContainerPause(ctx context.Context, containerID string) error { diff --git a/vendor/github.com/docker/docker/client/container_prune.go b/vendor/github.com/docker/docker/client/container_prune.go index b5821708676..9f25e9c5daf 100644 --- a/vendor/github.com/docker/docker/client/container_prune.go +++ b/vendor/github.com/docker/docker/client/container_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // ContainersPrune requests the daemon to delete unused data diff --git a/vendor/github.com/docker/docker/client/container_remove.go b/vendor/github.com/docker/docker/client/container_remove.go index 3a79590ced9..d1c682b8011 100644 --- a/vendor/github.com/docker/docker/client/container_remove.go +++ b/vendor/github.com/docker/docker/client/container_remove.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerRemove kills and removes a container from the docker host. @@ -23,5 +23,5 @@ func (cli *Client) ContainerRemove(ctx context.Context, containerID string, opti resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "container", containerID) } diff --git a/vendor/github.com/docker/docker/client/container_rename.go b/vendor/github.com/docker/docker/client/container_rename.go index 0e718da7c6e..d4305720ad6 100644 --- a/vendor/github.com/docker/docker/client/container_rename.go +++ b/vendor/github.com/docker/docker/client/container_rename.go @@ -1,9 +1,8 @@ package client import ( + "context" "net/url" - - "golang.org/x/net/context" ) // ContainerRename changes the name of a given container. diff --git a/vendor/github.com/docker/docker/client/container_resize.go b/vendor/github.com/docker/docker/client/container_resize.go index 66c3cc1940c..1805b0132fa 100644 --- a/vendor/github.com/docker/docker/client/container_resize.go +++ b/vendor/github.com/docker/docker/client/container_resize.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerResize changes the size of the tty for a container. diff --git a/vendor/github.com/docker/docker/client/container_restart.go b/vendor/github.com/docker/docker/client/container_restart.go index 74d7455f022..39169ad6cbc 100644 --- a/vendor/github.com/docker/docker/client/container_restart.go +++ b/vendor/github.com/docker/docker/client/container_restart.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "time" timetypes "github.com/docker/docker/api/types/time" - "golang.org/x/net/context" ) // ContainerRestart stops and starts a container again. diff --git a/vendor/github.com/docker/docker/client/container_start.go b/vendor/github.com/docker/docker/client/container_start.go index b1f08de4163..cea5c0d3b9c 100644 --- a/vendor/github.com/docker/docker/client/container_start.go +++ b/vendor/github.com/docker/docker/client/container_start.go @@ -1,10 +1,9 @@ package client import ( + "context" "net/url" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" ) diff --git a/vendor/github.com/docker/docker/client/container_stats.go b/vendor/github.com/docker/docker/client/container_stats.go index 4758c66e320..7df79e0e66f 100644 --- a/vendor/github.com/docker/docker/client/container_stats.go +++ b/vendor/github.com/docker/docker/client/container_stats.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ContainerStats returns near realtime stats for a given container. diff --git a/vendor/github.com/docker/docker/client/container_stop.go b/vendor/github.com/docker/docker/client/container_stop.go index b5418ae8c88..c08fb193a19 100644 --- a/vendor/github.com/docker/docker/client/container_stop.go +++ b/vendor/github.com/docker/docker/client/container_stop.go @@ -1,15 +1,20 @@ package client import ( + "context" "net/url" "time" timetypes "github.com/docker/docker/api/types/time" - "golang.org/x/net/context" ) -// ContainerStop stops a container without terminating the process. -// The process is blocked until the container stops or the timeout expires. +// ContainerStop stops a container. In case the container fails to stop +// gracefully within a time frame specified by the timeout argument, +// it is forcefully terminated (killed). +// +// If the timeout is nil, the container's StopTimeout value is used, if set, +// otherwise the engine default. A negative timeout value can be specified, +// meaning no timeout, i.e. no forceful termination is performed. func (cli *Client) ContainerStop(ctx context.Context, containerID string, timeout *time.Duration) error { query := url.Values{} if timeout != nil { diff --git a/vendor/github.com/docker/docker/client/container_top.go b/vendor/github.com/docker/docker/client/container_top.go index 9689123a400..ba2aad50e6a 100644 --- a/vendor/github.com/docker/docker/client/container_top.go +++ b/vendor/github.com/docker/docker/client/container_top.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "net/url" "strings" "github.com/docker/docker/api/types/container" - "golang.org/x/net/context" ) // ContainerTop shows process information from within a container. diff --git a/vendor/github.com/docker/docker/client/container_unpause.go b/vendor/github.com/docker/docker/client/container_unpause.go index 5c76211256c..6eeec9c249d 100644 --- a/vendor/github.com/docker/docker/client/container_unpause.go +++ b/vendor/github.com/docker/docker/client/container_unpause.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // ContainerUnpause resumes the process execution within a container func (cli *Client) ContainerUnpause(ctx context.Context, containerID string) error { diff --git a/vendor/github.com/docker/docker/client/container_update.go b/vendor/github.com/docker/docker/client/container_update.go index 5082f22dfab..624a6726240 100644 --- a/vendor/github.com/docker/docker/client/container_update.go +++ b/vendor/github.com/docker/docker/client/container_update.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types/container" - "golang.org/x/net/context" ) // ContainerUpdate updates resources of a container diff --git a/vendor/github.com/docker/docker/client/container_wait.go b/vendor/github.com/docker/docker/client/container_wait.go index 854c6c053ba..2fdf0913318 100644 --- a/vendor/github.com/docker/docker/client/container_wait.go +++ b/vendor/github.com/docker/docker/client/container_wait.go @@ -1,11 +1,10 @@ package client import ( + "context" "encoding/json" "net/url" - "golang.org/x/net/context" - "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/versions" ) diff --git a/vendor/github.com/docker/docker/client/disk_usage.go b/vendor/github.com/docker/docker/client/disk_usage.go index 03c80b39afa..b9417a21867 100644 --- a/vendor/github.com/docker/docker/client/disk_usage.go +++ b/vendor/github.com/docker/docker/client/disk_usage.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // DiskUsage requests the current data usage from the daemon diff --git a/vendor/github.com/docker/docker/client/distribution_inspect.go b/vendor/github.com/docker/docker/client/distribution_inspect.go index aa5bc6a6c65..79e8f6fc70b 100644 --- a/vendor/github.com/docker/docker/client/distribution_inspect.go +++ b/vendor/github.com/docker/docker/client/distribution_inspect.go @@ -1,17 +1,20 @@ package client import ( + "context" "encoding/json" "net/url" registrytypes "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" ) // DistributionInspect returns the image digest with full Manifest func (cli *Client) DistributionInspect(ctx context.Context, image, encodedRegistryAuth string) (registrytypes.DistributionInspect, error) { // Contact the registry to retrieve digest and platform information var distributionInspect registrytypes.DistributionInspect + if image == "" { + return distributionInspect, objectNotFoundError{object: "distribution", id: image} + } if err := cli.NewVersionError("1.30", "distribution inspect"); err != nil { return distributionInspect, err diff --git a/vendor/github.com/docker/docker/client/errors.go b/vendor/github.com/docker/docker/client/errors.go index fc7df9f1ebe..784357f195c 100644 --- a/vendor/github.com/docker/docker/client/errors.go +++ b/vendor/github.com/docker/docker/client/errors.go @@ -2,6 +2,7 @@ package client import ( "fmt" + "net/http" "github.com/docker/docker/api/types/versions" "github.com/pkg/errors" @@ -36,95 +37,37 @@ type notFound interface { NotFound() bool // Is the error a NotFound error } -// IsErrNotFound returns true if the error is caused with an -// object (image, container, network, volume, …) is not found in the docker host. +// IsErrNotFound returns true if the error is a NotFound error, which is returned +// by the API when some object is not found. func IsErrNotFound(err error) bool { te, ok := err.(notFound) return ok && te.NotFound() } -// imageNotFoundError implements an error returned when an image is not in the docker host. -type imageNotFoundError struct { - imageID string +type objectNotFoundError struct { + object string + id string } -// NotFound indicates that this error type is of NotFound -func (e imageNotFoundError) NotFound() bool { +func (e objectNotFoundError) NotFound() bool { return true } -// Error returns a string representation of an imageNotFoundError -func (e imageNotFoundError) Error() string { - return fmt.Sprintf("Error: No such image: %s", e.imageID) +func (e objectNotFoundError) Error() string { + return fmt.Sprintf("Error: No such %s: %s", e.object, e.id) } -// IsErrImageNotFound returns true if the error is caused -// when an image is not found in the docker host. -func IsErrImageNotFound(err error) bool { - return IsErrNotFound(err) -} - -// containerNotFoundError implements an error returned when a container is not in the docker host. -type containerNotFoundError struct { - containerID string -} - -// NotFound indicates that this error type is of NotFound -func (e containerNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a containerNotFoundError -func (e containerNotFoundError) Error() string { - return fmt.Sprintf("Error: No such container: %s", e.containerID) -} - -// IsErrContainerNotFound returns true if the error is caused -// when a container is not found in the docker host. -func IsErrContainerNotFound(err error) bool { - return IsErrNotFound(err) -} - -// networkNotFoundError implements an error returned when a network is not in the docker host. -type networkNotFoundError struct { - networkID string -} - -// NotFound indicates that this error type is of NotFound -func (e networkNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a networkNotFoundError -func (e networkNotFoundError) Error() string { - return fmt.Sprintf("Error: No such network: %s", e.networkID) -} - -// IsErrNetworkNotFound returns true if the error is caused -// when a network is not found in the docker host. -func IsErrNetworkNotFound(err error) bool { - return IsErrNotFound(err) -} - -// volumeNotFoundError implements an error returned when a volume is not in the docker host. -type volumeNotFoundError struct { - volumeID string -} - -// NotFound indicates that this error type is of NotFound -func (e volumeNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a volumeNotFoundError -func (e volumeNotFoundError) Error() string { - return fmt.Sprintf("Error: No such volume: %s", e.volumeID) -} - -// IsErrVolumeNotFound returns true if the error is caused -// when a volume is not found in the docker host. -func IsErrVolumeNotFound(err error) bool { - return IsErrNotFound(err) +func wrapResponseError(err error, resp serverResponse, object, id string) error { + switch { + case err == nil: + return nil + case resp.statusCode == http.StatusNotFound: + return objectNotFoundError{object: object, id: id} + case resp.statusCode == http.StatusNotImplemented: + return notImplementedError{message: err.Error()} + default: + return err + } } // unauthorizedError represents an authorization error in a remote registry. @@ -144,72 +87,6 @@ func IsErrUnauthorized(err error) bool { return ok } -// nodeNotFoundError implements an error returned when a node is not found. -type nodeNotFoundError struct { - nodeID string -} - -// Error returns a string representation of a nodeNotFoundError -func (e nodeNotFoundError) Error() string { - return fmt.Sprintf("Error: No such node: %s", e.nodeID) -} - -// NotFound indicates that this error type is of NotFound -func (e nodeNotFoundError) NotFound() bool { - return true -} - -// IsErrNodeNotFound returns true if the error is caused -// when a node is not found. -func IsErrNodeNotFound(err error) bool { - _, ok := err.(nodeNotFoundError) - return ok -} - -// serviceNotFoundError implements an error returned when a service is not found. -type serviceNotFoundError struct { - serviceID string -} - -// Error returns a string representation of a serviceNotFoundError -func (e serviceNotFoundError) Error() string { - return fmt.Sprintf("Error: No such service: %s", e.serviceID) -} - -// NotFound indicates that this error type is of NotFound -func (e serviceNotFoundError) NotFound() bool { - return true -} - -// IsErrServiceNotFound returns true if the error is caused -// when a service is not found. -func IsErrServiceNotFound(err error) bool { - _, ok := err.(serviceNotFoundError) - return ok -} - -// taskNotFoundError implements an error returned when a task is not found. -type taskNotFoundError struct { - taskID string -} - -// Error returns a string representation of a taskNotFoundError -func (e taskNotFoundError) Error() string { - return fmt.Sprintf("Error: No such task: %s", e.taskID) -} - -// NotFound indicates that this error type is of NotFound -func (e taskNotFoundError) NotFound() bool { - return true -} - -// IsErrTaskNotFound returns true if the error is caused -// when a task is not found. -func IsErrTaskNotFound(err error) bool { - _, ok := err.(taskNotFoundError) - return ok -} - type pluginPermissionDenied struct { name string } @@ -225,6 +102,26 @@ func IsErrPluginPermissionDenied(err error) bool { return ok } +type notImplementedError struct { + message string +} + +func (e notImplementedError) Error() string { + return e.message +} + +func (e notImplementedError) NotImplemented() bool { + return true +} + +// IsErrNotImplemented returns true if the error is a NotImplemented error. +// This is returned by the API when a requested feature has not been +// implemented. +func IsErrNotImplemented(err error) bool { + te, ok := err.(notImplementedError) + return ok && te.NotImplemented() +} + // NewVersionError returns an error if the APIVersion required // if less than the current supported version func (cli *Client) NewVersionError(APIrequired, feature string) error { @@ -233,68 +130,3 @@ func (cli *Client) NewVersionError(APIrequired, feature string) error { } return nil } - -// secretNotFoundError implements an error returned when a secret is not found. -type secretNotFoundError struct { - name string -} - -// Error returns a string representation of a secretNotFoundError -func (e secretNotFoundError) Error() string { - return fmt.Sprintf("Error: no such secret: %s", e.name) -} - -// NotFound indicates that this error type is of NotFound -func (e secretNotFoundError) NotFound() bool { - return true -} - -// IsErrSecretNotFound returns true if the error is caused -// when a secret is not found. -func IsErrSecretNotFound(err error) bool { - _, ok := err.(secretNotFoundError) - return ok -} - -// configNotFoundError implements an error returned when a config is not found. -type configNotFoundError struct { - name string -} - -// Error returns a string representation of a configNotFoundError -func (e configNotFoundError) Error() string { - return fmt.Sprintf("Error: no such config: %s", e.name) -} - -// NotFound indicates that this error type is of NotFound -func (e configNotFoundError) NotFound() bool { - return true -} - -// IsErrConfigNotFound returns true if the error is caused -// when a config is not found. -func IsErrConfigNotFound(err error) bool { - _, ok := err.(configNotFoundError) - return ok -} - -// pluginNotFoundError implements an error returned when a plugin is not in the docker host. -type pluginNotFoundError struct { - name string -} - -// NotFound indicates that this error type is of NotFound -func (e pluginNotFoundError) NotFound() bool { - return true -} - -// Error returns a string representation of a pluginNotFoundError -func (e pluginNotFoundError) Error() string { - return fmt.Sprintf("Error: No such plugin: %s", e.name) -} - -// IsErrPluginNotFound returns true if the error is caused -// when a plugin is not found in the docker host. -func IsErrPluginNotFound(err error) bool { - return IsErrNotFound(err) -} diff --git a/vendor/github.com/docker/docker/client/events.go b/vendor/github.com/docker/docker/client/events.go index af47aefa74c..8b77a0f988b 100644 --- a/vendor/github.com/docker/docker/client/events.go +++ b/vendor/github.com/docker/docker/client/events.go @@ -1,12 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/events" "github.com/docker/docker/api/types/filters" diff --git a/vendor/github.com/docker/docker/client/hijack.go b/vendor/github.com/docker/docker/client/hijack.go index 8cf0119f3dd..636f2bbfc39 100644 --- a/vendor/github.com/docker/docker/client/hijack.go +++ b/vendor/github.com/docker/docker/client/hijack.go @@ -2,37 +2,20 @@ package client import ( "bufio" + "context" "crypto/tls" "fmt" "net" "net/http" "net/http/httputil" "net/url" - "strings" "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/pkg/tlsconfig" "github.com/docker/go-connections/sockets" "github.com/pkg/errors" - "golang.org/x/net/context" ) -// tlsClientCon holds tls information and a dialed connection. -type tlsClientCon struct { - *tls.Conn - rawConn net.Conn -} - -func (c *tlsClientCon) CloseWrite() error { - // Go standard tls.Conn doesn't provide the CloseWrite() method so we do it - // on its underlying connection. - if conn, ok := c.rawConn.(types.CloseWriter); ok { - return conn.CloseWrite() - } - return nil -} - // postHijacked sends a POST request and hijacks the connection. func (cli *Client) postHijacked(ctx context.Context, path string, query url.Values, body interface{}, headers map[string][]string) (types.HijackedResponse, error) { bodyEncoded, err := encodeData(body) @@ -55,96 +38,9 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu return types.HijackedResponse{Conn: conn, Reader: bufio.NewReader(conn)}, err } -func tlsDial(network, addr string, config *tls.Config) (net.Conn, error) { - return tlsDialWithDialer(new(net.Dialer), network, addr, config) -} - -// We need to copy Go's implementation of tls.Dial (pkg/cryptor/tls/tls.go) in -// order to return our custom tlsClientCon struct which holds both the tls.Conn -// object _and_ its underlying raw connection. The rationale for this is that -// we need to be able to close the write end of the connection when attaching, -// which tls.Conn does not provide. -func tlsDialWithDialer(dialer *net.Dialer, network, addr string, config *tls.Config) (net.Conn, error) { - // We want the Timeout and Deadline values from dialer to cover the - // whole process: TCP connection and TLS handshake. This means that we - // also need to start our own timers now. - timeout := dialer.Timeout - - if !dialer.Deadline.IsZero() { - deadlineTimeout := dialer.Deadline.Sub(time.Now()) - if timeout == 0 || deadlineTimeout < timeout { - timeout = deadlineTimeout - } - } - - var errChannel chan error - - if timeout != 0 { - errChannel = make(chan error, 2) - time.AfterFunc(timeout, func() { - errChannel <- errors.New("") - }) - } - - proxyDialer, err := sockets.DialerFromEnvironment(dialer) - if err != nil { - return nil, err - } - - rawConn, err := proxyDialer.Dial(network, addr) - if err != nil { - return nil, err - } - // When we set up a TCP connection for hijack, there could be long periods - // of inactivity (a long running command with no output) that in certain - // network setups may cause ECONNTIMEOUT, leaving the client in an unknown - // state. Setting TCP KeepAlive on the socket connection will prohibit - // ECONNTIMEOUT unless the socket connection truly is broken - if tcpConn, ok := rawConn.(*net.TCPConn); ok { - tcpConn.SetKeepAlive(true) - tcpConn.SetKeepAlivePeriod(30 * time.Second) - } - - colonPos := strings.LastIndex(addr, ":") - if colonPos == -1 { - colonPos = len(addr) - } - hostname := addr[:colonPos] - - // If no ServerName is set, infer the ServerName - // from the hostname we're connecting to. - if config.ServerName == "" { - // Make a copy to avoid polluting argument or default. - config = tlsconfig.Clone(config) - config.ServerName = hostname - } - - conn := tls.Client(rawConn, config) - - if timeout == 0 { - err = conn.Handshake() - } else { - go func() { - errChannel <- conn.Handshake() - }() - - err = <-errChannel - } - - if err != nil { - rawConn.Close() - return nil, err - } - - // This is Docker difference with standard's crypto/tls package: returned a - // wrapper which holds both the TLS and raw connections. - return &tlsClientCon{conn, rawConn}, nil -} - func dial(proto, addr string, tlsConfig *tls.Config) (net.Conn, error) { if tlsConfig != nil && proto != "unix" && proto != "npipe" { - // Notice this isn't Go standard's tls.Dial function - return tlsDial(proto, addr, tlsConfig) + return tls.Dial(proto, addr, tlsConfig) } if proto == "npipe" { return sockets.DialPipe(addr, 32*time.Second) @@ -189,8 +85,14 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (net.Conn, e c, br := clientconn.Hijack() if br.Buffered() > 0 { - // If there is buffered content, wrap the connection - c = &hijackedConn{c, br} + // If there is buffered content, wrap the connection. We return an + // object that implements CloseWrite iff the underlying connection + // implements it. + if _, ok := c.(types.CloseWriter); ok { + c = &hijackedConnCloseWriter{&hijackedConn{c, br}} + } else { + c = &hijackedConn{c, br} + } } else { br.Reset(nil) } @@ -198,6 +100,10 @@ func (cli *Client) setupHijackConn(req *http.Request, proto string) (net.Conn, e return c, nil } +// hijackedConn wraps a net.Conn and is returned by setupHijackConn in the case +// that a) there was already buffered data in the http layer when Hijack() was +// called, and b) the underlying net.Conn does *not* implement CloseWrite(). +// hijackedConn does not implement CloseWrite() either. type hijackedConn struct { net.Conn r *bufio.Reader @@ -206,3 +112,18 @@ type hijackedConn struct { func (c *hijackedConn) Read(b []byte) (int, error) { return c.r.Read(b) } + +// hijackedConnCloseWriter is a hijackedConn which additionally implements +// CloseWrite(). It is returned by setupHijackConn in the case that a) there +// was already buffered data in the http layer when Hijack() was called, and b) +// the underlying net.Conn *does* implement CloseWrite(). +type hijackedConnCloseWriter struct { + *hijackedConn +} + +var _ types.CloseWriter = &hijackedConnCloseWriter{} + +func (c *hijackedConnCloseWriter) CloseWrite() error { + conn := c.Conn.(types.CloseWriter) + return conn.CloseWrite() +} diff --git a/vendor/github.com/docker/docker/client/image_build.go b/vendor/github.com/docker/docker/client/image_build.go index 44a215f900f..68f93e119dd 100644 --- a/vendor/github.com/docker/docker/client/image_build.go +++ b/vendor/github.com/docker/docker/client/image_build.go @@ -1,14 +1,14 @@ package client import ( + "context" "encoding/base64" "encoding/json" "io" "net/http" "net/url" "strconv" - - "golang.org/x/net/context" + "strings" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" @@ -29,6 +29,13 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio return types.ImageBuildResponse{}, err } headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf)) + + if options.Platform != "" { + if err := cli.NewVersionError("1.32", "platform"); err != nil { + return types.ImageBuildResponse{}, err + } + query.Set("platform", options.Platform) + } headers.Set("Content-Type", "application/x-tar") serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers) @@ -123,6 +130,8 @@ func (cli *Client) imageBuildOptionsToQuery(options types.ImageBuildOptions) (ur if options.SessionID != "" { query.Set("session", options.SessionID) } - + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } return query, nil } diff --git a/vendor/github.com/docker/docker/client/image_create.go b/vendor/github.com/docker/docker/client/image_create.go index 4436abb0dd3..f241a8e1c58 100644 --- a/vendor/github.com/docker/docker/client/image_create.go +++ b/vendor/github.com/docker/docker/client/image_create.go @@ -1,10 +1,10 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" @@ -21,6 +21,9 @@ func (cli *Client) ImageCreate(ctx context.Context, parentReference string, opti query := url.Values{} query.Set("fromImage", reference.FamiliarName(ref)) query.Set("tag", getAPITagFromNamedRef(ref)) + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/image_history.go b/vendor/github.com/docker/docker/client/image_history.go index 7b4babcba38..7bae4ed3cdf 100644 --- a/vendor/github.com/docker/docker/client/image_history.go +++ b/vendor/github.com/docker/docker/client/image_history.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types/image" - "golang.org/x/net/context" ) // ImageHistory returns the changes in an image in history format. diff --git a/vendor/github.com/docker/docker/client/image_import.go b/vendor/github.com/docker/docker/client/image_import.go index d7dedd82321..1d39dccf05c 100644 --- a/vendor/github.com/docker/docker/client/image_import.go +++ b/vendor/github.com/docker/docker/client/image_import.go @@ -1,10 +1,10 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" @@ -25,6 +25,9 @@ func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSour query.Set("repo", ref) query.Set("tag", options.Tag) query.Set("message", options.Message) + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } for _, change := range options.Changes { query.Add("changes", change) } diff --git a/vendor/github.com/docker/docker/client/image_inspect.go b/vendor/github.com/docker/docker/client/image_inspect.go index b3a64ce2f88..1e063f9af60 100644 --- a/vendor/github.com/docker/docker/client/image_inspect.go +++ b/vendor/github.com/docker/docker/client/image_inspect.go @@ -2,22 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ImageInspectWithRaw returns the image information and its raw representation. func (cli *Client) ImageInspectWithRaw(ctx context.Context, imageID string) (types.ImageInspect, []byte, error) { + if imageID == "" { + return types.ImageInspect{}, nil, objectNotFoundError{object: "image", id: imageID} + } serverResp, err := cli.get(ctx, "/images/"+imageID+"/json", nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return types.ImageInspect{}, nil, imageNotFoundError{imageID} - } - return types.ImageInspect{}, nil, err + return types.ImageInspect{}, nil, wrapResponseError(err, serverResp, "image", imageID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/image_list.go b/vendor/github.com/docker/docker/client/image_list.go index f26464f67c7..7e4714bc152 100644 --- a/vendor/github.com/docker/docker/client/image_list.go +++ b/vendor/github.com/docker/docker/client/image_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" ) // ImageList returns a list of images in the docker host. diff --git a/vendor/github.com/docker/docker/client/image_load.go b/vendor/github.com/docker/docker/client/image_load.go index 77aaf1af363..6b8dedc1443 100644 --- a/vendor/github.com/docker/docker/client/image_load.go +++ b/vendor/github.com/docker/docker/client/image_load.go @@ -1,11 +1,10 @@ package client import ( + "context" "io" "net/url" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" ) diff --git a/vendor/github.com/docker/docker/client/image_prune.go b/vendor/github.com/docker/docker/client/image_prune.go index 5ef98b7f020..5f772efe5b2 100644 --- a/vendor/github.com/docker/docker/client/image_prune.go +++ b/vendor/github.com/docker/docker/client/image_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // ImagesPrune requests the daemon to delete unused data diff --git a/vendor/github.com/docker/docker/client/image_pull.go b/vendor/github.com/docker/docker/client/image_pull.go index a72b9bf7fcb..c2ae35816f1 100644 --- a/vendor/github.com/docker/docker/client/image_pull.go +++ b/vendor/github.com/docker/docker/client/image_pull.go @@ -1,11 +1,11 @@ package client import ( + "context" "io" "net/http" "net/url" - - "golang.org/x/net/context" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" @@ -30,6 +30,9 @@ func (cli *Client) ImagePull(ctx context.Context, refStr string, options types.I if !options.All { query.Set("tag", getAPITagFromNamedRef(ref)) } + if options.Platform != "" { + query.Set("platform", strings.ToLower(options.Platform)) + } resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) if resp.statusCode == http.StatusUnauthorized && options.PrivilegeFunc != nil { diff --git a/vendor/github.com/docker/docker/client/image_push.go b/vendor/github.com/docker/docker/client/image_push.go index 410d2fb91d5..54d4b1491c5 100644 --- a/vendor/github.com/docker/docker/client/image_push.go +++ b/vendor/github.com/docker/docker/client/image_push.go @@ -1,13 +1,12 @@ package client import ( + "context" "errors" "io" "net/http" "net/url" - "golang.org/x/net/context" - "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" ) diff --git a/vendor/github.com/docker/docker/client/image_remove.go b/vendor/github.com/docker/docker/client/image_remove.go index 6921209ee16..bf59afdba28 100644 --- a/vendor/github.com/docker/docker/client/image_remove.go +++ b/vendor/github.com/docker/docker/client/image_remove.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ImageRemove removes an image from the docker host. @@ -19,12 +19,12 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options type query.Set("noprune", "1") } + var dels []types.ImageDeleteResponseItem resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) if err != nil { - return nil, err + return dels, wrapResponseError(err, resp, "image", imageID) } - var dels []types.ImageDeleteResponseItem err = json.NewDecoder(resp.body).Decode(&dels) ensureReaderClosed(resp) return dels, err diff --git a/vendor/github.com/docker/docker/client/image_save.go b/vendor/github.com/docker/docker/client/image_save.go index ecac880a32c..1d2bb58762a 100644 --- a/vendor/github.com/docker/docker/client/image_save.go +++ b/vendor/github.com/docker/docker/client/image_save.go @@ -1,10 +1,9 @@ package client import ( + "context" "io" "net/url" - - "golang.org/x/net/context" ) // ImageSave retrieves one or more images from the docker host as an io.ReadCloser. diff --git a/vendor/github.com/docker/docker/client/image_search.go b/vendor/github.com/docker/docker/client/image_search.go index b0fcd5c23da..054f8824ad2 100644 --- a/vendor/github.com/docker/docker/client/image_search.go +++ b/vendor/github.com/docker/docker/client/image_search.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/json" "fmt" "net/http" @@ -9,7 +10,6 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" ) // ImageSearch makes the docker host to search by a term in a remote registry. @@ -21,7 +21,7 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options types.I query.Set("limit", fmt.Sprintf("%d", options.Limit)) if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return results, err } diff --git a/vendor/github.com/docker/docker/client/image_tag.go b/vendor/github.com/docker/docker/client/image_tag.go index 8924f71eb3e..055e232c326 100644 --- a/vendor/github.com/docker/docker/client/image_tag.go +++ b/vendor/github.com/docker/docker/client/image_tag.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "github.com/docker/distribution/reference" "github.com/pkg/errors" - "golang.org/x/net/context" ) // ImageTag tags an image in the docker host diff --git a/vendor/github.com/docker/docker/client/info.go b/vendor/github.com/docker/docker/client/info.go index ac079612246..66e92ee8d0d 100644 --- a/vendor/github.com/docker/docker/client/info.go +++ b/vendor/github.com/docker/docker/client/info.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // Info returns information about the docker server. diff --git a/vendor/github.com/docker/docker/client/interface.go b/vendor/github.com/docker/docker/client/interface.go index acd4de1dbde..be9ea35b245 100644 --- a/vendor/github.com/docker/docker/client/interface.go +++ b/vendor/github.com/docker/docker/client/interface.go @@ -1,20 +1,21 @@ package client import ( + "context" "io" "net" + "net/http" "time" "github.com/docker/docker/api/types" - "github.com/docker/docker/api/types/container" + containertypes "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/events" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/image" - "github.com/docker/docker/api/types/network" + networktypes "github.com/docker/docker/api/types/network" "github.com/docker/docker/api/types/registry" "github.com/docker/docker/api/types/swarm" volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" ) // CommonAPIClient is the common methods between stable and experimental versions of APIClient. @@ -33,19 +34,21 @@ type CommonAPIClient interface { VolumeAPIClient ClientVersion() string DaemonHost() string + HTTPClient() *http.Client ServerVersion(ctx context.Context) (types.Version, error) NegotiateAPIVersion(ctx context.Context) NegotiateAPIVersionPing(types.Ping) DialSession(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error) + Close() error } // ContainerAPIClient defines API client methods for the containers type ContainerAPIClient interface { ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.IDResponse, error) - ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (container.ContainerCreateCreatedBody, error) - ContainerDiff(ctx context.Context, container string) ([]container.ContainerChangeResponseItem, error) - ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) + ContainerCreate(ctx context.Context, config *containertypes.Config, hostConfig *containertypes.HostConfig, networkingConfig *networktypes.NetworkingConfig, containerName string) (containertypes.ContainerCreateCreatedBody, error) + ContainerDiff(ctx context.Context, container string) ([]containertypes.ContainerChangeResponseItem, error) + ContainerExecAttach(ctx context.Context, execID string, config types.ExecStartCheck) (types.HijackedResponse, error) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.IDResponse, error) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error @@ -65,10 +68,10 @@ type ContainerAPIClient interface { ContainerStats(ctx context.Context, container string, stream bool) (types.ContainerStats, error) ContainerStart(ctx context.Context, container string, options types.ContainerStartOptions) error ContainerStop(ctx context.Context, container string, timeout *time.Duration) error - ContainerTop(ctx context.Context, container string, arguments []string) (container.ContainerTopOKBody, error) + ContainerTop(ctx context.Context, container string, arguments []string) (containertypes.ContainerTopOKBody, error) ContainerUnpause(ctx context.Context, container string) error - ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) (container.ContainerUpdateOKBody, error) - ContainerWait(ctx context.Context, container string, condition container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error) + ContainerUpdate(ctx context.Context, container string, updateConfig containertypes.UpdateConfig) (containertypes.ContainerUpdateOKBody, error) + ContainerWait(ctx context.Context, container string, condition containertypes.WaitCondition) (<-chan containertypes.ContainerWaitOKBody, <-chan error) CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) CopyToContainer(ctx context.Context, container, path string, content io.Reader, options types.CopyToContainerOptions) error ContainersPrune(ctx context.Context, pruneFilters filters.Args) (types.ContainersPruneReport, error) @@ -100,13 +103,13 @@ type ImageAPIClient interface { // NetworkAPIClient defines API client methods for the networks type NetworkAPIClient interface { - NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error + NetworkConnect(ctx context.Context, network, container string, config *networktypes.EndpointSettings) error NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) - NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error - NetworkInspect(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, error) - NetworkInspectWithRaw(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) + NetworkDisconnect(ctx context.Context, network, container string, force bool) error + NetworkInspect(ctx context.Context, network string, options types.NetworkInspectOptions) (types.NetworkResource, error) + NetworkInspectWithRaw(ctx context.Context, network string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) - NetworkRemove(ctx context.Context, networkID string) error + NetworkRemove(ctx context.Context, network string) error NetworksPrune(ctx context.Context, pruneFilter filters.Args) (types.NetworksPruneReport, error) } @@ -167,10 +170,10 @@ type SystemAPIClient interface { // VolumeAPIClient defines API client methods for the volumes type VolumeAPIClient interface { - VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) + VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) - VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) + VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumeListOKBody, error) VolumeRemove(ctx context.Context, volumeID string, force bool) error VolumesPrune(ctx context.Context, pruneFilter filters.Args) (types.VolumesPruneReport, error) } diff --git a/vendor/github.com/docker/docker/client/interface_experimental.go b/vendor/github.com/docker/docker/client/interface_experimental.go index 51da98ecdde..5bf00bc158a 100644 --- a/vendor/github.com/docker/docker/client/interface_experimental.go +++ b/vendor/github.com/docker/docker/client/interface_experimental.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) type apiClientExperimental interface { diff --git a/vendor/github.com/docker/docker/client/login.go b/vendor/github.com/docker/docker/client/login.go index 79219ff59cb..a9781f9d810 100644 --- a/vendor/github.com/docker/docker/client/login.go +++ b/vendor/github.com/docker/docker/client/login.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/http" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/registry" - "golang.org/x/net/context" ) // RegistryLogin authenticates the docker server with a given docker registry. diff --git a/vendor/github.com/docker/docker/client/network_connect.go b/vendor/github.com/docker/docker/client/network_connect.go index c022c17b5b3..9372cda48cc 100644 --- a/vendor/github.com/docker/docker/client/network_connect.go +++ b/vendor/github.com/docker/docker/client/network_connect.go @@ -1,9 +1,10 @@ package client import ( + "context" + "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/network" - "golang.org/x/net/context" ) // NetworkConnect connects a container to an existent network in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_create.go b/vendor/github.com/docker/docker/client/network_create.go index 4067a541ff1..91da2a5a305 100644 --- a/vendor/github.com/docker/docker/client/network_create.go +++ b/vendor/github.com/docker/docker/client/network_create.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // NetworkCreate creates a new network in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_disconnect.go b/vendor/github.com/docker/docker/client/network_disconnect.go index 24b58e3c12b..0e74a7821e4 100644 --- a/vendor/github.com/docker/docker/client/network_disconnect.go +++ b/vendor/github.com/docker/docker/client/network_disconnect.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // NetworkDisconnect disconnects a container from an existent network in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_inspect.go b/vendor/github.com/docker/docker/client/network_inspect.go index 848c9799fba..57b94953681 100644 --- a/vendor/github.com/docker/docker/client/network_inspect.go +++ b/vendor/github.com/docker/docker/client/network_inspect.go @@ -2,13 +2,12 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // NetworkInspect returns the information for a specific network configured in the docker host. @@ -19,6 +18,9 @@ func (cli *Client) NetworkInspect(ctx context.Context, networkID string, options // NetworkInspectWithRaw returns the information for a specific network configured in the docker host and its raw representation. func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, options types.NetworkInspectOptions) (types.NetworkResource, []byte, error) { + if networkID == "" { + return types.NetworkResource{}, nil, objectNotFoundError{object: "network", id: networkID} + } var ( networkResource types.NetworkResource resp serverResponse @@ -33,10 +35,7 @@ func (cli *Client) NetworkInspectWithRaw(ctx context.Context, networkID string, } resp, err = cli.get(ctx, "/networks/"+networkID, query, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return networkResource, nil, networkNotFoundError{networkID} - } - return networkResource, nil, err + return networkResource, nil, wrapResponseError(err, resp, "network", networkID) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/network_list.go b/vendor/github.com/docker/docker/client/network_list.go index e566a93e234..6056bee7fdf 100644 --- a/vendor/github.com/docker/docker/client/network_list.go +++ b/vendor/github.com/docker/docker/client/network_list.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // NetworkList returns the list of networks configured in the docker host. diff --git a/vendor/github.com/docker/docker/client/network_prune.go b/vendor/github.com/docker/docker/client/network_prune.go index 7352a7f0c5f..9ae96f813ae 100644 --- a/vendor/github.com/docker/docker/client/network_prune.go +++ b/vendor/github.com/docker/docker/client/network_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // NetworksPrune requests the daemon to delete unused networks diff --git a/vendor/github.com/docker/docker/client/network_remove.go b/vendor/github.com/docker/docker/client/network_remove.go index 6bd67489242..c96596353db 100644 --- a/vendor/github.com/docker/docker/client/network_remove.go +++ b/vendor/github.com/docker/docker/client/network_remove.go @@ -1,10 +1,10 @@ package client -import "golang.org/x/net/context" +import "context" // NetworkRemove removes an existent network from the docker host. func (cli *Client) NetworkRemove(ctx context.Context, networkID string) error { resp, err := cli.delete(ctx, "/networks/"+networkID, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "network", networkID) } diff --git a/vendor/github.com/docker/docker/client/node_inspect.go b/vendor/github.com/docker/docker/client/node_inspect.go index abf505d29c5..8fe1ab104db 100644 --- a/vendor/github.com/docker/docker/client/node_inspect.go +++ b/vendor/github.com/docker/docker/client/node_inspect.go @@ -2,22 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // NodeInspectWithRaw returns the node information. func (cli *Client) NodeInspectWithRaw(ctx context.Context, nodeID string) (swarm.Node, []byte, error) { + if nodeID == "" { + return swarm.Node{}, nil, objectNotFoundError{object: "node", id: nodeID} + } serverResp, err := cli.get(ctx, "/nodes/"+nodeID, nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Node{}, nil, nodeNotFoundError{nodeID} - } - return swarm.Node{}, nil, err + return swarm.Node{}, nil, wrapResponseError(err, serverResp, "node", nodeID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/node_list.go b/vendor/github.com/docker/docker/client/node_list.go index 3e8440f08e8..386aad1e337 100644 --- a/vendor/github.com/docker/docker/client/node_list.go +++ b/vendor/github.com/docker/docker/client/node_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // NodeList returns the list of nodes. @@ -15,7 +15,7 @@ func (cli *Client) NodeList(ctx context.Context, options types.NodeListOptions) query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/client/node_remove.go b/vendor/github.com/docker/docker/client/node_remove.go index 0a77f3d578f..ef949ed203b 100644 --- a/vendor/github.com/docker/docker/client/node_remove.go +++ b/vendor/github.com/docker/docker/client/node_remove.go @@ -1,11 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - - "golang.org/x/net/context" ) // NodeRemove removes a Node. @@ -17,5 +16,5 @@ func (cli *Client) NodeRemove(ctx context.Context, nodeID string, options types. resp, err := cli.delete(ctx, "/nodes/"+nodeID, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "node", nodeID) } diff --git a/vendor/github.com/docker/docker/client/node_update.go b/vendor/github.com/docker/docker/client/node_update.go index 3ca97602826..6359966a307 100644 --- a/vendor/github.com/docker/docker/client/node_update.go +++ b/vendor/github.com/docker/docker/client/node_update.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // NodeUpdate updates a Node. diff --git a/vendor/github.com/docker/docker/client/parse_logs.go b/vendor/github.com/docker/docker/client/parse_logs.go deleted file mode 100644 index e427f80a772..00000000000 --- a/vendor/github.com/docker/docker/client/parse_logs.go +++ /dev/null @@ -1,41 +0,0 @@ -package client - -// parse_logs.go contains utility helpers for getting information out of docker -// log lines. really, it only contains ParseDetails right now. maybe in the -// future there will be some desire to parse log messages back into a struct? -// that would go here if we did - -import ( - "net/url" - "strings" - - "github.com/pkg/errors" -) - -// ParseLogDetails takes a details string of key value pairs in the form -// "k=v,l=w", where the keys and values are url query escaped, and each pair -// is separated by a comma, returns a map. returns an error if the details -// string is not in a valid format -// the exact form of details encoding is implemented in -// api/server/httputils/write_log_stream.go -func ParseLogDetails(details string) (map[string]string, error) { - pairs := strings.Split(details, ",") - detailsMap := make(map[string]string, len(pairs)) - for _, pair := range pairs { - p := strings.SplitN(pair, "=", 2) - // if there is no equals sign, we will only get 1 part back - if len(p) != 2 { - return nil, errors.New("invalid details format") - } - k, err := url.QueryUnescape(p[0]) - if err != nil { - return nil, err - } - v, err := url.QueryUnescape(p[1]) - if err != nil { - return nil, err - } - detailsMap[k] = v - } - return detailsMap, nil -} diff --git a/vendor/github.com/docker/docker/client/ping.go b/vendor/github.com/docker/docker/client/ping.go index a4c2e2c4dd7..a1707025b5a 100644 --- a/vendor/github.com/docker/docker/client/ping.go +++ b/vendor/github.com/docker/docker/client/ping.go @@ -1,14 +1,16 @@ package client import ( + "context" + "path" + "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // Ping pings the server and returns the value of the "Docker-Experimental", "OS-Type" & "API-Version" headers func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { var ping types.Ping - req, err := cli.buildRequest("GET", cli.basePath+"/_ping", nil, nil) + req, err := cli.buildRequest("GET", path.Join(cli.basePath, "/_ping"), nil, nil) if err != nil { return ping, err } @@ -26,7 +28,5 @@ func (cli *Client) Ping(ctx context.Context) (types.Ping, error) { } ping.OSType = serverResp.header.Get("OSType") } - - err = cli.checkResponseErr(serverResp) - return ping, err + return ping, cli.checkResponseErr(serverResp) } diff --git a/vendor/github.com/docker/docker/client/plugin_create.go b/vendor/github.com/docker/docker/client/plugin_create.go index 27954aa573c..f850057ff6e 100644 --- a/vendor/github.com/docker/docker/client/plugin_create.go +++ b/vendor/github.com/docker/docker/client/plugin_create.go @@ -1,12 +1,12 @@ package client import ( + "context" "io" "net/http" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginCreate creates a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_disable.go b/vendor/github.com/docker/docker/client/plugin_disable.go index 30467db7420..6f1337ba7d7 100644 --- a/vendor/github.com/docker/docker/client/plugin_disable.go +++ b/vendor/github.com/docker/docker/client/plugin_disable.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginDisable disables a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_enable.go b/vendor/github.com/docker/docker/client/plugin_enable.go index 95517c4b80f..4f2679ac44b 100644 --- a/vendor/github.com/docker/docker/client/plugin_enable.go +++ b/vendor/github.com/docker/docker/client/plugin_enable.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginEnable enables a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_inspect.go b/vendor/github.com/docker/docker/client/plugin_inspect.go index 89f39ee2c64..31e99a987af 100644 --- a/vendor/github.com/docker/docker/client/plugin_inspect.go +++ b/vendor/github.com/docker/docker/client/plugin_inspect.go @@ -2,22 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginInspectWithRaw inspects an existing plugin func (cli *Client) PluginInspectWithRaw(ctx context.Context, name string) (*types.Plugin, []byte, error) { + if name == "" { + return nil, nil, objectNotFoundError{object: "plugin", id: name} + } resp, err := cli.get(ctx, "/plugins/"+name+"/json", nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return nil, nil, pluginNotFoundError{name} - } - return nil, nil, err + return nil, nil, wrapResponseError(err, resp, "plugin", name) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/plugin_install.go b/vendor/github.com/docker/docker/client/plugin_install.go index ce3e0506e5e..d56befface1 100644 --- a/vendor/github.com/docker/docker/client/plugin_install.go +++ b/vendor/github.com/docker/docker/client/plugin_install.go @@ -1,6 +1,7 @@ package client import ( + "context" "encoding/json" "io" "net/http" @@ -9,7 +10,6 @@ import ( "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" "github.com/pkg/errors" - "golang.org/x/net/context" ) // PluginInstall installs a plugin diff --git a/vendor/github.com/docker/docker/client/plugin_list.go b/vendor/github.com/docker/docker/client/plugin_list.go index 3acde3b9667..4084e4c1843 100644 --- a/vendor/github.com/docker/docker/client/plugin_list.go +++ b/vendor/github.com/docker/docker/client/plugin_list.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // PluginList returns the installed plugins @@ -23,7 +23,7 @@ func (cli *Client) PluginList(ctx context.Context, filter filters.Args) (types.P } resp, err := cli.get(ctx, "/plugins", query, nil) if err != nil { - return plugins, err + return plugins, wrapResponseError(err, resp, "plugin", "") } err = json.NewDecoder(resp.body).Decode(&plugins) diff --git a/vendor/github.com/docker/docker/client/plugin_push.go b/vendor/github.com/docker/docker/client/plugin_push.go index 1e5f9632513..6528a6afa21 100644 --- a/vendor/github.com/docker/docker/client/plugin_push.go +++ b/vendor/github.com/docker/docker/client/plugin_push.go @@ -1,9 +1,8 @@ package client import ( + "context" "io" - - "golang.org/x/net/context" ) // PluginPush pushes a plugin to a registry diff --git a/vendor/github.com/docker/docker/client/plugin_remove.go b/vendor/github.com/docker/docker/client/plugin_remove.go index b017e4d3486..70b565ee0e5 100644 --- a/vendor/github.com/docker/docker/client/plugin_remove.go +++ b/vendor/github.com/docker/docker/client/plugin_remove.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // PluginRemove removes a plugin @@ -16,5 +16,5 @@ func (cli *Client) PluginRemove(ctx context.Context, name string, options types. resp, err := cli.delete(ctx, "/plugins/"+name, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "plugin", name) } diff --git a/vendor/github.com/docker/docker/client/plugin_set.go b/vendor/github.com/docker/docker/client/plugin_set.go index 3260d2a90d5..9ffa7530644 100644 --- a/vendor/github.com/docker/docker/client/plugin_set.go +++ b/vendor/github.com/docker/docker/client/plugin_set.go @@ -1,7 +1,7 @@ package client import ( - "golang.org/x/net/context" + "context" ) // PluginSet modifies settings for an existing plugin diff --git a/vendor/github.com/docker/docker/client/plugin_upgrade.go b/vendor/github.com/docker/docker/client/plugin_upgrade.go index 049ebfa2a54..cf215ba01bc 100644 --- a/vendor/github.com/docker/docker/client/plugin_upgrade.go +++ b/vendor/github.com/docker/docker/client/plugin_upgrade.go @@ -1,13 +1,13 @@ package client import ( + "context" "io" "net/url" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" "github.com/pkg/errors" - "golang.org/x/net/context" ) // PluginUpgrade upgrades a plugin diff --git a/vendor/github.com/docker/docker/client/request.go b/vendor/github.com/docker/docker/client/request.go index 3e7d43feac1..368fa1faef5 100644 --- a/vendor/github.com/docker/docker/client/request.go +++ b/vendor/github.com/docker/docker/client/request.go @@ -2,6 +2,7 @@ package client import ( "bytes" + "context" "encoding/json" "fmt" "io" @@ -15,7 +16,6 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/versions" "github.com/pkg/errors" - "golang.org/x/net/context" "golang.org/x/net/context/ctxhttp" ) @@ -123,10 +123,7 @@ func (cli *Client) sendRequest(ctx context.Context, method, path string, query u if err != nil { return resp, err } - if err := cli.checkResponseErr(resp); err != nil { - return resp, err - } - return resp, nil + return resp, cli.checkResponseErr(resp) } func (cli *Client) doRequest(ctx context.Context, req *http.Request) (serverResponse, error) { @@ -203,7 +200,7 @@ func (cli *Client) checkResponseErr(serverResp serverResponse) error { return err } if len(body) == 0 { - return fmt.Errorf("Error: request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), serverResp.reqURL) + return fmt.Errorf("request returned %s for API route and version %s, check if the server supports the requested API version", http.StatusText(serverResp.statusCode), serverResp.reqURL) } var ct string diff --git a/vendor/github.com/docker/docker/client/secret_create.go b/vendor/github.com/docker/docker/client/secret_create.go index 4354afea608..3d7768ace86 100644 --- a/vendor/github.com/docker/docker/client/secret_create.go +++ b/vendor/github.com/docker/docker/client/secret_create.go @@ -1,11 +1,11 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretCreate creates a new Secret. diff --git a/vendor/github.com/docker/docker/client/secret_inspect.go b/vendor/github.com/docker/docker/client/secret_inspect.go index 9b602972bcc..45584d0e312 100644 --- a/vendor/github.com/docker/docker/client/secret_inspect.go +++ b/vendor/github.com/docker/docker/client/secret_inspect.go @@ -2,12 +2,11 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretInspectWithRaw returns the secret information with raw data @@ -15,12 +14,12 @@ func (cli *Client) SecretInspectWithRaw(ctx context.Context, id string) (swarm.S if err := cli.NewVersionError("1.25", "secret inspect"); err != nil { return swarm.Secret{}, nil, err } + if id == "" { + return swarm.Secret{}, nil, objectNotFoundError{object: "secret", id: id} + } resp, err := cli.get(ctx, "/secrets/"+id, nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return swarm.Secret{}, nil, secretNotFoundError{id} - } - return swarm.Secret{}, nil, err + return swarm.Secret{}, nil, wrapResponseError(err, resp, "secret", id) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/secret_list.go b/vendor/github.com/docker/docker/client/secret_list.go index 0d33ecfbc9b..128fc69d501 100644 --- a/vendor/github.com/docker/docker/client/secret_list.go +++ b/vendor/github.com/docker/docker/client/secret_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretList returns the list of secrets. @@ -18,7 +18,7 @@ func (cli *Client) SecretList(ctx context.Context, options types.SecretListOptio query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/secret_remove.go b/vendor/github.com/docker/docker/client/secret_remove.go index c5e37af17d1..87c7a12b402 100644 --- a/vendor/github.com/docker/docker/client/secret_remove.go +++ b/vendor/github.com/docker/docker/client/secret_remove.go @@ -1,6 +1,6 @@ package client -import "golang.org/x/net/context" +import "context" // SecretRemove removes a Secret. func (cli *Client) SecretRemove(ctx context.Context, id string) error { @@ -9,5 +9,5 @@ func (cli *Client) SecretRemove(ctx context.Context, id string) error { } resp, err := cli.delete(ctx, "/secrets/"+id, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "secret", id) } diff --git a/vendor/github.com/docker/docker/client/secret_update.go b/vendor/github.com/docker/docker/client/secret_update.go index 875a4c901e4..468e1acc25d 100644 --- a/vendor/github.com/docker/docker/client/secret_update.go +++ b/vendor/github.com/docker/docker/client/secret_update.go @@ -1,11 +1,11 @@ package client import ( + "context" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SecretUpdate attempts to update a Secret diff --git a/vendor/github.com/docker/docker/client/service_create.go b/vendor/github.com/docker/docker/client/service_create.go index a36839443ca..4cd98f4b773 100644 --- a/vendor/github.com/docker/docker/client/service_create.go +++ b/vendor/github.com/docker/docker/client/service_create.go @@ -1,15 +1,16 @@ package client import ( + "context" "encoding/json" "fmt" + "strings" "github.com/docker/distribution/reference" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" "github.com/opencontainers/go-digest" "github.com/pkg/errors" - "golang.org/x/net/context" ) // ServiceCreate creates a new Service. @@ -85,21 +86,30 @@ func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, return response, err } -func imageDigestAndPlatforms(ctx context.Context, cli *Client, image, encodedAuth string) (string, []swarm.Platform, error) { +func imageDigestAndPlatforms(ctx context.Context, cli DistributionAPIClient, image, encodedAuth string) (string, []swarm.Platform, error) { distributionInspect, err := cli.DistributionInspect(ctx, image, encodedAuth) - imageWithDigest := image var platforms []swarm.Platform if err != nil { return "", nil, err } - imageWithDigest = imageWithDigestString(image, distributionInspect.Descriptor.Digest) + imageWithDigest := imageWithDigestString(image, distributionInspect.Descriptor.Digest) if len(distributionInspect.Platforms) > 0 { platforms = make([]swarm.Platform, 0, len(distributionInspect.Platforms)) for _, p := range distributionInspect.Platforms { + // clear architecture field for arm. This is a temporary patch to address + // https://github.com/docker/swarmkit/issues/2294. The issue is that while + // image manifests report "arm" as the architecture, the node reports + // something like "armv7l" (includes the variant), which causes arm images + // to stop working with swarm mode. This patch removes the architecture + // constraint for arm images to ensure tasks get scheduled. + arch := p.Architecture + if strings.ToLower(arch) == "arm" { + arch = "" + } platforms = append(platforms, swarm.Platform{ - Architecture: p.Architecture, + Architecture: arch, OS: p.OS, }) } @@ -126,7 +136,7 @@ func imageWithDigestString(image string, dgst digest.Digest) string { // imageWithTagString takes an image string, and returns a tagged image // string, adding a 'latest' tag if one was not provided. It returns an -// emptry string if a canonical reference was provided +// empty string if a canonical reference was provided func imageWithTagString(image string) string { namedRef, err := reference.ParseNormalizedNamed(image) if err == nil { diff --git a/vendor/github.com/docker/docker/client/service_inspect.go b/vendor/github.com/docker/docker/client/service_inspect.go index d7e051e3a45..61c51738216 100644 --- a/vendor/github.com/docker/docker/client/service_inspect.go +++ b/vendor/github.com/docker/docker/client/service_inspect.go @@ -2,27 +2,26 @@ package client import ( "bytes" + "context" "encoding/json" "fmt" "io/ioutil" - "net/http" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ServiceInspectWithRaw returns the service information and the raw data. func (cli *Client) ServiceInspectWithRaw(ctx context.Context, serviceID string, opts types.ServiceInspectOptions) (swarm.Service, []byte, error) { + if serviceID == "" { + return swarm.Service{}, nil, objectNotFoundError{object: "service", id: serviceID} + } query := url.Values{} query.Set("insertDefaults", fmt.Sprintf("%v", opts.InsertDefaults)) serverResp, err := cli.get(ctx, "/services/"+serviceID, query, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Service{}, nil, serviceNotFoundError{serviceID} - } - return swarm.Service{}, nil, err + return swarm.Service{}, nil, wrapResponseError(err, serverResp, "service", serviceID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/service_list.go b/vendor/github.com/docker/docker/client/service_list.go index c29e6d407d3..abe37d4a008 100644 --- a/vendor/github.com/docker/docker/client/service_list.go +++ b/vendor/github.com/docker/docker/client/service_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ServiceList returns the list of services. @@ -15,7 +15,7 @@ func (cli *Client) ServiceList(ctx context.Context, options types.ServiceListOpt query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/service_logs.go b/vendor/github.com/docker/docker/client/service_logs.go index 24384e3ec0f..51819357b2f 100644 --- a/vendor/github.com/docker/docker/client/service_logs.go +++ b/vendor/github.com/docker/docker/client/service_logs.go @@ -1,14 +1,14 @@ package client import ( + "context" "io" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" timetypes "github.com/docker/docker/api/types/time" + "github.com/pkg/errors" ) // ServiceLogs returns the logs generated by a service in an io.ReadCloser. @@ -26,7 +26,7 @@ func (cli *Client) ServiceLogs(ctx context.Context, serviceID string, options ty if options.Since != "" { ts, err := timetypes.GetTimestamp(options.Since, time.Now()) if err != nil { - return nil, err + return nil, errors.Wrap(err, `invalid value for "since"`) } query.Set("since", ts) } diff --git a/vendor/github.com/docker/docker/client/service_remove.go b/vendor/github.com/docker/docker/client/service_remove.go index a9331f92c23..a8f13e26b0c 100644 --- a/vendor/github.com/docker/docker/client/service_remove.go +++ b/vendor/github.com/docker/docker/client/service_remove.go @@ -1,10 +1,10 @@ package client -import "golang.org/x/net/context" +import "context" // ServiceRemove kills and removes a service. func (cli *Client) ServiceRemove(ctx context.Context, serviceID string) error { resp, err := cli.delete(ctx, "/services/"+serviceID, nil, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "service", serviceID) } diff --git a/vendor/github.com/docker/docker/client/service_update.go b/vendor/github.com/docker/docker/client/service_update.go index 8764f299a3a..45a0ed0add5 100644 --- a/vendor/github.com/docker/docker/client/service_update.go +++ b/vendor/github.com/docker/docker/client/service_update.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "strconv" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // ServiceUpdate updates a Service. diff --git a/vendor/github.com/docker/docker/client/session.go b/vendor/github.com/docker/docker/client/session.go index 8ee91621367..12051e3eda5 100644 --- a/vendor/github.com/docker/docker/client/session.go +++ b/vendor/github.com/docker/docker/client/session.go @@ -1,10 +1,9 @@ package client import ( + "context" "net" "net/http" - - "golang.org/x/net/context" ) // DialSession returns a connection that can be used communication with daemon diff --git a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go index be28d32628d..58f78e86e70 100644 --- a/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go +++ b/vendor/github.com/docker/docker/client/swarm_get_unlock_key.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // SwarmGetUnlockKey retrieves the swarm's unlock key. diff --git a/vendor/github.com/docker/docker/client/swarm_init.go b/vendor/github.com/docker/docker/client/swarm_init.go index 9e65e1cca47..2049bb6bfab 100644 --- a/vendor/github.com/docker/docker/client/swarm_init.go +++ b/vendor/github.com/docker/docker/client/swarm_init.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmInit initializes the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_inspect.go b/vendor/github.com/docker/docker/client/swarm_inspect.go index 77e72f84660..df8b6b3ab8c 100644 --- a/vendor/github.com/docker/docker/client/swarm_inspect.go +++ b/vendor/github.com/docker/docker/client/swarm_inspect.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmInspect inspects the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_join.go b/vendor/github.com/docker/docker/client/swarm_join.go index 19e5192b9e3..446d4d0482d 100644 --- a/vendor/github.com/docker/docker/client/swarm_join.go +++ b/vendor/github.com/docker/docker/client/swarm_join.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmJoin joins the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_leave.go b/vendor/github.com/docker/docker/client/swarm_leave.go index 3a205cf3b56..709e5adb353 100644 --- a/vendor/github.com/docker/docker/client/swarm_leave.go +++ b/vendor/github.com/docker/docker/client/swarm_leave.go @@ -1,9 +1,8 @@ package client import ( + "context" "net/url" - - "golang.org/x/net/context" ) // SwarmLeave leaves the swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_unlock.go b/vendor/github.com/docker/docker/client/swarm_unlock.go index 9ee441fed2a..a9ca424bf80 100644 --- a/vendor/github.com/docker/docker/client/swarm_unlock.go +++ b/vendor/github.com/docker/docker/client/swarm_unlock.go @@ -1,8 +1,9 @@ package client import ( + "context" + "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmUnlock unlocks locked swarm. diff --git a/vendor/github.com/docker/docker/client/swarm_update.go b/vendor/github.com/docker/docker/client/swarm_update.go index 7245fd4e382..820ef5b219b 100644 --- a/vendor/github.com/docker/docker/client/swarm_update.go +++ b/vendor/github.com/docker/docker/client/swarm_update.go @@ -1,12 +1,12 @@ package client import ( + "context" "fmt" "net/url" "strconv" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // SwarmUpdate updates the swarm. diff --git a/vendor/github.com/docker/docker/client/task_inspect.go b/vendor/github.com/docker/docker/client/task_inspect.go index bc8058fc32e..414c86bf1c6 100644 --- a/vendor/github.com/docker/docker/client/task_inspect.go +++ b/vendor/github.com/docker/docker/client/task_inspect.go @@ -2,23 +2,21 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types/swarm" - - "golang.org/x/net/context" ) // TaskInspectWithRaw returns the task information and its raw representation.. func (cli *Client) TaskInspectWithRaw(ctx context.Context, taskID string) (swarm.Task, []byte, error) { + if taskID == "" { + return swarm.Task{}, nil, objectNotFoundError{object: "task", id: taskID} + } serverResp, err := cli.get(ctx, "/tasks/"+taskID, nil, nil) if err != nil { - if serverResp.statusCode == http.StatusNotFound { - return swarm.Task{}, nil, taskNotFoundError{taskID} - } - return swarm.Task{}, nil, err + return swarm.Task{}, nil, wrapResponseError(err, serverResp, "task", taskID) } defer ensureReaderClosed(serverResp) diff --git a/vendor/github.com/docker/docker/client/task_list.go b/vendor/github.com/docker/docker/client/task_list.go index 66324da9592..71e57aa5b23 100644 --- a/vendor/github.com/docker/docker/client/task_list.go +++ b/vendor/github.com/docker/docker/client/task_list.go @@ -1,13 +1,13 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/api/types/swarm" - "golang.org/x/net/context" ) // TaskList returns the list of tasks. @@ -15,7 +15,7 @@ func (cli *Client) TaskList(ctx context.Context, options types.TaskListOptions) query := url.Values{} if options.Filters.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filters) + filterJSON, err := filters.ToJSON(options.Filters) if err != nil { return nil, err } diff --git a/vendor/github.com/docker/docker/client/task_logs.go b/vendor/github.com/docker/docker/client/task_logs.go index 2ed19543a43..5c96c7dc51c 100644 --- a/vendor/github.com/docker/docker/client/task_logs.go +++ b/vendor/github.com/docker/docker/client/task_logs.go @@ -1,12 +1,11 @@ package client import ( + "context" "io" "net/url" "time" - "golang.org/x/net/context" - "github.com/docker/docker/api/types" timetypes "github.com/docker/docker/api/types/time" ) diff --git a/vendor/github.com/docker/docker/client/transport.go b/vendor/github.com/docker/docker/client/transport.go index 401ab15d30b..73f6ef7b4d4 100644 --- a/vendor/github.com/docker/docker/client/transport.go +++ b/vendor/github.com/docker/docker/client/transport.go @@ -5,14 +5,6 @@ import ( "net/http" ) -// transportFunc allows us to inject a mock transport for testing. We define it -// here so we can detect the tlsconfig and return nil for only this type. -type transportFunc func(*http.Request) (*http.Response, error) - -func (tf transportFunc) RoundTrip(req *http.Request) (*http.Response, error) { - return tf(req) -} - // resolveTLSConfig attempts to resolve the TLS configuration from the // RoundTripper. func resolveTLSConfig(transport http.RoundTripper) *tls.Config { diff --git a/vendor/github.com/docker/docker/client/utils.go b/vendor/github.com/docker/docker/client/utils.go index f3d8877df79..137705065c2 100644 --- a/vendor/github.com/docker/docker/client/utils.go +++ b/vendor/github.com/docker/docker/client/utils.go @@ -24,7 +24,7 @@ func getDockerOS(serverHeader string) string { func getFiltersQuery(f filters.Args) (url.Values, error) { query := url.Values{} if f.Len() > 0 { - filterJSON, err := filters.ToParam(f) + filterJSON, err := filters.ToJSON(f) if err != nil { return query, err } diff --git a/vendor/github.com/docker/docker/client/version.go b/vendor/github.com/docker/docker/client/version.go index 933ceb4a499..7bcc65f62a1 100644 --- a/vendor/github.com/docker/docker/client/version.go +++ b/vendor/github.com/docker/docker/client/version.go @@ -1,10 +1,10 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // ServerVersion returns information of the docker client and server host. diff --git a/vendor/github.com/docker/docker/client/volume_create.go b/vendor/github.com/docker/docker/client/volume_create.go index 9620c87cbf5..e6abd22775e 100644 --- a/vendor/github.com/docker/docker/client/volume_create.go +++ b/vendor/github.com/docker/docker/client/volume_create.go @@ -1,15 +1,15 @@ package client import ( + "context" "encoding/json" "github.com/docker/docker/api/types" volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" ) // VolumeCreate creates a volume in the docker host. -func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumesCreateBody) (types.Volume, error) { +func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) { var volume types.Volume resp, err := cli.post(ctx, "/volumes/create", nil, options, nil) if err != nil { diff --git a/vendor/github.com/docker/docker/client/volume_inspect.go b/vendor/github.com/docker/docker/client/volume_inspect.go index 3860e9b22c7..9b077ba4c0e 100644 --- a/vendor/github.com/docker/docker/client/volume_inspect.go +++ b/vendor/github.com/docker/docker/client/volume_inspect.go @@ -2,12 +2,11 @@ package client import ( "bytes" + "context" "encoding/json" "io/ioutil" - "net/http" "github.com/docker/docker/api/types" - "golang.org/x/net/context" ) // VolumeInspect returns the information about a specific volume in the docker host. @@ -18,13 +17,14 @@ func (cli *Client) VolumeInspect(ctx context.Context, volumeID string) (types.Vo // VolumeInspectWithRaw returns the information about a specific volume in the docker host and its raw representation func (cli *Client) VolumeInspectWithRaw(ctx context.Context, volumeID string) (types.Volume, []byte, error) { + if volumeID == "" { + return types.Volume{}, nil, objectNotFoundError{object: "volume", id: volumeID} + } + var volume types.Volume resp, err := cli.get(ctx, "/volumes/"+volumeID, nil, nil) if err != nil { - if resp.statusCode == http.StatusNotFound { - return volume, nil, volumeNotFoundError{volumeID} - } - return volume, nil, err + return volume, nil, wrapResponseError(err, resp, "volume", volumeID) } defer ensureReaderClosed(resp) diff --git a/vendor/github.com/docker/docker/client/volume_list.go b/vendor/github.com/docker/docker/client/volume_list.go index 32247ce1151..f84542844f1 100644 --- a/vendor/github.com/docker/docker/client/volume_list.go +++ b/vendor/github.com/docker/docker/client/volume_list.go @@ -1,17 +1,17 @@ package client import ( + "context" "encoding/json" "net/url" "github.com/docker/docker/api/types/filters" volumetypes "github.com/docker/docker/api/types/volume" - "golang.org/x/net/context" ) // VolumeList returns the volumes configured in the docker host. -func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumesListOKBody, error) { - var volumes volumetypes.VolumesListOKBody +func (cli *Client) VolumeList(ctx context.Context, filter filters.Args) (volumetypes.VolumeListOKBody, error) { + var volumes volumetypes.VolumeListOKBody query := url.Values{} if filter.Len() > 0 { diff --git a/vendor/github.com/docker/docker/client/volume_prune.go b/vendor/github.com/docker/docker/client/volume_prune.go index 2e7fea77472..dfe8aafa51d 100644 --- a/vendor/github.com/docker/docker/client/volume_prune.go +++ b/vendor/github.com/docker/docker/client/volume_prune.go @@ -1,12 +1,12 @@ package client import ( + "context" "encoding/json" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" - "golang.org/x/net/context" ) // VolumesPrune requests the daemon to delete unused data diff --git a/vendor/github.com/docker/docker/client/volume_remove.go b/vendor/github.com/docker/docker/client/volume_remove.go index 6c26575b497..5b99a8ae9ef 100644 --- a/vendor/github.com/docker/docker/client/volume_remove.go +++ b/vendor/github.com/docker/docker/client/volume_remove.go @@ -1,10 +1,10 @@ package client import ( + "context" "net/url" "github.com/docker/docker/api/types/versions" - "golang.org/x/net/context" ) // VolumeRemove removes a volume from the docker host. @@ -17,5 +17,5 @@ func (cli *Client) VolumeRemove(ctx context.Context, volumeID string, force bool } resp, err := cli.delete(ctx, "/volumes/"+volumeID, query, nil) ensureReaderClosed(resp) - return err + return wrapResponseError(err, resp, "volume", volumeID) } diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/BUILD b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/BUILD similarity index 75% rename from vendor/github.com/docker/docker/pkg/jsonlog/BUILD rename to vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/BUILD index 4fdc6b1b80c..bd82e1c882f 100644 --- a/vendor/github.com/docker/docker/pkg/jsonlog/BUILD +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/BUILD @@ -4,13 +4,13 @@ go_library( name = "go_default_library", srcs = [ "jsonlog.go", - "jsonlog_marshalling.go", "jsonlogbytes.go", "time_marshalling.go", ], - importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/jsonlog", - importpath = "github.com/docker/docker/pkg/jsonlog", + importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", + importpath = "github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog", visibility = ["//visibility:public"], + deps = ["//vendor/github.com/pkg/errors:go_default_library"], ) filegroup( diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go new file mode 100644 index 00000000000..549e3558552 --- /dev/null +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlog.go @@ -0,0 +1,25 @@ +package jsonlog + +import ( + "time" +) + +// JSONLog is a log message, typically a single entry from a given log stream. +type JSONLog struct { + // Log is the log message + Log string `json:"log,omitempty"` + // Stream is the log source + Stream string `json:"stream,omitempty"` + // Created is the created timestamp of log + Created time.Time `json:"time"` + // Attrs is the list of extra attributes provided by the user + Attrs map[string]string `json:"attrs,omitempty"` +} + +// Reset all fields to their zero value. +func (jl *JSONLog) Reset() { + jl.Log = "" + jl.Stream = "" + jl.Created = time.Time{} + jl.Attrs = make(map[string]string) +} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go similarity index 77% rename from vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go rename to vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go index 0ba716f2611..37604ae549a 100644 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlogbytes.go +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/jsonlogbytes.go @@ -3,23 +3,22 @@ package jsonlog import ( "bytes" "encoding/json" + "time" "unicode/utf8" ) -// JSONLogs is based on JSONLog. -// It allows marshalling JSONLog from Log as []byte -// and an already marshalled Created timestamp. +// JSONLogs marshals encoded JSONLog objects type JSONLogs struct { - Log []byte `json:"log,omitempty"` - Stream string `json:"stream,omitempty"` - Created string `json:"time"` + Log []byte `json:"log,omitempty"` + Stream string `json:"stream,omitempty"` + Created time.Time `json:"time"` // json-encoded bytes RawAttrs json.RawMessage `json:"attrs,omitempty"` } -// MarshalJSONBuf is based on the same method from JSONLog -// It has been modified to take into account the necessary changes. +// MarshalJSONBuf is an optimized JSON marshaller that avoids reflection +// and unnecessary allocation. func (mj *JSONLogs) MarshalJSONBuf(buf *bytes.Buffer) error { var first = true @@ -36,7 +35,7 @@ func (mj *JSONLogs) MarshalJSONBuf(buf *bytes.Buffer) error { buf.WriteString(`,`) } buf.WriteString(`"stream":`) - ffjsonWriteJSONString(buf, mj.Stream) + ffjsonWriteJSONBytesAsString(buf, []byte(mj.Stream)) } if len(mj.RawAttrs) > 0 { if first { @@ -50,14 +49,18 @@ func (mj *JSONLogs) MarshalJSONBuf(buf *bytes.Buffer) error { if !first { buf.WriteString(`,`) } + + created, err := fastTimeMarshalJSON(mj.Created) + if err != nil { + return err + } + buf.WriteString(`"time":`) - buf.WriteString(mj.Created) + buf.WriteString(created) buf.WriteString(`}`) return nil } -// This is based on ffjsonWriteJSONBytesAsString. It has been changed -// to accept a string passed as a slice of bytes. func ffjsonWriteJSONBytesAsString(buf *bytes.Buffer, s []byte) { const hex = "0123456789abcdef" diff --git a/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go new file mode 100644 index 00000000000..5fd8023e7cd --- /dev/null +++ b/vendor/github.com/docker/docker/daemon/logger/jsonfilelog/jsonlog/time_marshalling.go @@ -0,0 +1,20 @@ +package jsonlog + +import ( + "time" + + "github.com/pkg/errors" +) + +const jsonFormat = `"` + time.RFC3339Nano + `"` + +// fastTimeMarshalJSON avoids one of the extra allocations that +// time.MarshalJSON is making. +func fastTimeMarshalJSON(t time.Time) (string, error) { + if y := t.Year(); y < 0 || y >= 10000 { + // RFC 3339 is clear that years are 4 digits exactly. + // See golang.org/issue/4556#c15 for more discussion. + return "", errors.New("time.MarshalJSON: year outside of range [0,9999]") + } + return t.Format(jsonFormat), nil +} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/buffer.go b/vendor/github.com/docker/docker/pkg/ioutils/buffer.go deleted file mode 100644 index 3d737b3e19d..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/buffer.go +++ /dev/null @@ -1,51 +0,0 @@ -package ioutils - -import ( - "errors" - "io" -) - -var errBufferFull = errors.New("buffer is full") - -type fixedBuffer struct { - buf []byte - pos int - lastRead int -} - -func (b *fixedBuffer) Write(p []byte) (int, error) { - n := copy(b.buf[b.pos:cap(b.buf)], p) - b.pos += n - - if n < len(p) { - if b.pos == cap(b.buf) { - return n, errBufferFull - } - return n, io.ErrShortWrite - } - return n, nil -} - -func (b *fixedBuffer) Read(p []byte) (int, error) { - n := copy(p, b.buf[b.lastRead:b.pos]) - b.lastRead += n - return n, nil -} - -func (b *fixedBuffer) Len() int { - return b.pos - b.lastRead -} - -func (b *fixedBuffer) Cap() int { - return cap(b.buf) -} - -func (b *fixedBuffer) Reset() { - b.pos = 0 - b.lastRead = 0 - b.buf = b.buf[:0] -} - -func (b *fixedBuffer) String() string { - return string(b.buf[b.lastRead:b.pos]) -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go b/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go deleted file mode 100644 index 72a04f34919..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/bytespipe.go +++ /dev/null @@ -1,186 +0,0 @@ -package ioutils - -import ( - "errors" - "io" - "sync" -) - -// maxCap is the highest capacity to use in byte slices that buffer data. -const maxCap = 1e6 - -// minCap is the lowest capacity to use in byte slices that buffer data -const minCap = 64 - -// blockThreshold is the minimum number of bytes in the buffer which will cause -// a write to BytesPipe to block when allocating a new slice. -const blockThreshold = 1e6 - -var ( - // ErrClosed is returned when Write is called on a closed BytesPipe. - ErrClosed = errors.New("write to closed BytesPipe") - - bufPools = make(map[int]*sync.Pool) - bufPoolsLock sync.Mutex -) - -// BytesPipe is io.ReadWriteCloser which works similarly to pipe(queue). -// All written data may be read at most once. Also, BytesPipe allocates -// and releases new byte slices to adjust to current needs, so the buffer -// won't be overgrown after peak loads. -type BytesPipe struct { - mu sync.Mutex - wait *sync.Cond - buf []*fixedBuffer - bufLen int - closeErr error // error to return from next Read. set to nil if not closed. -} - -// NewBytesPipe creates new BytesPipe, initialized by specified slice. -// If buf is nil, then it will be initialized with slice which cap is 64. -// buf will be adjusted in a way that len(buf) == 0, cap(buf) == cap(buf). -func NewBytesPipe() *BytesPipe { - bp := &BytesPipe{} - bp.buf = append(bp.buf, getBuffer(minCap)) - bp.wait = sync.NewCond(&bp.mu) - return bp -} - -// Write writes p to BytesPipe. -// It can allocate new []byte slices in a process of writing. -func (bp *BytesPipe) Write(p []byte) (int, error) { - bp.mu.Lock() - - written := 0 -loop0: - for { - if bp.closeErr != nil { - bp.mu.Unlock() - return written, ErrClosed - } - - if len(bp.buf) == 0 { - bp.buf = append(bp.buf, getBuffer(64)) - } - // get the last buffer - b := bp.buf[len(bp.buf)-1] - - n, err := b.Write(p) - written += n - bp.bufLen += n - - // errBufferFull is an error we expect to get if the buffer is full - if err != nil && err != errBufferFull { - bp.wait.Broadcast() - bp.mu.Unlock() - return written, err - } - - // if there was enough room to write all then break - if len(p) == n { - break - } - - // more data: write to the next slice - p = p[n:] - - // make sure the buffer doesn't grow too big from this write - for bp.bufLen >= blockThreshold { - bp.wait.Wait() - if bp.closeErr != nil { - continue loop0 - } - } - - // add new byte slice to the buffers slice and continue writing - nextCap := b.Cap() * 2 - if nextCap > maxCap { - nextCap = maxCap - } - bp.buf = append(bp.buf, getBuffer(nextCap)) - } - bp.wait.Broadcast() - bp.mu.Unlock() - return written, nil -} - -// CloseWithError causes further reads from a BytesPipe to return immediately. -func (bp *BytesPipe) CloseWithError(err error) error { - bp.mu.Lock() - if err != nil { - bp.closeErr = err - } else { - bp.closeErr = io.EOF - } - bp.wait.Broadcast() - bp.mu.Unlock() - return nil -} - -// Close causes further reads from a BytesPipe to return immediately. -func (bp *BytesPipe) Close() error { - return bp.CloseWithError(nil) -} - -// Read reads bytes from BytesPipe. -// Data could be read only once. -func (bp *BytesPipe) Read(p []byte) (n int, err error) { - bp.mu.Lock() - if bp.bufLen == 0 { - if bp.closeErr != nil { - bp.mu.Unlock() - return 0, bp.closeErr - } - bp.wait.Wait() - if bp.bufLen == 0 && bp.closeErr != nil { - err := bp.closeErr - bp.mu.Unlock() - return 0, err - } - } - - for bp.bufLen > 0 { - b := bp.buf[0] - read, _ := b.Read(p) // ignore error since fixedBuffer doesn't really return an error - n += read - bp.bufLen -= read - - if b.Len() == 0 { - // it's empty so return it to the pool and move to the next one - returnBuffer(b) - bp.buf[0] = nil - bp.buf = bp.buf[1:] - } - - if len(p) == read { - break - } - - p = p[read:] - } - - bp.wait.Broadcast() - bp.mu.Unlock() - return -} - -func returnBuffer(b *fixedBuffer) { - b.Reset() - bufPoolsLock.Lock() - pool := bufPools[b.Cap()] - bufPoolsLock.Unlock() - if pool != nil { - pool.Put(b) - } -} - -func getBuffer(size int) *fixedBuffer { - bufPoolsLock.Lock() - pool, ok := bufPools[size] - if !ok { - pool = &sync.Pool{New: func() interface{} { return &fixedBuffer{buf: make([]byte, 0, size)} }} - bufPools[size] = pool - } - bufPoolsLock.Unlock() - return pool.Get().(*fixedBuffer) -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go b/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go deleted file mode 100644 index a56c4626515..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/fswriters.go +++ /dev/null @@ -1,162 +0,0 @@ -package ioutils - -import ( - "io" - "io/ioutil" - "os" - "path/filepath" -) - -// NewAtomicFileWriter returns WriteCloser so that writing to it writes to a -// temporary file and closing it atomically changes the temporary file to -// destination path. Writing and closing concurrently is not allowed. -func NewAtomicFileWriter(filename string, perm os.FileMode) (io.WriteCloser, error) { - f, err := ioutil.TempFile(filepath.Dir(filename), ".tmp-"+filepath.Base(filename)) - if err != nil { - return nil, err - } - - abspath, err := filepath.Abs(filename) - if err != nil { - return nil, err - } - return &atomicFileWriter{ - f: f, - fn: abspath, - perm: perm, - }, nil -} - -// AtomicWriteFile atomically writes data to a file named by filename. -func AtomicWriteFile(filename string, data []byte, perm os.FileMode) error { - f, err := NewAtomicFileWriter(filename, perm) - if err != nil { - return err - } - n, err := f.Write(data) - if err == nil && n < len(data) { - err = io.ErrShortWrite - f.(*atomicFileWriter).writeErr = err - } - if err1 := f.Close(); err == nil { - err = err1 - } - return err -} - -type atomicFileWriter struct { - f *os.File - fn string - writeErr error - perm os.FileMode -} - -func (w *atomicFileWriter) Write(dt []byte) (int, error) { - n, err := w.f.Write(dt) - if err != nil { - w.writeErr = err - } - return n, err -} - -func (w *atomicFileWriter) Close() (retErr error) { - defer func() { - if retErr != nil || w.writeErr != nil { - os.Remove(w.f.Name()) - } - }() - if err := w.f.Sync(); err != nil { - w.f.Close() - return err - } - if err := w.f.Close(); err != nil { - return err - } - if err := os.Chmod(w.f.Name(), w.perm); err != nil { - return err - } - if w.writeErr == nil { - return os.Rename(w.f.Name(), w.fn) - } - return nil -} - -// AtomicWriteSet is used to atomically write a set -// of files and ensure they are visible at the same time. -// Must be committed to a new directory. -type AtomicWriteSet struct { - root string -} - -// NewAtomicWriteSet creates a new atomic write set to -// atomically create a set of files. The given directory -// is used as the base directory for storing files before -// commit. If no temporary directory is given the system -// default is used. -func NewAtomicWriteSet(tmpDir string) (*AtomicWriteSet, error) { - td, err := ioutil.TempDir(tmpDir, "write-set-") - if err != nil { - return nil, err - } - - return &AtomicWriteSet{ - root: td, - }, nil -} - -// WriteFile writes a file to the set, guaranteeing the file -// has been synced. -func (ws *AtomicWriteSet) WriteFile(filename string, data []byte, perm os.FileMode) error { - f, err := ws.FileWriter(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) - if err != nil { - return err - } - n, err := f.Write(data) - if err == nil && n < len(data) { - err = io.ErrShortWrite - } - if err1 := f.Close(); err == nil { - err = err1 - } - return err -} - -type syncFileCloser struct { - *os.File -} - -func (w syncFileCloser) Close() error { - err := w.File.Sync() - if err1 := w.File.Close(); err == nil { - err = err1 - } - return err -} - -// FileWriter opens a file writer inside the set. The file -// should be synced and closed before calling commit. -func (ws *AtomicWriteSet) FileWriter(name string, flag int, perm os.FileMode) (io.WriteCloser, error) { - f, err := os.OpenFile(filepath.Join(ws.root, name), flag, perm) - if err != nil { - return nil, err - } - return syncFileCloser{f}, nil -} - -// Cancel cancels the set and removes all temporary data -// created in the set. -func (ws *AtomicWriteSet) Cancel() error { - return os.RemoveAll(ws.root) -} - -// Commit moves all created files to the target directory. The -// target directory must not exist and the parent of the target -// directory must exist. -func (ws *AtomicWriteSet) Commit(target string) error { - return os.Rename(ws.root, target) -} - -// String returns the location the set is writing to. -func (ws *AtomicWriteSet) String() string { - return ws.root -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/readers.go b/vendor/github.com/docker/docker/pkg/ioutils/readers.go deleted file mode 100644 index 63f3c07f463..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/readers.go +++ /dev/null @@ -1,154 +0,0 @@ -package ioutils - -import ( - "crypto/sha256" - "encoding/hex" - "io" - - "golang.org/x/net/context" -) - -type readCloserWrapper struct { - io.Reader - closer func() error -} - -func (r *readCloserWrapper) Close() error { - return r.closer() -} - -// NewReadCloserWrapper returns a new io.ReadCloser. -func NewReadCloserWrapper(r io.Reader, closer func() error) io.ReadCloser { - return &readCloserWrapper{ - Reader: r, - closer: closer, - } -} - -type readerErrWrapper struct { - reader io.Reader - closer func() -} - -func (r *readerErrWrapper) Read(p []byte) (int, error) { - n, err := r.reader.Read(p) - if err != nil { - r.closer() - } - return n, err -} - -// NewReaderErrWrapper returns a new io.Reader. -func NewReaderErrWrapper(r io.Reader, closer func()) io.Reader { - return &readerErrWrapper{ - reader: r, - closer: closer, - } -} - -// HashData returns the sha256 sum of src. -func HashData(src io.Reader) (string, error) { - h := sha256.New() - if _, err := io.Copy(h, src); err != nil { - return "", err - } - return "sha256:" + hex.EncodeToString(h.Sum(nil)), nil -} - -// OnEOFReader wraps an io.ReadCloser and a function -// the function will run at the end of file or close the file. -type OnEOFReader struct { - Rc io.ReadCloser - Fn func() -} - -func (r *OnEOFReader) Read(p []byte) (n int, err error) { - n, err = r.Rc.Read(p) - if err == io.EOF { - r.runFunc() - } - return -} - -// Close closes the file and run the function. -func (r *OnEOFReader) Close() error { - err := r.Rc.Close() - r.runFunc() - return err -} - -func (r *OnEOFReader) runFunc() { - if fn := r.Fn; fn != nil { - fn() - r.Fn = nil - } -} - -// cancelReadCloser wraps an io.ReadCloser with a context for cancelling read -// operations. -type cancelReadCloser struct { - cancel func() - pR *io.PipeReader // Stream to read from - pW *io.PipeWriter -} - -// NewCancelReadCloser creates a wrapper that closes the ReadCloser when the -// context is cancelled. The returned io.ReadCloser must be closed when it is -// no longer needed. -func NewCancelReadCloser(ctx context.Context, in io.ReadCloser) io.ReadCloser { - pR, pW := io.Pipe() - - // Create a context used to signal when the pipe is closed - doneCtx, cancel := context.WithCancel(context.Background()) - - p := &cancelReadCloser{ - cancel: cancel, - pR: pR, - pW: pW, - } - - go func() { - _, err := io.Copy(pW, in) - select { - case <-ctx.Done(): - // If the context was closed, p.closeWithError - // was already called. Calling it again would - // change the error that Read returns. - default: - p.closeWithError(err) - } - in.Close() - }() - go func() { - for { - select { - case <-ctx.Done(): - p.closeWithError(ctx.Err()) - case <-doneCtx.Done(): - return - } - } - }() - - return p -} - -// Read wraps the Read method of the pipe that provides data from the wrapped -// ReadCloser. -func (p *cancelReadCloser) Read(buf []byte) (n int, err error) { - return p.pR.Read(buf) -} - -// closeWithError closes the wrapper and its underlying reader. It will -// cause future calls to Read to return err. -func (p *cancelReadCloser) closeWithError(err error) { - p.pW.CloseWithError(err) - p.cancel() -} - -// Close closes the wrapper its underlying reader. It will cause -// future calls to Read to return io.EOF. -func (p *cancelReadCloser) Close() error { - p.closeWithError(io.EOF) - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go deleted file mode 100644 index 1539ad21b57..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/temp_unix.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !windows - -package ioutils - -import "io/ioutil" - -// TempDir on Unix systems is equivalent to ioutil.TempDir. -func TempDir(dir, prefix string) (string, error) { - return ioutil.TempDir(dir, prefix) -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go b/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go deleted file mode 100644 index c258e5fdd87..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/temp_windows.go +++ /dev/null @@ -1,18 +0,0 @@ -// +build windows - -package ioutils - -import ( - "io/ioutil" - - "github.com/docker/docker/pkg/longpath" -) - -// TempDir is the equivalent of ioutil.TempDir, except that the result is in Windows longpath format. -func TempDir(dir, prefix string) (string, error) { - tempDir, err := ioutil.TempDir(dir, prefix) - if err != nil { - return "", err - } - return longpath.AddPrefix(tempDir), nil -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go b/vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go deleted file mode 100644 index 52a4901adeb..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/writeflusher.go +++ /dev/null @@ -1,92 +0,0 @@ -package ioutils - -import ( - "io" - "sync" -) - -// WriteFlusher wraps the Write and Flush operation ensuring that every write -// is a flush. In addition, the Close method can be called to intercept -// Read/Write calls if the targets lifecycle has already ended. -type WriteFlusher struct { - w io.Writer - flusher flusher - flushed chan struct{} - flushedOnce sync.Once - closed chan struct{} - closeLock sync.Mutex -} - -type flusher interface { - Flush() -} - -var errWriteFlusherClosed = io.EOF - -func (wf *WriteFlusher) Write(b []byte) (n int, err error) { - select { - case <-wf.closed: - return 0, errWriteFlusherClosed - default: - } - - n, err = wf.w.Write(b) - wf.Flush() // every write is a flush. - return n, err -} - -// Flush the stream immediately. -func (wf *WriteFlusher) Flush() { - select { - case <-wf.closed: - return - default: - } - - wf.flushedOnce.Do(func() { - close(wf.flushed) - }) - wf.flusher.Flush() -} - -// Flushed returns the state of flushed. -// If it's flushed, return true, or else it return false. -func (wf *WriteFlusher) Flushed() bool { - // BUG(stevvooe): Remove this method. Its use is inherently racy. Seems to - // be used to detect whether or a response code has been issued or not. - // Another hook should be used instead. - var flushed bool - select { - case <-wf.flushed: - flushed = true - default: - } - return flushed -} - -// Close closes the write flusher, disallowing any further writes to the -// target. After the flusher is closed, all calls to write or flush will -// result in an error. -func (wf *WriteFlusher) Close() error { - wf.closeLock.Lock() - defer wf.closeLock.Unlock() - - select { - case <-wf.closed: - return errWriteFlusherClosed - default: - close(wf.closed) - } - return nil -} - -// NewWriteFlusher returns a new WriteFlusher. -func NewWriteFlusher(w io.Writer) *WriteFlusher { - var fl flusher - if f, ok := w.(flusher); ok { - fl = f - } else { - fl = &NopFlusher{} - } - return &WriteFlusher{w: w, flusher: fl, closed: make(chan struct{}), flushed: make(chan struct{})} -} diff --git a/vendor/github.com/docker/docker/pkg/ioutils/writers.go b/vendor/github.com/docker/docker/pkg/ioutils/writers.go deleted file mode 100644 index ccc7f9c23e0..00000000000 --- a/vendor/github.com/docker/docker/pkg/ioutils/writers.go +++ /dev/null @@ -1,66 +0,0 @@ -package ioutils - -import "io" - -// NopWriter represents a type which write operation is nop. -type NopWriter struct{} - -func (*NopWriter) Write(buf []byte) (int, error) { - return len(buf), nil -} - -type nopWriteCloser struct { - io.Writer -} - -func (w *nopWriteCloser) Close() error { return nil } - -// NopWriteCloser returns a nopWriteCloser. -func NopWriteCloser(w io.Writer) io.WriteCloser { - return &nopWriteCloser{w} -} - -// NopFlusher represents a type which flush operation is nop. -type NopFlusher struct{} - -// Flush is a nop operation. -func (f *NopFlusher) Flush() {} - -type writeCloserWrapper struct { - io.Writer - closer func() error -} - -func (r *writeCloserWrapper) Close() error { - return r.closer() -} - -// NewWriteCloserWrapper returns a new io.WriteCloser. -func NewWriteCloserWrapper(r io.Writer, closer func() error) io.WriteCloser { - return &writeCloserWrapper{ - Writer: r, - closer: closer, - } -} - -// WriteCounter wraps a concrete io.Writer and hold a count of the number -// of bytes written to the writer during a "session". -// This can be convenient when write return is masked -// (e.g., json.Encoder.Encode()) -type WriteCounter struct { - Count int64 - Writer io.Writer -} - -// NewWriteCounter returns a new WriteCounter. -func NewWriteCounter(w io.Writer) *WriteCounter { - return &WriteCounter{ - Writer: w, - } -} - -func (wc *WriteCounter) Write(p []byte) (count int, err error) { - count, err = wc.Writer.Write(p) - wc.Count += int64(count) - return -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go b/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go deleted file mode 100644 index 4734c311196..00000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog.go +++ /dev/null @@ -1,42 +0,0 @@ -package jsonlog - -import ( - "encoding/json" - "fmt" - "time" -) - -// JSONLog represents a log message, typically a single entry from a given log stream. -// JSONLogs can be easily serialized to and from JSON and support custom formatting. -type JSONLog struct { - // Log is the log message - Log string `json:"log,omitempty"` - // Stream is the log source - Stream string `json:"stream,omitempty"` - // Created is the created timestamp of log - Created time.Time `json:"time"` - // Attrs is the list of extra attributes provided by the user - Attrs map[string]string `json:"attrs,omitempty"` -} - -// Format returns the log formatted according to format -// If format is nil, returns the log message -// If format is json, returns the log marshaled in json format -// By default, returns the log with the log time formatted according to format. -func (jl *JSONLog) Format(format string) (string, error) { - if format == "" { - return jl.Log, nil - } - if format == "json" { - m, err := json.Marshal(jl) - return string(m), err - } - return fmt.Sprintf("%s %s", jl.Created.Format(format), jl.Log), nil -} - -// Reset resets the log to nil. -func (jl *JSONLog) Reset() { - jl.Log = "" - jl.Stream = "" - jl.Created = time.Time{} -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go b/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go deleted file mode 100644 index 83ce684a8ef..00000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/jsonlog_marshalling.go +++ /dev/null @@ -1,178 +0,0 @@ -// This code was initially generated by ffjson -// This code was generated via the following steps: -// $ go get -u github.com/pquerna/ffjson -// $ make BIND_DIR=. shell -// $ ffjson pkg/jsonlog/jsonlog.go -// $ mv pkg/jsonglog/jsonlog_ffjson.go pkg/jsonlog/jsonlog_marshalling.go -// -// It has been modified to improve the performance of time marshalling to JSON -// and to clean it up. -// Should this code need to be regenerated when the JSONLog struct is changed, -// the relevant changes which have been made are: -// import ( -// "bytes" -//- -// "unicode/utf8" -// ) -// -// func (mj *JSONLog) MarshalJSON() ([]byte, error) { -//@@ -20,13 +16,13 @@ func (mj *JSONLog) MarshalJSON() ([]byte, error) { -// } -// return buf.Bytes(), nil -// } -//+ -// func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { -//- var err error -//- var obj []byte -//- var first bool = true -//- _ = obj -//- _ = err -//- _ = first -//+ var ( -//+ err error -//+ timestamp string -//+ first bool = true -//+ ) -// buf.WriteString(`{`) -// if len(mj.Log) != 0 { -// if first == true { -//@@ -52,11 +48,11 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { -// buf.WriteString(`,`) -// } -// buf.WriteString(`"time":`) -//- obj, err = mj.Created.MarshalJSON() -//+ timestamp, err = FastTimeMarshalJSON(mj.Created) -// if err != nil { -// return err -// } -//- buf.Write(obj) -//+ buf.WriteString(timestamp) -// buf.WriteString(`}`) -// return nil -// } -// @@ -81,9 +81,10 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { -// if len(mj.Log) != 0 { -// - if first == true { -// - first = false -// - } else { -// - buf.WriteString(`,`) -// - } -// + first = false -// buf.WriteString(`"log":`) -// ffjsonWriteJSONString(buf, mj.Log) -// } - -package jsonlog - -import ( - "bytes" - "unicode/utf8" -) - -// MarshalJSON marshals the JSONLog. -func (mj *JSONLog) MarshalJSON() ([]byte, error) { - var buf bytes.Buffer - buf.Grow(1024) - if err := mj.MarshalJSONBuf(&buf); err != nil { - return nil, err - } - return buf.Bytes(), nil -} - -// MarshalJSONBuf marshals the JSONLog and stores the result to a bytes.Buffer. -func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error { - var ( - err error - timestamp string - first = true - ) - buf.WriteString(`{`) - if len(mj.Log) != 0 { - first = false - buf.WriteString(`"log":`) - ffjsonWriteJSONString(buf, mj.Log) - } - if len(mj.Stream) != 0 { - if first { - first = false - } else { - buf.WriteString(`,`) - } - buf.WriteString(`"stream":`) - ffjsonWriteJSONString(buf, mj.Stream) - } - if !first { - buf.WriteString(`,`) - } - buf.WriteString(`"time":`) - timestamp, err = FastTimeMarshalJSON(mj.Created) - if err != nil { - return err - } - buf.WriteString(timestamp) - buf.WriteString(`}`) - return nil -} - -func ffjsonWriteJSONString(buf *bytes.Buffer, s string) { - const hex = "0123456789abcdef" - - buf.WriteByte('"') - start := 0 - for i := 0; i < len(s); { - if b := s[i]; b < utf8.RuneSelf { - if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' { - i++ - continue - } - if start < i { - buf.WriteString(s[start:i]) - } - switch b { - case '\\', '"': - buf.WriteByte('\\') - buf.WriteByte(b) - case '\n': - buf.WriteByte('\\') - buf.WriteByte('n') - case '\r': - buf.WriteByte('\\') - buf.WriteByte('r') - default: - - buf.WriteString(`\u00`) - buf.WriteByte(hex[b>>4]) - buf.WriteByte(hex[b&0xF]) - } - i++ - start = i - continue - } - c, size := utf8.DecodeRuneInString(s[i:]) - if c == utf8.RuneError && size == 1 { - if start < i { - buf.WriteString(s[start:i]) - } - buf.WriteString(`\ufffd`) - i += size - start = i - continue - } - - if c == '\u2028' || c == '\u2029' { - if start < i { - buf.WriteString(s[start:i]) - } - buf.WriteString(`\u202`) - buf.WriteByte(hex[c&0xF]) - i += size - start = i - continue - } - i += size - } - if start < len(s) { - buf.WriteString(s[start:]) - } - buf.WriteByte('"') -} diff --git a/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go b/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go deleted file mode 100644 index 21173381495..00000000000 --- a/vendor/github.com/docker/docker/pkg/jsonlog/time_marshalling.go +++ /dev/null @@ -1,27 +0,0 @@ -// Package jsonlog provides helper functions to parse and print time (time.Time) as JSON. -package jsonlog - -import ( - "errors" - "time" -) - -const ( - // RFC3339NanoFixed is our own version of RFC339Nano because we want one - // that pads the nano seconds part with zeros to ensure - // the timestamps are aligned in the logs. - RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" - // JSONFormat is the format used by FastMarshalJSON - JSONFormat = `"` + time.RFC3339Nano + `"` -) - -// FastTimeMarshalJSON avoids one of the extra allocations that -// time.MarshalJSON is making. -func FastTimeMarshalJSON(t time.Time) (string, error) { - if y := t.Year(); y < 0 || y >= 10000 { - // RFC 3339 is clear that years are 4 digits exactly. - // See golang.org/issue/4556#c15 for more discussion. - return "", errors.New("time.MarshalJSON: year outside of range [0,9999]") - } - return t.Format(JSONFormat), nil -} diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD b/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD index 71d22643512..a887bd3297f 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/BUILD @@ -8,7 +8,6 @@ go_library( visibility = ["//visibility:public"], deps = [ "//vendor/github.com/Nvveen/Gotty:go_default_library", - "//vendor/github.com/docker/docker/pkg/jsonlog:go_default_library", "//vendor/github.com/docker/docker/pkg/term:go_default_library", "//vendor/github.com/docker/go-units:go_default_library", ], diff --git a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go index dc785d61872..14377ee835e 100644 --- a/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go +++ b/vendor/github.com/docker/docker/pkg/jsonmessage/jsonmessage.go @@ -9,12 +9,14 @@ import ( "time" "github.com/Nvveen/Gotty" - - "github.com/docker/docker/pkg/jsonlog" "github.com/docker/docker/pkg/term" "github.com/docker/go-units" ) +// RFC3339NanoFixed is time.RFC3339Nano with nanoseconds padded using zeros to +// ensure the formatted time isalways the same number of characters. +const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" + // JSONError wraps a concrete Code and Message, `Code` is // is an integer error code, `Message` is the error message. type JSONError struct { @@ -38,21 +40,17 @@ type JSONProgress struct { // If true, don't show xB/yB HideCounts bool `json:"hidecounts,omitempty"` Units string `json:"units,omitempty"` + nowFunc func() time.Time + winSize int } func (p *JSONProgress) String() string { var ( - width = 200 + width = p.width() pbBox string numbersBox string timeLeftBox string ) - - ws, err := term.GetWinsize(p.terminalFd) - if err == nil { - width = int(ws.Width) - } - if p.Current <= 0 && p.Total <= 0 { return "" } @@ -101,7 +99,7 @@ func (p *JSONProgress) String() string { } if p.Current > 0 && p.Start > 0 && percentage < 50 { - fromStart := time.Now().UTC().Sub(time.Unix(p.Start, 0)) + fromStart := p.now().Sub(time.Unix(p.Start, 0)) perEntry := fromStart / time.Duration(p.Current) left := time.Duration(p.Total-p.Current) * perEntry left = (left / time.Second) * time.Second @@ -113,6 +111,28 @@ func (p *JSONProgress) String() string { return pbBox + numbersBox + timeLeftBox } +// shim for testing +func (p *JSONProgress) now() time.Time { + if p.nowFunc == nil { + p.nowFunc = func() time.Time { + return time.Now().UTC() + } + } + return p.nowFunc() +} + +// shim for testing +func (p *JSONProgress) width() int { + if p.winSize != 0 { + return p.winSize + } + ws, err := term.GetWinsize(p.terminalFd) + if err == nil { + return int(ws.Width) + } + return 200 +} + // JSONMessage defines a message struct. It describes // the created time, where it from, status, ID of the // message. It's used for docker events. @@ -187,7 +207,7 @@ func cursorDown(out io.Writer, ti termInfo, l int) { func (jm *JSONMessage) Display(out io.Writer, termInfo termInfo) error { if jm.Error != nil { if jm.Error.Code == 401 { - return fmt.Errorf("Authentication is required.") + return fmt.Errorf("authentication is required") } return jm.Error } @@ -200,9 +220,9 @@ func (jm *JSONMessage) Display(out io.Writer, termInfo termInfo) error { return nil } if jm.TimeNano != 0 { - fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(jsonlog.RFC3339NanoFixed)) + fmt.Fprintf(out, "%s ", time.Unix(0, jm.TimeNano).Format(RFC3339NanoFixed)) } else if jm.Time != 0 { - fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(jsonlog.RFC3339NanoFixed)) + fmt.Fprintf(out, "%s ", time.Unix(jm.Time, 0).Format(RFC3339NanoFixed)) } if jm.ID != "" { fmt.Fprintf(out, "%s: ", jm.ID) @@ -225,7 +245,7 @@ func (jm *JSONMessage) Display(out io.Writer, termInfo termInfo) error { // DisplayJSONMessagesStream displays a json message stream from `in` to `out`, `isTerminal` // describes if `out` is a terminal. If this is the case, it will print `\n` at the end of // each line and move the cursor while displaying. -func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(*json.RawMessage)) error { +func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, isTerminal bool, auxCallback func(JSONMessage)) error { var ( dec = json.NewDecoder(in) ids = make(map[string]int) @@ -257,7 +277,7 @@ func DisplayJSONMessagesStream(in io.Reader, out io.Writer, terminalFd uintptr, if jm.Aux != nil { if auxCallback != nil { - auxCallback(jm.Aux) + auxCallback(jm) } continue } @@ -310,6 +330,6 @@ type stream interface { } // DisplayJSONMessagesToStream prints json messages to the output stream -func DisplayJSONMessagesToStream(in io.Reader, stream stream, auxCallback func(*json.RawMessage)) error { +func DisplayJSONMessagesToStream(in io.Reader, stream stream, auxCallback func(JSONMessage)) error { return DisplayJSONMessagesStream(in, stream, stream.FD(), stream.IsTerminal(), auxCallback) } diff --git a/vendor/github.com/docker/docker/pkg/longpath/BUILD b/vendor/github.com/docker/docker/pkg/longpath/BUILD deleted file mode 100644 index e683d0dff17..00000000000 --- a/vendor/github.com/docker/docker/pkg/longpath/BUILD +++ /dev/null @@ -1,23 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = ["longpath.go"], - importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/longpath", - importpath = "github.com/docker/docker/pkg/longpath", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/docker/docker/pkg/longpath/longpath.go b/vendor/github.com/docker/docker/pkg/longpath/longpath.go deleted file mode 100644 index 9b15bfff4c9..00000000000 --- a/vendor/github.com/docker/docker/pkg/longpath/longpath.go +++ /dev/null @@ -1,26 +0,0 @@ -// longpath introduces some constants and helper functions for handling long paths -// in Windows, which are expected to be prepended with `\\?\` and followed by either -// a drive letter, a UNC server\share, or a volume identifier. - -package longpath - -import ( - "strings" -) - -// Prefix is the longpath prefix for Windows file paths. -const Prefix = `\\?\` - -// AddPrefix will add the Windows long path prefix to the path provided if -// it does not already have it. -func AddPrefix(path string) string { - if !strings.HasPrefix(path, Prefix) { - if strings.HasPrefix(path, `\\`) { - // This is a UNC path, so we need to add 'UNC' to the path as well. - path = Prefix + `UNC` + path[1:] - } else { - path = Prefix + path - } - } - return path -} diff --git a/vendor/github.com/docker/docker/pkg/mount/BUILD b/vendor/github.com/docker/docker/pkg/mount/BUILD index 7994b771998..d5aaca3ccea 100644 --- a/vendor/github.com/docker/docker/pkg/mount/BUILD +++ b/vendor/github.com/docker/docker/pkg/mount/BUILD @@ -10,31 +10,27 @@ go_library( "mount.go", "mounter_freebsd.go", "mounter_linux.go", - "mounter_solaris.go", "mounter_unsupported.go", "mountinfo.go", "mountinfo_freebsd.go", "mountinfo_linux.go", - "mountinfo_solaris.go", "mountinfo_unsupported.go", "mountinfo_windows.go", "sharedsubtree_linux.go", - "sharedsubtree_solaris.go", ], cgo = True, importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/mount", importpath = "github.com/docker/docker/pkg/mount", visibility = ["//visibility:public"], - deps = select({ + deps = [ + "//vendor/github.com/sirupsen/logrus:go_default_library", + ] + select({ "@io_bazel_rules_go//go/platform:freebsd": [ "//vendor/golang.org/x/sys/unix:go_default_library", ], "@io_bazel_rules_go//go/platform:linux": [ "//vendor/golang.org/x/sys/unix:go_default_library", ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], "//conditions:default": [], }), ) diff --git a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go index 9ed741e3ff5..43d5e339f0e 100644 --- a/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/mount/flags_unsupported.go @@ -1,4 +1,4 @@ -// +build !linux,!freebsd freebsd,!cgo solaris,!cgo +// +build !linux,!freebsd freebsd,!cgo package mount diff --git a/vendor/github.com/docker/docker/pkg/mount/mount.go b/vendor/github.com/docker/docker/pkg/mount/mount.go index c9fdfd69425..c329819b6ed 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mount.go +++ b/vendor/github.com/docker/docker/pkg/mount/mount.go @@ -3,28 +3,64 @@ package mount import ( "sort" "strings" + "syscall" + + "github.com/sirupsen/logrus" ) -// GetMounts retrieves a list of mounts for the current running process. -func GetMounts() ([]*Info, error) { - return parseMountTable() +// FilterFunc is a type defining a callback function +// to filter out unwanted entries. It takes a pointer +// to an Info struct (not fully populated, currently +// only Mountpoint is filled in), and returns two booleans: +// - skip: true if the entry should be skipped +// - stop: true if parsing should be stopped after the entry +type FilterFunc func(*Info) (skip, stop bool) + +// PrefixFilter discards all entries whose mount points +// do not start with a prefix specified +func PrefixFilter(prefix string) FilterFunc { + return func(m *Info) (bool, bool) { + skip := !strings.HasPrefix(m.Mountpoint, prefix) + return skip, false + } +} + +// SingleEntryFilter looks for a specific entry +func SingleEntryFilter(mp string) FilterFunc { + return func(m *Info) (bool, bool) { + if m.Mountpoint == mp { + return false, true // don't skip, stop now + } + return true, false // skip, keep going + } +} + +// ParentsFilter returns all entries whose mount points +// can be parents of a path specified, discarding others. +// For example, given `/var/lib/docker/something`, entries +// like `/var/lib/docker`, `/var` and `/` are returned. +func ParentsFilter(path string) FilterFunc { + return func(m *Info) (bool, bool) { + skip := !strings.HasPrefix(path, m.Mountpoint) + return skip, false + } +} + +// GetMounts retrieves a list of mounts for the current running process, +// with an optional filter applied (use nil for no filter). +func GetMounts(f FilterFunc) ([]*Info, error) { + return parseMountTable(f) } // Mounted determines if a specified mountpoint has been mounted. -// On Linux it looks at /proc/self/mountinfo and on Solaris at mnttab. +// On Linux it looks at /proc/self/mountinfo. func Mounted(mountpoint string) (bool, error) { - entries, err := parseMountTable() + entries, err := GetMounts(SingleEntryFilter(mountpoint)) if err != nil { return false, err } - // Search the table for the mountpoint - for _, e := range entries { - if e.Mountpoint == mountpoint { - return true, nil - } - } - return false, nil + return len(entries) > 0, nil } // Mount will mount filesystem according to the specified configuration, on the @@ -53,34 +89,53 @@ func ForceMount(device, target, mType, options string) error { // Unmount lazily unmounts a filesystem on supported platforms, otherwise // does a normal unmount. func Unmount(target string) error { - if mounted, err := Mounted(target); err != nil || !mounted { - return err + err := unmount(target, mntDetach) + if err == syscall.EINVAL { + // ignore "not mounted" error + err = nil } - return unmount(target, mntDetach) + return err } // RecursiveUnmount unmounts the target and all mounts underneath, starting with // the deepsest mount first. func RecursiveUnmount(target string) error { - mounts, err := GetMounts() + mounts, err := parseMountTable(PrefixFilter(target)) if err != nil { return err } // Make the deepest mount be first - sort.Sort(sort.Reverse(byMountpoint(mounts))) + sort.Slice(mounts, func(i, j int) bool { + return len(mounts[i].Mountpoint) > len(mounts[j].Mountpoint) + }) for i, m := range mounts { - if !strings.HasPrefix(m.Mountpoint, target) { + logrus.Debugf("Trying to unmount %s", m.Mountpoint) + err = unmount(m.Mountpoint, mntDetach) + if err != nil { + // If the error is EINVAL either this whole package is wrong (invalid flags passed to unmount(2)) or this is + // not a mountpoint (which is ok in this case). + // Meanwhile calling `Mounted()` is very expensive. + // + // We've purposefully used `syscall.EINVAL` here instead of `unix.EINVAL` to avoid platform branching + // Since `EINVAL` is defined for both Windows and Linux in the `syscall` package (and other platforms), + // this is nicer than defining a custom value that we can refer to in each platform file. + if err == syscall.EINVAL { + continue + } + if i == len(mounts)-1 { + if mounted, e := Mounted(m.Mountpoint); e != nil || mounted { + return err + } + continue + } + // This is some submount, we can ignore this error for now, the final unmount will fail if this is a real problem + logrus.WithError(err).Warnf("Failed to unmount submount %s", m.Mountpoint) continue } - if err := Unmount(m.Mountpoint); err != nil && i == len(mounts)-1 { - if mounted, err := Mounted(m.Mountpoint); err != nil || mounted { - return err - } - // Ignore errors for submounts and continue trying to unmount others - // The final unmount should fail if there ane any submounts remaining - } + + logrus.Debugf("Unmounted %s", m.Mountpoint) } return nil } diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go b/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go deleted file mode 100644 index c684aa81fcc..00000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_solaris.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build solaris,cgo - -package mount - -import ( - "golang.org/x/sys/unix" - "unsafe" -) - -// #include -// #include -// #include -// int Mount(const char *spec, const char *dir, int mflag, -// char *fstype, char *dataptr, int datalen, char *optptr, int optlen) { -// return mount(spec, dir, mflag, fstype, dataptr, datalen, optptr, optlen); -// } -import "C" - -func mount(device, target, mType string, flag uintptr, data string) error { - spec := C.CString(device) - dir := C.CString(target) - fstype := C.CString(mType) - _, err := C.Mount(spec, dir, C.int(flag), fstype, nil, 0, nil, 0) - C.free(unsafe.Pointer(spec)) - C.free(unsafe.Pointer(dir)) - C.free(unsafe.Pointer(fstype)) - return err -} - -func unmount(target string, flag int) error { - err := unix.Unmount(target, flag) - return err -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go index a2a3bb457fc..eb93365eb74 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/mount/mounter_unsupported.go @@ -1,4 +1,4 @@ -// +build !linux,!freebsd,!solaris freebsd,!cgo solaris,!cgo +// +build !linux,!freebsd freebsd,!cgo package mount diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo.go index ff4cc1d86b6..e3fc3535e93 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo.go @@ -38,17 +38,3 @@ type Info struct { // VfsOpts represents per super block options. VfsOpts string } - -type byMountpoint []*Info - -func (by byMountpoint) Len() int { - return len(by) -} - -func (by byMountpoint) Less(i, j int) bool { - return by[i].Mountpoint < by[j].Mountpoint -} - -func (by byMountpoint) Swap(i, j int) { - by[i], by[j] = by[j], by[i] -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go index 4f32edcd906..3700860ca35 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_freebsd.go @@ -15,7 +15,7 @@ import ( // Parse /proc/self/mountinfo because comparing Dev and ino does not work from // bind mounts. -func parseMountTable() ([]*Info, error) { +func parseMountTable(filter FilterFunc) ([]*Info, error) { var rawEntries *C.struct_statfs count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) @@ -32,10 +32,24 @@ func parseMountTable() ([]*Info, error) { var out []*Info for _, entry := range entries { var mountinfo Info + var skip, stop bool mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) + + if filter != nil { + // filter out entries we're not interested in + skip, stop = filter(p) + if skip { + continue + } + } + mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) + out = append(out, &mountinfo) + if stop { + break + } } return out, nil } diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go index be69fee1d7b..614a479f6cf 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_linux.go @@ -1,5 +1,3 @@ -// +build linux - package mount import ( @@ -7,78 +5,117 @@ import ( "fmt" "io" "os" + "strconv" "strings" ) -const ( - /* 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue - (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) +func parseInfoFile(r io.Reader, filter FilterFunc) ([]*Info, error) { + s := bufio.NewScanner(r) + out := []*Info{} + for s.Scan() { + if err := s.Err(); err != nil { + return nil, err + } + /* + 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue + (1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) - (1) mount ID: unique identifier of the mount (may be reused after umount) - (2) parent ID: ID of parent (or of self for the top of the mount tree) - (3) major:minor: value of st_dev for files on filesystem - (4) root: root of the mount within the filesystem - (5) mount point: mount point relative to the process's root - (6) mount options: per mount options - (7) optional fields: zero or more fields of the form "tag[:value]" - (8) separator: marks the end of the optional fields - (9) filesystem type: name of filesystem of the form "type[.subtype]" - (10) mount source: filesystem specific information or "none" - (11) super options: per super block options*/ - mountinfoFormat = "%d %d %d:%d %s %s %s %s" -) + (1) mount ID: unique identifier of the mount (may be reused after umount) + (2) parent ID: ID of parent (or of self for the top of the mount tree) + (3) major:minor: value of st_dev for files on filesystem + (4) root: root of the mount within the filesystem + (5) mount point: mount point relative to the process's root + (6) mount options: per mount options + (7) optional fields: zero or more fields of the form "tag[:value]" + (8) separator: marks the end of the optional fields + (9) filesystem type: name of filesystem of the form "type[.subtype]" + (10) mount source: filesystem specific information or "none" + (11) super options: per super block options + */ + + text := s.Text() + fields := strings.Split(text, " ") + numFields := len(fields) + if numFields < 10 { + // should be at least 10 fields + return nil, fmt.Errorf("Parsing '%s' failed: not enough fields (%d)", text, numFields) + } + + p := &Info{} + // ignore any numbers parsing errors, as there should not be any + p.ID, _ = strconv.Atoi(fields[0]) + p.Parent, _ = strconv.Atoi(fields[1]) + mm := strings.Split(fields[2], ":") + if len(mm) != 2 { + return nil, fmt.Errorf("Parsing '%s' failed: unexpected minor:major pair %s", text, mm) + } + p.Major, _ = strconv.Atoi(mm[0]) + p.Minor, _ = strconv.Atoi(mm[1]) + + p.Root = fields[3] + p.Mountpoint = fields[4] + p.Opts = fields[5] + + var skip, stop bool + if filter != nil { + // filter out entries we're not interested in + skip, stop = filter(p) + if skip { + continue + } + } + + // one or more optional fields, when a separator (-) + i := 6 + for ; i < numFields && fields[i] != "-"; i++ { + switch i { + case 6: + p.Optional = fields[6] + default: + /* NOTE there might be more optional fields before the such as + fields[7]...fields[N] (where N < sepIndex), although + as of Linux kernel 4.15 the only known ones are + mount propagation flags in fields[6]. The correct + behavior is to ignore any unknown optional fields. + */ + break + } + } + if i == numFields { + return nil, fmt.Errorf("Parsing '%s' failed: missing separator ('-')", text) + } + + // There should be 3 fields after the separator... + if i+4 > numFields { + return nil, fmt.Errorf("Parsing '%s' failed: not enough fields after a separator", text) + } + // ... but in Linux <= 3.9 mounting a cifs with spaces in a share name + // (like "//serv/My Documents") _may_ end up having a space in the last field + // of mountinfo (like "unc=//serv/My Documents"). Since kernel 3.10-rc1, cifs + // option unc= is ignored, so a space should not appear. In here we ignore + // those "extra" fields caused by extra spaces. + p.Fstype = fields[i+1] + p.Source = fields[i+2] + p.VfsOpts = fields[i+3] + + out = append(out, p) + if stop { + break + } + } + return out, nil +} // Parse /proc/self/mountinfo because comparing Dev and ino does not work from // bind mounts -func parseMountTable() ([]*Info, error) { +func parseMountTable(filter FilterFunc) ([]*Info, error) { f, err := os.Open("/proc/self/mountinfo") if err != nil { return nil, err } defer f.Close() - return parseInfoFile(f) -} - -func parseInfoFile(r io.Reader) ([]*Info, error) { - var ( - s = bufio.NewScanner(r) - out = []*Info{} - ) - - for s.Scan() { - if err := s.Err(); err != nil { - return nil, err - } - - var ( - p = &Info{} - text = s.Text() - optionalFields string - ) - - if _, err := fmt.Sscanf(text, mountinfoFormat, - &p.ID, &p.Parent, &p.Major, &p.Minor, - &p.Root, &p.Mountpoint, &p.Opts, &optionalFields); err != nil { - return nil, fmt.Errorf("Scanning '%s' failed: %s", text, err) - } - // Safe as mountinfo encodes mountpoints with spaces as \040. - index := strings.Index(text, " - ") - postSeparatorFields := strings.Fields(text[index+3:]) - if len(postSeparatorFields) < 3 { - return nil, fmt.Errorf("Error found less than 3 fields post '-' in %q", text) - } - - if optionalFields != "-" { - p.Optional = optionalFields - } - - p.Fstype = postSeparatorFields[0] - p.Source = postSeparatorFields[1] - p.VfsOpts = strings.Join(postSeparatorFields[2:], " ") - out = append(out, p) - } - return out, nil + return parseInfoFile(f, filter) } // PidMountInfo collects the mounts for a specific process ID. If the process @@ -91,5 +128,5 @@ func PidMountInfo(pid int) ([]*Info, error) { } defer f.Close() - return parseInfoFile(f) + return parseInfoFile(f, nil) } diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go deleted file mode 100644 index ad9ab57f8b8..00000000000 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_solaris.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build solaris,cgo - -package mount - -/* -#include -#include -*/ -import "C" - -import ( - "fmt" -) - -func parseMountTable() ([]*Info, error) { - mnttab := C.fopen(C.CString(C.MNTTAB), C.CString("r")) - if mnttab == nil { - return nil, fmt.Errorf("Failed to open %s", C.MNTTAB) - } - - var out []*Info - var mp C.struct_mnttab - - ret := C.getmntent(mnttab, &mp) - for ret == 0 { - var mountinfo Info - mountinfo.Mountpoint = C.GoString(mp.mnt_mountp) - mountinfo.Source = C.GoString(mp.mnt_special) - mountinfo.Fstype = C.GoString(mp.mnt_fstype) - mountinfo.Opts = C.GoString(mp.mnt_mntopts) - out = append(out, &mountinfo) - ret = C.getmntent(mnttab, &mp) - } - - C.fclose(mnttab) - return out, nil -} diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go index 7fbcf19214b..b57a7bd8fc2 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_unsupported.go @@ -1,4 +1,4 @@ -// +build !windows,!linux,!freebsd,!solaris freebsd,!cgo solaris,!cgo +// +build !windows,!linux,!freebsd freebsd,!cgo package mount @@ -7,6 +7,6 @@ import ( "runtime" ) -func parseMountTable() ([]*Info, error) { +func parseMountTable(f FilterFunc) ([]*Info, error) { return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) } diff --git a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go b/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go index dab8a37ed01..cb41910b1a7 100644 --- a/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go +++ b/vendor/github.com/docker/docker/pkg/mount/mountinfo_windows.go @@ -1,6 +1,6 @@ package mount -func parseMountTable() ([]*Info, error) { +func parseMountTable(f FilterFunc) ([]*Info, error) { // Do NOT return an error! return nil, nil } diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go index 8ceec84bc6c..f3c13e5a16c 100644 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go +++ b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_linux.go @@ -1,5 +1,3 @@ -// +build linux - package mount // MakeShared ensures a mounted filesystem has the SHARED mount option enabled. diff --git a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go b/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go deleted file mode 100644 index 09f6b03cbc0..00000000000 --- a/vendor/github.com/docker/docker/pkg/mount/sharedsubtree_solaris.go +++ /dev/null @@ -1,58 +0,0 @@ -// +build solaris - -package mount - -// MakeShared ensures a mounted filesystem has the SHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "shared") -} - -// MakeRShared ensures a mounted filesystem has the RSHARED mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRShared(mountPoint string) error { - return ensureMountedAs(mountPoint, "rshared") -} - -// MakePrivate ensures a mounted filesystem has the PRIVATE mount option enabled. -// See the supported options in flags.go for further reference. -func MakePrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "private") -} - -// MakeRPrivate ensures a mounted filesystem has the RPRIVATE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeRPrivate(mountPoint string) error { - return ensureMountedAs(mountPoint, "rprivate") -} - -// MakeSlave ensures a mounted filesystem has the SLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "slave") -} - -// MakeRSlave ensures a mounted filesystem has the RSLAVE mount option enabled. -// See the supported options in flags.go for further reference. -func MakeRSlave(mountPoint string) error { - return ensureMountedAs(mountPoint, "rslave") -} - -// MakeUnbindable ensures a mounted filesystem has the UNBINDABLE mount option -// enabled. See the supported options in flags.go for further reference. -func MakeUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "unbindable") -} - -// MakeRUnbindable ensures a mounted filesystem has the RUNBINDABLE mount -// option enabled. See the supported options in flags.go for further reference. -func MakeRUnbindable(mountPoint string) error { - return ensureMountedAs(mountPoint, "runbindable") -} - -func ensureMountedAs(mountPoint, options string) error { - // TODO: Solaris does not support bind mounts. - // Evaluate lofs and also look at the relevant - // mount flags to be supported. - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD index adcb9d9fa85..c716fec414a 100644 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD +++ b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/BUILD @@ -4,11 +4,9 @@ go_library( name = "go_default_library", srcs = [ "operatingsystem_linux.go", - "operatingsystem_solaris.go", "operatingsystem_unix.go", "operatingsystem_windows.go", ], - cgo = True, importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/parsers/operatingsystem", importpath = "github.com/docker/docker/pkg/parsers/operatingsystem", visibility = ["//visibility:public"], @@ -17,7 +15,7 @@ go_library( "//vendor/github.com/mattn/go-shellwords:go_default_library", ], "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/golang.org/x/sys/windows:go_default_library", + "//vendor/golang.org/x/sys/windows/registry:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go deleted file mode 100644 index d08ad148604..00000000000 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_solaris.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build solaris,cgo - -package operatingsystem - -/* -#include -*/ -import "C" - -import ( - "bytes" - "errors" - "io/ioutil" -) - -var etcOsRelease = "/etc/release" - -// GetOperatingSystem gets the name of the current operating system. -func GetOperatingSystem() (string, error) { - b, err := ioutil.ReadFile(etcOsRelease) - if err != nil { - return "", err - } - if i := bytes.Index(b, []byte("\n")); i >= 0 { - b = bytes.Trim(b[:i], " ") - return string(b), nil - } - return "", errors.New("release not found") -} - -// IsContainerized returns true if we are running inside a container. -func IsContainerized() (bool, error) { - if C.getzoneid() != 0 { - return true, nil - } - return false, nil -} diff --git a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go index 5d8b42cc365..28642c0b7b4 100644 --- a/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go +++ b/vendor/github.com/docker/docker/pkg/parsers/operatingsystem/operatingsystem_windows.go @@ -1,44 +1,45 @@ package operatingsystem import ( - "unsafe" + "fmt" - "golang.org/x/sys/windows" + "golang.org/x/sys/windows/registry" ) -// See https://code.google.com/p/go/source/browse/src/pkg/mime/type_windows.go?r=d14520ac25bf6940785aabb71f5be453a286f58c -// for a similar sample - // GetOperatingSystem gets the name of the current operating system. func GetOperatingSystem() (string, error) { - var h windows.Handle - // Default return value ret := "Unknown Operating System" - if err := windows.RegOpenKeyEx(windows.HKEY_LOCAL_MACHINE, - windows.StringToUTF16Ptr(`SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\`), - 0, - windows.KEY_READ, - &h); err != nil { + k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) + if err != nil { return ret, err } - defer windows.RegCloseKey(h) + defer k.Close() - var buf [1 << 10]uint16 - var typ uint32 - n := uint32(len(buf) * 2) // api expects array of bytes, not uint16 - - if err := windows.RegQueryValueEx(h, - windows.StringToUTF16Ptr("ProductName"), - nil, - &typ, - (*byte)(unsafe.Pointer(&buf[0])), - &n); err != nil { + pn, _, err := k.GetStringValue("ProductName") + if err != nil { return ret, err } - ret = windows.UTF16ToString(buf[:]) + ret = pn + + ri, _, err := k.GetStringValue("ReleaseId") + if err != nil { + return ret, err + } + ret = fmt.Sprintf("%s Version %s", ret, ri) + + cbn, _, err := k.GetStringValue("CurrentBuildNumber") + if err != nil { + return ret, err + } + + ubr, _, err := k.GetIntegerValue("UBR") + if err != nil { + return ret, err + } + ret = fmt.Sprintf("%s (OS Build %s.%d)", ret, cbn, ubr) return ret, nil } diff --git a/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go b/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go index a018a203f38..aa5d6c23823 100644 --- a/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go +++ b/vendor/github.com/docker/docker/pkg/stdcopy/stdcopy.go @@ -21,7 +21,7 @@ const ( // Stderr represents standard error steam type. Stderr // Systemerr represents errors originating from the system that make it - // into the the multiplexed stream. + // into the multiplexed stream. Systemerr stdWriterPrefixLen = 8 diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/BUILD b/vendor/github.com/docker/docker/pkg/sysinfo/BUILD index 41ba8d9aa84..7ce8cf4b5ac 100644 --- a/vendor/github.com/docker/docker/pkg/sysinfo/BUILD +++ b/vendor/github.com/docker/docker/pkg/sysinfo/BUILD @@ -8,17 +8,9 @@ go_library( "numcpu_windows.go", "sysinfo.go", "sysinfo_linux.go", - "sysinfo_solaris.go", "sysinfo_unix.go", "sysinfo_windows.go", ], - cgo = True, - clinkopts = select({ - "@io_bazel_rules_go//go/platform:solaris": [ - "-llgrp", - ], - "//conditions:default": [], - }), importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/sysinfo", importpath = "github.com/docker/docker/pkg/sysinfo", visibility = ["//visibility:public"], diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go b/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go index f1d2d9db30b..5739b33ac62 100644 --- a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go +++ b/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_linux.go @@ -1,5 +1,3 @@ -// +build linux - package sysinfo import ( diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go b/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go index 1d89dd55030..3516182ff23 100644 --- a/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go +++ b/vendor/github.com/docker/docker/pkg/sysinfo/numcpu_windows.go @@ -1,5 +1,3 @@ -// +build windows - package sysinfo import ( diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go deleted file mode 100644 index c858d57e089..00000000000 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_solaris.go +++ /dev/null @@ -1,121 +0,0 @@ -// +build solaris,cgo - -package sysinfo - -import ( - "bytes" - "os/exec" - "strconv" - "strings" -) - -/* -#cgo LDFLAGS: -llgrp -#include -#include -#include -int getLgrpCount() { - lgrp_cookie_t lgrpcookie = LGRP_COOKIE_NONE; - uint_t nlgrps; - - if ((lgrpcookie = lgrp_init(LGRP_VIEW_OS)) == LGRP_COOKIE_NONE) { - return -1; - } - nlgrps = lgrp_nlgrps(lgrpcookie); - return nlgrps; -} -*/ -import "C" - -// IsCPUSharesAvailable returns whether CPUShares setting is supported. -// We need FSS to be set as default scheduling class to support CPU Shares -func IsCPUSharesAvailable() bool { - cmd := exec.Command("/usr/sbin/dispadmin", "-d") - outBuf := new(bytes.Buffer) - errBuf := new(bytes.Buffer) - cmd.Stderr = errBuf - cmd.Stdout = outBuf - - if err := cmd.Run(); err != nil { - return false - } - return (strings.Contains(outBuf.String(), "FSS")) -} - -// New returns a new SysInfo, using the filesystem to detect which features -// the kernel supports. -//NOTE Solaris: If we change the below capabilities be sure -// to update verifyPlatformContainerSettings() in daemon_solaris.go -func New(quiet bool) *SysInfo { - sysInfo := &SysInfo{} - sysInfo.cgroupMemInfo = setCgroupMem(quiet) - sysInfo.cgroupCPUInfo = setCgroupCPU(quiet) - sysInfo.cgroupBlkioInfo = setCgroupBlkioInfo(quiet) - sysInfo.cgroupCpusetInfo = setCgroupCPUsetInfo(quiet) - - sysInfo.IPv4ForwardingDisabled = false - - sysInfo.AppArmor = false - - return sysInfo -} - -// setCgroupMem reads the memory information for Solaris. -func setCgroupMem(quiet bool) cgroupMemInfo { - - return cgroupMemInfo{ - MemoryLimit: true, - SwapLimit: true, - MemoryReservation: false, - OomKillDisable: false, - MemorySwappiness: false, - KernelMemory: false, - } -} - -// setCgroupCPU reads the cpu information for Solaris. -func setCgroupCPU(quiet bool) cgroupCPUInfo { - - return cgroupCPUInfo{ - CPUShares: true, - CPUCfsPeriod: false, - CPUCfsQuota: true, - CPURealtimePeriod: false, - CPURealtimeRuntime: false, - } -} - -// blkio switches are not supported in Solaris. -func setCgroupBlkioInfo(quiet bool) cgroupBlkioInfo { - - return cgroupBlkioInfo{ - BlkioWeight: false, - BlkioWeightDevice: false, - } -} - -// setCgroupCPUsetInfo reads the cpuset information for Solaris. -func setCgroupCPUsetInfo(quiet bool) cgroupCpusetInfo { - - return cgroupCpusetInfo{ - Cpuset: true, - Cpus: getCPUCount(), - Mems: getLgrpCount(), - } -} - -func getCPUCount() string { - ncpus := C.sysconf(C._SC_NPROCESSORS_ONLN) - if ncpus <= 0 { - return "" - } - return strconv.FormatInt(int64(ncpus), 16) -} - -func getLgrpCount() string { - nlgrps := C.getLgrpCount() - if nlgrps <= 0 { - return "" - } - return strconv.FormatInt(int64(nlgrps), 16) -} diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go index 45f3ef1c65f..beac32840cd 100644 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go +++ b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_unix.go @@ -1,8 +1,8 @@ -// +build !linux,!solaris,!windows +// +build !linux,!windows package sysinfo -// New returns an empty SysInfo for non linux nor solaris for now. +// New returns an empty SysInfo for non linux for now. func New(quiet bool) *SysInfo { sysInfo := &SysInfo{} return sysInfo diff --git a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go index 4e6255bc592..8889318c398 100644 --- a/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go +++ b/vendor/github.com/docker/docker/pkg/sysinfo/sysinfo_windows.go @@ -1,5 +1,3 @@ -// +build windows - package sysinfo // New returns an empty SysInfo for windows for now. diff --git a/vendor/github.com/docker/docker/pkg/system/BUILD b/vendor/github.com/docker/docker/pkg/system/BUILD deleted file mode 100644 index a7a2ab3b7ad..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/BUILD +++ /dev/null @@ -1,121 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "chtimes.go", - "chtimes_unix.go", - "chtimes_windows.go", - "errors.go", - "events_windows.go", - "exitcode.go", - "filesys.go", - "filesys_windows.go", - "init.go", - "init_windows.go", - "lcow_unix.go", - "lcow_windows.go", - "lstat_unix.go", - "lstat_windows.go", - "meminfo.go", - "meminfo_linux.go", - "meminfo_solaris.go", - "meminfo_unsupported.go", - "meminfo_windows.go", - "mknod.go", - "mknod_windows.go", - "path.go", - "path_unix.go", - "path_windows.go", - "process_unix.go", - "rm.go", - "stat_darwin.go", - "stat_freebsd.go", - "stat_linux.go", - "stat_openbsd.go", - "stat_solaris.go", - "stat_unix.go", - "stat_windows.go", - "syscall_unix.go", - "syscall_windows.go", - "umask.go", - "umask_windows.go", - "utimes_freebsd.go", - "utimes_linux.go", - "utimes_unsupported.go", - "xattrs_linux.go", - "xattrs_unsupported.go", - ], - cgo = True, - clinkopts = select({ - "@io_bazel_rules_go//go/platform:solaris": [ - "-lkstat", - ], - "//conditions:default": [], - }), - copts = select({ - "@io_bazel_rules_go//go/platform:solaris": [ - "-std=c99", - ], - "//conditions:default": [], - }), - importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/system", - importpath = "github.com/docker/docker/pkg/system", - visibility = ["//visibility:public"], - deps = [ - "//vendor/github.com/docker/docker/pkg/mount:go_default_library", - "//vendor/github.com/pkg/errors:go_default_library", - ] + select({ - "@io_bazel_rules_go//go/platform:android": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:darwin": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:dragonfly": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:freebsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:linux": [ - "//vendor/github.com/docker/go-units:go_default_library", - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:nacl": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:netbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:openbsd": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:plan9": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:solaris": [ - "//vendor/golang.org/x/sys/unix:go_default_library", - ], - "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/Microsoft/go-winio:go_default_library", - "//vendor/github.com/sirupsen/logrus:go_default_library", - "//vendor/golang.org/x/sys/windows:go_default_library", - ], - "//conditions:default": [], - }), -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes.go b/vendor/github.com/docker/docker/pkg/system/chtimes.go deleted file mode 100644 index 056d19954d6..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes.go +++ /dev/null @@ -1,35 +0,0 @@ -package system - -import ( - "os" - "time" -) - -// Chtimes changes the access time and modified time of a file at the given path -func Chtimes(name string, atime time.Time, mtime time.Time) error { - unixMinTime := time.Unix(0, 0) - unixMaxTime := maxTime - - // If the modified time is prior to the Unix Epoch, or after the - // end of Unix Time, os.Chtimes has undefined behavior - // default to Unix Epoch in this case, just in case - - if atime.Before(unixMinTime) || atime.After(unixMaxTime) { - atime = unixMinTime - } - - if mtime.Before(unixMinTime) || mtime.After(unixMaxTime) { - mtime = unixMinTime - } - - if err := os.Chtimes(name, atime, mtime); err != nil { - return err - } - - // Take platform specific action for setting create time. - if err := setCTime(name, mtime); err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go b/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go deleted file mode 100644 index 09d58bcbfdd..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !windows - -package system - -import ( - "time" -) - -//setCTime will set the create time on a file. On Unix, the create -//time is updated as a side effect of setting the modified time, so -//no action is required. -func setCTime(path string, ctime time.Time) error { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go b/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go deleted file mode 100644 index 45428c141ca..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/chtimes_windows.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build windows - -package system - -import ( - "time" - - "golang.org/x/sys/windows" -) - -//setCTime will set the create time on a file. On Windows, this requires -//calling SetFileTime and explicitly including the create time. -func setCTime(path string, ctime time.Time) error { - ctimespec := windows.NsecToTimespec(ctime.UnixNano()) - pathp, e := windows.UTF16PtrFromString(path) - if e != nil { - return e - } - h, e := windows.CreateFile(pathp, - windows.FILE_WRITE_ATTRIBUTES, windows.FILE_SHARE_WRITE, nil, - windows.OPEN_EXISTING, windows.FILE_FLAG_BACKUP_SEMANTICS, 0) - if e != nil { - return e - } - defer windows.Close(h) - c := windows.NsecToFiletime(windows.TimespecToNsec(ctimespec)) - return windows.SetFileTime(h, &c, nil, nil) -} diff --git a/vendor/github.com/docker/docker/pkg/system/errors.go b/vendor/github.com/docker/docker/pkg/system/errors.go deleted file mode 100644 index 288318985e3..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/errors.go +++ /dev/null @@ -1,10 +0,0 @@ -package system - -import ( - "errors" -) - -var ( - // ErrNotSupportedPlatform means the platform is not supported. - ErrNotSupportedPlatform = errors.New("platform and architecture is not supported") -) diff --git a/vendor/github.com/docker/docker/pkg/system/events_windows.go b/vendor/github.com/docker/docker/pkg/system/events_windows.go deleted file mode 100644 index 192e3678829..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/events_windows.go +++ /dev/null @@ -1,85 +0,0 @@ -package system - -// This file implements syscalls for Win32 events which are not implemented -// in golang. - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - procCreateEvent = modkernel32.NewProc("CreateEventW") - procOpenEvent = modkernel32.NewProc("OpenEventW") - procSetEvent = modkernel32.NewProc("SetEvent") - procResetEvent = modkernel32.NewProc("ResetEvent") - procPulseEvent = modkernel32.NewProc("PulseEvent") -) - -// CreateEvent implements win32 CreateEventW func in golang. It will create an event object. -func CreateEvent(eventAttributes *windows.SecurityAttributes, manualReset bool, initialState bool, name string) (handle windows.Handle, err error) { - namep, _ := windows.UTF16PtrFromString(name) - var _p1 uint32 - if manualReset { - _p1 = 1 - } - var _p2 uint32 - if initialState { - _p2 = 1 - } - r0, _, e1 := procCreateEvent.Call(uintptr(unsafe.Pointer(eventAttributes)), uintptr(_p1), uintptr(_p2), uintptr(unsafe.Pointer(namep))) - use(unsafe.Pointer(namep)) - handle = windows.Handle(r0) - if handle == windows.InvalidHandle { - err = e1 - } - return -} - -// OpenEvent implements win32 OpenEventW func in golang. It opens an event object. -func OpenEvent(desiredAccess uint32, inheritHandle bool, name string) (handle windows.Handle, err error) { - namep, _ := windows.UTF16PtrFromString(name) - var _p1 uint32 - if inheritHandle { - _p1 = 1 - } - r0, _, e1 := procOpenEvent.Call(uintptr(desiredAccess), uintptr(_p1), uintptr(unsafe.Pointer(namep))) - use(unsafe.Pointer(namep)) - handle = windows.Handle(r0) - if handle == windows.InvalidHandle { - err = e1 - } - return -} - -// SetEvent implements win32 SetEvent func in golang. -func SetEvent(handle windows.Handle) (err error) { - return setResetPulse(handle, procSetEvent) -} - -// ResetEvent implements win32 ResetEvent func in golang. -func ResetEvent(handle windows.Handle) (err error) { - return setResetPulse(handle, procResetEvent) -} - -// PulseEvent implements win32 PulseEvent func in golang. -func PulseEvent(handle windows.Handle) (err error) { - return setResetPulse(handle, procPulseEvent) -} - -func setResetPulse(handle windows.Handle, proc *windows.LazyProc) (err error) { - r0, _, _ := proc.Call(uintptr(handle)) - if r0 != 0 { - err = syscall.Errno(r0) - } - return -} - -var temp unsafe.Pointer - -// use ensures a variable is kept alive without the GC freeing while still needed -func use(p unsafe.Pointer) { - temp = p -} diff --git a/vendor/github.com/docker/docker/pkg/system/exitcode.go b/vendor/github.com/docker/docker/pkg/system/exitcode.go deleted file mode 100644 index 60f0514b1dd..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/exitcode.go +++ /dev/null @@ -1,33 +0,0 @@ -package system - -import ( - "fmt" - "os/exec" - "syscall" -) - -// GetExitCode returns the ExitStatus of the specified error if its type is -// exec.ExitError, returns 0 and an error otherwise. -func GetExitCode(err error) (int, error) { - exitCode := 0 - if exiterr, ok := err.(*exec.ExitError); ok { - if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok { - return procExit.ExitStatus(), nil - } - } - return exitCode, fmt.Errorf("failed to get exit code") -} - -// ProcessExitCode process the specified error and returns the exit status code -// if the error was of type exec.ExitError, returns nothing otherwise. -func ProcessExitCode(err error) (exitCode int) { - if err != nil { - var exiterr error - if exitCode, exiterr = GetExitCode(err); exiterr != nil { - // TODO: Fix this so we check the error's text. - // we've failed to retrieve exit code, so we set it to 127 - exitCode = 127 - } - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys.go b/vendor/github.com/docker/docker/pkg/system/filesys.go deleted file mode 100644 index 102565f7601..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/filesys.go +++ /dev/null @@ -1,67 +0,0 @@ -// +build !windows - -package system - -import ( - "io/ioutil" - "os" - "path/filepath" -) - -// MkdirAllWithACL is a wrapper for MkdirAll on unix systems. -func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { - return MkdirAll(path, perm, sddl) -} - -// MkdirAll creates a directory named path along with any necessary parents, -// with permission specified by attribute perm for all dir created. -func MkdirAll(path string, perm os.FileMode, sddl string) error { - return os.MkdirAll(path, perm) -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. -func IsAbs(path string) bool { - return filepath.IsAbs(path) -} - -// The functions below here are wrappers for the equivalents in the os and ioutils packages. -// They are passthrough on Unix platforms, and only relevant on Windows. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return os.Create(name) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return os.Open(name) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. It opens the named file with specified flag -// (O_RDONLY etc.) and perm, (0666 etc.) if applicable. If successful, -// methods on the returned File can be used for I/O. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, perm os.FileMode) (*os.File, error) { - return os.OpenFile(name, flag, perm) -} - -// TempFileSequential creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *os.File. -// If dir is the empty string, TempFile uses the default directory -// for temporary files (see os.TempDir). -// Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility -// to remove the file when no longer needed. -func TempFileSequential(dir, prefix string) (f *os.File, err error) { - return ioutil.TempFile(dir, prefix) -} diff --git a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go b/vendor/github.com/docker/docker/pkg/system/filesys_windows.go deleted file mode 100644 index a61b53d0ba3..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/filesys_windows.go +++ /dev/null @@ -1,298 +0,0 @@ -// +build windows - -package system - -import ( - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "sync" - "syscall" - "time" - "unsafe" - - winio "github.com/Microsoft/go-winio" - "golang.org/x/sys/windows" -) - -const ( - // SddlAdministratorsLocalSystem is local administrators plus NT AUTHORITY\System - SddlAdministratorsLocalSystem = "D:P(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" - // SddlNtvmAdministratorsLocalSystem is NT VIRTUAL MACHINE\Virtual Machines plus local administrators plus NT AUTHORITY\System - SddlNtvmAdministratorsLocalSystem = "D:P(A;OICI;GA;;;S-1-5-83-0)(A;OICI;GA;;;BA)(A;OICI;GA;;;SY)" -) - -// MkdirAllWithACL is a wrapper for MkdirAll that creates a directory -// with an appropriate SDDL defined ACL. -func MkdirAllWithACL(path string, perm os.FileMode, sddl string) error { - return mkdirall(path, true, sddl) -} - -// MkdirAll implementation that is volume path aware for Windows. -func MkdirAll(path string, _ os.FileMode, sddl string) error { - return mkdirall(path, false, sddl) -} - -// mkdirall is a custom version of os.MkdirAll modified for use on Windows -// so that it is both volume path aware, and can create a directory with -// a DACL. -func mkdirall(path string, applyACL bool, sddl string) error { - if re := regexp.MustCompile(`^\\\\\?\\Volume{[a-z0-9-]+}$`); re.MatchString(path) { - return nil - } - - // The rest of this method is largely copied from os.MkdirAll and should be kept - // as-is to ensure compatibility. - - // Fast path: if we can tell whether path is a directory or file, stop with success or error. - dir, err := os.Stat(path) - if err == nil { - if dir.IsDir() { - return nil - } - return &os.PathError{ - Op: "mkdir", - Path: path, - Err: syscall.ENOTDIR, - } - } - - // Slow path: make sure parent exists and then call Mkdir for path. - i := len(path) - for i > 0 && os.IsPathSeparator(path[i-1]) { // Skip trailing path separator. - i-- - } - - j := i - for j > 0 && !os.IsPathSeparator(path[j-1]) { // Scan backward over element. - j-- - } - - if j > 1 { - // Create parent - err = mkdirall(path[0:j-1], false, sddl) - if err != nil { - return err - } - } - - // Parent now exists; invoke os.Mkdir or mkdirWithACL and use its result. - if applyACL { - err = mkdirWithACL(path, sddl) - } else { - err = os.Mkdir(path, 0) - } - - if err != nil { - // Handle arguments like "foo/." by - // double-checking that directory doesn't exist. - dir, err1 := os.Lstat(path) - if err1 == nil && dir.IsDir() { - return nil - } - return err - } - return nil -} - -// mkdirWithACL creates a new directory. If there is an error, it will be of -// type *PathError. . -// -// This is a modified and combined version of os.Mkdir and windows.Mkdir -// in golang to cater for creating a directory am ACL permitting full -// access, with inheritance, to any subfolder/file for Built-in Administrators -// and Local System. -func mkdirWithACL(name string, sddl string) error { - sa := windows.SecurityAttributes{Length: 0} - sd, err := winio.SddlToSecurityDescriptor(sddl) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - sa.SecurityDescriptor = uintptr(unsafe.Pointer(&sd[0])) - - namep, err := windows.UTF16PtrFromString(name) - if err != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: err} - } - - e := windows.CreateDirectory(namep, &sa) - if e != nil { - return &os.PathError{Op: "mkdir", Path: name, Err: e} - } - return nil -} - -// IsAbs is a platform-specific wrapper for filepath.IsAbs. On Windows, -// golang filepath.IsAbs does not consider a path \windows\system32 as absolute -// as it doesn't start with a drive-letter/colon combination. However, in -// docker we need to verify things such as WORKDIR /windows/system32 in -// a Dockerfile (which gets translated to \windows\system32 when being processed -// by the daemon. This SHOULD be treated as absolute from a docker processing -// perspective. -func IsAbs(path string) bool { - if !filepath.IsAbs(path) { - if !strings.HasPrefix(path, string(os.PathSeparator)) { - return false - } - } - return true -} - -// The origin of the functions below here are the golang OS and windows packages, -// slightly modified to only cope with files, not directories due to the -// specific use case. -// -// The alteration is to allow a file on Windows to be opened with -// FILE_FLAG_SEQUENTIAL_SCAN (particular for docker load), to avoid eating -// the standby list, particularly when accessing large files such as layer.tar. - -// CreateSequential creates the named file with mode 0666 (before umask), truncating -// it if it already exists. If successful, methods on the returned -// File can be used for I/O; the associated file descriptor has mode -// O_RDWR. -// If there is an error, it will be of type *PathError. -func CreateSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0) -} - -// OpenSequential opens the named file for reading. If successful, methods on -// the returned file can be used for reading; the associated file -// descriptor has mode O_RDONLY. -// If there is an error, it will be of type *PathError. -func OpenSequential(name string) (*os.File, error) { - return OpenFileSequential(name, os.O_RDONLY, 0) -} - -// OpenFileSequential is the generalized open call; most users will use Open -// or Create instead. -// If there is an error, it will be of type *PathError. -func OpenFileSequential(name string, flag int, _ os.FileMode) (*os.File, error) { - if name == "" { - return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOENT} - } - r, errf := windowsOpenFileSequential(name, flag, 0) - if errf == nil { - return r, nil - } - return nil, &os.PathError{Op: "open", Path: name, Err: errf} -} - -func windowsOpenFileSequential(name string, flag int, _ os.FileMode) (file *os.File, err error) { - r, e := windowsOpenSequential(name, flag|windows.O_CLOEXEC, 0) - if e != nil { - return nil, e - } - return os.NewFile(uintptr(r), name), nil -} - -func makeInheritSa() *windows.SecurityAttributes { - var sa windows.SecurityAttributes - sa.Length = uint32(unsafe.Sizeof(sa)) - sa.InheritHandle = 1 - return &sa -} - -func windowsOpenSequential(path string, mode int, _ uint32) (fd windows.Handle, err error) { - if len(path) == 0 { - return windows.InvalidHandle, windows.ERROR_FILE_NOT_FOUND - } - pathp, err := windows.UTF16PtrFromString(path) - if err != nil { - return windows.InvalidHandle, err - } - var access uint32 - switch mode & (windows.O_RDONLY | windows.O_WRONLY | windows.O_RDWR) { - case windows.O_RDONLY: - access = windows.GENERIC_READ - case windows.O_WRONLY: - access = windows.GENERIC_WRITE - case windows.O_RDWR: - access = windows.GENERIC_READ | windows.GENERIC_WRITE - } - if mode&windows.O_CREAT != 0 { - access |= windows.GENERIC_WRITE - } - if mode&windows.O_APPEND != 0 { - access &^= windows.GENERIC_WRITE - access |= windows.FILE_APPEND_DATA - } - sharemode := uint32(windows.FILE_SHARE_READ | windows.FILE_SHARE_WRITE) - var sa *windows.SecurityAttributes - if mode&windows.O_CLOEXEC == 0 { - sa = makeInheritSa() - } - var createmode uint32 - switch { - case mode&(windows.O_CREAT|windows.O_EXCL) == (windows.O_CREAT | windows.O_EXCL): - createmode = windows.CREATE_NEW - case mode&(windows.O_CREAT|windows.O_TRUNC) == (windows.O_CREAT | windows.O_TRUNC): - createmode = windows.CREATE_ALWAYS - case mode&windows.O_CREAT == windows.O_CREAT: - createmode = windows.OPEN_ALWAYS - case mode&windows.O_TRUNC == windows.O_TRUNC: - createmode = windows.TRUNCATE_EXISTING - default: - createmode = windows.OPEN_EXISTING - } - // Use FILE_FLAG_SEQUENTIAL_SCAN rather than FILE_ATTRIBUTE_NORMAL as implemented in golang. - //https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx - const fileFlagSequentialScan = 0x08000000 // FILE_FLAG_SEQUENTIAL_SCAN - h, e := windows.CreateFile(pathp, access, sharemode, sa, createmode, fileFlagSequentialScan, 0) - return h, e -} - -// Helpers for TempFileSequential -var rand uint32 -var randmu sync.Mutex - -func reseed() uint32 { - return uint32(time.Now().UnixNano() + int64(os.Getpid())) -} -func nextSuffix() string { - randmu.Lock() - r := rand - if r == 0 { - r = reseed() - } - r = r*1664525 + 1013904223 // constants from Numerical Recipes - rand = r - randmu.Unlock() - return strconv.Itoa(int(1e9 + r%1e9))[1:] -} - -// TempFileSequential is a copy of ioutil.TempFile, modified to use sequential -// file access. Below is the original comment from golang: -// TempFile creates a new temporary file in the directory dir -// with a name beginning with prefix, opens the file for reading -// and writing, and returns the resulting *os.File. -// If dir is the empty string, TempFile uses the default directory -// for temporary files (see os.TempDir). -// Multiple programs calling TempFile simultaneously -// will not choose the same file. The caller can use f.Name() -// to find the pathname of the file. It is the caller's responsibility -// to remove the file when no longer needed. -func TempFileSequential(dir, prefix string) (f *os.File, err error) { - if dir == "" { - dir = os.TempDir() - } - - nconflict := 0 - for i := 0; i < 10000; i++ { - name := filepath.Join(dir, prefix+nextSuffix()) - f, err = OpenFileSequential(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if os.IsExist(err) { - if nconflict++; nconflict > 10 { - randmu.Lock() - rand = reseed() - randmu.Unlock() - } - continue - } - break - } - return -} diff --git a/vendor/github.com/docker/docker/pkg/system/init.go b/vendor/github.com/docker/docker/pkg/system/init.go deleted file mode 100644 index 17935088ded..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/init.go +++ /dev/null @@ -1,22 +0,0 @@ -package system - -import ( - "syscall" - "time" - "unsafe" -) - -// Used by chtimes -var maxTime time.Time - -func init() { - // chtimes initialization - if unsafe.Sizeof(syscall.Timespec{}.Nsec) == 8 { - // This is a 64 bit timespec - // os.Chtimes limits time to the following - maxTime = time.Unix(0, 1<<63-1) - } else { - // This is a 32 bit timespec - maxTime = time.Unix(1<<31-1, 0) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/init_windows.go b/vendor/github.com/docker/docker/pkg/system/init_windows.go deleted file mode 100644 index 019c66441ce..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/init_windows.go +++ /dev/null @@ -1,17 +0,0 @@ -package system - -import "os" - -// LCOWSupported determines if Linux Containers on Windows are supported. -// Note: This feature is in development (06/17) and enabled through an -// environment variable. At a future time, it will be enabled based -// on build number. @jhowardmsft -var lcowSupported = false - -func init() { - // LCOW initialization - if os.Getenv("LCOW_SUPPORTED") != "" { - lcowSupported = true - } - -} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_unix.go b/vendor/github.com/docker/docker/pkg/system/lcow_unix.go deleted file mode 100644 index cff33bb4085..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow_unix.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package system - -// LCOWSupported returns true if Linux containers on Windows are supported. -func LCOWSupported() bool { - return false -} diff --git a/vendor/github.com/docker/docker/pkg/system/lcow_windows.go b/vendor/github.com/docker/docker/pkg/system/lcow_windows.go deleted file mode 100644 index e54d01e696b..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/lcow_windows.go +++ /dev/null @@ -1,6 +0,0 @@ -package system - -// LCOWSupported returns true if Linux containers on Windows are supported. -func LCOWSupported() bool { - return lcowSupported -} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_unix.go b/vendor/github.com/docker/docker/pkg/system/lstat_unix.go deleted file mode 100644 index bd23c4d50b2..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/lstat_unix.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build !windows - -package system - -import ( - "syscall" -) - -// Lstat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Lstat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Lstat(path, s); err != nil { - return nil, err - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go b/vendor/github.com/docker/docker/pkg/system/lstat_windows.go deleted file mode 100644 index e51df0dafeb..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/lstat_windows.go +++ /dev/null @@ -1,14 +0,0 @@ -package system - -import "os" - -// Lstat calls os.Lstat to get a fileinfo interface back. -// This is then copied into our own locally defined structure. -func Lstat(path string) (*StatT, error) { - fi, err := os.Lstat(path) - if err != nil { - return nil, err - } - - return fromStatT(&fi) -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo.go b/vendor/github.com/docker/docker/pkg/system/meminfo.go deleted file mode 100644 index 3b6e947e675..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo.go +++ /dev/null @@ -1,17 +0,0 @@ -package system - -// MemInfo contains memory statistics of the host system. -type MemInfo struct { - // Total usable RAM (i.e. physical RAM minus a few reserved bits and the - // kernel binary code). - MemTotal int64 - - // Amount of free memory. - MemFree int64 - - // Total amount of swap space available. - SwapTotal int64 - - // Amount of swap space that is currently unused. - SwapFree int64 -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go b/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go deleted file mode 100644 index 385f1d5e735..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_linux.go +++ /dev/null @@ -1,65 +0,0 @@ -package system - -import ( - "bufio" - "io" - "os" - "strconv" - "strings" - - "github.com/docker/go-units" -) - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - file, err := os.Open("/proc/meminfo") - if err != nil { - return nil, err - } - defer file.Close() - return parseMemInfo(file) -} - -// parseMemInfo parses the /proc/meminfo file into -// a MemInfo object given an io.Reader to the file. -// Throws error if there are problems reading from the file -func parseMemInfo(reader io.Reader) (*MemInfo, error) { - meminfo := &MemInfo{} - scanner := bufio.NewScanner(reader) - for scanner.Scan() { - // Expected format: ["MemTotal:", "1234", "kB"] - parts := strings.Fields(scanner.Text()) - - // Sanity checks: Skip malformed entries. - if len(parts) < 3 || parts[2] != "kB" { - continue - } - - // Convert to bytes. - size, err := strconv.Atoi(parts[1]) - if err != nil { - continue - } - bytes := int64(size) * units.KiB - - switch parts[0] { - case "MemTotal:": - meminfo.MemTotal = bytes - case "MemFree:": - meminfo.MemFree = bytes - case "SwapTotal:": - meminfo.SwapTotal = bytes - case "SwapFree:": - meminfo.SwapFree = bytes - } - - } - - // Handle errors that may have occurred during the reading of the file. - if err := scanner.Err(); err != nil { - return nil, err - } - - return meminfo, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go b/vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go deleted file mode 100644 index 925776e789b..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_solaris.go +++ /dev/null @@ -1,129 +0,0 @@ -// +build solaris,cgo - -package system - -import ( - "fmt" - "unsafe" -) - -// #cgo CFLAGS: -std=c99 -// #cgo LDFLAGS: -lkstat -// #include -// #include -// #include -// #include -// #include -// #include -// struct swaptable *allocSwaptable(int num) { -// struct swaptable *st; -// struct swapent *swapent; -// st = (struct swaptable *)malloc(num * sizeof(swapent_t) + sizeof (int)); -// swapent = st->swt_ent; -// for (int i = 0; i < num; i++,swapent++) { -// swapent->ste_path = (char *)malloc(MAXPATHLEN * sizeof (char)); -// } -// st->swt_n = num; -// return st; -//} -// void freeSwaptable (struct swaptable *st) { -// struct swapent *swapent = st->swt_ent; -// for (int i = 0; i < st->swt_n; i++,swapent++) { -// free(swapent->ste_path); -// } -// free(st); -// } -// swapent_t getSwapEnt(swapent_t *ent, int i) { -// return ent[i]; -// } -// int64_t getPpKernel() { -// int64_t pp_kernel = 0; -// kstat_ctl_t *ksc; -// kstat_t *ks; -// kstat_named_t *knp; -// kid_t kid; -// -// if ((ksc = kstat_open()) == NULL) { -// return -1; -// } -// if ((ks = kstat_lookup(ksc, "unix", 0, "system_pages")) == NULL) { -// return -1; -// } -// if (((kid = kstat_read(ksc, ks, NULL)) == -1) || -// ((knp = kstat_data_lookup(ks, "pp_kernel")) == NULL)) { -// return -1; -// } -// switch (knp->data_type) { -// case KSTAT_DATA_UINT64: -// pp_kernel = knp->value.ui64; -// break; -// case KSTAT_DATA_UINT32: -// pp_kernel = knp->value.ui32; -// break; -// } -// pp_kernel *= sysconf(_SC_PAGESIZE); -// return (pp_kernel > 0 ? pp_kernel : -1); -// } -import "C" - -// Get the system memory info using sysconf same as prtconf -func getTotalMem() int64 { - pagesize := C.sysconf(C._SC_PAGESIZE) - npages := C.sysconf(C._SC_PHYS_PAGES) - return int64(pagesize * npages) -} - -func getFreeMem() int64 { - pagesize := C.sysconf(C._SC_PAGESIZE) - npages := C.sysconf(C._SC_AVPHYS_PAGES) - return int64(pagesize * npages) -} - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - - ppKernel := C.getPpKernel() - MemTotal := getTotalMem() - MemFree := getFreeMem() - SwapTotal, SwapFree, err := getSysSwap() - - if ppKernel < 0 || MemTotal < 0 || MemFree < 0 || SwapTotal < 0 || - SwapFree < 0 { - return nil, fmt.Errorf("error getting system memory info %v\n", err) - } - - meminfo := &MemInfo{} - // Total memory is total physical memory less than memory locked by kernel - meminfo.MemTotal = MemTotal - int64(ppKernel) - meminfo.MemFree = MemFree - meminfo.SwapTotal = SwapTotal - meminfo.SwapFree = SwapFree - - return meminfo, nil -} - -func getSysSwap() (int64, int64, error) { - var tSwap int64 - var fSwap int64 - var diskblksPerPage int64 - num, err := C.swapctl(C.SC_GETNSWP, nil) - if err != nil { - return -1, -1, err - } - st := C.allocSwaptable(num) - _, err = C.swapctl(C.SC_LIST, unsafe.Pointer(st)) - if err != nil { - C.freeSwaptable(st) - return -1, -1, err - } - - diskblksPerPage = int64(C.sysconf(C._SC_PAGESIZE) >> C.DEV_BSHIFT) - for i := 0; i < int(num); i++ { - swapent := C.getSwapEnt(&st.swt_ent[0], C.int(i)) - tSwap += int64(swapent.ste_pages) * diskblksPerPage - fSwap += int64(swapent.ste_free) * diskblksPerPage - } - C.freeSwaptable(st) - return tSwap, fSwap, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go b/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go deleted file mode 100644 index 3ce019dffdd..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_unsupported.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !linux,!windows,!solaris - -package system - -// ReadMemInfo is not supported on platforms other than linux and windows. -func ReadMemInfo() (*MemInfo, error) { - return nil, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go b/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go deleted file mode 100644 index 883944a4c53..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/meminfo_windows.go +++ /dev/null @@ -1,45 +0,0 @@ -package system - -import ( - "unsafe" - - "golang.org/x/sys/windows" -) - -var ( - modkernel32 = windows.NewLazySystemDLL("kernel32.dll") - - procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx") -) - -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770(v=vs.85).aspx -type memorystatusex struct { - dwLength uint32 - dwMemoryLoad uint32 - ullTotalPhys uint64 - ullAvailPhys uint64 - ullTotalPageFile uint64 - ullAvailPageFile uint64 - ullTotalVirtual uint64 - ullAvailVirtual uint64 - ullAvailExtendedVirtual uint64 -} - -// ReadMemInfo retrieves memory statistics of the host system and returns a -// MemInfo type. -func ReadMemInfo() (*MemInfo, error) { - msi := &memorystatusex{ - dwLength: 64, - } - r1, _, _ := procGlobalMemoryStatusEx.Call(uintptr(unsafe.Pointer(msi))) - if r1 == 0 { - return &MemInfo{}, nil - } - return &MemInfo{ - MemTotal: int64(msi.ullTotalPhys), - MemFree: int64(msi.ullAvailPhys), - SwapTotal: int64(msi.ullTotalPageFile), - SwapFree: int64(msi.ullAvailPageFile), - }, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/mknod.go b/vendor/github.com/docker/docker/pkg/system/mknod.go deleted file mode 100644 index af79a653833..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/mknod.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build !windows - -package system - -import ( - "golang.org/x/sys/unix" -) - -// Mknod creates a filesystem node (file, device special file or named pipe) named path -// with attributes specified by mode and dev. -func Mknod(path string, mode uint32, dev int) error { - return unix.Mknod(path, mode, dev) -} - -// Mkdev is used to build the value of linux devices (in /dev/) which specifies major -// and minor number of the newly created device special file. -// Linux device nodes are a bit weird due to backwards compat with 16 bit device nodes. -// They are, from low to high: the lower 8 bits of the minor, then 12 bits of the major, -// then the top 12 bits of the minor. -func Mkdev(major int64, minor int64) uint32 { - return uint32(((minor & 0xfff00) << 12) | ((major & 0xfff) << 8) | (minor & 0xff)) -} diff --git a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go b/vendor/github.com/docker/docker/pkg/system/mknod_windows.go deleted file mode 100644 index 2e863c0215b..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/mknod_windows.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build windows - -package system - -// Mknod is not implemented on Windows. -func Mknod(path string, mode uint32, dev int) error { - return ErrNotSupportedPlatform -} - -// Mkdev is not implemented on Windows. -func Mkdev(major int64, minor int64) uint32 { - panic("Mkdev not implemented on Windows.") -} diff --git a/vendor/github.com/docker/docker/pkg/system/path.go b/vendor/github.com/docker/docker/pkg/system/path.go deleted file mode 100644 index f634a6be673..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/path.go +++ /dev/null @@ -1,21 +0,0 @@ -package system - -import "runtime" - -const defaultUnixPathEnv = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - -// DefaultPathEnv is unix style list of directories to search for -// executables. Each directory is separated from the next by a colon -// ':' character . -func DefaultPathEnv(platform string) string { - if runtime.GOOS == "windows" { - if platform != runtime.GOOS && LCOWSupported() { - return defaultUnixPathEnv - } - // Deliberately empty on Windows containers on Windows as the default path will be set by - // the container. Docker has no context of what the default path should be. - return "" - } - return defaultUnixPathEnv - -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_unix.go b/vendor/github.com/docker/docker/pkg/system/path_unix.go deleted file mode 100644 index f3762e69d36..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_unix.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !windows - -package system - -// CheckSystemDriveAndRemoveDriveLetter verifies that a path, if it includes a drive letter, -// is the system drive. This is a no-op on Linux. -func CheckSystemDriveAndRemoveDriveLetter(path string) (string, error) { - return path, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/path_windows.go b/vendor/github.com/docker/docker/pkg/system/path_windows.go deleted file mode 100644 index aab891522db..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/path_windows.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build windows - -package system - -import ( - "fmt" - "path/filepath" - "strings" -) - -// CheckSystemDriveAndRemoveDriveLetter verifies and manipulates a Windows path. -// This is used, for example, when validating a user provided path in docker cp. -// If a drive letter is supplied, it must be the system drive. The drive letter -// is always removed. Also, it translates it to OS semantics (IOW / to \). We -// need the path in this syntax so that it can ultimately be concatenated with -// a Windows long-path which doesn't support drive-letters. Examples: -// C: --> Fail -// C:\ --> \ -// a --> a -// /a --> \a -// d:\ --> Fail -func CheckSystemDriveAndRemoveDriveLetter(path string) (string, error) { - if len(path) == 2 && string(path[1]) == ":" { - return "", fmt.Errorf("No relative path specified in %q", path) - } - if !filepath.IsAbs(path) || len(path) < 2 { - return filepath.FromSlash(path), nil - } - if string(path[1]) == ":" && !strings.EqualFold(string(path[0]), "c") { - return "", fmt.Errorf("The specified path is not on the system drive (C:)") - } - return filepath.FromSlash(path[2:]), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/process_unix.go b/vendor/github.com/docker/docker/pkg/system/process_unix.go deleted file mode 100644 index 26c8b42c176..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/process_unix.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build linux freebsd solaris darwin - -package system - -import ( - "syscall" - - "golang.org/x/sys/unix" -) - -// IsProcessAlive returns true if process with a given pid is running. -func IsProcessAlive(pid int) bool { - err := unix.Kill(pid, syscall.Signal(0)) - if err == nil || err == unix.EPERM { - return true - } - - return false -} - -// KillProcess force-stops a process. -func KillProcess(pid int) { - unix.Kill(pid, unix.SIGKILL) -} diff --git a/vendor/github.com/docker/docker/pkg/system/rm.go b/vendor/github.com/docker/docker/pkg/system/rm.go deleted file mode 100644 index 101b569a565..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/rm.go +++ /dev/null @@ -1,80 +0,0 @@ -package system - -import ( - "os" - "syscall" - "time" - - "github.com/docker/docker/pkg/mount" - "github.com/pkg/errors" -) - -// EnsureRemoveAll wraps `os.RemoveAll` to check for specific errors that can -// often be remedied. -// Only use `EnsureRemoveAll` if you really want to make every effort to remove -// a directory. -// -// Because of the way `os.Remove` (and by extension `os.RemoveAll`) works, there -// can be a race between reading directory entries and then actually attempting -// to remove everything in the directory. -// These types of errors do not need to be returned since it's ok for the dir to -// be gone we can just retry the remove operation. -// -// This should not return a `os.ErrNotExist` kind of error under any circumstances -func EnsureRemoveAll(dir string) error { - notExistErr := make(map[string]bool) - - // track retries - exitOnErr := make(map[string]int) - maxRetry := 5 - - // Attempt to unmount anything beneath this dir first - mount.RecursiveUnmount(dir) - - for { - err := os.RemoveAll(dir) - if err == nil { - return err - } - - pe, ok := err.(*os.PathError) - if !ok { - return err - } - - if os.IsNotExist(err) { - if notExistErr[pe.Path] { - return err - } - notExistErr[pe.Path] = true - - // There is a race where some subdir can be removed but after the parent - // dir entries have been read. - // So the path could be from `os.Remove(subdir)` - // If the reported non-existent path is not the passed in `dir` we - // should just retry, but otherwise return with no error. - if pe.Path == dir { - return nil - } - continue - } - - if pe.Err != syscall.EBUSY { - return err - } - - if mounted, _ := mount.Mounted(pe.Path); mounted { - if e := mount.Unmount(pe.Path); e != nil { - if mounted, _ := mount.Mounted(pe.Path); mounted { - return errors.Wrapf(e, "error while removing %s", dir) - } - } - } - - if exitOnErr[pe.Path] == maxRetry { - return err - } - exitOnErr[pe.Path]++ - time.Sleep(100 * time.Millisecond) - } -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_darwin.go b/vendor/github.com/docker/docker/pkg/system/stat_darwin.go deleted file mode 100644 index 715f05b9387..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_darwin.go +++ /dev/null @@ -1,13 +0,0 @@ -package system - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go b/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go deleted file mode 100644 index 715f05b9387..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_freebsd.go +++ /dev/null @@ -1,13 +0,0 @@ -package system - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtimespec}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_linux.go b/vendor/github.com/docker/docker/pkg/system/stat_linux.go deleted file mode 100644 index 66bf6e28ee0..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_linux.go +++ /dev/null @@ -1,19 +0,0 @@ -package system - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil -} - -// FromStatT converts a syscall.Stat_t type to a system.Stat_t type -// This is exposed on Linux as pkg/archive/changes uses it. -func FromStatT(s *syscall.Stat_t) (*StatT, error) { - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go b/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go deleted file mode 100644 index b607dea946f..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_openbsd.go +++ /dev/null @@ -1,13 +0,0 @@ -package system - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go b/vendor/github.com/docker/docker/pkg/system/stat_solaris.go deleted file mode 100644 index b607dea946f..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_solaris.go +++ /dev/null @@ -1,13 +0,0 @@ -package system - -import "syscall" - -// fromStatT converts a syscall.Stat_t type to a system.Stat_t type -func fromStatT(s *syscall.Stat_t) (*StatT, error) { - return &StatT{size: s.Size, - mode: uint32(s.Mode), - uid: s.Uid, - gid: s.Gid, - rdev: uint64(s.Rdev), - mtim: s.Mtim}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_unix.go b/vendor/github.com/docker/docker/pkg/system/stat_unix.go deleted file mode 100644 index 91c7d121cc7..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_unix.go +++ /dev/null @@ -1,60 +0,0 @@ -// +build !windows - -package system - -import ( - "syscall" -) - -// StatT type contains status of a file. It contains metadata -// like permission, owner, group, size, etc about a file. -type StatT struct { - mode uint32 - uid uint32 - gid uint32 - rdev uint64 - size int64 - mtim syscall.Timespec -} - -// Mode returns file's permission mode. -func (s StatT) Mode() uint32 { - return s.mode -} - -// UID returns file's user id of owner. -func (s StatT) UID() uint32 { - return s.uid -} - -// GID returns file's group id of owner. -func (s StatT) GID() uint32 { - return s.gid -} - -// Rdev returns file's device ID (if it's special file). -func (s StatT) Rdev() uint64 { - return s.rdev -} - -// Size returns file's size. -func (s StatT) Size() int64 { - return s.size -} - -// Mtim returns file's last modification time. -func (s StatT) Mtim() syscall.Timespec { - return s.mtim -} - -// Stat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - s := &syscall.Stat_t{} - if err := syscall.Stat(path, s); err != nil { - return nil, err - } - return fromStatT(s) -} diff --git a/vendor/github.com/docker/docker/pkg/system/stat_windows.go b/vendor/github.com/docker/docker/pkg/system/stat_windows.go deleted file mode 100644 index 6c63972682a..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/stat_windows.go +++ /dev/null @@ -1,49 +0,0 @@ -package system - -import ( - "os" - "time" -) - -// StatT type contains status of a file. It contains metadata -// like permission, size, etc about a file. -type StatT struct { - mode os.FileMode - size int64 - mtim time.Time -} - -// Size returns file's size. -func (s StatT) Size() int64 { - return s.size -} - -// Mode returns file's permission mode. -func (s StatT) Mode() os.FileMode { - return os.FileMode(s.mode) -} - -// Mtim returns file's last modification time. -func (s StatT) Mtim() time.Time { - return time.Time(s.mtim) -} - -// Stat takes a path to a file and returns -// a system.StatT type pertaining to that file. -// -// Throws an error if the file does not exist -func Stat(path string) (*StatT, error) { - fi, err := os.Stat(path) - if err != nil { - return nil, err - } - return fromStatT(&fi) -} - -// fromStatT converts a os.FileInfo type to a system.StatT type -func fromStatT(fi *os.FileInfo) (*StatT, error) { - return &StatT{ - size: (*fi).Size(), - mode: (*fi).Mode(), - mtim: (*fi).ModTime()}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go b/vendor/github.com/docker/docker/pkg/system/syscall_unix.go deleted file mode 100644 index 49dbdd37817..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_unix.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build linux freebsd - -package system - -import "golang.org/x/sys/unix" - -// Unmount is a platform-specific helper function to call -// the unmount syscall. -func Unmount(dest string) error { - return unix.Unmount(dest, 0) -} - -// CommandLineToArgv should not be used on Unix. -// It simply returns commandLine in the only element in the returned array. -func CommandLineToArgv(commandLine string) ([]string, error) { - return []string{commandLine}, nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go b/vendor/github.com/docker/docker/pkg/system/syscall_windows.go deleted file mode 100644 index 23e9b207c75..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/syscall_windows.go +++ /dev/null @@ -1,122 +0,0 @@ -package system - -import ( - "unsafe" - - "github.com/sirupsen/logrus" - "golang.org/x/sys/windows" -) - -var ( - ntuserApiset = windows.NewLazyDLL("ext-ms-win-ntuser-window-l1-1-0") - procGetVersionExW = modkernel32.NewProc("GetVersionExW") - procGetProductInfo = modkernel32.NewProc("GetProductInfo") -) - -// OSVersion is a wrapper for Windows version information -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx -type OSVersion struct { - Version uint32 - MajorVersion uint8 - MinorVersion uint8 - Build uint16 -} - -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx -type osVersionInfoEx struct { - OSVersionInfoSize uint32 - MajorVersion uint32 - MinorVersion uint32 - BuildNumber uint32 - PlatformID uint32 - CSDVersion [128]uint16 - ServicePackMajor uint16 - ServicePackMinor uint16 - SuiteMask uint16 - ProductType byte - Reserve byte -} - -// GetOSVersion gets the operating system version on Windows. Note that -// docker.exe must be manifested to get the correct version information. -func GetOSVersion() OSVersion { - var err error - osv := OSVersion{} - osv.Version, err = windows.GetVersion() - if err != nil { - // GetVersion never fails. - panic(err) - } - osv.MajorVersion = uint8(osv.Version & 0xFF) - osv.MinorVersion = uint8(osv.Version >> 8 & 0xFF) - osv.Build = uint16(osv.Version >> 16) - return osv -} - -// IsWindowsClient returns true if the SKU is client -// @engine maintainers - this function should not be removed or modified as it -// is used to enforce licensing restrictions on Windows. -func IsWindowsClient() bool { - osviex := &osVersionInfoEx{OSVersionInfoSize: 284} - r1, _, err := procGetVersionExW.Call(uintptr(unsafe.Pointer(osviex))) - if r1 == 0 { - logrus.Warnf("GetVersionExW failed - assuming server SKU: %v", err) - return false - } - const verNTWorkstation = 0x00000001 - return osviex.ProductType == verNTWorkstation -} - -// IsIoTCore returns true if the currently running image is based off of -// Windows 10 IoT Core. -// @engine maintainers - this function should not be removed or modified as it -// is used to enforce licensing restrictions on Windows. -func IsIoTCore() bool { - var returnedProductType uint32 - r1, _, err := procGetProductInfo.Call(6, 1, 0, 0, uintptr(unsafe.Pointer(&returnedProductType))) - if r1 == 0 { - logrus.Warnf("GetProductInfo failed - assuming this is not IoT: %v", err) - return false - } - const productIoTUAP = 0x0000007B - const productIoTUAPCommercial = 0x00000083 - return returnedProductType == productIoTUAP || returnedProductType == productIoTUAPCommercial -} - -// Unmount is a platform-specific helper function to call -// the unmount syscall. Not supported on Windows -func Unmount(dest string) error { - return nil -} - -// CommandLineToArgv wraps the Windows syscall to turn a commandline into an argument array. -func CommandLineToArgv(commandLine string) ([]string, error) { - var argc int32 - - argsPtr, err := windows.UTF16PtrFromString(commandLine) - if err != nil { - return nil, err - } - - argv, err := windows.CommandLineToArgv(argsPtr, &argc) - if err != nil { - return nil, err - } - defer windows.LocalFree(windows.Handle(uintptr(unsafe.Pointer(argv)))) - - newArgs := make([]string, argc) - for i, v := range (*argv)[:argc] { - newArgs[i] = string(windows.UTF16ToString((*v)[:])) - } - - return newArgs, nil -} - -// HasWin32KSupport determines whether containers that depend on win32k can -// run on this machine. Win32k is the driver used to implement windowing. -func HasWin32KSupport() bool { - // For now, check for ntuser API support on the host. In the future, a host - // may support win32k in containers even if the host does not support ntuser - // APIs. - return ntuserApiset.Load() == nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask.go b/vendor/github.com/docker/docker/pkg/system/umask.go deleted file mode 100644 index 5a10eda5afb..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !windows - -package system - -import ( - "golang.org/x/sys/unix" -) - -// Umask sets current process's file mode creation mask to newmask -// and returns oldmask. -func Umask(newmask int) (oldmask int, err error) { - return unix.Umask(newmask), nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/umask_windows.go b/vendor/github.com/docker/docker/pkg/system/umask_windows.go deleted file mode 100644 index 13f1de1769c..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/umask_windows.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build windows - -package system - -// Umask is not supported on the windows platform. -func Umask(newmask int) (oldmask int, err error) { - // should not be called on cli code path - return 0, ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go b/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go deleted file mode 100644 index 6a77524376d..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_freebsd.go +++ /dev/null @@ -1,24 +0,0 @@ -package system - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/unix" -) - -// LUtimesNano is used to change access and modification time of the specified path. -// It's used for symbol link file because unix.UtimesNano doesn't support a NOFOLLOW flag atm. -func LUtimesNano(path string, ts []syscall.Timespec) error { - var _path *byte - _path, err := unix.BytePtrFromString(path) - if err != nil { - return err - } - - if _, _, err := unix.Syscall(unix.SYS_LUTIMES, uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), 0); err != 0 && err != unix.ENOSYS { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go b/vendor/github.com/docker/docker/pkg/system/utimes_linux.go deleted file mode 100644 index edc588a63f3..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_linux.go +++ /dev/null @@ -1,25 +0,0 @@ -package system - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/unix" -) - -// LUtimesNano is used to change access and modification time of the specified path. -// It's used for symbol link file because unix.UtimesNano doesn't support a NOFOLLOW flag atm. -func LUtimesNano(path string, ts []syscall.Timespec) error { - atFdCwd := unix.AT_FDCWD - - var _path *byte - _path, err := unix.BytePtrFromString(path) - if err != nil { - return err - } - if _, _, err := unix.Syscall6(unix.SYS_UTIMENSAT, uintptr(atFdCwd), uintptr(unsafe.Pointer(_path)), uintptr(unsafe.Pointer(&ts[0])), unix.AT_SYMLINK_NOFOLLOW, 0, 0); err != 0 && err != unix.ENOSYS { - return err - } - - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go b/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go deleted file mode 100644 index 139714544d0..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/utimes_unsupported.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !linux,!freebsd - -package system - -import "syscall" - -// LUtimesNano is only supported on linux and freebsd. -func LUtimesNano(path string, ts []syscall.Timespec) error { - return ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go b/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go deleted file mode 100644 index 98b111be426..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_linux.go +++ /dev/null @@ -1,29 +0,0 @@ -package system - -import "golang.org/x/sys/unix" - -// Lgetxattr retrieves the value of the extended attribute identified by attr -// and associated with the given path in the file system. -// It will returns a nil slice and nil error if the xattr is not set. -func Lgetxattr(path string, attr string) ([]byte, error) { - dest := make([]byte, 128) - sz, errno := unix.Lgetxattr(path, attr, dest) - if errno == unix.ENODATA { - return nil, nil - } - if errno == unix.ERANGE { - dest = make([]byte, sz) - sz, errno = unix.Lgetxattr(path, attr, dest) - } - if errno != nil { - return nil, errno - } - - return dest[:sz], nil -} - -// Lsetxattr sets the value of the extended attribute identified by attr -// and associated with the given path in the file system. -func Lsetxattr(path string, attr string, data []byte, flags int) error { - return unix.Lsetxattr(path, attr, data, flags) -} diff --git a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go b/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go deleted file mode 100644 index 0114f2227cf..00000000000 --- a/vendor/github.com/docker/docker/pkg/system/xattrs_unsupported.go +++ /dev/null @@ -1,13 +0,0 @@ -// +build !linux - -package system - -// Lgetxattr is not supported on platforms other than linux. -func Lgetxattr(path string, attr string) ([]byte, error) { - return nil, ErrNotSupportedPlatform -} - -// Lsetxattr is not supported on platforms other than linux. -func Lsetxattr(path string, attr string, data []byte, flags int) error { - return ErrNotSupportedPlatform -} diff --git a/vendor/github.com/docker/docker/pkg/term/BUILD b/vendor/github.com/docker/docker/pkg/term/BUILD index c191b1d22fb..1e59e575a9a 100644 --- a/vendor/github.com/docker/docker/pkg/term/BUILD +++ b/vendor/github.com/docker/docker/pkg/term/BUILD @@ -6,15 +6,12 @@ go_library( "ascii.go", "proxy.go", "tc.go", - "tc_solaris_cgo.go", "term.go", "term_windows.go", "termios_bsd.go", "termios_linux.go", "winsize.go", - "winsize_solaris_cgo.go", ], - cgo = True, importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/term", importpath = "github.com/docker/docker/pkg/term", visibility = ["//visibility:public"], diff --git a/vendor/github.com/docker/docker/pkg/term/ascii.go b/vendor/github.com/docker/docker/pkg/term/ascii.go index f5262bccf5f..55873c0556c 100644 --- a/vendor/github.com/docker/docker/pkg/term/ascii.go +++ b/vendor/github.com/docker/docker/pkg/term/ascii.go @@ -59,7 +59,7 @@ next: return nil, fmt.Errorf("Unknown character: '%s'", key) } } else { - codes = append(codes, byte(key[0])) + codes = append(codes, key[0]) } } return codes, nil diff --git a/vendor/github.com/docker/docker/pkg/term/proxy.go b/vendor/github.com/docker/docker/pkg/term/proxy.go index e648eb81208..6b48d91556e 100644 --- a/vendor/github.com/docker/docker/pkg/term/proxy.go +++ b/vendor/github.com/docker/docker/pkg/term/proxy.go @@ -34,6 +34,10 @@ func NewEscapeProxy(r io.Reader, escapeKeys []byte) io.Reader { func (r *escapeProxy) Read(buf []byte) (int, error) { nr, err := r.r.Read(buf) + if len(r.escapeKeys) == 0 { + return nr, err + } + preserve := func() { // this preserves the original key presses in the passed in buffer nr += r.escapeKeyPos diff --git a/vendor/github.com/docker/docker/pkg/term/tc.go b/vendor/github.com/docker/docker/pkg/term/tc.go index 6d2dfd3a8a2..19dbb1cb11f 100644 --- a/vendor/github.com/docker/docker/pkg/term/tc.go +++ b/vendor/github.com/docker/docker/pkg/term/tc.go @@ -1,5 +1,4 @@ // +build !windows -// +build !solaris !cgo package term diff --git a/vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go b/vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go deleted file mode 100644 index 50234affc0a..00000000000 --- a/vendor/github.com/docker/docker/pkg/term/tc_solaris_cgo.go +++ /dev/null @@ -1,65 +0,0 @@ -// +build solaris,cgo - -package term - -import ( - "syscall" - "unsafe" - - "golang.org/x/sys/unix" -) - -// #include -import "C" - -// Termios is the Unix API for terminal I/O. -// It is passthrough for unix.Termios in order to make it portable with -// other platforms where it is not available or handled differently. -type Termios unix.Termios - -// MakeRaw put the terminal connected to the given file descriptor into raw -// mode and returns the previous state of the terminal so that it can be -// restored. -func MakeRaw(fd uintptr) (*State, error) { - var oldState State - if err := tcget(fd, &oldState.termios); err != 0 { - return nil, err - } - - newState := oldState.termios - - newState.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON | unix.IXANY) - newState.Oflag &^= unix.OPOST - newState.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) - newState.Cflag &^= (unix.CSIZE | unix.PARENB) - newState.Cflag |= unix.CS8 - - /* - VMIN is the minimum number of characters that needs to be read in non-canonical mode for it to be returned - Since VMIN is overloaded with another element in canonical mode when we switch modes it defaults to 4. It - needs to be explicitly set to 1. - */ - newState.Cc[C.VMIN] = 1 - newState.Cc[C.VTIME] = 0 - - if err := tcset(fd, &newState); err != 0 { - return nil, err - } - return &oldState, nil -} - -func tcget(fd uintptr, p *Termios) syscall.Errno { - ret, err := C.tcgetattr(C.int(fd), (*C.struct_termios)(unsafe.Pointer(p))) - if ret != 0 { - return err.(syscall.Errno) - } - return 0 -} - -func tcset(fd uintptr, p *Termios) syscall.Errno { - ret, err := C.tcsetattr(C.int(fd), C.TCSANOW, (*C.struct_termios)(unsafe.Pointer(p))) - if ret != 0 { - return err.(syscall.Errno) - } - return 0 -} diff --git a/vendor/github.com/docker/docker/pkg/term/term_windows.go b/vendor/github.com/docker/docker/pkg/term/term_windows.go index c0332c3cdbf..284ac630106 100644 --- a/vendor/github.com/docker/docker/pkg/term/term_windows.go +++ b/vendor/github.com/docker/docker/pkg/term/term_windows.go @@ -1,5 +1,3 @@ -// +build windows - package term import ( @@ -23,14 +21,7 @@ type Winsize struct { Width uint16 } -const ( - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms683167(v=vs.85).aspx - enableVirtualTerminalInput = 0x0200 - enableVirtualTerminalProcessing = 0x0004 - disableNewlineAutoReturn = 0x0008 -) - -// vtInputSupported is true if enableVirtualTerminalInput is supported by the console +// vtInputSupported is true if winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported by the console var vtInputSupported bool // StdStreams returns the standard streams (stdin, stdout, stderr). @@ -40,8 +31,8 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { var emulateStdin, emulateStdout, emulateStderr bool fd := os.Stdin.Fd() if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate that enableVirtualTerminalInput is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalInput); err != nil { + // Validate that winterm.ENABLE_VIRTUAL_TERMINAL_INPUT is supported, but do not set it. + if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_INPUT); err != nil { emulateStdin = true } else { vtInputSupported = true @@ -53,21 +44,21 @@ func StdStreams() (stdIn io.ReadCloser, stdOut, stdErr io.Writer) { fd = os.Stdout.Fd() if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate disableNewlineAutoReturn is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { + // Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. + if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { emulateStdout = true } else { - winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) + winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) } } fd = os.Stderr.Fd() if mode, err := winterm.GetConsoleMode(fd); err == nil { - // Validate disableNewlineAutoReturn is supported, but do not set it. - if err = winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing|disableNewlineAutoReturn); err != nil { + // Validate winterm.DISABLE_NEWLINE_AUTO_RETURN is supported, but do not set it. + if err = winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING|winterm.DISABLE_NEWLINE_AUTO_RETURN); err != nil { emulateStderr = true } else { - winterm.SetConsoleMode(fd, mode|enableVirtualTerminalProcessing) + winterm.SetConsoleMode(fd, mode|winterm.ENABLE_VIRTUAL_TERMINAL_PROCESSING) } } @@ -183,9 +174,9 @@ func SetRawTerminalOutput(fd uintptr) (*State, error) { return nil, err } - // Ignore failures, since disableNewlineAutoReturn might not be supported on this + // Ignore failures, since winterm.DISABLE_NEWLINE_AUTO_RETURN might not be supported on this // version of Windows. - winterm.SetConsoleMode(fd, state.mode|disableNewlineAutoReturn) + winterm.SetConsoleMode(fd, state.mode|winterm.DISABLE_NEWLINE_AUTO_RETURN) return state, err } @@ -215,7 +206,7 @@ func MakeRaw(fd uintptr) (*State, error) { mode |= winterm.ENABLE_INSERT_MODE mode |= winterm.ENABLE_QUICK_EDIT_MODE if vtInputSupported { - mode |= enableVirtualTerminalInput + mode |= winterm.ENABLE_VIRTUAL_TERMINAL_INPUT } err = winterm.SetConsoleMode(fd, mode) diff --git a/vendor/github.com/docker/docker/pkg/term/termios_bsd.go b/vendor/github.com/docker/docker/pkg/term/termios_bsd.go index c47341e8731..acdddb2e9f3 100644 --- a/vendor/github.com/docker/docker/pkg/term/termios_bsd.go +++ b/vendor/github.com/docker/docker/pkg/term/termios_bsd.go @@ -1,4 +1,4 @@ -// +build darwin freebsd openbsd +// +build darwin freebsd openbsd netbsd package term diff --git a/vendor/github.com/docker/docker/pkg/term/termios_linux.go b/vendor/github.com/docker/docker/pkg/term/termios_linux.go index 3e25eb7a413..0f21abcc2fa 100644 --- a/vendor/github.com/docker/docker/pkg/term/termios_linux.go +++ b/vendor/github.com/docker/docker/pkg/term/termios_linux.go @@ -29,6 +29,8 @@ func MakeRaw(fd uintptr) (*State, error) { termios.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) termios.Cflag &^= (unix.CSIZE | unix.PARENB) termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 if err := unix.IoctlSetTermios(int(fd), setTermios, termios); err != nil { return nil, err diff --git a/vendor/github.com/docker/docker/pkg/term/windows/windows.go b/vendor/github.com/docker/docker/pkg/term/windows/windows.go index c02a93a03f1..65bb2032b06 100644 --- a/vendor/github.com/docker/docker/pkg/term/windows/windows.go +++ b/vendor/github.com/docker/docker/pkg/term/windows/windows.go @@ -9,7 +9,7 @@ import ( "os" "sync" - ansiterm "github.com/Azure/go-ansiterm" + "github.com/Azure/go-ansiterm" "github.com/sirupsen/logrus" ) diff --git a/vendor/github.com/docker/docker/pkg/term/winsize.go b/vendor/github.com/docker/docker/pkg/term/winsize.go index f58367fe660..1ef98d59961 100644 --- a/vendor/github.com/docker/docker/pkg/term/winsize.go +++ b/vendor/github.com/docker/docker/pkg/term/winsize.go @@ -1,30 +1,20 @@ -// +build !solaris,!windows +// +build !windows package term import ( - "unsafe" - "golang.org/x/sys/unix" ) // GetWinsize returns the window size based on the specified file descriptor. func GetWinsize(fd uintptr) (*Winsize, error) { - ws := &Winsize{} - _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(unix.TIOCGWINSZ), uintptr(unsafe.Pointer(ws))) - // Skipp errno = 0 - if err == 0 { - return ws, nil - } + uws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ) + ws := &Winsize{Height: uws.Row, Width: uws.Col, x: uws.Xpixel, y: uws.Ypixel} return ws, err } // SetWinsize tries to set the specified window size for the specified file descriptor. func SetWinsize(fd uintptr, ws *Winsize) error { - _, _, err := unix.Syscall(unix.SYS_IOCTL, fd, uintptr(unix.TIOCSWINSZ), uintptr(unsafe.Pointer(ws))) - // Skipp errno = 0 - if err == 0 { - return nil - } - return err + uws := &unix.Winsize{Row: ws.Height, Col: ws.Width, Xpixel: ws.x, Ypixel: ws.y} + return unix.IoctlSetWinsize(int(fd), unix.TIOCSWINSZ, uws) } diff --git a/vendor/github.com/docker/docker/pkg/term/winsize_solaris_cgo.go b/vendor/github.com/docker/docker/pkg/term/winsize_solaris_cgo.go deleted file mode 100644 index 39c1d3207ce..00000000000 --- a/vendor/github.com/docker/docker/pkg/term/winsize_solaris_cgo.go +++ /dev/null @@ -1,42 +0,0 @@ -// +build solaris,cgo - -package term - -import ( - "unsafe" - - "golang.org/x/sys/unix" -) - -/* -#include -#include -#include - -// Small wrapper to get rid of variadic args of ioctl() -int my_ioctl(int fd, int cmd, struct winsize *ws) { - return ioctl(fd, cmd, ws); -} -*/ -import "C" - -// GetWinsize returns the window size based on the specified file descriptor. -func GetWinsize(fd uintptr) (*Winsize, error) { - ws := &Winsize{} - ret, err := C.my_ioctl(C.int(fd), C.int(unix.TIOCGWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws))) - // Skip retval = 0 - if ret == 0 { - return ws, nil - } - return ws, err -} - -// SetWinsize tries to set the specified window size for the specified file descriptor. -func SetWinsize(fd uintptr, ws *Winsize) error { - ret, err := C.my_ioctl(C.int(fd), C.int(unix.TIOCSWINSZ), (*C.struct_winsize)(unsafe.Pointer(ws))) - // Skip retval = 0 - if ret == 0 { - return nil - } - return err -} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/BUILD b/vendor/github.com/docker/docker/pkg/tlsconfig/BUILD deleted file mode 100644 index 37d762f6edb..00000000000 --- a/vendor/github.com/docker/docker/pkg/tlsconfig/BUILD +++ /dev/null @@ -1,26 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "tlsconfig_clone.go", - "tlsconfig_clone_go17.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/tlsconfig", - importpath = "github.com/docker/docker/pkg/tlsconfig", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go deleted file mode 100644 index e4dec3a5d1f..00000000000 --- a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build go1.8 - -package tlsconfig - -import "crypto/tls" - -// Clone returns a clone of tls.Config. This function is provided for -// compatibility for go1.7 that doesn't include this method in stdlib. -func Clone(c *tls.Config) *tls.Config { - return c.Clone() -} diff --git a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go b/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go deleted file mode 100644 index 0d5b448fecb..00000000000 --- a/vendor/github.com/docker/docker/pkg/tlsconfig/tlsconfig_clone_go17.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build go1.7,!go1.8 - -package tlsconfig - -import "crypto/tls" - -// Clone returns a clone of tls.Config. This function is provided for -// compatibility for go1.7 that doesn't include this method in stdlib. -func Clone(c *tls.Config) *tls.Config { - return &tls.Config{ - Rand: c.Rand, - Time: c.Time, - Certificates: c.Certificates, - NameToCertificate: c.NameToCertificate, - GetCertificate: c.GetCertificate, - RootCAs: c.RootCAs, - NextProtos: c.NextProtos, - ServerName: c.ServerName, - ClientAuth: c.ClientAuth, - ClientCAs: c.ClientCAs, - InsecureSkipVerify: c.InsecureSkipVerify, - CipherSuites: c.CipherSuites, - PreferServerCipherSuites: c.PreferServerCipherSuites, - SessionTicketsDisabled: c.SessionTicketsDisabled, - SessionTicketKey: c.SessionTicketKey, - ClientSessionCache: c.ClientSessionCache, - MinVersion: c.MinVersion, - MaxVersion: c.MaxVersion, - CurvePreferences: c.CurvePreferences, - DynamicRecordSizingDisabled: c.DynamicRecordSizingDisabled, - Renegotiation: c.Renegotiation, - } -} diff --git a/vendor/github.com/docker/libtrust/BUILD b/vendor/github.com/docker/libtrust/BUILD deleted file mode 100644 index 357266178f0..00000000000 --- a/vendor/github.com/docker/libtrust/BUILD +++ /dev/null @@ -1,35 +0,0 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") - -go_library( - name = "go_default_library", - srcs = [ - "certificates.go", - "doc.go", - "ec_key.go", - "filter.go", - "hash.go", - "jsonsign.go", - "key.go", - "key_files.go", - "key_manager.go", - "rsa_key.go", - "util.go", - ], - importmap = "k8s.io/kubernetes/vendor/github.com/docker/libtrust", - importpath = "github.com/docker/libtrust", - visibility = ["//visibility:public"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], - visibility = ["//visibility:public"], -) diff --git a/vendor/github.com/docker/libtrust/CONTRIBUTING.md b/vendor/github.com/docker/libtrust/CONTRIBUTING.md deleted file mode 100644 index 05be0f8ab3d..00000000000 --- a/vendor/github.com/docker/libtrust/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contributing to libtrust - -Want to hack on libtrust? Awesome! Here are instructions to get you -started. - -libtrust is a part of the [Docker](https://www.docker.com) project, and follows -the same rules and principles. If you're already familiar with the way -Docker does things, you'll feel right at home. - -Otherwise, go read -[Docker's contributions guidelines](https://github.com/docker/docker/blob/master/CONTRIBUTING.md). - -Happy hacking! diff --git a/vendor/github.com/docker/libtrust/LICENSE b/vendor/github.com/docker/libtrust/LICENSE deleted file mode 100644 index 27448585ad4..00000000000 --- a/vendor/github.com/docker/libtrust/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - 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 - - Copyright 2014 Docker, Inc. - - 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/docker/libtrust/MAINTAINERS b/vendor/github.com/docker/libtrust/MAINTAINERS deleted file mode 100644 index 9768175feb4..00000000000 --- a/vendor/github.com/docker/libtrust/MAINTAINERS +++ /dev/null @@ -1,3 +0,0 @@ -Solomon Hykes -Josh Hawn (github: jlhawn) -Derek McGowan (github: dmcgowan) diff --git a/vendor/github.com/docker/libtrust/README.md b/vendor/github.com/docker/libtrust/README.md deleted file mode 100644 index 8e7db38186e..00000000000 --- a/vendor/github.com/docker/libtrust/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# libtrust - -Libtrust is library for managing authentication and authorization using public key cryptography. - -Authentication is handled using the identity attached to the public key. -Libtrust provides multiple methods to prove possession of the private key associated with an identity. - - TLS x509 certificates - - Signature verification - - Key Challenge - -Authorization and access control is managed through a distributed trust graph. -Trust servers are used as the authorities of the trust graph and allow caching portions of the graph for faster access. - -## Copyright and license - -Code and documentation copyright 2014 Docker, inc. Code released under the Apache 2.0 license. -Docs released under Creative commons. - diff --git a/vendor/github.com/docker/libtrust/certificates.go b/vendor/github.com/docker/libtrust/certificates.go deleted file mode 100644 index 3dcca33cb18..00000000000 --- a/vendor/github.com/docker/libtrust/certificates.go +++ /dev/null @@ -1,175 +0,0 @@ -package libtrust - -import ( - "crypto/rand" - "crypto/x509" - "crypto/x509/pkix" - "encoding/pem" - "fmt" - "io/ioutil" - "math/big" - "net" - "time" -) - -type certTemplateInfo struct { - commonName string - domains []string - ipAddresses []net.IP - isCA bool - clientAuth bool - serverAuth bool -} - -func generateCertTemplate(info *certTemplateInfo) *x509.Certificate { - // Generate a certificate template which is valid from the past week to - // 10 years from now. The usage of the certificate depends on the - // specified fields in the given certTempInfo object. - var ( - keyUsage x509.KeyUsage - extKeyUsage []x509.ExtKeyUsage - ) - - if info.isCA { - keyUsage = x509.KeyUsageCertSign - } - - if info.clientAuth { - extKeyUsage = append(extKeyUsage, x509.ExtKeyUsageClientAuth) - } - - if info.serverAuth { - extKeyUsage = append(extKeyUsage, x509.ExtKeyUsageServerAuth) - } - - return &x509.Certificate{ - SerialNumber: big.NewInt(0), - Subject: pkix.Name{ - CommonName: info.commonName, - }, - NotBefore: time.Now().Add(-time.Hour * 24 * 7), - NotAfter: time.Now().Add(time.Hour * 24 * 365 * 10), - DNSNames: info.domains, - IPAddresses: info.ipAddresses, - IsCA: info.isCA, - KeyUsage: keyUsage, - ExtKeyUsage: extKeyUsage, - BasicConstraintsValid: info.isCA, - } -} - -func generateCert(pub PublicKey, priv PrivateKey, subInfo, issInfo *certTemplateInfo) (cert *x509.Certificate, err error) { - pubCertTemplate := generateCertTemplate(subInfo) - privCertTemplate := generateCertTemplate(issInfo) - - certDER, err := x509.CreateCertificate( - rand.Reader, pubCertTemplate, privCertTemplate, - pub.CryptoPublicKey(), priv.CryptoPrivateKey(), - ) - if err != nil { - return nil, fmt.Errorf("failed to create certificate: %s", err) - } - - cert, err = x509.ParseCertificate(certDER) - if err != nil { - return nil, fmt.Errorf("failed to parse certificate: %s", err) - } - - return -} - -// GenerateSelfSignedServerCert creates a self-signed certificate for the -// given key which is to be used for TLS servers with the given domains and -// IP addresses. -func GenerateSelfSignedServerCert(key PrivateKey, domains []string, ipAddresses []net.IP) (*x509.Certificate, error) { - info := &certTemplateInfo{ - commonName: key.KeyID(), - domains: domains, - ipAddresses: ipAddresses, - serverAuth: true, - } - - return generateCert(key.PublicKey(), key, info, info) -} - -// GenerateSelfSignedClientCert creates a self-signed certificate for the -// given key which is to be used for TLS clients. -func GenerateSelfSignedClientCert(key PrivateKey) (*x509.Certificate, error) { - info := &certTemplateInfo{ - commonName: key.KeyID(), - clientAuth: true, - } - - return generateCert(key.PublicKey(), key, info, info) -} - -// GenerateCACert creates a certificate which can be used as a trusted -// certificate authority. -func GenerateCACert(signer PrivateKey, trustedKey PublicKey) (*x509.Certificate, error) { - subjectInfo := &certTemplateInfo{ - commonName: trustedKey.KeyID(), - isCA: true, - } - issuerInfo := &certTemplateInfo{ - commonName: signer.KeyID(), - } - - return generateCert(trustedKey, signer, subjectInfo, issuerInfo) -} - -// GenerateCACertPool creates a certificate authority pool to be used for a -// TLS configuration. Any self-signed certificates issued by the specified -// trusted keys will be verified during a TLS handshake -func GenerateCACertPool(signer PrivateKey, trustedKeys []PublicKey) (*x509.CertPool, error) { - certPool := x509.NewCertPool() - - for _, trustedKey := range trustedKeys { - cert, err := GenerateCACert(signer, trustedKey) - if err != nil { - return nil, fmt.Errorf("failed to generate CA certificate: %s", err) - } - - certPool.AddCert(cert) - } - - return certPool, nil -} - -// LoadCertificateBundle loads certificates from the given file. The file should be pem encoded -// containing one or more certificates. The expected pem type is "CERTIFICATE". -func LoadCertificateBundle(filename string) ([]*x509.Certificate, error) { - b, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - certificates := []*x509.Certificate{} - var block *pem.Block - block, b = pem.Decode(b) - for ; block != nil; block, b = pem.Decode(b) { - if block.Type == "CERTIFICATE" { - cert, err := x509.ParseCertificate(block.Bytes) - if err != nil { - return nil, err - } - certificates = append(certificates, cert) - } else { - return nil, fmt.Errorf("invalid pem block type: %s", block.Type) - } - } - - return certificates, nil -} - -// LoadCertificatePool loads a CA pool from the given file. The file should be pem encoded -// containing one or more certificates. The expected pem type is "CERTIFICATE". -func LoadCertificatePool(filename string) (*x509.CertPool, error) { - certs, err := LoadCertificateBundle(filename) - if err != nil { - return nil, err - } - pool := x509.NewCertPool() - for _, cert := range certs { - pool.AddCert(cert) - } - return pool, nil -} diff --git a/vendor/github.com/docker/libtrust/doc.go b/vendor/github.com/docker/libtrust/doc.go deleted file mode 100644 index ec5d2159c11..00000000000 --- a/vendor/github.com/docker/libtrust/doc.go +++ /dev/null @@ -1,9 +0,0 @@ -/* -Package libtrust provides an interface for managing authentication and -authorization using public key cryptography. Authentication is handled -using the identity attached to the public key and verified through TLS -x509 certificates, a key challenge, or signature. Authorization and -access control is managed through a trust graph distributed between -both remote trust servers and locally cached and managed data. -*/ -package libtrust diff --git a/vendor/github.com/docker/libtrust/ec_key.go b/vendor/github.com/docker/libtrust/ec_key.go deleted file mode 100644 index 00bbe4b3caf..00000000000 --- a/vendor/github.com/docker/libtrust/ec_key.go +++ /dev/null @@ -1,428 +0,0 @@ -package libtrust - -import ( - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/x509" - "encoding/json" - "encoding/pem" - "errors" - "fmt" - "io" - "math/big" -) - -/* - * EC DSA PUBLIC KEY - */ - -// ecPublicKey implements a libtrust.PublicKey using elliptic curve digital -// signature algorithms. -type ecPublicKey struct { - *ecdsa.PublicKey - curveName string - signatureAlgorithm *signatureAlgorithm - extended map[string]interface{} -} - -func fromECPublicKey(cryptoPublicKey *ecdsa.PublicKey) (*ecPublicKey, error) { - curve := cryptoPublicKey.Curve - - switch { - case curve == elliptic.P256(): - return &ecPublicKey{cryptoPublicKey, "P-256", es256, map[string]interface{}{}}, nil - case curve == elliptic.P384(): - return &ecPublicKey{cryptoPublicKey, "P-384", es384, map[string]interface{}{}}, nil - case curve == elliptic.P521(): - return &ecPublicKey{cryptoPublicKey, "P-521", es512, map[string]interface{}{}}, nil - default: - return nil, errors.New("unsupported elliptic curve") - } -} - -// KeyType returns the key type for elliptic curve keys, i.e., "EC". -func (k *ecPublicKey) KeyType() string { - return "EC" -} - -// CurveName returns the elliptic curve identifier. -// Possible values are "P-256", "P-384", and "P-521". -func (k *ecPublicKey) CurveName() string { - return k.curveName -} - -// KeyID returns a distinct identifier which is unique to this Public Key. -func (k *ecPublicKey) KeyID() string { - return keyIDFromCryptoKey(k) -} - -func (k *ecPublicKey) String() string { - return fmt.Sprintf("EC Public Key <%s>", k.KeyID()) -} - -// Verify verifyies the signature of the data in the io.Reader using this -// PublicKey. The alg parameter should identify the digital signature -// algorithm which was used to produce the signature and should be supported -// by this public key. Returns a nil error if the signature is valid. -func (k *ecPublicKey) Verify(data io.Reader, alg string, signature []byte) error { - // For EC keys there is only one supported signature algorithm depending - // on the curve parameters. - if k.signatureAlgorithm.HeaderParam() != alg { - return fmt.Errorf("unable to verify signature: EC Public Key with curve %q does not support signature algorithm %q", k.curveName, alg) - } - - // signature is the concatenation of (r, s), base64Url encoded. - sigLength := len(signature) - expectedOctetLength := 2 * ((k.Params().BitSize + 7) >> 3) - if sigLength != expectedOctetLength { - return fmt.Errorf("signature length is %d octets long, should be %d", sigLength, expectedOctetLength) - } - - rBytes, sBytes := signature[:sigLength/2], signature[sigLength/2:] - r := new(big.Int).SetBytes(rBytes) - s := new(big.Int).SetBytes(sBytes) - - hasher := k.signatureAlgorithm.HashID().New() - _, err := io.Copy(hasher, data) - if err != nil { - return fmt.Errorf("error reading data to sign: %s", err) - } - hash := hasher.Sum(nil) - - if !ecdsa.Verify(k.PublicKey, hash, r, s) { - return errors.New("invalid signature") - } - - return nil -} - -// CryptoPublicKey returns the internal object which can be used as a -// crypto.PublicKey for use with other standard library operations. The type -// is either *rsa.PublicKey or *ecdsa.PublicKey -func (k *ecPublicKey) CryptoPublicKey() crypto.PublicKey { - return k.PublicKey -} - -func (k *ecPublicKey) toMap() map[string]interface{} { - jwk := make(map[string]interface{}) - for k, v := range k.extended { - jwk[k] = v - } - jwk["kty"] = k.KeyType() - jwk["kid"] = k.KeyID() - jwk["crv"] = k.CurveName() - - xBytes := k.X.Bytes() - yBytes := k.Y.Bytes() - octetLength := (k.Params().BitSize + 7) >> 3 - // MUST include leading zeros in the output so that x, y are each - // *octetLength* bytes long. - xBuf := make([]byte, octetLength-len(xBytes), octetLength) - yBuf := make([]byte, octetLength-len(yBytes), octetLength) - xBuf = append(xBuf, xBytes...) - yBuf = append(yBuf, yBytes...) - - jwk["x"] = joseBase64UrlEncode(xBuf) - jwk["y"] = joseBase64UrlEncode(yBuf) - - return jwk -} - -// MarshalJSON serializes this Public Key using the JWK JSON serialization format for -// elliptic curve keys. -func (k *ecPublicKey) MarshalJSON() (data []byte, err error) { - return json.Marshal(k.toMap()) -} - -// PEMBlock serializes this Public Key to DER-encoded PKIX format. -func (k *ecPublicKey) PEMBlock() (*pem.Block, error) { - derBytes, err := x509.MarshalPKIXPublicKey(k.PublicKey) - if err != nil { - return nil, fmt.Errorf("unable to serialize EC PublicKey to DER-encoded PKIX format: %s", err) - } - k.extended["kid"] = k.KeyID() // For display purposes. - return createPemBlock("PUBLIC KEY", derBytes, k.extended) -} - -func (k *ecPublicKey) AddExtendedField(field string, value interface{}) { - k.extended[field] = value -} - -func (k *ecPublicKey) GetExtendedField(field string) interface{} { - v, ok := k.extended[field] - if !ok { - return nil - } - return v -} - -func ecPublicKeyFromMap(jwk map[string]interface{}) (*ecPublicKey, error) { - // JWK key type (kty) has already been determined to be "EC". - // Need to extract 'crv', 'x', 'y', and 'kid' and check for - // consistency. - - // Get the curve identifier value. - crv, err := stringFromMap(jwk, "crv") - if err != nil { - return nil, fmt.Errorf("JWK EC Public Key curve identifier: %s", err) - } - - var ( - curve elliptic.Curve - sigAlg *signatureAlgorithm - ) - - switch { - case crv == "P-256": - curve = elliptic.P256() - sigAlg = es256 - case crv == "P-384": - curve = elliptic.P384() - sigAlg = es384 - case crv == "P-521": - curve = elliptic.P521() - sigAlg = es512 - default: - return nil, fmt.Errorf("JWK EC Public Key curve identifier not supported: %q\n", crv) - } - - // Get the X and Y coordinates for the public key point. - xB64Url, err := stringFromMap(jwk, "x") - if err != nil { - return nil, fmt.Errorf("JWK EC Public Key x-coordinate: %s", err) - } - x, err := parseECCoordinate(xB64Url, curve) - if err != nil { - return nil, fmt.Errorf("JWK EC Public Key x-coordinate: %s", err) - } - - yB64Url, err := stringFromMap(jwk, "y") - if err != nil { - return nil, fmt.Errorf("JWK EC Public Key y-coordinate: %s", err) - } - y, err := parseECCoordinate(yB64Url, curve) - if err != nil { - return nil, fmt.Errorf("JWK EC Public Key y-coordinate: %s", err) - } - - key := &ecPublicKey{ - PublicKey: &ecdsa.PublicKey{Curve: curve, X: x, Y: y}, - curveName: crv, signatureAlgorithm: sigAlg, - } - - // Key ID is optional too, but if it exists, it should match the key. - _, ok := jwk["kid"] - if ok { - kid, err := stringFromMap(jwk, "kid") - if err != nil { - return nil, fmt.Errorf("JWK EC Public Key ID: %s", err) - } - if kid != key.KeyID() { - return nil, fmt.Errorf("JWK EC Public Key ID does not match: %s", kid) - } - } - - key.extended = jwk - - return key, nil -} - -/* - * EC DSA PRIVATE KEY - */ - -// ecPrivateKey implements a JWK Private Key using elliptic curve digital signature -// algorithms. -type ecPrivateKey struct { - ecPublicKey - *ecdsa.PrivateKey -} - -func fromECPrivateKey(cryptoPrivateKey *ecdsa.PrivateKey) (*ecPrivateKey, error) { - publicKey, err := fromECPublicKey(&cryptoPrivateKey.PublicKey) - if err != nil { - return nil, err - } - - return &ecPrivateKey{*publicKey, cryptoPrivateKey}, nil -} - -// PublicKey returns the Public Key data associated with this Private Key. -func (k *ecPrivateKey) PublicKey() PublicKey { - return &k.ecPublicKey -} - -func (k *ecPrivateKey) String() string { - return fmt.Sprintf("EC Private Key <%s>", k.KeyID()) -} - -// Sign signs the data read from the io.Reader using a signature algorithm supported -// by the elliptic curve private key. If the specified hashing algorithm is -// supported by this key, that hash function is used to generate the signature -// otherwise the the default hashing algorithm for this key is used. Returns -// the signature and the name of the JWK signature algorithm used, e.g., -// "ES256", "ES384", "ES512". -func (k *ecPrivateKey) Sign(data io.Reader, hashID crypto.Hash) (signature []byte, alg string, err error) { - // Generate a signature of the data using the internal alg. - // The given hashId is only a suggestion, and since EC keys only support - // on signature/hash algorithm given the curve name, we disregard it for - // the elliptic curve JWK signature implementation. - hasher := k.signatureAlgorithm.HashID().New() - _, err = io.Copy(hasher, data) - if err != nil { - return nil, "", fmt.Errorf("error reading data to sign: %s", err) - } - hash := hasher.Sum(nil) - - r, s, err := ecdsa.Sign(rand.Reader, k.PrivateKey, hash) - if err != nil { - return nil, "", fmt.Errorf("error producing signature: %s", err) - } - rBytes, sBytes := r.Bytes(), s.Bytes() - octetLength := (k.ecPublicKey.Params().BitSize + 7) >> 3 - // MUST include leading zeros in the output - rBuf := make([]byte, octetLength-len(rBytes), octetLength) - sBuf := make([]byte, octetLength-len(sBytes), octetLength) - - rBuf = append(rBuf, rBytes...) - sBuf = append(sBuf, sBytes...) - - signature = append(rBuf, sBuf...) - alg = k.signatureAlgorithm.HeaderParam() - - return -} - -// CryptoPrivateKey returns the internal object which can be used as a -// crypto.PublicKey for use with other standard library operations. The type -// is either *rsa.PublicKey or *ecdsa.PublicKey -func (k *ecPrivateKey) CryptoPrivateKey() crypto.PrivateKey { - return k.PrivateKey -} - -func (k *ecPrivateKey) toMap() map[string]interface{} { - jwk := k.ecPublicKey.toMap() - - dBytes := k.D.Bytes() - // The length of this octet string MUST be ceiling(log-base-2(n)/8) - // octets (where n is the order of the curve). This is because the private - // key d must be in the interval [1, n-1] so the bitlength of d should be - // no larger than the bitlength of n-1. The easiest way to find the octet - // length is to take bitlength(n-1), add 7 to force a carry, and shift this - // bit sequence right by 3, which is essentially dividing by 8 and adding - // 1 if there is any remainder. Thus, the private key value d should be - // output to (bitlength(n-1)+7)>>3 octets. - n := k.ecPublicKey.Params().N - octetLength := (new(big.Int).Sub(n, big.NewInt(1)).BitLen() + 7) >> 3 - // Create a buffer with the necessary zero-padding. - dBuf := make([]byte, octetLength-len(dBytes), octetLength) - dBuf = append(dBuf, dBytes...) - - jwk["d"] = joseBase64UrlEncode(dBuf) - - return jwk -} - -// MarshalJSON serializes this Private Key using the JWK JSON serialization format for -// elliptic curve keys. -func (k *ecPrivateKey) MarshalJSON() (data []byte, err error) { - return json.Marshal(k.toMap()) -} - -// PEMBlock serializes this Private Key to DER-encoded PKIX format. -func (k *ecPrivateKey) PEMBlock() (*pem.Block, error) { - derBytes, err := x509.MarshalECPrivateKey(k.PrivateKey) - if err != nil { - return nil, fmt.Errorf("unable to serialize EC PrivateKey to DER-encoded PKIX format: %s", err) - } - k.extended["keyID"] = k.KeyID() // For display purposes. - return createPemBlock("EC PRIVATE KEY", derBytes, k.extended) -} - -func ecPrivateKeyFromMap(jwk map[string]interface{}) (*ecPrivateKey, error) { - dB64Url, err := stringFromMap(jwk, "d") - if err != nil { - return nil, fmt.Errorf("JWK EC Private Key: %s", err) - } - - // JWK key type (kty) has already been determined to be "EC". - // Need to extract the public key information, then extract the private - // key value 'd'. - publicKey, err := ecPublicKeyFromMap(jwk) - if err != nil { - return nil, err - } - - d, err := parseECPrivateParam(dB64Url, publicKey.Curve) - if err != nil { - return nil, fmt.Errorf("JWK EC Private Key d-param: %s", err) - } - - key := &ecPrivateKey{ - ecPublicKey: *publicKey, - PrivateKey: &ecdsa.PrivateKey{ - PublicKey: *publicKey.PublicKey, - D: d, - }, - } - - return key, nil -} - -/* - * Key Generation Functions. - */ - -func generateECPrivateKey(curve elliptic.Curve) (k *ecPrivateKey, err error) { - k = new(ecPrivateKey) - k.PrivateKey, err = ecdsa.GenerateKey(curve, rand.Reader) - if err != nil { - return nil, err - } - - k.ecPublicKey.PublicKey = &k.PrivateKey.PublicKey - k.extended = make(map[string]interface{}) - - return -} - -// GenerateECP256PrivateKey generates a key pair using elliptic curve P-256. -func GenerateECP256PrivateKey() (PrivateKey, error) { - k, err := generateECPrivateKey(elliptic.P256()) - if err != nil { - return nil, fmt.Errorf("error generating EC P-256 key: %s", err) - } - - k.curveName = "P-256" - k.signatureAlgorithm = es256 - - return k, nil -} - -// GenerateECP384PrivateKey generates a key pair using elliptic curve P-384. -func GenerateECP384PrivateKey() (PrivateKey, error) { - k, err := generateECPrivateKey(elliptic.P384()) - if err != nil { - return nil, fmt.Errorf("error generating EC P-384 key: %s", err) - } - - k.curveName = "P-384" - k.signatureAlgorithm = es384 - - return k, nil -} - -// GenerateECP521PrivateKey generates aß key pair using elliptic curve P-521. -func GenerateECP521PrivateKey() (PrivateKey, error) { - k, err := generateECPrivateKey(elliptic.P521()) - if err != nil { - return nil, fmt.Errorf("error generating EC P-521 key: %s", err) - } - - k.curveName = "P-521" - k.signatureAlgorithm = es512 - - return k, nil -} diff --git a/vendor/github.com/docker/libtrust/filter.go b/vendor/github.com/docker/libtrust/filter.go deleted file mode 100644 index 5b2b4fca6fb..00000000000 --- a/vendor/github.com/docker/libtrust/filter.go +++ /dev/null @@ -1,50 +0,0 @@ -package libtrust - -import ( - "path/filepath" -) - -// FilterByHosts filters the list of PublicKeys to only those which contain a -// 'hosts' pattern which matches the given host. If *includeEmpty* is true, -// then keys which do not specify any hosts are also returned. -func FilterByHosts(keys []PublicKey, host string, includeEmpty bool) ([]PublicKey, error) { - filtered := make([]PublicKey, 0, len(keys)) - - for _, pubKey := range keys { - var hosts []string - switch v := pubKey.GetExtendedField("hosts").(type) { - case []string: - hosts = v - case []interface{}: - for _, value := range v { - h, ok := value.(string) - if !ok { - continue - } - hosts = append(hosts, h) - } - } - - if len(hosts) == 0 { - if includeEmpty { - filtered = append(filtered, pubKey) - } - continue - } - - // Check if any hosts match pattern - for _, hostPattern := range hosts { - match, err := filepath.Match(hostPattern, host) - if err != nil { - return nil, err - } - - if match { - filtered = append(filtered, pubKey) - continue - } - } - } - - return filtered, nil -} diff --git a/vendor/github.com/docker/libtrust/hash.go b/vendor/github.com/docker/libtrust/hash.go deleted file mode 100644 index a2df787dd99..00000000000 --- a/vendor/github.com/docker/libtrust/hash.go +++ /dev/null @@ -1,56 +0,0 @@ -package libtrust - -import ( - "crypto" - _ "crypto/sha256" // Registrer SHA224 and SHA256 - _ "crypto/sha512" // Registrer SHA384 and SHA512 - "fmt" -) - -type signatureAlgorithm struct { - algHeaderParam string - hashID crypto.Hash -} - -func (h *signatureAlgorithm) HeaderParam() string { - return h.algHeaderParam -} - -func (h *signatureAlgorithm) HashID() crypto.Hash { - return h.hashID -} - -var ( - rs256 = &signatureAlgorithm{"RS256", crypto.SHA256} - rs384 = &signatureAlgorithm{"RS384", crypto.SHA384} - rs512 = &signatureAlgorithm{"RS512", crypto.SHA512} - es256 = &signatureAlgorithm{"ES256", crypto.SHA256} - es384 = &signatureAlgorithm{"ES384", crypto.SHA384} - es512 = &signatureAlgorithm{"ES512", crypto.SHA512} -) - -func rsaSignatureAlgorithmByName(alg string) (*signatureAlgorithm, error) { - switch { - case alg == "RS256": - return rs256, nil - case alg == "RS384": - return rs384, nil - case alg == "RS512": - return rs512, nil - default: - return nil, fmt.Errorf("RSA Digital Signature Algorithm %q not supported", alg) - } -} - -func rsaPKCS1v15SignatureAlgorithmForHashID(hashID crypto.Hash) *signatureAlgorithm { - switch { - case hashID == crypto.SHA512: - return rs512 - case hashID == crypto.SHA384: - return rs384 - case hashID == crypto.SHA256: - fallthrough - default: - return rs256 - } -} diff --git a/vendor/github.com/docker/libtrust/jsonsign.go b/vendor/github.com/docker/libtrust/jsonsign.go deleted file mode 100644 index cb2ca9a7690..00000000000 --- a/vendor/github.com/docker/libtrust/jsonsign.go +++ /dev/null @@ -1,657 +0,0 @@ -package libtrust - -import ( - "bytes" - "crypto" - "crypto/x509" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "sort" - "time" - "unicode" -) - -var ( - // ErrInvalidSignContent is used when the content to be signed is invalid. - ErrInvalidSignContent = errors.New("invalid sign content") - - // ErrInvalidJSONContent is used when invalid json is encountered. - ErrInvalidJSONContent = errors.New("invalid json content") - - // ErrMissingSignatureKey is used when the specified signature key - // does not exist in the JSON content. - ErrMissingSignatureKey = errors.New("missing signature key") -) - -type jsHeader struct { - JWK PublicKey `json:"jwk,omitempty"` - Algorithm string `json:"alg"` - Chain []string `json:"x5c,omitempty"` -} - -type jsSignature struct { - Header jsHeader `json:"header"` - Signature string `json:"signature"` - Protected string `json:"protected,omitempty"` -} - -type jsSignaturesSorted []jsSignature - -func (jsbkid jsSignaturesSorted) Swap(i, j int) { jsbkid[i], jsbkid[j] = jsbkid[j], jsbkid[i] } -func (jsbkid jsSignaturesSorted) Len() int { return len(jsbkid) } - -func (jsbkid jsSignaturesSorted) Less(i, j int) bool { - ki, kj := jsbkid[i].Header.JWK.KeyID(), jsbkid[j].Header.JWK.KeyID() - si, sj := jsbkid[i].Signature, jsbkid[j].Signature - - if ki == kj { - return si < sj - } - - return ki < kj -} - -type signKey struct { - PrivateKey - Chain []*x509.Certificate -} - -// JSONSignature represents a signature of a json object. -type JSONSignature struct { - payload string - signatures []jsSignature - indent string - formatLength int - formatTail []byte -} - -func newJSONSignature() *JSONSignature { - return &JSONSignature{ - signatures: make([]jsSignature, 0, 1), - } -} - -// Payload returns the encoded payload of the signature. This -// payload should not be signed directly -func (js *JSONSignature) Payload() ([]byte, error) { - return joseBase64UrlDecode(js.payload) -} - -func (js *JSONSignature) protectedHeader() (string, error) { - protected := map[string]interface{}{ - "formatLength": js.formatLength, - "formatTail": joseBase64UrlEncode(js.formatTail), - "time": time.Now().UTC().Format(time.RFC3339), - } - protectedBytes, err := json.Marshal(protected) - if err != nil { - return "", err - } - - return joseBase64UrlEncode(protectedBytes), nil -} - -func (js *JSONSignature) signBytes(protectedHeader string) ([]byte, error) { - buf := make([]byte, len(js.payload)+len(protectedHeader)+1) - copy(buf, protectedHeader) - buf[len(protectedHeader)] = '.' - copy(buf[len(protectedHeader)+1:], js.payload) - return buf, nil -} - -// Sign adds a signature using the given private key. -func (js *JSONSignature) Sign(key PrivateKey) error { - protected, err := js.protectedHeader() - if err != nil { - return err - } - signBytes, err := js.signBytes(protected) - if err != nil { - return err - } - sigBytes, algorithm, err := key.Sign(bytes.NewReader(signBytes), crypto.SHA256) - if err != nil { - return err - } - - js.signatures = append(js.signatures, jsSignature{ - Header: jsHeader{ - JWK: key.PublicKey(), - Algorithm: algorithm, - }, - Signature: joseBase64UrlEncode(sigBytes), - Protected: protected, - }) - - return nil -} - -// SignWithChain adds a signature using the given private key -// and setting the x509 chain. The public key of the first element -// in the chain must be the public key corresponding with the sign key. -func (js *JSONSignature) SignWithChain(key PrivateKey, chain []*x509.Certificate) error { - // Ensure key.Chain[0] is public key for key - //key.Chain.PublicKey - //key.PublicKey().CryptoPublicKey() - - // Verify chain - protected, err := js.protectedHeader() - if err != nil { - return err - } - signBytes, err := js.signBytes(protected) - if err != nil { - return err - } - sigBytes, algorithm, err := key.Sign(bytes.NewReader(signBytes), crypto.SHA256) - if err != nil { - return err - } - - header := jsHeader{ - Chain: make([]string, len(chain)), - Algorithm: algorithm, - } - - for i, cert := range chain { - header.Chain[i] = base64.StdEncoding.EncodeToString(cert.Raw) - } - - js.signatures = append(js.signatures, jsSignature{ - Header: header, - Signature: joseBase64UrlEncode(sigBytes), - Protected: protected, - }) - - return nil -} - -// Verify verifies all the signatures and returns the list of -// public keys used to sign. Any x509 chains are not checked. -func (js *JSONSignature) Verify() ([]PublicKey, error) { - keys := make([]PublicKey, len(js.signatures)) - for i, signature := range js.signatures { - signBytes, err := js.signBytes(signature.Protected) - if err != nil { - return nil, err - } - var publicKey PublicKey - if len(signature.Header.Chain) > 0 { - certBytes, err := base64.StdEncoding.DecodeString(signature.Header.Chain[0]) - if err != nil { - return nil, err - } - cert, err := x509.ParseCertificate(certBytes) - if err != nil { - return nil, err - } - publicKey, err = FromCryptoPublicKey(cert.PublicKey) - if err != nil { - return nil, err - } - } else if signature.Header.JWK != nil { - publicKey = signature.Header.JWK - } else { - return nil, errors.New("missing public key") - } - - sigBytes, err := joseBase64UrlDecode(signature.Signature) - if err != nil { - return nil, err - } - - err = publicKey.Verify(bytes.NewReader(signBytes), signature.Header.Algorithm, sigBytes) - if err != nil { - return nil, err - } - - keys[i] = publicKey - } - return keys, nil -} - -// VerifyChains verifies all the signatures and the chains associated -// with each signature and returns the list of verified chains. -// Signatures without an x509 chain are not checked. -func (js *JSONSignature) VerifyChains(ca *x509.CertPool) ([][]*x509.Certificate, error) { - chains := make([][]*x509.Certificate, 0, len(js.signatures)) - for _, signature := range js.signatures { - signBytes, err := js.signBytes(signature.Protected) - if err != nil { - return nil, err - } - var publicKey PublicKey - if len(signature.Header.Chain) > 0 { - certBytes, err := base64.StdEncoding.DecodeString(signature.Header.Chain[0]) - if err != nil { - return nil, err - } - cert, err := x509.ParseCertificate(certBytes) - if err != nil { - return nil, err - } - publicKey, err = FromCryptoPublicKey(cert.PublicKey) - if err != nil { - return nil, err - } - intermediates := x509.NewCertPool() - if len(signature.Header.Chain) > 1 { - intermediateChain := signature.Header.Chain[1:] - for i := range intermediateChain { - certBytes, err := base64.StdEncoding.DecodeString(intermediateChain[i]) - if err != nil { - return nil, err - } - intermediate, err := x509.ParseCertificate(certBytes) - if err != nil { - return nil, err - } - intermediates.AddCert(intermediate) - } - } - - verifyOptions := x509.VerifyOptions{ - Intermediates: intermediates, - Roots: ca, - } - - verifiedChains, err := cert.Verify(verifyOptions) - if err != nil { - return nil, err - } - chains = append(chains, verifiedChains...) - - sigBytes, err := joseBase64UrlDecode(signature.Signature) - if err != nil { - return nil, err - } - - err = publicKey.Verify(bytes.NewReader(signBytes), signature.Header.Algorithm, sigBytes) - if err != nil { - return nil, err - } - } - - } - return chains, nil -} - -// JWS returns JSON serialized JWS according to -// http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-7.2 -func (js *JSONSignature) JWS() ([]byte, error) { - if len(js.signatures) == 0 { - return nil, errors.New("missing signature") - } - - sort.Sort(jsSignaturesSorted(js.signatures)) - - jsonMap := map[string]interface{}{ - "payload": js.payload, - "signatures": js.signatures, - } - - return json.MarshalIndent(jsonMap, "", " ") -} - -func notSpace(r rune) bool { - return !unicode.IsSpace(r) -} - -func detectJSONIndent(jsonContent []byte) (indent string) { - if len(jsonContent) > 2 && jsonContent[0] == '{' && jsonContent[1] == '\n' { - quoteIndex := bytes.IndexRune(jsonContent[1:], '"') - if quoteIndex > 0 { - indent = string(jsonContent[2 : quoteIndex+1]) - } - } - return -} - -type jsParsedHeader struct { - JWK json.RawMessage `json:"jwk"` - Algorithm string `json:"alg"` - Chain []string `json:"x5c"` -} - -type jsParsedSignature struct { - Header jsParsedHeader `json:"header"` - Signature string `json:"signature"` - Protected string `json:"protected"` -} - -// ParseJWS parses a JWS serialized JSON object into a Json Signature. -func ParseJWS(content []byte) (*JSONSignature, error) { - type jsParsed struct { - Payload string `json:"payload"` - Signatures []jsParsedSignature `json:"signatures"` - } - parsed := &jsParsed{} - err := json.Unmarshal(content, parsed) - if err != nil { - return nil, err - } - if len(parsed.Signatures) == 0 { - return nil, errors.New("missing signatures") - } - payload, err := joseBase64UrlDecode(parsed.Payload) - if err != nil { - return nil, err - } - - js, err := NewJSONSignature(payload) - if err != nil { - return nil, err - } - js.signatures = make([]jsSignature, len(parsed.Signatures)) - for i, signature := range parsed.Signatures { - header := jsHeader{ - Algorithm: signature.Header.Algorithm, - } - if signature.Header.Chain != nil { - header.Chain = signature.Header.Chain - } - if signature.Header.JWK != nil { - publicKey, err := UnmarshalPublicKeyJWK([]byte(signature.Header.JWK)) - if err != nil { - return nil, err - } - header.JWK = publicKey - } - js.signatures[i] = jsSignature{ - Header: header, - Signature: signature.Signature, - Protected: signature.Protected, - } - } - - return js, nil -} - -// NewJSONSignature returns a new unsigned JWS from a json byte array. -// JSONSignature will need to be signed before serializing or storing. -// Optionally, one or more signatures can be provided as byte buffers, -// containing serialized JWS signatures, to assemble a fully signed JWS -// package. It is the callers responsibility to ensure uniqueness of the -// provided signatures. -func NewJSONSignature(content []byte, signatures ...[]byte) (*JSONSignature, error) { - var dataMap map[string]interface{} - err := json.Unmarshal(content, &dataMap) - if err != nil { - return nil, err - } - - js := newJSONSignature() - js.indent = detectJSONIndent(content) - - js.payload = joseBase64UrlEncode(content) - - // Find trailing } and whitespace, put in protected header - closeIndex := bytes.LastIndexFunc(content, notSpace) - if content[closeIndex] != '}' { - return nil, ErrInvalidJSONContent - } - lastRuneIndex := bytes.LastIndexFunc(content[:closeIndex], notSpace) - if content[lastRuneIndex] == ',' { - return nil, ErrInvalidJSONContent - } - js.formatLength = lastRuneIndex + 1 - js.formatTail = content[js.formatLength:] - - if len(signatures) > 0 { - for _, signature := range signatures { - var parsedJSig jsParsedSignature - - if err := json.Unmarshal(signature, &parsedJSig); err != nil { - return nil, err - } - - // TODO(stevvooe): A lot of the code below is repeated in - // ParseJWS. It will require more refactoring to fix that. - jsig := jsSignature{ - Header: jsHeader{ - Algorithm: parsedJSig.Header.Algorithm, - }, - Signature: parsedJSig.Signature, - Protected: parsedJSig.Protected, - } - - if parsedJSig.Header.Chain != nil { - jsig.Header.Chain = parsedJSig.Header.Chain - } - - if parsedJSig.Header.JWK != nil { - publicKey, err := UnmarshalPublicKeyJWK([]byte(parsedJSig.Header.JWK)) - if err != nil { - return nil, err - } - jsig.Header.JWK = publicKey - } - - js.signatures = append(js.signatures, jsig) - } - } - - return js, nil -} - -// NewJSONSignatureFromMap returns a new unsigned JSONSignature from a map or -// struct. JWS will need to be signed before serializing or storing. -func NewJSONSignatureFromMap(content interface{}) (*JSONSignature, error) { - switch content.(type) { - case map[string]interface{}: - case struct{}: - default: - return nil, errors.New("invalid data type") - } - - js := newJSONSignature() - js.indent = " " - - payload, err := json.MarshalIndent(content, "", js.indent) - if err != nil { - return nil, err - } - js.payload = joseBase64UrlEncode(payload) - - // Remove '\n}' from formatted section, put in protected header - js.formatLength = len(payload) - 2 - js.formatTail = payload[js.formatLength:] - - return js, nil -} - -func readIntFromMap(key string, m map[string]interface{}) (int, bool) { - value, ok := m[key] - if !ok { - return 0, false - } - switch v := value.(type) { - case int: - return v, true - case float64: - return int(v), true - default: - return 0, false - } -} - -func readStringFromMap(key string, m map[string]interface{}) (v string, ok bool) { - value, ok := m[key] - if !ok { - return "", false - } - v, ok = value.(string) - return -} - -// ParsePrettySignature parses a formatted signature into a -// JSON signature. If the signatures are missing the format information -// an error is thrown. The formatted signature must be created by -// the same method as format signature. -func ParsePrettySignature(content []byte, signatureKey string) (*JSONSignature, error) { - var contentMap map[string]json.RawMessage - err := json.Unmarshal(content, &contentMap) - if err != nil { - return nil, fmt.Errorf("error unmarshalling content: %s", err) - } - sigMessage, ok := contentMap[signatureKey] - if !ok { - return nil, ErrMissingSignatureKey - } - - var signatureBlocks []jsParsedSignature - err = json.Unmarshal([]byte(sigMessage), &signatureBlocks) - if err != nil { - return nil, fmt.Errorf("error unmarshalling signatures: %s", err) - } - - js := newJSONSignature() - js.signatures = make([]jsSignature, len(signatureBlocks)) - - for i, signatureBlock := range signatureBlocks { - protectedBytes, err := joseBase64UrlDecode(signatureBlock.Protected) - if err != nil { - return nil, fmt.Errorf("base64 decode error: %s", err) - } - var protectedHeader map[string]interface{} - err = json.Unmarshal(protectedBytes, &protectedHeader) - if err != nil { - return nil, fmt.Errorf("error unmarshalling protected header: %s", err) - } - - formatLength, ok := readIntFromMap("formatLength", protectedHeader) - if !ok { - return nil, errors.New("missing formatted length") - } - encodedTail, ok := readStringFromMap("formatTail", protectedHeader) - if !ok { - return nil, errors.New("missing formatted tail") - } - formatTail, err := joseBase64UrlDecode(encodedTail) - if err != nil { - return nil, fmt.Errorf("base64 decode error on tail: %s", err) - } - if js.formatLength == 0 { - js.formatLength = formatLength - } else if js.formatLength != formatLength { - return nil, errors.New("conflicting format length") - } - if len(js.formatTail) == 0 { - js.formatTail = formatTail - } else if bytes.Compare(js.formatTail, formatTail) != 0 { - return nil, errors.New("conflicting format tail") - } - - header := jsHeader{ - Algorithm: signatureBlock.Header.Algorithm, - Chain: signatureBlock.Header.Chain, - } - if signatureBlock.Header.JWK != nil { - publicKey, err := UnmarshalPublicKeyJWK([]byte(signatureBlock.Header.JWK)) - if err != nil { - return nil, fmt.Errorf("error unmarshalling public key: %s", err) - } - header.JWK = publicKey - } - js.signatures[i] = jsSignature{ - Header: header, - Signature: signatureBlock.Signature, - Protected: signatureBlock.Protected, - } - } - if js.formatLength > len(content) { - return nil, errors.New("invalid format length") - } - formatted := make([]byte, js.formatLength+len(js.formatTail)) - copy(formatted, content[:js.formatLength]) - copy(formatted[js.formatLength:], js.formatTail) - js.indent = detectJSONIndent(formatted) - js.payload = joseBase64UrlEncode(formatted) - - return js, nil -} - -// PrettySignature formats a json signature into an easy to read -// single json serialized object. -func (js *JSONSignature) PrettySignature(signatureKey string) ([]byte, error) { - if len(js.signatures) == 0 { - return nil, errors.New("no signatures") - } - payload, err := joseBase64UrlDecode(js.payload) - if err != nil { - return nil, err - } - payload = payload[:js.formatLength] - - sort.Sort(jsSignaturesSorted(js.signatures)) - - var marshalled []byte - var marshallErr error - if js.indent != "" { - marshalled, marshallErr = json.MarshalIndent(js.signatures, js.indent, js.indent) - } else { - marshalled, marshallErr = json.Marshal(js.signatures) - } - if marshallErr != nil { - return nil, marshallErr - } - - buf := bytes.NewBuffer(make([]byte, 0, len(payload)+len(marshalled)+34)) - buf.Write(payload) - buf.WriteByte(',') - if js.indent != "" { - buf.WriteByte('\n') - buf.WriteString(js.indent) - buf.WriteByte('"') - buf.WriteString(signatureKey) - buf.WriteString("\": ") - buf.Write(marshalled) - buf.WriteByte('\n') - } else { - buf.WriteByte('"') - buf.WriteString(signatureKey) - buf.WriteString("\":") - buf.Write(marshalled) - } - buf.WriteByte('}') - - return buf.Bytes(), nil -} - -// Signatures provides the signatures on this JWS as opaque blobs, sorted by -// keyID. These blobs can be stored and reassembled with payloads. Internally, -// they are simply marshaled json web signatures but implementations should -// not rely on this. -func (js *JSONSignature) Signatures() ([][]byte, error) { - sort.Sort(jsSignaturesSorted(js.signatures)) - - var sb [][]byte - for _, jsig := range js.signatures { - p, err := json.Marshal(jsig) - if err != nil { - return nil, err - } - - sb = append(sb, p) - } - - return sb, nil -} - -// Merge combines the signatures from one or more other signatures into the -// method receiver. If the payloads differ for any argument, an error will be -// returned and the receiver will not be modified. -func (js *JSONSignature) Merge(others ...*JSONSignature) error { - merged := js.signatures - for _, other := range others { - if js.payload != other.payload { - return fmt.Errorf("payloads differ from merge target") - } - merged = append(merged, other.signatures...) - } - - js.signatures = merged - return nil -} diff --git a/vendor/github.com/docker/libtrust/key.go b/vendor/github.com/docker/libtrust/key.go deleted file mode 100644 index 73642db2a8b..00000000000 --- a/vendor/github.com/docker/libtrust/key.go +++ /dev/null @@ -1,253 +0,0 @@ -package libtrust - -import ( - "crypto" - "crypto/ecdsa" - "crypto/rsa" - "crypto/x509" - "encoding/json" - "encoding/pem" - "errors" - "fmt" - "io" -) - -// PublicKey is a generic interface for a Public Key. -type PublicKey interface { - // KeyType returns the key type for this key. For elliptic curve keys, - // this value should be "EC". For RSA keys, this value should be "RSA". - KeyType() string - // KeyID returns a distinct identifier which is unique to this Public Key. - // The format generated by this library is a base32 encoding of a 240 bit - // hash of the public key data divided into 12 groups like so: - // ABCD:EFGH:IJKL:MNOP:QRST:UVWX:YZ23:4567:ABCD:EFGH:IJKL:MNOP - KeyID() string - // Verify verifyies the signature of the data in the io.Reader using this - // Public Key. The alg parameter should identify the digital signature - // algorithm which was used to produce the signature and should be - // supported by this public key. Returns a nil error if the signature - // is valid. - Verify(data io.Reader, alg string, signature []byte) error - // CryptoPublicKey returns the internal object which can be used as a - // crypto.PublicKey for use with other standard library operations. The type - // is either *rsa.PublicKey or *ecdsa.PublicKey - CryptoPublicKey() crypto.PublicKey - // These public keys can be serialized to the standard JSON encoding for - // JSON Web Keys. See section 6 of the IETF draft RFC for JOSE JSON Web - // Algorithms. - MarshalJSON() ([]byte, error) - // These keys can also be serialized to the standard PEM encoding. - PEMBlock() (*pem.Block, error) - // The string representation of a key is its key type and ID. - String() string - AddExtendedField(string, interface{}) - GetExtendedField(string) interface{} -} - -// PrivateKey is a generic interface for a Private Key. -type PrivateKey interface { - // A PrivateKey contains all fields and methods of a PublicKey of the - // same type. The MarshalJSON method also outputs the private key as a - // JSON Web Key, and the PEMBlock method outputs the private key as a - // PEM block. - PublicKey - // PublicKey returns the PublicKey associated with this PrivateKey. - PublicKey() PublicKey - // Sign signs the data read from the io.Reader using a signature algorithm - // supported by the private key. If the specified hashing algorithm is - // supported by this key, that hash function is used to generate the - // signature otherwise the the default hashing algorithm for this key is - // used. Returns the signature and identifier of the algorithm used. - Sign(data io.Reader, hashID crypto.Hash) (signature []byte, alg string, err error) - // CryptoPrivateKey returns the internal object which can be used as a - // crypto.PublicKey for use with other standard library operations. The - // type is either *rsa.PublicKey or *ecdsa.PublicKey - CryptoPrivateKey() crypto.PrivateKey -} - -// FromCryptoPublicKey returns a libtrust PublicKey representation of the given -// *ecdsa.PublicKey or *rsa.PublicKey. Returns a non-nil error when the given -// key is of an unsupported type. -func FromCryptoPublicKey(cryptoPublicKey crypto.PublicKey) (PublicKey, error) { - switch cryptoPublicKey := cryptoPublicKey.(type) { - case *ecdsa.PublicKey: - return fromECPublicKey(cryptoPublicKey) - case *rsa.PublicKey: - return fromRSAPublicKey(cryptoPublicKey), nil - default: - return nil, fmt.Errorf("public key type %T is not supported", cryptoPublicKey) - } -} - -// FromCryptoPrivateKey returns a libtrust PrivateKey representation of the given -// *ecdsa.PrivateKey or *rsa.PrivateKey. Returns a non-nil error when the given -// key is of an unsupported type. -func FromCryptoPrivateKey(cryptoPrivateKey crypto.PrivateKey) (PrivateKey, error) { - switch cryptoPrivateKey := cryptoPrivateKey.(type) { - case *ecdsa.PrivateKey: - return fromECPrivateKey(cryptoPrivateKey) - case *rsa.PrivateKey: - return fromRSAPrivateKey(cryptoPrivateKey), nil - default: - return nil, fmt.Errorf("private key type %T is not supported", cryptoPrivateKey) - } -} - -// UnmarshalPublicKeyPEM parses the PEM encoded data and returns a libtrust -// PublicKey or an error if there is a problem with the encoding. -func UnmarshalPublicKeyPEM(data []byte) (PublicKey, error) { - pemBlock, _ := pem.Decode(data) - if pemBlock == nil { - return nil, errors.New("unable to find PEM encoded data") - } else if pemBlock.Type != "PUBLIC KEY" { - return nil, fmt.Errorf("unable to get PublicKey from PEM type: %s", pemBlock.Type) - } - - return pubKeyFromPEMBlock(pemBlock) -} - -// UnmarshalPublicKeyPEMBundle parses the PEM encoded data as a bundle of -// PEM blocks appended one after the other and returns a slice of PublicKey -// objects that it finds. -func UnmarshalPublicKeyPEMBundle(data []byte) ([]PublicKey, error) { - pubKeys := []PublicKey{} - - for { - var pemBlock *pem.Block - pemBlock, data = pem.Decode(data) - if pemBlock == nil { - break - } else if pemBlock.Type != "PUBLIC KEY" { - return nil, fmt.Errorf("unable to get PublicKey from PEM type: %s", pemBlock.Type) - } - - pubKey, err := pubKeyFromPEMBlock(pemBlock) - if err != nil { - return nil, err - } - - pubKeys = append(pubKeys, pubKey) - } - - return pubKeys, nil -} - -// UnmarshalPrivateKeyPEM parses the PEM encoded data and returns a libtrust -// PrivateKey or an error if there is a problem with the encoding. -func UnmarshalPrivateKeyPEM(data []byte) (PrivateKey, error) { - pemBlock, _ := pem.Decode(data) - if pemBlock == nil { - return nil, errors.New("unable to find PEM encoded data") - } - - var key PrivateKey - - switch { - case pemBlock.Type == "RSA PRIVATE KEY": - rsaPrivateKey, err := x509.ParsePKCS1PrivateKey(pemBlock.Bytes) - if err != nil { - return nil, fmt.Errorf("unable to decode RSA Private Key PEM data: %s", err) - } - key = fromRSAPrivateKey(rsaPrivateKey) - case pemBlock.Type == "EC PRIVATE KEY": - ecPrivateKey, err := x509.ParseECPrivateKey(pemBlock.Bytes) - if err != nil { - return nil, fmt.Errorf("unable to decode EC Private Key PEM data: %s", err) - } - key, err = fromECPrivateKey(ecPrivateKey) - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("unable to get PrivateKey from PEM type: %s", pemBlock.Type) - } - - addPEMHeadersToKey(pemBlock, key.PublicKey()) - - return key, nil -} - -// UnmarshalPublicKeyJWK unmarshals the given JSON Web Key into a generic -// Public Key to be used with libtrust. -func UnmarshalPublicKeyJWK(data []byte) (PublicKey, error) { - jwk := make(map[string]interface{}) - - err := json.Unmarshal(data, &jwk) - if err != nil { - return nil, fmt.Errorf( - "decoding JWK Public Key JSON data: %s\n", err, - ) - } - - // Get the Key Type value. - kty, err := stringFromMap(jwk, "kty") - if err != nil { - return nil, fmt.Errorf("JWK Public Key type: %s", err) - } - - switch { - case kty == "EC": - // Call out to unmarshal EC public key. - return ecPublicKeyFromMap(jwk) - case kty == "RSA": - // Call out to unmarshal RSA public key. - return rsaPublicKeyFromMap(jwk) - default: - return nil, fmt.Errorf( - "JWK Public Key type not supported: %q\n", kty, - ) - } -} - -// UnmarshalPublicKeyJWKSet parses the JSON encoded data as a JSON Web Key Set -// and returns a slice of Public Key objects. -func UnmarshalPublicKeyJWKSet(data []byte) ([]PublicKey, error) { - rawKeys, err := loadJSONKeySetRaw(data) - if err != nil { - return nil, err - } - - pubKeys := make([]PublicKey, 0, len(rawKeys)) - - for _, rawKey := range rawKeys { - pubKey, err := UnmarshalPublicKeyJWK(rawKey) - if err != nil { - return nil, err - } - pubKeys = append(pubKeys, pubKey) - } - - return pubKeys, nil -} - -// UnmarshalPrivateKeyJWK unmarshals the given JSON Web Key into a generic -// Private Key to be used with libtrust. -func UnmarshalPrivateKeyJWK(data []byte) (PrivateKey, error) { - jwk := make(map[string]interface{}) - - err := json.Unmarshal(data, &jwk) - if err != nil { - return nil, fmt.Errorf( - "decoding JWK Private Key JSON data: %s\n", err, - ) - } - - // Get the Key Type value. - kty, err := stringFromMap(jwk, "kty") - if err != nil { - return nil, fmt.Errorf("JWK Private Key type: %s", err) - } - - switch { - case kty == "EC": - // Call out to unmarshal EC private key. - return ecPrivateKeyFromMap(jwk) - case kty == "RSA": - // Call out to unmarshal RSA private key. - return rsaPrivateKeyFromMap(jwk) - default: - return nil, fmt.Errorf( - "JWK Private Key type not supported: %q\n", kty, - ) - } -} diff --git a/vendor/github.com/docker/libtrust/key_files.go b/vendor/github.com/docker/libtrust/key_files.go deleted file mode 100644 index c526de5455b..00000000000 --- a/vendor/github.com/docker/libtrust/key_files.go +++ /dev/null @@ -1,255 +0,0 @@ -package libtrust - -import ( - "encoding/json" - "encoding/pem" - "errors" - "fmt" - "io/ioutil" - "os" - "strings" -) - -var ( - // ErrKeyFileDoesNotExist indicates that the private key file does not exist. - ErrKeyFileDoesNotExist = errors.New("key file does not exist") -) - -func readKeyFileBytes(filename string) ([]byte, error) { - data, err := ioutil.ReadFile(filename) - if err != nil { - if os.IsNotExist(err) { - err = ErrKeyFileDoesNotExist - } else { - err = fmt.Errorf("unable to read key file %s: %s", filename, err) - } - - return nil, err - } - - return data, nil -} - -/* - Loading and Saving of Public and Private Keys in either PEM or JWK format. -*/ - -// LoadKeyFile opens the given filename and attempts to read a Private Key -// encoded in either PEM or JWK format (if .json or .jwk file extension). -func LoadKeyFile(filename string) (PrivateKey, error) { - contents, err := readKeyFileBytes(filename) - if err != nil { - return nil, err - } - - var key PrivateKey - - if strings.HasSuffix(filename, ".json") || strings.HasSuffix(filename, ".jwk") { - key, err = UnmarshalPrivateKeyJWK(contents) - if err != nil { - return nil, fmt.Errorf("unable to decode private key JWK: %s", err) - } - } else { - key, err = UnmarshalPrivateKeyPEM(contents) - if err != nil { - return nil, fmt.Errorf("unable to decode private key PEM: %s", err) - } - } - - return key, nil -} - -// LoadPublicKeyFile opens the given filename and attempts to read a Public Key -// encoded in either PEM or JWK format (if .json or .jwk file extension). -func LoadPublicKeyFile(filename string) (PublicKey, error) { - contents, err := readKeyFileBytes(filename) - if err != nil { - return nil, err - } - - var key PublicKey - - if strings.HasSuffix(filename, ".json") || strings.HasSuffix(filename, ".jwk") { - key, err = UnmarshalPublicKeyJWK(contents) - if err != nil { - return nil, fmt.Errorf("unable to decode public key JWK: %s", err) - } - } else { - key, err = UnmarshalPublicKeyPEM(contents) - if err != nil { - return nil, fmt.Errorf("unable to decode public key PEM: %s", err) - } - } - - return key, nil -} - -// SaveKey saves the given key to a file using the provided filename. -// This process will overwrite any existing file at the provided location. -func SaveKey(filename string, key PrivateKey) error { - var encodedKey []byte - var err error - - if strings.HasSuffix(filename, ".json") || strings.HasSuffix(filename, ".jwk") { - // Encode in JSON Web Key format. - encodedKey, err = json.MarshalIndent(key, "", " ") - if err != nil { - return fmt.Errorf("unable to encode private key JWK: %s", err) - } - } else { - // Encode in PEM format. - pemBlock, err := key.PEMBlock() - if err != nil { - return fmt.Errorf("unable to encode private key PEM: %s", err) - } - encodedKey = pem.EncodeToMemory(pemBlock) - } - - err = ioutil.WriteFile(filename, encodedKey, os.FileMode(0600)) - if err != nil { - return fmt.Errorf("unable to write private key file %s: %s", filename, err) - } - - return nil -} - -// SavePublicKey saves the given public key to the file. -func SavePublicKey(filename string, key PublicKey) error { - var encodedKey []byte - var err error - - if strings.HasSuffix(filename, ".json") || strings.HasSuffix(filename, ".jwk") { - // Encode in JSON Web Key format. - encodedKey, err = json.MarshalIndent(key, "", " ") - if err != nil { - return fmt.Errorf("unable to encode public key JWK: %s", err) - } - } else { - // Encode in PEM format. - pemBlock, err := key.PEMBlock() - if err != nil { - return fmt.Errorf("unable to encode public key PEM: %s", err) - } - encodedKey = pem.EncodeToMemory(pemBlock) - } - - err = ioutil.WriteFile(filename, encodedKey, os.FileMode(0644)) - if err != nil { - return fmt.Errorf("unable to write public key file %s: %s", filename, err) - } - - return nil -} - -// Public Key Set files - -type jwkSet struct { - Keys []json.RawMessage `json:"keys"` -} - -// LoadKeySetFile loads a key set -func LoadKeySetFile(filename string) ([]PublicKey, error) { - if strings.HasSuffix(filename, ".json") || strings.HasSuffix(filename, ".jwk") { - return loadJSONKeySetFile(filename) - } - - // Must be a PEM format file - return loadPEMKeySetFile(filename) -} - -func loadJSONKeySetRaw(data []byte) ([]json.RawMessage, error) { - if len(data) == 0 { - // This is okay, just return an empty slice. - return []json.RawMessage{}, nil - } - - keySet := jwkSet{} - - err := json.Unmarshal(data, &keySet) - if err != nil { - return nil, fmt.Errorf("unable to decode JSON Web Key Set: %s", err) - } - - return keySet.Keys, nil -} - -func loadJSONKeySetFile(filename string) ([]PublicKey, error) { - contents, err := readKeyFileBytes(filename) - if err != nil && err != ErrKeyFileDoesNotExist { - return nil, err - } - - return UnmarshalPublicKeyJWKSet(contents) -} - -func loadPEMKeySetFile(filename string) ([]PublicKey, error) { - data, err := readKeyFileBytes(filename) - if err != nil && err != ErrKeyFileDoesNotExist { - return nil, err - } - - return UnmarshalPublicKeyPEMBundle(data) -} - -// AddKeySetFile adds a key to a key set -func AddKeySetFile(filename string, key PublicKey) error { - if strings.HasSuffix(filename, ".json") || strings.HasSuffix(filename, ".jwk") { - return addKeySetJSONFile(filename, key) - } - - // Must be a PEM format file - return addKeySetPEMFile(filename, key) -} - -func addKeySetJSONFile(filename string, key PublicKey) error { - encodedKey, err := json.Marshal(key) - if err != nil { - return fmt.Errorf("unable to encode trusted client key: %s", err) - } - - contents, err := readKeyFileBytes(filename) - if err != nil && err != ErrKeyFileDoesNotExist { - return err - } - - rawEntries, err := loadJSONKeySetRaw(contents) - if err != nil { - return err - } - - rawEntries = append(rawEntries, json.RawMessage(encodedKey)) - entriesWrapper := jwkSet{Keys: rawEntries} - - encodedEntries, err := json.MarshalIndent(entriesWrapper, "", " ") - if err != nil { - return fmt.Errorf("unable to encode trusted client keys: %s", err) - } - - err = ioutil.WriteFile(filename, encodedEntries, os.FileMode(0644)) - if err != nil { - return fmt.Errorf("unable to write trusted client keys file %s: %s", filename, err) - } - - return nil -} - -func addKeySetPEMFile(filename string, key PublicKey) error { - // Encode to PEM, open file for appending, write PEM. - file, err := os.OpenFile(filename, os.O_CREATE|os.O_APPEND|os.O_RDWR, os.FileMode(0644)) - if err != nil { - return fmt.Errorf("unable to open trusted client keys file %s: %s", filename, err) - } - defer file.Close() - - pemBlock, err := key.PEMBlock() - if err != nil { - return fmt.Errorf("unable to encoded trusted key: %s", err) - } - - _, err = file.Write(pem.EncodeToMemory(pemBlock)) - if err != nil { - return fmt.Errorf("unable to write trusted keys file: %s", err) - } - - return nil -} diff --git a/vendor/github.com/docker/libtrust/key_manager.go b/vendor/github.com/docker/libtrust/key_manager.go deleted file mode 100644 index 9a98ae3574f..00000000000 --- a/vendor/github.com/docker/libtrust/key_manager.go +++ /dev/null @@ -1,175 +0,0 @@ -package libtrust - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "io/ioutil" - "net" - "os" - "path" - "sync" -) - -// ClientKeyManager manages client keys on the filesystem -type ClientKeyManager struct { - key PrivateKey - clientFile string - clientDir string - - clientLock sync.RWMutex - clients []PublicKey - - configLock sync.Mutex - configs []*tls.Config -} - -// NewClientKeyManager loads a new manager from a set of key files -// and managed by the given private key. -func NewClientKeyManager(trustKey PrivateKey, clientFile, clientDir string) (*ClientKeyManager, error) { - m := &ClientKeyManager{ - key: trustKey, - clientFile: clientFile, - clientDir: clientDir, - } - if err := m.loadKeys(); err != nil { - return nil, err - } - // TODO Start watching file and directory - - return m, nil -} - -func (c *ClientKeyManager) loadKeys() (err error) { - // Load authorized keys file - var clients []PublicKey - if c.clientFile != "" { - clients, err = LoadKeySetFile(c.clientFile) - if err != nil { - return fmt.Errorf("unable to load authorized keys: %s", err) - } - } - - // Add clients from authorized keys directory - files, err := ioutil.ReadDir(c.clientDir) - if err != nil && !os.IsNotExist(err) { - return fmt.Errorf("unable to open authorized keys directory: %s", err) - } - for _, f := range files { - if !f.IsDir() { - publicKey, err := LoadPublicKeyFile(path.Join(c.clientDir, f.Name())) - if err != nil { - return fmt.Errorf("unable to load authorized key file: %s", err) - } - clients = append(clients, publicKey) - } - } - - c.clientLock.Lock() - c.clients = clients - c.clientLock.Unlock() - - return nil -} - -// RegisterTLSConfig registers a tls configuration to manager -// such that any changes to the keys may be reflected in -// the tls client CA pool -func (c *ClientKeyManager) RegisterTLSConfig(tlsConfig *tls.Config) error { - c.clientLock.RLock() - certPool, err := GenerateCACertPool(c.key, c.clients) - if err != nil { - return fmt.Errorf("CA pool generation error: %s", err) - } - c.clientLock.RUnlock() - - tlsConfig.ClientCAs = certPool - - c.configLock.Lock() - c.configs = append(c.configs, tlsConfig) - c.configLock.Unlock() - - return nil -} - -// NewIdentityAuthTLSConfig creates a tls.Config for the server to use for -// libtrust identity authentication for the domain specified -func NewIdentityAuthTLSConfig(trustKey PrivateKey, clients *ClientKeyManager, addr string, domain string) (*tls.Config, error) { - tlsConfig := newTLSConfig() - - tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert - if err := clients.RegisterTLSConfig(tlsConfig); err != nil { - return nil, err - } - - // Generate cert - ips, domains, err := parseAddr(addr) - if err != nil { - return nil, err - } - // add domain that it expects clients to use - domains = append(domains, domain) - x509Cert, err := GenerateSelfSignedServerCert(trustKey, domains, ips) - if err != nil { - return nil, fmt.Errorf("certificate generation error: %s", err) - } - tlsConfig.Certificates = []tls.Certificate{{ - Certificate: [][]byte{x509Cert.Raw}, - PrivateKey: trustKey.CryptoPrivateKey(), - Leaf: x509Cert, - }} - - return tlsConfig, nil -} - -// NewCertAuthTLSConfig creates a tls.Config for the server to use for -// certificate authentication -func NewCertAuthTLSConfig(caPath, certPath, keyPath string) (*tls.Config, error) { - tlsConfig := newTLSConfig() - - cert, err := tls.LoadX509KeyPair(certPath, keyPath) - if err != nil { - return nil, fmt.Errorf("Couldn't load X509 key pair (%s, %s): %s. Key encrypted?", certPath, keyPath, err) - } - tlsConfig.Certificates = []tls.Certificate{cert} - - // Verify client certificates against a CA? - if caPath != "" { - certPool := x509.NewCertPool() - file, err := ioutil.ReadFile(caPath) - if err != nil { - return nil, fmt.Errorf("Couldn't read CA certificate: %s", err) - } - certPool.AppendCertsFromPEM(file) - - tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert - tlsConfig.ClientCAs = certPool - } - - return tlsConfig, nil -} - -func newTLSConfig() *tls.Config { - return &tls.Config{ - NextProtos: []string{"http/1.1"}, - // Avoid fallback on insecure SSL protocols - MinVersion: tls.VersionTLS10, - } -} - -// parseAddr parses an address into an array of IPs and domains -func parseAddr(addr string) ([]net.IP, []string, error) { - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, nil, err - } - var domains []string - var ips []net.IP - ip := net.ParseIP(host) - if ip != nil { - ips = []net.IP{ip} - } else { - domains = []string{host} - } - return ips, domains, nil -} diff --git a/vendor/github.com/docker/libtrust/rsa_key.go b/vendor/github.com/docker/libtrust/rsa_key.go deleted file mode 100644 index dac4cacf20e..00000000000 --- a/vendor/github.com/docker/libtrust/rsa_key.go +++ /dev/null @@ -1,427 +0,0 @@ -package libtrust - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/json" - "encoding/pem" - "errors" - "fmt" - "io" - "math/big" -) - -/* - * RSA DSA PUBLIC KEY - */ - -// rsaPublicKey implements a JWK Public Key using RSA digital signature algorithms. -type rsaPublicKey struct { - *rsa.PublicKey - extended map[string]interface{} -} - -func fromRSAPublicKey(cryptoPublicKey *rsa.PublicKey) *rsaPublicKey { - return &rsaPublicKey{cryptoPublicKey, map[string]interface{}{}} -} - -// KeyType returns the JWK key type for RSA keys, i.e., "RSA". -func (k *rsaPublicKey) KeyType() string { - return "RSA" -} - -// KeyID returns a distinct identifier which is unique to this Public Key. -func (k *rsaPublicKey) KeyID() string { - return keyIDFromCryptoKey(k) -} - -func (k *rsaPublicKey) String() string { - return fmt.Sprintf("RSA Public Key <%s>", k.KeyID()) -} - -// Verify verifyies the signature of the data in the io.Reader using this Public Key. -// The alg parameter should be the name of the JWA digital signature algorithm -// which was used to produce the signature and should be supported by this -// public key. Returns a nil error if the signature is valid. -func (k *rsaPublicKey) Verify(data io.Reader, alg string, signature []byte) error { - // Verify the signature of the given date, return non-nil error if valid. - sigAlg, err := rsaSignatureAlgorithmByName(alg) - if err != nil { - return fmt.Errorf("unable to verify Signature: %s", err) - } - - hasher := sigAlg.HashID().New() - _, err = io.Copy(hasher, data) - if err != nil { - return fmt.Errorf("error reading data to sign: %s", err) - } - hash := hasher.Sum(nil) - - err = rsa.VerifyPKCS1v15(k.PublicKey, sigAlg.HashID(), hash, signature) - if err != nil { - return fmt.Errorf("invalid %s signature: %s", sigAlg.HeaderParam(), err) - } - - return nil -} - -// CryptoPublicKey returns the internal object which can be used as a -// crypto.PublicKey for use with other standard library operations. The type -// is either *rsa.PublicKey or *ecdsa.PublicKey -func (k *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { - return k.PublicKey -} - -func (k *rsaPublicKey) toMap() map[string]interface{} { - jwk := make(map[string]interface{}) - for k, v := range k.extended { - jwk[k] = v - } - jwk["kty"] = k.KeyType() - jwk["kid"] = k.KeyID() - jwk["n"] = joseBase64UrlEncode(k.N.Bytes()) - jwk["e"] = joseBase64UrlEncode(serializeRSAPublicExponentParam(k.E)) - - return jwk -} - -// MarshalJSON serializes this Public Key using the JWK JSON serialization format for -// RSA keys. -func (k *rsaPublicKey) MarshalJSON() (data []byte, err error) { - return json.Marshal(k.toMap()) -} - -// PEMBlock serializes this Public Key to DER-encoded PKIX format. -func (k *rsaPublicKey) PEMBlock() (*pem.Block, error) { - derBytes, err := x509.MarshalPKIXPublicKey(k.PublicKey) - if err != nil { - return nil, fmt.Errorf("unable to serialize RSA PublicKey to DER-encoded PKIX format: %s", err) - } - k.extended["kid"] = k.KeyID() // For display purposes. - return createPemBlock("PUBLIC KEY", derBytes, k.extended) -} - -func (k *rsaPublicKey) AddExtendedField(field string, value interface{}) { - k.extended[field] = value -} - -func (k *rsaPublicKey) GetExtendedField(field string) interface{} { - v, ok := k.extended[field] - if !ok { - return nil - } - return v -} - -func rsaPublicKeyFromMap(jwk map[string]interface{}) (*rsaPublicKey, error) { - // JWK key type (kty) has already been determined to be "RSA". - // Need to extract 'n', 'e', and 'kid' and check for - // consistency. - - // Get the modulus parameter N. - nB64Url, err := stringFromMap(jwk, "n") - if err != nil { - return nil, fmt.Errorf("JWK RSA Public Key modulus: %s", err) - } - - n, err := parseRSAModulusParam(nB64Url) - if err != nil { - return nil, fmt.Errorf("JWK RSA Public Key modulus: %s", err) - } - - // Get the public exponent E. - eB64Url, err := stringFromMap(jwk, "e") - if err != nil { - return nil, fmt.Errorf("JWK RSA Public Key exponent: %s", err) - } - - e, err := parseRSAPublicExponentParam(eB64Url) - if err != nil { - return nil, fmt.Errorf("JWK RSA Public Key exponent: %s", err) - } - - key := &rsaPublicKey{ - PublicKey: &rsa.PublicKey{N: n, E: e}, - } - - // Key ID is optional, but if it exists, it should match the key. - _, ok := jwk["kid"] - if ok { - kid, err := stringFromMap(jwk, "kid") - if err != nil { - return nil, fmt.Errorf("JWK RSA Public Key ID: %s", err) - } - if kid != key.KeyID() { - return nil, fmt.Errorf("JWK RSA Public Key ID does not match: %s", kid) - } - } - - if _, ok := jwk["d"]; ok { - return nil, fmt.Errorf("JWK RSA Public Key cannot contain private exponent") - } - - key.extended = jwk - - return key, nil -} - -/* - * RSA DSA PRIVATE KEY - */ - -// rsaPrivateKey implements a JWK Private Key using RSA digital signature algorithms. -type rsaPrivateKey struct { - rsaPublicKey - *rsa.PrivateKey -} - -func fromRSAPrivateKey(cryptoPrivateKey *rsa.PrivateKey) *rsaPrivateKey { - return &rsaPrivateKey{ - *fromRSAPublicKey(&cryptoPrivateKey.PublicKey), - cryptoPrivateKey, - } -} - -// PublicKey returns the Public Key data associated with this Private Key. -func (k *rsaPrivateKey) PublicKey() PublicKey { - return &k.rsaPublicKey -} - -func (k *rsaPrivateKey) String() string { - return fmt.Sprintf("RSA Private Key <%s>", k.KeyID()) -} - -// Sign signs the data read from the io.Reader using a signature algorithm supported -// by the RSA private key. If the specified hashing algorithm is supported by -// this key, that hash function is used to generate the signature otherwise the -// the default hashing algorithm for this key is used. Returns the signature -// and the name of the JWK signature algorithm used, e.g., "RS256", "RS384", -// "RS512". -func (k *rsaPrivateKey) Sign(data io.Reader, hashID crypto.Hash) (signature []byte, alg string, err error) { - // Generate a signature of the data using the internal alg. - sigAlg := rsaPKCS1v15SignatureAlgorithmForHashID(hashID) - hasher := sigAlg.HashID().New() - - _, err = io.Copy(hasher, data) - if err != nil { - return nil, "", fmt.Errorf("error reading data to sign: %s", err) - } - hash := hasher.Sum(nil) - - signature, err = rsa.SignPKCS1v15(rand.Reader, k.PrivateKey, sigAlg.HashID(), hash) - if err != nil { - return nil, "", fmt.Errorf("error producing signature: %s", err) - } - - alg = sigAlg.HeaderParam() - - return -} - -// CryptoPrivateKey returns the internal object which can be used as a -// crypto.PublicKey for use with other standard library operations. The type -// is either *rsa.PublicKey or *ecdsa.PublicKey -func (k *rsaPrivateKey) CryptoPrivateKey() crypto.PrivateKey { - return k.PrivateKey -} - -func (k *rsaPrivateKey) toMap() map[string]interface{} { - k.Precompute() // Make sure the precomputed values are stored. - jwk := k.rsaPublicKey.toMap() - - jwk["d"] = joseBase64UrlEncode(k.D.Bytes()) - jwk["p"] = joseBase64UrlEncode(k.Primes[0].Bytes()) - jwk["q"] = joseBase64UrlEncode(k.Primes[1].Bytes()) - jwk["dp"] = joseBase64UrlEncode(k.Precomputed.Dp.Bytes()) - jwk["dq"] = joseBase64UrlEncode(k.Precomputed.Dq.Bytes()) - jwk["qi"] = joseBase64UrlEncode(k.Precomputed.Qinv.Bytes()) - - otherPrimes := k.Primes[2:] - - if len(otherPrimes) > 0 { - otherPrimesInfo := make([]interface{}, len(otherPrimes)) - for i, r := range otherPrimes { - otherPrimeInfo := make(map[string]string, 3) - otherPrimeInfo["r"] = joseBase64UrlEncode(r.Bytes()) - crtVal := k.Precomputed.CRTValues[i] - otherPrimeInfo["d"] = joseBase64UrlEncode(crtVal.Exp.Bytes()) - otherPrimeInfo["t"] = joseBase64UrlEncode(crtVal.Coeff.Bytes()) - otherPrimesInfo[i] = otherPrimeInfo - } - jwk["oth"] = otherPrimesInfo - } - - return jwk -} - -// MarshalJSON serializes this Private Key using the JWK JSON serialization format for -// RSA keys. -func (k *rsaPrivateKey) MarshalJSON() (data []byte, err error) { - return json.Marshal(k.toMap()) -} - -// PEMBlock serializes this Private Key to DER-encoded PKIX format. -func (k *rsaPrivateKey) PEMBlock() (*pem.Block, error) { - derBytes := x509.MarshalPKCS1PrivateKey(k.PrivateKey) - k.extended["keyID"] = k.KeyID() // For display purposes. - return createPemBlock("RSA PRIVATE KEY", derBytes, k.extended) -} - -func rsaPrivateKeyFromMap(jwk map[string]interface{}) (*rsaPrivateKey, error) { - // The JWA spec for RSA Private Keys (draft rfc section 5.3.2) states that - // only the private key exponent 'd' is REQUIRED, the others are just for - // signature/decryption optimizations and SHOULD be included when the JWK - // is produced. We MAY choose to accept a JWK which only includes 'd', but - // we're going to go ahead and not choose to accept it without the extra - // fields. Only the 'oth' field will be optional (for multi-prime keys). - privateExponent, err := parseRSAPrivateKeyParamFromMap(jwk, "d") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key exponent: %s", err) - } - firstPrimeFactor, err := parseRSAPrivateKeyParamFromMap(jwk, "p") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key prime factor: %s", err) - } - secondPrimeFactor, err := parseRSAPrivateKeyParamFromMap(jwk, "q") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key prime factor: %s", err) - } - firstFactorCRT, err := parseRSAPrivateKeyParamFromMap(jwk, "dp") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key CRT exponent: %s", err) - } - secondFactorCRT, err := parseRSAPrivateKeyParamFromMap(jwk, "dq") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key CRT exponent: %s", err) - } - crtCoeff, err := parseRSAPrivateKeyParamFromMap(jwk, "qi") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key CRT coefficient: %s", err) - } - - var oth interface{} - if _, ok := jwk["oth"]; ok { - oth = jwk["oth"] - delete(jwk, "oth") - } - - // JWK key type (kty) has already been determined to be "RSA". - // Need to extract the public key information, then extract the private - // key values. - publicKey, err := rsaPublicKeyFromMap(jwk) - if err != nil { - return nil, err - } - - privateKey := &rsa.PrivateKey{ - PublicKey: *publicKey.PublicKey, - D: privateExponent, - Primes: []*big.Int{firstPrimeFactor, secondPrimeFactor}, - Precomputed: rsa.PrecomputedValues{ - Dp: firstFactorCRT, - Dq: secondFactorCRT, - Qinv: crtCoeff, - }, - } - - if oth != nil { - // Should be an array of more JSON objects. - otherPrimesInfo, ok := oth.([]interface{}) - if !ok { - return nil, errors.New("JWK RSA Private Key: Invalid other primes info: must be an array") - } - numOtherPrimeFactors := len(otherPrimesInfo) - if numOtherPrimeFactors == 0 { - return nil, errors.New("JWK RSA Privake Key: Invalid other primes info: must be absent or non-empty") - } - otherPrimeFactors := make([]*big.Int, numOtherPrimeFactors) - productOfPrimes := new(big.Int).Mul(firstPrimeFactor, secondPrimeFactor) - crtValues := make([]rsa.CRTValue, numOtherPrimeFactors) - - for i, val := range otherPrimesInfo { - otherPrimeinfo, ok := val.(map[string]interface{}) - if !ok { - return nil, errors.New("JWK RSA Private Key: Invalid other prime info: must be a JSON object") - } - - otherPrimeFactor, err := parseRSAPrivateKeyParamFromMap(otherPrimeinfo, "r") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key prime factor: %s", err) - } - otherFactorCRT, err := parseRSAPrivateKeyParamFromMap(otherPrimeinfo, "d") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key CRT exponent: %s", err) - } - otherCrtCoeff, err := parseRSAPrivateKeyParamFromMap(otherPrimeinfo, "t") - if err != nil { - return nil, fmt.Errorf("JWK RSA Private Key CRT coefficient: %s", err) - } - - crtValue := crtValues[i] - crtValue.Exp = otherFactorCRT - crtValue.Coeff = otherCrtCoeff - crtValue.R = productOfPrimes - otherPrimeFactors[i] = otherPrimeFactor - productOfPrimes = new(big.Int).Mul(productOfPrimes, otherPrimeFactor) - } - - privateKey.Primes = append(privateKey.Primes, otherPrimeFactors...) - privateKey.Precomputed.CRTValues = crtValues - } - - key := &rsaPrivateKey{ - rsaPublicKey: *publicKey, - PrivateKey: privateKey, - } - - return key, nil -} - -/* - * Key Generation Functions. - */ - -func generateRSAPrivateKey(bits int) (k *rsaPrivateKey, err error) { - k = new(rsaPrivateKey) - k.PrivateKey, err = rsa.GenerateKey(rand.Reader, bits) - if err != nil { - return nil, err - } - - k.rsaPublicKey.PublicKey = &k.PrivateKey.PublicKey - k.extended = make(map[string]interface{}) - - return -} - -// GenerateRSA2048PrivateKey generates a key pair using 2048-bit RSA. -func GenerateRSA2048PrivateKey() (PrivateKey, error) { - k, err := generateRSAPrivateKey(2048) - if err != nil { - return nil, fmt.Errorf("error generating RSA 2048-bit key: %s", err) - } - - return k, nil -} - -// GenerateRSA3072PrivateKey generates a key pair using 3072-bit RSA. -func GenerateRSA3072PrivateKey() (PrivateKey, error) { - k, err := generateRSAPrivateKey(3072) - if err != nil { - return nil, fmt.Errorf("error generating RSA 3072-bit key: %s", err) - } - - return k, nil -} - -// GenerateRSA4096PrivateKey generates a key pair using 4096-bit RSA. -func GenerateRSA4096PrivateKey() (PrivateKey, error) { - k, err := generateRSAPrivateKey(4096) - if err != nil { - return nil, fmt.Errorf("error generating RSA 4096-bit key: %s", err) - } - - return k, nil -} diff --git a/vendor/github.com/docker/libtrust/util.go b/vendor/github.com/docker/libtrust/util.go deleted file mode 100644 index d88176cc3d5..00000000000 --- a/vendor/github.com/docker/libtrust/util.go +++ /dev/null @@ -1,363 +0,0 @@ -package libtrust - -import ( - "bytes" - "crypto" - "crypto/elliptic" - "crypto/tls" - "crypto/x509" - "encoding/base32" - "encoding/base64" - "encoding/binary" - "encoding/pem" - "errors" - "fmt" - "math/big" - "net/url" - "os" - "path/filepath" - "strings" - "time" -) - -// LoadOrCreateTrustKey will load a PrivateKey from the specified path -func LoadOrCreateTrustKey(trustKeyPath string) (PrivateKey, error) { - if err := os.MkdirAll(filepath.Dir(trustKeyPath), 0700); err != nil { - return nil, err - } - - trustKey, err := LoadKeyFile(trustKeyPath) - if err == ErrKeyFileDoesNotExist { - trustKey, err = GenerateECP256PrivateKey() - if err != nil { - return nil, fmt.Errorf("error generating key: %s", err) - } - - if err := SaveKey(trustKeyPath, trustKey); err != nil { - return nil, fmt.Errorf("error saving key file: %s", err) - } - - dir, file := filepath.Split(trustKeyPath) - if err := SavePublicKey(filepath.Join(dir, "public-"+file), trustKey.PublicKey()); err != nil { - return nil, fmt.Errorf("error saving public key file: %s", err) - } - } else if err != nil { - return nil, fmt.Errorf("error loading key file: %s", err) - } - return trustKey, nil -} - -// NewIdentityAuthTLSClientConfig returns a tls.Config configured to use identity -// based authentication from the specified dockerUrl, the rootConfigPath and -// the server name to which it is connecting. -// If trustUnknownHosts is true it will automatically add the host to the -// known-hosts.json in rootConfigPath. -func NewIdentityAuthTLSClientConfig(dockerUrl string, trustUnknownHosts bool, rootConfigPath string, serverName string) (*tls.Config, error) { - tlsConfig := newTLSConfig() - - trustKeyPath := filepath.Join(rootConfigPath, "key.json") - knownHostsPath := filepath.Join(rootConfigPath, "known-hosts.json") - - u, err := url.Parse(dockerUrl) - if err != nil { - return nil, fmt.Errorf("unable to parse machine url") - } - - if u.Scheme == "unix" { - return nil, nil - } - - addr := u.Host - proto := "tcp" - - trustKey, err := LoadOrCreateTrustKey(trustKeyPath) - if err != nil { - return nil, fmt.Errorf("unable to load trust key: %s", err) - } - - knownHosts, err := LoadKeySetFile(knownHostsPath) - if err != nil { - return nil, fmt.Errorf("could not load trusted hosts file: %s", err) - } - - allowedHosts, err := FilterByHosts(knownHosts, addr, false) - if err != nil { - return nil, fmt.Errorf("error filtering hosts: %s", err) - } - - certPool, err := GenerateCACertPool(trustKey, allowedHosts) - if err != nil { - return nil, fmt.Errorf("Could not create CA pool: %s", err) - } - - tlsConfig.ServerName = serverName - tlsConfig.RootCAs = certPool - - x509Cert, err := GenerateSelfSignedClientCert(trustKey) - if err != nil { - return nil, fmt.Errorf("certificate generation error: %s", err) - } - - tlsConfig.Certificates = []tls.Certificate{{ - Certificate: [][]byte{x509Cert.Raw}, - PrivateKey: trustKey.CryptoPrivateKey(), - Leaf: x509Cert, - }} - - tlsConfig.InsecureSkipVerify = true - - testConn, err := tls.Dial(proto, addr, tlsConfig) - if err != nil { - return nil, fmt.Errorf("tls Handshake error: %s", err) - } - - opts := x509.VerifyOptions{ - Roots: tlsConfig.RootCAs, - CurrentTime: time.Now(), - DNSName: tlsConfig.ServerName, - Intermediates: x509.NewCertPool(), - } - - certs := testConn.ConnectionState().PeerCertificates - for i, cert := range certs { - if i == 0 { - continue - } - opts.Intermediates.AddCert(cert) - } - - if _, err := certs[0].Verify(opts); err != nil { - if _, ok := err.(x509.UnknownAuthorityError); ok { - if trustUnknownHosts { - pubKey, err := FromCryptoPublicKey(certs[0].PublicKey) - if err != nil { - return nil, fmt.Errorf("error extracting public key from cert: %s", err) - } - - pubKey.AddExtendedField("hosts", []string{addr}) - - if err := AddKeySetFile(knownHostsPath, pubKey); err != nil { - return nil, fmt.Errorf("error adding machine to known hosts: %s", err) - } - } else { - return nil, fmt.Errorf("unable to connect. unknown host: %s", addr) - } - } - } - - testConn.Close() - tlsConfig.InsecureSkipVerify = false - - return tlsConfig, nil -} - -// joseBase64UrlEncode encodes the given data using the standard base64 url -// encoding format but with all trailing '=' characters ommitted in accordance -// with the jose specification. -// http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-2 -func joseBase64UrlEncode(b []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(b), "=") -} - -// joseBase64UrlDecode decodes the given string using the standard base64 url -// decoder but first adds the appropriate number of trailing '=' characters in -// accordance with the jose specification. -// http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-31#section-2 -func joseBase64UrlDecode(s string) ([]byte, error) { - s = strings.Replace(s, "\n", "", -1) - s = strings.Replace(s, " ", "", -1) - switch len(s) % 4 { - case 0: - case 2: - s += "==" - case 3: - s += "=" - default: - return nil, errors.New("illegal base64url string") - } - return base64.URLEncoding.DecodeString(s) -} - -func keyIDEncode(b []byte) string { - s := strings.TrimRight(base32.StdEncoding.EncodeToString(b), "=") - var buf bytes.Buffer - var i int - for i = 0; i < len(s)/4-1; i++ { - start := i * 4 - end := start + 4 - buf.WriteString(s[start:end] + ":") - } - buf.WriteString(s[i*4:]) - return buf.String() -} - -func keyIDFromCryptoKey(pubKey PublicKey) string { - // Generate and return a 'libtrust' fingerprint of the public key. - // For an RSA key this should be: - // SHA256(DER encoded ASN1) - // Then truncated to 240 bits and encoded into 12 base32 groups like so: - // ABCD:EFGH:IJKL:MNOP:QRST:UVWX:YZ23:4567:ABCD:EFGH:IJKL:MNOP - derBytes, err := x509.MarshalPKIXPublicKey(pubKey.CryptoPublicKey()) - if err != nil { - return "" - } - hasher := crypto.SHA256.New() - hasher.Write(derBytes) - return keyIDEncode(hasher.Sum(nil)[:30]) -} - -func stringFromMap(m map[string]interface{}, key string) (string, error) { - val, ok := m[key] - if !ok { - return "", fmt.Errorf("%q value not specified", key) - } - - str, ok := val.(string) - if !ok { - return "", fmt.Errorf("%q value must be a string", key) - } - delete(m, key) - - return str, nil -} - -func parseECCoordinate(cB64Url string, curve elliptic.Curve) (*big.Int, error) { - curveByteLen := (curve.Params().BitSize + 7) >> 3 - - cBytes, err := joseBase64UrlDecode(cB64Url) - if err != nil { - return nil, fmt.Errorf("invalid base64 URL encoding: %s", err) - } - cByteLength := len(cBytes) - if cByteLength != curveByteLen { - return nil, fmt.Errorf("invalid number of octets: got %d, should be %d", cByteLength, curveByteLen) - } - return new(big.Int).SetBytes(cBytes), nil -} - -func parseECPrivateParam(dB64Url string, curve elliptic.Curve) (*big.Int, error) { - dBytes, err := joseBase64UrlDecode(dB64Url) - if err != nil { - return nil, fmt.Errorf("invalid base64 URL encoding: %s", err) - } - - // The length of this octet string MUST be ceiling(log-base-2(n)/8) - // octets (where n is the order of the curve). This is because the private - // key d must be in the interval [1, n-1] so the bitlength of d should be - // no larger than the bitlength of n-1. The easiest way to find the octet - // length is to take bitlength(n-1), add 7 to force a carry, and shift this - // bit sequence right by 3, which is essentially dividing by 8 and adding - // 1 if there is any remainder. Thus, the private key value d should be - // output to (bitlength(n-1)+7)>>3 octets. - n := curve.Params().N - octetLength := (new(big.Int).Sub(n, big.NewInt(1)).BitLen() + 7) >> 3 - dByteLength := len(dBytes) - - if dByteLength != octetLength { - return nil, fmt.Errorf("invalid number of octets: got %d, should be %d", dByteLength, octetLength) - } - - return new(big.Int).SetBytes(dBytes), nil -} - -func parseRSAModulusParam(nB64Url string) (*big.Int, error) { - nBytes, err := joseBase64UrlDecode(nB64Url) - if err != nil { - return nil, fmt.Errorf("invalid base64 URL encoding: %s", err) - } - - return new(big.Int).SetBytes(nBytes), nil -} - -func serializeRSAPublicExponentParam(e int) []byte { - // We MUST use the minimum number of octets to represent E. - // E is supposed to be 65537 for performance and security reasons - // and is what golang's rsa package generates, but it might be - // different if imported from some other generator. - buf := make([]byte, 4) - binary.BigEndian.PutUint32(buf, uint32(e)) - var i int - for i = 0; i < 8; i++ { - if buf[i] != 0 { - break - } - } - return buf[i:] -} - -func parseRSAPublicExponentParam(eB64Url string) (int, error) { - eBytes, err := joseBase64UrlDecode(eB64Url) - if err != nil { - return 0, fmt.Errorf("invalid base64 URL encoding: %s", err) - } - // Only the minimum number of bytes were used to represent E, but - // binary.BigEndian.Uint32 expects at least 4 bytes, so we need - // to add zero padding if necassary. - byteLen := len(eBytes) - buf := make([]byte, 4-byteLen, 4) - eBytes = append(buf, eBytes...) - - return int(binary.BigEndian.Uint32(eBytes)), nil -} - -func parseRSAPrivateKeyParamFromMap(m map[string]interface{}, key string) (*big.Int, error) { - b64Url, err := stringFromMap(m, key) - if err != nil { - return nil, err - } - - paramBytes, err := joseBase64UrlDecode(b64Url) - if err != nil { - return nil, fmt.Errorf("invaled base64 URL encoding: %s", err) - } - - return new(big.Int).SetBytes(paramBytes), nil -} - -func createPemBlock(name string, derBytes []byte, headers map[string]interface{}) (*pem.Block, error) { - pemBlock := &pem.Block{Type: name, Bytes: derBytes, Headers: map[string]string{}} - for k, v := range headers { - switch val := v.(type) { - case string: - pemBlock.Headers[k] = val - case []string: - if k == "hosts" { - pemBlock.Headers[k] = strings.Join(val, ",") - } else { - // Return error, non-encodable type - } - default: - // Return error, non-encodable type - } - } - - return pemBlock, nil -} - -func pubKeyFromPEMBlock(pemBlock *pem.Block) (PublicKey, error) { - cryptoPublicKey, err := x509.ParsePKIXPublicKey(pemBlock.Bytes) - if err != nil { - return nil, fmt.Errorf("unable to decode Public Key PEM data: %s", err) - } - - pubKey, err := FromCryptoPublicKey(cryptoPublicKey) - if err != nil { - return nil, err - } - - addPEMHeadersToKey(pemBlock, pubKey) - - return pubKey, nil -} - -func addPEMHeadersToKey(pemBlock *pem.Block, pubKey PublicKey) { - for key, value := range pemBlock.Headers { - var safeVal interface{} - if key == "hosts" { - safeVal = strings.Split(value, ",") - } else { - safeVal = value - } - pubKey.AddExtendedField(key, safeVal) - } -} diff --git a/vendor/github.com/google/cadvisor/accelerators/nvidia.go b/vendor/github.com/google/cadvisor/accelerators/nvidia.go index 496feba5eed..054d206b2ac 100644 --- a/vendor/github.com/google/cadvisor/accelerators/nvidia.go +++ b/vendor/github.com/google/cadvisor/accelerators/nvidia.go @@ -31,10 +31,7 @@ import ( ) type NvidiaManager struct { - sync.Mutex - - // true if there are NVIDIA devices present on the node - devicesPresent bool + sync.RWMutex // true if the NVML library (libnvidia-ml.so.1) was loaded successfully nvmlInitialized bool @@ -54,9 +51,20 @@ func (nm *NvidiaManager) Setup() { return } - nm.devicesPresent = true - - initializeNVML(nm) + nm.initializeNVML() + if nm.nvmlInitialized { + return + } + go func() { + glog.V(2).Info("Starting goroutine to initialize NVML") + // TODO: use globalHousekeepingInterval + for range time.Tick(time.Minute) { + nm.initializeNVML() + if nm.nvmlInitialized { + return + } + } + }() } // detectDevices returns true if a device with given pci id is present on the node. @@ -83,18 +91,20 @@ func detectDevices(vendorId string) bool { } // initializeNVML initializes the NVML library and sets up the nvmlDevices map. -// This is defined as a variable to help in testing. -var initializeNVML = func(nm *NvidiaManager) { +func (nm *NvidiaManager) initializeNVML() { if err := gonvml.Initialize(); err != nil { // This is under a logging level because otherwise we may cause // log spam if the drivers/nvml is not installed on the system. glog.V(4).Infof("Could not initialize NVML: %v", err) return } - nm.nvmlInitialized = true numDevices, err := gonvml.DeviceCount() if err != nil { glog.Warningf("GPU metrics would not be available. Failed to get the number of nvidia devices: %v", err) + nm.Lock() + // Even though we won't have GPU metrics, the library was initialized and should be shutdown when exiting. + nm.nvmlInitialized = true + nm.Unlock() return } glog.V(1).Infof("NVML initialized. Number of nvidia devices: %v", numDevices) @@ -112,6 +122,10 @@ var initializeNVML = func(nm *NvidiaManager) { } nm.nvidiaDevices[int(minorNumber)] = device } + nm.Lock() + // Doing this at the end to avoid race in accessing nvidiaDevices in GetCollector. + nm.nvmlInitialized = true + nm.Unlock() } // Destroy shuts down NVML. @@ -125,21 +139,12 @@ func (nm *NvidiaManager) Destroy() { // present in the devices.list file in the given devicesCgroupPath. func (nm *NvidiaManager) GetCollector(devicesCgroupPath string) (AcceleratorCollector, error) { nc := &NvidiaCollector{} - - if !nm.devicesPresent { - return nc, nil - } - // Makes sure that we don't call initializeNVML() concurrently and - // that we only call initializeNVML() when it's not initialized. - nm.Lock() - if !nm.nvmlInitialized { - initializeNVML(nm) - } + nm.RLock() if !nm.nvmlInitialized || len(nm.nvidiaDevices) == 0 { - nm.Unlock() + nm.RUnlock() return nc, nil } - nm.Unlock() + nm.RUnlock() nvidiaMinorNumbers, err := parseDevicesCgroup(devicesCgroupPath) if err != nil { return nc, err diff --git a/vendor/github.com/google/cadvisor/fs/fs.go b/vendor/github.com/google/cadvisor/fs/fs.go index 8b95a249f0b..468f23b7555 100644 --- a/vendor/github.com/google/cadvisor/fs/fs.go +++ b/vendor/github.com/google/cadvisor/fs/fs.go @@ -107,7 +107,7 @@ type CrioContext struct { } func NewFsInfo(context Context) (FsInfo, error) { - mounts, err := mount.GetMounts() + mounts, err := mount.GetMounts(nil) if err != nil { return nil, err } @@ -533,21 +533,6 @@ func (self *RealFsInfo) GetDirFsDevice(dir string) (*DeviceInfo, error) { } mount, found := self.mounts[dir] - // try the parent dir if not found until we reach the root dir - // this is an issue on btrfs systems where the directory is not - // the subvolume - for !found { - pathdir, _ := filepath.Split(dir) - // break when we reach root - if pathdir == "/" { - break - } - // trim "/" from the new parent path otherwise the next possible - // filepath.Split in the loop will not split the string any further - dir = strings.TrimSuffix(pathdir, "/") - mount, found = self.mounts[dir] - } - if found && mount.Fstype == "btrfs" && mount.Major == 0 && strings.HasPrefix(mount.Source, "/dev/") { major, minor, err := getBtrfsMajorMinorIds(mount) if err != nil { diff --git a/vendor/golang.org/x/sys/windows/BUILD b/vendor/golang.org/x/sys/windows/BUILD index 5a06bc73293..cdfa3836c36 100644 --- a/vendor/golang.org/x/sys/windows/BUILD +++ b/vendor/golang.org/x/sys/windows/BUILD @@ -39,6 +39,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//vendor/golang.org/x/sys/windows/registry:all-srcs", "//vendor/golang.org/x/sys/windows/svc:all-srcs", ], tags = ["automanaged"], diff --git a/vendor/github.com/docker/docker/pkg/ioutils/BUILD b/vendor/golang.org/x/sys/windows/registry/BUILD similarity index 51% rename from vendor/github.com/docker/docker/pkg/ioutils/BUILD rename to vendor/golang.org/x/sys/windows/registry/BUILD index 1e1db698a40..72e23185ee4 100644 --- a/vendor/github.com/docker/docker/pkg/ioutils/BUILD +++ b/vendor/golang.org/x/sys/windows/registry/BUILD @@ -3,23 +3,18 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library") go_library( name = "go_default_library", srcs = [ - "buffer.go", - "bytespipe.go", - "fswriters.go", - "readers.go", - "temp_unix.go", - "temp_windows.go", - "writeflusher.go", - "writers.go", + "key.go", + "mksyscall.go", + "syscall.go", + "value.go", + "zsyscall_windows.go", ], - importmap = "k8s.io/kubernetes/vendor/github.com/docker/docker/pkg/ioutils", - importpath = "github.com/docker/docker/pkg/ioutils", + importmap = "k8s.io/kubernetes/vendor/golang.org/x/sys/windows/registry", + importpath = "golang.org/x/sys/windows/registry", visibility = ["//visibility:public"], - deps = [ - "//vendor/golang.org/x/net/context:go_default_library", - ] + select({ + deps = select({ "@io_bazel_rules_go//go/platform:windows": [ - "//vendor/github.com/docker/docker/pkg/longpath:go_default_library", + "//vendor/golang.org/x/sys/windows:go_default_library", ], "//conditions:default": [], }), diff --git a/vendor/golang.org/x/sys/windows/registry/key.go b/vendor/golang.org/x/sys/windows/registry/key.go new file mode 100644 index 00000000000..d0beb195644 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/key.go @@ -0,0 +1,200 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +// Package registry provides access to the Windows registry. +// +// Here is a simple example, opening a registry key and reading a string value from it. +// +// k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) +// if err != nil { +// log.Fatal(err) +// } +// defer k.Close() +// +// s, _, err := k.GetStringValue("SystemRoot") +// if err != nil { +// log.Fatal(err) +// } +// fmt.Printf("Windows system root is %q\n", s) +// +package registry + +import ( + "io" + "syscall" + "time" +) + +const ( + // Registry key security and access rights. + // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878.aspx + // for details. + ALL_ACCESS = 0xf003f + CREATE_LINK = 0x00020 + CREATE_SUB_KEY = 0x00004 + ENUMERATE_SUB_KEYS = 0x00008 + EXECUTE = 0x20019 + NOTIFY = 0x00010 + QUERY_VALUE = 0x00001 + READ = 0x20019 + SET_VALUE = 0x00002 + WOW64_32KEY = 0x00200 + WOW64_64KEY = 0x00100 + WRITE = 0x20006 +) + +// Key is a handle to an open Windows registry key. +// Keys can be obtained by calling OpenKey; there are +// also some predefined root keys such as CURRENT_USER. +// Keys can be used directly in the Windows API. +type Key syscall.Handle + +const ( + // Windows defines some predefined root keys that are always open. + // An application can use these keys as entry points to the registry. + // Normally these keys are used in OpenKey to open new keys, + // but they can also be used anywhere a Key is required. + CLASSES_ROOT = Key(syscall.HKEY_CLASSES_ROOT) + CURRENT_USER = Key(syscall.HKEY_CURRENT_USER) + LOCAL_MACHINE = Key(syscall.HKEY_LOCAL_MACHINE) + USERS = Key(syscall.HKEY_USERS) + CURRENT_CONFIG = Key(syscall.HKEY_CURRENT_CONFIG) + PERFORMANCE_DATA = Key(syscall.HKEY_PERFORMANCE_DATA) +) + +// Close closes open key k. +func (k Key) Close() error { + return syscall.RegCloseKey(syscall.Handle(k)) +} + +// OpenKey opens a new key with path name relative to key k. +// It accepts any open key, including CURRENT_USER and others, +// and returns the new key and an error. +// The access parameter specifies desired access rights to the +// key to be opened. +func OpenKey(k Key, path string, access uint32) (Key, error) { + p, err := syscall.UTF16PtrFromString(path) + if err != nil { + return 0, err + } + var subkey syscall.Handle + err = syscall.RegOpenKeyEx(syscall.Handle(k), p, 0, access, &subkey) + if err != nil { + return 0, err + } + return Key(subkey), nil +} + +// OpenRemoteKey opens a predefined registry key on another +// computer pcname. The key to be opened is specified by k, but +// can only be one of LOCAL_MACHINE, PERFORMANCE_DATA or USERS. +// If pcname is "", OpenRemoteKey returns local computer key. +func OpenRemoteKey(pcname string, k Key) (Key, error) { + var err error + var p *uint16 + if pcname != "" { + p, err = syscall.UTF16PtrFromString(`\\` + pcname) + if err != nil { + return 0, err + } + } + var remoteKey syscall.Handle + err = regConnectRegistry(p, syscall.Handle(k), &remoteKey) + if err != nil { + return 0, err + } + return Key(remoteKey), nil +} + +// ReadSubKeyNames returns the names of subkeys of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadSubKeyNames(n int) ([]string, error) { + ki, err := k.Stat() + if err != nil { + return nil, err + } + names := make([]string, 0, ki.SubKeyCount) + buf := make([]uint16, ki.MaxSubKeyLen+1) // extra room for terminating zero byte +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := syscall.RegEnumKeyEx(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} + +// CreateKey creates a key named path under open key k. +// CreateKey returns the new key and a boolean flag that reports +// whether the key already existed. +// The access parameter specifies the access rights for the key +// to be created. +func CreateKey(k Key, path string, access uint32) (newk Key, openedExisting bool, err error) { + var h syscall.Handle + var d uint32 + err = regCreateKeyEx(syscall.Handle(k), syscall.StringToUTF16Ptr(path), + 0, nil, _REG_OPTION_NON_VOLATILE, access, nil, &h, &d) + if err != nil { + return 0, false, err + } + return Key(h), d == _REG_OPENED_EXISTING_KEY, nil +} + +// DeleteKey deletes the subkey path of key k and its values. +func DeleteKey(k Key, path string) error { + return regDeleteKey(syscall.Handle(k), syscall.StringToUTF16Ptr(path)) +} + +// A KeyInfo describes the statistics of a key. It is returned by Stat. +type KeyInfo struct { + SubKeyCount uint32 + MaxSubKeyLen uint32 // size of the key's subkey with the longest name, in Unicode characters, not including the terminating zero byte + ValueCount uint32 + MaxValueNameLen uint32 // size of the key's longest value name, in Unicode characters, not including the terminating zero byte + MaxValueLen uint32 // longest data component among the key's values, in bytes + lastWriteTime syscall.Filetime +} + +// ModTime returns the key's last write time. +func (ki *KeyInfo) ModTime() time.Time { + return time.Unix(0, ki.lastWriteTime.Nanoseconds()) +} + +// Stat retrieves information about the open key k. +func (k Key) Stat() (*KeyInfo, error) { + var ki KeyInfo + err := syscall.RegQueryInfoKey(syscall.Handle(k), nil, nil, nil, + &ki.SubKeyCount, &ki.MaxSubKeyLen, nil, &ki.ValueCount, + &ki.MaxValueNameLen, &ki.MaxValueLen, nil, &ki.lastWriteTime) + if err != nil { + return nil, err + } + return &ki, nil +} diff --git a/vendor/golang.org/x/sys/windows/registry/mksyscall.go b/vendor/golang.org/x/sys/windows/registry/mksyscall.go new file mode 100644 index 00000000000..0ac95ffe731 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/mksyscall.go @@ -0,0 +1,7 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package registry + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall.go diff --git a/vendor/golang.org/x/sys/windows/registry/syscall.go b/vendor/golang.org/x/sys/windows/registry/syscall.go new file mode 100644 index 00000000000..e66643cbaa6 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/syscall.go @@ -0,0 +1,32 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package registry + +import "syscall" + +const ( + _REG_OPTION_NON_VOLATILE = 0 + + _REG_CREATED_NEW_KEY = 1 + _REG_OPENED_EXISTING_KEY = 2 + + _ERROR_NO_MORE_ITEMS syscall.Errno = 259 +) + +func LoadRegLoadMUIString() error { + return procRegLoadMUIStringW.Find() +} + +//sys regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) = advapi32.RegCreateKeyExW +//sys regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) = advapi32.RegDeleteKeyW +//sys regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) = advapi32.RegSetValueExW +//sys regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegEnumValueW +//sys regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) = advapi32.RegDeleteValueW +//sys regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) = advapi32.RegLoadMUIStringW +//sys regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) = advapi32.RegConnectRegistryW + +//sys expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW diff --git a/vendor/golang.org/x/sys/windows/registry/value.go b/vendor/golang.org/x/sys/windows/registry/value.go new file mode 100644 index 00000000000..71d4e15bab1 --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/value.go @@ -0,0 +1,384 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +package registry + +import ( + "errors" + "io" + "syscall" + "unicode/utf16" + "unsafe" +) + +const ( + // Registry value types. + NONE = 0 + SZ = 1 + EXPAND_SZ = 2 + BINARY = 3 + DWORD = 4 + DWORD_BIG_ENDIAN = 5 + LINK = 6 + MULTI_SZ = 7 + RESOURCE_LIST = 8 + FULL_RESOURCE_DESCRIPTOR = 9 + RESOURCE_REQUIREMENTS_LIST = 10 + QWORD = 11 +) + +var ( + // ErrShortBuffer is returned when the buffer was too short for the operation. + ErrShortBuffer = syscall.ERROR_MORE_DATA + + // ErrNotExist is returned when a registry key or value does not exist. + ErrNotExist = syscall.ERROR_FILE_NOT_FOUND + + // ErrUnexpectedType is returned by Get*Value when the value's type was unexpected. + ErrUnexpectedType = errors.New("unexpected key value type") +) + +// GetValue retrieves the type and data for the specified value associated +// with an open key k. It fills up buffer buf and returns the retrieved +// byte count n. If buf is too small to fit the stored value it returns +// ErrShortBuffer error along with the required buffer size n. +// If no buffer is provided, it returns true and actual buffer size n. +// If no buffer is provided, GetValue returns the value's type only. +// If the value does not exist, the error returned is ErrNotExist. +// +// GetValue is a low level function. If value's type is known, use the appropriate +// Get*Value function instead. +func (k Key) GetValue(name string, buf []byte) (n int, valtype uint32, err error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return 0, 0, err + } + var pbuf *byte + if len(buf) > 0 { + pbuf = (*byte)(unsafe.Pointer(&buf[0])) + } + l := uint32(len(buf)) + err = syscall.RegQueryValueEx(syscall.Handle(k), pname, nil, &valtype, pbuf, &l) + if err != nil { + return int(l), valtype, err + } + return int(l), valtype, nil +} + +func (k Key) getValue(name string, buf []byte) (date []byte, valtype uint32, err error) { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return nil, 0, err + } + var t uint32 + n := uint32(len(buf)) + for { + err = syscall.RegQueryValueEx(syscall.Handle(k), p, nil, &t, (*byte)(unsafe.Pointer(&buf[0])), &n) + if err == nil { + return buf[:n], t, nil + } + if err != syscall.ERROR_MORE_DATA { + return nil, 0, err + } + if n <= uint32(len(buf)) { + return nil, 0, err + } + buf = make([]byte, n) + } +} + +// GetStringValue retrieves the string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringValue returns ErrNotExist. +// If value is not SZ or EXPAND_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringValue(name string) (val string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return "", typ, err2 + } + switch typ { + case SZ, EXPAND_SZ: + default: + return "", typ, ErrUnexpectedType + } + if len(data) == 0 { + return "", typ, nil + } + u := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:] + return syscall.UTF16ToString(u), typ, nil +} + +// GetMUIStringValue retrieves the localized string value for +// the specified value name associated with an open key k. +// If the value name doesn't exist or the localized string value +// can't be resolved, GetMUIStringValue returns ErrNotExist. +// GetMUIStringValue panics if the system doesn't support +// regLoadMUIString; use LoadRegLoadMUIString to check if +// regLoadMUIString is supported before calling this function. +func (k Key) GetMUIStringValue(name string) (string, error) { + pname, err := syscall.UTF16PtrFromString(name) + if err != nil { + return "", err + } + + buf := make([]uint16, 1024) + var buflen uint32 + var pdir *uint16 + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + if err == syscall.ERROR_FILE_NOT_FOUND { // Try fallback path + + // Try to resolve the string value using the system directory as + // a DLL search path; this assumes the string value is of the form + // @[path]\dllname,-strID but with no path given, e.g. @tzres.dll,-320. + + // This approach works with tzres.dll but may have to be revised + // in the future to allow callers to provide custom search paths. + + var s string + s, err = ExpandString("%SystemRoot%\\system32\\") + if err != nil { + return "", err + } + pdir, err = syscall.UTF16PtrFromString(s) + if err != nil { + return "", err + } + + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + for err == syscall.ERROR_MORE_DATA { // Grow buffer if needed + if buflen <= uint32(len(buf)) { + break // Buffer not growing, assume race; break + } + buf = make([]uint16, buflen) + err = regLoadMUIString(syscall.Handle(k), pname, &buf[0], uint32(len(buf)), &buflen, 0, pdir) + } + + if err != nil { + return "", err + } + + return syscall.UTF16ToString(buf), nil +} + +// ExpandString expands environment-variable strings and replaces +// them with the values defined for the current user. +// Use ExpandString to expand EXPAND_SZ strings. +func ExpandString(value string) (string, error) { + if value == "" { + return "", nil + } + p, err := syscall.UTF16PtrFromString(value) + if err != nil { + return "", err + } + r := make([]uint16, 100) + for { + n, err := expandEnvironmentStrings(p, &r[0], uint32(len(r))) + if err != nil { + return "", err + } + if n <= uint32(len(r)) { + u := (*[1 << 29]uint16)(unsafe.Pointer(&r[0]))[:] + return syscall.UTF16ToString(u), nil + } + r = make([]uint16, n) + } +} + +// GetStringsValue retrieves the []string value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetStringsValue returns ErrNotExist. +// If value is not MULTI_SZ, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetStringsValue(name string) (val []string, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != MULTI_SZ { + return nil, typ, ErrUnexpectedType + } + if len(data) == 0 { + return nil, typ, nil + } + p := (*[1 << 29]uint16)(unsafe.Pointer(&data[0]))[:len(data)/2] + if len(p) == 0 { + return nil, typ, nil + } + if p[len(p)-1] == 0 { + p = p[:len(p)-1] // remove terminating null + } + val = make([]string, 0, 5) + from := 0 + for i, c := range p { + if c == 0 { + val = append(val, string(utf16.Decode(p[from:i]))) + from = i + 1 + } + } + return val, typ, nil +} + +// GetIntegerValue retrieves the integer value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetIntegerValue returns ErrNotExist. +// If value is not DWORD or QWORD, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetIntegerValue(name string) (val uint64, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 8)) + if err2 != nil { + return 0, typ, err2 + } + switch typ { + case DWORD: + if len(data) != 4 { + return 0, typ, errors.New("DWORD value is not 4 bytes long") + } + return uint64(*(*uint32)(unsafe.Pointer(&data[0]))), DWORD, nil + case QWORD: + if len(data) != 8 { + return 0, typ, errors.New("QWORD value is not 8 bytes long") + } + return uint64(*(*uint64)(unsafe.Pointer(&data[0]))), QWORD, nil + default: + return 0, typ, ErrUnexpectedType + } +} + +// GetBinaryValue retrieves the binary value for the specified +// value name associated with an open key k. It also returns the value's type. +// If value does not exist, GetBinaryValue returns ErrNotExist. +// If value is not BINARY, it will return the correct value +// type and ErrUnexpectedType. +func (k Key) GetBinaryValue(name string) (val []byte, valtype uint32, err error) { + data, typ, err2 := k.getValue(name, make([]byte, 64)) + if err2 != nil { + return nil, typ, err2 + } + if typ != BINARY { + return nil, typ, ErrUnexpectedType + } + return data, typ, nil +} + +func (k Key) setValue(name string, valtype uint32, data []byte) error { + p, err := syscall.UTF16PtrFromString(name) + if err != nil { + return err + } + if len(data) == 0 { + return regSetValueEx(syscall.Handle(k), p, 0, valtype, nil, 0) + } + return regSetValueEx(syscall.Handle(k), p, 0, valtype, &data[0], uint32(len(data))) +} + +// SetDWordValue sets the data and type of a name value +// under key k to value and DWORD. +func (k Key) SetDWordValue(name string, value uint32) error { + return k.setValue(name, DWORD, (*[4]byte)(unsafe.Pointer(&value))[:]) +} + +// SetQWordValue sets the data and type of a name value +// under key k to value and QWORD. +func (k Key) SetQWordValue(name string, value uint64) error { + return k.setValue(name, QWORD, (*[8]byte)(unsafe.Pointer(&value))[:]) +} + +func (k Key) setStringValue(name string, valtype uint32, value string) error { + v, err := syscall.UTF16FromString(value) + if err != nil { + return err + } + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] + return k.setValue(name, valtype, buf) +} + +// SetStringValue sets the data and type of a name value +// under key k to value and SZ. The value must not contain a zero byte. +func (k Key) SetStringValue(name, value string) error { + return k.setStringValue(name, SZ, value) +} + +// SetExpandStringValue sets the data and type of a name value +// under key k to value and EXPAND_SZ. The value must not contain a zero byte. +func (k Key) SetExpandStringValue(name, value string) error { + return k.setStringValue(name, EXPAND_SZ, value) +} + +// SetStringsValue sets the data and type of a name value +// under key k to value and MULTI_SZ. The value strings +// must not contain a zero byte. +func (k Key) SetStringsValue(name string, value []string) error { + ss := "" + for _, s := range value { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return errors.New("string cannot have 0 inside") + } + } + ss += s + "\x00" + } + v := utf16.Encode([]rune(ss + "\x00")) + buf := (*[1 << 29]byte)(unsafe.Pointer(&v[0]))[:len(v)*2] + return k.setValue(name, MULTI_SZ, buf) +} + +// SetBinaryValue sets the data and type of a name value +// under key k to value and BINARY. +func (k Key) SetBinaryValue(name string, value []byte) error { + return k.setValue(name, BINARY, value) +} + +// DeleteValue removes a named value from the key k. +func (k Key) DeleteValue(name string) error { + return regDeleteValue(syscall.Handle(k), syscall.StringToUTF16Ptr(name)) +} + +// ReadValueNames returns the value names of key k. +// The parameter n controls the number of returned names, +// analogous to the way os.File.Readdirnames works. +func (k Key) ReadValueNames(n int) ([]string, error) { + ki, err := k.Stat() + if err != nil { + return nil, err + } + names := make([]string, 0, ki.ValueCount) + buf := make([]uint16, ki.MaxValueNameLen+1) // extra room for terminating null character +loopItems: + for i := uint32(0); ; i++ { + if n > 0 { + if len(names) == n { + return names, nil + } + } + l := uint32(len(buf)) + for { + err := regEnumValue(syscall.Handle(k), i, &buf[0], &l, nil, nil, nil, nil) + if err == nil { + break + } + if err == syscall.ERROR_MORE_DATA { + // Double buffer size and try again. + l = uint32(2 * len(buf)) + buf = make([]uint16, l) + continue + } + if err == _ERROR_NO_MORE_ITEMS { + break loopItems + } + return names, err + } + names = append(names, syscall.UTF16ToString(buf[:l])) + } + if n > len(names) { + return names, io.EOF + } + return names, nil +} diff --git a/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go new file mode 100644 index 00000000000..ceebdd7726d --- /dev/null +++ b/vendor/golang.org/x/sys/windows/registry/zsyscall_windows.go @@ -0,0 +1,120 @@ +// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT + +package registry + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modadvapi32 = windows.NewLazySystemDLL("advapi32.dll") + modkernel32 = windows.NewLazySystemDLL("kernel32.dll") + + procRegCreateKeyExW = modadvapi32.NewProc("RegCreateKeyExW") + procRegDeleteKeyW = modadvapi32.NewProc("RegDeleteKeyW") + procRegSetValueExW = modadvapi32.NewProc("RegSetValueExW") + procRegEnumValueW = modadvapi32.NewProc("RegEnumValueW") + procRegDeleteValueW = modadvapi32.NewProc("RegDeleteValueW") + procRegLoadMUIStringW = modadvapi32.NewProc("RegLoadMUIStringW") + procRegConnectRegistryW = modadvapi32.NewProc("RegConnectRegistryW") + procExpandEnvironmentStringsW = modkernel32.NewProc("ExpandEnvironmentStringsW") +) + +func regCreateKeyEx(key syscall.Handle, subkey *uint16, reserved uint32, class *uint16, options uint32, desired uint32, sa *syscall.SecurityAttributes, result *syscall.Handle, disposition *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegCreateKeyExW.Addr(), 9, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(reserved), uintptr(unsafe.Pointer(class)), uintptr(options), uintptr(desired), uintptr(unsafe.Pointer(sa)), uintptr(unsafe.Pointer(result)), uintptr(unsafe.Pointer(disposition))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteKey(key syscall.Handle, subkey *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteKeyW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(subkey)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regSetValueEx(key syscall.Handle, valueName *uint16, reserved uint32, vtype uint32, buf *byte, bufsize uint32) (regerrno error) { + r0, _, _ := syscall.Syscall6(procRegSetValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(valueName)), uintptr(reserved), uintptr(vtype), uintptr(unsafe.Pointer(buf)), uintptr(bufsize)) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regEnumValue(key syscall.Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegEnumValueW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regDeleteValue(key syscall.Handle, name *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegDeleteValueW.Addr(), 2, uintptr(key), uintptr(unsafe.Pointer(name)), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regLoadMUIString(key syscall.Handle, name *uint16, buf *uint16, buflen uint32, buflenCopied *uint32, flags uint32, dir *uint16) (regerrno error) { + r0, _, _ := syscall.Syscall9(procRegLoadMUIStringW.Addr(), 7, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(unsafe.Pointer(buflenCopied)), uintptr(flags), uintptr(unsafe.Pointer(dir)), 0, 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func regConnectRegistry(machinename *uint16, key syscall.Handle, result *syscall.Handle) (regerrno error) { + r0, _, _ := syscall.Syscall(procRegConnectRegistryW.Addr(), 3, uintptr(unsafe.Pointer(machinename)), uintptr(key), uintptr(unsafe.Pointer(result))) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + +func expandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) { + r0, _, e1 := syscall.Syscall(procExpandEnvironmentStringsW.Addr(), 3, uintptr(unsafe.Pointer(src)), uintptr(unsafe.Pointer(dst)), uintptr(size)) + n = uint32(r0) + if n == 0 { + if e1 != 0 { + err = errnoErr(e1) + } else { + err = syscall.EINVAL + } + } + return +} From 20cc40a5dc51f0f876098d99f05a71daeaf0edc5 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 14 Jun 2018 18:05:18 -0400 Subject: [PATCH 6/8] ProcMount: add dockershim support Signed-off-by: Jess Frazelle --- pkg/kubelet/dockershim/libdocker/kube_docker_client.go | 4 ++-- pkg/kubelet/dockershim/security_context.go | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/dockershim/libdocker/kube_docker_client.go b/pkg/kubelet/dockershim/libdocker/kube_docker_client.go index 02ef40bc797..13a1eab5559 100644 --- a/pkg/kubelet/dockershim/libdocker/kube_docker_client.go +++ b/pkg/kubelet/dockershim/libdocker/kube_docker_client.go @@ -205,7 +205,7 @@ func (d *kubeDockerClient) inspectImageRaw(ref string) (*dockertypes.ImageInspec return nil, ctxErr } if err != nil { - if dockerapi.IsErrImageNotFound(err) { + if dockerapi.IsErrNotFound(err) { err = ImageNotFoundError{ID: ref} } return nil, err @@ -469,7 +469,7 @@ func (d *kubeDockerClient) StartExec(startExec string, opts dockertypes.ExecStar } return err } - resp, err := d.client.ContainerExecAttach(ctx, startExec, dockertypes.ExecConfig{ + resp, err := d.client.ContainerExecAttach(ctx, startExec, dockertypes.ExecStartCheck{ Detach: opts.Detach, Tty: opts.Tty, }) diff --git a/pkg/kubelet/dockershim/security_context.go b/pkg/kubelet/dockershim/security_context.go index 343c3876480..e2724357136 100644 --- a/pkg/kubelet/dockershim/security_context.go +++ b/pkg/kubelet/dockershim/security_context.go @@ -137,6 +137,9 @@ func modifyHostConfig(sc *runtimeapi.LinuxContainerSecurityContext, hostConfig * hostConfig.SecurityOpt = append(hostConfig.SecurityOpt, "no-new-privileges") } + hostConfig.MaskedPaths = sc.MaskedPaths + hostConfig.ReadonlyPaths = sc.ReadonlyPaths + return nil } From 40d238b91a94aafef4932a6aec4100ab84e37fbd Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 30 Aug 2018 11:46:36 -0400 Subject: [PATCH 7/8] address comments Signed-off-by: Jess Frazelle --- pkg/api/podsecuritypolicy/OWNERS | 3 + pkg/api/podsecuritypolicy/util.go | 31 +++++++++ pkg/api/podsecuritypolicy/util_test.go | 69 +++++++++++++++++++ pkg/apis/core/types.go | 2 +- .../policy/podsecuritypolicy/strategy.go | 9 +++ staging/src/k8s.io/api/core/v1/types.go | 3 +- .../k8s.io/api/extensions/v1beta1/types.go | 1 + .../src/k8s.io/api/policy/v1beta1/types.go | 1 + 8 files changed, 117 insertions(+), 2 deletions(-) create mode 100755 pkg/api/podsecuritypolicy/OWNERS create mode 100644 pkg/api/podsecuritypolicy/util.go create mode 100644 pkg/api/podsecuritypolicy/util_test.go diff --git a/pkg/api/podsecuritypolicy/OWNERS b/pkg/api/podsecuritypolicy/OWNERS new file mode 100755 index 00000000000..652fc4cefab --- /dev/null +++ b/pkg/api/podsecuritypolicy/OWNERS @@ -0,0 +1,3 @@ +reviewers: +- smarterclayton +- jessfraz diff --git a/pkg/api/podsecuritypolicy/util.go b/pkg/api/podsecuritypolicy/util.go new file mode 100644 index 00000000000..28a6d7f7d47 --- /dev/null +++ b/pkg/api/podsecuritypolicy/util.go @@ -0,0 +1,31 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package podsecuritypolicy + +import ( + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/features" +) + +// DropDisabledAlphaFields removes disabled fields from the pod security policy spec. +// This should be called from PrepareForCreate/PrepareForUpdate for all resources containing a od security policy spec. +func DropDisabledAlphaFields(pspSpec *policy.PodSecurityPolicySpec) { + if !utilfeature.DefaultFeatureGate.Enabled(features.ProcMountType) { + pspSpec.AllowedProcMountTypes = nil + } +} diff --git a/pkg/api/podsecuritypolicy/util_test.go b/pkg/api/podsecuritypolicy/util_test.go new file mode 100644 index 00000000000..420e73b77c7 --- /dev/null +++ b/pkg/api/podsecuritypolicy/util_test.go @@ -0,0 +1,69 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package podsecuritypolicy + +import ( + "testing" + + utilfeature "k8s.io/apiserver/pkg/util/feature" + api "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/apis/policy" + "k8s.io/kubernetes/pkg/features" +) + +func TestDropAlphaProcMountType(t *testing.T) { + // PodSecurityPolicy with AllowedProcMountTypes set + psp := policy.PodSecurityPolicy{ + Spec: policy.PodSecurityPolicySpec{ + AllowedProcMountTypes: []api.ProcMountType{api.UnmaskedProcMount}, + }, + } + + // Enable alpha feature ProcMountType + err1 := utilfeature.DefaultFeatureGate.Set("ProcMountType=true") + if err1 != nil { + t.Fatalf("Failed to enable feature gate for ProcMountType: %v", err1) + } + + // now test dropping the fields - should not be dropped + DropDisabledAlphaFields(&psp.Spec) + + // check to make sure AllowedProcMountTypes is still present + // if featureset is set to true + if utilfeature.DefaultFeatureGate.Enabled(features.ProcMountType) { + if psp.Spec.AllowedProcMountTypes == nil { + t.Error("AllowedProcMountTypes in pvc.Spec should not have been dropped based on feature-gate") + } + } + + // Disable alpha feature ProcMountType + err := utilfeature.DefaultFeatureGate.Set("ProcMountType=false") + if err != nil { + t.Fatalf("Failed to disable feature gate for ProcMountType: %v", err) + } + + // now test dropping the fields + DropDisabledAlphaFields(&psp.Spec) + + // check to make sure AllowedProcMountTypes is nil + // if featureset is set to false + if utilfeature.DefaultFeatureGate.Enabled(features.ProcMountType) { + if psp.Spec.AllowedProcMountTypes != nil { + t.Error("DropDisabledAlphaFields AllowedProcMountTypes for psp.Spec failed") + } + } +} diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index a9a561c5bc8..11e1664eedd 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -4632,7 +4632,7 @@ const ( DefaultProcMount ProcMountType = "Default" // UnmaskedProcMount bypasses the default masking behavior of the container - // runtime and ensures the newly created /proc the container stays in tact with + // runtime and ensures the newly created /proc the container stays intact with // no modifications. UnmaskedProcMount ProcMountType = "Unmasked" ) diff --git a/pkg/registry/policy/podsecuritypolicy/strategy.go b/pkg/registry/policy/podsecuritypolicy/strategy.go index 668bafa3319..c9940fe2d83 100644 --- a/pkg/registry/policy/podsecuritypolicy/strategy.go +++ b/pkg/registry/policy/podsecuritypolicy/strategy.go @@ -24,6 +24,7 @@ import ( "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api/legacyscheme" + psputil "k8s.io/kubernetes/pkg/api/podsecuritypolicy" "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/apis/policy/validation" ) @@ -55,9 +56,17 @@ func (strategy) AllowUnconditionalUpdate() bool { } func (strategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { + psp := obj.(*policy.PodSecurityPolicy) + + psputil.DropDisabledAlphaFields(&psp.Spec) } func (strategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { + newPsp := obj.(*policy.PodSecurityPolicy) + oldPsp := old.(*policy.PodSecurityPolicy) + + psputil.DropDisabledAlphaFields(&newPsp.Spec) + psputil.DropDisabledAlphaFields(&oldPsp.Spec) } func (strategy) Canonicalize(obj runtime.Object) { diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 7e9a818a14e..893e0fdc727 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -5198,9 +5198,10 @@ type SecurityContext struct { // 2) has CAP_SYS_ADMIN // +optional AllowPrivilegeEscalation *bool `json:"allowPrivilegeEscalation,omitempty" protobuf:"varint,7,opt,name=allowPrivilegeEscalation"` - // ProcMount denotes the type of proc mount to use for the containers. + // procMount denotes the type of proc mount to use for the containers. // The default is DefaultProcMount which uses the container runtime defaults for // readonly paths and masked paths. + // This requires the ProcMountType feature flag to be enabled. // +optional ProcMount *ProcMountType `json:"procMount,omitEmpty" protobuf:"bytes,9,opt,name=procMount"` } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types.go b/staging/src/k8s.io/api/extensions/v1beta1/types.go index 475f9136b55..38e112d1e0e 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types.go @@ -967,6 +967,7 @@ type PodSecurityPolicySpec struct { ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. // +optional AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty" protobuf:"bytes,21,opt,name=allowedProcMountTypes"` } diff --git a/staging/src/k8s.io/api/policy/v1beta1/types.go b/staging/src/k8s.io/api/policy/v1beta1/types.go index 07d6710f4fe..c1a2727509a 100644 --- a/staging/src/k8s.io/api/policy/v1beta1/types.go +++ b/staging/src/k8s.io/api/policy/v1beta1/types.go @@ -223,6 +223,7 @@ type PodSecurityPolicySpec struct { ForbiddenSysctls []string `json:"forbiddenSysctls,omitempty" protobuf:"bytes,20,rep,name=forbiddenSysctls"` // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. // +optional AllowedProcMountTypes []v1.ProcMountType `json:"allowedProcMountTypes,omitempty" protobuf:"bytes,21,opt,name=allowedProcMountTypes"` } From 1a4cf7a36e1d28c43b2fbb0efe1dbcd60e09b0d6 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 30 Aug 2018 12:02:08 -0400 Subject: [PATCH 8/8] make update Signed-off-by: Jess Frazelle --- api/openapi-spec/swagger.json | 18 + api/swagger-spec/apps_v1.json | 11 + api/swagger-spec/apps_v1beta1.json | 11 + api/swagger-spec/apps_v1beta2.json | 11 + api/swagger-spec/batch_v1.json | 11 + api/swagger-spec/batch_v1beta1.json | 11 + api/swagger-spec/batch_v2alpha1.json | 11 + api/swagger-spec/extensions_v1beta1.json | 18 + api/swagger-spec/policy_v1beta1.json | 11 + api/swagger-spec/v1.json | 11 + docs/api-reference/apps/v1/definitions.html | 19 +- .../apps/v1beta1/definitions.html | 19 +- .../apps/v1beta2/definitions.html | 19 +- docs/api-reference/batch/v1/definitions.html | 93 +- .../batch/v1beta1/definitions.html | 11 + .../batch/v2alpha1/definitions.html | 11 + .../extensions/v1beta1/definitions.html | 100 +- .../policy/v1beta1/definitions.html | 11 + docs/api-reference/v1/definitions.html | 11 + pkg/BUILD | 1 + pkg/api/podsecuritypolicy/BUILD | 43 + pkg/apis/core/v1/zz_generated.defaults.go | 18 - pkg/apis/core/zz_generated.deepcopy.go | 5 + .../v1beta1/zz_generated.conversion.go | 2 + .../policy/v1beta1/zz_generated.conversion.go | 2 + pkg/apis/policy/zz_generated.deepcopy.go | 5 + .../apis/cri/runtime/v1alpha2/api.pb.go | 589 +++--- pkg/registry/policy/podsecuritypolicy/BUILD | 1 + .../src/k8s.io/api/core/v1/generated.pb.go | 1639 +++++++++-------- .../src/k8s.io/api/core/v1/generated.proto | 7 + .../core/v1/types_swagger_doc_generated.go | 1 + .../api/core/v1/zz_generated.deepcopy.go | 5 + .../api/extensions/v1beta1/generated.pb.go | 512 ++--- .../api/extensions/v1beta1/generated.proto | 6 + .../v1beta1/types_swagger_doc_generated.go | 1 + .../v1beta1/zz_generated.deepcopy.go | 5 + .../k8s.io/api/policy/v1beta1/generated.pb.go | 268 +-- .../k8s.io/api/policy/v1beta1/generated.proto | 6 + .../v1beta1/types_swagger_doc_generated.go | 1 + .../policy/v1beta1/zz_generated.deepcopy.go | 5 + .../Godeps/Godeps.json | 8 +- .../src/k8s.io/apiserver/Godeps/Godeps.json | 8 +- .../k8s.io/kube-aggregator/Godeps/Godeps.json | 8 +- .../sample-apiserver/Godeps/Godeps.json | 8 +- 44 files changed, 2018 insertions(+), 1554 deletions(-) create mode 100644 pkg/api/podsecuritypolicy/BUILD diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 45a5b676837..04aefc0a943 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -84180,6 +84180,10 @@ "description": "Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false.", "type": "boolean" }, + "procMount": { + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.", + "type": "string" + }, "readOnlyRootFilesystem": { "description": "Whether this container has a read-only root filesystem. Default is false.", "type": "boolean" @@ -86042,6 +86046,13 @@ "$ref": "#/definitions/io.k8s.api.extensions.v1beta1.AllowedHostPath" } }, + "allowedProcMountTypes": { + "description": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", + "type": "array", + "items": { + "type": "string" + } + }, "allowedUnsafeSysctls": { "description": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "type": "array", @@ -86943,6 +86954,13 @@ "$ref": "#/definitions/io.k8s.api.policy.v1beta1.AllowedHostPath" } }, + "allowedProcMountTypes": { + "description": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", + "type": "array", + "items": { + "type": "string" + } + }, "allowedUnsafeSysctls": { "description": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "type": "array", diff --git a/api/swagger-spec/apps_v1.json b/api/swagger-spec/apps_v1.json index 4a3f7195560..d2e324d498c 100644 --- a/api/swagger-spec/apps_v1.json +++ b/api/swagger-spec/apps_v1.json @@ -8381,6 +8381,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -8415,6 +8418,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -8464,6 +8471,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 6f220a5af76..1c02c10b666 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -5989,6 +5989,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -6023,6 +6026,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -6072,6 +6079,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json index 6c9b8046a25..c60321d30e4 100644 --- a/api/swagger-spec/apps_v1beta2.json +++ b/api/swagger-spec/apps_v1beta2.json @@ -8381,6 +8381,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -8415,6 +8418,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -8464,6 +8471,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index f431fe6d0e7..47e8e1b8c71 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -3296,6 +3296,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -3330,6 +3333,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -3379,6 +3386,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", diff --git a/api/swagger-spec/batch_v1beta1.json b/api/swagger-spec/batch_v1beta1.json index 396bdf3505a..d6216364a70 100644 --- a/api/swagger-spec/batch_v1beta1.json +++ b/api/swagger-spec/batch_v1beta1.json @@ -3351,6 +3351,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -3385,6 +3388,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -3434,6 +3441,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", diff --git a/api/swagger-spec/batch_v2alpha1.json b/api/swagger-spec/batch_v2alpha1.json index 2859b0b3e33..6dc7b36a0e0 100644 --- a/api/swagger-spec/batch_v2alpha1.json +++ b/api/swagger-spec/batch_v2alpha1.json @@ -3351,6 +3351,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -3385,6 +3388,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -3434,6 +3441,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 0497ac5382a..d23875792ab 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -9029,6 +9029,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -9063,6 +9066,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -9112,6 +9119,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", @@ -10520,6 +10531,13 @@ "type": "string" }, "description": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc." + }, + "allowedProcMountTypes": { + "type": "array", + "items": { + "$ref": "v1.ProcMountType" + }, + "description": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled." } } }, diff --git a/api/swagger-spec/policy_v1beta1.json b/api/swagger-spec/policy_v1beta1.json index a8512054435..439f3d59c94 100644 --- a/api/swagger-spec/policy_v1beta1.json +++ b/api/swagger-spec/policy_v1beta1.json @@ -2545,6 +2545,13 @@ "type": "string" }, "description": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc." + }, + "allowedProcMountTypes": { + "type": "array", + "items": { + "$ref": "v1.ProcMountType" + }, + "description": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled." } } }, @@ -2716,6 +2723,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.APIResourceList": { "id": "v1.APIResourceList", "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index c95cd41a1f1..a8fd7bc7329 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -21845,6 +21845,9 @@ "v1.SecurityContext": { "id": "v1.SecurityContext", "description": "SecurityContext holds security configuration that will be applied to a container. Some fields are present in both SecurityContext and PodSecurityContext. When both are set, the values in SecurityContext take precedence.", + "required": [ + "procMount" + ], "properties": { "capabilities": { "$ref": "v1.Capabilities", @@ -21879,6 +21882,10 @@ "allowPrivilegeEscalation": { "type": "boolean", "description": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN" + }, + "procMount": { + "$ref": "v1.ProcMountType", + "description": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled." } } }, @@ -21928,6 +21935,10 @@ } } }, + "v1.ProcMountType": { + "id": "v1.ProcMountType", + "properties": {} + }, "v1.PodSecurityContext": { "id": "v1.PodSecurityContext", "description": "PodSecurityContext holds pod-level security attributes and common container settings. Some fields are also present in container.securityContext. Field values of container.securityContext take precedence over field values of PodSecurityContext.", diff --git a/docs/api-reference/apps/v1/definitions.html b/docs/api-reference/apps/v1/definitions.html index 05b484b1316..69a9548f3c5 100755 --- a/docs/api-reference/apps/v1/definitions.html +++ b/docs/api-reference/apps/v1/definitions.html @@ -6747,6 +6747,13 @@ Examples:

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -7941,10 +7948,6 @@ The StatefulSet guarantees that a given network identity will always map to the - -
-

v1.AzureDataDiskKind

-

v1.PreferredSchedulingTerm

@@ -7986,6 +7989,10 @@ The StatefulSet guarantees that a given network identity will always map to the +
+
+

v1.AzureDataDiskKind

+

v1.ConfigMapKeySelector

@@ -8038,6 +8045,10 @@ The StatefulSet guarantees that a given network identity will always map to the

v1.AzureDataDiskCachingMode

+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index bf60c70915a..6baf64f03b6 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -6607,6 +6607,13 @@ Examples:

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -7329,10 +7336,6 @@ Examples:
-
-
-

v1.AzureDataDiskKind

-

v1.PreferredSchedulingTerm

@@ -7374,6 +7377,10 @@ Examples:
+
+
+

v1.AzureDataDiskKind

+

v1.ConfigMapKeySelector

@@ -7426,6 +7433,10 @@ Examples:

v1.AzureDataDiskCachingMode

+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/apps/v1beta2/definitions.html b/docs/api-reference/apps/v1beta2/definitions.html index 2afcf3b84be..30f9ccc358e 100755 --- a/docs/api-reference/apps/v1beta2/definitions.html +++ b/docs/api-reference/apps/v1beta2/definitions.html @@ -6886,6 +6886,13 @@ Examples:

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -7910,10 +7917,6 @@ Examples:
-
-
-

v1.AzureDataDiskKind

-

v1.PreferredSchedulingTerm

@@ -7955,6 +7958,10 @@ Examples:
+
+
+

v1.AzureDataDiskKind

+

v1.ConfigMapKeySelector

@@ -8048,6 +8055,10 @@ Examples:

v1.AzureDataDiskCachingMode

+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index 607e8a2cee0..a3a45f63ada 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -5144,6 +5144,47 @@ Examples:
+
+
+

v1.PodDNSConfigOption

+
+

PodDNSConfigOption defines DNS resolver options of a pod.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Required.

false

string

value

false

string

+

v1.SecretProjection

@@ -5195,47 +5236,6 @@ Examples:
-
-
-

v1.PodDNSConfigOption

-
-

PodDNSConfigOption defines DNS resolver options of a pod.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

Required.

false

string

value

false

string

-

v1.CinderVolumeSource

@@ -5371,6 +5371,13 @@ Examples:

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -6193,6 +6200,10 @@ Examples:

v1.AzureDataDiskCachingMode

+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/batch/v1beta1/definitions.html b/docs/api-reference/batch/v1beta1/definitions.html index 7769cfc01bc..c2ee9d042c1 100755 --- a/docs/api-reference/batch/v1beta1/definitions.html +++ b/docs/api-reference/batch/v1beta1/definitions.html @@ -5508,6 +5508,13 @@ Examples:

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -6289,6 +6296,10 @@ Examples:

v1.AzureDataDiskCachingMode

+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/batch/v2alpha1/definitions.html b/docs/api-reference/batch/v2alpha1/definitions.html index c2332d3f0f8..892f149486d 100755 --- a/docs/api-reference/batch/v2alpha1/definitions.html +++ b/docs/api-reference/batch/v2alpha1/definitions.html @@ -5309,6 +5309,13 @@ Examples:

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -6289,6 +6296,10 @@ Examples:

v1.AzureDataDiskCachingMode

+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index 26b93b33887..62dfc0ee1ce 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -7243,6 +7243,47 @@ If PodSelector is also set, then the NetworkPolicyPeer as a whole selects the Po +
+
+

v1.PodDNSConfigOption

+
+

PodDNSConfigOption defines DNS resolver options of a pod.

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

name

Required.

false

string

value

false

string

+

v1.SecretProjection

@@ -7294,47 +7335,6 @@ If PodSelector is also set, then the NetworkPolicyPeer as a whole selects the Po -
-
-

v1.PodDNSConfigOption

-
-

PodDNSConfigOption defines DNS resolver options of a pod.

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

name

Required.

false

string

value

false

string

-

v1beta1.DaemonSet

@@ -7532,6 +7532,13 @@ If PodSelector is also set, then the NetworkPolicyPeer as a whole selects the Po

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -8247,6 +8254,13 @@ Examples: e.g. "foo/" forbids "foo/bar", "foo/baz", etc. e.g. "foo.*" f

string array

+ +

allowedProcMountTypes

+

AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.

+

false

+

v1.ProcMountType array

+ + @@ -8773,6 +8787,10 @@ Examples: e.g. "foo/" forbids "foo/bar", "foo/baz", etc. e.g. "foo.*" f

v1.AzureDataDiskCachingMode

+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/policy/v1beta1/definitions.html b/docs/api-reference/policy/v1beta1/definitions.html index bbcdece9962..a59f79de424 100755 --- a/docs/api-reference/policy/v1beta1/definitions.html +++ b/docs/api-reference/policy/v1beta1/definitions.html @@ -1508,6 +1508,13 @@ Examples: e.g. "foo/" forbids "foo/bar", "foo/baz", etc. e.g. "foo.*" f

string array

+ +

allowedProcMountTypes

+

AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.

+

false

+

v1.ProcMountType array

+ + @@ -2235,6 +2242,10 @@ Examples:
+
+
+

v1.ProcMountType

+

any

diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index d65fc6e0c03..f2bc2523daf 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -5080,6 +5080,13 @@ Examples:

boolean

false

+ +

procMount

+

procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.

+

true

+

v1.ProcMountType

+ + @@ -6384,6 +6391,10 @@ Examples:
+
+
+

v1.ProcMountType

+

v1.APIResourceList

diff --git a/pkg/BUILD b/pkg/BUILD index bbb26c64805..3f9fa5c66b4 100644 --- a/pkg/BUILD +++ b/pkg/BUILD @@ -17,6 +17,7 @@ filegroup( "//pkg/api/persistentvolume:all-srcs", "//pkg/api/persistentvolumeclaim:all-srcs", "//pkg/api/pod:all-srcs", + "//pkg/api/podsecuritypolicy:all-srcs", "//pkg/api/ref:all-srcs", "//pkg/api/resource:all-srcs", "//pkg/api/service:all-srcs", diff --git a/pkg/api/podsecuritypolicy/BUILD b/pkg/api/podsecuritypolicy/BUILD new file mode 100644 index 00000000000..4c1f9db836f --- /dev/null +++ b/pkg/api/podsecuritypolicy/BUILD @@ -0,0 +1,43 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = ["util.go"], + importpath = "k8s.io/kubernetes/pkg/api/podsecuritypolicy", + deps = [ + "//pkg/apis/policy:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +go_test( + name = "go_default_test", + srcs = ["util_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/apis/core:go_default_library", + "//pkg/apis/policy:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + ], +) diff --git a/pkg/apis/core/v1/zz_generated.defaults.go b/pkg/apis/core/v1/zz_generated.defaults.go index 0ea5e0fae05..00e0b384aa8 100644 --- a/pkg/apis/core/v1/zz_generated.defaults.go +++ b/pkg/apis/core/v1/zz_generated.defaults.go @@ -263,9 +263,6 @@ func SetObjectDefaults_Pod(in *v1.Pod) { } } } - if a.SecurityContext != nil { - SetDefaults_SecurityContext(a.SecurityContext) - } } for i := range in.Spec.Containers { a := &in.Spec.Containers[i] @@ -308,9 +305,6 @@ func SetObjectDefaults_Pod(in *v1.Pod) { } } } - if a.SecurityContext != nil { - SetDefaults_SecurityContext(a.SecurityContext) - } } } @@ -415,9 +409,6 @@ func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) { } } } - if a.SecurityContext != nil { - SetDefaults_SecurityContext(a.SecurityContext) - } } for i := range in.Template.Spec.Containers { a := &in.Template.Spec.Containers[i] @@ -460,9 +451,6 @@ func SetObjectDefaults_PodTemplate(in *v1.PodTemplate) { } } } - if a.SecurityContext != nil { - SetDefaults_SecurityContext(a.SecurityContext) - } } } @@ -569,9 +557,6 @@ func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) { } } } - if a.SecurityContext != nil { - SetDefaults_SecurityContext(a.SecurityContext) - } } for i := range in.Spec.Template.Spec.Containers { a := &in.Spec.Template.Spec.Containers[i] @@ -614,9 +599,6 @@ func SetObjectDefaults_ReplicationController(in *v1.ReplicationController) { } } } - if a.SecurityContext != nil { - SetDefaults_SecurityContext(a.SecurityContext) - } } } } diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index 1ec0d178857..f60de66b153 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -4589,6 +4589,11 @@ func (in *SecurityContext) DeepCopyInto(out *SecurityContext) { *out = new(bool) **out = **in } + if in.ProcMount != nil { + in, out := &in.ProcMount, &out.ProcMount + *out = new(ProcMountType) + **out = **in + } return } diff --git a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go index 8cd1a2257ca..1b35486b828 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go @@ -1665,6 +1665,7 @@ func autoConvert_v1beta1_PodSecurityPolicySpec_To_policy_PodSecurityPolicySpec(i out.AllowedFlexVolumes = *(*[]policy.AllowedFlexVolume)(unsafe.Pointer(&in.AllowedFlexVolumes)) out.AllowedUnsafeSysctls = *(*[]string)(unsafe.Pointer(&in.AllowedUnsafeSysctls)) out.ForbiddenSysctls = *(*[]string)(unsafe.Pointer(&in.ForbiddenSysctls)) + out.AllowedProcMountTypes = *(*[]core.ProcMountType)(unsafe.Pointer(&in.AllowedProcMountTypes)) return nil } @@ -1704,6 +1705,7 @@ func autoConvert_policy_PodSecurityPolicySpec_To_v1beta1_PodSecurityPolicySpec(i out.AllowedFlexVolumes = *(*[]v1beta1.AllowedFlexVolume)(unsafe.Pointer(&in.AllowedFlexVolumes)) out.AllowedUnsafeSysctls = *(*[]string)(unsafe.Pointer(&in.AllowedUnsafeSysctls)) out.ForbiddenSysctls = *(*[]string)(unsafe.Pointer(&in.ForbiddenSysctls)) + out.AllowedProcMountTypes = *(*[]v1.ProcMountType)(unsafe.Pointer(&in.AllowedProcMountTypes)) return nil } diff --git a/pkg/apis/policy/v1beta1/zz_generated.conversion.go b/pkg/apis/policy/v1beta1/zz_generated.conversion.go index 813f0b37104..572cbfe1b0f 100644 --- a/pkg/apis/policy/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/policy/v1beta1/zz_generated.conversion.go @@ -540,6 +540,7 @@ func autoConvert_v1beta1_PodSecurityPolicySpec_To_policy_PodSecurityPolicySpec(i out.AllowedFlexVolumes = *(*[]policy.AllowedFlexVolume)(unsafe.Pointer(&in.AllowedFlexVolumes)) out.AllowedUnsafeSysctls = *(*[]string)(unsafe.Pointer(&in.AllowedUnsafeSysctls)) out.ForbiddenSysctls = *(*[]string)(unsafe.Pointer(&in.ForbiddenSysctls)) + out.AllowedProcMountTypes = *(*[]core.ProcMountType)(unsafe.Pointer(&in.AllowedProcMountTypes)) return nil } @@ -579,6 +580,7 @@ func autoConvert_policy_PodSecurityPolicySpec_To_v1beta1_PodSecurityPolicySpec(i out.AllowedFlexVolumes = *(*[]v1beta1.AllowedFlexVolume)(unsafe.Pointer(&in.AllowedFlexVolumes)) out.AllowedUnsafeSysctls = *(*[]string)(unsafe.Pointer(&in.AllowedUnsafeSysctls)) out.ForbiddenSysctls = *(*[]string)(unsafe.Pointer(&in.ForbiddenSysctls)) + out.AllowedProcMountTypes = *(*[]corev1.ProcMountType)(unsafe.Pointer(&in.AllowedProcMountTypes)) return nil } diff --git a/pkg/apis/policy/zz_generated.deepcopy.go b/pkg/apis/policy/zz_generated.deepcopy.go index 3d7fa85a73c..b0cfe752890 100644 --- a/pkg/apis/policy/zz_generated.deepcopy.go +++ b/pkg/apis/policy/zz_generated.deepcopy.go @@ -375,6 +375,11 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowedProcMountTypes != nil { + in, out := &in.AllowedProcMountTypes, &out.AllowedProcMountTypes + *out = make([]core.ProcMountType, len(*in)) + copy(*out, *in) + } return } diff --git a/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go b/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go index 6082f9efcd3..ca0cb6a918d 100644 --- a/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go +++ b/pkg/kubelet/apis/cri/runtime/v1alpha2/api.pb.go @@ -26836,299 +26836,300 @@ var ( func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } var fileDescriptorApi = []byte{ - // 4698 bytes of a gzipped FileDescriptorProto + // 4708 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5c, 0xcd, 0x6f, 0x1b, 0x49, - 0x76, 0x57, 0x93, 0xfa, 0x20, 0x1f, 0x45, 0x89, 0x2a, 0xcb, 0x16, 0x4d, 0xdb, 0xb2, 0xd5, 0x1e, - 0x7f, 0xce, 0x58, 0x1e, 0x6b, 0x76, 0x3d, 0xb1, 0x3d, 0x6b, 0x9b, 0x96, 0x64, 0x9b, 0x59, 0x9b, - 0x52, 0x9a, 0xd2, 0x7c, 0xec, 0x0c, 0xd0, 0xdb, 0x62, 0x97, 0xa8, 0x5e, 0x93, 0x5d, 0x3d, 0xdd, - 0x4d, 0xdb, 0x4a, 0x80, 0x60, 0x81, 0x20, 0x7b, 0x08, 0x10, 0x20, 0xe7, 0x1c, 0x37, 0x87, 0x1c, - 0x72, 0x0b, 0x10, 0xe4, 0x90, 0xd3, 0x06, 0x7b, 0xd8, 0x4b, 0x80, 0x9c, 0x16, 0xf9, 0xb8, 0x64, - 0x26, 0xc9, 0x25, 0x87, 0x20, 0x7f, 0x40, 0x0e, 0x41, 0x7d, 0x35, 0xfb, 0x93, 0x1f, 0x1e, 0xef, - 0xce, 0xe4, 0xa4, 0xae, 0xd7, 0xef, 0xbd, 0x7a, 0xf5, 0xea, 0xf5, 0xab, 0x57, 0xbf, 0x2a, 0x0a, - 0x8a, 0x86, 0x63, 0xad, 0x3b, 0x2e, 0xf1, 0x09, 0xaa, 0xb8, 0x7d, 0xdb, 0xb7, 0x7a, 0x78, 0xfd, - 0xe5, 0x2d, 0xa3, 0xeb, 0x1c, 0x19, 0x1b, 0xb5, 0x1b, 0x1d, 0xcb, 0x3f, 0xea, 0x1f, 0xac, 0xb7, - 0x49, 0xef, 0x66, 0x87, 0x74, 0xc8, 0x4d, 0xc6, 0x78, 0xd0, 0x3f, 0x64, 0x2d, 0xd6, 0x60, 0x4f, - 0x5c, 0x81, 0x7a, 0x1d, 0x16, 0x3e, 0xc6, 0xae, 0x67, 0x11, 0x5b, 0xc3, 0x5f, 0xf6, 0xb1, 0xe7, - 0xa3, 0x2a, 0xcc, 0xbd, 0xe4, 0x94, 0xaa, 0x72, 0x41, 0xb9, 0x5a, 0xd4, 0x64, 0x53, 0xfd, 0x4b, - 0x05, 0x16, 0x03, 0x66, 0xcf, 0x21, 0xb6, 0x87, 0xb3, 0xb9, 0xd1, 0x1a, 0xcc, 0x0b, 0xe3, 0x74, - 0xdb, 0xe8, 0xe1, 0x6a, 0x8e, 0xbd, 0x2e, 0x09, 0x5a, 0xd3, 0xe8, 0x61, 0x74, 0x05, 0x16, 0x25, - 0x8b, 0x54, 0x92, 0x67, 0x5c, 0x0b, 0x82, 0x2c, 0x7a, 0x43, 0xeb, 0x70, 0x42, 0x32, 0x1a, 0x8e, - 0x15, 0x30, 0x4f, 0x33, 0xe6, 0x25, 0xf1, 0xaa, 0xee, 0x58, 0x82, 0x5f, 0xfd, 0x1c, 0x8a, 0x5b, - 0xcd, 0xd6, 0x26, 0xb1, 0x0f, 0xad, 0x0e, 0x35, 0xd1, 0xc3, 0x2e, 0x95, 0xa9, 0x2a, 0x17, 0xf2, - 0xd4, 0x44, 0xd1, 0x44, 0x35, 0x28, 0x78, 0xd8, 0x70, 0xdb, 0x47, 0xd8, 0xab, 0xe6, 0xd8, 0xab, - 0xa0, 0x4d, 0xa5, 0x88, 0xe3, 0x5b, 0xc4, 0xf6, 0xaa, 0x79, 0x2e, 0x25, 0x9a, 0xea, 0xcf, 0x15, - 0x28, 0xed, 0x12, 0xd7, 0x7f, 0x6e, 0x38, 0x8e, 0x65, 0x77, 0xd0, 0x6d, 0x28, 0x30, 0x5f, 0xb6, - 0x49, 0x97, 0xf9, 0x60, 0x61, 0xa3, 0xb6, 0x1e, 0x9f, 0x96, 0xf5, 0x5d, 0xc1, 0xa1, 0x05, 0xbc, - 0xe8, 0x12, 0x2c, 0xb4, 0x89, 0xed, 0x1b, 0x96, 0x8d, 0x5d, 0xdd, 0x21, 0xae, 0xcf, 0x5c, 0x34, - 0xa3, 0x95, 0x03, 0x2a, 0xed, 0x05, 0x9d, 0x81, 0xe2, 0x11, 0xf1, 0x7c, 0xce, 0x91, 0x67, 0x1c, - 0x05, 0x4a, 0x60, 0x2f, 0x57, 0x60, 0x8e, 0xbd, 0xb4, 0x1c, 0xe1, 0x8c, 0x59, 0xda, 0x6c, 0x38, - 0xea, 0xaf, 0x15, 0x98, 0x79, 0x4e, 0xfa, 0xb6, 0x1f, 0xeb, 0xc6, 0xf0, 0x8f, 0xc4, 0x44, 0x85, - 0xba, 0x31, 0xfc, 0xa3, 0x41, 0x37, 0x94, 0x83, 0xcf, 0x15, 0xef, 0x86, 0xbe, 0xac, 0x41, 0xc1, - 0xc5, 0x86, 0x49, 0xec, 0xee, 0x31, 0x33, 0xa1, 0xa0, 0x05, 0x6d, 0x3a, 0x89, 0x1e, 0xee, 0x5a, - 0x76, 0xff, 0xb5, 0xee, 0xe2, 0xae, 0x71, 0x80, 0xbb, 0xcc, 0x94, 0x82, 0xb6, 0x20, 0xc8, 0x1a, - 0xa7, 0xa2, 0x2d, 0x28, 0x39, 0x2e, 0x71, 0x8c, 0x8e, 0x41, 0xfd, 0x58, 0x9d, 0x61, 0xae, 0x52, - 0x93, 0xae, 0x62, 0x66, 0xef, 0x0e, 0x38, 0xb5, 0xb0, 0x98, 0xfa, 0xd7, 0x0a, 0x2c, 0xd2, 0xe0, - 0xf1, 0x1c, 0xa3, 0x8d, 0x77, 0xd8, 0x94, 0xa0, 0x3b, 0x30, 0x67, 0x63, 0xff, 0x15, 0x71, 0x5f, - 0x88, 0x09, 0x38, 0x9f, 0xd4, 0x1a, 0xc8, 0x3c, 0x27, 0x26, 0xd6, 0x24, 0x3f, 0xba, 0x05, 0x79, - 0xc7, 0x32, 0xd9, 0x80, 0xc7, 0x10, 0xa3, 0xbc, 0x54, 0xc4, 0x72, 0xda, 0xcc, 0x0f, 0xe3, 0x88, - 0x58, 0x4e, 0x5b, 0x55, 0x01, 0x1a, 0xb6, 0x7f, 0xfb, 0x7b, 0x1f, 0x1b, 0xdd, 0x3e, 0x46, 0xcb, - 0x30, 0xf3, 0x92, 0x3e, 0x30, 0x63, 0xf3, 0x1a, 0x6f, 0xa8, 0x5f, 0xe5, 0xe1, 0xcc, 0x33, 0xea, - 0xaf, 0x96, 0x61, 0x9b, 0x07, 0xe4, 0x75, 0x0b, 0xb7, 0xfb, 0xae, 0xe5, 0x1f, 0x6f, 0x12, 0xdb, - 0xc7, 0xaf, 0x7d, 0xd4, 0x84, 0x25, 0x5b, 0x6a, 0xd6, 0x65, 0x68, 0x52, 0x0d, 0xa5, 0x8d, 0xb5, - 0x21, 0x46, 0x70, 0x17, 0x69, 0x15, 0x3b, 0x4a, 0xf0, 0xd0, 0xd3, 0xc1, 0xbc, 0x49, 0x6d, 0x39, - 0xa6, 0x2d, 0x65, 0x48, 0xad, 0x6d, 0x66, 0x99, 0xd0, 0x25, 0x27, 0x56, 0x6a, 0xfa, 0x08, 0xe8, - 0x57, 0xad, 0x1b, 0x9e, 0xde, 0xf7, 0xb0, 0xcb, 0x1c, 0x53, 0xda, 0x38, 0x9b, 0xd4, 0x32, 0x70, - 0x81, 0x56, 0x74, 0xfb, 0x76, 0xdd, 0xdb, 0xf7, 0xb0, 0xcb, 0x92, 0x80, 0x88, 0x25, 0xdd, 0x25, - 0xc4, 0x3f, 0xf4, 0x64, 0xfc, 0x48, 0xb2, 0xc6, 0xa8, 0xe8, 0x26, 0x9c, 0xf0, 0xfa, 0x8e, 0xd3, - 0xc5, 0x3d, 0x6c, 0xfb, 0x46, 0x57, 0xef, 0xb8, 0xa4, 0xef, 0x78, 0xd5, 0x99, 0x0b, 0xf9, 0xab, - 0x79, 0x0d, 0x85, 0x5f, 0x3d, 0x61, 0x6f, 0xd0, 0x2a, 0x80, 0xe3, 0x5a, 0x2f, 0xad, 0x2e, 0xee, - 0x60, 0xb3, 0x3a, 0xcb, 0x94, 0x86, 0x28, 0xe8, 0x7d, 0x58, 0xf6, 0x70, 0xbb, 0x4d, 0x7a, 0x8e, - 0xee, 0xb8, 0xe4, 0xd0, 0xea, 0x62, 0x1e, 0xfd, 0x73, 0x2c, 0xfa, 0x91, 0x78, 0xb7, 0xcb, 0x5f, - 0xb1, 0xef, 0xe0, 0x3e, 0xcb, 0x69, 0x74, 0xa4, 0xac, 0xf3, 0x6a, 0x61, 0x8c, 0xa1, 0x02, 0x1b, - 0x2a, 0x33, 0x49, 0xfd, 0x79, 0x0e, 0x4e, 0x32, 0x4f, 0xee, 0x12, 0x53, 0x4c, 0xb3, 0x48, 0x52, - 0x17, 0xa1, 0xdc, 0x66, 0x3a, 0x75, 0xc7, 0x70, 0xb1, 0xed, 0x8b, 0x8f, 0x74, 0x9e, 0x13, 0x77, - 0x19, 0x0d, 0x7d, 0x0a, 0x15, 0x4f, 0x44, 0x85, 0xde, 0xe6, 0x61, 0x21, 0xe6, 0xec, 0x46, 0xd2, - 0x84, 0x21, 0xb1, 0xa4, 0x2d, 0x7a, 0x89, 0xe0, 0x9a, 0xf3, 0x8e, 0xbd, 0xb6, 0xdf, 0xe5, 0xd9, - 0xae, 0xb4, 0xf1, 0xbd, 0x0c, 0x85, 0x71, 0xc3, 0xd7, 0x5b, 0x5c, 0x6c, 0xdb, 0xf6, 0xdd, 0x63, - 0x4d, 0x2a, 0xa9, 0xdd, 0x85, 0xf9, 0xf0, 0x0b, 0x54, 0x81, 0xfc, 0x0b, 0x7c, 0x2c, 0x06, 0x45, - 0x1f, 0x07, 0x1f, 0x01, 0xcf, 0x35, 0xbc, 0x71, 0x37, 0xf7, 0x3b, 0x8a, 0xea, 0x02, 0x1a, 0xf4, - 0xf2, 0x1c, 0xfb, 0x86, 0x69, 0xf8, 0x06, 0x42, 0x30, 0xcd, 0x96, 0x11, 0xae, 0x82, 0x3d, 0x53, - 0xad, 0x7d, 0xf1, 0xf1, 0x16, 0x35, 0xfa, 0x88, 0xce, 0x42, 0x31, 0x08, 0x74, 0xb1, 0x96, 0x0c, - 0x08, 0x34, 0xa7, 0x1b, 0xbe, 0x8f, 0x7b, 0x8e, 0xcf, 0x42, 0xac, 0xac, 0xc9, 0xa6, 0xfa, 0xdf, - 0xd3, 0x50, 0x49, 0xcc, 0xc9, 0x43, 0x28, 0xf4, 0x44, 0xf7, 0xe2, 0x43, 0x7b, 0x27, 0x25, 0xb1, - 0x27, 0x4c, 0xd5, 0x02, 0x29, 0x9a, 0x37, 0x69, 0x0e, 0x0d, 0xad, 0x7f, 0x41, 0x9b, 0xce, 0x78, - 0x97, 0x74, 0x74, 0xd3, 0x72, 0x71, 0xdb, 0x27, 0xee, 0xb1, 0x30, 0x77, 0xbe, 0x4b, 0x3a, 0x5b, - 0x92, 0x86, 0xee, 0x02, 0x98, 0xb6, 0x47, 0x27, 0xfb, 0xd0, 0xea, 0x30, 0xa3, 0x4b, 0x1b, 0x67, - 0x92, 0x46, 0x04, 0x8b, 0x9d, 0x56, 0x34, 0x6d, 0x4f, 0x98, 0xff, 0x08, 0xca, 0x74, 0xcd, 0xd0, - 0x7b, 0x7c, 0x9d, 0xe2, 0x5f, 0x4a, 0x69, 0xe3, 0x5c, 0xda, 0x18, 0x82, 0xd5, 0x4c, 0x9b, 0x77, - 0x06, 0x0d, 0x0f, 0x3d, 0x86, 0x59, 0x96, 0xbc, 0xbd, 0xea, 0x2c, 0x13, 0x5e, 0x1f, 0xe6, 0x00, - 0x11, 0x11, 0xcf, 0x98, 0x00, 0x0f, 0x08, 0x21, 0x8d, 0xf6, 0xa1, 0x64, 0xd8, 0x36, 0xf1, 0x0d, - 0x9e, 0x68, 0xe6, 0x98, 0xb2, 0x0f, 0xc6, 0x50, 0x56, 0x1f, 0x48, 0x71, 0x8d, 0x61, 0x3d, 0xe8, - 0x07, 0x30, 0xc3, 0x32, 0x91, 0xf8, 0x10, 0xaf, 0x8c, 0x19, 0xb4, 0x1a, 0x97, 0xaa, 0xdd, 0x81, - 0x52, 0xc8, 0xd8, 0x49, 0x82, 0xb4, 0x76, 0x1f, 0x2a, 0x71, 0xd3, 0x26, 0x0a, 0xf2, 0x3f, 0x80, - 0x65, 0xad, 0x6f, 0x0f, 0x0c, 0x93, 0xd5, 0xd7, 0x5d, 0x98, 0x15, 0x93, 0xcd, 0x23, 0x4e, 0x1d, - 0xed, 0x23, 0x4d, 0x48, 0x84, 0xcb, 0xa9, 0x23, 0xc3, 0x36, 0xbb, 0xd8, 0x15, 0xfd, 0xca, 0x72, - 0xea, 0x29, 0xa7, 0xaa, 0x3f, 0x80, 0x93, 0xb1, 0xce, 0x45, 0x35, 0xf7, 0x0e, 0x2c, 0x38, 0xc4, - 0xd4, 0x3d, 0x4e, 0xd6, 0x2d, 0x53, 0xa6, 0x21, 0x27, 0xe0, 0x6d, 0x98, 0x54, 0xbc, 0xe5, 0x13, - 0x27, 0x69, 0xfc, 0x78, 0xe2, 0x55, 0x38, 0x15, 0x17, 0xe7, 0xdd, 0xab, 0x0f, 0x60, 0x45, 0xc3, - 0x3d, 0xf2, 0x12, 0xbf, 0xa9, 0xea, 0x1a, 0x54, 0x93, 0x0a, 0x84, 0xf2, 0xcf, 0x60, 0x65, 0x40, - 0x6d, 0xf9, 0x86, 0xdf, 0xf7, 0x26, 0x52, 0x2e, 0x4a, 0xdd, 0x03, 0xe2, 0xf1, 0xe9, 0x2c, 0x68, - 0xb2, 0xa9, 0x5e, 0x0b, 0xab, 0x6e, 0xf2, 0xca, 0x82, 0xf7, 0x80, 0x16, 0x20, 0x67, 0x39, 0x42, - 0x5d, 0xce, 0x72, 0xd4, 0xa7, 0x50, 0x0c, 0x96, 0x66, 0x74, 0x6f, 0x50, 0x63, 0xe6, 0xc6, 0x5d, - 0xc8, 0x83, 0x32, 0x74, 0x2f, 0xb1, 0x94, 0x88, 0x2e, 0xef, 0x01, 0x04, 0x29, 0x4f, 0x56, 0x08, - 0x67, 0x86, 0x28, 0xd6, 0x42, 0xec, 0xea, 0xbf, 0x44, 0x12, 0x61, 0x68, 0x10, 0x66, 0x30, 0x08, - 0x33, 0x92, 0x18, 0x73, 0x6f, 0x94, 0x18, 0x3f, 0x84, 0x19, 0xcf, 0x37, 0x7c, 0x2c, 0xaa, 0xa8, - 0xb5, 0x61, 0xe2, 0xd4, 0x08, 0xac, 0x71, 0x7e, 0x74, 0x0e, 0xa0, 0xed, 0x62, 0xc3, 0xc7, 0xa6, - 0x6e, 0xf0, 0x2c, 0x9e, 0xd7, 0x8a, 0x82, 0x52, 0xf7, 0xd1, 0xe6, 0xa0, 0x12, 0x9c, 0x61, 0x86, - 0x5d, 0x1b, 0xa6, 0x39, 0x32, 0x55, 0x83, 0x9a, 0x30, 0xc8, 0x2a, 0xb3, 0x63, 0x66, 0x15, 0xa1, - 0x80, 0x4b, 0x85, 0x72, 0xe6, 0xdc, 0xe8, 0x9c, 0xc9, 0x45, 0xc7, 0xc9, 0x99, 0x85, 0xd1, 0x39, - 0x53, 0x28, 0x1b, 0x9a, 0x33, 0xbf, 0xcd, 0xa4, 0xf7, 0xcf, 0x0a, 0x54, 0x93, 0xdf, 0xa0, 0xc8, - 0x3d, 0x77, 0x61, 0xd6, 0x63, 0x94, 0x71, 0x32, 0x9f, 0x90, 0x15, 0x12, 0xe8, 0x29, 0x4c, 0x5b, - 0xf6, 0x21, 0x61, 0x9b, 0xb8, 0xd4, 0xda, 0x25, 0xab, 0xd7, 0xf5, 0x86, 0x7d, 0x48, 0xb8, 0x93, - 0x98, 0x86, 0xda, 0x87, 0x50, 0x0c, 0x48, 0x13, 0x8d, 0x6d, 0x07, 0x96, 0x63, 0x21, 0xcb, 0x8b, - 0xfd, 0x20, 0xd2, 0x95, 0xc9, 0x22, 0x5d, 0xfd, 0x69, 0x2e, 0xfc, 0x25, 0x3e, 0xb6, 0xba, 0x3e, - 0x76, 0x13, 0x5f, 0xe2, 0x47, 0x52, 0x3b, 0xff, 0x0c, 0x2f, 0x8f, 0xd4, 0xce, 0x6b, 0x52, 0xf1, - 0x31, 0x7d, 0x01, 0x0b, 0x2c, 0xd6, 0x74, 0x0f, 0x77, 0x59, 0xc1, 0x21, 0x8a, 0xbf, 0xef, 0x0f, - 0x53, 0xc3, 0x2d, 0xe1, 0x11, 0xdb, 0x12, 0x72, 0xdc, 0x83, 0xe5, 0x6e, 0x98, 0x56, 0x7b, 0x08, - 0x28, 0xc9, 0x34, 0x91, 0x4f, 0x5b, 0x34, 0xc5, 0xd1, 0x9d, 0x6e, 0xca, 0x2a, 0x79, 0xc8, 0xcc, - 0x18, 0x27, 0x56, 0xb8, 0xc1, 0x9a, 0x90, 0x50, 0x7f, 0x99, 0x07, 0x18, 0xbc, 0xfc, 0x7f, 0x94, - 0xdb, 0x1e, 0x06, 0x79, 0x85, 0x17, 0x72, 0x57, 0x87, 0x29, 0x4e, 0xcd, 0x28, 0x3b, 0xd1, 0x8c, - 0xc2, 0x4b, 0xba, 0x1b, 0x43, 0xd5, 0x7c, 0x67, 0x73, 0xc9, 0x33, 0x38, 0x15, 0x8f, 0x0d, 0x91, - 0x48, 0x36, 0x60, 0xc6, 0xf2, 0x71, 0x8f, 0xa3, 0x3d, 0xa9, 0xbb, 0xb3, 0x90, 0x10, 0x67, 0x55, - 0xd7, 0xa0, 0xd8, 0xe8, 0x19, 0x1d, 0xdc, 0x72, 0x70, 0x9b, 0x76, 0x6a, 0xd1, 0x86, 0x30, 0x84, - 0x37, 0xd4, 0x0d, 0x28, 0xfc, 0x10, 0x1f, 0xf3, 0x8f, 0x7a, 0x4c, 0x43, 0xd5, 0x3f, 0xcd, 0xc1, - 0x0a, 0x5b, 0x2b, 0x36, 0x25, 0xd6, 0xa2, 0x61, 0x8f, 0xf4, 0xdd, 0x36, 0xf6, 0xd8, 0x6c, 0x3b, - 0x7d, 0xdd, 0xc1, 0xae, 0x45, 0x4c, 0x01, 0x05, 0x14, 0xdb, 0x4e, 0x7f, 0x97, 0x11, 0xd0, 0x19, - 0xa0, 0x0d, 0xfd, 0xcb, 0x3e, 0x11, 0x81, 0x98, 0xd7, 0x0a, 0x6d, 0xa7, 0xff, 0x7b, 0xb4, 0x2d, - 0x65, 0xbd, 0x23, 0xc3, 0xc5, 0x1e, 0x8b, 0x33, 0x2e, 0xdb, 0x62, 0x04, 0x74, 0x0b, 0x4e, 0xf6, - 0x70, 0x8f, 0xb8, 0xc7, 0x7a, 0xd7, 0xea, 0x59, 0xbe, 0x6e, 0xd9, 0xfa, 0xc1, 0xb1, 0x8f, 0x3d, - 0x11, 0x53, 0x88, 0xbf, 0x7c, 0x46, 0xdf, 0x35, 0xec, 0x47, 0xf4, 0x0d, 0x52, 0xa1, 0x4c, 0x48, - 0x4f, 0xf7, 0xda, 0xc4, 0xc5, 0xba, 0x61, 0xfe, 0x84, 0x2d, 0x9f, 0x79, 0xad, 0x44, 0x48, 0xaf, - 0x45, 0x69, 0x75, 0xf3, 0x27, 0xe8, 0x3c, 0x94, 0xda, 0x4e, 0xdf, 0xc3, 0xbe, 0x4e, 0xff, 0xb0, - 0xd5, 0xb1, 0xa8, 0x01, 0x27, 0x6d, 0x3a, 0x7d, 0x2f, 0xc4, 0xd0, 0xa3, 0xfe, 0x9f, 0x0b, 0x33, - 0x3c, 0xa7, 0x6e, 0x36, 0xa0, 0x1c, 0x81, 0x12, 0xe8, 0xae, 0x8e, 0x61, 0x06, 0x62, 0x57, 0x47, - 0x9f, 0x29, 0xcd, 0x25, 0x5d, 0xe9, 0x49, 0xf6, 0x4c, 0x69, 0xfe, 0xb1, 0x23, 0xb7, 0x74, 0xec, - 0x99, 0xba, 0xbc, 0x8b, 0x5f, 0x0a, 0xb8, 0xa9, 0xa8, 0xf1, 0x86, 0x6a, 0x02, 0x6c, 0x1a, 0x8e, - 0x71, 0x60, 0x75, 0x2d, 0xff, 0x18, 0x5d, 0x83, 0x8a, 0x61, 0x9a, 0x7a, 0x5b, 0x52, 0x2c, 0x2c, - 0x41, 0xc0, 0x45, 0xc3, 0x34, 0x37, 0x43, 0x64, 0xf4, 0x2e, 0x2c, 0x99, 0x2e, 0x71, 0xa2, 0xbc, - 0x1c, 0x15, 0xac, 0xd0, 0x17, 0x61, 0x66, 0xf5, 0x3f, 0x66, 0xe0, 0x5c, 0x74, 0x62, 0xe3, 0x70, - 0xcd, 0x43, 0x98, 0x8f, 0xf5, 0x9a, 0x01, 0x15, 0x0c, 0xac, 0xd5, 0x22, 0x12, 0x31, 0xf8, 0x22, - 0x97, 0x80, 0x2f, 0x52, 0x01, 0xa1, 0xfc, 0x5b, 0x05, 0x84, 0xa6, 0xdf, 0x0a, 0x20, 0x34, 0x33, - 0x19, 0x20, 0x74, 0x99, 0x6d, 0x63, 0xa4, 0x34, 0xdb, 0x3b, 0xf3, 0x50, 0x2b, 0x07, 0x3c, 0xb6, - 0x44, 0x8f, 0x63, 0xc0, 0xd1, 0xdc, 0x24, 0xc0, 0x51, 0x21, 0x13, 0x38, 0xa2, 0x51, 0xe3, 0x38, - 0x86, 0xdb, 0x23, 0xae, 0x44, 0x86, 0xaa, 0x45, 0x66, 0xc2, 0xa2, 0xa4, 0x0b, 0x54, 0x28, 0x13, - 0x43, 0x82, 0x4c, 0x0c, 0xe9, 0x02, 0xcc, 0xdb, 0x44, 0xb7, 0xf1, 0x2b, 0x9d, 0xce, 0xa5, 0x57, - 0x2d, 0xf1, 0x89, 0xb5, 0x49, 0x13, 0xbf, 0xda, 0xa5, 0x94, 0x04, 0xca, 0x34, 0x3f, 0x19, 0xca, - 0x84, 0xd6, 0x60, 0xbe, 0x67, 0x78, 0x2f, 0xb0, 0xc9, 0x4c, 0xf1, 0xaa, 0x65, 0x16, 0xc4, 0x25, - 0x4e, 0xa3, 0x36, 0x78, 0xe8, 0x12, 0x04, 0x4e, 0x12, 0x4c, 0x0b, 0x8c, 0xa9, 0x2c, 0xa9, 0x8c, - 0x4d, 0xfd, 0x3b, 0x05, 0x96, 0xa3, 0x61, 0x2e, 0xb0, 0x85, 0x27, 0x50, 0x74, 0x65, 0x26, 0x13, - 0xa1, 0x7d, 0x2d, 0xa3, 0x4c, 0x4e, 0xa6, 0x3e, 0x6d, 0x20, 0x8b, 0x7e, 0x94, 0x09, 0x69, 0xdd, - 0x1c, 0xa5, 0x6f, 0x14, 0xa8, 0xa5, 0x36, 0xe0, 0xfc, 0x27, 0x96, 0x6d, 0x92, 0x57, 0x5e, 0xe6, - 0x57, 0x9a, 0x12, 0x6b, 0x4a, 0x4a, 0xac, 0xa9, 0xbf, 0x50, 0xe0, 0x54, 0x5c, 0x97, 0x70, 0x45, - 0x23, 0xe9, 0x8a, 0x77, 0x93, 0xa6, 0xc7, 0x85, 0x53, 0x9d, 0xf1, 0x45, 0xa6, 0x33, 0x6e, 0x8d, - 0xd6, 0x38, 0xd2, 0x1d, 0x7f, 0xa5, 0xc0, 0xe9, 0x4c, 0x33, 0x62, 0x4b, 0x8a, 0x12, 0x5f, 0x52, - 0xc4, 0x72, 0xd4, 0x26, 0x7d, 0xdb, 0x0f, 0x2d, 0x47, 0x9b, 0xec, 0x88, 0x81, 0xe7, 0x7d, 0xbd, - 0x67, 0xbc, 0xb6, 0x7a, 0xfd, 0x9e, 0x58, 0x8f, 0xa8, 0xba, 0xe7, 0x9c, 0xf2, 0x06, 0x0b, 0x92, - 0x5a, 0x87, 0xa5, 0xc0, 0xca, 0xa1, 0x20, 0x60, 0x08, 0xd4, 0xcb, 0x45, 0x41, 0x3d, 0x1b, 0x66, - 0xb7, 0xf0, 0x4b, 0xab, 0x8d, 0xdf, 0xca, 0x19, 0xc8, 0x05, 0x28, 0x39, 0xd8, 0xed, 0x59, 0x9e, - 0x17, 0x24, 0xda, 0xa2, 0x16, 0x26, 0xa9, 0xff, 0x39, 0x0b, 0x8b, 0xf1, 0xe8, 0x78, 0x90, 0xc0, - 0x10, 0x2f, 0xa6, 0x2c, 0x01, 0xf1, 0x81, 0x86, 0xaa, 0xc9, 0x5b, 0xb2, 0x18, 0xc9, 0x65, 0x6d, - 0xe4, 0x83, 0xc2, 0x45, 0x54, 0x2a, 0xd4, 0x23, 0x6d, 0xd2, 0xeb, 0x19, 0xb6, 0x29, 0x8f, 0xae, - 0x44, 0x93, 0xfa, 0xcf, 0x70, 0x3b, 0xd4, 0xed, 0x94, 0xcc, 0x9e, 0xe9, 0xe4, 0xd1, 0x5d, 0xaf, - 0x65, 0x33, 0x2c, 0x92, 0x25, 0xeb, 0xa2, 0x06, 0x82, 0xb4, 0x65, 0xb9, 0x68, 0x1d, 0xa6, 0xb1, - 0xfd, 0x52, 0x96, 0x8b, 0x29, 0x67, 0x5b, 0xb2, 0x2c, 0xd2, 0x18, 0x1f, 0xba, 0x09, 0xb3, 0x3d, - 0x1a, 0x16, 0x72, 0xff, 0xbb, 0x92, 0x71, 0xc4, 0xa3, 0x09, 0x36, 0xb4, 0x01, 0x73, 0x26, 0x9b, - 0x27, 0xb9, 0xc9, 0xad, 0xa6, 0x20, 0x9c, 0x8c, 0x41, 0x93, 0x8c, 0x68, 0x3b, 0x28, 0x86, 0x8b, - 0x59, 0x55, 0x6c, 0x6c, 0x2a, 0x52, 0x2b, 0xe2, 0xbd, 0x68, 0x45, 0x0c, 0x4c, 0xd7, 0xc6, 0x68, - 0x5d, 0xc3, 0x61, 0xc9, 0xd3, 0x50, 0xe8, 0x92, 0x0e, 0x0f, 0xa3, 0x12, 0x3f, 0x15, 0xed, 0x92, - 0x0e, 0x8b, 0xa2, 0x65, 0xba, 0x39, 0x30, 0x2d, 0x9b, 0x25, 0xf5, 0x82, 0xc6, 0x1b, 0xf4, 0xe3, - 0x63, 0x0f, 0x3a, 0xb1, 0xdb, 0xb8, 0x5a, 0x66, 0xaf, 0x8a, 0x8c, 0xb2, 0x63, 0xb7, 0x59, 0xb9, - 0xe9, 0xfb, 0xc7, 0xd5, 0x05, 0x46, 0xa7, 0x8f, 0x74, 0xdf, 0xc7, 0x21, 0x8a, 0xc5, 0xac, 0x7d, - 0x5f, 0x5a, 0xda, 0x96, 0x08, 0xc5, 0x23, 0x98, 0x7b, 0xc5, 0x13, 0x41, 0xb5, 0xc2, 0xe4, 0xaf, - 0x8e, 0x4e, 0x2f, 0x42, 0x83, 0x14, 0xfc, 0x36, 0x4b, 0xff, 0x5f, 0x2a, 0x70, 0x6a, 0x93, 0x6d, - 0x8b, 0x42, 0x79, 0x6c, 0x12, 0x24, 0xef, 0x4e, 0x00, 0xb2, 0x66, 0xc2, 0x6e, 0xf1, 0x71, 0x4b, - 0x8c, 0xb5, 0x01, 0x0b, 0x52, 0xb9, 0x50, 0x91, 0x1f, 0x1b, 0xa7, 0x2d, 0x7b, 0xe1, 0xa6, 0xfa, - 0x11, 0xac, 0x24, 0x46, 0x21, 0xb6, 0x30, 0x6b, 0x30, 0x3f, 0xc8, 0x57, 0xc1, 0x20, 0x4a, 0x01, - 0xad, 0x61, 0xaa, 0x77, 0xe1, 0x64, 0xcb, 0x37, 0x5c, 0x3f, 0xe1, 0x82, 0x31, 0x64, 0x19, 0x02, - 0x1b, 0x95, 0x15, 0x20, 0x69, 0x0b, 0x96, 0x5b, 0x3e, 0x71, 0xde, 0x40, 0x29, 0xcd, 0x3a, 0x74, - 0xfc, 0xa4, 0x2f, 0xd7, 0x07, 0xd9, 0x54, 0x57, 0x38, 0x5e, 0x9c, 0xec, 0xed, 0x1e, 0x9c, 0xe2, - 0x70, 0xed, 0x9b, 0x0c, 0xe2, 0xb4, 0x04, 0x8b, 0x93, 0x7a, 0x9f, 0xc3, 0x89, 0xc1, 0xb2, 0x38, - 0x80, 0x62, 0x6e, 0x47, 0xa1, 0x98, 0x0b, 0x43, 0x66, 0x3d, 0x82, 0xc4, 0xfc, 0x45, 0x2e, 0x94, - 0xd7, 0x33, 0x80, 0x98, 0x7b, 0x51, 0x20, 0xe6, 0xd2, 0x28, 0xdd, 0x11, 0x1c, 0x26, 0x19, 0xb5, - 0xf9, 0x94, 0xa8, 0xfd, 0x3c, 0x81, 0xd6, 0x4c, 0x67, 0xc1, 0x5d, 0x31, 0x6b, 0x7f, 0x2b, 0x60, - 0x8d, 0xc6, 0xc1, 0x9a, 0xa0, 0xeb, 0x00, 0x5d, 0xbf, 0x13, 0x03, 0x6b, 0xd6, 0x46, 0xda, 0x1b, - 0x60, 0x35, 0x7f, 0x33, 0x0d, 0xc5, 0xe0, 0x5d, 0xc2, 0xe7, 0x49, 0xb7, 0xe5, 0x52, 0xdc, 0x16, - 0x5e, 0x81, 0xf3, 0xdf, 0x68, 0x05, 0x9e, 0x1e, 0x7b, 0x05, 0x3e, 0x03, 0x45, 0xf6, 0xa0, 0xbb, - 0xf8, 0x50, 0xac, 0xa8, 0x05, 0x46, 0xd0, 0xf0, 0xe1, 0x20, 0x0c, 0x67, 0x27, 0x0a, 0xc3, 0x18, - 0x3c, 0x34, 0x17, 0x87, 0x87, 0x1e, 0x04, 0x2b, 0x22, 0x5f, 0x44, 0xaf, 0x0c, 0xd1, 0x9b, 0xba, - 0x16, 0x36, 0xa3, 0x6b, 0x21, 0x5f, 0x57, 0xdf, 0x1b, 0xa6, 0xe5, 0x3b, 0x0b, 0x0e, 0xed, 0x73, - 0x70, 0x28, 0x1c, 0x8b, 0x22, 0xb3, 0xde, 0x03, 0x08, 0x92, 0x88, 0x44, 0x88, 0xce, 0x0c, 0x19, - 0xa3, 0x16, 0x62, 0xa7, 0x6a, 0x23, 0x53, 0x33, 0x38, 0x41, 0x1a, 0x2f, 0x3f, 0x66, 0x1c, 0x1f, - 0xfd, 0xef, 0x4c, 0x28, 0xbf, 0x64, 0x1c, 0xb9, 0x3c, 0x48, 0xc0, 0x92, 0x13, 0x46, 0xf1, 0xed, - 0x28, 0x2a, 0xf9, 0x86, 0x51, 0x97, 0x00, 0x25, 0x59, 0xe5, 0x62, 0xb8, 0xe2, 0x35, 0x07, 0x8d, - 0x8a, 0x82, 0x52, 0x67, 0x3b, 0x83, 0x43, 0xcb, 0xb6, 0xbc, 0x23, 0xfe, 0x7e, 0x96, 0xef, 0x0c, - 0x24, 0xa9, 0xce, 0x6e, 0x37, 0xe1, 0xd7, 0x96, 0xaf, 0xb7, 0x89, 0x89, 0x59, 0x4c, 0xcf, 0x68, - 0x05, 0x4a, 0xd8, 0x24, 0x26, 0x1e, 0x7c, 0x79, 0x85, 0x37, 0xfb, 0xf2, 0x8a, 0xb1, 0x2f, 0xef, - 0x14, 0xcc, 0xba, 0xd8, 0xf0, 0x88, 0x2d, 0xb6, 0xe7, 0xa2, 0x45, 0xa7, 0xa6, 0x87, 0x3d, 0x8f, - 0xf6, 0x24, 0xca, 0x35, 0xd1, 0x0c, 0x95, 0x99, 0xf3, 0x23, 0xcb, 0xcc, 0x21, 0x47, 0x39, 0xb1, - 0x32, 0xb3, 0x3c, 0xb2, 0xcc, 0x1c, 0xe7, 0x24, 0x27, 0x54, 0x68, 0x2f, 0x8c, 0x57, 0x68, 0x87, - 0xeb, 0xd2, 0xc5, 0x48, 0x5d, 0xfa, 0x6d, 0x7e, 0xac, 0xbf, 0x56, 0x60, 0x25, 0xf1, 0x59, 0x89, - 0xcf, 0xf5, 0x4e, 0xec, 0x50, 0x68, 0x6d, 0xa4, 0xcf, 0x82, 0x33, 0xa1, 0x27, 0x91, 0x33, 0xa1, - 0x0f, 0x46, 0x0b, 0xbe, 0xf5, 0x23, 0xa1, 0x3f, 0x56, 0xe0, 0xfc, 0xbe, 0x63, 0xc6, 0x2a, 0x3c, - 0xb1, 0xed, 0x1f, 0x3f, 0x71, 0x3c, 0x90, 0xb5, 0x7e, 0x6e, 0x52, 0x9c, 0x85, 0xcb, 0xa9, 0x2a, - 0x5c, 0xc8, 0x36, 0x43, 0x94, 0x4c, 0x3f, 0x86, 0xc5, 0xed, 0xd7, 0xb8, 0xdd, 0x3a, 0xb6, 0xdb, - 0x13, 0x98, 0x56, 0x81, 0x7c, 0xbb, 0x67, 0x0a, 0x94, 0x94, 0x3e, 0x86, 0xab, 0xc0, 0x7c, 0xb4, - 0x0a, 0xd4, 0xa1, 0x32, 0xe8, 0x41, 0x4c, 0xef, 0x29, 0x3a, 0xbd, 0x26, 0x65, 0xa6, 0xca, 0xe7, - 0x35, 0xd1, 0x12, 0x74, 0xec, 0xf2, 0x0b, 0x0c, 0x9c, 0x8e, 0x5d, 0x37, 0x9a, 0x2d, 0xf2, 0xd1, - 0x6c, 0xa1, 0xfe, 0xb9, 0x02, 0x25, 0xda, 0xc3, 0x37, 0xb2, 0x5f, 0x6c, 0xb5, 0xf2, 0x83, 0xad, - 0x56, 0xb0, 0x63, 0x9b, 0x0e, 0xef, 0xd8, 0x06, 0x96, 0xcf, 0x30, 0x72, 0xd2, 0xf2, 0xd9, 0x80, - 0x8e, 0x5d, 0x57, 0xbd, 0x00, 0xf3, 0xdc, 0x36, 0x31, 0xf2, 0x0a, 0xe4, 0xfb, 0x6e, 0x57, 0xc6, - 0x51, 0xdf, 0xed, 0xaa, 0x7f, 0xa2, 0x40, 0xb9, 0xee, 0xfb, 0x46, 0xfb, 0x68, 0x82, 0x01, 0x04, - 0xc6, 0xe5, 0xc2, 0xc6, 0x25, 0x07, 0x31, 0x30, 0x77, 0x3a, 0xc3, 0xdc, 0x99, 0x88, 0xb9, 0x2a, - 0x2c, 0x48, 0x5b, 0x32, 0x0d, 0x6e, 0x02, 0xda, 0x25, 0xae, 0xff, 0x98, 0xb8, 0xaf, 0x0c, 0xd7, - 0x9c, 0x6c, 0x07, 0x86, 0x60, 0x5a, 0xdc, 0x78, 0xcd, 0x5f, 0x9d, 0xd1, 0xd8, 0xb3, 0x7a, 0x05, - 0x4e, 0x44, 0xf4, 0x65, 0x76, 0xfc, 0x10, 0x4a, 0x2c, 0xef, 0x8b, 0x52, 0xfc, 0x56, 0xf8, 0xb8, - 0x66, 0xac, 0x55, 0x42, 0xfd, 0x5d, 0x58, 0xa2, 0xf5, 0x01, 0xa3, 0x07, 0x9f, 0xe2, 0xf7, 0x63, - 0x75, 0xea, 0xb9, 0x0c, 0x45, 0xb1, 0x1a, 0xf5, 0x6f, 0x15, 0x98, 0x61, 0xf4, 0xc4, 0x9a, 0x7d, - 0x06, 0x8a, 0x2e, 0x76, 0x88, 0xee, 0x1b, 0x9d, 0xe0, 0x7e, 0x31, 0x25, 0xec, 0x19, 0x1d, 0x8f, - 0x5d, 0x8f, 0xa6, 0x2f, 0x4d, 0xab, 0x83, 0x3d, 0x5f, 0x5e, 0x32, 0x2e, 0x51, 0xda, 0x16, 0x27, - 0x51, 0x27, 0x79, 0xd6, 0xef, 0xf3, 0xba, 0x73, 0x5a, 0x63, 0xcf, 0x68, 0x9d, 0x5f, 0x79, 0x1b, - 0x07, 0x52, 0x67, 0x17, 0xe2, 0x6a, 0x50, 0x88, 0xa1, 0xe8, 0x41, 0x5b, 0xdd, 0x06, 0x14, 0xf6, - 0x82, 0xf0, 0xf7, 0x4d, 0x98, 0x65, 0x4e, 0x92, 0xd5, 0xd1, 0x4a, 0x86, 0x1b, 0x34, 0xc1, 0xa6, - 0x1a, 0x80, 0xb8, 0x83, 0x23, 0x15, 0xd1, 0xe4, 0xb3, 0x32, 0xa4, 0x42, 0xfa, 0x7b, 0x05, 0x4e, - 0x44, 0xfa, 0x10, 0xb6, 0xde, 0x88, 0x76, 0x92, 0x69, 0xaa, 0xe8, 0x60, 0x33, 0xb2, 0x24, 0xdc, - 0xcc, 0x32, 0xe9, 0x37, 0xb4, 0x1c, 0xfc, 0x83, 0x02, 0x50, 0xef, 0xfb, 0x47, 0x02, 0x19, 0x0c, - 0xcf, 0x8c, 0x12, 0x9d, 0x19, 0xfa, 0xce, 0x31, 0x3c, 0xef, 0x15, 0x71, 0xe5, 0x9e, 0x26, 0x68, - 0x33, 0x0c, 0xaf, 0xef, 0x1f, 0xc9, 0xa3, 0x30, 0xfa, 0x8c, 0x2e, 0xc1, 0x02, 0xbf, 0xd3, 0xae, - 0x1b, 0xa6, 0xe9, 0x62, 0xcf, 0x13, 0x67, 0x62, 0x65, 0x4e, 0xad, 0x73, 0x22, 0x65, 0xb3, 0x4c, - 0x6c, 0xfb, 0x96, 0x7f, 0xac, 0xfb, 0xe4, 0x05, 0xb6, 0xc5, 0xde, 0xa4, 0x2c, 0xa9, 0x7b, 0x94, - 0xc8, 0x0f, 0x07, 0x3a, 0x96, 0xe7, 0xbb, 0x92, 0x4d, 0x9e, 0xbf, 0x08, 0x2a, 0x63, 0xa3, 0x93, - 0x52, 0xd9, 0xed, 0x77, 0xbb, 0xdc, 0xc5, 0x6f, 0x3e, 0xed, 0xef, 0x8b, 0x01, 0xe5, 0xb2, 0x62, - 0x7a, 0xe0, 0x34, 0x31, 0xdc, 0xb7, 0x08, 0xc2, 0xbc, 0x0f, 0x4b, 0xa1, 0x31, 0x88, 0xb0, 0x8a, - 0x14, 0x91, 0x4a, 0xb4, 0x88, 0x54, 0x9f, 0x00, 0xe2, 0xb8, 0xc3, 0x37, 0x1c, 0xb7, 0x7a, 0x12, - 0x4e, 0x44, 0x14, 0x89, 0x95, 0xf8, 0x3a, 0x94, 0xc5, 0xbd, 0x24, 0x11, 0x28, 0xa7, 0xa1, 0x40, - 0x33, 0x6a, 0xdb, 0x32, 0xe5, 0x39, 0xe9, 0x9c, 0x43, 0xcc, 0x4d, 0xcb, 0x74, 0xd5, 0x4f, 0xa0, - 0xac, 0xf1, 0x7e, 0x04, 0xef, 0x63, 0x58, 0x10, 0xb7, 0x98, 0xf4, 0xc8, 0x35, 0xc2, 0xb4, 0x6b, - 0xea, 0xe1, 0x4e, 0xb4, 0xb2, 0x1d, 0x6e, 0xaa, 0x26, 0xd4, 0x78, 0xc9, 0x10, 0x51, 0x2f, 0x07, - 0xfb, 0x18, 0xe4, 0x8d, 0xc2, 0x91, 0xbd, 0x44, 0xe5, 0xcb, 0x6e, 0xb8, 0xa9, 0x9e, 0x83, 0x33, - 0xa9, 0xbd, 0x08, 0x4f, 0x38, 0x50, 0x19, 0xbc, 0x30, 0x2d, 0x79, 0x60, 0xcc, 0x0e, 0x82, 0x95, - 0xd0, 0x41, 0xf0, 0xa9, 0xa0, 0x48, 0xcc, 0xc9, 0x45, 0x8c, 0x55, 0x80, 0x83, 0x72, 0x3f, 0x9f, - 0x55, 0xee, 0x4f, 0x47, 0xca, 0x7d, 0xb5, 0x15, 0xf8, 0x53, 0x6c, 0xc3, 0x1e, 0xb1, 0xed, 0x22, - 0xef, 0x5b, 0x26, 0x44, 0x75, 0xd8, 0x28, 0x39, 0xab, 0x16, 0x92, 0x52, 0xaf, 0x41, 0x39, 0x9a, - 0x1a, 0x43, 0x79, 0x4e, 0x49, 0xe4, 0xb9, 0x85, 0x58, 0x8a, 0xfb, 0x30, 0x56, 0x01, 0x67, 0xfb, - 0x38, 0x56, 0xff, 0xde, 0x8f, 0x24, 0xbb, 0xeb, 0x29, 0x67, 0xb8, 0xbf, 0xa1, 0x3c, 0xb7, 0x2c, - 0xd6, 0x83, 0xc7, 0x1e, 0x95, 0x17, 0x83, 0x56, 0x2f, 0x42, 0x69, 0x3f, 0xeb, 0x37, 0x10, 0xd3, - 0xf2, 0xbe, 0xc4, 0x6d, 0x58, 0x7e, 0x6c, 0x75, 0xb1, 0x77, 0xec, 0xf9, 0xb8, 0xd7, 0x60, 0x49, - 0xe9, 0xd0, 0xc2, 0x2e, 0x5a, 0x05, 0x60, 0x5b, 0x18, 0x87, 0x58, 0xc1, 0xd5, 0xf8, 0x10, 0x45, - 0xfd, 0x2f, 0x05, 0x16, 0x07, 0x82, 0xfb, 0x6c, 0xeb, 0x76, 0x16, 0x8a, 0x74, 0xbc, 0x9e, 0x6f, - 0xf4, 0x1c, 0x79, 0x9e, 0x15, 0x10, 0xd0, 0x3d, 0x98, 0x39, 0xf4, 0x24, 0x64, 0x94, 0x0a, 0xa0, - 0xa7, 0x19, 0xa2, 0x4d, 0x1f, 0x7a, 0x0d, 0x13, 0x7d, 0x04, 0xd0, 0xf7, 0xb0, 0x29, 0xce, 0xb0, - 0xf2, 0x59, 0xd5, 0xc2, 0x7e, 0xf8, 0x7c, 0x9b, 0x0a, 0xf0, 0xab, 0x16, 0xf7, 0xa1, 0x64, 0xd9, - 0xc4, 0xc4, 0xec, 0xcc, 0xd1, 0x14, 0xa8, 0xd2, 0x08, 0x71, 0xe0, 0x12, 0xfb, 0x1e, 0x36, 0x55, - 0x2c, 0xd6, 0x42, 0xe9, 0x5f, 0x11, 0x28, 0x4d, 0x58, 0xe2, 0x49, 0xeb, 0x30, 0x30, 0x5c, 0x46, - 0xec, 0xda, 0xb0, 0xd1, 0x31, 0x6f, 0x69, 0x15, 0x4b, 0x94, 0x36, 0x52, 0x54, 0xbd, 0x0b, 0x27, - 0x23, 0x3b, 0xa4, 0x09, 0xb6, 0x2c, 0xea, 0x6e, 0x0c, 0x28, 0x19, 0x84, 0xb3, 0x80, 0x21, 0x64, - 0x34, 0x8f, 0x82, 0x21, 0x3c, 0x0e, 0x43, 0x78, 0xea, 0xe7, 0x70, 0x3a, 0x82, 0xe8, 0x44, 0x2c, - 0xba, 0x1f, 0xab, 0xdc, 0x2e, 0x8f, 0xd2, 0x1a, 0x2b, 0xe1, 0xfe, 0x47, 0x81, 0xe5, 0x34, 0x86, - 0x37, 0x44, 0x1c, 0x7f, 0x9c, 0x71, 0xad, 0xee, 0xce, 0x78, 0x66, 0xfd, 0x56, 0xd0, 0xda, 0x3d, - 0xa8, 0xa5, 0xf9, 0x33, 0x39, 0x4b, 0xf9, 0x49, 0x66, 0xe9, 0x67, 0xf9, 0x10, 0xf2, 0x5e, 0xf7, - 0x7d, 0xd7, 0x3a, 0xe8, 0xd3, 0x90, 0x7f, 0xeb, 0x68, 0x56, 0x23, 0xc0, 0x65, 0xb8, 0x6b, 0x6f, - 0x0d, 0x11, 0x1f, 0xd8, 0x91, 0x8a, 0xcd, 0x7c, 0x1a, 0xc5, 0x66, 0x38, 0xa6, 0x7e, 0x7b, 0x3c, - 0x7d, 0xdf, 0x59, 0x00, 0xf4, 0x67, 0x39, 0x58, 0x88, 0x4e, 0x11, 0xda, 0x06, 0x30, 0x02, 0xcb, - 0xc5, 0x87, 0x72, 0x69, 0xac, 0x61, 0x6a, 0x21, 0x41, 0xf4, 0x1e, 0xe4, 0xdb, 0x4e, 0x5f, 0xcc, - 0x5a, 0xca, 0x61, 0xf0, 0xa6, 0xd3, 0xe7, 0x19, 0x85, 0xb2, 0xd1, 0x3d, 0x15, 0x3f, 0xdb, 0xcf, - 0xce, 0x92, 0xcf, 0xd9, 0x7b, 0x2e, 0x23, 0x98, 0xd1, 0x53, 0x58, 0x78, 0xe5, 0x5a, 0xbe, 0x71, - 0xd0, 0xc5, 0x7a, 0xd7, 0x38, 0xc6, 0xae, 0xc8, 0x92, 0x63, 0x24, 0xb2, 0xb2, 0x14, 0x7c, 0x46, - 0xe5, 0xd4, 0x3f, 0x84, 0x82, 0xb4, 0x68, 0xc4, 0x8a, 0xb0, 0x07, 0x2b, 0x7d, 0xca, 0xa6, 0xb3, - 0x2b, 0x70, 0xb6, 0x61, 0x13, 0xdd, 0xc3, 0x74, 0x19, 0x97, 0x97, 0xf3, 0x47, 0xa4, 0xe8, 0x65, - 0x26, 0xbd, 0x49, 0x5c, 0xdc, 0x34, 0x6c, 0xd2, 0xe2, 0xa2, 0xea, 0x4b, 0x28, 0x85, 0x06, 0x38, - 0xc2, 0x84, 0x06, 0x2c, 0xc9, 0xa3, 0x78, 0x0f, 0xfb, 0x62, 0x79, 0x19, 0xab, 0xf3, 0x45, 0x21, - 0xd7, 0xc2, 0x3e, 0xbf, 0x3e, 0x71, 0x1f, 0x4e, 0x6b, 0x98, 0x38, 0xd8, 0x0e, 0xe6, 0xf3, 0x19, - 0xe9, 0x4c, 0x90, 0xc1, 0xcf, 0x42, 0x2d, 0x4d, 0x9e, 0xe7, 0x87, 0xeb, 0x67, 0xa1, 0x20, 0x7f, - 0xd0, 0x8a, 0xe6, 0x20, 0xbf, 0xb7, 0xb9, 0x5b, 0x99, 0xa2, 0x0f, 0xfb, 0x5b, 0xbb, 0x15, 0xe5, - 0x7a, 0x0f, 0x2a, 0xf1, 0xdf, 0x70, 0xa2, 0x15, 0x38, 0xb1, 0xab, 0xed, 0xec, 0xd6, 0x9f, 0xd4, - 0xf7, 0x1a, 0x3b, 0x4d, 0x7d, 0x57, 0x6b, 0x7c, 0x5c, 0xdf, 0xdb, 0xae, 0x4c, 0xa1, 0x35, 0x38, - 0x17, 0x7e, 0xf1, 0x74, 0xa7, 0xb5, 0xa7, 0xef, 0xed, 0xe8, 0x9b, 0x3b, 0xcd, 0xbd, 0x7a, 0xa3, - 0xb9, 0xad, 0x55, 0x14, 0x74, 0x0e, 0x4e, 0x87, 0x59, 0x1e, 0x35, 0xb6, 0x1a, 0xda, 0xf6, 0x26, - 0x7d, 0xae, 0x3f, 0xab, 0xe4, 0xae, 0xdf, 0x82, 0x72, 0xe4, 0x27, 0x97, 0xd4, 0x90, 0xdd, 0x9d, - 0xad, 0xca, 0x14, 0x2a, 0x43, 0x31, 0xac, 0xa7, 0x00, 0xd3, 0xcd, 0x9d, 0xad, 0xed, 0x4a, 0xee, - 0xfa, 0x5d, 0x58, 0x8c, 0xdd, 0xc1, 0x45, 0x4b, 0x50, 0x6e, 0xd5, 0x9b, 0x5b, 0x8f, 0x76, 0x3e, - 0xd5, 0xb5, 0xed, 0xfa, 0xd6, 0x67, 0x95, 0x29, 0xb4, 0x0c, 0x15, 0x49, 0x6a, 0xee, 0xec, 0x71, - 0xaa, 0x72, 0xfd, 0x45, 0xec, 0xcb, 0xc2, 0xe8, 0x24, 0x2c, 0x05, 0xdd, 0xe8, 0x9b, 0xda, 0x76, - 0x7d, 0x6f, 0x9b, 0xf6, 0x1e, 0x21, 0x6b, 0xfb, 0xcd, 0x66, 0xa3, 0xf9, 0xa4, 0xa2, 0x50, 0xad, - 0x03, 0xf2, 0xf6, 0xa7, 0x0d, 0xca, 0x9c, 0x8b, 0x32, 0xef, 0x37, 0x7f, 0xd8, 0xdc, 0xf9, 0xa4, - 0x59, 0xc9, 0x6f, 0xfc, 0x62, 0x09, 0x16, 0x64, 0x79, 0x87, 0x5d, 0x76, 0x97, 0x65, 0x17, 0xe6, - 0xe4, 0xcf, 0xa2, 0x53, 0xf2, 0x72, 0xf4, 0xc7, 0xdc, 0xb5, 0xb5, 0x21, 0x1c, 0xa2, 0xca, 0x9e, - 0x42, 0x07, 0xac, 0xea, 0x0d, 0xdd, 0x89, 0xbe, 0x9c, 0x5a, 0x63, 0x26, 0xae, 0x61, 0xd7, 0xae, - 0x8c, 0xe4, 0x0b, 0xfa, 0xc0, 0xb4, 0xb0, 0x0d, 0xff, 0xe8, 0x07, 0x5d, 0x49, 0xab, 0x48, 0x53, - 0x7e, 0x55, 0x54, 0xbb, 0x3a, 0x9a, 0x31, 0xe8, 0xe6, 0x05, 0x54, 0xe2, 0x3f, 0x00, 0x42, 0x29, - 0x80, 0x69, 0xc6, 0xaf, 0x8c, 0x6a, 0xd7, 0xc7, 0x61, 0x0d, 0x77, 0x96, 0xf8, 0xa9, 0xcc, 0xb5, - 0x71, 0x7e, 0x7b, 0x90, 0xd9, 0x59, 0xd6, 0xcf, 0x14, 0xb8, 0x03, 0xa3, 0xf7, 0x9d, 0x51, 0xea, - 0xef, 0x52, 0x52, 0x6e, 0xcb, 0xa7, 0x39, 0x30, 0xfd, 0xea, 0xb4, 0x3a, 0x85, 0x8e, 0x60, 0x31, - 0x76, 0x29, 0x01, 0xa5, 0x88, 0xa7, 0xdf, 0xbe, 0xa8, 0x5d, 0x1b, 0x83, 0x33, 0x1a, 0x11, 0xe1, - 0x4b, 0x08, 0xe9, 0x11, 0x91, 0x72, 0xc5, 0x21, 0x3d, 0x22, 0x52, 0xef, 0x33, 0xb0, 0xe0, 0x8e, - 0x5c, 0x3e, 0x48, 0x0b, 0xee, 0xb4, 0x2b, 0x0f, 0xb5, 0x2b, 0x23, 0xf9, 0xc2, 0x4e, 0x8b, 0x5d, - 0x45, 0x48, 0x73, 0x5a, 0xfa, 0x55, 0x87, 0xda, 0xb5, 0x31, 0x38, 0xe3, 0x51, 0x30, 0x38, 0xd8, - 0xcc, 0x8a, 0x82, 0xc4, 0x31, 0x7c, 0x56, 0x14, 0x24, 0xcf, 0x48, 0x45, 0x14, 0xc4, 0x0e, 0x24, - 0xaf, 0x8e, 0x71, 0x80, 0x92, 0x1d, 0x05, 0xe9, 0x47, 0x2d, 0xea, 0x14, 0xfa, 0x23, 0x05, 0xaa, - 0x59, 0x87, 0x13, 0x28, 0xa5, 0xaa, 0x1b, 0x71, 0x9e, 0x52, 0xdb, 0x98, 0x44, 0x24, 0xb0, 0xe2, - 0x4b, 0x40, 0xc9, 0xd5, 0x0e, 0xbd, 0x9b, 0x36, 0x33, 0x19, 0x6b, 0x6a, 0xed, 0xbd, 0xf1, 0x98, - 0x83, 0x2e, 0x5b, 0x50, 0x90, 0xc7, 0x21, 0x28, 0x25, 0x4b, 0xc7, 0x0e, 0x63, 0x6a, 0xea, 0x30, - 0x96, 0x40, 0xe9, 0x13, 0x98, 0xa6, 0x54, 0x74, 0x2e, 0x9d, 0x5b, 0x2a, 0x5b, 0xcd, 0x7a, 0x1d, - 0x28, 0x7a, 0x0e, 0xb3, 0x1c, 0xff, 0x47, 0x29, 0x78, 0x43, 0xe4, 0x94, 0xa2, 0x76, 0x21, 0x9b, - 0x21, 0x50, 0xf7, 0x05, 0xff, 0x8f, 0x19, 0x02, 0xda, 0x47, 0xef, 0xa4, 0xff, 0x04, 0x39, 0x7a, - 0x92, 0x50, 0xbb, 0x34, 0x82, 0x2b, 0xfc, 0x51, 0xc4, 0x6a, 0xdd, 0x2b, 0x23, 0x37, 0x2c, 0xd9, - 0x1f, 0x45, 0xfa, 0x96, 0x88, 0x07, 0x49, 0x72, 0xcb, 0x94, 0x16, 0x24, 0x99, 0x1b, 0xd5, 0xb4, - 0x20, 0xc9, 0xde, 0x85, 0xa9, 0x53, 0xc8, 0x87, 0x13, 0x29, 0x00, 0x19, 0x7a, 0x2f, 0x2b, 0xc8, - 0xd3, 0xd0, 0xba, 0xda, 0x8d, 0x31, 0xb9, 0xc3, 0x93, 0x2f, 0x3e, 0xfa, 0xf3, 0xd9, 0xa8, 0x51, - 0xe6, 0xe4, 0xc7, 0x3f, 0xf1, 0x8d, 0x7f, 0xcd, 0xc3, 0x3c, 0x07, 0x3f, 0x45, 0x05, 0xf3, 0x19, - 0xc0, 0xe0, 0xdc, 0x01, 0x5d, 0x4c, 0xf7, 0x49, 0xe4, 0x6c, 0xa6, 0xf6, 0xce, 0x70, 0xa6, 0x70, - 0xa0, 0x85, 0x30, 0xfc, 0xb4, 0x40, 0x4b, 0x1e, 0x55, 0xa4, 0x05, 0x5a, 0xca, 0x41, 0x80, 0x3a, - 0x85, 0x3e, 0x86, 0x62, 0x00, 0x16, 0xa3, 0x34, 0xb0, 0x39, 0x86, 0x86, 0xd7, 0x2e, 0x0e, 0xe5, - 0x09, 0x5b, 0x1d, 0x42, 0x82, 0xd3, 0xac, 0x4e, 0x22, 0xce, 0x69, 0x56, 0xa7, 0xc1, 0xc9, 0x03, - 0x9f, 0x70, 0xbc, 0x28, 0xd3, 0x27, 0x11, 0xb8, 0x2e, 0xd3, 0x27, 0x51, 0xd0, 0x49, 0x9d, 0x7a, - 0x74, 0xf9, 0x57, 0x5f, 0xad, 0x2a, 0xff, 0xf4, 0xd5, 0xea, 0xd4, 0x4f, 0xbf, 0x5e, 0x55, 0x7e, - 0xf5, 0xf5, 0xaa, 0xf2, 0x8f, 0x5f, 0xaf, 0x2a, 0xff, 0xf6, 0xf5, 0xaa, 0xf2, 0x67, 0xff, 0xbe, - 0x3a, 0xf5, 0xa3, 0x82, 0x94, 0x3e, 0x98, 0x65, 0xff, 0xf7, 0xe6, 0x83, 0xff, 0x0b, 0x00, 0x00, - 0xff, 0xff, 0xc2, 0xad, 0x03, 0x06, 0xbd, 0x48, 0x00, 0x00, + 0x76, 0x57, 0x93, 0xfa, 0x20, 0x1f, 0x45, 0x89, 0x2a, 0xcb, 0x16, 0x4d, 0x8f, 0x35, 0x56, 0xcf, + 0xf8, 0x73, 0x66, 0xe4, 0xb1, 0x66, 0xd7, 0x13, 0xdb, 0xb3, 0xb6, 0x69, 0x49, 0xb6, 0x99, 0xb5, + 0x29, 0xa6, 0x29, 0xcd, 0xc7, 0xce, 0x00, 0xbd, 0x2d, 0x76, 0x89, 0xea, 0x35, 0xd9, 0xd5, 0xd3, + 0xdd, 0xb4, 0xad, 0x04, 0x08, 0x16, 0x08, 0xb2, 0x87, 0x00, 0x01, 0x72, 0xce, 0x71, 0x73, 0xc8, + 0x21, 0xb7, 0x00, 0x41, 0x0e, 0x39, 0x6d, 0xb0, 0x87, 0xbd, 0x04, 0xc8, 0x69, 0x91, 0x8f, 0x4b, + 0x66, 0x92, 0x5c, 0x72, 0x08, 0xf2, 0x07, 0xe4, 0x10, 0xd4, 0x57, 0xb3, 0x3f, 0xf9, 0xe1, 0xf1, + 0xee, 0x4c, 0x4e, 0xea, 0x7a, 0xfd, 0xde, 0xab, 0x57, 0xaf, 0x5e, 0xbf, 0x7a, 0xf5, 0xab, 0xa2, + 0xa0, 0x68, 0x38, 0xd6, 0xa6, 0xe3, 0x12, 0x9f, 0xa0, 0x8a, 0x3b, 0xb0, 0x7d, 0xab, 0x8f, 0x37, + 0x9f, 0xdf, 0x30, 0x7a, 0xce, 0xb1, 0xb1, 0x55, 0x7b, 0xaf, 0x6b, 0xf9, 0xc7, 0x83, 0xc3, 0xcd, + 0x0e, 0xe9, 0x5f, 0xef, 0x92, 0x2e, 0xb9, 0xce, 0x18, 0x0f, 0x07, 0x47, 0xac, 0xc5, 0x1a, 0xec, + 0x89, 0x2b, 0x50, 0xaf, 0xc1, 0xd2, 0xc7, 0xd8, 0xf5, 0x2c, 0x62, 0x6b, 0xf8, 0xcb, 0x01, 0xf6, + 0x7c, 0x54, 0x85, 0x85, 0xe7, 0x9c, 0x52, 0x55, 0x2e, 0x28, 0x57, 0x8a, 0x9a, 0x6c, 0xaa, 0x7f, + 0xa9, 0xc0, 0x72, 0xc0, 0xec, 0x39, 0xc4, 0xf6, 0x70, 0x36, 0x37, 0xda, 0x80, 0x45, 0x61, 0x9c, + 0x6e, 0x1b, 0x7d, 0x5c, 0xcd, 0xb1, 0xd7, 0x25, 0x41, 0x6b, 0x1a, 0x7d, 0x8c, 0x2e, 0xc3, 0xb2, + 0x64, 0x91, 0x4a, 0xf2, 0x8c, 0x6b, 0x49, 0x90, 0x45, 0x6f, 0x68, 0x13, 0x4e, 0x49, 0x46, 0xc3, + 0xb1, 0x02, 0xe6, 0x59, 0xc6, 0xbc, 0x22, 0x5e, 0xd5, 0x1d, 0x4b, 0xf0, 0xab, 0x9f, 0x43, 0x71, + 0xa7, 0xd9, 0xde, 0x26, 0xf6, 0x91, 0xd5, 0xa5, 0x26, 0x7a, 0xd8, 0xa5, 0x32, 0x55, 0xe5, 0x42, + 0x9e, 0x9a, 0x28, 0x9a, 0xa8, 0x06, 0x05, 0x0f, 0x1b, 0x6e, 0xe7, 0x18, 0x7b, 0xd5, 0x1c, 0x7b, + 0x15, 0xb4, 0xa9, 0x14, 0x71, 0x7c, 0x8b, 0xd8, 0x5e, 0x35, 0xcf, 0xa5, 0x44, 0x53, 0xfd, 0xb9, + 0x02, 0xa5, 0x16, 0x71, 0xfd, 0xa7, 0x86, 0xe3, 0x58, 0x76, 0x17, 0xdd, 0x84, 0x02, 0xf3, 0x65, + 0x87, 0xf4, 0x98, 0x0f, 0x96, 0xb6, 0x6a, 0x9b, 0xf1, 0x69, 0xd9, 0x6c, 0x09, 0x0e, 0x2d, 0xe0, + 0x45, 0x17, 0x61, 0xa9, 0x43, 0x6c, 0xdf, 0xb0, 0x6c, 0xec, 0xea, 0x0e, 0x71, 0x7d, 0xe6, 0xa2, + 0x39, 0xad, 0x1c, 0x50, 0x69, 0x2f, 0xe8, 0x1c, 0x14, 0x8f, 0x89, 0xe7, 0x73, 0x8e, 0x3c, 0xe3, + 0x28, 0x50, 0x02, 0x7b, 0xb9, 0x06, 0x0b, 0xec, 0xa5, 0xe5, 0x08, 0x67, 0xcc, 0xd3, 0x66, 0xc3, + 0x51, 0x7f, 0xad, 0xc0, 0xdc, 0x53, 0x32, 0xb0, 0xfd, 0x58, 0x37, 0x86, 0x7f, 0x2c, 0x26, 0x2a, + 0xd4, 0x8d, 0xe1, 0x1f, 0x0f, 0xbb, 0xa1, 0x1c, 0x7c, 0xae, 0x78, 0x37, 0xf4, 0x65, 0x0d, 0x0a, + 0x2e, 0x36, 0x4c, 0x62, 0xf7, 0x4e, 0x98, 0x09, 0x05, 0x2d, 0x68, 0xd3, 0x49, 0xf4, 0x70, 0xcf, + 0xb2, 0x07, 0x2f, 0x75, 0x17, 0xf7, 0x8c, 0x43, 0xdc, 0x63, 0xa6, 0x14, 0xb4, 0x25, 0x41, 0xd6, + 0x38, 0x15, 0xed, 0x40, 0xc9, 0x71, 0x89, 0x63, 0x74, 0x0d, 0xea, 0xc7, 0xea, 0x1c, 0x73, 0x95, + 0x9a, 0x74, 0x15, 0x33, 0xbb, 0x35, 0xe4, 0xd4, 0xc2, 0x62, 0xea, 0x5f, 0x2b, 0xb0, 0x4c, 0x83, + 0xc7, 0x73, 0x8c, 0x0e, 0xde, 0x63, 0x53, 0x82, 0x6e, 0xc1, 0x82, 0x8d, 0xfd, 0x17, 0xc4, 0x7d, + 0x26, 0x26, 0xe0, 0xcd, 0xa4, 0xd6, 0x40, 0xe6, 0x29, 0x31, 0xb1, 0x26, 0xf9, 0xd1, 0x0d, 0xc8, + 0x3b, 0x96, 0xc9, 0x06, 0x3c, 0x81, 0x18, 0xe5, 0xa5, 0x22, 0x96, 0xd3, 0x61, 0x7e, 0x98, 0x44, + 0xc4, 0x72, 0x3a, 0xaa, 0x0a, 0xd0, 0xb0, 0xfd, 0x9b, 0xdf, 0xfb, 0xd8, 0xe8, 0x0d, 0x30, 0x5a, + 0x85, 0xb9, 0xe7, 0xf4, 0x81, 0x19, 0x9b, 0xd7, 0x78, 0x43, 0xfd, 0x2a, 0x0f, 0xe7, 0x9e, 0x50, + 0x7f, 0xb5, 0x0d, 0xdb, 0x3c, 0x24, 0x2f, 0xdb, 0xb8, 0x33, 0x70, 0x2d, 0xff, 0x64, 0x9b, 0xd8, + 0x3e, 0x7e, 0xe9, 0xa3, 0x26, 0xac, 0xd8, 0x52, 0xb3, 0x2e, 0x43, 0x93, 0x6a, 0x28, 0x6d, 0x6d, + 0x8c, 0x30, 0x82, 0xbb, 0x48, 0xab, 0xd8, 0x51, 0x82, 0x87, 0x1e, 0x0f, 0xe7, 0x4d, 0x6a, 0xcb, + 0x31, 0x6d, 0x29, 0x43, 0x6a, 0xef, 0x32, 0xcb, 0x84, 0x2e, 0x39, 0xb1, 0x52, 0xd3, 0x47, 0x40, + 0xbf, 0x6a, 0xdd, 0xf0, 0xf4, 0x81, 0x87, 0x5d, 0xe6, 0x98, 0xd2, 0xd6, 0x1b, 0x49, 0x2d, 0x43, + 0x17, 0x68, 0x45, 0x77, 0x60, 0xd7, 0xbd, 0x03, 0x0f, 0xbb, 0x2c, 0x09, 0x88, 0x58, 0xd2, 0x5d, + 0x42, 0xfc, 0x23, 0x4f, 0xc6, 0x8f, 0x24, 0x6b, 0x8c, 0x8a, 0xae, 0xc3, 0x29, 0x6f, 0xe0, 0x38, + 0x3d, 0xdc, 0xc7, 0xb6, 0x6f, 0xf4, 0xf4, 0xae, 0x4b, 0x06, 0x8e, 0x57, 0x9d, 0xbb, 0x90, 0xbf, + 0x92, 0xd7, 0x50, 0xf8, 0xd5, 0x23, 0xf6, 0x06, 0xad, 0x03, 0x38, 0xae, 0xf5, 0xdc, 0xea, 0xe1, + 0x2e, 0x36, 0xab, 0xf3, 0x4c, 0x69, 0x88, 0x82, 0xde, 0x87, 0x55, 0x0f, 0x77, 0x3a, 0xa4, 0xef, + 0xe8, 0x8e, 0x4b, 0x8e, 0xac, 0x1e, 0xe6, 0xd1, 0xbf, 0xc0, 0xa2, 0x1f, 0x89, 0x77, 0x2d, 0xfe, + 0x8a, 0x7d, 0x07, 0x77, 0x59, 0x4e, 0xa3, 0x23, 0x65, 0x9d, 0x57, 0x0b, 0x13, 0x0c, 0x15, 0xd8, + 0x50, 0x99, 0x49, 0xea, 0xcf, 0x73, 0x70, 0x9a, 0x79, 0xb2, 0x45, 0x4c, 0x31, 0xcd, 0x22, 0x49, + 0xbd, 0x05, 0xe5, 0x0e, 0xd3, 0xa9, 0x3b, 0x86, 0x8b, 0x6d, 0x5f, 0x7c, 0xa4, 0x8b, 0x9c, 0xd8, + 0x62, 0x34, 0xf4, 0x29, 0x54, 0x3c, 0x11, 0x15, 0x7a, 0x87, 0x87, 0x85, 0x98, 0xb3, 0xf7, 0x92, + 0x26, 0x8c, 0x88, 0x25, 0x6d, 0xd9, 0x4b, 0x04, 0xd7, 0x82, 0x77, 0xe2, 0x75, 0xfc, 0x1e, 0xcf, + 0x76, 0xa5, 0xad, 0xef, 0x65, 0x28, 0x8c, 0x1b, 0xbe, 0xd9, 0xe6, 0x62, 0xbb, 0xb6, 0xef, 0x9e, + 0x68, 0x52, 0x49, 0xed, 0x36, 0x2c, 0x86, 0x5f, 0xa0, 0x0a, 0xe4, 0x9f, 0xe1, 0x13, 0x31, 0x28, + 0xfa, 0x38, 0xfc, 0x08, 0x78, 0xae, 0xe1, 0x8d, 0xdb, 0xb9, 0xdf, 0x51, 0x54, 0x17, 0xd0, 0xb0, + 0x97, 0xa7, 0xd8, 0x37, 0x4c, 0xc3, 0x37, 0x10, 0x82, 0x59, 0xb6, 0x8c, 0x70, 0x15, 0xec, 0x99, + 0x6a, 0x1d, 0x88, 0x8f, 0xb7, 0xa8, 0xd1, 0x47, 0xf4, 0x06, 0x14, 0x83, 0x40, 0x17, 0x6b, 0xc9, + 0x90, 0x40, 0x73, 0xba, 0xe1, 0xfb, 0xb8, 0xef, 0xf8, 0x2c, 0xc4, 0xca, 0x9a, 0x6c, 0xaa, 0xff, + 0x3d, 0x0b, 0x95, 0xc4, 0x9c, 0xdc, 0x87, 0x42, 0x5f, 0x74, 0x2f, 0x3e, 0xb4, 0xb7, 0x53, 0x12, + 0x7b, 0xc2, 0x54, 0x2d, 0x90, 0xa2, 0x79, 0x93, 0xe6, 0xd0, 0xd0, 0xfa, 0x17, 0xb4, 0xe9, 0x8c, + 0xf7, 0x48, 0x57, 0x37, 0x2d, 0x17, 0x77, 0x7c, 0xe2, 0x9e, 0x08, 0x73, 0x17, 0x7b, 0xa4, 0xbb, + 0x23, 0x69, 0xe8, 0x36, 0x80, 0x69, 0x7b, 0x74, 0xb2, 0x8f, 0xac, 0x2e, 0x33, 0xba, 0xb4, 0x75, + 0x2e, 0x69, 0x44, 0xb0, 0xd8, 0x69, 0x45, 0xd3, 0xf6, 0x84, 0xf9, 0x0f, 0xa0, 0x4c, 0xd7, 0x0c, + 0xbd, 0xcf, 0xd7, 0x29, 0xfe, 0xa5, 0x94, 0xb6, 0xce, 0xa7, 0x8d, 0x21, 0x58, 0xcd, 0xb4, 0x45, + 0x67, 0xd8, 0xf0, 0xd0, 0x43, 0x98, 0x67, 0xc9, 0xdb, 0xab, 0xce, 0x33, 0xe1, 0xcd, 0x51, 0x0e, + 0x10, 0x11, 0xf1, 0x84, 0x09, 0xf0, 0x80, 0x10, 0xd2, 0xe8, 0x00, 0x4a, 0x86, 0x6d, 0x13, 0xdf, + 0xe0, 0x89, 0x66, 0x81, 0x29, 0xfb, 0x60, 0x02, 0x65, 0xf5, 0xa1, 0x14, 0xd7, 0x18, 0xd6, 0x83, + 0x7e, 0x00, 0x73, 0x2c, 0x13, 0x89, 0x0f, 0xf1, 0xf2, 0x84, 0x41, 0xab, 0x71, 0xa9, 0xda, 0x2d, + 0x28, 0x85, 0x8c, 0x9d, 0x26, 0x48, 0x6b, 0x77, 0xa1, 0x12, 0x37, 0x6d, 0xaa, 0x20, 0xff, 0x03, + 0x58, 0xd5, 0x06, 0xf6, 0xd0, 0x30, 0x59, 0x7d, 0xdd, 0x86, 0x79, 0x31, 0xd9, 0x3c, 0xe2, 0xd4, + 0xf1, 0x3e, 0xd2, 0x84, 0x44, 0xb8, 0x9c, 0x3a, 0x36, 0x6c, 0xb3, 0x87, 0x5d, 0xd1, 0xaf, 0x2c, + 0xa7, 0x1e, 0x73, 0xaa, 0xfa, 0x03, 0x38, 0x1d, 0xeb, 0x5c, 0x54, 0x73, 0x6f, 0xc3, 0x92, 0x43, + 0x4c, 0xdd, 0xe3, 0x64, 0xdd, 0x32, 0x65, 0x1a, 0x72, 0x02, 0xde, 0x86, 0x49, 0xc5, 0xdb, 0x3e, + 0x71, 0x92, 0xc6, 0x4f, 0x26, 0x5e, 0x85, 0x33, 0x71, 0x71, 0xde, 0xbd, 0x7a, 0x0f, 0xd6, 0x34, + 0xdc, 0x27, 0xcf, 0xf1, 0xab, 0xaa, 0xae, 0x41, 0x35, 0xa9, 0x40, 0x28, 0xff, 0x0c, 0xd6, 0x86, + 0xd4, 0xb6, 0x6f, 0xf8, 0x03, 0x6f, 0x2a, 0xe5, 0xa2, 0xd4, 0x3d, 0x24, 0x1e, 0x9f, 0xce, 0x82, + 0x26, 0x9b, 0xea, 0xd5, 0xb0, 0xea, 0x26, 0xaf, 0x2c, 0x78, 0x0f, 0x68, 0x09, 0x72, 0x96, 0x23, + 0xd4, 0xe5, 0x2c, 0x47, 0x7d, 0x0c, 0xc5, 0x60, 0x69, 0x46, 0x77, 0x86, 0x35, 0x66, 0x6e, 0xd2, + 0x85, 0x3c, 0x28, 0x43, 0xf7, 0x13, 0x4b, 0x89, 0xe8, 0xf2, 0x0e, 0x40, 0x90, 0xf2, 0x64, 0x85, + 0x70, 0x6e, 0x84, 0x62, 0x2d, 0xc4, 0xae, 0xfe, 0x4b, 0x24, 0x11, 0x86, 0x06, 0x61, 0x06, 0x83, + 0x30, 0x23, 0x89, 0x31, 0xf7, 0x4a, 0x89, 0xf1, 0x43, 0x98, 0xf3, 0x7c, 0xc3, 0xc7, 0xa2, 0x8a, + 0xda, 0x18, 0x25, 0x4e, 0x8d, 0xc0, 0x1a, 0xe7, 0x47, 0xe7, 0x01, 0x3a, 0x2e, 0x36, 0x7c, 0x6c, + 0xea, 0x06, 0xcf, 0xe2, 0x79, 0xad, 0x28, 0x28, 0x75, 0x1f, 0x6d, 0x0f, 0x2b, 0xc1, 0x39, 0x66, + 0xd8, 0xd5, 0x51, 0x9a, 0x23, 0x53, 0x35, 0xac, 0x09, 0x83, 0xac, 0x32, 0x3f, 0x61, 0x56, 0x11, + 0x0a, 0xb8, 0x54, 0x28, 0x67, 0x2e, 0x8c, 0xcf, 0x99, 0x5c, 0x74, 0x92, 0x9c, 0x59, 0x18, 0x9f, + 0x33, 0x85, 0xb2, 0x91, 0x39, 0xf3, 0xdb, 0x4c, 0x7a, 0xff, 0xac, 0x40, 0x35, 0xf9, 0x0d, 0x8a, + 0xdc, 0x73, 0x1b, 0xe6, 0x3d, 0x46, 0x99, 0x24, 0xf3, 0x09, 0x59, 0x21, 0x81, 0x1e, 0xc3, 0xac, + 0x65, 0x1f, 0x11, 0xb6, 0x89, 0x4b, 0xad, 0x5d, 0xb2, 0x7a, 0xdd, 0x6c, 0xd8, 0x47, 0x84, 0x3b, + 0x89, 0x69, 0xa8, 0x7d, 0x08, 0xc5, 0x80, 0x34, 0xd5, 0xd8, 0xf6, 0x60, 0x35, 0x16, 0xb2, 0xbc, + 0xd8, 0x0f, 0x22, 0x5d, 0x99, 0x2e, 0xd2, 0xd5, 0x9f, 0xe6, 0xc2, 0x5f, 0xe2, 0x43, 0xab, 0xe7, + 0x63, 0x37, 0xf1, 0x25, 0x7e, 0x24, 0xb5, 0xf3, 0xcf, 0xf0, 0xd2, 0x58, 0xed, 0xbc, 0x26, 0x15, + 0x1f, 0xd3, 0x17, 0xb0, 0xc4, 0x62, 0x4d, 0xf7, 0x70, 0x8f, 0x15, 0x1c, 0xa2, 0xf8, 0xfb, 0xfe, + 0x28, 0x35, 0xdc, 0x12, 0x1e, 0xb1, 0x6d, 0x21, 0xc7, 0x3d, 0x58, 0xee, 0x85, 0x69, 0xb5, 0xfb, + 0x80, 0x92, 0x4c, 0x53, 0xf9, 0xb4, 0x4d, 0x53, 0x1c, 0xdd, 0xe9, 0xa6, 0xac, 0x92, 0x47, 0xcc, + 0x8c, 0x49, 0x62, 0x85, 0x1b, 0xac, 0x09, 0x09, 0xf5, 0x97, 0x79, 0x80, 0xe1, 0xcb, 0xff, 0x47, + 0xb9, 0xed, 0x7e, 0x90, 0x57, 0x78, 0x21, 0x77, 0x65, 0x94, 0xe2, 0xd4, 0x8c, 0xb2, 0x17, 0xcd, + 0x28, 0xbc, 0xa4, 0x7b, 0x6f, 0xa4, 0x9a, 0xef, 0x6c, 0x2e, 0x79, 0x02, 0x67, 0xe2, 0xb1, 0x21, + 0x12, 0xc9, 0x16, 0xcc, 0x59, 0x3e, 0xee, 0x73, 0xb4, 0x27, 0x75, 0x77, 0x16, 0x12, 0xe2, 0xac, + 0xea, 0x06, 0x14, 0x1b, 0x7d, 0xa3, 0x8b, 0xdb, 0x0e, 0xee, 0xd0, 0x4e, 0x2d, 0xda, 0x10, 0x86, + 0xf0, 0x86, 0xba, 0x05, 0x85, 0x1f, 0xe2, 0x13, 0xfe, 0x51, 0x4f, 0x68, 0xa8, 0xfa, 0xa7, 0x39, + 0x58, 0x63, 0x6b, 0xc5, 0xb6, 0xc4, 0x5a, 0x34, 0xec, 0x91, 0x81, 0xdb, 0xc1, 0x1e, 0x9b, 0x6d, + 0x67, 0xa0, 0x3b, 0xd8, 0xb5, 0x88, 0x29, 0xa0, 0x80, 0x62, 0xc7, 0x19, 0xb4, 0x18, 0x01, 0x9d, + 0x03, 0xda, 0xd0, 0xbf, 0x1c, 0x10, 0x11, 0x88, 0x79, 0xad, 0xd0, 0x71, 0x06, 0xbf, 0x47, 0xdb, + 0x52, 0xd6, 0x3b, 0x36, 0x5c, 0xec, 0xb1, 0x38, 0xe3, 0xb2, 0x6d, 0x46, 0x40, 0x37, 0xe0, 0x74, + 0x1f, 0xf7, 0x89, 0x7b, 0xa2, 0xf7, 0xac, 0xbe, 0xe5, 0xeb, 0x96, 0xad, 0x1f, 0x9e, 0xf8, 0xd8, + 0x13, 0x31, 0x85, 0xf8, 0xcb, 0x27, 0xf4, 0x5d, 0xc3, 0x7e, 0x40, 0xdf, 0x20, 0x15, 0xca, 0x84, + 0xf4, 0x75, 0xaf, 0x43, 0x5c, 0xac, 0x1b, 0xe6, 0x4f, 0xd8, 0xf2, 0x99, 0xd7, 0x4a, 0x84, 0xf4, + 0xdb, 0x94, 0x56, 0x37, 0x7f, 0x82, 0xde, 0x84, 0x52, 0xc7, 0x19, 0x78, 0xd8, 0xd7, 0xe9, 0x1f, + 0xb6, 0x3a, 0x16, 0x35, 0xe0, 0xa4, 0x6d, 0x67, 0xe0, 0x85, 0x18, 0xfa, 0xd4, 0xff, 0x0b, 0x61, + 0x86, 0xa7, 0xd4, 0xcd, 0x06, 0x94, 0x23, 0x50, 0x02, 0xdd, 0xd5, 0x31, 0xcc, 0x40, 0xec, 0xea, + 0xe8, 0x33, 0xa5, 0xb9, 0xa4, 0x27, 0x3d, 0xc9, 0x9e, 0x29, 0xcd, 0x3f, 0x71, 0xe4, 0x96, 0x8e, + 0x3d, 0x53, 0x97, 0xf7, 0xf0, 0x73, 0x01, 0x37, 0x15, 0x35, 0xde, 0x50, 0x4d, 0x80, 0x6d, 0xc3, + 0x31, 0x0e, 0xad, 0x9e, 0xe5, 0x9f, 0xa0, 0xab, 0x50, 0x31, 0x4c, 0x53, 0xef, 0x48, 0x8a, 0x85, + 0x25, 0x08, 0xb8, 0x6c, 0x98, 0xe6, 0x76, 0x88, 0x8c, 0xde, 0x81, 0x15, 0xd3, 0x25, 0x4e, 0x94, + 0x97, 0xa3, 0x82, 0x15, 0xfa, 0x22, 0xcc, 0xac, 0xfe, 0xc7, 0x1c, 0x9c, 0x8f, 0x4e, 0x6c, 0x1c, + 0xae, 0xb9, 0x0f, 0x8b, 0xb1, 0x5e, 0x33, 0xa0, 0x82, 0xa1, 0xb5, 0x5a, 0x44, 0x22, 0x06, 0x5f, + 0xe4, 0x12, 0xf0, 0x45, 0x2a, 0x20, 0x94, 0x7f, 0xad, 0x80, 0xd0, 0xec, 0x6b, 0x01, 0x84, 0xe6, + 0xa6, 0x03, 0x84, 0x2e, 0xb1, 0x6d, 0x8c, 0x94, 0x66, 0x7b, 0x67, 0x1e, 0x6a, 0xe5, 0x80, 0xc7, + 0x96, 0xe8, 0x71, 0x0c, 0x38, 0x5a, 0x98, 0x06, 0x38, 0x2a, 0x64, 0x02, 0x47, 0x34, 0x6a, 0x1c, + 0xc7, 0x70, 0xfb, 0xc4, 0x95, 0xc8, 0x50, 0xb5, 0xc8, 0x4c, 0x58, 0x96, 0x74, 0x81, 0x0a, 0x65, + 0x62, 0x48, 0x90, 0x89, 0x21, 0x5d, 0x80, 0x45, 0x9b, 0xe8, 0x36, 0x7e, 0xa1, 0xd3, 0xb9, 0xf4, + 0xaa, 0x25, 0x3e, 0xb1, 0x36, 0x69, 0xe2, 0x17, 0x2d, 0x4a, 0x49, 0xa0, 0x4c, 0x8b, 0xd3, 0xa1, + 0x4c, 0x68, 0x03, 0x16, 0xfb, 0x86, 0xf7, 0x0c, 0x9b, 0xcc, 0x14, 0xaf, 0x5a, 0x66, 0x41, 0x5c, + 0xe2, 0x34, 0x6a, 0x83, 0x87, 0x2e, 0x42, 0xe0, 0x24, 0xc1, 0xb4, 0xc4, 0x98, 0xca, 0x92, 0xca, + 0xd8, 0xd4, 0xbf, 0x53, 0x60, 0x35, 0x1a, 0xe6, 0x02, 0x5b, 0x78, 0x04, 0x45, 0x57, 0x66, 0x32, + 0x11, 0xda, 0x57, 0x33, 0xca, 0xe4, 0x64, 0xea, 0xd3, 0x86, 0xb2, 0xe8, 0x47, 0x99, 0x90, 0xd6, + 0xf5, 0x71, 0xfa, 0xc6, 0x81, 0x5a, 0x6a, 0x03, 0xde, 0xfc, 0xc4, 0xb2, 0x4d, 0xf2, 0xc2, 0xcb, + 0xfc, 0x4a, 0x53, 0x62, 0x4d, 0x49, 0x89, 0x35, 0xf5, 0x17, 0x0a, 0x9c, 0x89, 0xeb, 0x12, 0xae, + 0x68, 0x24, 0x5d, 0xf1, 0x4e, 0xd2, 0xf4, 0xb8, 0x70, 0xaa, 0x33, 0xbe, 0xc8, 0x74, 0xc6, 0x8d, + 0xf1, 0x1a, 0xc7, 0xba, 0xe3, 0xaf, 0x14, 0x38, 0x9b, 0x69, 0x46, 0x6c, 0x49, 0x51, 0xe2, 0x4b, + 0x8a, 0x58, 0x8e, 0x3a, 0x64, 0x60, 0xfb, 0xa1, 0xe5, 0x68, 0x9b, 0x1d, 0x31, 0xf0, 0xbc, 0xaf, + 0xf7, 0x8d, 0x97, 0x56, 0x7f, 0xd0, 0x17, 0xeb, 0x11, 0x55, 0xf7, 0x94, 0x53, 0x5e, 0x61, 0x41, + 0x52, 0xeb, 0xb0, 0x12, 0x58, 0x39, 0x12, 0x04, 0x0c, 0x81, 0x7a, 0xb9, 0x28, 0xa8, 0x67, 0xc3, + 0xfc, 0x0e, 0x7e, 0x6e, 0x75, 0xf0, 0x6b, 0x39, 0x03, 0xb9, 0x00, 0x25, 0x07, 0xbb, 0x7d, 0xcb, + 0xf3, 0x82, 0x44, 0x5b, 0xd4, 0xc2, 0x24, 0xf5, 0x3f, 0xe7, 0x61, 0x39, 0x1e, 0x1d, 0xf7, 0x12, + 0x18, 0xe2, 0x5b, 0x29, 0x4b, 0x40, 0x7c, 0xa0, 0xa1, 0x6a, 0xf2, 0x86, 0x2c, 0x46, 0x72, 0x59, + 0x1b, 0xf9, 0xa0, 0x70, 0x11, 0x95, 0x0a, 0xf5, 0x48, 0x87, 0xf4, 0xfb, 0x86, 0x6d, 0xca, 0xa3, + 0x2b, 0xd1, 0xa4, 0xfe, 0x33, 0xdc, 0x2e, 0x75, 0x3b, 0x25, 0xb3, 0x67, 0x3a, 0x79, 0x74, 0xd7, + 0x6b, 0xd9, 0x0c, 0x8b, 0x64, 0xc9, 0xba, 0xa8, 0x81, 0x20, 0xed, 0x58, 0x2e, 0xda, 0x84, 0x59, + 0x6c, 0x3f, 0x97, 0xe5, 0x62, 0xca, 0xd9, 0x96, 0x2c, 0x8b, 0x34, 0xc6, 0x87, 0xae, 0xc3, 0x7c, + 0x9f, 0x86, 0x85, 0xdc, 0xff, 0xae, 0x65, 0x1c, 0xf1, 0x68, 0x82, 0x0d, 0x6d, 0xc1, 0x82, 0xc9, + 0xe6, 0x49, 0x6e, 0x72, 0xab, 0x29, 0x08, 0x27, 0x63, 0xd0, 0x24, 0x23, 0xda, 0x0d, 0x8a, 0xe1, + 0x62, 0x56, 0x15, 0x1b, 0x9b, 0x8a, 0xd4, 0x8a, 0x78, 0x3f, 0x5a, 0x11, 0x03, 0xd3, 0xb5, 0x35, + 0x5e, 0xd7, 0x68, 0x58, 0xf2, 0x2c, 0x14, 0x7a, 0xa4, 0xcb, 0xc3, 0xa8, 0xc4, 0x4f, 0x45, 0x7b, + 0xa4, 0xcb, 0xa2, 0x68, 0x95, 0x6e, 0x0e, 0x4c, 0xcb, 0x66, 0x49, 0xbd, 0xa0, 0xf1, 0x06, 0xfd, + 0xf8, 0xd8, 0x83, 0x4e, 0xec, 0x0e, 0xae, 0x96, 0xd9, 0xab, 0x22, 0xa3, 0xec, 0xd9, 0x1d, 0x56, + 0x6e, 0xfa, 0xfe, 0x49, 0x75, 0x89, 0xd1, 0xe9, 0x23, 0xdd, 0xf7, 0x71, 0x88, 0x62, 0x39, 0x6b, + 0xdf, 0x97, 0x96, 0xb6, 0x25, 0x42, 0xf1, 0x00, 0x16, 0x5e, 0xf0, 0x44, 0x50, 0xad, 0x30, 0xf9, + 0x2b, 0xe3, 0xd3, 0x8b, 0xd0, 0x20, 0x05, 0xbf, 0xcd, 0xd2, 0xff, 0x97, 0x0a, 0x9c, 0xd9, 0x66, + 0xdb, 0xa2, 0x50, 0x1e, 0x9b, 0x06, 0xc9, 0xbb, 0x15, 0x80, 0xac, 0x99, 0xb0, 0x5b, 0x7c, 0xdc, + 0x12, 0x63, 0x6d, 0xc0, 0x92, 0x54, 0x2e, 0x54, 0xe4, 0x27, 0xc6, 0x69, 0xcb, 0x5e, 0xb8, 0xa9, + 0x7e, 0x04, 0x6b, 0x89, 0x51, 0x88, 0x2d, 0xcc, 0x06, 0x2c, 0x0e, 0xf3, 0x55, 0x30, 0x88, 0x52, + 0x40, 0x6b, 0x98, 0xea, 0x6d, 0x38, 0xdd, 0xf6, 0x0d, 0xd7, 0x4f, 0xb8, 0x60, 0x02, 0x59, 0x86, + 0xc0, 0x46, 0x65, 0x05, 0x48, 0xda, 0x86, 0xd5, 0xb6, 0x4f, 0x9c, 0x57, 0x50, 0x4a, 0xb3, 0x0e, + 0x1d, 0x3f, 0x19, 0xc8, 0xf5, 0x41, 0x36, 0xd5, 0x35, 0x8e, 0x17, 0x27, 0x7b, 0xbb, 0x03, 0x67, + 0x38, 0x5c, 0xfb, 0x2a, 0x83, 0x38, 0x2b, 0xc1, 0xe2, 0xa4, 0xde, 0xa7, 0x70, 0x6a, 0xb8, 0x2c, + 0x0e, 0xa1, 0x98, 0x9b, 0x51, 0x28, 0xe6, 0xc2, 0x88, 0x59, 0x8f, 0x20, 0x31, 0x7f, 0x91, 0x0b, + 0xe5, 0xf5, 0x0c, 0x20, 0xe6, 0x4e, 0x14, 0x88, 0xb9, 0x38, 0x4e, 0x77, 0x04, 0x87, 0x49, 0x46, + 0x6d, 0x3e, 0x25, 0x6a, 0x3f, 0x4f, 0xa0, 0x35, 0xb3, 0x59, 0x70, 0x57, 0xcc, 0xda, 0xdf, 0x0a, + 0x58, 0xa3, 0x71, 0xb0, 0x26, 0xe8, 0x3a, 0x40, 0xd7, 0x6f, 0xc5, 0xc0, 0x9a, 0x8d, 0xb1, 0xf6, + 0x06, 0x58, 0xcd, 0xdf, 0xcc, 0x42, 0x31, 0x78, 0x97, 0xf0, 0x79, 0xd2, 0x6d, 0xb9, 0x14, 0xb7, + 0x85, 0x57, 0xe0, 0xfc, 0x37, 0x5a, 0x81, 0x67, 0x27, 0x5e, 0x81, 0xcf, 0x41, 0x91, 0x3d, 0xe8, + 0x2e, 0x3e, 0x12, 0x2b, 0x6a, 0x81, 0x11, 0x34, 0x7c, 0x34, 0x0c, 0xc3, 0xf9, 0xa9, 0xc2, 0x30, + 0x06, 0x0f, 0x2d, 0xc4, 0xe1, 0xa1, 0x7b, 0xc1, 0x8a, 0xc8, 0x17, 0xd1, 0xcb, 0x23, 0xf4, 0xa6, + 0xae, 0x85, 0xcd, 0xe8, 0x5a, 0xc8, 0xd7, 0xd5, 0x77, 0x47, 0x69, 0xf9, 0xce, 0x82, 0x43, 0x07, + 0x1c, 0x1c, 0x0a, 0xc7, 0xa2, 0xc8, 0xac, 0x77, 0x00, 0x82, 0x24, 0x22, 0x11, 0xa2, 0x73, 0x23, + 0xc6, 0xa8, 0x85, 0xd8, 0xa9, 0xda, 0xc8, 0xd4, 0x0c, 0x4f, 0x90, 0x26, 0xcb, 0x8f, 0x19, 0xc7, + 0x47, 0xff, 0x3b, 0x17, 0xca, 0x2f, 0x19, 0x47, 0x2e, 0xf7, 0x12, 0xb0, 0xe4, 0x94, 0x51, 0x7c, + 0x33, 0x8a, 0x4a, 0xbe, 0x62, 0xd4, 0x25, 0x40, 0x49, 0x56, 0xb9, 0x18, 0xae, 0x78, 0xcd, 0x41, + 0xa3, 0xa2, 0xa0, 0xd4, 0xd9, 0xce, 0xe0, 0xc8, 0xb2, 0x2d, 0xef, 0x98, 0xbf, 0x9f, 0xe7, 0x3b, + 0x03, 0x49, 0xaa, 0xb3, 0xdb, 0x4d, 0xf8, 0xa5, 0xe5, 0xeb, 0x1d, 0x62, 0x62, 0x16, 0xd3, 0x73, + 0x5a, 0x81, 0x12, 0xb6, 0x89, 0x89, 0x87, 0x5f, 0x5e, 0xe1, 0xd5, 0xbe, 0xbc, 0x62, 0xec, 0xcb, + 0x3b, 0x03, 0xf3, 0x2e, 0x36, 0x3c, 0x62, 0x8b, 0xed, 0xb9, 0x68, 0xd1, 0xa9, 0xe9, 0x63, 0xcf, + 0xa3, 0x3d, 0x89, 0x72, 0x4d, 0x34, 0x43, 0x65, 0xe6, 0xe2, 0xd8, 0x32, 0x73, 0xc4, 0x51, 0x4e, + 0xac, 0xcc, 0x2c, 0x8f, 0x2d, 0x33, 0x27, 0x39, 0xc9, 0x09, 0x15, 0xda, 0x4b, 0x93, 0x15, 0xda, + 0xe1, 0xba, 0x74, 0x39, 0x52, 0x97, 0x7e, 0x9b, 0x1f, 0xeb, 0xaf, 0x15, 0x58, 0x4b, 0x7c, 0x56, + 0xe2, 0x73, 0xbd, 0x15, 0x3b, 0x14, 0xda, 0x18, 0xeb, 0xb3, 0xe0, 0x4c, 0xe8, 0x51, 0xe4, 0x4c, + 0xe8, 0x83, 0xf1, 0x82, 0xaf, 0xfd, 0x48, 0xe8, 0x8f, 0x15, 0x78, 0xf3, 0xc0, 0x31, 0x63, 0x15, + 0x9e, 0xd8, 0xf6, 0x4f, 0x9e, 0x38, 0xee, 0xc9, 0x5a, 0x3f, 0x37, 0x2d, 0xce, 0xc2, 0xe5, 0x54, + 0x15, 0x2e, 0x64, 0x9b, 0x21, 0x4a, 0xa6, 0x1f, 0xc3, 0xf2, 0xee, 0x4b, 0xdc, 0x69, 0x9f, 0xd8, + 0x9d, 0x29, 0x4c, 0xab, 0x40, 0xbe, 0xd3, 0x37, 0x05, 0x4a, 0x4a, 0x1f, 0xc3, 0x55, 0x60, 0x3e, + 0x5a, 0x05, 0xea, 0x50, 0x19, 0xf6, 0x20, 0xa6, 0xf7, 0x0c, 0x9d, 0x5e, 0x93, 0x32, 0x53, 0xe5, + 0x8b, 0x9a, 0x68, 0x09, 0x3a, 0x76, 0xf9, 0x05, 0x06, 0x4e, 0xc7, 0xae, 0x1b, 0xcd, 0x16, 0xf9, + 0x68, 0xb6, 0x50, 0xff, 0x5c, 0x81, 0x12, 0xed, 0xe1, 0x1b, 0xd9, 0x2f, 0xb6, 0x5a, 0xf9, 0xe1, + 0x56, 0x2b, 0xd8, 0xb1, 0xcd, 0x86, 0x77, 0x6c, 0x43, 0xcb, 0xe7, 0x18, 0x39, 0x69, 0xf9, 0x7c, + 0x40, 0xc7, 0xae, 0xab, 0x5e, 0x80, 0x45, 0x6e, 0x9b, 0x18, 0x79, 0x05, 0xf2, 0x03, 0xb7, 0x27, + 0xe3, 0x68, 0xe0, 0xf6, 0xd4, 0x3f, 0x51, 0xa0, 0x5c, 0xf7, 0x7d, 0xa3, 0x73, 0x3c, 0xc5, 0x00, + 0x02, 0xe3, 0x72, 0x61, 0xe3, 0x92, 0x83, 0x18, 0x9a, 0x3b, 0x9b, 0x61, 0xee, 0x5c, 0xc4, 0x5c, + 0x15, 0x96, 0xa4, 0x2d, 0x99, 0x06, 0x37, 0x01, 0xb5, 0x88, 0xeb, 0x3f, 0x24, 0xee, 0x0b, 0xc3, + 0x35, 0xa7, 0xdb, 0x81, 0x21, 0x98, 0x15, 0x37, 0x5e, 0xf3, 0x57, 0xe6, 0x34, 0xf6, 0xac, 0x5e, + 0x86, 0x53, 0x11, 0x7d, 0x99, 0x1d, 0xdf, 0x87, 0x12, 0xcb, 0xfb, 0xa2, 0x14, 0xbf, 0x11, 0x3e, + 0xae, 0x99, 0x68, 0x95, 0x50, 0x7f, 0x17, 0x56, 0x68, 0x7d, 0xc0, 0xe8, 0xc1, 0xa7, 0xf8, 0xfd, + 0x58, 0x9d, 0x7a, 0x3e, 0x43, 0x51, 0xac, 0x46, 0xfd, 0x5b, 0x05, 0xe6, 0x18, 0x3d, 0xb1, 0x66, + 0x9f, 0x83, 0xa2, 0x8b, 0x1d, 0xa2, 0xfb, 0x46, 0x37, 0xb8, 0x5f, 0x4c, 0x09, 0xfb, 0x46, 0xd7, + 0x63, 0xd7, 0xa3, 0xe9, 0x4b, 0xd3, 0xea, 0x62, 0xcf, 0x97, 0x97, 0x8c, 0x4b, 0x94, 0xb6, 0xc3, + 0x49, 0xd4, 0x49, 0x9e, 0xf5, 0xfb, 0xbc, 0xee, 0x9c, 0xd5, 0xd8, 0x33, 0xda, 0xe4, 0x57, 0xde, + 0x26, 0x81, 0xd4, 0xd9, 0x85, 0xb8, 0x1a, 0x14, 0x62, 0x28, 0x7a, 0xd0, 0x56, 0x77, 0x01, 0x85, + 0xbd, 0x20, 0xfc, 0x7d, 0x1d, 0xe6, 0x99, 0x93, 0x64, 0x75, 0xb4, 0x96, 0xe1, 0x06, 0x4d, 0xb0, + 0xa9, 0x06, 0x20, 0xee, 0xe0, 0x48, 0x45, 0x34, 0xfd, 0xac, 0x8c, 0xa8, 0x90, 0xfe, 0x5e, 0x81, + 0x53, 0x91, 0x3e, 0x84, 0xad, 0xef, 0x45, 0x3b, 0xc9, 0x34, 0x55, 0x74, 0xb0, 0x1d, 0x59, 0x12, + 0xae, 0x67, 0x99, 0xf4, 0x1b, 0x5a, 0x0e, 0xfe, 0x41, 0x01, 0xa8, 0x0f, 0xfc, 0x63, 0x81, 0x0c, + 0x86, 0x67, 0x46, 0x89, 0xce, 0x0c, 0x7d, 0xe7, 0x18, 0x9e, 0xf7, 0x82, 0xb8, 0x72, 0x4f, 0x13, + 0xb4, 0x19, 0x86, 0x37, 0xf0, 0x8f, 0xe5, 0x51, 0x18, 0x7d, 0x46, 0x17, 0x61, 0x89, 0xdf, 0x69, + 0xd7, 0x0d, 0xd3, 0x74, 0xb1, 0xe7, 0x89, 0x33, 0xb1, 0x32, 0xa7, 0xd6, 0x39, 0x91, 0xb2, 0x59, + 0x26, 0xb6, 0x7d, 0xcb, 0x3f, 0xd1, 0x7d, 0xf2, 0x0c, 0xdb, 0x62, 0x6f, 0x52, 0x96, 0xd4, 0x7d, + 0x4a, 0xe4, 0x87, 0x03, 0x5d, 0xcb, 0xf3, 0x5d, 0xc9, 0x26, 0xcf, 0x5f, 0x04, 0x95, 0xb1, 0xd1, + 0x49, 0xa9, 0xb4, 0x06, 0xbd, 0x1e, 0x77, 0xf1, 0xab, 0x4f, 0xfb, 0xfb, 0x62, 0x40, 0xb9, 0xac, + 0x98, 0x1e, 0x3a, 0x4d, 0x0c, 0xf7, 0x35, 0x82, 0x30, 0xef, 0xc3, 0x4a, 0x68, 0x0c, 0x22, 0xac, + 0x22, 0x45, 0xa4, 0x12, 0x2d, 0x22, 0xd5, 0x47, 0x80, 0x38, 0xee, 0xf0, 0x0d, 0xc7, 0xad, 0x9e, + 0x86, 0x53, 0x11, 0x45, 0x62, 0x25, 0xbe, 0x06, 0x65, 0x71, 0x2f, 0x49, 0x04, 0xca, 0x59, 0x28, + 0xd0, 0x8c, 0xda, 0xb1, 0x4c, 0x79, 0x4e, 0xba, 0xe0, 0x10, 0x73, 0xdb, 0x32, 0x5d, 0xf5, 0x13, + 0x28, 0x6b, 0xbc, 0x1f, 0xc1, 0xfb, 0x10, 0x96, 0xc4, 0x2d, 0x26, 0x3d, 0x72, 0x8d, 0x30, 0xed, + 0x9a, 0x7a, 0xb8, 0x13, 0xad, 0x6c, 0x87, 0x9b, 0xaa, 0x09, 0x35, 0x5e, 0x32, 0x44, 0xd4, 0xcb, + 0xc1, 0x3e, 0x04, 0x79, 0xa3, 0x70, 0x6c, 0x2f, 0x51, 0xf9, 0xb2, 0x1b, 0x6e, 0xaa, 0xe7, 0xe1, + 0x5c, 0x6a, 0x2f, 0xc2, 0x13, 0x0e, 0x54, 0x86, 0x2f, 0x4c, 0x4b, 0x1e, 0x18, 0xb3, 0x83, 0x60, + 0x25, 0x74, 0x10, 0x7c, 0x26, 0x28, 0x12, 0x73, 0x72, 0x11, 0x63, 0x15, 0xe0, 0xb0, 0xdc, 0xcf, + 0x67, 0x95, 0xfb, 0xb3, 0x91, 0x72, 0x5f, 0x6d, 0x07, 0xfe, 0x14, 0xdb, 0xb0, 0x07, 0x6c, 0xbb, + 0xc8, 0xfb, 0x96, 0x09, 0x51, 0x1d, 0x35, 0x4a, 0xce, 0xaa, 0x85, 0xa4, 0xd4, 0xab, 0x50, 0x8e, + 0xa6, 0xc6, 0x50, 0x9e, 0x53, 0x12, 0x79, 0x6e, 0x29, 0x96, 0xe2, 0x3e, 0x8c, 0x55, 0xc0, 0xd9, + 0x3e, 0x8e, 0xd5, 0xbf, 0x77, 0x23, 0xc9, 0xee, 0x5a, 0xca, 0x19, 0xee, 0x6f, 0x28, 0xcf, 0xad, + 0x8a, 0xf5, 0xe0, 0xa1, 0x47, 0xe5, 0xc5, 0xa0, 0xd5, 0xb7, 0xa0, 0x74, 0x90, 0xf5, 0x1b, 0x88, + 0x59, 0x79, 0x5f, 0xe2, 0x26, 0xac, 0x3e, 0xb4, 0x7a, 0xd8, 0x3b, 0xf1, 0x7c, 0xdc, 0x6f, 0xb0, + 0xa4, 0x74, 0x64, 0x61, 0x17, 0xad, 0x03, 0xb0, 0x2d, 0x8c, 0x43, 0xac, 0xe0, 0x6a, 0x7c, 0x88, + 0xa2, 0xfe, 0x97, 0x02, 0xcb, 0x43, 0xc1, 0x03, 0xb6, 0x75, 0x7b, 0x03, 0x8a, 0x74, 0xbc, 0x9e, + 0x6f, 0xf4, 0x1d, 0x79, 0x9e, 0x15, 0x10, 0xd0, 0x1d, 0x98, 0x3b, 0xf2, 0x24, 0x64, 0x94, 0x0a, + 0xa0, 0xa7, 0x19, 0xa2, 0xcd, 0x1e, 0x79, 0x0d, 0x13, 0x7d, 0x04, 0x30, 0xf0, 0xb0, 0x29, 0xce, + 0xb0, 0xf2, 0x59, 0xd5, 0xc2, 0x41, 0xf8, 0x7c, 0x9b, 0x0a, 0xf0, 0xab, 0x16, 0x77, 0xa1, 0x64, + 0xd9, 0xc4, 0xc4, 0xec, 0xcc, 0xd1, 0x14, 0xa8, 0xd2, 0x18, 0x71, 0xe0, 0x12, 0x07, 0x1e, 0x36, + 0x55, 0x2c, 0xd6, 0x42, 0xe9, 0x5f, 0x11, 0x28, 0x4d, 0x58, 0xe1, 0x49, 0xeb, 0x28, 0x30, 0x5c, + 0x46, 0xec, 0xc6, 0xa8, 0xd1, 0x31, 0x6f, 0x69, 0x15, 0x4b, 0x94, 0x36, 0x52, 0x54, 0xbd, 0x0d, + 0xa7, 0x23, 0x3b, 0xa4, 0x29, 0xb6, 0x2c, 0x6a, 0x2b, 0x06, 0x94, 0x0c, 0xc3, 0x59, 0xc0, 0x10, + 0x32, 0x9a, 0xc7, 0xc1, 0x10, 0x1e, 0x87, 0x21, 0x3c, 0xf5, 0x73, 0x38, 0x1b, 0x41, 0x74, 0x22, + 0x16, 0xdd, 0x8d, 0x55, 0x6e, 0x97, 0xc6, 0x69, 0x8d, 0x95, 0x70, 0xff, 0xa3, 0xc0, 0x6a, 0x1a, + 0xc3, 0x2b, 0x22, 0x8e, 0x3f, 0xce, 0xb8, 0x56, 0x77, 0x6b, 0x32, 0xb3, 0x7e, 0x2b, 0x68, 0xed, + 0x3e, 0xd4, 0xd2, 0xfc, 0x99, 0x9c, 0xa5, 0xfc, 0x34, 0xb3, 0xf4, 0xb3, 0x7c, 0x08, 0x79, 0xaf, + 0xfb, 0xbe, 0x6b, 0x1d, 0x0e, 0x68, 0xc8, 0xbf, 0x76, 0x34, 0xab, 0x11, 0xe0, 0x32, 0xdc, 0xb5, + 0x37, 0x46, 0x88, 0x0f, 0xed, 0x48, 0xc5, 0x66, 0x3e, 0x8d, 0x62, 0x33, 0x1c, 0x53, 0xbf, 0x39, + 0x99, 0xbe, 0xef, 0x2c, 0x00, 0xfa, 0xb3, 0x1c, 0x2c, 0x45, 0xa7, 0x08, 0xed, 0x02, 0x18, 0x81, + 0xe5, 0xe2, 0x43, 0xb9, 0x38, 0xd1, 0x30, 0xb5, 0x90, 0x20, 0x7a, 0x17, 0xf2, 0x1d, 0x67, 0x20, + 0x66, 0x2d, 0xe5, 0x30, 0x78, 0xdb, 0x19, 0xf0, 0x8c, 0x42, 0xd9, 0xe8, 0x9e, 0x8a, 0x9f, 0xed, + 0x67, 0x67, 0xc9, 0xa7, 0xec, 0x3d, 0x97, 0x11, 0xcc, 0xe8, 0x31, 0x2c, 0xbd, 0x70, 0x2d, 0xdf, + 0x38, 0xec, 0x61, 0xbd, 0x67, 0x9c, 0x60, 0x57, 0x64, 0xc9, 0x09, 0x12, 0x59, 0x59, 0x0a, 0x3e, + 0xa1, 0x72, 0xea, 0x1f, 0x42, 0x41, 0x5a, 0x34, 0x66, 0x45, 0xd8, 0x87, 0xb5, 0x01, 0x65, 0xd3, + 0xd9, 0x15, 0x38, 0xdb, 0xb0, 0x89, 0xee, 0x61, 0xba, 0x8c, 0xcb, 0xcb, 0xf9, 0x63, 0x52, 0xf4, + 0x2a, 0x93, 0xde, 0x26, 0x2e, 0x6e, 0x1a, 0x36, 0x69, 0x73, 0x51, 0xf5, 0x39, 0x94, 0x42, 0x03, + 0x1c, 0x63, 0x42, 0x03, 0x56, 0xe4, 0x51, 0xbc, 0x87, 0x7d, 0xb1, 0xbc, 0x4c, 0xd4, 0xf9, 0xb2, + 0x90, 0x6b, 0x63, 0x9f, 0x5f, 0x9f, 0xb8, 0x0b, 0x67, 0x35, 0x4c, 0x1c, 0x6c, 0x07, 0xf3, 0xf9, + 0x84, 0x74, 0xa7, 0xc8, 0xe0, 0x6f, 0x40, 0x2d, 0x4d, 0x9e, 0xe7, 0x87, 0x6b, 0x97, 0xa0, 0x20, + 0x7f, 0xd0, 0x8a, 0x16, 0x20, 0xbf, 0xbf, 0xdd, 0xaa, 0xcc, 0xd0, 0x87, 0x83, 0x9d, 0x56, 0x45, + 0x41, 0x05, 0x98, 0x6d, 0x6f, 0xef, 0xb7, 0x2a, 0xb9, 0x6b, 0x7d, 0xa8, 0xc4, 0x7f, 0xcd, 0x89, + 0xd6, 0xe0, 0x54, 0x4b, 0xdb, 0x6b, 0xd5, 0x1f, 0xd5, 0xf7, 0x1b, 0x7b, 0x4d, 0xbd, 0xa5, 0x35, + 0x3e, 0xae, 0xef, 0xef, 0x56, 0x66, 0xd0, 0x06, 0x9c, 0x0f, 0xbf, 0x78, 0xbc, 0xd7, 0xde, 0xd7, + 0xf7, 0xf7, 0xf4, 0xed, 0xbd, 0xe6, 0x7e, 0xbd, 0xd1, 0xdc, 0xd5, 0x2a, 0x0a, 0x3a, 0x0f, 0x67, + 0xc3, 0x2c, 0x0f, 0x1a, 0x3b, 0x0d, 0x6d, 0x77, 0x9b, 0x3e, 0xd7, 0x9f, 0x54, 0x72, 0xd7, 0x6e, + 0x40, 0x39, 0xf2, 0xe3, 0x4b, 0x6a, 0x52, 0x6b, 0x6f, 0xa7, 0x32, 0x83, 0xca, 0x50, 0x0c, 0xeb, + 0x29, 0xc0, 0x6c, 0x73, 0x6f, 0x67, 0xb7, 0x92, 0xbb, 0x76, 0x1b, 0x96, 0x63, 0xb7, 0x71, 0xd1, + 0x0a, 0x94, 0xdb, 0xf5, 0xe6, 0xce, 0x83, 0xbd, 0x4f, 0x75, 0x6d, 0xb7, 0xbe, 0xf3, 0x59, 0x65, + 0x06, 0xad, 0x42, 0x45, 0x92, 0x9a, 0x7b, 0xfb, 0x9c, 0xaa, 0x5c, 0x7b, 0x16, 0xfb, 0xc6, 0x30, + 0x3a, 0x0d, 0x2b, 0x41, 0x37, 0xfa, 0xb6, 0xb6, 0x5b, 0xdf, 0xdf, 0xa5, 0xbd, 0x47, 0xc8, 0xda, + 0x41, 0xb3, 0xd9, 0x68, 0x3e, 0xaa, 0x28, 0x54, 0xeb, 0x90, 0xbc, 0xfb, 0x69, 0x83, 0x32, 0xe7, + 0xa2, 0xcc, 0x07, 0xcd, 0x1f, 0x36, 0xf7, 0x3e, 0x69, 0x56, 0xf2, 0x5b, 0xbf, 0x58, 0x81, 0x25, + 0x59, 0xe8, 0x61, 0x97, 0xdd, 0x6a, 0x69, 0xc1, 0x82, 0xfc, 0x81, 0x74, 0x4a, 0x86, 0x8e, 0xfe, + 0xac, 0xbb, 0xb6, 0x31, 0x82, 0x43, 0xd4, 0xdb, 0x33, 0xe8, 0x90, 0xd5, 0xbf, 0xa1, 0xdb, 0xd1, + 0x97, 0x52, 0xab, 0xcd, 0xc4, 0x85, 0xec, 0xda, 0xe5, 0xb1, 0x7c, 0x41, 0x1f, 0x98, 0x96, 0xb8, + 0xe1, 0x9f, 0xff, 0xa0, 0xcb, 0x69, 0xb5, 0x69, 0xca, 0xef, 0x8b, 0x6a, 0x57, 0xc6, 0x33, 0x06, + 0xdd, 0x3c, 0x83, 0x4a, 0xfc, 0xa7, 0x40, 0x28, 0x05, 0x3a, 0xcd, 0xf8, 0xbd, 0x51, 0xed, 0xda, + 0x24, 0xac, 0xe1, 0xce, 0x12, 0x3f, 0x9a, 0xb9, 0x3a, 0xc9, 0xaf, 0x10, 0x32, 0x3b, 0xcb, 0xfa, + 0xc1, 0x02, 0x77, 0x60, 0xf4, 0xe6, 0x33, 0x4a, 0xfd, 0x85, 0x4a, 0xca, 0xbd, 0xf9, 0x34, 0x07, + 0xa6, 0x5f, 0xa2, 0x56, 0x67, 0xd0, 0x31, 0x2c, 0xc7, 0xae, 0x27, 0xa0, 0x14, 0xf1, 0xf4, 0x7b, + 0x18, 0xb5, 0xab, 0x13, 0x70, 0x46, 0x23, 0x22, 0x7c, 0x1d, 0x21, 0x3d, 0x22, 0x52, 0x2e, 0x3b, + 0xa4, 0x47, 0x44, 0xea, 0xcd, 0x06, 0x16, 0xdc, 0x91, 0x6b, 0x08, 0x69, 0xc1, 0x9d, 0x76, 0xf9, + 0xa1, 0x76, 0x79, 0x2c, 0x5f, 0xd8, 0x69, 0xb1, 0x4b, 0x09, 0x69, 0x4e, 0x4b, 0xbf, 0xf4, 0x50, + 0xbb, 0x3a, 0x01, 0x67, 0x3c, 0x0a, 0x86, 0x47, 0x9c, 0x59, 0x51, 0x90, 0x38, 0x90, 0xcf, 0x8a, + 0x82, 0xe4, 0x69, 0xa9, 0x88, 0x82, 0xd8, 0xd1, 0xe4, 0x95, 0x09, 0x8e, 0x52, 0xb2, 0xa3, 0x20, + 0xfd, 0xd0, 0x45, 0x9d, 0x41, 0x7f, 0xa4, 0x40, 0x35, 0xeb, 0x98, 0x02, 0xa5, 0xd4, 0x77, 0x63, + 0x4e, 0x56, 0x6a, 0x5b, 0xd3, 0x88, 0x04, 0x56, 0x7c, 0x09, 0x28, 0xb9, 0xee, 0xa1, 0x77, 0xd2, + 0x66, 0x26, 0x63, 0x75, 0xad, 0xbd, 0x3b, 0x19, 0x73, 0xd0, 0x65, 0x1b, 0x0a, 0xf2, 0x60, 0x04, + 0xa5, 0x64, 0xe9, 0xd8, 0xb1, 0x4c, 0x4d, 0x1d, 0xc5, 0x12, 0x28, 0x7d, 0x04, 0xb3, 0x94, 0x8a, + 0xce, 0xa7, 0x73, 0x4b, 0x65, 0xeb, 0x59, 0xaf, 0x03, 0x45, 0x4f, 0x61, 0x9e, 0x9f, 0x04, 0xa0, + 0x14, 0xe4, 0x21, 0x72, 0x5e, 0x51, 0xbb, 0x90, 0xcd, 0x10, 0xa8, 0xfb, 0x82, 0xff, 0xef, 0x0c, + 0x01, 0xf2, 0xa3, 0xb7, 0xd3, 0x7f, 0x8c, 0x1c, 0x3d, 0x53, 0xa8, 0x5d, 0x1c, 0xc3, 0x15, 0xfe, + 0x28, 0x62, 0x55, 0xef, 0xe5, 0xb1, 0x5b, 0x97, 0xec, 0x8f, 0x22, 0x7d, 0x73, 0xc4, 0x83, 0x24, + 0xb9, 0x79, 0x4a, 0x0b, 0x92, 0xcc, 0x2d, 0x6b, 0x5a, 0x90, 0x64, 0xef, 0xc7, 0xd4, 0x19, 0xe4, + 0xc3, 0xa9, 0x14, 0xa8, 0x0c, 0xbd, 0x9b, 0x15, 0xe4, 0x69, 0xb8, 0x5d, 0xed, 0xbd, 0x09, 0xb9, + 0xc3, 0x93, 0x2f, 0x3e, 0xfa, 0x37, 0xb3, 0xf1, 0xa3, 0xcc, 0xc9, 0x8f, 0x7f, 0xe2, 0x5b, 0xff, + 0x9a, 0x87, 0x45, 0x0e, 0x83, 0x8a, 0x0a, 0xe6, 0x33, 0x80, 0xe1, 0x09, 0x04, 0x7a, 0x2b, 0xdd, + 0x27, 0x91, 0x53, 0x9a, 0xda, 0xdb, 0xa3, 0x99, 0xc2, 0x81, 0x16, 0x42, 0xf3, 0xd3, 0x02, 0x2d, + 0x79, 0x68, 0x91, 0x16, 0x68, 0x29, 0x47, 0x02, 0xea, 0x0c, 0xfa, 0x18, 0x8a, 0x01, 0x6c, 0x8c, + 0xd2, 0x60, 0xe7, 0x18, 0x2e, 0x5e, 0x7b, 0x6b, 0x24, 0x4f, 0xd8, 0xea, 0x10, 0x26, 0x9c, 0x66, + 0x75, 0x12, 0x7b, 0x4e, 0xb3, 0x3a, 0x0d, 0x58, 0x1e, 0xfa, 0x84, 0x23, 0x47, 0x99, 0x3e, 0x89, + 0x00, 0x77, 0x99, 0x3e, 0x89, 0xc2, 0x4f, 0xea, 0xcc, 0x83, 0x4b, 0xbf, 0xfa, 0x6a, 0x5d, 0xf9, + 0xa7, 0xaf, 0xd6, 0x67, 0x7e, 0xfa, 0xf5, 0xba, 0xf2, 0xab, 0xaf, 0xd7, 0x95, 0x7f, 0xfc, 0x7a, + 0x5d, 0xf9, 0xb7, 0xaf, 0xd7, 0x95, 0x3f, 0xfb, 0xf7, 0xf5, 0x99, 0x1f, 0x15, 0xa4, 0xf4, 0xe1, + 0x3c, 0xfb, 0x0f, 0x38, 0x1f, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x15, 0x30, 0x49, 0xcc, + 0xc7, 0x48, 0x00, 0x00, } diff --git a/pkg/registry/policy/podsecuritypolicy/BUILD b/pkg/registry/policy/podsecuritypolicy/BUILD index b615df72e27..cb5abb2c5c9 100644 --- a/pkg/registry/policy/podsecuritypolicy/BUILD +++ b/pkg/registry/policy/podsecuritypolicy/BUILD @@ -14,6 +14,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/registry/policy/podsecuritypolicy", deps = [ "//pkg/api/legacyscheme:go_default_library", + "//pkg/api/podsecuritypolicy:go_default_library", "//pkg/apis/policy:go_default_library", "//pkg/apis/policy/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index 5e00fffb3d8..cce5b3fb160 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -9562,6 +9562,12 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(*m.RunAsGroup)) } + if m.ProcMount != nil { + dAtA[i] = 0x4a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.ProcMount))) + i += copy(dAtA[i:], *m.ProcMount) + } return i, nil } @@ -13971,6 +13977,10 @@ func (m *SecurityContext) Size() (n int) { if m.RunAsGroup != nil { n += 1 + sovGenerated(uint64(*m.RunAsGroup)) } + if m.ProcMount != nil { + l = len(*m.ProcMount) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -16883,6 +16893,7 @@ func (this *SecurityContext) String() string { `ReadOnlyRootFilesystem:` + valueToStringGenerated(this.ReadOnlyRootFilesystem) + `,`, `AllowPrivilegeEscalation:` + valueToStringGenerated(this.AllowPrivilegeEscalation) + `,`, `RunAsGroup:` + valueToStringGenerated(this.RunAsGroup) + `,`, + `ProcMount:` + valueToStringGenerated(this.ProcMount) + `,`, `}`, }, "") return s @@ -46322,6 +46333,36 @@ func (m *SecurityContext) Unmarshal(dAtA []byte) error { } } m.RunAsGroup = &v + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProcMount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := ProcMountType(dAtA[iNdEx:postIndex]) + m.ProcMount = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -51259,802 +51300,804 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 12746 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x6c, 0x24, 0x57, - 0x76, 0x18, 0xbc, 0xd5, 0xdd, 0x7c, 0xf4, 0xe1, 0xfb, 0xce, 0x43, 0x1c, 0x4a, 0x33, 0x3d, 0x2a, - 0xed, 0x8e, 0x46, 0x2b, 0x89, 0xb3, 0x1a, 0x49, 0x2b, 0x79, 0xb5, 0x2b, 0x9b, 0x64, 0x93, 0x33, - 0xad, 0x19, 0x72, 0x5a, 0xb7, 0x39, 0xa3, 0x5d, 0x59, 0xbb, 0xde, 0x62, 0xf7, 0x25, 0x59, 0x62, - 0xb1, 0xaa, 0x55, 0x55, 0xcd, 0x19, 0xea, 0xb3, 0x81, 0xef, 0x5b, 0x7f, 0x76, 0xe2, 0xd8, 0x09, - 0x16, 0xb1, 0x91, 0x87, 0x6d, 0x38, 0x80, 0xe3, 0xc0, 0x76, 0x9c, 0x04, 0x71, 0xec, 0xd8, 0xce, - 0xae, 0x9d, 0x38, 0x76, 0x7e, 0x38, 0x40, 0xb0, 0x71, 0x02, 0x04, 0x6b, 0xc0, 0x08, 0x63, 0xd3, - 0x79, 0xc0, 0x3f, 0xf2, 0x40, 0x9c, 0x3f, 0x66, 0x8c, 0x38, 0xb8, 0xcf, 0xba, 0xb7, 0xba, 0xaa, - 0xbb, 0x39, 0xe2, 0x50, 0xb2, 0xb1, 0xff, 0xba, 0xef, 0x39, 0xf7, 0xdc, 0x5b, 0xf7, 0x79, 0xce, - 0xb9, 0xe7, 0x01, 0xaf, 0xed, 0xbc, 0x1a, 0xcd, 0xbb, 0xc1, 0xb5, 0x9d, 0xce, 0x06, 0x09, 0x7d, - 0x12, 0x93, 0xe8, 0xda, 0x1e, 0xf1, 0x5b, 0x41, 0x78, 0x4d, 0x00, 0x9c, 0xb6, 0x7b, 0xad, 0x19, - 0x84, 0xe4, 0xda, 0xde, 0x0b, 0xd7, 0xb6, 0x88, 0x4f, 0x42, 0x27, 0x26, 0xad, 0xf9, 0x76, 0x18, - 0xc4, 0x01, 0x42, 0x1c, 0x67, 0xde, 0x69, 0xbb, 0xf3, 0x14, 0x67, 0x7e, 0xef, 0x85, 0xb9, 0xe7, - 0xb7, 0xdc, 0x78, 0xbb, 0xb3, 0x31, 0xdf, 0x0c, 0x76, 0xaf, 0x6d, 0x05, 0x5b, 0xc1, 0x35, 0x86, - 0xba, 0xd1, 0xd9, 0x64, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x93, 0x98, 0x7b, 0x29, 0x69, 0x66, 0xd7, - 0x69, 0x6e, 0xbb, 0x3e, 0x09, 0xf7, 0xaf, 0xb5, 0x77, 0xb6, 0x58, 0xbb, 0x21, 0x89, 0x82, 0x4e, - 0xd8, 0x24, 0xe9, 0x86, 0x7b, 0xd6, 0x8a, 0xae, 0xed, 0x92, 0xd8, 0xc9, 0xe8, 0xee, 0xdc, 0xb5, - 0xbc, 0x5a, 0x61, 0xc7, 0x8f, 0xdd, 0xdd, 0xee, 0x66, 0x3e, 0xdd, 0xaf, 0x42, 0xd4, 0xdc, 0x26, - 0xbb, 0x4e, 0x57, 0xbd, 0x17, 0xf3, 0xea, 0x75, 0x62, 0xd7, 0xbb, 0xe6, 0xfa, 0x71, 0x14, 0x87, - 0xe9, 0x4a, 0xf6, 0x37, 0x2d, 0xb8, 0xbc, 0xf0, 0x56, 0x63, 0xd9, 0x73, 0xa2, 0xd8, 0x6d, 0x2e, - 0x7a, 0x41, 0x73, 0xa7, 0x11, 0x07, 0x21, 0xb9, 0x17, 0x78, 0x9d, 0x5d, 0xd2, 0x60, 0x03, 0x81, - 0x9e, 0x83, 0xd1, 0x3d, 0xf6, 0xbf, 0x56, 0x9d, 0xb5, 0x2e, 0x5b, 0x57, 0xcb, 0x8b, 0xd3, 0xbf, - 0x75, 0x50, 0xf9, 0xd8, 0xe1, 0x41, 0x65, 0xf4, 0x9e, 0x28, 0xc7, 0x0a, 0x03, 0x5d, 0x81, 0xe1, - 0xcd, 0x68, 0x7d, 0xbf, 0x4d, 0x66, 0x0b, 0x0c, 0x77, 0x52, 0xe0, 0x0e, 0xaf, 0x34, 0x68, 0x29, - 0x16, 0x50, 0x74, 0x0d, 0xca, 0x6d, 0x27, 0x8c, 0xdd, 0xd8, 0x0d, 0xfc, 0xd9, 0xe2, 0x65, 0xeb, - 0xea, 0xd0, 0xe2, 0x8c, 0x40, 0x2d, 0xd7, 0x25, 0x00, 0x27, 0x38, 0xb4, 0x1b, 0x21, 0x71, 0x5a, - 0x77, 0x7c, 0x6f, 0x7f, 0xb6, 0x74, 0xd9, 0xba, 0x3a, 0x9a, 0x74, 0x03, 0x8b, 0x72, 0xac, 0x30, - 0xec, 0x1f, 0x2d, 0xc0, 0xe8, 0xc2, 0xe6, 0xa6, 0xeb, 0xbb, 0xf1, 0x3e, 0xba, 0x07, 0xe3, 0x7e, - 0xd0, 0x22, 0xf2, 0x3f, 0xfb, 0x8a, 0xb1, 0xeb, 0x97, 0xe7, 0xbb, 0x97, 0xd2, 0xfc, 0x9a, 0x86, - 0xb7, 0x38, 0x7d, 0x78, 0x50, 0x19, 0xd7, 0x4b, 0xb0, 0x41, 0x07, 0x61, 0x18, 0x6b, 0x07, 0x2d, - 0x45, 0xb6, 0xc0, 0xc8, 0x56, 0xb2, 0xc8, 0xd6, 0x13, 0xb4, 0xc5, 0xa9, 0xc3, 0x83, 0xca, 0x98, - 0x56, 0x80, 0x75, 0x22, 0x68, 0x03, 0xa6, 0xe8, 0x5f, 0x3f, 0x76, 0x15, 0xdd, 0x22, 0xa3, 0xfb, - 0x54, 0x1e, 0x5d, 0x0d, 0x75, 0xf1, 0xcc, 0xe1, 0x41, 0x65, 0x2a, 0x55, 0x88, 0xd3, 0x04, 0xed, - 0xf7, 0x61, 0x72, 0x21, 0x8e, 0x9d, 0xe6, 0x36, 0x69, 0xf1, 0x19, 0x44, 0x2f, 0x41, 0xc9, 0x77, - 0x76, 0x89, 0x98, 0xdf, 0xcb, 0x62, 0x60, 0x4b, 0x6b, 0xce, 0x2e, 0x39, 0x3a, 0xa8, 0x4c, 0xdf, - 0xf5, 0xdd, 0xf7, 0x3a, 0x62, 0x55, 0xd0, 0x32, 0xcc, 0xb0, 0xd1, 0x75, 0x80, 0x16, 0xd9, 0x73, - 0x9b, 0xa4, 0xee, 0xc4, 0xdb, 0x62, 0xbe, 0x91, 0xa8, 0x0b, 0x55, 0x05, 0xc1, 0x1a, 0x96, 0xfd, - 0x00, 0xca, 0x0b, 0x7b, 0x81, 0xdb, 0xaa, 0x07, 0xad, 0x08, 0xed, 0xc0, 0x54, 0x3b, 0x24, 0x9b, - 0x24, 0x54, 0x45, 0xb3, 0xd6, 0xe5, 0xe2, 0xd5, 0xb1, 0xeb, 0x57, 0x33, 0x3f, 0xd6, 0x44, 0x5d, - 0xf6, 0xe3, 0x70, 0x7f, 0xf1, 0x31, 0xd1, 0xde, 0x54, 0x0a, 0x8a, 0xd3, 0x94, 0xed, 0x7f, 0x51, - 0x80, 0x73, 0x0b, 0xef, 0x77, 0x42, 0x52, 0x75, 0xa3, 0x9d, 0xf4, 0x0a, 0x6f, 0xb9, 0xd1, 0xce, - 0x5a, 0x32, 0x02, 0x6a, 0x69, 0x55, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x79, 0x18, 0xa1, 0xbf, 0xef, - 0xe2, 0x9a, 0xf8, 0xe4, 0x33, 0x02, 0x79, 0xac, 0xea, 0xc4, 0x4e, 0x95, 0x83, 0xb0, 0xc4, 0x41, - 0xab, 0x30, 0xd6, 0x64, 0x1b, 0x72, 0x6b, 0x35, 0x68, 0x11, 0x36, 0x99, 0xe5, 0xc5, 0x67, 0x29, - 0xfa, 0x52, 0x52, 0x7c, 0x74, 0x50, 0x99, 0xe5, 0x7d, 0x13, 0x24, 0x34, 0x18, 0xd6, 0xeb, 0x23, - 0x5b, 0xed, 0xaf, 0x12, 0xa3, 0x04, 0x19, 0x7b, 0xeb, 0xaa, 0xb6, 0x55, 0x86, 0xd8, 0x56, 0x19, - 0xcf, 0xde, 0x26, 0xe8, 0x05, 0x28, 0xed, 0xb8, 0x7e, 0x6b, 0x76, 0x98, 0xd1, 0xba, 0x48, 0xe7, - 0xfc, 0x96, 0xeb, 0xb7, 0x8e, 0x0e, 0x2a, 0x33, 0x46, 0x77, 0x68, 0x21, 0x66, 0xa8, 0xf6, 0x1f, - 0x59, 0x50, 0x61, 0xb0, 0x15, 0xd7, 0x23, 0x75, 0x12, 0x46, 0x6e, 0x14, 0x13, 0x3f, 0x36, 0x06, - 0xf4, 0x3a, 0x40, 0x44, 0x9a, 0x21, 0x89, 0xb5, 0x21, 0x55, 0x0b, 0xa3, 0xa1, 0x20, 0x58, 0xc3, - 0xa2, 0x07, 0x42, 0xb4, 0xed, 0x84, 0x6c, 0x7d, 0x89, 0x81, 0x55, 0x07, 0x42, 0x43, 0x02, 0x70, - 0x82, 0x63, 0x1c, 0x08, 0xc5, 0x7e, 0x07, 0x02, 0xfa, 0x1c, 0x4c, 0x25, 0x8d, 0x45, 0x6d, 0xa7, - 0x29, 0x07, 0x90, 0x6d, 0x99, 0x86, 0x09, 0xc2, 0x69, 0x5c, 0xfb, 0xef, 0x5a, 0x62, 0xf1, 0xd0, - 0xaf, 0xfe, 0x88, 0x7f, 0xab, 0xfd, 0x2b, 0x16, 0x8c, 0x2c, 0xba, 0x7e, 0xcb, 0xf5, 0xb7, 0xd0, - 0x97, 0x61, 0x94, 0xde, 0x4d, 0x2d, 0x27, 0x76, 0xc4, 0xb9, 0xf7, 0x29, 0x6d, 0x6f, 0xa9, 0xab, - 0x62, 0xbe, 0xbd, 0xb3, 0x45, 0x0b, 0xa2, 0x79, 0x8a, 0x4d, 0x77, 0xdb, 0x9d, 0x8d, 0x77, 0x49, - 0x33, 0x5e, 0x25, 0xb1, 0x93, 0x7c, 0x4e, 0x52, 0x86, 0x15, 0x55, 0x74, 0x0b, 0x86, 0x63, 0x27, - 0xdc, 0x22, 0xb1, 0x38, 0x00, 0x33, 0x0f, 0x2a, 0x5e, 0x13, 0xd3, 0x1d, 0x49, 0xfc, 0x26, 0x49, - 0xae, 0x85, 0x75, 0x56, 0x15, 0x0b, 0x12, 0xf6, 0x5f, 0x1a, 0x86, 0x0b, 0x4b, 0x8d, 0x5a, 0xce, - 0xba, 0xba, 0x02, 0xc3, 0xad, 0xd0, 0xdd, 0x23, 0xa1, 0x18, 0x67, 0x45, 0xa5, 0xca, 0x4a, 0xb1, - 0x80, 0xa2, 0x57, 0x61, 0x9c, 0x5f, 0x48, 0x37, 0x1d, 0xbf, 0xe5, 0xc9, 0x21, 0x3e, 0x2b, 0xb0, - 0xc7, 0xef, 0x69, 0x30, 0x6c, 0x60, 0x1e, 0x73, 0x51, 0x5d, 0x49, 0x6d, 0xc6, 0xbc, 0xcb, 0xee, - 0x07, 0x2c, 0x98, 0xe6, 0xcd, 0x2c, 0xc4, 0x71, 0xe8, 0x6e, 0x74, 0x62, 0x12, 0xcd, 0x0e, 0xb1, - 0x93, 0x6e, 0x29, 0x6b, 0xb4, 0x72, 0x47, 0x60, 0xfe, 0x5e, 0x8a, 0x0a, 0x3f, 0x04, 0x67, 0x45, - 0xbb, 0xd3, 0x69, 0x30, 0xee, 0x6a, 0x16, 0x7d, 0xaf, 0x05, 0x73, 0xcd, 0xc0, 0x8f, 0xc3, 0xc0, - 0xf3, 0x48, 0x58, 0xef, 0x6c, 0x78, 0x6e, 0xb4, 0xcd, 0xd7, 0x29, 0x26, 0x9b, 0xec, 0x24, 0xc8, - 0x99, 0x43, 0x85, 0x24, 0xe6, 0xf0, 0xd2, 0xe1, 0x41, 0x65, 0x6e, 0x29, 0x97, 0x14, 0xee, 0xd1, - 0x0c, 0xda, 0x01, 0x44, 0xaf, 0xd2, 0x46, 0xec, 0x6c, 0x91, 0xa4, 0xf1, 0x91, 0xc1, 0x1b, 0x3f, - 0x7f, 0x78, 0x50, 0x41, 0x6b, 0x5d, 0x24, 0x70, 0x06, 0x59, 0xf4, 0x1e, 0x9c, 0xa5, 0xa5, 0x5d, - 0xdf, 0x3a, 0x3a, 0x78, 0x73, 0xb3, 0x87, 0x07, 0x95, 0xb3, 0x6b, 0x19, 0x44, 0x70, 0x26, 0xe9, - 0xb9, 0x25, 0x38, 0x97, 0x39, 0x55, 0x68, 0x1a, 0x8a, 0x3b, 0x84, 0xb3, 0x20, 0x65, 0x4c, 0x7f, - 0xa2, 0xb3, 0x30, 0xb4, 0xe7, 0x78, 0x1d, 0xb1, 0x4a, 0x31, 0xff, 0xf3, 0x99, 0xc2, 0xab, 0x96, - 0xdd, 0x84, 0xf1, 0x25, 0xa7, 0xed, 0x6c, 0xb8, 0x9e, 0x1b, 0xbb, 0x24, 0x42, 0x4f, 0x43, 0xd1, - 0x69, 0xb5, 0xd8, 0x15, 0x59, 0x5e, 0x3c, 0x77, 0x78, 0x50, 0x29, 0x2e, 0xb4, 0xe8, 0x59, 0x0d, - 0x0a, 0x6b, 0x1f, 0x53, 0x0c, 0xf4, 0x49, 0x28, 0xb5, 0xc2, 0xa0, 0x3d, 0x5b, 0x60, 0x98, 0x74, - 0xa8, 0x4a, 0xd5, 0x30, 0x68, 0xa7, 0x50, 0x19, 0x8e, 0xfd, 0xeb, 0x05, 0x78, 0x62, 0x89, 0xb4, - 0xb7, 0x57, 0x1a, 0x39, 0x9b, 0xee, 0x2a, 0x8c, 0xee, 0x06, 0xbe, 0x1b, 0x07, 0x61, 0x24, 0x9a, - 0x66, 0xb7, 0xc9, 0xaa, 0x28, 0xc3, 0x0a, 0x8a, 0x2e, 0x43, 0xa9, 0x9d, 0x70, 0x02, 0xe3, 0x92, - 0x8b, 0x60, 0x3c, 0x00, 0x83, 0x50, 0x8c, 0x4e, 0x44, 0x42, 0x71, 0x0b, 0x2a, 0x8c, 0xbb, 0x11, - 0x09, 0x31, 0x83, 0x24, 0xc7, 0x29, 0x3d, 0x68, 0xc5, 0xb6, 0x4a, 0x1d, 0xa7, 0x14, 0x82, 0x35, - 0x2c, 0x54, 0x87, 0x72, 0xa4, 0x26, 0x75, 0x68, 0xf0, 0x49, 0x9d, 0x60, 0xe7, 0xad, 0x9a, 0xc9, - 0x84, 0x88, 0x71, 0x0c, 0x0c, 0xf7, 0x3d, 0x6f, 0xbf, 0x5e, 0x00, 0xc4, 0x87, 0xf0, 0xcf, 0xd8, - 0xc0, 0xdd, 0xed, 0x1e, 0xb8, 0x4c, 0xce, 0xeb, 0x76, 0xd0, 0x74, 0xbc, 0xf4, 0x11, 0x7e, 0x52, - 0xa3, 0xf7, 0xbf, 0x2c, 0x78, 0x62, 0xc9, 0xf5, 0x5b, 0x24, 0xcc, 0x59, 0x80, 0x8f, 0x46, 0x00, - 0x39, 0xde, 0x49, 0x6f, 0x2c, 0xb1, 0xd2, 0x09, 0x2c, 0x31, 0xfb, 0xbf, 0x5b, 0x80, 0xf8, 0x67, - 0x7f, 0xe4, 0x3e, 0xf6, 0x6e, 0xf7, 0xc7, 0x9e, 0xc0, 0xb2, 0xb0, 0x6f, 0xc3, 0xe4, 0x92, 0xe7, - 0x12, 0x3f, 0xae, 0xd5, 0x97, 0x02, 0x7f, 0xd3, 0xdd, 0x42, 0x9f, 0x81, 0x49, 0x2a, 0xd3, 0x06, - 0x9d, 0xb8, 0x41, 0x9a, 0x81, 0xcf, 0xd8, 0x7f, 0x2a, 0x09, 0xa2, 0xc3, 0x83, 0xca, 0xe4, 0xba, - 0x01, 0xc1, 0x29, 0x4c, 0xfb, 0x77, 0xe9, 0xf8, 0x05, 0xbb, 0xed, 0xc0, 0x27, 0x7e, 0xbc, 0x14, - 0xf8, 0x2d, 0x2e, 0x26, 0x7e, 0x06, 0x4a, 0x31, 0x1d, 0x0f, 0x3e, 0x76, 0x57, 0xe4, 0x46, 0xa1, - 0xa3, 0x70, 0x74, 0x50, 0x39, 0xdf, 0x5d, 0x83, 0x8d, 0x13, 0xab, 0x83, 0xbe, 0x0d, 0x86, 0xa3, - 0xd8, 0x89, 0x3b, 0x91, 0x18, 0xcd, 0x27, 0xe5, 0x68, 0x36, 0x58, 0xe9, 0xd1, 0x41, 0x65, 0x4a, - 0x55, 0xe3, 0x45, 0x58, 0x54, 0x40, 0xcf, 0xc0, 0xc8, 0x2e, 0x89, 0x22, 0x67, 0x4b, 0x72, 0xf8, - 0x53, 0xa2, 0xee, 0xc8, 0x2a, 0x2f, 0xc6, 0x12, 0x8e, 0x9e, 0x82, 0x21, 0x12, 0x86, 0x41, 0x28, - 0xf6, 0xe8, 0x84, 0x40, 0x1c, 0x5a, 0xa6, 0x85, 0x98, 0xc3, 0xec, 0x7f, 0x6d, 0xc1, 0x94, 0xea, - 0x2b, 0x6f, 0xeb, 0x14, 0x58, 0xb9, 0xb7, 0x01, 0x9a, 0xf2, 0x03, 0x23, 0x76, 0x7b, 0x8c, 0x5d, - 0xbf, 0x92, 0xc9, 0xa0, 0x74, 0x0d, 0x63, 0x42, 0x59, 0x15, 0x45, 0x58, 0xa3, 0x66, 0xff, 0x9a, - 0x05, 0x67, 0x52, 0x5f, 0x74, 0xdb, 0x8d, 0x62, 0xf4, 0x4e, 0xd7, 0x57, 0xcd, 0x0f, 0xf6, 0x55, - 0xb4, 0x36, 0xfb, 0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, 0x37, 0x61, 0xc8, 0x8d, 0xc9, 0xae, - 0xfc, 0x98, 0xa7, 0x7a, 0x7e, 0x0c, 0xef, 0x55, 0x32, 0x23, 0x35, 0x5a, 0x13, 0x73, 0x02, 0xf6, - 0x0f, 0x17, 0xa1, 0xcc, 0x97, 0xed, 0xaa, 0xd3, 0x3e, 0x85, 0xb9, 0xa8, 0x41, 0x89, 0x51, 0xe7, - 0x1d, 0x7f, 0x3a, 0xbb, 0xe3, 0xa2, 0x3b, 0xf3, 0x54, 0x4e, 0xe3, 0xac, 0xa0, 0xba, 0x1a, 0x68, - 0x11, 0x66, 0x24, 0x90, 0x03, 0xb0, 0xe1, 0xfa, 0x4e, 0xb8, 0x4f, 0xcb, 0x66, 0x8b, 0x8c, 0xe0, - 0xf3, 0xbd, 0x09, 0x2e, 0x2a, 0x7c, 0x4e, 0x56, 0xf5, 0x35, 0x01, 0x60, 0x8d, 0xe8, 0xdc, 0x2b, - 0x50, 0x56, 0xc8, 0xc7, 0xe1, 0x71, 0xe6, 0x3e, 0x07, 0x53, 0xa9, 0xb6, 0xfa, 0x55, 0x1f, 0xd7, - 0x59, 0xa4, 0xaf, 0xb1, 0x53, 0x40, 0xf4, 0x7a, 0xd9, 0xdf, 0x13, 0xa7, 0xe8, 0xfb, 0x70, 0xd6, - 0xcb, 0x38, 0x9c, 0xc4, 0x54, 0x0d, 0x7e, 0x98, 0x3d, 0x21, 0x3e, 0xfb, 0x6c, 0x16, 0x14, 0x67, - 0xb6, 0x41, 0xaf, 0xfd, 0xa0, 0x4d, 0xd7, 0xbc, 0xe3, 0xb1, 0xfe, 0x0a, 0xe9, 0xfb, 0x8e, 0x28, - 0xc3, 0x0a, 0x4a, 0x8f, 0xb0, 0xb3, 0xaa, 0xf3, 0xb7, 0xc8, 0x7e, 0x83, 0x78, 0xa4, 0x19, 0x07, - 0xe1, 0x87, 0xda, 0xfd, 0x8b, 0x7c, 0xf4, 0xf9, 0x09, 0x38, 0x26, 0x08, 0x14, 0x6f, 0x91, 0x7d, - 0x3e, 0x15, 0xfa, 0xd7, 0x15, 0x7b, 0x7e, 0xdd, 0xcf, 0x5b, 0x30, 0xa1, 0xbe, 0xee, 0x14, 0xb6, - 0xfa, 0xa2, 0xb9, 0xd5, 0x2f, 0xf6, 0x5c, 0xe0, 0x39, 0x9b, 0xfc, 0xeb, 0x05, 0xb8, 0xa0, 0x70, - 0x28, 0xbb, 0xcf, 0xff, 0x88, 0x55, 0x75, 0x0d, 0xca, 0xbe, 0xd2, 0x1e, 0x58, 0xa6, 0xd8, 0x9e, - 0xe8, 0x0e, 0x12, 0x1c, 0xca, 0xb5, 0xf9, 0x89, 0x88, 0x3f, 0xae, 0xab, 0xd5, 0x84, 0x0a, 0x6d, - 0x11, 0x8a, 0x1d, 0xb7, 0x25, 0xee, 0x8c, 0x4f, 0xc9, 0xd1, 0xbe, 0x5b, 0xab, 0x1e, 0x1d, 0x54, - 0x9e, 0xcc, 0x53, 0xe9, 0xd2, 0xcb, 0x2a, 0x9a, 0xbf, 0x5b, 0xab, 0x62, 0x5a, 0x19, 0x2d, 0xc0, - 0x94, 0xd4, 0x5a, 0xdf, 0xa3, 0x1c, 0x54, 0xe0, 0x8b, 0xab, 0x45, 0xe9, 0xc6, 0xb0, 0x09, 0xc6, - 0x69, 0x7c, 0x54, 0x85, 0xe9, 0x9d, 0xce, 0x06, 0xf1, 0x48, 0xcc, 0x3f, 0xf8, 0x16, 0xe1, 0x9a, - 0xa3, 0x72, 0x22, 0x5a, 0xde, 0x4a, 0xc1, 0x71, 0x57, 0x0d, 0xfb, 0x4f, 0xd9, 0x11, 0x2f, 0x46, - 0xaf, 0x1e, 0x06, 0x74, 0x61, 0x51, 0xea, 0x1f, 0xe6, 0x72, 0x1e, 0x64, 0x55, 0xdc, 0x22, 0xfb, - 0xeb, 0x01, 0x65, 0xb6, 0xb3, 0x57, 0x85, 0xb1, 0xe6, 0x4b, 0x3d, 0xd7, 0xfc, 0x2f, 0x16, 0xe0, - 0x9c, 0x1a, 0x01, 0x83, 0xaf, 0xfb, 0xb3, 0x3e, 0x06, 0x2f, 0xc0, 0x58, 0x8b, 0x6c, 0x3a, 0x1d, - 0x2f, 0x56, 0x6a, 0xcc, 0x21, 0xae, 0xca, 0xae, 0x26, 0xc5, 0x58, 0xc7, 0x39, 0xc6, 0xb0, 0xfd, - 0xd4, 0x18, 0xbb, 0x5b, 0x63, 0x87, 0xae, 0x71, 0xb5, 0x6b, 0xac, 0xdc, 0x5d, 0xf3, 0x14, 0x0c, - 0xb9, 0xbb, 0x94, 0xd7, 0x2a, 0x98, 0x2c, 0x54, 0x8d, 0x16, 0x62, 0x0e, 0x43, 0x9f, 0x80, 0x91, - 0x66, 0xb0, 0xbb, 0xeb, 0xf8, 0x2d, 0x76, 0xe5, 0x95, 0x17, 0xc7, 0x28, 0x3b, 0xb6, 0xc4, 0x8b, - 0xb0, 0x84, 0xa1, 0x27, 0xa0, 0xe4, 0x84, 0x5b, 0xd1, 0x6c, 0x89, 0xe1, 0x8c, 0xd2, 0x96, 0x16, - 0xc2, 0xad, 0x08, 0xb3, 0x52, 0x2a, 0x55, 0xdd, 0x0f, 0xc2, 0x1d, 0xd7, 0xdf, 0xaa, 0xba, 0xa1, - 0xd8, 0x12, 0xea, 0x2e, 0x7c, 0x4b, 0x41, 0xb0, 0x86, 0x85, 0x56, 0x60, 0xa8, 0x1d, 0x84, 0x71, - 0x34, 0x3b, 0xcc, 0x86, 0xfb, 0xc9, 0x9c, 0x83, 0x88, 0x7f, 0x6d, 0x3d, 0x08, 0xe3, 0xe4, 0x03, - 0xe8, 0xbf, 0x08, 0xf3, 0xea, 0xe8, 0xdb, 0xa0, 0x48, 0xfc, 0xbd, 0xd9, 0x11, 0x46, 0x65, 0x2e, - 0x8b, 0xca, 0xb2, 0xbf, 0x77, 0xcf, 0x09, 0x93, 0x53, 0x7a, 0xd9, 0xdf, 0xc3, 0xb4, 0x0e, 0xfa, - 0x02, 0x94, 0xe5, 0x16, 0x8f, 0x84, 0x9a, 0x23, 0x73, 0x89, 0xc9, 0x83, 0x01, 0x93, 0xf7, 0x3a, - 0x6e, 0x48, 0x76, 0x89, 0x1f, 0x47, 0xc9, 0x99, 0x26, 0xa1, 0x11, 0x4e, 0xa8, 0xa1, 0x2f, 0x48, - 0xdd, 0xda, 0x6a, 0xd0, 0xf1, 0xe3, 0x68, 0xb6, 0xcc, 0xba, 0x97, 0xf9, 0xea, 0x71, 0x2f, 0xc1, - 0x4b, 0x2b, 0xdf, 0x78, 0x65, 0x6c, 0x90, 0x42, 0x18, 0x26, 0x3c, 0x77, 0x8f, 0xf8, 0x24, 0x8a, - 0xea, 0x61, 0xb0, 0x41, 0x66, 0x81, 0xf5, 0xfc, 0x42, 0xf6, 0x63, 0x40, 0xb0, 0x41, 0x16, 0x67, - 0x0e, 0x0f, 0x2a, 0x13, 0xb7, 0xf5, 0x3a, 0xd8, 0x24, 0x81, 0xee, 0xc2, 0x24, 0x95, 0x6b, 0xdc, - 0x84, 0xe8, 0x58, 0x3f, 0xa2, 0x4c, 0xfa, 0xc0, 0x46, 0x25, 0x9c, 0x22, 0x82, 0xde, 0x80, 0xb2, - 0xe7, 0x6e, 0x92, 0xe6, 0x7e, 0xd3, 0x23, 0xb3, 0xe3, 0x8c, 0x62, 0xe6, 0xb6, 0xba, 0x2d, 0x91, - 0xb8, 0x5c, 0xa4, 0xfe, 0xe2, 0xa4, 0x3a, 0xba, 0x07, 0xe7, 0x63, 0x12, 0xee, 0xba, 0xbe, 0x43, - 0xb7, 0x83, 0x90, 0x17, 0xd8, 0x93, 0xca, 0x04, 0x5b, 0x6f, 0x97, 0xc4, 0xd0, 0x9d, 0x5f, 0xcf, - 0xc4, 0xc2, 0x39, 0xb5, 0xd1, 0x1d, 0x98, 0x62, 0x3b, 0xa1, 0xde, 0xf1, 0xbc, 0x7a, 0xe0, 0xb9, - 0xcd, 0xfd, 0xd9, 0x49, 0x46, 0xf0, 0x13, 0xf2, 0x5e, 0xa8, 0x99, 0xe0, 0xa3, 0x83, 0x0a, 0x24, - 0xff, 0x70, 0xba, 0x36, 0xda, 0x60, 0x3a, 0xf4, 0x4e, 0xe8, 0xc6, 0xfb, 0x74, 0xfd, 0x92, 0x07, - 0xf1, 0xec, 0x54, 0x4f, 0x51, 0x58, 0x47, 0x55, 0x8a, 0x76, 0xbd, 0x10, 0xa7, 0x09, 0xd2, 0xad, - 0x1d, 0xc5, 0x2d, 0xd7, 0x9f, 0x9d, 0x66, 0x27, 0x86, 0xda, 0x19, 0x0d, 0x5a, 0x88, 0x39, 0x8c, - 0xe9, 0xcf, 0xe9, 0x8f, 0x3b, 0xf4, 0x04, 0x9d, 0x61, 0x88, 0x89, 0xfe, 0x5c, 0x02, 0x70, 0x82, - 0x43, 0x99, 0x9a, 0x38, 0xde, 0x9f, 0x45, 0x0c, 0x55, 0x6d, 0x97, 0xf5, 0xf5, 0x2f, 0x60, 0x5a, - 0x8e, 0x6e, 0xc3, 0x08, 0xf1, 0xf7, 0x56, 0xc2, 0x60, 0x77, 0xf6, 0x4c, 0xfe, 0x9e, 0x5d, 0xe6, - 0x28, 0xfc, 0x40, 0x4f, 0x04, 0x3c, 0x51, 0x8c, 0x25, 0x09, 0xf4, 0x00, 0x66, 0x33, 0x66, 0x84, - 0x4f, 0xc0, 0x59, 0x36, 0x01, 0x9f, 0x15, 0x75, 0x67, 0xd7, 0x73, 0xf0, 0x8e, 0x7a, 0xc0, 0x70, - 0x2e, 0x75, 0xf4, 0x45, 0x98, 0xe0, 0x1b, 0x8a, 0x3f, 0xbe, 0x45, 0xb3, 0xe7, 0xd8, 0xd7, 0x5c, - 0xce, 0xdf, 0x9c, 0x1c, 0x71, 0xf1, 0x9c, 0xe8, 0xd0, 0x84, 0x5e, 0x1a, 0x61, 0x93, 0x9a, 0xbd, - 0x01, 0x93, 0xea, 0xdc, 0x62, 0x4b, 0x07, 0x55, 0x60, 0x88, 0x71, 0x3b, 0x42, 0xbf, 0x55, 0xa6, - 0x33, 0xc5, 0x38, 0x21, 0xcc, 0xcb, 0xd9, 0x4c, 0xb9, 0xef, 0x93, 0xc5, 0xfd, 0x98, 0x70, 0xa9, - 0xba, 0xa8, 0xcd, 0x94, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x3f, 0x9c, 0x6b, 0x4c, 0x0e, 0xc7, 0x01, - 0xae, 0x83, 0xe7, 0x60, 0x74, 0x3b, 0x88, 0x62, 0x8a, 0xcd, 0xda, 0x18, 0x4a, 0xf8, 0xc4, 0x9b, - 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x1a, 0x4c, 0x34, 0xf5, 0x06, 0xc4, 0x5d, 0xa6, 0x86, 0xc0, 0x68, - 0x1d, 0x9b, 0xb8, 0xe8, 0x55, 0x18, 0x65, 0x4f, 0xe7, 0xcd, 0xc0, 0x13, 0x4c, 0x96, 0xbc, 0x90, - 0x47, 0xeb, 0xa2, 0xfc, 0x48, 0xfb, 0x8d, 0x15, 0x36, 0xba, 0x02, 0xc3, 0xb4, 0x0b, 0xb5, 0xba, - 0xb8, 0x45, 0x94, 0xaa, 0xe6, 0x26, 0x2b, 0xc5, 0x02, 0x6a, 0xff, 0xd5, 0x82, 0x36, 0xca, 0x54, - 0x22, 0x25, 0xa8, 0x0e, 0x23, 0xf7, 0x1d, 0x37, 0x76, 0xfd, 0x2d, 0xc1, 0x2e, 0x3c, 0xd3, 0xf3, - 0x4a, 0x61, 0x95, 0xde, 0xe2, 0x15, 0xf8, 0xa5, 0x27, 0xfe, 0x60, 0x49, 0x86, 0x52, 0x0c, 0x3b, - 0xbe, 0x4f, 0x29, 0x16, 0x06, 0xa5, 0x88, 0x79, 0x05, 0x4e, 0x51, 0xfc, 0xc1, 0x92, 0x0c, 0x7a, - 0x07, 0x40, 0x2e, 0x4b, 0xd2, 0x12, 0x4f, 0xd6, 0xcf, 0xf5, 0x27, 0xba, 0xae, 0xea, 0x2c, 0x4e, - 0xd2, 0x2b, 0x35, 0xf9, 0x8f, 0x35, 0x7a, 0x76, 0xcc, 0xd8, 0xaa, 0xee, 0xce, 0xa0, 0xef, 0xa4, - 0x27, 0x81, 0x13, 0xc6, 0xa4, 0xb5, 0x10, 0x8b, 0xc1, 0xf9, 0xe4, 0x60, 0x32, 0xc5, 0xba, 0xbb, - 0x4b, 0xf4, 0x53, 0x43, 0x10, 0xc1, 0x09, 0x3d, 0xfb, 0x97, 0x8b, 0x30, 0x9b, 0xd7, 0x5d, 0xba, - 0xe8, 0xc8, 0x03, 0x37, 0x5e, 0xa2, 0xdc, 0x90, 0x65, 0x2e, 0xba, 0x65, 0x51, 0x8e, 0x15, 0x06, - 0x9d, 0xfd, 0xc8, 0xdd, 0x92, 0x22, 0xe1, 0x50, 0x32, 0xfb, 0x0d, 0x56, 0x8a, 0x05, 0x94, 0xe2, - 0x85, 0xc4, 0x89, 0x84, 0x4d, 0x84, 0xb6, 0x4a, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0xeb, 0x9b, 0x4a, - 0x7d, 0xf4, 0x4d, 0xc6, 0x10, 0x0d, 0x9d, 0xec, 0x10, 0xa1, 0x2f, 0x01, 0x6c, 0xba, 0xbe, 0x1b, - 0x6d, 0x33, 0xea, 0xc3, 0xc7, 0xa6, 0xae, 0x78, 0xa9, 0x15, 0x45, 0x05, 0x6b, 0x14, 0xd1, 0xcb, - 0x30, 0xa6, 0x36, 0x60, 0xad, 0xca, 0x1e, 0x88, 0xb4, 0x07, 0xf7, 0xe4, 0x34, 0xaa, 0x62, 0x1d, - 0xcf, 0x7e, 0x37, 0xbd, 0x5e, 0xc4, 0x0e, 0xd0, 0xc6, 0xd7, 0x1a, 0x74, 0x7c, 0x0b, 0xbd, 0xc7, - 0xd7, 0xfe, 0x8d, 0x22, 0x4c, 0x19, 0x8d, 0x75, 0xa2, 0x01, 0xce, 0xac, 0x1b, 0xf4, 0x9e, 0x73, - 0x62, 0x22, 0xf6, 0x9f, 0xdd, 0x7f, 0xab, 0xe8, 0x77, 0x21, 0xdd, 0x01, 0xbc, 0x3e, 0xfa, 0x12, - 0x94, 0x3d, 0x27, 0x62, 0xba, 0x2b, 0x22, 0xf6, 0xdd, 0x20, 0xc4, 0x12, 0x39, 0xc2, 0x89, 0x62, - 0xed, 0xaa, 0xe1, 0xb4, 0x13, 0x92, 0xf4, 0x42, 0xa6, 0xbc, 0x8f, 0x34, 0xba, 0x51, 0x9d, 0xa0, - 0x0c, 0xd2, 0x3e, 0xe6, 0x30, 0xf4, 0x2a, 0x8c, 0x87, 0x84, 0xad, 0x8a, 0x25, 0xca, 0xca, 0xb1, - 0x65, 0x36, 0x94, 0xf0, 0x7c, 0x58, 0x83, 0x61, 0x03, 0x33, 0x61, 0xe5, 0x87, 0x7b, 0xb0, 0xf2, - 0xcf, 0xc0, 0x08, 0xfb, 0xa1, 0x56, 0x80, 0x9a, 0x8d, 0x1a, 0x2f, 0xc6, 0x12, 0x9e, 0x5e, 0x30, - 0xa3, 0x03, 0x2e, 0x98, 0x4f, 0xc2, 0x64, 0xd5, 0x21, 0xbb, 0x81, 0xbf, 0xec, 0xb7, 0xda, 0x81, - 0xeb, 0xc7, 0x68, 0x16, 0x4a, 0xec, 0x76, 0xe0, 0x7b, 0xbb, 0x44, 0x29, 0xe0, 0x12, 0x65, 0xcc, - 0xed, 0x2d, 0x38, 0x57, 0x0d, 0xee, 0xfb, 0xf7, 0x9d, 0xb0, 0xb5, 0x50, 0xaf, 0x69, 0x72, 0xee, - 0x9a, 0x94, 0xb3, 0xb8, 0x11, 0x4b, 0xe6, 0x99, 0xaa, 0xd5, 0xe4, 0x77, 0xed, 0x8a, 0xeb, 0x91, - 0x1c, 0x6d, 0xc4, 0x5f, 0x2f, 0x18, 0x2d, 0x25, 0xf8, 0xea, 0xc1, 0xc8, 0xca, 0x7d, 0x30, 0x7a, - 0x13, 0x46, 0x37, 0x5d, 0xe2, 0xb5, 0x30, 0xd9, 0x14, 0x4b, 0xec, 0xe9, 0xfc, 0x77, 0xf9, 0x15, - 0x8a, 0x29, 0xb5, 0x4f, 0x5c, 0x4a, 0x5b, 0x11, 0x95, 0xb1, 0x22, 0x83, 0x76, 0x60, 0x5a, 0x8a, - 0x01, 0x12, 0x2a, 0x16, 0xdc, 0x33, 0xbd, 0x64, 0x0b, 0x93, 0xf8, 0xd9, 0xc3, 0x83, 0xca, 0x34, - 0x4e, 0x91, 0xc1, 0x5d, 0x84, 0xa9, 0x58, 0xb6, 0x4b, 0x8f, 0xd6, 0x12, 0x1b, 0x7e, 0x26, 0x96, - 0x31, 0x09, 0x93, 0x95, 0xda, 0x3f, 0x6e, 0xc1, 0x63, 0x5d, 0x23, 0x23, 0x24, 0xed, 0x13, 0x9e, - 0x85, 0xb4, 0xe4, 0x5b, 0xe8, 0x2f, 0xf9, 0xda, 0x7f, 0xcf, 0x82, 0xb3, 0xcb, 0xbb, 0xed, 0x78, - 0xbf, 0xea, 0x9a, 0xaf, 0x3b, 0xaf, 0xc0, 0xf0, 0x2e, 0x69, 0xb9, 0x9d, 0x5d, 0x31, 0x73, 0x15, - 0x79, 0xfc, 0xac, 0xb2, 0xd2, 0xa3, 0x83, 0xca, 0x44, 0x23, 0x0e, 0x42, 0x67, 0x8b, 0xf0, 0x02, - 0x2c, 0xd0, 0xd9, 0x21, 0xee, 0xbe, 0x4f, 0x6e, 0xbb, 0xbb, 0xae, 0xb4, 0xb3, 0xe8, 0xa9, 0x3b, - 0x9b, 0x97, 0x03, 0x3a, 0xff, 0x66, 0xc7, 0xf1, 0x63, 0x37, 0xde, 0x17, 0x0f, 0x33, 0x92, 0x08, - 0x4e, 0xe8, 0xd9, 0xdf, 0xb4, 0x60, 0x4a, 0xae, 0xfb, 0x85, 0x56, 0x2b, 0x24, 0x51, 0x84, 0xe6, - 0xa0, 0xe0, 0xb6, 0x45, 0x2f, 0x41, 0xf4, 0xb2, 0x50, 0xab, 0xe3, 0x82, 0xdb, 0x46, 0x75, 0x28, - 0x73, 0x73, 0x8d, 0x64, 0x71, 0x0d, 0x64, 0xf4, 0xc1, 0x7a, 0xb0, 0x2e, 0x6b, 0xe2, 0x84, 0x88, - 0xe4, 0xe0, 0xd8, 0x99, 0x59, 0x34, 0x5f, 0xbd, 0x6e, 0x8a, 0x72, 0xac, 0x30, 0xd0, 0x55, 0x18, - 0xf5, 0x83, 0x16, 0xb7, 0x9e, 0xe1, 0xb7, 0x1f, 0x5b, 0xb2, 0x6b, 0xa2, 0x0c, 0x2b, 0xa8, 0xfd, - 0x43, 0x16, 0x8c, 0xcb, 0x2f, 0x1b, 0x90, 0x99, 0xa4, 0x5b, 0x2b, 0x61, 0x24, 0x93, 0xad, 0x45, - 0x99, 0x41, 0x06, 0x31, 0x78, 0xc0, 0xe2, 0x71, 0x78, 0x40, 0xfb, 0xc7, 0x0a, 0x30, 0x29, 0xbb, - 0xd3, 0xe8, 0x6c, 0x44, 0x24, 0x46, 0xeb, 0x50, 0x76, 0xf8, 0x90, 0x13, 0xb9, 0x62, 0x9f, 0xca, - 0x16, 0x3e, 0x8c, 0xf9, 0x49, 0xae, 0xe5, 0x05, 0x59, 0x1b, 0x27, 0x84, 0x90, 0x07, 0x33, 0x7e, - 0x10, 0xb3, 0x23, 0x5a, 0xc1, 0x7b, 0x3d, 0x81, 0xa4, 0xa9, 0x5f, 0x10, 0xd4, 0x67, 0xd6, 0xd2, - 0x54, 0x70, 0x37, 0x61, 0xb4, 0x2c, 0x15, 0x1e, 0xc5, 0x7c, 0x71, 0x43, 0x9f, 0x85, 0x6c, 0x7d, - 0x87, 0xfd, 0xab, 0x16, 0x94, 0x25, 0xda, 0x69, 0xbc, 0x76, 0xad, 0xc2, 0x48, 0xc4, 0x26, 0x41, - 0x0e, 0x8d, 0xdd, 0xab, 0xe3, 0x7c, 0xbe, 0x92, 0x9b, 0x87, 0xff, 0x8f, 0xb0, 0xa4, 0xc1, 0xf4, - 0xdd, 0xaa, 0xfb, 0x1f, 0x11, 0x7d, 0xb7, 0xea, 0x4f, 0xce, 0x0d, 0xf3, 0x5f, 0x58, 0x9f, 0x35, - 0xb1, 0x96, 0x32, 0x48, 0xed, 0x90, 0x6c, 0xba, 0x0f, 0xd2, 0x0c, 0x52, 0x9d, 0x95, 0x62, 0x01, - 0x45, 0xef, 0xc0, 0x78, 0x53, 0x2a, 0x3a, 0x93, 0x63, 0xe0, 0x4a, 0x4f, 0xa5, 0xbb, 0x7a, 0x9f, - 0xe1, 0x96, 0xb5, 0x4b, 0x5a, 0x7d, 0x6c, 0x50, 0x33, 0x9f, 0xdb, 0x8b, 0xfd, 0x9e, 0xdb, 0x13, - 0xba, 0xf9, 0x8f, 0xcf, 0x3f, 0x61, 0xc1, 0x30, 0x57, 0x97, 0x0d, 0xa6, 0x5f, 0xd4, 0x9e, 0xab, - 0x92, 0xb1, 0xbb, 0x47, 0x0b, 0xc5, 0xf3, 0x13, 0x5a, 0x85, 0x32, 0xfb, 0xc1, 0xd4, 0x06, 0xc5, - 0x7c, 0x93, 0x62, 0xde, 0xaa, 0xde, 0xc1, 0x7b, 0xb2, 0x1a, 0x4e, 0x28, 0xd8, 0x3f, 0x52, 0xa4, - 0x47, 0x55, 0x82, 0x6a, 0xdc, 0xe0, 0xd6, 0xa3, 0xbb, 0xc1, 0x0b, 0x8f, 0xea, 0x06, 0xdf, 0x82, - 0xa9, 0xa6, 0xf6, 0xb8, 0x95, 0xcc, 0xe4, 0xd5, 0x9e, 0x8b, 0x44, 0x7b, 0x07, 0xe3, 0x2a, 0xa3, - 0x25, 0x93, 0x08, 0x4e, 0x53, 0x45, 0xdf, 0x09, 0xe3, 0x7c, 0x9e, 0x45, 0x2b, 0xdc, 0x62, 0xe1, - 0x13, 0xf9, 0xeb, 0x45, 0x6f, 0x82, 0xad, 0xc4, 0x86, 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x5f, 0x1e, - 0x85, 0xa1, 0xe5, 0x3d, 0xe2, 0xc7, 0xa7, 0x70, 0x20, 0x35, 0x61, 0xd2, 0xf5, 0xf7, 0x02, 0x6f, - 0x8f, 0xb4, 0x38, 0xfc, 0x38, 0x97, 0xeb, 0x79, 0x41, 0x7a, 0xb2, 0x66, 0x90, 0xc0, 0x29, 0x92, - 0x8f, 0x42, 0xc2, 0xbc, 0x01, 0xc3, 0x7c, 0xee, 0x85, 0x78, 0x99, 0xa9, 0x0c, 0x66, 0x83, 0x28, - 0x76, 0x41, 0x22, 0xfd, 0x72, 0xed, 0xb3, 0xa8, 0x8e, 0xde, 0x85, 0xc9, 0x4d, 0x37, 0x8c, 0x62, - 0x2a, 0x1a, 0x46, 0xb1, 0xb3, 0xdb, 0x7e, 0x08, 0x89, 0x52, 0x8d, 0xc3, 0x8a, 0x41, 0x09, 0xa7, - 0x28, 0xa3, 0x2d, 0x98, 0xa0, 0x42, 0x4e, 0xd2, 0xd4, 0xc8, 0xb1, 0x9b, 0x52, 0x2a, 0xa3, 0xdb, - 0x3a, 0x21, 0x6c, 0xd2, 0xa5, 0x87, 0x49, 0x93, 0x09, 0x45, 0xa3, 0x8c, 0xa3, 0x50, 0x87, 0x09, - 0x97, 0x86, 0x38, 0x8c, 0x9e, 0x49, 0xcc, 0x6c, 0xa5, 0x6c, 0x9e, 0x49, 0x9a, 0x71, 0xca, 0x97, - 0xa1, 0x4c, 0xe8, 0x10, 0x52, 0xc2, 0x42, 0x31, 0x7e, 0x6d, 0xb0, 0xbe, 0xae, 0xba, 0xcd, 0x30, - 0x30, 0x65, 0xf9, 0x65, 0x49, 0x09, 0x27, 0x44, 0xd1, 0x12, 0x0c, 0x47, 0x24, 0x74, 0x49, 0x24, - 0x54, 0xe4, 0x3d, 0xa6, 0x91, 0xa1, 0x71, 0xdb, 0x73, 0xfe, 0x1b, 0x8b, 0xaa, 0x74, 0x79, 0x39, - 0x4c, 0x1a, 0x62, 0x5a, 0x71, 0x6d, 0x79, 0x2d, 0xb0, 0x52, 0x2c, 0xa0, 0xe8, 0x0d, 0x18, 0x09, - 0x89, 0xc7, 0x94, 0x45, 0x13, 0x83, 0x2f, 0x72, 0xae, 0x7b, 0xe2, 0xf5, 0xb0, 0x24, 0x80, 0x6e, - 0x01, 0x0a, 0x09, 0xe5, 0x21, 0x5c, 0x7f, 0x4b, 0x19, 0x73, 0x08, 0x5d, 0xf7, 0xe3, 0xa2, 0xfd, - 0x33, 0x38, 0xc1, 0x90, 0x56, 0xa9, 0x38, 0xa3, 0x1a, 0xba, 0x01, 0x33, 0xaa, 0xb4, 0xe6, 0x47, - 0xb1, 0xe3, 0x37, 0x09, 0x53, 0x73, 0x97, 0x13, 0xae, 0x08, 0xa7, 0x11, 0x70, 0x77, 0x1d, 0xfb, - 0x67, 0x29, 0x3b, 0x43, 0x47, 0xeb, 0x14, 0x78, 0x81, 0xd7, 0x4d, 0x5e, 0xe0, 0x42, 0xee, 0xcc, - 0xe5, 0xf0, 0x01, 0x87, 0x16, 0x8c, 0x69, 0x33, 0x9b, 0xac, 0x59, 0xab, 0xc7, 0x9a, 0xed, 0xc0, - 0x34, 0x5d, 0xe9, 0x77, 0x36, 0x22, 0x12, 0xee, 0x91, 0x16, 0x5b, 0x98, 0x85, 0x87, 0x5b, 0x98, - 0xea, 0x95, 0xf9, 0x76, 0x8a, 0x20, 0xee, 0x6a, 0x02, 0xbd, 0x22, 0x35, 0x27, 0x45, 0xc3, 0x48, - 0x8b, 0x6b, 0x45, 0x8e, 0x0e, 0x2a, 0xd3, 0xda, 0x87, 0xe8, 0x9a, 0x12, 0xfb, 0xcb, 0xf2, 0x1b, - 0xd5, 0x6b, 0x7e, 0x53, 0x2d, 0x96, 0xd4, 0x6b, 0xbe, 0x5a, 0x0e, 0x38, 0xc1, 0xa1, 0x7b, 0x94, - 0x8a, 0x20, 0xe9, 0xd7, 0x7c, 0x2a, 0xa0, 0x60, 0x06, 0xb1, 0x5f, 0x04, 0x58, 0x7e, 0x40, 0x9a, - 0x7c, 0xa9, 0xeb, 0x0f, 0x90, 0x56, 0xfe, 0x03, 0xa4, 0xfd, 0x6f, 0x2d, 0x98, 0x5c, 0x59, 0x32, - 0xc4, 0xc4, 0x79, 0x00, 0x2e, 0x1b, 0xbd, 0xf5, 0xd6, 0x9a, 0xd4, 0xad, 0x73, 0xf5, 0xa8, 0x2a, - 0xc5, 0x1a, 0x06, 0xba, 0x00, 0x45, 0xaf, 0xe3, 0x0b, 0x91, 0x65, 0xe4, 0xf0, 0xa0, 0x52, 0xbc, - 0xdd, 0xf1, 0x31, 0x2d, 0xd3, 0x2c, 0x04, 0x8b, 0x03, 0x5b, 0x08, 0xf6, 0x75, 0xaf, 0x42, 0x15, - 0x18, 0xba, 0x7f, 0xdf, 0x6d, 0x71, 0x23, 0x76, 0xa1, 0xf7, 0x7f, 0xeb, 0xad, 0x5a, 0x35, 0xc2, - 0xbc, 0xdc, 0xfe, 0x6a, 0x11, 0xe6, 0x56, 0x3c, 0xf2, 0xe0, 0x03, 0x1a, 0xf2, 0x0f, 0x6a, 0xdf, - 0x78, 0x3c, 0x7e, 0xf1, 0xb8, 0x36, 0xac, 0xfd, 0xc7, 0x63, 0x13, 0x46, 0xf8, 0x63, 0xb6, 0x34, - 0xeb, 0x7f, 0x2d, 0xab, 0xf5, 0xfc, 0x01, 0x99, 0xe7, 0x8f, 0xe2, 0xc2, 0x9c, 0x5f, 0xdd, 0xb4, - 0xa2, 0x14, 0x4b, 0xe2, 0x73, 0x9f, 0x81, 0x71, 0x1d, 0xf3, 0x58, 0xd6, 0xe4, 0xff, 0x5f, 0x11, - 0xa6, 0x69, 0x0f, 0x1e, 0xe9, 0x44, 0xdc, 0xed, 0x9e, 0x88, 0x93, 0xb6, 0x28, 0xee, 0x3f, 0x1b, - 0xef, 0xa4, 0x67, 0xe3, 0x85, 0xbc, 0xd9, 0x38, 0xed, 0x39, 0xf8, 0x5e, 0x0b, 0xce, 0xac, 0x78, - 0x41, 0x73, 0x27, 0x65, 0xf5, 0xfb, 0x32, 0x8c, 0xd1, 0x73, 0x3c, 0x32, 0xbc, 0x88, 0x0c, 0xbf, - 0x32, 0x01, 0xc2, 0x3a, 0x9e, 0x56, 0xed, 0xee, 0xdd, 0x5a, 0x35, 0xcb, 0x1d, 0x4d, 0x80, 0xb0, - 0x8e, 0x67, 0x7f, 0xc3, 0x82, 0x8b, 0x37, 0x96, 0x96, 0x93, 0xa5, 0xd8, 0xe5, 0x11, 0x47, 0xa5, - 0xc0, 0x96, 0xd6, 0x95, 0x44, 0x0a, 0xac, 0xb2, 0x5e, 0x08, 0xe8, 0x47, 0xc5, 0xdb, 0xf3, 0x67, - 0x2c, 0x38, 0x73, 0xc3, 0x8d, 0xe9, 0xb5, 0x9c, 0xf6, 0xcd, 0xa2, 0xf7, 0x72, 0xe4, 0xc6, 0x41, - 0xb8, 0x9f, 0xf6, 0xcd, 0xc2, 0x0a, 0x82, 0x35, 0x2c, 0xde, 0xf2, 0x9e, 0xcb, 0xcc, 0xa8, 0x0a, - 0xa6, 0x2a, 0x0a, 0x8b, 0x72, 0xac, 0x30, 0xe8, 0x87, 0xb5, 0xdc, 0x90, 0x89, 0x12, 0xfb, 0xe2, - 0x84, 0x55, 0x1f, 0x56, 0x95, 0x00, 0x9c, 0xe0, 0xd8, 0x3f, 0x6e, 0xc1, 0xb9, 0x1b, 0x5e, 0x27, - 0x8a, 0x49, 0xb8, 0x19, 0x19, 0x9d, 0x7d, 0x11, 0xca, 0x44, 0x8a, 0xeb, 0xa2, 0xaf, 0x8a, 0xc1, - 0x54, 0x72, 0x3c, 0x77, 0x0c, 0x53, 0x78, 0x03, 0x78, 0x0e, 0x1c, 0xcf, 0x75, 0xec, 0x17, 0x0a, - 0x30, 0x71, 0x73, 0x7d, 0xbd, 0x7e, 0x83, 0xc4, 0xe2, 0x16, 0xeb, 0xaf, 0x6a, 0xc6, 0x9a, 0xc6, - 0xac, 0x97, 0x50, 0xd4, 0x89, 0x5d, 0x6f, 0x9e, 0x7b, 0x22, 0xcf, 0xd7, 0xfc, 0xf8, 0x4e, 0xd8, - 0x88, 0x43, 0xd7, 0xdf, 0xca, 0xd4, 0xb1, 0xc9, 0xbb, 0xb6, 0x98, 0x77, 0xd7, 0xa2, 0x17, 0x61, - 0x98, 0xb9, 0x42, 0x4b, 0xf1, 0xe4, 0x71, 0x25, 0x53, 0xb0, 0xd2, 0xa3, 0x83, 0x4a, 0xf9, 0x2e, - 0xae, 0xf1, 0x3f, 0x58, 0xa0, 0xa2, 0xbb, 0x30, 0xb6, 0x1d, 0xc7, 0xed, 0x9b, 0xc4, 0x69, 0x91, - 0x50, 0x9e, 0x0e, 0x97, 0xb2, 0x4e, 0x07, 0x3a, 0x08, 0x1c, 0x2d, 0xd9, 0x50, 0x49, 0x59, 0x84, - 0x75, 0x3a, 0x76, 0x03, 0x20, 0x81, 0x9d, 0x90, 0x7e, 0xc1, 0xfe, 0x03, 0x0b, 0x46, 0xb8, 0x57, - 0x5a, 0x88, 0x3e, 0x0b, 0x25, 0xf2, 0x80, 0x34, 0x05, 0xe7, 0x98, 0xd9, 0xe1, 0x84, 0xf1, 0xe0, - 0xda, 0x72, 0xfa, 0x1f, 0xb3, 0x5a, 0xe8, 0x26, 0x8c, 0xd0, 0xde, 0xde, 0x50, 0x2e, 0x7a, 0x4f, - 0xe6, 0x7d, 0xb1, 0x9a, 0x76, 0xce, 0xab, 0x88, 0x22, 0x2c, 0xab, 0x33, 0xcd, 0x6f, 0xb3, 0xdd, - 0xa0, 0x07, 0x58, 0xdc, 0xeb, 0x9e, 0x5d, 0x5f, 0xaa, 0x73, 0x24, 0x41, 0x8d, 0x6b, 0x7e, 0x65, - 0x21, 0x4e, 0x88, 0xd8, 0xeb, 0x50, 0xa6, 0x93, 0xba, 0xe0, 0xb9, 0x4e, 0x6f, 0xa5, 0xf3, 0xb3, - 0x50, 0x96, 0x0a, 0xe0, 0x48, 0x38, 0x36, 0x31, 0xaa, 0x52, 0x3f, 0x1c, 0xe1, 0x04, 0x6e, 0x6f, - 0xc2, 0x59, 0xf6, 0xf2, 0xef, 0xc4, 0xdb, 0xc6, 0x1e, 0xeb, 0xbf, 0x98, 0x9f, 0x13, 0x82, 0x18, - 0x9f, 0x99, 0x59, 0xcd, 0x77, 0x60, 0x5c, 0x52, 0x4c, 0x84, 0x32, 0xfb, 0x0f, 0x4b, 0xf0, 0x78, - 0xad, 0x91, 0xef, 0xb0, 0xf8, 0x2a, 0x8c, 0x73, 0x36, 0x8d, 0x2e, 0x6d, 0xc7, 0x13, 0xed, 0xaa, - 0x77, 0xb1, 0x75, 0x0d, 0x86, 0x0d, 0x4c, 0x74, 0x11, 0x8a, 0xee, 0x7b, 0x7e, 0xda, 0x0c, 0xb7, - 0xf6, 0xe6, 0x1a, 0xa6, 0xe5, 0x14, 0x4c, 0x39, 0x3e, 0x7e, 0x94, 0x2a, 0xb0, 0xe2, 0xfa, 0x5e, - 0x87, 0x49, 0x37, 0x6a, 0x46, 0x6e, 0xcd, 0xa7, 0xe7, 0x4c, 0xe2, 0xec, 0x9a, 0x28, 0x09, 0x68, - 0xa7, 0x15, 0x14, 0xa7, 0xb0, 0xb5, 0x73, 0x7d, 0x68, 0x60, 0xae, 0xb1, 0xaf, 0xa7, 0x0f, 0x65, - 0x88, 0xdb, 0xec, 0xeb, 0x22, 0x66, 0xd4, 0x26, 0x18, 0x62, 0xfe, 0xc1, 0x11, 0x96, 0x30, 0x2a, - 0x81, 0x35, 0xb7, 0x9d, 0xf6, 0x42, 0x27, 0xde, 0xae, 0xba, 0x51, 0x33, 0xd8, 0x23, 0xe1, 0x3e, - 0x13, 0x9e, 0x47, 0x13, 0x09, 0x4c, 0x01, 0x96, 0x6e, 0x2e, 0xd4, 0x29, 0x26, 0xee, 0xae, 0x63, - 0x72, 0x85, 0x70, 0x12, 0x5c, 0xe1, 0x02, 0x4c, 0xc9, 0x66, 0x1a, 0x24, 0x62, 0x77, 0xc4, 0x18, - 0xeb, 0x98, 0x32, 0xb5, 0x15, 0xc5, 0xaa, 0x5b, 0x69, 0x7c, 0xf4, 0x0a, 0x4c, 0xb8, 0xbe, 0x1b, - 0xbb, 0x4e, 0x1c, 0x84, 0xec, 0x86, 0xe5, 0x72, 0x32, 0xb3, 0x64, 0xab, 0xe9, 0x00, 0x6c, 0xe2, - 0xd9, 0xff, 0xb1, 0x04, 0x33, 0x6c, 0xda, 0xbe, 0xb5, 0xc2, 0x3e, 0x32, 0x2b, 0xec, 0x6e, 0xf7, - 0x0a, 0x3b, 0x09, 0x76, 0xf7, 0xc3, 0x5c, 0x66, 0xef, 0x42, 0x59, 0xd9, 0x02, 0x4b, 0x67, 0x00, - 0x2b, 0xc7, 0x19, 0xa0, 0x3f, 0xf7, 0x21, 0x9f, 0x71, 0x8b, 0x99, 0xcf, 0xb8, 0x7f, 0xd3, 0x82, - 0xc4, 0x24, 0x12, 0xdd, 0x84, 0x72, 0x3b, 0x60, 0x66, 0x07, 0xa1, 0xb4, 0xe5, 0x79, 0x3c, 0xf3, - 0xa2, 0xe2, 0x97, 0x22, 0x1f, 0xbf, 0xba, 0xac, 0x81, 0x93, 0xca, 0x68, 0x11, 0x46, 0xda, 0x21, - 0x69, 0xc4, 0xcc, 0x05, 0xb6, 0x2f, 0x1d, 0xbe, 0x46, 0x38, 0x3e, 0x96, 0x15, 0xed, 0x5f, 0xb4, - 0x00, 0xf8, 0x4b, 0xa9, 0xe3, 0x6f, 0x91, 0x53, 0xd0, 0xfe, 0x56, 0xa1, 0x14, 0xb5, 0x49, 0xb3, - 0x97, 0x41, 0x48, 0xd2, 0x9f, 0x46, 0x9b, 0x34, 0x93, 0x01, 0xa7, 0xff, 0x30, 0xab, 0x6d, 0x7f, - 0x1f, 0xc0, 0x64, 0x82, 0x56, 0x8b, 0xc9, 0x2e, 0x7a, 0xde, 0x70, 0x89, 0xbb, 0x90, 0x72, 0x89, - 0x2b, 0x33, 0x6c, 0x4d, 0xd1, 0xf8, 0x2e, 0x14, 0x77, 0x9d, 0x07, 0x42, 0x93, 0xf4, 0x6c, 0xef, - 0x6e, 0x50, 0xfa, 0xf3, 0xab, 0xce, 0x03, 0x2e, 0x33, 0x3d, 0x2b, 0x17, 0xc8, 0xaa, 0xf3, 0xe0, - 0x88, 0x9b, 0x7d, 0xb0, 0x43, 0xea, 0xb6, 0x1b, 0xc5, 0x5f, 0xf9, 0x0f, 0xc9, 0x7f, 0xb6, 0xec, - 0x68, 0x23, 0xac, 0x2d, 0xd7, 0x17, 0xef, 0x86, 0x03, 0xb5, 0xe5, 0xfa, 0xe9, 0xb6, 0x5c, 0x7f, - 0x80, 0xb6, 0x5c, 0x1f, 0xbd, 0x0f, 0x23, 0xe2, 0x8d, 0x9e, 0xd9, 0x7a, 0x9b, 0x5a, 0xaa, 0xbc, - 0xf6, 0xc4, 0x13, 0x3f, 0x6f, 0xf3, 0x9a, 0x94, 0x09, 0x45, 0x69, 0xdf, 0x76, 0x65, 0x83, 0xe8, - 0xaf, 0x59, 0x30, 0x29, 0x7e, 0x63, 0xf2, 0x5e, 0x87, 0x44, 0xb1, 0xe0, 0x3d, 0x3f, 0x3d, 0x78, - 0x1f, 0x44, 0x45, 0xde, 0x95, 0x4f, 0xcb, 0x63, 0xd6, 0x04, 0xf6, 0xed, 0x51, 0xaa, 0x17, 0xe8, - 0x1f, 0x58, 0x70, 0x76, 0xd7, 0x79, 0xc0, 0x5b, 0xe4, 0x65, 0xd8, 0x89, 0xdd, 0x40, 0xd8, 0xae, - 0x7f, 0x76, 0xb0, 0xe9, 0xef, 0xaa, 0xce, 0x3b, 0x29, 0xcd, 0x5c, 0xcf, 0x66, 0xa1, 0xf4, 0xed, - 0x6a, 0x66, 0xbf, 0xe6, 0x36, 0x61, 0x54, 0xae, 0xb7, 0x0c, 0xc9, 0xbb, 0xaa, 0x33, 0xd6, 0xc7, - 0x36, 0x91, 0xd0, 0xfd, 0xd2, 0x68, 0x3b, 0x62, 0xad, 0x3d, 0xd2, 0x76, 0xde, 0x85, 0x71, 0x7d, - 0x8d, 0x3d, 0xd2, 0xb6, 0xde, 0x83, 0x33, 0x19, 0x6b, 0xe9, 0x91, 0x36, 0x79, 0x1f, 0x2e, 0xe4, - 0xae, 0x8f, 0x47, 0xd9, 0xb0, 0xfd, 0x0b, 0x96, 0x7e, 0x0e, 0x9e, 0x82, 0x0a, 0x7e, 0xc9, 0x54, - 0xc1, 0x5f, 0xea, 0xbd, 0x73, 0x72, 0xf4, 0xf0, 0xef, 0xe8, 0x9d, 0xa6, 0xa7, 0x3a, 0x7a, 0x03, - 0x86, 0x3d, 0x5a, 0x22, 0x8d, 0x43, 0xec, 0xfe, 0x3b, 0x32, 0xe1, 0xa5, 0x58, 0x79, 0x84, 0x05, - 0x05, 0xfb, 0x57, 0x2c, 0x28, 0x9d, 0xc2, 0x48, 0x60, 0x73, 0x24, 0x9e, 0xcf, 0x25, 0x2d, 0x42, - 0x9a, 0xcd, 0x63, 0xe7, 0xfe, 0xf2, 0x83, 0x98, 0xf8, 0x11, 0x13, 0x15, 0x33, 0x07, 0xe6, 0xbb, - 0xe0, 0xcc, 0xed, 0xc0, 0x69, 0x2d, 0x3a, 0x9e, 0xe3, 0x37, 0x49, 0x58, 0xf3, 0xb7, 0xfa, 0x5a, - 0x29, 0xe9, 0x36, 0x45, 0x85, 0x7e, 0x36, 0x45, 0xf6, 0x36, 0x20, 0xbd, 0x01, 0x61, 0xc7, 0x89, - 0x61, 0xc4, 0xe5, 0x4d, 0x89, 0xe1, 0x7f, 0x3a, 0x9b, 0xbb, 0xeb, 0xea, 0x99, 0x66, 0xa1, 0xc8, - 0x0b, 0xb0, 0x24, 0x64, 0xbf, 0x0a, 0x99, 0xbe, 0x5b, 0xfd, 0xd5, 0x06, 0xf6, 0xcb, 0x30, 0xc3, - 0x6a, 0x1e, 0x4f, 0xa4, 0xb5, 0x7f, 0xc0, 0x82, 0xa9, 0xb5, 0x54, 0x6c, 0x8a, 0x2b, 0xec, 0xad, - 0x2f, 0x43, 0xef, 0xdb, 0x60, 0xa5, 0x58, 0x40, 0x4f, 0x5c, 0xbf, 0xf4, 0xa7, 0x16, 0x24, 0xae, - 0x92, 0xa7, 0xc0, 0x54, 0x2d, 0x19, 0x4c, 0x55, 0xa6, 0xde, 0x43, 0x75, 0x27, 0x8f, 0xa7, 0x42, - 0xb7, 0x54, 0x5c, 0x80, 0x1e, 0x2a, 0x8f, 0x84, 0x0c, 0xf7, 0x22, 0x9f, 0x34, 0x83, 0x07, 0xc8, - 0x48, 0x01, 0xcc, 0x4c, 0x48, 0xe1, 0x7e, 0x44, 0xcc, 0x84, 0x54, 0x7f, 0x72, 0x76, 0x5f, 0x5d, - 0xeb, 0x32, 0x3b, 0x95, 0xbe, 0x9d, 0x99, 0x7d, 0x3b, 0x9e, 0xfb, 0x3e, 0x51, 0xc1, 0x4d, 0x2a, - 0xc2, 0x8c, 0x5b, 0x94, 0x1e, 0x1d, 0x54, 0x26, 0xd4, 0x3f, 0x1e, 0x01, 0x2b, 0xa9, 0x62, 0xdf, - 0x84, 0xa9, 0xd4, 0x80, 0xa1, 0x97, 0x61, 0xa8, 0xbd, 0xed, 0x44, 0x24, 0x65, 0x1a, 0x39, 0x54, - 0xa7, 0x85, 0x47, 0x07, 0x95, 0x49, 0x55, 0x81, 0x95, 0x60, 0x8e, 0x6d, 0xff, 0x0f, 0x0b, 0x4a, - 0x6b, 0x41, 0xeb, 0x34, 0x16, 0xd3, 0xeb, 0xc6, 0x62, 0x7a, 0x22, 0x2f, 0x7e, 0x60, 0xee, 0x3a, - 0x5a, 0x49, 0xad, 0xa3, 0x4b, 0xb9, 0x14, 0x7a, 0x2f, 0xa1, 0x5d, 0x18, 0x63, 0x51, 0x09, 0x85, - 0xa9, 0xe6, 0x8b, 0x06, 0x7f, 0x5f, 0x49, 0xf1, 0xf7, 0x53, 0x1a, 0xaa, 0xc6, 0xe5, 0x3f, 0x03, - 0x23, 0xc2, 0x5c, 0x30, 0x6d, 0xe0, 0x2e, 0x70, 0xb1, 0x84, 0xdb, 0x3f, 0x51, 0x04, 0x23, 0x0a, - 0x22, 0xfa, 0x55, 0x0b, 0xe6, 0x43, 0xee, 0x31, 0xd8, 0xaa, 0x76, 0x42, 0xd7, 0xdf, 0x6a, 0x34, - 0xb7, 0x49, 0xab, 0xe3, 0xb9, 0xfe, 0x56, 0x6d, 0xcb, 0x0f, 0x54, 0xf1, 0xf2, 0x03, 0xd2, 0xec, - 0x30, 0x9d, 0x7f, 0x9f, 0x90, 0x8b, 0xca, 0x1c, 0xe7, 0xfa, 0xe1, 0x41, 0x65, 0x1e, 0x1f, 0x8b, - 0x36, 0x3e, 0x66, 0x5f, 0xd0, 0x37, 0x2c, 0xb8, 0xc6, 0x83, 0x03, 0x0e, 0xde, 0xff, 0x1e, 0xd2, - 0x50, 0x5d, 0x92, 0x4a, 0x88, 0xac, 0x93, 0x70, 0x77, 0xf1, 0x15, 0x31, 0xa0, 0xd7, 0xea, 0xc7, - 0x6b, 0x0b, 0x1f, 0xb7, 0x73, 0xf6, 0x3f, 0x2f, 0xc2, 0x84, 0x70, 0x56, 0x17, 0x51, 0x50, 0x5e, - 0x36, 0x96, 0xc4, 0x93, 0xa9, 0x25, 0x31, 0x63, 0x20, 0x9f, 0x4c, 0x00, 0x94, 0x08, 0x66, 0x3c, - 0x27, 0x8a, 0x6f, 0x12, 0x27, 0x8c, 0x37, 0x88, 0xc3, 0xcd, 0x54, 0x8a, 0xc7, 0x36, 0xa9, 0x51, - 0xea, 0x97, 0xdb, 0x69, 0x62, 0xb8, 0x9b, 0x3e, 0xda, 0x03, 0xc4, 0x6c, 0x6d, 0x42, 0xc7, 0x8f, - 0xf8, 0xb7, 0xb8, 0xe2, 0x3d, 0xe0, 0x78, 0xad, 0xce, 0x89, 0x56, 0xd1, 0xed, 0x2e, 0x6a, 0x38, - 0xa3, 0x05, 0xcd, 0x86, 0x6a, 0x68, 0x50, 0x1b, 0xaa, 0xe1, 0x3e, 0x5e, 0x24, 0x3e, 0x4c, 0x77, - 0xc5, 0x1b, 0x78, 0x1b, 0xca, 0xca, 0xd6, 0x4d, 0x1c, 0x3a, 0xbd, 0xc3, 0x76, 0xa4, 0x29, 0x70, - 0x15, 0x49, 0x62, 0x67, 0x99, 0x90, 0xb3, 0xff, 0x61, 0xc1, 0x68, 0x90, 0x4f, 0xe2, 0x1a, 0x8c, - 0x3a, 0x51, 0xe4, 0x6e, 0xf9, 0xa4, 0x25, 0x76, 0xec, 0xc7, 0xf3, 0x76, 0xac, 0xd1, 0x0c, 0xb3, - 0x37, 0x5c, 0x10, 0x35, 0xb1, 0xa2, 0x81, 0x6e, 0x72, 0x63, 0xa0, 0x3d, 0xc9, 0xcf, 0x0f, 0x46, - 0x0d, 0xa4, 0xb9, 0xd0, 0x1e, 0xc1, 0xa2, 0x3e, 0xfa, 0x22, 0xb7, 0xd6, 0xba, 0xe5, 0x07, 0xf7, - 0xfd, 0x1b, 0x41, 0x20, 0x3d, 0xcc, 0x06, 0x23, 0x38, 0x23, 0x6d, 0xb4, 0x54, 0x75, 0x6c, 0x52, - 0x1b, 0x2c, 0x26, 0xcf, 0x77, 0xc3, 0x19, 0x4a, 0xda, 0xf4, 0x13, 0x89, 0x10, 0x81, 0x29, 0x11, - 0x09, 0x41, 0x96, 0x89, 0xb1, 0xcb, 0x64, 0xd5, 0xcd, 0xda, 0x89, 0x42, 0xef, 0x96, 0x49, 0x02, - 0xa7, 0x69, 0xda, 0x3f, 0x6d, 0x01, 0xb3, 0x70, 0x3f, 0x05, 0x96, 0xe1, 0x73, 0x26, 0xcb, 0x30, - 0x9b, 0x37, 0xc8, 0x39, 0xdc, 0xc2, 0x4b, 0x7c, 0x65, 0xd5, 0xc3, 0xe0, 0xc1, 0xbe, 0x78, 0x29, - 0x1f, 0x80, 0x4b, 0xfd, 0xdf, 0x16, 0x3f, 0xc4, 0x94, 0xd3, 0x39, 0xfa, 0x1e, 0x18, 0x6d, 0x3a, - 0x6d, 0xa7, 0xc9, 0x43, 0xf6, 0xe6, 0x6a, 0x6c, 0x8c, 0x4a, 0xf3, 0x4b, 0xa2, 0x06, 0xd7, 0x40, - 0xc8, 0x88, 0x1a, 0xa3, 0xb2, 0xb8, 0xaf, 0xd6, 0x41, 0x35, 0x39, 0xb7, 0x03, 0x13, 0x06, 0xb1, - 0x47, 0x2a, 0xae, 0x7e, 0x0f, 0xbf, 0x62, 0x55, 0x04, 0x98, 0x5d, 0x98, 0xf1, 0xb5, 0xff, 0xf4, - 0x42, 0x91, 0x22, 0xc8, 0xc7, 0xfb, 0x5d, 0xa2, 0xec, 0xf6, 0xd1, 0x2c, 0xf8, 0x53, 0x64, 0x70, - 0x37, 0x65, 0xfb, 0x27, 0x2d, 0x78, 0x4c, 0x47, 0xd4, 0xe2, 0x01, 0xf4, 0xd3, 0x01, 0x57, 0x61, - 0x34, 0x68, 0x93, 0xd0, 0x89, 0x83, 0x50, 0xdc, 0x1a, 0x57, 0xe5, 0xa0, 0xdf, 0x11, 0xe5, 0x47, - 0x22, 0x76, 0xa2, 0xa4, 0x2e, 0xcb, 0xb1, 0xaa, 0x89, 0x6c, 0x18, 0x66, 0x83, 0x11, 0x89, 0x58, - 0x0d, 0xec, 0x0c, 0x60, 0xcf, 0xa1, 0x11, 0x16, 0x10, 0xfb, 0x0f, 0x2d, 0xbe, 0xb0, 0xf4, 0xae, - 0xa3, 0xf7, 0x60, 0x7a, 0xd7, 0x89, 0x9b, 0xdb, 0xcb, 0x0f, 0xda, 0x21, 0x57, 0x7d, 0xcb, 0x71, - 0x7a, 0xb6, 0xdf, 0x38, 0x69, 0x1f, 0x99, 0x18, 0xa0, 0xad, 0xa6, 0x88, 0xe1, 0x2e, 0xf2, 0x68, - 0x03, 0xc6, 0x58, 0x19, 0xb3, 0x74, 0x8e, 0x7a, 0xb1, 0x06, 0x79, 0xad, 0xa9, 0x17, 0xe5, 0xd5, - 0x84, 0x0e, 0xd6, 0x89, 0xda, 0x5f, 0x29, 0xf2, 0xdd, 0xce, 0xb8, 0xed, 0x67, 0x60, 0xa4, 0x1d, - 0xb4, 0x96, 0x6a, 0x55, 0x2c, 0x66, 0x41, 0x5d, 0x23, 0x75, 0x5e, 0x8c, 0x25, 0x1c, 0xbd, 0x06, - 0x40, 0x1e, 0xc4, 0x24, 0xf4, 0x1d, 0x4f, 0x19, 0x84, 0x28, 0x13, 0xc8, 0x6a, 0xb0, 0x16, 0xc4, - 0x77, 0x23, 0xf2, 0x5d, 0xcb, 0x0a, 0x05, 0x6b, 0xe8, 0xe8, 0x3a, 0x40, 0x3b, 0x0c, 0xf6, 0xdc, - 0x16, 0x73, 0x9d, 0x2b, 0x9a, 0xe6, 0x12, 0x75, 0x05, 0xc1, 0x1a, 0x16, 0x7a, 0x0d, 0x26, 0x3a, - 0x7e, 0xc4, 0x39, 0x14, 0x67, 0x43, 0x44, 0x1e, 0x1c, 0x4d, 0x2c, 0x17, 0xee, 0xea, 0x40, 0x6c, - 0xe2, 0xa2, 0x05, 0x18, 0x8e, 0x1d, 0x66, 0xef, 0x30, 0x94, 0x6f, 0xb7, 0xb8, 0x4e, 0x31, 0xf4, - 0x80, 0xb1, 0xb4, 0x02, 0x16, 0x15, 0xd1, 0xdb, 0xd2, 0x0f, 0x81, 0x9f, 0xf5, 0xc2, 0x60, 0x78, - 0xb0, 0x7b, 0x41, 0xf3, 0x42, 0x10, 0x86, 0xc8, 0x06, 0x2d, 0xfb, 0x1b, 0x65, 0x80, 0x84, 0x1d, - 0x47, 0xef, 0x77, 0x9d, 0x47, 0xcf, 0xf5, 0x66, 0xe0, 0x4f, 0xee, 0x30, 0x42, 0xdf, 0x6f, 0xc1, - 0x98, 0xe3, 0x79, 0x41, 0xd3, 0x89, 0xd9, 0x28, 0x17, 0x7a, 0x9f, 0x87, 0xa2, 0xfd, 0x85, 0xa4, - 0x06, 0xef, 0xc2, 0x8b, 0x72, 0xe1, 0x69, 0x90, 0xbe, 0xbd, 0xd0, 0x1b, 0x46, 0x9f, 0x92, 0x52, - 0x1a, 0x5f, 0x1e, 0x73, 0x69, 0x29, 0xad, 0xcc, 0x8e, 0x7e, 0x4d, 0x40, 0x43, 0x77, 0x8d, 0xa0, - 0x72, 0xa5, 0xfc, 0xf8, 0x0a, 0x06, 0x57, 0xda, 0x2f, 0x9e, 0x1c, 0xaa, 0xeb, 0x8e, 0x53, 0x43, - 0xf9, 0x41, 0x48, 0x34, 0xf1, 0xa7, 0x8f, 0xd3, 0xd4, 0xbb, 0x30, 0xd5, 0x32, 0xef, 0x76, 0xb1, - 0x9a, 0x9e, 0xce, 0xa3, 0x9b, 0x62, 0x05, 0x92, 0xdb, 0x3c, 0x05, 0xc0, 0x69, 0xc2, 0xa8, 0xce, - 0x5d, 0xd8, 0x6a, 0xfe, 0x66, 0x20, 0x0c, 0xcf, 0xed, 0xdc, 0xb9, 0xdc, 0x8f, 0x62, 0xb2, 0x4b, - 0x31, 0x93, 0x4b, 0x7b, 0x4d, 0xd4, 0xc5, 0x8a, 0x0a, 0x7a, 0x03, 0x86, 0x99, 0x0f, 0x6c, 0x34, - 0x3b, 0x9a, 0xaf, 0x28, 0x34, 0xc3, 0x37, 0x24, 0x9b, 0x8a, 0xfd, 0x8d, 0xb0, 0xa0, 0x80, 0x6e, - 0xca, 0x18, 0x2f, 0x51, 0xcd, 0xbf, 0x1b, 0x11, 0x16, 0xe3, 0xa5, 0xbc, 0xf8, 0xf1, 0x24, 0x7c, - 0x0b, 0x2f, 0xcf, 0x0c, 0x0d, 0x6f, 0xd4, 0xa4, 0xcc, 0x91, 0xf8, 0x2f, 0x23, 0xce, 0xcf, 0x42, - 0x7e, 0xf7, 0xcc, 0xa8, 0xf4, 0xc9, 0x70, 0xde, 0x33, 0x49, 0xe0, 0x34, 0x4d, 0xca, 0x68, 0xf2, - 0x9d, 0x2b, 0x4c, 0xd7, 0xfb, 0xed, 0x7f, 0x2e, 0x5f, 0xb3, 0x4b, 0x86, 0x97, 0x60, 0x51, 0xff, - 0x54, 0x6f, 0xfd, 0x39, 0x1f, 0xa6, 0xd3, 0x5b, 0xf4, 0x91, 0x72, 0x19, 0x7f, 0x50, 0x82, 0x49, - 0x73, 0x49, 0xa1, 0x6b, 0x50, 0x16, 0x44, 0x54, 0xc0, 0x51, 0xb5, 0x4b, 0x56, 0x25, 0x00, 0x27, - 0x38, 0x2c, 0xce, 0x2c, 0xab, 0xae, 0x99, 0x1c, 0x26, 0x71, 0x66, 0x15, 0x04, 0x6b, 0x58, 0x54, - 0x5e, 0xda, 0x08, 0x82, 0x58, 0x5d, 0x2a, 0x6a, 0xdd, 0x2d, 0xb2, 0x52, 0x2c, 0xa0, 0xf4, 0x32, - 0xd9, 0x21, 0xa1, 0x4f, 0x3c, 0x33, 0x8e, 0x99, 0xba, 0x4c, 0x6e, 0xe9, 0x40, 0x6c, 0xe2, 0xd2, - 0x5b, 0x32, 0x88, 0xd8, 0x42, 0x16, 0x52, 0x59, 0x62, 0xc2, 0xd9, 0xe0, 0xde, 0xe4, 0x12, 0x8e, - 0xbe, 0x00, 0x8f, 0x29, 0xe7, 0x6f, 0xcc, 0x95, 0xd0, 0xb2, 0xc5, 0x61, 0x43, 0x89, 0xf2, 0xd8, - 0x52, 0x36, 0x1a, 0xce, 0xab, 0x8f, 0x5e, 0x87, 0x49, 0xc1, 0xb9, 0x4b, 0x8a, 0x23, 0xa6, 0x5d, - 0xc4, 0x2d, 0x03, 0x8a, 0x53, 0xd8, 0x32, 0x12, 0x1b, 0x63, 0x9e, 0x25, 0x85, 0xd1, 0xee, 0x48, - 0x6c, 0x3a, 0x1c, 0x77, 0xd5, 0x40, 0x0b, 0x30, 0xc5, 0x59, 0x2b, 0xd7, 0xdf, 0xe2, 0x73, 0x22, - 0x3c, 0x4b, 0xd4, 0x96, 0xba, 0x63, 0x82, 0x71, 0x1a, 0x1f, 0xbd, 0x0a, 0xe3, 0x4e, 0xd8, 0xdc, - 0x76, 0x63, 0xd2, 0x8c, 0x3b, 0x21, 0x77, 0x39, 0xd1, 0x0c, 0x4b, 0x16, 0x34, 0x18, 0x36, 0x30, - 0xed, 0xf7, 0xe1, 0x4c, 0x86, 0x53, 0x1a, 0x5d, 0x38, 0x4e, 0xdb, 0x95, 0xdf, 0x94, 0x32, 0xc6, - 0x5c, 0xa8, 0xd7, 0xe4, 0xd7, 0x68, 0x58, 0x74, 0x75, 0x32, 0xe7, 0x35, 0x2d, 0xc1, 0x84, 0x5a, - 0x9d, 0x2b, 0x12, 0x80, 0x13, 0x1c, 0xfb, 0x7f, 0x16, 0x60, 0x2a, 0x43, 0xb1, 0xce, 0x92, 0x1c, - 0xa4, 0x64, 0x8f, 0x24, 0xa7, 0x81, 0x19, 0xd8, 0xaf, 0x70, 0x8c, 0xc0, 0x7e, 0xc5, 0x7e, 0x81, - 0xfd, 0x4a, 0x1f, 0x24, 0xb0, 0x9f, 0x39, 0x62, 0x43, 0x03, 0x8d, 0x58, 0x46, 0x30, 0xc0, 0xe1, - 0x63, 0x06, 0x03, 0x34, 0x06, 0x7d, 0x64, 0x80, 0x41, 0xff, 0x91, 0x02, 0x4c, 0xa7, 0x0d, 0xe0, - 0x4e, 0x41, 0x1d, 0xfb, 0x86, 0xa1, 0x8e, 0xcd, 0x4e, 0x19, 0x92, 0x36, 0xcb, 0xcb, 0x53, 0xcd, - 0xe2, 0x94, 0x6a, 0xf6, 0x93, 0x03, 0x51, 0xeb, 0xad, 0xa6, 0xfd, 0xdb, 0x05, 0x38, 0x97, 0xae, - 0xb2, 0xe4, 0x39, 0xee, 0xee, 0x29, 0x8c, 0xcd, 0x1d, 0x63, 0x6c, 0x9e, 0x1f, 0xe4, 0x6b, 0x58, - 0xd7, 0x72, 0x07, 0xe8, 0xad, 0xd4, 0x00, 0x5d, 0x1b, 0x9c, 0x64, 0xef, 0x51, 0xfa, 0x66, 0x11, - 0x2e, 0x65, 0xd6, 0x4b, 0xb4, 0x99, 0x2b, 0x86, 0x36, 0xf3, 0x7a, 0x4a, 0x9b, 0x69, 0xf7, 0xae, - 0x7d, 0x32, 0xea, 0x4d, 0xe1, 0x2d, 0xc8, 0x82, 0xbf, 0x3d, 0xa4, 0x6a, 0xd3, 0xf0, 0x16, 0x54, - 0x84, 0xb0, 0x49, 0xf7, 0xcf, 0x93, 0x4a, 0xf3, 0x5f, 0x5a, 0x70, 0x21, 0x73, 0x6e, 0x4e, 0x41, - 0x85, 0xb5, 0x66, 0xaa, 0xb0, 0x9e, 0x19, 0x78, 0xb5, 0xe6, 0xe8, 0xb4, 0x7e, 0xb3, 0x94, 0xf3, - 0x2d, 0x4c, 0x40, 0xbf, 0x03, 0x63, 0x4e, 0xb3, 0x49, 0xa2, 0x68, 0x35, 0x68, 0xa9, 0x60, 0x68, - 0xcf, 0x33, 0x39, 0x2b, 0x29, 0x3e, 0x3a, 0xa8, 0xcc, 0xa5, 0x49, 0x24, 0x60, 0xac, 0x53, 0x30, - 0xe3, 0x37, 0x16, 0x4e, 0x34, 0x7e, 0xe3, 0x75, 0x80, 0x3d, 0xc5, 0xad, 0xa7, 0x85, 0x7c, 0x8d, - 0x8f, 0xd7, 0xb0, 0xd0, 0x17, 0x61, 0x34, 0x12, 0xd7, 0xb8, 0x58, 0x8a, 0x2f, 0x0e, 0x38, 0x57, - 0xce, 0x06, 0xf1, 0x4c, 0xb7, 0x74, 0xa5, 0x0f, 0x51, 0x24, 0xd1, 0x77, 0xc0, 0x74, 0xc4, 0xa3, - 0x9e, 0x2c, 0x79, 0x4e, 0xc4, 0x7c, 0x1c, 0xc4, 0x2a, 0x64, 0xbe, 0xe6, 0x8d, 0x14, 0x0c, 0x77, - 0x61, 0xa3, 0x15, 0xf9, 0x51, 0x2c, 0x44, 0x0b, 0x5f, 0x98, 0x57, 0x92, 0x0f, 0x12, 0x29, 0x96, - 0xce, 0xa6, 0x87, 0x9f, 0x0d, 0xbc, 0x56, 0x13, 0x7d, 0x11, 0x80, 0x2e, 0x1f, 0xa1, 0x4b, 0x18, - 0xc9, 0x3f, 0x3c, 0xe9, 0xa9, 0xd2, 0xca, 0xb4, 0xea, 0x64, 0x7e, 0x7a, 0x55, 0x45, 0x04, 0x6b, - 0x04, 0xed, 0x1f, 0x29, 0xc1, 0xe3, 0x3d, 0xce, 0x48, 0xb4, 0x60, 0x3e, 0x81, 0x3e, 0x9b, 0x16, - 0xae, 0xe7, 0x32, 0x2b, 0x1b, 0xd2, 0x76, 0x6a, 0x29, 0x16, 0x3e, 0xf0, 0x52, 0xfc, 0x41, 0x4b, - 0x53, 0x7b, 0x70, 0x43, 0xbd, 0xcf, 0x1d, 0xf3, 0xec, 0x3f, 0x41, 0x3d, 0xc8, 0x66, 0x86, 0x32, - 0xe1, 0xfa, 0xc0, 0xdd, 0x19, 0x58, 0xbb, 0x70, 0xba, 0xca, 0xdf, 0xaf, 0x58, 0xf0, 0x64, 0x66, - 0x7f, 0x0d, 0x93, 0x8d, 0x6b, 0x50, 0x6e, 0xd2, 0x42, 0xcd, 0x2d, 0x2b, 0xf1, 0x57, 0x95, 0x00, - 0x9c, 0xe0, 0x18, 0x96, 0x19, 0x85, 0xbe, 0x96, 0x19, 0xff, 0xcc, 0x82, 0xae, 0xfd, 0x71, 0x0a, - 0x07, 0x75, 0xcd, 0x3c, 0xa8, 0x3f, 0x3e, 0xc8, 0x5c, 0xe6, 0x9c, 0xd1, 0xff, 0x69, 0x0a, 0xce, - 0xe7, 0xf8, 0x61, 0xec, 0xc1, 0xcc, 0x56, 0x93, 0x98, 0x0e, 0x6f, 0xe2, 0x63, 0x32, 0x7d, 0x03, - 0x7b, 0x7a, 0xc7, 0xb1, 0xd4, 0x3b, 0x33, 0x5d, 0x28, 0xb8, 0xbb, 0x09, 0xf4, 0x15, 0x0b, 0xce, - 0x3a, 0xf7, 0xa3, 0xae, 0x04, 0x8b, 0x62, 0xcd, 0xbc, 0x94, 0xa9, 0x04, 0xe9, 0x93, 0x90, 0x91, - 0xe7, 0x22, 0xca, 0xc2, 0xc2, 0x99, 0x6d, 0x21, 0x2c, 0xc2, 0x63, 0x52, 0x76, 0xbe, 0x87, 0x4b, - 0x66, 0x96, 0xc3, 0x0c, 0x3f, 0xb2, 0x25, 0x04, 0x2b, 0x3a, 0xe8, 0x1e, 0x94, 0xb7, 0xa4, 0x17, - 0x9b, 0xb8, 0x12, 0x32, 0xef, 0xd8, 0x4c, 0x57, 0x37, 0xfe, 0x2c, 0xa9, 0x40, 0x38, 0x21, 0x85, - 0x5e, 0x87, 0xa2, 0xbf, 0x19, 0xf5, 0x4a, 0xe2, 0x93, 0xb2, 0x64, 0xe2, 0xee, 0xce, 0x6b, 0x2b, - 0x0d, 0x4c, 0x2b, 0xa2, 0x9b, 0x50, 0x0c, 0x37, 0x5a, 0x42, 0x6f, 0x97, 0x79, 0x72, 0xe3, 0xc5, - 0x6a, 0xf6, 0x22, 0xe1, 0x94, 0xf0, 0x62, 0x15, 0x53, 0x12, 0xa8, 0x0e, 0x43, 0xcc, 0x65, 0x41, - 0xdc, 0x02, 0x99, 0xfc, 0x6e, 0x0f, 0xd7, 0x1f, 0xee, 0x13, 0xcd, 0x10, 0x30, 0x27, 0x84, 0xd6, - 0x61, 0xb8, 0xc9, 0x12, 0xbe, 0x88, 0x88, 0xcc, 0x9f, 0xca, 0xd4, 0xd0, 0xf5, 0xc8, 0x84, 0x23, - 0x14, 0x56, 0x0c, 0x03, 0x0b, 0x5a, 0x8c, 0x2a, 0x69, 0x6f, 0x6f, 0x46, 0x4c, 0xc2, 0xcf, 0xa3, - 0xda, 0x23, 0xc1, 0x93, 0xa0, 0xca, 0x30, 0xb0, 0xa0, 0x85, 0x3e, 0x03, 0x85, 0xcd, 0xa6, 0xf0, - 0x68, 0xc8, 0x54, 0xd5, 0x99, 0x1e, 0xeb, 0x8b, 0xc3, 0x87, 0x07, 0x95, 0xc2, 0xca, 0x12, 0x2e, - 0x6c, 0x36, 0xd1, 0x1a, 0x8c, 0x6c, 0x72, 0x1f, 0x57, 0xa1, 0x8d, 0x7b, 0x3a, 0xdb, 0xfd, 0xb6, - 0xcb, 0x0d, 0x96, 0x5b, 0xe2, 0x0b, 0x00, 0x96, 0x44, 0x58, 0x8c, 0x49, 0xe5, 0xab, 0x2b, 0x82, - 0x2d, 0xcf, 0x1f, 0xcf, 0xbf, 0x9a, 0xdf, 0xca, 0x89, 0xc7, 0x2f, 0xd6, 0x28, 0xa2, 0x2f, 0x43, - 0xd9, 0x91, 0xa9, 0xfd, 0x44, 0x30, 0x8a, 0x17, 0x33, 0x37, 0x66, 0xef, 0xac, 0x87, 0x7c, 0x55, - 0x2b, 0x24, 0x9c, 0x10, 0x45, 0x3b, 0x30, 0xb1, 0x17, 0xb5, 0xb7, 0x89, 0xdc, 0xc8, 0x2c, 0x36, - 0x45, 0xce, 0xc5, 0x75, 0x4f, 0x20, 0xba, 0x61, 0xdc, 0x71, 0xbc, 0xae, 0xb3, 0x87, 0xbd, 0x65, - 0xdf, 0xd3, 0x89, 0x61, 0x93, 0x36, 0x1d, 0xfe, 0xf7, 0x3a, 0xc1, 0xc6, 0x7e, 0x4c, 0x44, 0x74, - 0xe6, 0xcc, 0xe1, 0x7f, 0x93, 0xa3, 0x74, 0x0f, 0xbf, 0x00, 0x60, 0x49, 0x84, 0x6e, 0x75, 0x47, - 0xa6, 0xcd, 0x64, 0x51, 0x99, 0x73, 0xb6, 0x7a, 0x66, 0x6e, 0x4d, 0x6d, 0x50, 0xd8, 0x19, 0x99, - 0x90, 0x62, 0x67, 0x63, 0x7b, 0x3b, 0x88, 0x03, 0x3f, 0x75, 0x2e, 0xcf, 0xe4, 0x9f, 0x8d, 0xf5, - 0x0c, 0xfc, 0xee, 0xb3, 0x31, 0x0b, 0x0b, 0x67, 0xb6, 0x85, 0x5a, 0x30, 0xd9, 0x0e, 0xc2, 0xf8, - 0x7e, 0x10, 0xca, 0xf5, 0x85, 0x7a, 0x68, 0x13, 0x0c, 0x4c, 0xd1, 0x22, 0x8b, 0x16, 0x6e, 0x42, - 0x70, 0x8a, 0x26, 0xfa, 0x3c, 0x8c, 0x44, 0x4d, 0xc7, 0x23, 0xb5, 0x3b, 0xb3, 0x67, 0xf2, 0x2f, - 0x9d, 0x06, 0x47, 0xc9, 0x59, 0x5d, 0x6c, 0x72, 0x04, 0x0a, 0x96, 0xe4, 0xd0, 0x0a, 0x0c, 0xb1, - 0x90, 0xff, 0x2c, 0xb0, 0x74, 0x4e, 0xd0, 0xa3, 0x2e, 0x9b, 0x51, 0x7e, 0x36, 0xb1, 0x62, 0xcc, - 0xab, 0xd3, 0x3d, 0x20, 0x98, 0xea, 0x20, 0x9a, 0x3d, 0x97, 0xbf, 0x07, 0x04, 0x2f, 0x7e, 0xa7, - 0xd1, 0x6b, 0x0f, 0x28, 0x24, 0x9c, 0x10, 0xa5, 0x27, 0x33, 0x3d, 0x4d, 0xcf, 0xf7, 0x30, 0x63, - 0xc9, 0x3d, 0x4b, 0xd9, 0xc9, 0x4c, 0x4f, 0x52, 0x4a, 0xc2, 0xfe, 0xbd, 0x91, 0x6e, 0x4e, 0x85, - 0x89, 0x61, 0xff, 0xbf, 0xd5, 0xf5, 0x42, 0xf7, 0xe9, 0x41, 0xb5, 0x42, 0x27, 0xc8, 0xa3, 0x7e, - 0xc5, 0x82, 0xf3, 0xed, 0xcc, 0x0f, 0x11, 0xd7, 0xfe, 0x60, 0xca, 0x25, 0xfe, 0xe9, 0x2a, 0xf8, - 0x7b, 0x36, 0x1c, 0xe7, 0xb4, 0x94, 0x96, 0x03, 0x8a, 0x1f, 0x58, 0x0e, 0x58, 0x85, 0x51, 0xc6, - 0x5a, 0xf6, 0x49, 0x80, 0x96, 0x16, 0x87, 0x18, 0x03, 0xb1, 0x24, 0x2a, 0x62, 0x45, 0x02, 0xfd, - 0x90, 0x05, 0x17, 0xd3, 0x5d, 0xc7, 0x84, 0x81, 0x45, 0xa8, 0x74, 0x2e, 0x01, 0xae, 0x88, 0xef, - 0xbf, 0x58, 0xef, 0x85, 0x7c, 0xd4, 0x0f, 0x01, 0xf7, 0x6e, 0x0c, 0x55, 0x33, 0x44, 0xd0, 0x61, - 0x53, 0xed, 0x3e, 0x80, 0x18, 0xfa, 0x12, 0x8c, 0xef, 0x06, 0x1d, 0x3f, 0x16, 0x56, 0x2f, 0xc2, - 0x07, 0x91, 0x3d, 0x33, 0xaf, 0x6a, 0xe5, 0xd8, 0xc0, 0x4a, 0x09, 0xaf, 0xa3, 0x0f, 0x2d, 0xbc, - 0xbe, 0x93, 0x4a, 0x73, 0x5d, 0xce, 0x0f, 0xc9, 0x27, 0xe4, 0xfc, 0x63, 0x24, 0xbb, 0x3e, 0x5d, - 0x89, 0xe8, 0x67, 0xad, 0x0c, 0x56, 0x9e, 0xcb, 0xc8, 0x9f, 0x35, 0x65, 0xe4, 0x2b, 0x69, 0x19, - 0xb9, 0x4b, 0xe5, 0x6a, 0x88, 0xc7, 0x83, 0xc7, 0x75, 0x1e, 0x34, 0x50, 0x9a, 0xed, 0xc1, 0xe5, - 0x7e, 0xd7, 0x12, 0x33, 0x7f, 0x6a, 0xa9, 0x07, 0xb6, 0xc4, 0xfc, 0xa9, 0x55, 0xab, 0x62, 0x06, - 0x19, 0x34, 0x92, 0x86, 0xfd, 0x5f, 0x2d, 0x28, 0xd6, 0x83, 0xd6, 0x29, 0xa8, 0x90, 0x3f, 0x67, - 0xa8, 0x90, 0x1f, 0xcf, 0x49, 0x3f, 0x9e, 0xab, 0x30, 0x5e, 0x4e, 0x29, 0x8c, 0x2f, 0xe6, 0x11, - 0xe8, 0xad, 0x1e, 0xfe, 0xa9, 0x22, 0xe8, 0xc9, 0xd2, 0xd1, 0x6f, 0x3e, 0x8c, 0xed, 0x71, 0xb1, - 0x57, 0xfe, 0x74, 0x41, 0x99, 0x59, 0x4d, 0x49, 0xb7, 0xba, 0x3f, 0x63, 0x26, 0xc8, 0x6f, 0x11, - 0x77, 0x6b, 0x3b, 0x26, 0xad, 0xf4, 0xe7, 0x9c, 0x9e, 0x09, 0xf2, 0x7f, 0xb6, 0x60, 0x2a, 0xd5, - 0x3a, 0xf2, 0x60, 0xc2, 0xd3, 0xf5, 0x7f, 0x62, 0x9d, 0x3e, 0x94, 0xea, 0x50, 0x98, 0x70, 0x6a, - 0x45, 0xd8, 0x24, 0x8e, 0xe6, 0x01, 0xd4, 0xfb, 0x9c, 0xd4, 0x7b, 0x31, 0xae, 0x5f, 0x3d, 0xe0, - 0x45, 0x58, 0xc3, 0x40, 0x2f, 0xc3, 0x58, 0x1c, 0xb4, 0x03, 0x2f, 0xd8, 0xda, 0xbf, 0x45, 0x64, - 0xec, 0x16, 0x65, 0x98, 0xb5, 0x9e, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0x4c, 0x11, 0xd2, 0x09, 0xf6, - 0xbf, 0xb5, 0x26, 0x3f, 0x9a, 0x6b, 0xf2, 0x9b, 0x16, 0x4c, 0xd3, 0xd6, 0x99, 0x91, 0x88, 0xbc, - 0x6c, 0x55, 0x7e, 0x19, 0xab, 0x47, 0x7e, 0x99, 0x2b, 0xf4, 0xec, 0x6a, 0x05, 0x9d, 0x58, 0xe8, - 0xcd, 0xb4, 0xc3, 0x89, 0x96, 0x62, 0x01, 0x15, 0x78, 0x24, 0x0c, 0x85, 0xe7, 0x93, 0x8e, 0x47, - 0xc2, 0x10, 0x0b, 0xa8, 0x4c, 0x3f, 0x53, 0xca, 0x49, 0x3f, 0xc3, 0x22, 0xd1, 0x09, 0x73, 0x02, - 0xc1, 0xf6, 0x68, 0x91, 0xe8, 0xa4, 0x9d, 0x41, 0x82, 0x63, 0xff, 0x42, 0x11, 0xc6, 0xeb, 0x41, - 0x2b, 0x79, 0x21, 0x7b, 0xc9, 0x78, 0x21, 0xbb, 0x9c, 0x7a, 0x21, 0x9b, 0xd6, 0x71, 0xbf, 0xf5, - 0x1e, 0xf6, 0x61, 0xbd, 0x87, 0xfd, 0x53, 0x8b, 0xcd, 0x5a, 0x75, 0xad, 0x21, 0xd2, 0xdf, 0xbe, - 0x00, 0x63, 0xec, 0x40, 0x62, 0xae, 0x76, 0xf2, 0xd9, 0x88, 0x45, 0x96, 0x5f, 0x4b, 0x8a, 0xb1, - 0x8e, 0x83, 0xae, 0xc2, 0x68, 0x44, 0x9c, 0xb0, 0xb9, 0xad, 0xce, 0x38, 0xf1, 0xa8, 0xc2, 0xcb, - 0xb0, 0x82, 0xa2, 0x37, 0x93, 0x20, 0x68, 0xc5, 0xfc, 0x44, 0xae, 0x7a, 0x7f, 0xf8, 0x16, 0xc9, - 0x8f, 0x7c, 0x66, 0xbf, 0x05, 0xa8, 0x1b, 0x7f, 0x80, 0x70, 0x47, 0x15, 0x33, 0xdc, 0x51, 0xb9, - 0x2b, 0xd4, 0xd1, 0x9f, 0x58, 0x30, 0x59, 0x0f, 0x5a, 0x74, 0xeb, 0xfe, 0x79, 0xda, 0xa7, 0x7a, - 0x04, 0xc8, 0xe1, 0x1e, 0x11, 0x20, 0xff, 0x8e, 0x05, 0x23, 0xf5, 0xa0, 0x75, 0x0a, 0xda, 0xf6, - 0xcf, 0x9a, 0xda, 0xf6, 0xc7, 0x72, 0x96, 0x44, 0x8e, 0x82, 0xfd, 0x97, 0x8a, 0x30, 0x41, 0xfb, - 0x19, 0x6c, 0xc9, 0x59, 0x32, 0x46, 0xc4, 0x1a, 0x60, 0x44, 0x28, 0x9b, 0x1b, 0x78, 0x5e, 0x70, - 0x3f, 0x3d, 0x63, 0x2b, 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x0e, 0x46, 0xdb, 0x21, 0xd9, 0x73, 0x03, - 0xc1, 0x3f, 0x6a, 0x6f, 0x17, 0x75, 0x51, 0x8e, 0x15, 0x06, 0x95, 0xbb, 0x22, 0xd7, 0x6f, 0x12, - 0x99, 0x45, 0xba, 0xc4, 0x12, 0x4d, 0xf1, 0xd0, 0xce, 0x5a, 0x39, 0x36, 0xb0, 0xd0, 0x5b, 0x50, - 0x66, 0xff, 0xd9, 0x89, 0x72, 0xfc, 0xc4, 0x38, 0x22, 0x9f, 0x82, 0x20, 0x80, 0x13, 0x5a, 0xe8, - 0x3a, 0x40, 0x2c, 0xc3, 0xff, 0x46, 0x22, 0x6a, 0x8d, 0xe2, 0xb5, 0x55, 0x60, 0xe0, 0x08, 0x6b, - 0x58, 0xe8, 0x59, 0x28, 0xc7, 0x8e, 0xeb, 0xdd, 0x76, 0x7d, 0x12, 0x31, 0x95, 0x73, 0x51, 0xa6, - 0x4b, 0x10, 0x85, 0x38, 0x81, 0x53, 0x5e, 0x87, 0xb9, 0x74, 0xf3, 0xb4, 0x5a, 0xa3, 0x0c, 0x9b, - 0xf1, 0x3a, 0xb7, 0x55, 0x29, 0xd6, 0x30, 0xec, 0x57, 0xe1, 0x5c, 0x3d, 0x68, 0xd5, 0x83, 0x30, - 0x5e, 0x09, 0xc2, 0xfb, 0x4e, 0xd8, 0x92, 0xf3, 0x57, 0x91, 0x91, 0xfb, 0xe9, 0xd9, 0x33, 0xc4, - 0x77, 0xa6, 0x11, 0x93, 0xff, 0x45, 0xc6, 0xed, 0x1c, 0xd3, 0x95, 0xa3, 0xc9, 0xee, 0x5d, 0x95, - 0x41, 0xef, 0x86, 0x13, 0x13, 0x74, 0x87, 0x65, 0xdd, 0x4a, 0xae, 0x20, 0x51, 0xfd, 0x19, 0x2d, - 0xeb, 0x56, 0x02, 0xcc, 0xbc, 0xb3, 0xcc, 0xfa, 0xf6, 0xaf, 0x15, 0xd9, 0x69, 0x94, 0x4a, 0x28, - 0x87, 0xbe, 0x04, 0x93, 0x11, 0xb9, 0xed, 0xfa, 0x9d, 0x07, 0x52, 0x08, 0xef, 0xe1, 0x8c, 0xd3, - 0x58, 0xd6, 0x31, 0xb9, 0x2a, 0xcf, 0x2c, 0xc3, 0x29, 0x6a, 0x74, 0x9e, 0xc2, 0x8e, 0xbf, 0x10, - 0xdd, 0x8d, 0x48, 0x28, 0x12, 0x9a, 0xb1, 0x79, 0xc2, 0xb2, 0x10, 0x27, 0x70, 0xba, 0x2e, 0xd9, - 0x9f, 0xb5, 0xc0, 0xc7, 0x41, 0x10, 0xcb, 0x95, 0xcc, 0x52, 0xe2, 0x68, 0xe5, 0xd8, 0xc0, 0x42, - 0x2b, 0x80, 0xa2, 0x4e, 0xbb, 0xed, 0xb1, 0xe7, 0x7c, 0xc7, 0xbb, 0x11, 0x06, 0x9d, 0x36, 0x7f, - 0xeb, 0x2c, 0x2e, 0x9e, 0xa7, 0x57, 0x58, 0xa3, 0x0b, 0x8a, 0x33, 0x6a, 0xd0, 0xd3, 0x67, 0x33, - 0x62, 0xbf, 0xd9, 0xea, 0x2e, 0x0a, 0xf5, 0x7a, 0x83, 0x15, 0x61, 0x09, 0xa3, 0x8b, 0x89, 0x35, - 0xcf, 0x31, 0x87, 0x93, 0xc5, 0x84, 0x55, 0x29, 0xd6, 0x30, 0xd0, 0x32, 0x8c, 0x44, 0xfb, 0x51, - 0x33, 0x16, 0x31, 0x96, 0x72, 0x52, 0x53, 0x36, 0x18, 0x8a, 0x96, 0x2e, 0x81, 0x57, 0xc1, 0xb2, - 0xae, 0xfd, 0x3d, 0xec, 0x32, 0x64, 0xe9, 0xaf, 0xe2, 0x4e, 0x48, 0xd0, 0x2e, 0x4c, 0xb4, 0xd9, - 0x94, 0x8b, 0xe0, 0xcc, 0x62, 0xde, 0x5e, 0x1a, 0x50, 0xaa, 0xbd, 0x4f, 0x0f, 0x1a, 0xa5, 0x75, - 0x62, 0xe2, 0x42, 0x5d, 0x27, 0x87, 0x4d, 0xea, 0xf6, 0xbf, 0x9a, 0x61, 0x67, 0x6e, 0x83, 0x8b, - 0xaa, 0x23, 0xc2, 0xa0, 0x58, 0xf0, 0xe5, 0x73, 0xf9, 0x3a, 0x93, 0xe4, 0x8b, 0x84, 0x51, 0x32, - 0x96, 0x75, 0xd1, 0x9b, 0xec, 0x6d, 0x9a, 0x1f, 0x74, 0xfd, 0xb2, 0x10, 0x73, 0x2c, 0xe3, 0x19, - 0x5a, 0x54, 0xc4, 0x1a, 0x11, 0x74, 0x1b, 0x26, 0x44, 0xb6, 0x24, 0xa1, 0x14, 0x2b, 0x1a, 0x4a, - 0x8f, 0x09, 0xac, 0x03, 0x8f, 0xd2, 0x05, 0xd8, 0xac, 0x8c, 0xb6, 0xe0, 0xa2, 0x96, 0x3a, 0xf0, - 0x46, 0xe8, 0xb0, 0xf7, 0x4a, 0x97, 0x6d, 0x22, 0xed, 0xdc, 0x7c, 0xf2, 0xf0, 0xa0, 0x72, 0x71, - 0xbd, 0x17, 0x22, 0xee, 0x4d, 0x07, 0xdd, 0x81, 0x73, 0xdc, 0x6f, 0xaf, 0x4a, 0x9c, 0x96, 0xe7, - 0xfa, 0xea, 0x60, 0xe6, 0xeb, 0xf0, 0xc2, 0xe1, 0x41, 0xe5, 0xdc, 0x42, 0x16, 0x02, 0xce, 0xae, - 0x87, 0x3e, 0x0b, 0xe5, 0x96, 0x1f, 0x89, 0x31, 0x18, 0x36, 0xb2, 0x62, 0x96, 0xab, 0x6b, 0x0d, - 0xf5, 0xfd, 0xc9, 0x1f, 0x9c, 0x54, 0x40, 0x5b, 0x5c, 0x31, 0xa6, 0xe4, 0xd0, 0x91, 0xfc, 0x0c, - 0xe8, 0x62, 0x49, 0x18, 0x9e, 0x3b, 0x5c, 0x23, 0xac, 0x2c, 0x5f, 0x0d, 0xa7, 0x1e, 0x83, 0x30, - 0x7a, 0x03, 0x10, 0x65, 0xd4, 0xdc, 0x26, 0x59, 0x68, 0xb2, 0x18, 0xd9, 0x4c, 0x8f, 0x38, 0x6a, - 0x78, 0x4a, 0xa0, 0x46, 0x17, 0x06, 0xce, 0xa8, 0x85, 0x6e, 0xd2, 0x83, 0x4c, 0x2f, 0x15, 0x16, - 0xbc, 0x92, 0xb9, 0x9f, 0xad, 0x92, 0x76, 0x48, 0x9a, 0x4e, 0x4c, 0x5a, 0x26, 0x45, 0x9c, 0xaa, - 0x47, 0xef, 0x52, 0x95, 0x2e, 0x07, 0xcc, 0x40, 0x18, 0xdd, 0x29, 0x73, 0xa8, 0x5c, 0xbc, 0x1d, - 0x44, 0xf1, 0x1a, 0x89, 0xef, 0x07, 0xe1, 0x8e, 0x88, 0x3b, 0x96, 0x84, 0xc0, 0x4c, 0x40, 0x58, - 0xc7, 0xa3, 0x7c, 0x30, 0x7b, 0x1c, 0xae, 0x55, 0xd9, 0x0b, 0xdd, 0x68, 0xb2, 0x4f, 0x6e, 0xf2, - 0x62, 0x2c, 0xe1, 0x12, 0xb5, 0x56, 0x5f, 0x62, 0xaf, 0x6d, 0x29, 0xd4, 0x5a, 0x7d, 0x09, 0x4b, - 0x38, 0x22, 0xdd, 0x19, 0x47, 0x27, 0xf3, 0xb5, 0x9a, 0xdd, 0xd7, 0xc1, 0x80, 0x49, 0x47, 0x7d, - 0x98, 0x56, 0xb9, 0x4e, 0x79, 0x40, 0xb6, 0x68, 0x76, 0x8a, 0x2d, 0x92, 0xc1, 0xa3, 0xb9, 0x29, - 0x3d, 0x71, 0x2d, 0x45, 0x09, 0x77, 0xd1, 0x36, 0x42, 0x93, 0x4c, 0xf7, 0x4d, 0x77, 0x74, 0x0d, - 0xca, 0x51, 0x67, 0xa3, 0x15, 0xec, 0x3a, 0xae, 0xcf, 0x1e, 0xc7, 0x34, 0x26, 0xab, 0x21, 0x01, - 0x38, 0xc1, 0x41, 0x2b, 0x30, 0xea, 0x48, 0x25, 0x30, 0xca, 0x8f, 0x55, 0xa0, 0x54, 0xbf, 0xdc, - 0x7d, 0x57, 0xaa, 0x7d, 0x55, 0x5d, 0xf4, 0x1a, 0x4c, 0x08, 0x6f, 0x2d, 0x1e, 0xc1, 0x81, 0x3d, - 0x5e, 0x69, 0xe6, 0xf8, 0x0d, 0x1d, 0x88, 0x4d, 0x5c, 0xf4, 0x45, 0x98, 0xa4, 0x54, 0x92, 0x83, - 0x6d, 0xf6, 0xec, 0x20, 0x27, 0xa2, 0x96, 0xc6, 0x42, 0xaf, 0x8c, 0x53, 0xc4, 0x50, 0x0b, 0x9e, - 0x70, 0x3a, 0x71, 0xc0, 0x14, 0xe9, 0xe6, 0xfa, 0x5f, 0x0f, 0x76, 0x88, 0xcf, 0xde, 0xb0, 0x46, - 0x17, 0x2f, 0x1f, 0x1e, 0x54, 0x9e, 0x58, 0xe8, 0x81, 0x87, 0x7b, 0x52, 0x41, 0x77, 0x61, 0x2c, - 0x0e, 0x3c, 0x66, 0x18, 0x4f, 0x59, 0x89, 0xf3, 0xf9, 0xa1, 0x7d, 0xd6, 0x15, 0x9a, 0xae, 0x44, - 0x52, 0x55, 0xb1, 0x4e, 0x07, 0xad, 0xf3, 0x3d, 0xc6, 0x82, 0x9e, 0x92, 0x68, 0xf6, 0xb1, 0xfc, - 0x81, 0x51, 0xb1, 0x51, 0xcd, 0x2d, 0x28, 0x6a, 0x62, 0x9d, 0x0c, 0xba, 0x01, 0x33, 0xed, 0xd0, - 0x0d, 0xd8, 0xc2, 0x56, 0x8f, 0x18, 0xb3, 0x66, 0xe6, 0x82, 0x7a, 0x1a, 0x01, 0x77, 0xd7, 0xa1, - 0x42, 0xa6, 0x2c, 0x9c, 0xbd, 0xc0, 0xd3, 0x60, 0x71, 0xc6, 0x9b, 0x97, 0x61, 0x05, 0x45, 0xab, - 0xec, 0x5c, 0xe6, 0xe2, 0xe0, 0xec, 0x5c, 0x7e, 0x8c, 0x07, 0x5d, 0x6c, 0xe4, 0xfc, 0x92, 0xfa, - 0x8b, 0x13, 0x0a, 0xf4, 0xde, 0x88, 0xb6, 0x9d, 0x90, 0xd4, 0xc3, 0xa0, 0x49, 0x78, 0x67, 0xb8, - 0x4d, 0xfe, 0xe3, 0x3c, 0x36, 0x23, 0xbd, 0x37, 0x1a, 0x59, 0x08, 0x38, 0xbb, 0x1e, 0x6a, 0x69, - 0xd9, 0x9f, 0x29, 0x1b, 0x1a, 0xcd, 0x3e, 0xd1, 0xc3, 0xcc, 0x28, 0xc5, 0xb3, 0x26, 0x6b, 0xd1, - 0x28, 0x8e, 0x70, 0x8a, 0x26, 0xfa, 0x0e, 0x98, 0x16, 0xa1, 0x8c, 0x92, 0x71, 0xbf, 0x98, 0xd8, - 0x2f, 0xe2, 0x14, 0x0c, 0x77, 0x61, 0xcf, 0x7d, 0x3b, 0xcc, 0x74, 0xdd, 0x38, 0xc7, 0x0a, 0x2c, - 0xfe, 0xc7, 0x43, 0x50, 0x56, 0xca, 0x74, 0x74, 0xcd, 0x7c, 0x23, 0xb9, 0x90, 0x7e, 0x23, 0x19, - 0xa5, 0x3c, 0xbd, 0xfe, 0x2c, 0xb2, 0x6e, 0x98, 0xd5, 0x15, 0xf2, 0xd3, 0x78, 0xe9, 0x5c, 0x79, - 0x5f, 0x17, 0x3d, 0x4d, 0x37, 0x52, 0x1c, 0xf8, 0xb1, 0xa5, 0xd4, 0x53, 0xdd, 0x32, 0x60, 0x16, - 0x5d, 0xf4, 0x14, 0x15, 0x6c, 0x5a, 0xb5, 0x7a, 0x3a, 0xad, 0x64, 0x9d, 0x16, 0x62, 0x0e, 0x63, - 0x02, 0x20, 0x65, 0x8f, 0x98, 0x00, 0x38, 0xf2, 0x90, 0x02, 0xa0, 0x24, 0x80, 0x13, 0x5a, 0xc8, - 0x83, 0x99, 0xa6, 0x99, 0x11, 0x54, 0xb9, 0xe5, 0x3d, 0xd5, 0x37, 0x37, 0x67, 0x47, 0x4b, 0xbf, - 0xb6, 0x94, 0xa6, 0x82, 0xbb, 0x09, 0xa3, 0xd7, 0x60, 0xf4, 0xbd, 0x20, 0x62, 0x8b, 0x49, 0xf0, - 0x08, 0xd2, 0x7d, 0x69, 0xf4, 0xcd, 0x3b, 0x0d, 0x56, 0x7e, 0x74, 0x50, 0x19, 0xab, 0x07, 0x2d, - 0xf9, 0x17, 0xab, 0x0a, 0xe8, 0x01, 0x9c, 0x33, 0x4e, 0x56, 0xd5, 0x5d, 0x18, 0xbc, 0xbb, 0x17, - 0x45, 0x73, 0xe7, 0x6a, 0x59, 0x94, 0x70, 0x76, 0x03, 0xf4, 0xb8, 0xf2, 0x03, 0x91, 0x4d, 0x57, - 0xf2, 0x21, 0x8c, 0xdd, 0x28, 0xeb, 0xce, 0xeb, 0x29, 0x04, 0xdc, 0x5d, 0xc7, 0xfe, 0x1a, 0x7f, - 0x7b, 0x10, 0x1a, 0x4a, 0x12, 0x75, 0xbc, 0xd3, 0x48, 0xd6, 0xb4, 0x6c, 0x28, 0x4f, 0x1f, 0xfa, - 0x7d, 0xeb, 0x37, 0x2c, 0xf6, 0xbe, 0xb5, 0x4e, 0x76, 0xdb, 0x1e, 0x95, 0x93, 0x1f, 0x7d, 0xc7, - 0xdf, 0x84, 0xd1, 0x58, 0xb4, 0xd6, 0x2b, 0xbf, 0x94, 0xd6, 0x29, 0xf6, 0xc6, 0xa7, 0x38, 0x14, - 0x59, 0x8a, 0x15, 0x19, 0xfb, 0x1f, 0xf3, 0x19, 0x90, 0x90, 0x53, 0x50, 0x64, 0x55, 0x4d, 0x45, - 0x56, 0xa5, 0xcf, 0x17, 0xe4, 0x28, 0xb4, 0xfe, 0x91, 0xd9, 0x6f, 0x26, 0x0c, 0x7e, 0xd4, 0x1f, - 0x56, 0xed, 0x1f, 0xb5, 0xe0, 0x6c, 0x96, 0x25, 0x12, 0xe5, 0x2a, 0xb9, 0x28, 0xaa, 0x1e, 0x9a, - 0xd5, 0x08, 0xde, 0x13, 0xe5, 0x58, 0x61, 0x0c, 0x9c, 0xba, 0xe1, 0x78, 0xf1, 0xdd, 0xee, 0xc0, - 0x44, 0x3d, 0x24, 0xda, 0x1d, 0xf0, 0x3a, 0xf7, 0x83, 0xe3, 0xfd, 0x79, 0xee, 0xd8, 0x3e, 0x70, - 0xf6, 0xcf, 0x15, 0xe0, 0x2c, 0x7f, 0x29, 0x5a, 0xd8, 0x0b, 0xdc, 0x56, 0x3d, 0x68, 0x89, 0xb4, - 0x1b, 0x6f, 0xc3, 0x78, 0x5b, 0xd3, 0x1f, 0xf4, 0x8a, 0x30, 0xa5, 0xeb, 0x19, 0x12, 0x39, 0x4e, - 0x2f, 0xc5, 0x06, 0x2d, 0xd4, 0x82, 0x71, 0xb2, 0xe7, 0x36, 0xd5, 0x73, 0x43, 0xe1, 0xd8, 0x77, - 0x83, 0x6a, 0x65, 0x59, 0xa3, 0x83, 0x0d, 0xaa, 0x8f, 0x20, 0x13, 0x9b, 0xfd, 0x63, 0x16, 0x3c, - 0x96, 0x13, 0x8f, 0x8a, 0x36, 0x77, 0x9f, 0xbd, 0xc9, 0x89, 0xa4, 0x4e, 0xaa, 0x39, 0xfe, 0x52, - 0x87, 0x05, 0x14, 0x7d, 0x1e, 0x80, 0xbf, 0xb4, 0x51, 0xb1, 0xa6, 0x5f, 0xe0, 0x1e, 0x23, 0xe6, - 0x88, 0x16, 0x2b, 0x42, 0xd6, 0xc7, 0x1a, 0x2d, 0xfb, 0xa7, 0x8b, 0x30, 0xc4, 0x5e, 0x76, 0xd0, - 0x0a, 0x8c, 0x6c, 0xf3, 0xe8, 0xcb, 0x83, 0x04, 0x7a, 0x4e, 0xe4, 0x43, 0x5e, 0x80, 0x65, 0x65, - 0xb4, 0x0a, 0x67, 0x78, 0xf4, 0x6a, 0xaf, 0x4a, 0x3c, 0x67, 0x5f, 0xaa, 0x19, 0x78, 0x22, 0x24, - 0x15, 0xf7, 0xa2, 0xd6, 0x8d, 0x82, 0xb3, 0xea, 0xa1, 0xd7, 0x61, 0x92, 0xf2, 0x65, 0x41, 0x27, - 0x96, 0x94, 0x78, 0xdc, 0x6a, 0xc5, 0x08, 0xae, 0x1b, 0x50, 0x9c, 0xc2, 0xa6, 0x02, 0x53, 0xbb, - 0x4b, 0xa1, 0x32, 0x94, 0x08, 0x4c, 0xa6, 0x12, 0xc5, 0xc4, 0x65, 0x26, 0x48, 0x1d, 0x66, 0x70, - 0xb5, 0xbe, 0x1d, 0x92, 0x68, 0x3b, 0xf0, 0x5a, 0x22, 0x8f, 0x76, 0x62, 0x82, 0x94, 0x82, 0xe3, - 0xae, 0x1a, 0x94, 0xca, 0xa6, 0xe3, 0x7a, 0x9d, 0x90, 0x24, 0x54, 0x86, 0x4d, 0x2a, 0x2b, 0x29, - 0x38, 0xee, 0xaa, 0x41, 0xd7, 0xd1, 0x39, 0x91, 0xd8, 0x5a, 0x7a, 0xe3, 0x2b, 0xbb, 0xb2, 0x11, - 0xe9, 0x97, 0xd4, 0x23, 0x1c, 0x8d, 0xb0, 0xbc, 0x51, 0xa9, 0xb1, 0x35, 0x3d, 0xa0, 0xf0, 0x48, - 0x92, 0x54, 0x1e, 0x26, 0xbd, 0xf2, 0xef, 0x59, 0x70, 0x26, 0xc3, 0x7e, 0x95, 0x1f, 0x55, 0x5b, - 0x6e, 0x14, 0xab, 0x64, 0x2f, 0xda, 0x51, 0xc5, 0xcb, 0xb1, 0xc2, 0xa0, 0xfb, 0x81, 0x1f, 0x86, - 0xe9, 0x03, 0x50, 0xd8, 0x87, 0x09, 0xe8, 0xf1, 0x0e, 0x40, 0x74, 0x19, 0x4a, 0x9d, 0x88, 0xc8, - 0x40, 0x52, 0xea, 0xfc, 0x66, 0x9a, 0x61, 0x06, 0xa1, 0xac, 0xe9, 0x96, 0x52, 0xca, 0x6a, 0xac, - 0x29, 0xd7, 0xb4, 0x72, 0x98, 0xfd, 0xd5, 0x22, 0x5c, 0xc8, 0xb5, 0x54, 0xa7, 0x5d, 0xda, 0x0d, - 0x7c, 0x37, 0x0e, 0xd4, 0xab, 0x21, 0x0f, 0x65, 0x42, 0xda, 0xdb, 0xab, 0xa2, 0x1c, 0x2b, 0x0c, - 0x74, 0x45, 0xa6, 0x58, 0x4f, 0xa7, 0xb3, 0x59, 0xac, 0x1a, 0x59, 0xd6, 0x07, 0x4d, 0x15, 0xf6, - 0x14, 0x94, 0xda, 0x41, 0xe0, 0xa5, 0x0f, 0x23, 0xda, 0xdd, 0x20, 0xf0, 0x30, 0x03, 0xa2, 0x4f, - 0x88, 0x71, 0x48, 0x3d, 0x93, 0x61, 0xa7, 0x15, 0x44, 0xda, 0x60, 0x3c, 0x03, 0x23, 0x3b, 0x64, - 0x3f, 0x74, 0xfd, 0xad, 0xf4, 0xf3, 0xe9, 0x2d, 0x5e, 0x8c, 0x25, 0xdc, 0xcc, 0xe6, 0x30, 0x72, - 0xd2, 0x39, 0xbe, 0x46, 0xfb, 0x5e, 0x6d, 0x3f, 0x58, 0x84, 0x29, 0xbc, 0x58, 0xfd, 0xd6, 0x44, - 0xdc, 0xed, 0x9e, 0x88, 0x93, 0xce, 0xf1, 0xd5, 0x7f, 0x36, 0x7e, 0xc9, 0x82, 0x29, 0x16, 0xf1, - 0x58, 0x04, 0xd0, 0x70, 0x03, 0xff, 0x14, 0x58, 0xb7, 0xa7, 0x60, 0x28, 0xa4, 0x8d, 0xa6, 0x13, - 0xf7, 0xb0, 0x9e, 0x60, 0x0e, 0x43, 0x4f, 0x40, 0x89, 0x75, 0x81, 0x4e, 0xde, 0x38, 0xcf, 0x79, - 0x50, 0x75, 0x62, 0x07, 0xb3, 0x52, 0xe6, 0x15, 0x8e, 0x49, 0xdb, 0x73, 0x79, 0xa7, 0x93, 0x27, - 0x89, 0x8f, 0x86, 0x57, 0x78, 0x66, 0xd7, 0x3e, 0x98, 0x57, 0x78, 0x36, 0xc9, 0xde, 0x62, 0xd1, - 0x7f, 0x2b, 0xc0, 0xa5, 0xcc, 0x7a, 0x03, 0x7b, 0x85, 0xf7, 0xae, 0x7d, 0x32, 0x56, 0x30, 0xd9, - 0xc6, 0x29, 0xc5, 0x53, 0x34, 0x4e, 0x29, 0x0d, 0xca, 0x39, 0x0e, 0x0d, 0xe0, 0xac, 0x9d, 0x39, - 0x64, 0x1f, 0x11, 0x67, 0xed, 0xcc, 0xbe, 0xe5, 0x88, 0x75, 0x7f, 0x5a, 0xc8, 0xf9, 0x16, 0x26, - 0xe0, 0x5d, 0xa5, 0xe7, 0x0c, 0x03, 0x46, 0x82, 0x13, 0x1e, 0xe7, 0x67, 0x0c, 0x2f, 0xc3, 0x0a, - 0x8a, 0x5c, 0xcd, 0xed, 0xb9, 0x90, 0x9f, 0xd6, 0x31, 0xb7, 0xa9, 0x79, 0xf3, 0x05, 0x49, 0x0d, - 0x41, 0x86, 0x0b, 0xf4, 0xaa, 0x26, 0x94, 0x17, 0x07, 0x17, 0xca, 0xc7, 0xb3, 0x05, 0x72, 0xb4, - 0x00, 0x53, 0xbb, 0xae, 0xcf, 0xd2, 0xf4, 0x9b, 0xac, 0xa8, 0x8a, 0x02, 0xb2, 0x6a, 0x82, 0x71, - 0x1a, 0x7f, 0xee, 0x35, 0x98, 0x78, 0x78, 0x75, 0xe4, 0x37, 0x8b, 0xf0, 0x78, 0x8f, 0x6d, 0xcf, - 0xcf, 0x7a, 0x63, 0x0e, 0xb4, 0xb3, 0xbe, 0x6b, 0x1e, 0xea, 0x70, 0x76, 0xb3, 0xe3, 0x79, 0xfb, - 0xcc, 0xfe, 0x93, 0xb4, 0x24, 0x86, 0xe0, 0x15, 0x9f, 0x90, 0x59, 0x26, 0x56, 0x32, 0x70, 0x70, - 0x66, 0x4d, 0xf4, 0x06, 0xa0, 0x40, 0xe4, 0x94, 0xbd, 0x41, 0x7c, 0xa1, 0x97, 0x67, 0x03, 0x5f, - 0x4c, 0x36, 0xe3, 0x9d, 0x2e, 0x0c, 0x9c, 0x51, 0x8b, 0x32, 0xfd, 0xf4, 0x56, 0xda, 0x57, 0xdd, - 0x4a, 0x31, 0xfd, 0x58, 0x07, 0x62, 0x13, 0x17, 0xdd, 0x80, 0x19, 0x67, 0xcf, 0x71, 0x79, 0x74, - 0x3c, 0x49, 0x80, 0x73, 0xfd, 0x4a, 0x09, 0xb6, 0x90, 0x46, 0xc0, 0xdd, 0x75, 0x52, 0x8e, 0xd1, - 0xc3, 0xf9, 0x8e, 0xd1, 0xbd, 0xcf, 0xc5, 0x7e, 0x3a, 0x5d, 0xfb, 0xdf, 0x5b, 0xf4, 0xfa, 0xca, - 0xc8, 0x0b, 0x4f, 0xc7, 0x41, 0xe9, 0x26, 0x35, 0x1f, 0xe5, 0x73, 0x9a, 0x85, 0x47, 0x02, 0xc4, - 0x26, 0x2e, 0x5f, 0x10, 0x51, 0xe2, 0x24, 0x63, 0xb0, 0xee, 0x22, 0xc6, 0x81, 0xc2, 0x40, 0x5f, - 0x80, 0x91, 0x96, 0xbb, 0xe7, 0x46, 0x41, 0x28, 0x36, 0xcb, 0x31, 0x5d, 0x0d, 0x92, 0x73, 0xb0, - 0xca, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0xc1, 0x02, 0x4c, 0xc8, 0x16, 0xdf, 0xec, 0x04, 0xb1, 0x73, - 0x0a, 0xd7, 0xf2, 0x0d, 0xe3, 0x5a, 0xfe, 0x44, 0xaf, 0x40, 0x0f, 0xac, 0x4b, 0xb9, 0xd7, 0xf1, - 0x9d, 0xd4, 0x75, 0xfc, 0x74, 0x7f, 0x52, 0xbd, 0xaf, 0xe1, 0x7f, 0x62, 0xc1, 0x8c, 0x81, 0x7f, - 0x0a, 0xb7, 0xc1, 0x8a, 0x79, 0x1b, 0x3c, 0xd9, 0xf7, 0x1b, 0x72, 0x6e, 0x81, 0xef, 0x2b, 0xa6, - 0xfa, 0xce, 0x4e, 0xff, 0xf7, 0xa0, 0xb4, 0xed, 0x84, 0xad, 0x5e, 0x01, 0x65, 0xbb, 0x2a, 0xcd, - 0xdf, 0x74, 0xc2, 0x16, 0x3f, 0xc3, 0x9f, 0x53, 0x99, 0x28, 0x9d, 0xb0, 0xd5, 0xd7, 0x27, 0x8c, - 0x35, 0x85, 0x5e, 0x85, 0xe1, 0xa8, 0x19, 0xb4, 0x95, 0xc5, 0xe6, 0x65, 0x9e, 0xa5, 0x92, 0x96, - 0x1c, 0x1d, 0x54, 0x90, 0xd9, 0x1c, 0x2d, 0xc6, 0x02, 0x1f, 0xbd, 0x0d, 0x13, 0xec, 0x97, 0xb2, - 0x5c, 0x28, 0xe6, 0xa7, 0x31, 0x68, 0xe8, 0x88, 0xdc, 0x00, 0xc6, 0x28, 0xc2, 0x26, 0xa9, 0xb9, - 0x2d, 0x28, 0xab, 0xcf, 0x7a, 0xa4, 0xbe, 0x3c, 0xff, 0xa6, 0x08, 0x67, 0x32, 0xd6, 0x1c, 0x8a, - 0x8c, 0x99, 0x78, 0x61, 0xc0, 0xa5, 0xfa, 0x01, 0xe7, 0x22, 0x62, 0xd2, 0x50, 0x4b, 0xac, 0xad, - 0x81, 0x1b, 0xbd, 0x1b, 0x91, 0x74, 0xa3, 0xb4, 0xa8, 0x7f, 0xa3, 0xb4, 0xb1, 0x53, 0x1b, 0x6a, - 0xda, 0x90, 0xea, 0xe9, 0x23, 0x9d, 0xd3, 0x3f, 0x2a, 0xc2, 0xd9, 0xac, 0xd8, 0x33, 0xe8, 0xbb, - 0x53, 0xe9, 0x6a, 0x5e, 0x1a, 0x34, 0x6a, 0x0d, 0xcf, 0x61, 0x23, 0x92, 0x2f, 0xcf, 0x9b, 0x09, - 0x6c, 0xfa, 0x0e, 0xb3, 0x68, 0x93, 0x39, 0x80, 0x86, 0x3c, 0xcd, 0x90, 0x3c, 0x3e, 0x3e, 0x3d, - 0x70, 0x07, 0x44, 0x7e, 0xa2, 0x28, 0xe5, 0x00, 0x2a, 0x8b, 0xfb, 0x3b, 0x80, 0xca, 0x96, 0xe7, - 0x5c, 0x18, 0xd3, 0xbe, 0xe6, 0x91, 0xce, 0xf8, 0x0e, 0xbd, 0xad, 0xb4, 0x7e, 0x3f, 0xd2, 0x59, - 0xff, 0x31, 0x0b, 0x52, 0xe6, 0x91, 0x4a, 0xdd, 0x65, 0xe5, 0xaa, 0xbb, 0x2e, 0x43, 0x29, 0x0c, - 0x3c, 0x92, 0xce, 0x20, 0x83, 0x03, 0x8f, 0x60, 0x06, 0xa1, 0x18, 0x71, 0xa2, 0xec, 0x18, 0xd7, - 0x05, 0x39, 0x21, 0xa2, 0x3d, 0x05, 0x43, 0x1e, 0xd9, 0x23, 0x5e, 0x3a, 0x3c, 0xfb, 0x6d, 0x5a, - 0x88, 0x39, 0xcc, 0xfe, 0xa5, 0x12, 0x5c, 0xec, 0xe9, 0x42, 0x4d, 0xc5, 0xa1, 0x2d, 0x27, 0x26, - 0xf7, 0x9d, 0xfd, 0x74, 0x1c, 0xe5, 0x1b, 0xbc, 0x18, 0x4b, 0x38, 0xb3, 0x18, 0xe7, 0x71, 0x13, - 0x53, 0xca, 0x41, 0x11, 0x2e, 0x51, 0x40, 0x1f, 0x41, 0xe2, 0xf9, 0xeb, 0x00, 0x51, 0xe4, 0x2d, - 0xfb, 0x94, 0xbb, 0x6b, 0x09, 0x53, 0xf4, 0x24, 0xbe, 0x66, 0xe3, 0xb6, 0x80, 0x60, 0x0d, 0x0b, - 0x55, 0x61, 0xba, 0x1d, 0x06, 0x31, 0xd7, 0xb5, 0x56, 0xb9, 0xa1, 0xd0, 0x90, 0xe9, 0xbd, 0x5a, - 0x4f, 0xc1, 0x71, 0x57, 0x0d, 0xf4, 0x32, 0x8c, 0x09, 0x8f, 0xd6, 0x7a, 0x10, 0x78, 0x42, 0x0d, - 0xa4, 0xcc, 0x4e, 0x1a, 0x09, 0x08, 0xeb, 0x78, 0x5a, 0x35, 0xa6, 0xc0, 0x1d, 0xc9, 0xac, 0xc6, - 0x95, 0xb8, 0x1a, 0x5e, 0x2a, 0x0e, 0xd5, 0xe8, 0x40, 0x71, 0xa8, 0x12, 0xc5, 0x58, 0x79, 0xe0, - 0x37, 0x2b, 0xe8, 0xab, 0x4a, 0xfa, 0xf9, 0x12, 0x9c, 0x11, 0x0b, 0xe7, 0x51, 0x2f, 0x97, 0x47, - 0x94, 0x1e, 0xff, 0x5b, 0x6b, 0xe6, 0xb4, 0xd7, 0xcc, 0x0f, 0x59, 0x60, 0xb2, 0x57, 0xe8, 0xff, - 0xc9, 0x0d, 0x44, 0xff, 0x72, 0x2e, 0xbb, 0xd6, 0x92, 0x17, 0xc8, 0x07, 0x0c, 0x49, 0x6f, 0xff, - 0x3b, 0x0b, 0x9e, 0xec, 0x4b, 0x11, 0x2d, 0x43, 0x99, 0xf1, 0x80, 0x9a, 0x74, 0xf6, 0xb4, 0x32, - 0x24, 0x94, 0x80, 0x1c, 0x96, 0x34, 0xa9, 0x89, 0x96, 0xbb, 0x22, 0xfe, 0x3f, 0x93, 0x11, 0xf1, - 0xff, 0x9c, 0x31, 0x3c, 0x0f, 0x19, 0xf2, 0xff, 0x6b, 0x45, 0x18, 0xe6, 0x2b, 0xfe, 0x14, 0xc4, - 0xb0, 0x15, 0xa1, 0xb7, 0xed, 0x11, 0x89, 0x8a, 0xf7, 0x65, 0xbe, 0xea, 0xc4, 0x0e, 0x67, 0x13, - 0xd4, 0x6d, 0x95, 0x68, 0x78, 0xd1, 0xbc, 0x71, 0x9f, 0xcd, 0xa5, 0x14, 0x93, 0xc0, 0x69, 0x68, - 0xb7, 0xdb, 0x97, 0x00, 0x22, 0x96, 0x09, 0x9f, 0xd2, 0x10, 0x31, 0xcd, 0x3e, 0xd9, 0xa3, 0xf5, - 0x86, 0x42, 0xe6, 0x7d, 0x48, 0x76, 0xba, 0x02, 0x60, 0x8d, 0xe2, 0xdc, 0x2b, 0x50, 0x56, 0xc8, - 0xfd, 0xb4, 0x38, 0xe3, 0x3a, 0x73, 0xf1, 0x39, 0x98, 0x4a, 0xb5, 0x75, 0x2c, 0x25, 0xd0, 0x2f, - 0x5b, 0x30, 0xc5, 0xbb, 0xbc, 0xec, 0xef, 0x89, 0x33, 0xf5, 0x7d, 0x38, 0xeb, 0x65, 0x9c, 0x6d, - 0x62, 0x46, 0x07, 0x3f, 0x0b, 0x95, 0xd2, 0x27, 0x0b, 0x8a, 0x33, 0xdb, 0x40, 0x57, 0xe9, 0xba, - 0xa5, 0x67, 0x97, 0xe3, 0x09, 0xef, 0xa3, 0x71, 0xbe, 0x66, 0x79, 0x19, 0x56, 0x50, 0xfb, 0x77, - 0x2c, 0x98, 0xe1, 0x3d, 0xbf, 0x45, 0xf6, 0xd5, 0x0e, 0xff, 0x30, 0xfb, 0x2e, 0x92, 0x70, 0x14, - 0x72, 0x92, 0x70, 0xe8, 0x9f, 0x56, 0xec, 0xf9, 0x69, 0x3f, 0x67, 0x81, 0x58, 0x81, 0xa7, 0x20, - 0xca, 0x7f, 0xbb, 0x29, 0xca, 0xcf, 0xe5, 0x2f, 0xea, 0x1c, 0x19, 0xfe, 0x4f, 0x2c, 0x98, 0xe6, - 0x08, 0xc9, 0x5b, 0xf2, 0x87, 0x3a, 0x0f, 0x83, 0x64, 0xd3, 0x53, 0xe9, 0xb3, 0xb3, 0x3f, 0xca, - 0x98, 0xac, 0x52, 0xcf, 0xc9, 0x6a, 0xc9, 0x0d, 0x74, 0x8c, 0x2c, 0x91, 0xc7, 0x0e, 0x66, 0x6d, - 0xff, 0xa1, 0x05, 0x88, 0x37, 0x63, 0xb0, 0x3f, 0x94, 0xa9, 0x60, 0xa5, 0xda, 0x75, 0x91, 0x1c, - 0x35, 0x0a, 0x82, 0x35, 0xac, 0x13, 0x19, 0x9e, 0x94, 0x41, 0x40, 0xb1, 0xbf, 0x41, 0xc0, 0x31, - 0x46, 0xf4, 0x6b, 0x25, 0x48, 0xbb, 0x03, 0xa0, 0x7b, 0x30, 0xde, 0x74, 0xda, 0xce, 0x86, 0xeb, - 0xb9, 0xb1, 0x4b, 0xa2, 0x5e, 0x96, 0x44, 0x4b, 0x1a, 0x9e, 0x78, 0xea, 0xd5, 0x4a, 0xb0, 0x41, - 0x07, 0xcd, 0x03, 0xb4, 0x43, 0x77, 0xcf, 0xf5, 0xc8, 0x16, 0xd3, 0x38, 0x30, 0x7f, 0x47, 0x6e, - 0x1e, 0x23, 0x4b, 0xb1, 0x86, 0x91, 0xe1, 0xba, 0x56, 0x7c, 0x74, 0xae, 0x6b, 0xa5, 0x63, 0xba, - 0xae, 0x0d, 0x0d, 0xe4, 0xba, 0x86, 0xe1, 0xbc, 0x64, 0x91, 0xe8, 0xff, 0x15, 0xd7, 0x23, 0x82, - 0x2f, 0xe6, 0x5e, 0x90, 0x73, 0x87, 0x07, 0x95, 0xf3, 0x38, 0x13, 0x03, 0xe7, 0xd4, 0x44, 0x9f, - 0x87, 0x59, 0xc7, 0xf3, 0x82, 0xfb, 0x6a, 0xd4, 0x96, 0xa3, 0xa6, 0xe3, 0x71, 0x8d, 0xfd, 0x08, - 0xa3, 0xfa, 0xc4, 0xe1, 0x41, 0x65, 0x76, 0x21, 0x07, 0x07, 0xe7, 0xd6, 0x4e, 0x79, 0xbe, 0x8d, - 0xf6, 0xf3, 0x7c, 0xb3, 0x77, 0xe0, 0x4c, 0x83, 0x84, 0x2e, 0xcb, 0x61, 0xd9, 0x4a, 0xb6, 0xe4, - 0x3a, 0x94, 0xc3, 0xd4, 0x21, 0x34, 0x50, 0x68, 0x24, 0x2d, 0x4e, 0xaf, 0x3c, 0x74, 0x12, 0x42, - 0xf6, 0x1f, 0x5b, 0x30, 0x22, 0x5c, 0x12, 0x4e, 0x81, 0xf7, 0x59, 0x30, 0x54, 0xd0, 0x95, 0xec, - 0x83, 0x9a, 0x75, 0x26, 0x57, 0xf9, 0x5c, 0x4b, 0x29, 0x9f, 0x9f, 0xec, 0x45, 0xa4, 0xb7, 0xda, - 0xf9, 0x6f, 0x14, 0x61, 0xd2, 0x74, 0xc7, 0x38, 0x85, 0x21, 0x58, 0x83, 0x91, 0x48, 0xf8, 0xfe, - 0x14, 0xf2, 0x6d, 0x9f, 0xd3, 0x93, 0x98, 0x18, 0x36, 0x09, 0x6f, 0x1f, 0x49, 0x24, 0xd3, 0xa9, - 0xa8, 0xf8, 0x08, 0x9d, 0x8a, 0xfa, 0x79, 0xc4, 0x94, 0x4e, 0xc2, 0x23, 0xc6, 0xfe, 0x3a, 0xbb, - 0x2c, 0xf4, 0xf2, 0x53, 0xe0, 0x23, 0x6e, 0x98, 0xd7, 0x8a, 0xdd, 0x63, 0x65, 0x89, 0x4e, 0xe5, - 0xf0, 0x13, 0xbf, 0x68, 0xc1, 0xc5, 0x8c, 0xaf, 0xd2, 0x98, 0x8b, 0xe7, 0x60, 0xd4, 0xe9, 0xb4, - 0x5c, 0xb5, 0x97, 0xb5, 0x87, 0xa8, 0x05, 0x51, 0x8e, 0x15, 0x06, 0x5a, 0x82, 0x19, 0xf2, 0xa0, - 0xed, 0xf2, 0x97, 0x40, 0xdd, 0xfa, 0xb0, 0xc8, 0x83, 0xc4, 0x2e, 0xa7, 0x81, 0xb8, 0x1b, 0x5f, - 0x39, 0x54, 0x17, 0x73, 0x1d, 0xaa, 0xff, 0xbe, 0x05, 0x63, 0xa2, 0xdb, 0xa7, 0x30, 0xda, 0xdf, - 0x61, 0x8e, 0xf6, 0xe3, 0x3d, 0x46, 0x3b, 0x67, 0x98, 0xff, 0x56, 0x41, 0xf5, 0xb7, 0x1e, 0x84, - 0xf1, 0x00, 0x4c, 0xcb, 0xab, 0x30, 0xda, 0x0e, 0x83, 0x38, 0x68, 0x06, 0x9e, 0xe0, 0x59, 0x9e, - 0x48, 0xfc, 0xfd, 0x79, 0xf9, 0x91, 0xf6, 0x1b, 0x2b, 0x6c, 0x36, 0x7a, 0x41, 0x18, 0x0b, 0x3e, - 0x21, 0x19, 0xbd, 0x20, 0x8c, 0x31, 0x83, 0xa0, 0x16, 0x40, 0xec, 0x84, 0x5b, 0x24, 0xa6, 0x65, - 0x22, 0x74, 0x48, 0xfe, 0xe1, 0xd1, 0x89, 0x5d, 0x6f, 0xde, 0xf5, 0xe3, 0x28, 0x0e, 0xe7, 0x6b, - 0x7e, 0x7c, 0x27, 0xe4, 0x22, 0x90, 0xe6, 0xc0, 0xaf, 0x68, 0x61, 0x8d, 0xae, 0xf4, 0xb2, 0x64, - 0x6d, 0x0c, 0x99, 0x4f, 0xda, 0x6b, 0xa2, 0x1c, 0x2b, 0x0c, 0xfb, 0x15, 0x76, 0x95, 0xb0, 0x01, - 0x3a, 0x9e, 0x6f, 0xfd, 0x37, 0x46, 0xd5, 0xd0, 0xb2, 0xf7, 0xac, 0xaa, 0xee, 0xc1, 0xdf, 0xfb, - 0xe4, 0xa6, 0x0d, 0xeb, 0x9e, 0x30, 0x89, 0x9b, 0x3f, 0xfa, 0xce, 0x2e, 0x4b, 0x87, 0xe7, 0xfb, - 0x5c, 0x01, 0xc7, 0xb0, 0x6d, 0x60, 0x81, 0xab, 0x59, 0x80, 0xdf, 0x5a, 0x5d, 0x2c, 0x72, 0x2d, - 0x70, 0xb5, 0x00, 0xe0, 0x04, 0x07, 0x5d, 0x13, 0x02, 0x74, 0xc9, 0x48, 0x5f, 0x27, 0x05, 0x68, - 0xf9, 0xf9, 0x9a, 0x04, 0xfd, 0x02, 0x8c, 0xa9, 0x34, 0x76, 0x75, 0x9e, 0x0d, 0x4c, 0x04, 0x52, - 0x59, 0x4e, 0x8a, 0xb1, 0x8e, 0x83, 0xd6, 0x61, 0x2a, 0xe2, 0xda, 0x13, 0x15, 0x2f, 0x8f, 0x6b, - 0xa1, 0x3e, 0x29, 0x2d, 0x24, 0x1a, 0x26, 0xf8, 0x88, 0x15, 0xf1, 0xa3, 0x43, 0xba, 0x4a, 0xa6, - 0x49, 0xa0, 0xd7, 0x61, 0xd2, 0xd3, 0x93, 0xc1, 0xd7, 0x85, 0x92, 0x4a, 0x19, 0x10, 0x1b, 0xa9, - 0xe2, 0xeb, 0x38, 0x85, 0x4d, 0x79, 0x1d, 0xbd, 0x44, 0xc4, 0x78, 0x74, 0xfc, 0x2d, 0x12, 0x89, - 0x24, 0x5c, 0x8c, 0xd7, 0xb9, 0x9d, 0x83, 0x83, 0x73, 0x6b, 0xa3, 0x57, 0x61, 0x5c, 0x7e, 0xbe, - 0xe6, 0x08, 0x9c, 0x98, 0xa9, 0x6b, 0x30, 0x6c, 0x60, 0xa2, 0xfb, 0x70, 0x4e, 0xfe, 0x5f, 0x0f, - 0x9d, 0xcd, 0x4d, 0xb7, 0x29, 0xfc, 0xb0, 0xb9, 0xaf, 0xce, 0x82, 0x74, 0xfe, 0x59, 0xce, 0x42, - 0x3a, 0x3a, 0xa8, 0x5c, 0x16, 0xa3, 0x96, 0x09, 0x67, 0x93, 0x98, 0x4d, 0x1f, 0xad, 0xc2, 0x99, - 0x6d, 0xe2, 0x78, 0xf1, 0xf6, 0xd2, 0x36, 0x69, 0xee, 0xc8, 0x4d, 0xc4, 0xdc, 0x8b, 0x35, 0xe3, - 0xee, 0x9b, 0xdd, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x07, 0x66, 0xdb, 0x9d, 0x0d, 0xcf, 0x8d, 0xb6, - 0xd7, 0x82, 0x98, 0x19, 0x65, 0xa8, 0x2c, 0x70, 0xc2, 0x0f, 0x59, 0xb9, 0x56, 0xd7, 0x73, 0xf0, - 0x70, 0x2e, 0x05, 0xf4, 0x3e, 0x9c, 0x4b, 0x2d, 0x06, 0xe1, 0x15, 0x39, 0x99, 0x1f, 0x31, 0xb7, - 0x91, 0x55, 0x41, 0x78, 0x39, 0x66, 0x81, 0x70, 0x76, 0x13, 0x1f, 0xcc, 0x54, 0xe7, 0x3d, 0x5a, - 0x59, 0x63, 0xca, 0xd0, 0x97, 0x61, 0x5c, 0x5f, 0x45, 0xe2, 0x82, 0xb9, 0x92, 0xcd, 0xb3, 0x68, - 0xab, 0x8d, 0xb3, 0x74, 0x6a, 0x45, 0xe9, 0x30, 0x6c, 0x50, 0xb4, 0x09, 0x64, 0x7f, 0x1f, 0xba, - 0x0d, 0xa3, 0x4d, 0xcf, 0x25, 0x7e, 0x5c, 0xab, 0xf7, 0x0a, 0xdb, 0xb1, 0x24, 0x70, 0xc4, 0x80, - 0x89, 0x10, 0xa3, 0xbc, 0x0c, 0x2b, 0x0a, 0xf6, 0xaf, 0x17, 0xa0, 0xd2, 0x27, 0x5e, 0x6d, 0x4a, - 0xa3, 0x6c, 0x0d, 0xa4, 0x51, 0x5e, 0x90, 0x39, 0xed, 0xd6, 0x52, 0x62, 0x76, 0x2a, 0x5f, 0x5d, - 0x22, 0x6c, 0xa7, 0xf1, 0x07, 0xb6, 0xf0, 0xd5, 0x95, 0xd2, 0xa5, 0xbe, 0xb6, 0xe7, 0xc6, 0x63, - 0xd4, 0xd0, 0xe0, 0x82, 0x48, 0xee, 0xc3, 0x82, 0xfd, 0xf5, 0x02, 0x9c, 0x53, 0x43, 0xf8, 0xe7, - 0x77, 0xe0, 0xee, 0x76, 0x0f, 0xdc, 0x09, 0x3c, 0xcb, 0xd8, 0x77, 0x60, 0x98, 0x87, 0x3d, 0x19, - 0x80, 0x01, 0x7a, 0xca, 0x8c, 0x91, 0xa5, 0xae, 0x69, 0x23, 0x4e, 0xd6, 0x5f, 0xb0, 0x60, 0x6a, - 0x7d, 0xa9, 0xde, 0x08, 0x9a, 0x3b, 0x24, 0x5e, 0xe0, 0x0c, 0x2b, 0x16, 0xfc, 0x8f, 0xf5, 0x90, - 0x7c, 0x4d, 0x16, 0xc7, 0x74, 0x19, 0x4a, 0xdb, 0x41, 0x14, 0xa7, 0xdf, 0x6c, 0x6f, 0x06, 0x51, - 0x8c, 0x19, 0xc4, 0xfe, 0x5d, 0x0b, 0x86, 0x58, 0x26, 0xd6, 0x7e, 0xe9, 0x81, 0x07, 0xf9, 0x2e, - 0xf4, 0x32, 0x0c, 0x93, 0xcd, 0x4d, 0xd2, 0x8c, 0xc5, 0xac, 0x4a, 0x87, 0xd2, 0xe1, 0x65, 0x56, - 0x4a, 0x2f, 0x7d, 0xd6, 0x18, 0xff, 0x8b, 0x05, 0x32, 0x7a, 0x0b, 0xca, 0xb1, 0xbb, 0x4b, 0x16, - 0x5a, 0x2d, 0xf1, 0xea, 0xf5, 0x10, 0xfe, 0xbb, 0xeb, 0x92, 0x00, 0x4e, 0x68, 0xd9, 0x5f, 0x2d, - 0x00, 0x24, 0xce, 0xfb, 0xfd, 0x3e, 0x71, 0xb1, 0xeb, 0x3d, 0xe4, 0x4a, 0xc6, 0x7b, 0x08, 0x4a, - 0x08, 0x66, 0x3c, 0x86, 0xa8, 0x61, 0x2a, 0x0e, 0x34, 0x4c, 0xa5, 0xe3, 0x0c, 0xd3, 0x12, 0xcc, - 0x24, 0xc1, 0x07, 0xcc, 0x48, 0x2c, 0x4c, 0x48, 0x59, 0x4f, 0x03, 0x71, 0x37, 0xbe, 0x4d, 0xe0, - 0xb2, 0x8c, 0x89, 0x29, 0xef, 0x1a, 0x66, 0x54, 0x79, 0x8c, 0x4c, 0xd1, 0xc9, 0x83, 0x4f, 0x21, - 0xf7, 0xc1, 0xe7, 0x27, 0x2d, 0x38, 0x9b, 0x6e, 0x87, 0x79, 0xaf, 0xfd, 0x80, 0x05, 0xe7, 0xd8, - 0xb3, 0x17, 0x6b, 0xb5, 0xfb, 0x91, 0xed, 0xa5, 0xec, 0xa0, 0x0c, 0xbd, 0x7b, 0x9c, 0x78, 0x2e, - 0xaf, 0x66, 0x91, 0xc6, 0xd9, 0x2d, 0xda, 0x7f, 0xd9, 0x82, 0x0b, 0xb9, 0x09, 0x80, 0x98, 0x04, - 0xd9, 0x76, 0xb9, 0x4e, 0x29, 0x2d, 0x41, 0xd6, 0x6b, 0x5c, 0xab, 0xa4, 0x30, 0x54, 0x72, 0xc2, - 0x42, 0x6e, 0x72, 0xc2, 0xbe, 0xb9, 0x06, 0xed, 0xef, 0xb7, 0x40, 0x38, 0x2d, 0x0d, 0x70, 0xd0, - 0xbc, 0x2d, 0x73, 0xbb, 0x1a, 0x21, 0xc9, 0x2f, 0xe7, 0x7b, 0x71, 0x89, 0x40, 0xe4, 0xea, 0x62, - 0x37, 0xc2, 0x8f, 0x1b, 0xb4, 0xec, 0x16, 0x08, 0x68, 0x95, 0x30, 0xbd, 0x55, 0xff, 0xde, 0x5c, - 0x07, 0x68, 0x31, 0x5c, 0x2d, 0xc3, 0xa3, 0xba, 0x46, 0xaa, 0x0a, 0x82, 0x35, 0x2c, 0xfb, 0x87, - 0x0b, 0x30, 0x26, 0x43, 0x60, 0x77, 0xfc, 0x41, 0xa4, 0xcb, 0x63, 0x65, 0xc2, 0x61, 0x29, 0x51, - 0x29, 0xe1, 0x7a, 0x22, 0x94, 0x27, 0x29, 0x51, 0x25, 0x00, 0x27, 0x38, 0xe8, 0x19, 0x18, 0x89, - 0x3a, 0x1b, 0x0c, 0x3d, 0xe5, 0x8a, 0xd3, 0xe0, 0xc5, 0x58, 0xc2, 0xd1, 0xe7, 0x61, 0x9a, 0xd7, - 0x0b, 0x83, 0xb6, 0xb3, 0xc5, 0x95, 0x98, 0x43, 0xca, 0x37, 0x76, 0x7a, 0x35, 0x05, 0x3b, 0x3a, - 0xa8, 0x9c, 0x4d, 0x97, 0x31, 0xf5, 0x77, 0x17, 0x15, 0xfb, 0xcb, 0x80, 0xba, 0xa3, 0x7a, 0xa3, - 0x37, 0xb8, 0x41, 0x94, 0x1b, 0x92, 0x56, 0x2f, 0xbd, 0xb6, 0xee, 0xca, 0x29, 0xcd, 0xe1, 0x79, - 0x2d, 0xac, 0xea, 0xdb, 0x7f, 0xa5, 0x08, 0xd3, 0x69, 0xc7, 0x3e, 0x74, 0x13, 0x86, 0xf9, 0x85, - 0x27, 0xc8, 0xf7, 0x78, 0x36, 0xd5, 0xdc, 0x01, 0xd9, 0xd6, 0x17, 0x77, 0xa6, 0xa8, 0x8f, 0xde, - 0x81, 0xb1, 0x56, 0x70, 0xdf, 0xbf, 0xef, 0x84, 0xad, 0x85, 0x7a, 0x4d, 0xac, 0xcb, 0x4c, 0xbe, - 0xb9, 0x9a, 0xa0, 0xe9, 0x2e, 0x86, 0xec, 0x89, 0x20, 0x01, 0x61, 0x9d, 0x1c, 0x5a, 0x67, 0x91, - 0x0a, 0x37, 0xdd, 0xad, 0x55, 0xa7, 0xdd, 0xcb, 0x3a, 0x76, 0x49, 0x22, 0x69, 0x94, 0x27, 0x44, - 0x38, 0x43, 0x0e, 0xc0, 0x09, 0x21, 0xf4, 0xdd, 0x70, 0x26, 0xca, 0x51, 0xb5, 0xe5, 0x25, 0x79, - 0xe8, 0xa5, 0x7d, 0x5a, 0x7c, 0x8c, 0x4a, 0x34, 0x59, 0x4a, 0xb9, 0xac, 0x66, 0xec, 0xaf, 0x9c, - 0x01, 0x63, 0x37, 0x1a, 0x99, 0x7e, 0xac, 0x13, 0xca, 0xf4, 0x83, 0x61, 0x94, 0xec, 0xb6, 0xe3, - 0xfd, 0xaa, 0x1b, 0xf6, 0xca, 0x44, 0xb7, 0x2c, 0x70, 0xba, 0x69, 0x4a, 0x08, 0x56, 0x74, 0xb2, - 0xd3, 0x31, 0x15, 0x3f, 0xc4, 0x74, 0x4c, 0xa5, 0x53, 0x4c, 0xc7, 0xb4, 0x06, 0x23, 0x5b, 0x6e, - 0x8c, 0x49, 0x3b, 0x10, 0xac, 0x66, 0xe6, 0x3a, 0xbc, 0xc1, 0x51, 0xba, 0x53, 0x80, 0x08, 0x00, - 0x96, 0x44, 0xd0, 0x1b, 0x6a, 0x07, 0x0e, 0xe7, 0x4b, 0x6a, 0xdd, 0xef, 0x7b, 0x99, 0x7b, 0x50, - 0xa4, 0x5f, 0x1a, 0x79, 0xd8, 0xf4, 0x4b, 0x2b, 0x32, 0x69, 0xd2, 0x68, 0xbe, 0x29, 0x3b, 0xcb, - 0x89, 0xd4, 0x27, 0x55, 0x92, 0x91, 0x5e, 0xaa, 0x7c, 0x72, 0xe9, 0xa5, 0xbe, 0xdf, 0x82, 0x73, - 0xed, 0xac, 0x4c, 0x6b, 0x22, 0xd5, 0xd1, 0xcb, 0x03, 0xa7, 0x92, 0x33, 0x1a, 0x64, 0x22, 0x7b, - 0x26, 0x1a, 0xce, 0x6e, 0x8e, 0x0e, 0x74, 0xb8, 0xd1, 0x12, 0xf9, 0x91, 0x9e, 0xca, 0xc9, 0x53, - 0xd5, 0x23, 0x3b, 0xd5, 0x7a, 0x46, 0x4e, 0xa4, 0x8f, 0xe7, 0xe5, 0x44, 0x1a, 0x38, 0x13, 0xd2, - 0x1b, 0x2a, 0x43, 0xd5, 0x44, 0xfe, 0x52, 0xe2, 0xf9, 0xa7, 0xfa, 0xe6, 0xa5, 0x7a, 0x43, 0xe5, - 0xa5, 0xea, 0x11, 0xb1, 0x8d, 0x67, 0x9d, 0xea, 0x9b, 0x8d, 0x4a, 0xcb, 0x28, 0x35, 0x75, 0x32, - 0x19, 0xa5, 0x8c, 0xab, 0x86, 0x27, 0x35, 0x7a, 0xb6, 0xcf, 0x55, 0x63, 0xd0, 0xed, 0x7d, 0xd9, - 0xf0, 0xec, 0x59, 0x33, 0x0f, 0x95, 0x3d, 0xeb, 0x9e, 0x9e, 0x8d, 0x0a, 0xf5, 0x49, 0xb7, 0x44, - 0x91, 0x06, 0xcc, 0x41, 0x75, 0x4f, 0xbf, 0x00, 0xcf, 0xe4, 0xd3, 0x55, 0xf7, 0x5c, 0x37, 0xdd, - 0xcc, 0x2b, 0xb0, 0x2b, 0xb7, 0xd5, 0xd9, 0xd3, 0xc9, 0x6d, 0x75, 0xee, 0xc4, 0x73, 0x5b, 0x9d, - 0x3f, 0x85, 0xdc, 0x56, 0x8f, 0x7d, 0xa8, 0xb9, 0xad, 0x66, 0x1f, 0x41, 0x6e, 0xab, 0xb5, 0x24, - 0xb7, 0xd5, 0x85, 0xfc, 0x29, 0xc9, 0xb0, 0xaf, 0xcd, 0xc9, 0x68, 0x75, 0x0f, 0xca, 0x6d, 0x19, - 0x79, 0x42, 0x84, 0x94, 0xcb, 0xce, 0xde, 0x9b, 0x15, 0x9e, 0x82, 0x4f, 0x89, 0x02, 0xe1, 0x84, - 0x14, 0xa5, 0x9b, 0x64, 0xb8, 0x7a, 0xbc, 0x87, 0x52, 0x36, 0x4b, 0xdd, 0x95, 0x9f, 0xd7, 0xca, - 0xfe, 0x8b, 0x05, 0xb8, 0xd4, 0x7b, 0x5d, 0x27, 0xba, 0xb2, 0x7a, 0xf2, 0xb6, 0x93, 0xd2, 0x95, - 0x71, 0x21, 0x27, 0xc1, 0x1a, 0x38, 0x3c, 0xcf, 0x0d, 0x98, 0x51, 0x86, 0xb5, 0x9e, 0xdb, 0xdc, - 0xd7, 0xb2, 0xfa, 0x2a, 0x07, 0xc2, 0x46, 0x1a, 0x01, 0x77, 0xd7, 0x41, 0x0b, 0x30, 0x65, 0x14, - 0xd6, 0xaa, 0x42, 0x98, 0x51, 0xca, 0xb9, 0x86, 0x09, 0xc6, 0x69, 0x7c, 0xfb, 0x67, 0x2d, 0x78, - 0x2c, 0x27, 0xed, 0xc3, 0xc0, 0xd1, 0x67, 0x36, 0x61, 0xaa, 0x6d, 0x56, 0xed, 0x13, 0xa4, 0xca, - 0x48, 0x2e, 0xa1, 0xfa, 0x9a, 0x02, 0xe0, 0x34, 0xd1, 0xc5, 0xab, 0xbf, 0xf5, 0xfb, 0x97, 0x3e, - 0xf6, 0xdb, 0xbf, 0x7f, 0xe9, 0x63, 0xbf, 0xf3, 0xfb, 0x97, 0x3e, 0xf6, 0xff, 0x1e, 0x5e, 0xb2, - 0x7e, 0xeb, 0xf0, 0x92, 0xf5, 0xdb, 0x87, 0x97, 0xac, 0xdf, 0x39, 0xbc, 0x64, 0xfd, 0xde, 0xe1, - 0x25, 0xeb, 0xab, 0x7f, 0x70, 0xe9, 0x63, 0x6f, 0x17, 0xf6, 0x5e, 0xf8, 0xbf, 0x01, 0x00, 0x00, - 0xff, 0xff, 0x80, 0x00, 0x4e, 0x4d, 0xaf, 0xe6, 0x00, 0x00, + // 12771 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x90, 0x24, 0x57, + 0x56, 0x18, 0xbc, 0x59, 0x55, 0xfd, 0xa8, 0xd3, 0xef, 0x3b, 0x0f, 0xf5, 0xb4, 0x34, 0x53, 0xa3, + 0xd4, 0xee, 0x68, 0xb4, 0x92, 0x7a, 0x56, 0x23, 0x69, 0x57, 0xac, 0xb4, 0x82, 0xee, 0xae, 0xee, + 0x99, 0xd2, 0x4c, 0xf7, 0x94, 0x6e, 0xf5, 0x8c, 0x76, 0x85, 0x76, 0xd9, 0xec, 0xaa, 0xdb, 0xdd, + 0xa9, 0xce, 0xce, 0x2c, 0x65, 0x66, 0xf5, 0x4c, 0xeb, 0x83, 0x88, 0xcf, 0x8b, 0xc1, 0xc6, 0x60, + 0xc7, 0x86, 0x21, 0xfc, 0x00, 0x02, 0x47, 0x60, 0x1c, 0x80, 0xb1, 0x1d, 0xc6, 0x60, 0xc0, 0x2c, + 0xd8, 0x18, 0xfc, 0x03, 0x47, 0x38, 0xd6, 0xd8, 0x11, 0x8e, 0x25, 0x82, 0x70, 0x1b, 0x1a, 0x3f, + 0x82, 0x1f, 0x7e, 0x84, 0xf1, 0x0f, 0xd3, 0x26, 0x8c, 0xe3, 0x3e, 0xf3, 0xde, 0xac, 0xcc, 0xaa, + 0xea, 0x51, 0x4f, 0x4b, 0x10, 0xfb, 0xaf, 0xea, 0x9e, 0x73, 0xcf, 0xbd, 0x79, 0x9f, 0xe7, 0x9c, + 0x7b, 0x1e, 0xf0, 0xea, 0xce, 0x2b, 0xd1, 0xbc, 0x1b, 0x5c, 0xdb, 0xe9, 0x6c, 0x90, 0xd0, 0x27, + 0x31, 0x89, 0xae, 0xed, 0x11, 0xbf, 0x15, 0x84, 0xd7, 0x04, 0xc0, 0x69, 0xbb, 0xd7, 0x9a, 0x41, + 0x48, 0xae, 0xed, 0xbd, 0x70, 0x6d, 0x8b, 0xf8, 0x24, 0x74, 0x62, 0xd2, 0x9a, 0x6f, 0x87, 0x41, + 0x1c, 0x20, 0xc4, 0x71, 0xe6, 0x9d, 0xb6, 0x3b, 0x4f, 0x71, 0xe6, 0xf7, 0x5e, 0x98, 0x7b, 0x7e, + 0xcb, 0x8d, 0xb7, 0x3b, 0x1b, 0xf3, 0xcd, 0x60, 0xf7, 0xda, 0x56, 0xb0, 0x15, 0x5c, 0x63, 0xa8, + 0x1b, 0x9d, 0x4d, 0xf6, 0x8f, 0xfd, 0x61, 0xbf, 0x38, 0x89, 0xb9, 0x97, 0x92, 0x66, 0x76, 0x9d, + 0xe6, 0xb6, 0xeb, 0x93, 0x70, 0xff, 0x5a, 0x7b, 0x67, 0x8b, 0xb5, 0x1b, 0x92, 0x28, 0xe8, 0x84, + 0x4d, 0x92, 0x6e, 0xb8, 0x67, 0xad, 0xe8, 0xda, 0x2e, 0x89, 0x9d, 0x8c, 0xee, 0xce, 0x5d, 0xcb, + 0xab, 0x15, 0x76, 0xfc, 0xd8, 0xdd, 0xed, 0x6e, 0xe6, 0xd3, 0xfd, 0x2a, 0x44, 0xcd, 0x6d, 0xb2, + 0xeb, 0x74, 0xd5, 0x7b, 0x31, 0xaf, 0x5e, 0x27, 0x76, 0xbd, 0x6b, 0xae, 0x1f, 0x47, 0x71, 0x98, + 0xae, 0x64, 0x7f, 0xc3, 0x82, 0xcb, 0x0b, 0x6f, 0x35, 0x96, 0x3d, 0x27, 0x8a, 0xdd, 0xe6, 0xa2, + 0x17, 0x34, 0x77, 0x1a, 0x71, 0x10, 0x92, 0x7b, 0x81, 0xd7, 0xd9, 0x25, 0x0d, 0x36, 0x10, 0xe8, + 0x39, 0x18, 0xdd, 0x63, 0xff, 0x6b, 0xd5, 0x59, 0xeb, 0xb2, 0x75, 0xb5, 0xbc, 0x38, 0xfd, 0x9b, + 0x07, 0x95, 0x8f, 0x1d, 0x1e, 0x54, 0x46, 0xef, 0x89, 0x72, 0xac, 0x30, 0xd0, 0x15, 0x18, 0xde, + 0x8c, 0xd6, 0xf7, 0xdb, 0x64, 0xb6, 0xc0, 0x70, 0x27, 0x05, 0xee, 0xf0, 0x4a, 0x83, 0x96, 0x62, + 0x01, 0x45, 0xd7, 0xa0, 0xdc, 0x76, 0xc2, 0xd8, 0x8d, 0xdd, 0xc0, 0x9f, 0x2d, 0x5e, 0xb6, 0xae, + 0x0e, 0x2d, 0xce, 0x08, 0xd4, 0x72, 0x5d, 0x02, 0x70, 0x82, 0x43, 0xbb, 0x11, 0x12, 0xa7, 0x75, + 0xc7, 0xf7, 0xf6, 0x67, 0x4b, 0x97, 0xad, 0xab, 0xa3, 0x49, 0x37, 0xb0, 0x28, 0xc7, 0x0a, 0xc3, + 0xfe, 0xe1, 0x02, 0x8c, 0x2e, 0x6c, 0x6e, 0xba, 0xbe, 0x1b, 0xef, 0xa3, 0x7b, 0x30, 0xee, 0x07, + 0x2d, 0x22, 0xff, 0xb3, 0xaf, 0x18, 0xbb, 0x7e, 0x79, 0xbe, 0x7b, 0x29, 0xcd, 0xaf, 0x69, 0x78, + 0x8b, 0xd3, 0x87, 0x07, 0x95, 0x71, 0xbd, 0x04, 0x1b, 0x74, 0x10, 0x86, 0xb1, 0x76, 0xd0, 0x52, + 0x64, 0x0b, 0x8c, 0x6c, 0x25, 0x8b, 0x6c, 0x3d, 0x41, 0x5b, 0x9c, 0x3a, 0x3c, 0xa8, 0x8c, 0x69, + 0x05, 0x58, 0x27, 0x82, 0x36, 0x60, 0x8a, 0xfe, 0xf5, 0x63, 0x57, 0xd1, 0x2d, 0x32, 0xba, 0x4f, + 0xe5, 0xd1, 0xd5, 0x50, 0x17, 0xcf, 0x1c, 0x1e, 0x54, 0xa6, 0x52, 0x85, 0x38, 0x4d, 0xd0, 0x7e, + 0x1f, 0x26, 0x17, 0xe2, 0xd8, 0x69, 0x6e, 0x93, 0x16, 0x9f, 0x41, 0xf4, 0x12, 0x94, 0x7c, 0x67, + 0x97, 0x88, 0xf9, 0xbd, 0x2c, 0x06, 0xb6, 0xb4, 0xe6, 0xec, 0x92, 0xa3, 0x83, 0xca, 0xf4, 0x5d, + 0xdf, 0x7d, 0xaf, 0x23, 0x56, 0x05, 0x2d, 0xc3, 0x0c, 0x1b, 0x5d, 0x07, 0x68, 0x91, 0x3d, 0xb7, + 0x49, 0xea, 0x4e, 0xbc, 0x2d, 0xe6, 0x1b, 0x89, 0xba, 0x50, 0x55, 0x10, 0xac, 0x61, 0xd9, 0x0f, + 0xa0, 0xbc, 0xb0, 0x17, 0xb8, 0xad, 0x7a, 0xd0, 0x8a, 0xd0, 0x0e, 0x4c, 0xb5, 0x43, 0xb2, 0x49, + 0x42, 0x55, 0x34, 0x6b, 0x5d, 0x2e, 0x5e, 0x1d, 0xbb, 0x7e, 0x35, 0xf3, 0x63, 0x4d, 0xd4, 0x65, + 0x3f, 0x0e, 0xf7, 0x17, 0x1f, 0x13, 0xed, 0x4d, 0xa5, 0xa0, 0x38, 0x4d, 0xd9, 0xfe, 0x17, 0x05, + 0x38, 0xb7, 0xf0, 0x7e, 0x27, 0x24, 0x55, 0x37, 0xda, 0x49, 0xaf, 0xf0, 0x96, 0x1b, 0xed, 0xac, + 0x25, 0x23, 0xa0, 0x96, 0x56, 0x55, 0x94, 0x63, 0x85, 0x81, 0x9e, 0x87, 0x11, 0xfa, 0xfb, 0x2e, + 0xae, 0x89, 0x4f, 0x3e, 0x23, 0x90, 0xc7, 0xaa, 0x4e, 0xec, 0x54, 0x39, 0x08, 0x4b, 0x1c, 0xb4, + 0x0a, 0x63, 0x4d, 0xb6, 0x21, 0xb7, 0x56, 0x83, 0x16, 0x61, 0x93, 0x59, 0x5e, 0x7c, 0x96, 0xa2, + 0x2f, 0x25, 0xc5, 0x47, 0x07, 0x95, 0x59, 0xde, 0x37, 0x41, 0x42, 0x83, 0x61, 0xbd, 0x3e, 0xb2, + 0xd5, 0xfe, 0x2a, 0x31, 0x4a, 0x90, 0xb1, 0xb7, 0xae, 0x6a, 0x5b, 0x65, 0x88, 0x6d, 0x95, 0xf1, + 0xec, 0x6d, 0x82, 0x5e, 0x80, 0xd2, 0x8e, 0xeb, 0xb7, 0x66, 0x87, 0x19, 0xad, 0x8b, 0x74, 0xce, + 0x6f, 0xb9, 0x7e, 0xeb, 0xe8, 0xa0, 0x32, 0x63, 0x74, 0x87, 0x16, 0x62, 0x86, 0x6a, 0xff, 0xa1, + 0x05, 0x15, 0x06, 0x5b, 0x71, 0x3d, 0x52, 0x27, 0x61, 0xe4, 0x46, 0x31, 0xf1, 0x63, 0x63, 0x40, + 0xaf, 0x03, 0x44, 0xa4, 0x19, 0x92, 0x58, 0x1b, 0x52, 0xb5, 0x30, 0x1a, 0x0a, 0x82, 0x35, 0x2c, + 0x7a, 0x20, 0x44, 0xdb, 0x4e, 0xc8, 0xd6, 0x97, 0x18, 0x58, 0x75, 0x20, 0x34, 0x24, 0x00, 0x27, + 0x38, 0xc6, 0x81, 0x50, 0xec, 0x77, 0x20, 0xa0, 0xcf, 0xc1, 0x54, 0xd2, 0x58, 0xd4, 0x76, 0x9a, + 0x72, 0x00, 0xd9, 0x96, 0x69, 0x98, 0x20, 0x9c, 0xc6, 0xb5, 0xff, 0xae, 0x25, 0x16, 0x0f, 0xfd, + 0xea, 0x8f, 0xf8, 0xb7, 0xda, 0xbf, 0x64, 0xc1, 0xc8, 0xa2, 0xeb, 0xb7, 0x5c, 0x7f, 0x0b, 0x7d, + 0x19, 0x46, 0xe9, 0xdd, 0xd4, 0x72, 0x62, 0x47, 0x9c, 0x7b, 0x9f, 0xd2, 0xf6, 0x96, 0xba, 0x2a, + 0xe6, 0xdb, 0x3b, 0x5b, 0xb4, 0x20, 0x9a, 0xa7, 0xd8, 0x74, 0xb7, 0xdd, 0xd9, 0x78, 0x97, 0x34, + 0xe3, 0x55, 0x12, 0x3b, 0xc9, 0xe7, 0x24, 0x65, 0x58, 0x51, 0x45, 0xb7, 0x60, 0x38, 0x76, 0xc2, + 0x2d, 0x12, 0x8b, 0x03, 0x30, 0xf3, 0xa0, 0xe2, 0x35, 0x31, 0xdd, 0x91, 0xc4, 0x6f, 0x92, 0xe4, + 0x5a, 0x58, 0x67, 0x55, 0xb1, 0x20, 0x61, 0xff, 0xa5, 0x61, 0xb8, 0xb0, 0xd4, 0xa8, 0xe5, 0xac, + 0xab, 0x2b, 0x30, 0xdc, 0x0a, 0xdd, 0x3d, 0x12, 0x8a, 0x71, 0x56, 0x54, 0xaa, 0xac, 0x14, 0x0b, + 0x28, 0x7a, 0x05, 0xc6, 0xf9, 0x85, 0x74, 0xd3, 0xf1, 0x5b, 0x9e, 0x1c, 0xe2, 0xb3, 0x02, 0x7b, + 0xfc, 0x9e, 0x06, 0xc3, 0x06, 0xe6, 0x31, 0x17, 0xd5, 0x95, 0xd4, 0x66, 0xcc, 0xbb, 0xec, 0xbe, + 0xcf, 0x82, 0x69, 0xde, 0xcc, 0x42, 0x1c, 0x87, 0xee, 0x46, 0x27, 0x26, 0xd1, 0xec, 0x10, 0x3b, + 0xe9, 0x96, 0xb2, 0x46, 0x2b, 0x77, 0x04, 0xe6, 0xef, 0xa5, 0xa8, 0xf0, 0x43, 0x70, 0x56, 0xb4, + 0x3b, 0x9d, 0x06, 0xe3, 0xae, 0x66, 0xd1, 0x77, 0x5b, 0x30, 0xd7, 0x0c, 0xfc, 0x38, 0x0c, 0x3c, + 0x8f, 0x84, 0xf5, 0xce, 0x86, 0xe7, 0x46, 0xdb, 0x7c, 0x9d, 0x62, 0xb2, 0xc9, 0x4e, 0x82, 0x9c, + 0x39, 0x54, 0x48, 0x62, 0x0e, 0x2f, 0x1d, 0x1e, 0x54, 0xe6, 0x96, 0x72, 0x49, 0xe1, 0x1e, 0xcd, + 0xa0, 0x1d, 0x40, 0xf4, 0x2a, 0x6d, 0xc4, 0xce, 0x16, 0x49, 0x1a, 0x1f, 0x19, 0xbc, 0xf1, 0xf3, + 0x87, 0x07, 0x15, 0xb4, 0xd6, 0x45, 0x02, 0x67, 0x90, 0x45, 0xef, 0xc1, 0x59, 0x5a, 0xda, 0xf5, + 0xad, 0xa3, 0x83, 0x37, 0x37, 0x7b, 0x78, 0x50, 0x39, 0xbb, 0x96, 0x41, 0x04, 0x67, 0x92, 0x9e, + 0x5b, 0x82, 0x73, 0x99, 0x53, 0x85, 0xa6, 0xa1, 0xb8, 0x43, 0x38, 0x0b, 0x52, 0xc6, 0xf4, 0x27, + 0x3a, 0x0b, 0x43, 0x7b, 0x8e, 0xd7, 0x11, 0xab, 0x14, 0xf3, 0x3f, 0x9f, 0x2d, 0xbc, 0x62, 0xd9, + 0x4d, 0x18, 0x5f, 0x72, 0xda, 0xce, 0x86, 0xeb, 0xb9, 0xb1, 0x4b, 0x22, 0xf4, 0x34, 0x14, 0x9d, + 0x56, 0x8b, 0x5d, 0x91, 0xe5, 0xc5, 0x73, 0x87, 0x07, 0x95, 0xe2, 0x42, 0x8b, 0x9e, 0xd5, 0xa0, + 0xb0, 0xf6, 0x31, 0xc5, 0x40, 0x9f, 0x84, 0x52, 0x2b, 0x0c, 0xda, 0xb3, 0x05, 0x86, 0x49, 0x87, + 0xaa, 0x54, 0x0d, 0x83, 0x76, 0x0a, 0x95, 0xe1, 0xd8, 0xbf, 0x56, 0x80, 0x27, 0x96, 0x48, 0x7b, + 0x7b, 0xa5, 0x91, 0xb3, 0xe9, 0xae, 0xc2, 0xe8, 0x6e, 0xe0, 0xbb, 0x71, 0x10, 0x46, 0xa2, 0x69, + 0x76, 0x9b, 0xac, 0x8a, 0x32, 0xac, 0xa0, 0xe8, 0x32, 0x94, 0xda, 0x09, 0x27, 0x30, 0x2e, 0xb9, + 0x08, 0xc6, 0x03, 0x30, 0x08, 0xc5, 0xe8, 0x44, 0x24, 0x14, 0xb7, 0xa0, 0xc2, 0xb8, 0x1b, 0x91, + 0x10, 0x33, 0x48, 0x72, 0x9c, 0xd2, 0x83, 0x56, 0x6c, 0xab, 0xd4, 0x71, 0x4a, 0x21, 0x58, 0xc3, + 0x42, 0x75, 0x28, 0x47, 0x6a, 0x52, 0x87, 0x06, 0x9f, 0xd4, 0x09, 0x76, 0xde, 0xaa, 0x99, 0x4c, + 0x88, 0x18, 0xc7, 0xc0, 0x70, 0xdf, 0xf3, 0xf6, 0x6b, 0x05, 0x40, 0x7c, 0x08, 0xff, 0x94, 0x0d, + 0xdc, 0xdd, 0xee, 0x81, 0xcb, 0xe4, 0xbc, 0x6e, 0x07, 0x4d, 0xc7, 0x4b, 0x1f, 0xe1, 0x27, 0x35, + 0x7a, 0xff, 0xcb, 0x82, 0x27, 0x96, 0x5c, 0xbf, 0x45, 0xc2, 0x9c, 0x05, 0xf8, 0x68, 0x04, 0x90, + 0xe3, 0x9d, 0xf4, 0xc6, 0x12, 0x2b, 0x9d, 0xc0, 0x12, 0xb3, 0xff, 0xbb, 0x05, 0x88, 0x7f, 0xf6, + 0x47, 0xee, 0x63, 0xef, 0x76, 0x7f, 0xec, 0x09, 0x2c, 0x0b, 0xfb, 0x36, 0x4c, 0x2e, 0x79, 0x2e, + 0xf1, 0xe3, 0x5a, 0x7d, 0x29, 0xf0, 0x37, 0xdd, 0x2d, 0xf4, 0x59, 0x98, 0xa4, 0x32, 0x6d, 0xd0, + 0x89, 0x1b, 0xa4, 0x19, 0xf8, 0x8c, 0xfd, 0xa7, 0x92, 0x20, 0x3a, 0x3c, 0xa8, 0x4c, 0xae, 0x1b, + 0x10, 0x9c, 0xc2, 0xb4, 0x7f, 0x87, 0x8e, 0x5f, 0xb0, 0xdb, 0x0e, 0x7c, 0xe2, 0xc7, 0x4b, 0x81, + 0xdf, 0xe2, 0x62, 0xe2, 0x67, 0xa1, 0x14, 0xd3, 0xf1, 0xe0, 0x63, 0x77, 0x45, 0x6e, 0x14, 0x3a, + 0x0a, 0x47, 0x07, 0x95, 0xf3, 0xdd, 0x35, 0xd8, 0x38, 0xb1, 0x3a, 0xe8, 0x5b, 0x60, 0x38, 0x8a, + 0x9d, 0xb8, 0x13, 0x89, 0xd1, 0x7c, 0x52, 0x8e, 0x66, 0x83, 0x95, 0x1e, 0x1d, 0x54, 0xa6, 0x54, + 0x35, 0x5e, 0x84, 0x45, 0x05, 0xf4, 0x0c, 0x8c, 0xec, 0x92, 0x28, 0x72, 0xb6, 0x24, 0x87, 0x3f, + 0x25, 0xea, 0x8e, 0xac, 0xf2, 0x62, 0x2c, 0xe1, 0xe8, 0x29, 0x18, 0x22, 0x61, 0x18, 0x84, 0x62, + 0x8f, 0x4e, 0x08, 0xc4, 0xa1, 0x65, 0x5a, 0x88, 0x39, 0xcc, 0xfe, 0xd7, 0x16, 0x4c, 0xa9, 0xbe, + 0xf2, 0xb6, 0x4e, 0x81, 0x95, 0x7b, 0x1b, 0xa0, 0x29, 0x3f, 0x30, 0x62, 0xb7, 0xc7, 0xd8, 0xf5, + 0x2b, 0x99, 0x0c, 0x4a, 0xd7, 0x30, 0x26, 0x94, 0x55, 0x51, 0x84, 0x35, 0x6a, 0xf6, 0xaf, 0x5a, + 0x70, 0x26, 0xf5, 0x45, 0xb7, 0xdd, 0x28, 0x46, 0xef, 0x74, 0x7d, 0xd5, 0xfc, 0x60, 0x5f, 0x45, + 0x6b, 0xb3, 0x6f, 0x52, 0x4b, 0x59, 0x96, 0x68, 0x5f, 0x74, 0x13, 0x86, 0xdc, 0x98, 0xec, 0xca, + 0x8f, 0x79, 0xaa, 0xe7, 0xc7, 0xf0, 0x5e, 0x25, 0x33, 0x52, 0xa3, 0x35, 0x31, 0x27, 0x60, 0xff, + 0x60, 0x11, 0xca, 0x7c, 0xd9, 0xae, 0x3a, 0xed, 0x53, 0x98, 0x8b, 0x1a, 0x94, 0x18, 0x75, 0xde, + 0xf1, 0xa7, 0xb3, 0x3b, 0x2e, 0xba, 0x33, 0x4f, 0xe5, 0x34, 0xce, 0x0a, 0xaa, 0xab, 0x81, 0x16, + 0x61, 0x46, 0x02, 0x39, 0x00, 0x1b, 0xae, 0xef, 0x84, 0xfb, 0xb4, 0x6c, 0xb6, 0xc8, 0x08, 0x3e, + 0xdf, 0x9b, 0xe0, 0xa2, 0xc2, 0xe7, 0x64, 0x55, 0x5f, 0x13, 0x00, 0xd6, 0x88, 0xce, 0x7d, 0x06, + 0xca, 0x0a, 0xf9, 0x38, 0x3c, 0xce, 0xdc, 0xe7, 0x60, 0x2a, 0xd5, 0x56, 0xbf, 0xea, 0xe3, 0x3a, + 0x8b, 0xf4, 0xcb, 0xec, 0x14, 0x10, 0xbd, 0x5e, 0xf6, 0xf7, 0xc4, 0x29, 0xfa, 0x3e, 0x9c, 0xf5, + 0x32, 0x0e, 0x27, 0x31, 0x55, 0x83, 0x1f, 0x66, 0x4f, 0x88, 0xcf, 0x3e, 0x9b, 0x05, 0xc5, 0x99, + 0x6d, 0xd0, 0x6b, 0x3f, 0x68, 0xd3, 0x35, 0xef, 0x78, 0xac, 0xbf, 0x42, 0xfa, 0xbe, 0x23, 0xca, + 0xb0, 0x82, 0xd2, 0x23, 0xec, 0xac, 0xea, 0xfc, 0x2d, 0xb2, 0xdf, 0x20, 0x1e, 0x69, 0xc6, 0x41, + 0xf8, 0xa1, 0x76, 0xff, 0x22, 0x1f, 0x7d, 0x7e, 0x02, 0x8e, 0x09, 0x02, 0xc5, 0x5b, 0x64, 0x9f, + 0x4f, 0x85, 0xfe, 0x75, 0xc5, 0x9e, 0x5f, 0xf7, 0xb3, 0x16, 0x4c, 0xa8, 0xaf, 0x3b, 0x85, 0xad, + 0xbe, 0x68, 0x6e, 0xf5, 0x8b, 0x3d, 0x17, 0x78, 0xce, 0x26, 0xff, 0x5a, 0x01, 0x2e, 0x28, 0x1c, + 0xca, 0xee, 0xf3, 0x3f, 0x62, 0x55, 0x5d, 0x83, 0xb2, 0xaf, 0xb4, 0x07, 0x96, 0x29, 0xb6, 0x27, + 0xba, 0x83, 0x04, 0x87, 0x72, 0x6d, 0x7e, 0x22, 0xe2, 0x8f, 0xeb, 0x6a, 0x35, 0xa1, 0x42, 0x5b, + 0x84, 0x62, 0xc7, 0x6d, 0x89, 0x3b, 0xe3, 0x53, 0x72, 0xb4, 0xef, 0xd6, 0xaa, 0x47, 0x07, 0x95, + 0x27, 0xf3, 0x54, 0xba, 0xf4, 0xb2, 0x8a, 0xe6, 0xef, 0xd6, 0xaa, 0x98, 0x56, 0x46, 0x0b, 0x30, + 0x25, 0xb5, 0xd6, 0xf7, 0x28, 0x07, 0x15, 0xf8, 0xe2, 0x6a, 0x51, 0xba, 0x31, 0x6c, 0x82, 0x71, + 0x1a, 0x1f, 0x55, 0x61, 0x7a, 0xa7, 0xb3, 0x41, 0x3c, 0x12, 0xf3, 0x0f, 0xbe, 0x45, 0xb8, 0xe6, + 0xa8, 0x9c, 0x88, 0x96, 0xb7, 0x52, 0x70, 0xdc, 0x55, 0xc3, 0xfe, 0x13, 0x76, 0xc4, 0x8b, 0xd1, + 0xab, 0x87, 0x01, 0x5d, 0x58, 0x94, 0xfa, 0x87, 0xb9, 0x9c, 0x07, 0x59, 0x15, 0xb7, 0xc8, 0xfe, + 0x7a, 0x40, 0x99, 0xed, 0xec, 0x55, 0x61, 0xac, 0xf9, 0x52, 0xcf, 0x35, 0xff, 0xf3, 0x05, 0x38, + 0xa7, 0x46, 0xc0, 0xe0, 0xeb, 0xfe, 0xb4, 0x8f, 0xc1, 0x0b, 0x30, 0xd6, 0x22, 0x9b, 0x4e, 0xc7, + 0x8b, 0x95, 0x1a, 0x73, 0x88, 0xab, 0xb2, 0xab, 0x49, 0x31, 0xd6, 0x71, 0x8e, 0x31, 0x6c, 0x3f, + 0x31, 0xc6, 0xee, 0xd6, 0xd8, 0xa1, 0x6b, 0x5c, 0xed, 0x1a, 0x2b, 0x77, 0xd7, 0x3c, 0x05, 0x43, + 0xee, 0x2e, 0xe5, 0xb5, 0x0a, 0x26, 0x0b, 0x55, 0xa3, 0x85, 0x98, 0xc3, 0xd0, 0x27, 0x60, 0xa4, + 0x19, 0xec, 0xee, 0x3a, 0x7e, 0x8b, 0x5d, 0x79, 0xe5, 0xc5, 0x31, 0xca, 0x8e, 0x2d, 0xf1, 0x22, + 0x2c, 0x61, 0xe8, 0x09, 0x28, 0x39, 0xe1, 0x56, 0x34, 0x5b, 0x62, 0x38, 0xa3, 0xb4, 0xa5, 0x85, + 0x70, 0x2b, 0xc2, 0xac, 0x94, 0x4a, 0x55, 0xf7, 0x83, 0x70, 0xc7, 0xf5, 0xb7, 0xaa, 0x6e, 0x28, + 0xb6, 0x84, 0xba, 0x0b, 0xdf, 0x52, 0x10, 0xac, 0x61, 0xa1, 0x15, 0x18, 0x6a, 0x07, 0x61, 0x1c, + 0xcd, 0x0e, 0xb3, 0xe1, 0x7e, 0x32, 0xe7, 0x20, 0xe2, 0x5f, 0x5b, 0x0f, 0xc2, 0x38, 0xf9, 0x00, + 0xfa, 0x2f, 0xc2, 0xbc, 0x3a, 0xfa, 0x16, 0x28, 0x12, 0x7f, 0x6f, 0x76, 0x84, 0x51, 0x99, 0xcb, + 0xa2, 0xb2, 0xec, 0xef, 0xdd, 0x73, 0xc2, 0xe4, 0x94, 0x5e, 0xf6, 0xf7, 0x30, 0xad, 0x83, 0xbe, + 0x00, 0x65, 0xb9, 0xc5, 0x23, 0xa1, 0xe6, 0xc8, 0x5c, 0x62, 0xf2, 0x60, 0xc0, 0xe4, 0xbd, 0x8e, + 0x1b, 0x92, 0x5d, 0xe2, 0xc7, 0x51, 0x72, 0xa6, 0x49, 0x68, 0x84, 0x13, 0x6a, 0xe8, 0x0b, 0x52, + 0xb7, 0xb6, 0x1a, 0x74, 0xfc, 0x38, 0x9a, 0x2d, 0xb3, 0xee, 0x65, 0xbe, 0x7a, 0xdc, 0x4b, 0xf0, + 0xd2, 0xca, 0x37, 0x5e, 0x19, 0x1b, 0xa4, 0x10, 0x86, 0x09, 0xcf, 0xdd, 0x23, 0x3e, 0x89, 0xa2, + 0x7a, 0x18, 0x6c, 0x90, 0x59, 0x60, 0x3d, 0xbf, 0x90, 0xfd, 0x18, 0x10, 0x6c, 0x90, 0xc5, 0x99, + 0xc3, 0x83, 0xca, 0xc4, 0x6d, 0xbd, 0x0e, 0x36, 0x49, 0xa0, 0xbb, 0x30, 0x49, 0xe5, 0x1a, 0x37, + 0x21, 0x3a, 0xd6, 0x8f, 0x28, 0x93, 0x3e, 0xb0, 0x51, 0x09, 0xa7, 0x88, 0xa0, 0x37, 0xa0, 0xec, + 0xb9, 0x9b, 0xa4, 0xb9, 0xdf, 0xf4, 0xc8, 0xec, 0x38, 0xa3, 0x98, 0xb9, 0xad, 0x6e, 0x4b, 0x24, + 0x2e, 0x17, 0xa9, 0xbf, 0x38, 0xa9, 0x8e, 0xee, 0xc1, 0xf9, 0x98, 0x84, 0xbb, 0xae, 0xef, 0xd0, + 0xed, 0x20, 0xe4, 0x05, 0xf6, 0xa4, 0x32, 0xc1, 0xd6, 0xdb, 0x25, 0x31, 0x74, 0xe7, 0xd7, 0x33, + 0xb1, 0x70, 0x4e, 0x6d, 0x74, 0x07, 0xa6, 0xd8, 0x4e, 0xa8, 0x77, 0x3c, 0xaf, 0x1e, 0x78, 0x6e, + 0x73, 0x7f, 0x76, 0x92, 0x11, 0xfc, 0x84, 0xbc, 0x17, 0x6a, 0x26, 0xf8, 0xe8, 0xa0, 0x02, 0xc9, + 0x3f, 0x9c, 0xae, 0x8d, 0x36, 0x98, 0x0e, 0xbd, 0x13, 0xba, 0xf1, 0x3e, 0x5d, 0xbf, 0xe4, 0x41, + 0x3c, 0x3b, 0xd5, 0x53, 0x14, 0xd6, 0x51, 0x95, 0xa2, 0x5d, 0x2f, 0xc4, 0x69, 0x82, 0x74, 0x6b, + 0x47, 0x71, 0xcb, 0xf5, 0x67, 0xa7, 0xd9, 0x89, 0xa1, 0x76, 0x46, 0x83, 0x16, 0x62, 0x0e, 0x63, + 0xfa, 0x73, 0xfa, 0xe3, 0x0e, 0x3d, 0x41, 0x67, 0x18, 0x62, 0xa2, 0x3f, 0x97, 0x00, 0x9c, 0xe0, + 0x50, 0xa6, 0x26, 0x8e, 0xf7, 0x67, 0x11, 0x43, 0x55, 0xdb, 0x65, 0x7d, 0xfd, 0x0b, 0x98, 0x96, + 0xa3, 0xdb, 0x30, 0x42, 0xfc, 0xbd, 0x95, 0x30, 0xd8, 0x9d, 0x3d, 0x93, 0xbf, 0x67, 0x97, 0x39, + 0x0a, 0x3f, 0xd0, 0x13, 0x01, 0x4f, 0x14, 0x63, 0x49, 0x02, 0x3d, 0x80, 0xd9, 0x8c, 0x19, 0xe1, + 0x13, 0x70, 0x96, 0x4d, 0xc0, 0x6b, 0xa2, 0xee, 0xec, 0x7a, 0x0e, 0xde, 0x51, 0x0f, 0x18, 0xce, + 0xa5, 0x8e, 0xbe, 0x08, 0x13, 0x7c, 0x43, 0xf1, 0xc7, 0xb7, 0x68, 0xf6, 0x1c, 0xfb, 0x9a, 0xcb, + 0xf9, 0x9b, 0x93, 0x23, 0x2e, 0x9e, 0x13, 0x1d, 0x9a, 0xd0, 0x4b, 0x23, 0x6c, 0x52, 0xb3, 0x37, + 0x60, 0x52, 0x9d, 0x5b, 0x6c, 0xe9, 0xa0, 0x0a, 0x0c, 0x31, 0x6e, 0x47, 0xe8, 0xb7, 0xca, 0x74, + 0xa6, 0x18, 0x27, 0x84, 0x79, 0x39, 0x9b, 0x29, 0xf7, 0x7d, 0xb2, 0xb8, 0x1f, 0x13, 0x2e, 0x55, + 0x17, 0xb5, 0x99, 0x92, 0x00, 0x9c, 0xe0, 0xd8, 0xff, 0x97, 0x73, 0x8d, 0xc9, 0xe1, 0x38, 0xc0, + 0x75, 0xf0, 0x1c, 0x8c, 0x6e, 0x07, 0x51, 0x4c, 0xb1, 0x59, 0x1b, 0x43, 0x09, 0x9f, 0x78, 0x53, + 0x94, 0x63, 0x85, 0x81, 0x5e, 0x85, 0x89, 0xa6, 0xde, 0x80, 0xb8, 0xcb, 0xd4, 0x10, 0x18, 0xad, + 0x63, 0x13, 0x17, 0xbd, 0x02, 0xa3, 0xec, 0xe9, 0xbc, 0x19, 0x78, 0x82, 0xc9, 0x92, 0x17, 0xf2, + 0x68, 0x5d, 0x94, 0x1f, 0x69, 0xbf, 0xb1, 0xc2, 0x46, 0x57, 0x60, 0x98, 0x76, 0xa1, 0x56, 0x17, + 0xb7, 0x88, 0x52, 0xd5, 0xdc, 0x64, 0xa5, 0x58, 0x40, 0xed, 0xbf, 0x5a, 0xd0, 0x46, 0x99, 0x4a, + 0xa4, 0x04, 0xd5, 0x61, 0xe4, 0xbe, 0xe3, 0xc6, 0xae, 0xbf, 0x25, 0xd8, 0x85, 0x67, 0x7a, 0x5e, + 0x29, 0xac, 0xd2, 0x5b, 0xbc, 0x02, 0xbf, 0xf4, 0xc4, 0x1f, 0x2c, 0xc9, 0x50, 0x8a, 0x61, 0xc7, + 0xf7, 0x29, 0xc5, 0xc2, 0xa0, 0x14, 0x31, 0xaf, 0xc0, 0x29, 0x8a, 0x3f, 0x58, 0x92, 0x41, 0xef, + 0x00, 0xc8, 0x65, 0x49, 0x5a, 0xe2, 0xc9, 0xfa, 0xb9, 0xfe, 0x44, 0xd7, 0x55, 0x9d, 0xc5, 0x49, + 0x7a, 0xa5, 0x26, 0xff, 0xb1, 0x46, 0xcf, 0x8e, 0x19, 0x5b, 0xd5, 0xdd, 0x19, 0xf4, 0xed, 0xf4, + 0x24, 0x70, 0xc2, 0x98, 0xb4, 0x16, 0x62, 0x31, 0x38, 0x9f, 0x1c, 0x4c, 0xa6, 0x58, 0x77, 0x77, + 0x89, 0x7e, 0x6a, 0x08, 0x22, 0x38, 0xa1, 0x67, 0xff, 0x62, 0x11, 0x66, 0xf3, 0xba, 0x4b, 0x17, + 0x1d, 0x79, 0xe0, 0xc6, 0x4b, 0x94, 0x1b, 0xb2, 0xcc, 0x45, 0xb7, 0x2c, 0xca, 0xb1, 0xc2, 0xa0, + 0xb3, 0x1f, 0xb9, 0x5b, 0x52, 0x24, 0x1c, 0x4a, 0x66, 0xbf, 0xc1, 0x4a, 0xb1, 0x80, 0x52, 0xbc, + 0x90, 0x38, 0x91, 0xb0, 0x89, 0xd0, 0x56, 0x09, 0x66, 0xa5, 0x58, 0x40, 0x75, 0x7d, 0x53, 0xa9, + 0x8f, 0xbe, 0xc9, 0x18, 0xa2, 0xa1, 0x93, 0x1d, 0x22, 0xf4, 0x25, 0x80, 0x4d, 0xd7, 0x77, 0xa3, + 0x6d, 0x46, 0x7d, 0xf8, 0xd8, 0xd4, 0x15, 0x2f, 0xb5, 0xa2, 0xa8, 0x60, 0x8d, 0x22, 0x7a, 0x19, + 0xc6, 0xd4, 0x06, 0xac, 0x55, 0xd9, 0x03, 0x91, 0xf6, 0xe0, 0x9e, 0x9c, 0x46, 0x55, 0xac, 0xe3, + 0xd9, 0xef, 0xa6, 0xd7, 0x8b, 0xd8, 0x01, 0xda, 0xf8, 0x5a, 0x83, 0x8e, 0x6f, 0xa1, 0xf7, 0xf8, + 0xda, 0xbf, 0x5e, 0x84, 0x29, 0xa3, 0xb1, 0x4e, 0x34, 0xc0, 0x99, 0x75, 0x83, 0xde, 0x73, 0x4e, + 0x4c, 0xc4, 0xfe, 0xb3, 0xfb, 0x6f, 0x15, 0xfd, 0x2e, 0xa4, 0x3b, 0x80, 0xd7, 0x47, 0x5f, 0x82, + 0xb2, 0xe7, 0x44, 0x4c, 0x77, 0x45, 0xc4, 0xbe, 0x1b, 0x84, 0x58, 0x22, 0x47, 0x38, 0x51, 0xac, + 0x5d, 0x35, 0x9c, 0x76, 0x42, 0x92, 0x5e, 0xc8, 0x94, 0xf7, 0x91, 0x46, 0x37, 0xaa, 0x13, 0x94, + 0x41, 0xda, 0xc7, 0x1c, 0x86, 0x5e, 0x81, 0xf1, 0x90, 0xb0, 0x55, 0xb1, 0x44, 0x59, 0x39, 0xb6, + 0xcc, 0x86, 0x12, 0x9e, 0x0f, 0x6b, 0x30, 0x6c, 0x60, 0x26, 0xac, 0xfc, 0x70, 0x0f, 0x56, 0xfe, + 0x19, 0x18, 0x61, 0x3f, 0xd4, 0x0a, 0x50, 0xb3, 0x51, 0xe3, 0xc5, 0x58, 0xc2, 0xd3, 0x0b, 0x66, + 0x74, 0xc0, 0x05, 0xf3, 0x49, 0x98, 0xac, 0x3a, 0x64, 0x37, 0xf0, 0x97, 0xfd, 0x56, 0x3b, 0x70, + 0xfd, 0x18, 0xcd, 0x42, 0x89, 0xdd, 0x0e, 0x7c, 0x6f, 0x97, 0x28, 0x05, 0x5c, 0xa2, 0x8c, 0xb9, + 0xbd, 0x05, 0xe7, 0xaa, 0xc1, 0x7d, 0xff, 0xbe, 0x13, 0xb6, 0x16, 0xea, 0x35, 0x4d, 0xce, 0x5d, + 0x93, 0x72, 0x16, 0x37, 0x62, 0xc9, 0x3c, 0x53, 0xb5, 0x9a, 0xfc, 0xae, 0x5d, 0x71, 0x3d, 0x92, + 0xa3, 0x8d, 0xf8, 0xeb, 0x05, 0xa3, 0xa5, 0x04, 0x5f, 0x3d, 0x18, 0x59, 0xb9, 0x0f, 0x46, 0x6f, + 0xc2, 0xe8, 0xa6, 0x4b, 0xbc, 0x16, 0x26, 0x9b, 0x62, 0x89, 0x3d, 0x9d, 0xff, 0x2e, 0xbf, 0x42, + 0x31, 0xa5, 0xf6, 0x89, 0x4b, 0x69, 0x2b, 0xa2, 0x32, 0x56, 0x64, 0xd0, 0x0e, 0x4c, 0x4b, 0x31, + 0x40, 0x42, 0xc5, 0x82, 0x7b, 0xa6, 0x97, 0x6c, 0x61, 0x12, 0x3f, 0x7b, 0x78, 0x50, 0x99, 0xc6, + 0x29, 0x32, 0xb8, 0x8b, 0x30, 0x15, 0xcb, 0x76, 0xe9, 0xd1, 0x5a, 0x62, 0xc3, 0xcf, 0xc4, 0x32, + 0x26, 0x61, 0xb2, 0x52, 0xfb, 0x47, 0x2d, 0x78, 0xac, 0x6b, 0x64, 0x84, 0xa4, 0x7d, 0xc2, 0xb3, + 0x90, 0x96, 0x7c, 0x0b, 0xfd, 0x25, 0x5f, 0xfb, 0xef, 0x59, 0x70, 0x76, 0x79, 0xb7, 0x1d, 0xef, + 0x57, 0x5d, 0xf3, 0x75, 0xe7, 0x33, 0x30, 0xbc, 0x4b, 0x5a, 0x6e, 0x67, 0x57, 0xcc, 0x5c, 0x45, + 0x1e, 0x3f, 0xab, 0xac, 0xf4, 0xe8, 0xa0, 0x32, 0xd1, 0x88, 0x83, 0xd0, 0xd9, 0x22, 0xbc, 0x00, + 0x0b, 0x74, 0x76, 0x88, 0xbb, 0xef, 0x93, 0xdb, 0xee, 0xae, 0x2b, 0xed, 0x2c, 0x7a, 0xea, 0xce, + 0xe6, 0xe5, 0x80, 0xce, 0xbf, 0xd9, 0x71, 0xfc, 0xd8, 0x8d, 0xf7, 0xc5, 0xc3, 0x8c, 0x24, 0x82, + 0x13, 0x7a, 0xf6, 0x37, 0x2c, 0x98, 0x92, 0xeb, 0x7e, 0xa1, 0xd5, 0x0a, 0x49, 0x14, 0xa1, 0x39, + 0x28, 0xb8, 0x6d, 0xd1, 0x4b, 0x10, 0xbd, 0x2c, 0xd4, 0xea, 0xb8, 0xe0, 0xb6, 0x51, 0x1d, 0xca, + 0xdc, 0x5c, 0x23, 0x59, 0x5c, 0x03, 0x19, 0x7d, 0xb0, 0x1e, 0xac, 0xcb, 0x9a, 0x38, 0x21, 0x22, + 0x39, 0x38, 0x76, 0x66, 0x16, 0xcd, 0x57, 0xaf, 0x9b, 0xa2, 0x1c, 0x2b, 0x0c, 0x74, 0x15, 0x46, + 0xfd, 0xa0, 0xc5, 0xad, 0x67, 0xf8, 0xed, 0xc7, 0x96, 0xec, 0x9a, 0x28, 0xc3, 0x0a, 0x6a, 0xff, + 0x80, 0x05, 0xe3, 0xf2, 0xcb, 0x06, 0x64, 0x26, 0xe9, 0xd6, 0x4a, 0x18, 0xc9, 0x64, 0x6b, 0x51, + 0x66, 0x90, 0x41, 0x0c, 0x1e, 0xb0, 0x78, 0x1c, 0x1e, 0xd0, 0xfe, 0x91, 0x02, 0x4c, 0xca, 0xee, + 0x34, 0x3a, 0x1b, 0x11, 0x89, 0xd1, 0x3a, 0x94, 0x1d, 0x3e, 0xe4, 0x44, 0xae, 0xd8, 0xa7, 0xb2, + 0x85, 0x0f, 0x63, 0x7e, 0x92, 0x6b, 0x79, 0x41, 0xd6, 0xc6, 0x09, 0x21, 0xe4, 0xc1, 0x8c, 0x1f, + 0xc4, 0xec, 0x88, 0x56, 0xf0, 0x5e, 0x4f, 0x20, 0x69, 0xea, 0x17, 0x04, 0xf5, 0x99, 0xb5, 0x34, + 0x15, 0xdc, 0x4d, 0x18, 0x2d, 0x4b, 0x85, 0x47, 0x31, 0x5f, 0xdc, 0xd0, 0x67, 0x21, 0x5b, 0xdf, + 0x61, 0xff, 0x8a, 0x05, 0x65, 0x89, 0x76, 0x1a, 0xaf, 0x5d, 0xab, 0x30, 0x12, 0xb1, 0x49, 0x90, + 0x43, 0x63, 0xf7, 0xea, 0x38, 0x9f, 0xaf, 0xe4, 0xe6, 0xe1, 0xff, 0x23, 0x2c, 0x69, 0x30, 0x7d, + 0xb7, 0xea, 0xfe, 0x47, 0x44, 0xdf, 0xad, 0xfa, 0x93, 0x73, 0xc3, 0xfc, 0x17, 0xd6, 0x67, 0x4d, + 0xac, 0xa5, 0x0c, 0x52, 0x3b, 0x24, 0x9b, 0xee, 0x83, 0x34, 0x83, 0x54, 0x67, 0xa5, 0x58, 0x40, + 0xd1, 0x3b, 0x30, 0xde, 0x94, 0x8a, 0xce, 0xe4, 0x18, 0xb8, 0xd2, 0x53, 0xe9, 0xae, 0xde, 0x67, + 0xb8, 0x65, 0xed, 0x92, 0x56, 0x1f, 0x1b, 0xd4, 0xcc, 0xe7, 0xf6, 0x62, 0xbf, 0xe7, 0xf6, 0x84, + 0x6e, 0xfe, 0xe3, 0xf3, 0x8f, 0x59, 0x30, 0xcc, 0xd5, 0x65, 0x83, 0xe9, 0x17, 0xb5, 0xe7, 0xaa, + 0x64, 0xec, 0xee, 0xd1, 0x42, 0xf1, 0xfc, 0x84, 0x56, 0xa1, 0xcc, 0x7e, 0x30, 0xb5, 0x41, 0x31, + 0xdf, 0xa4, 0x98, 0xb7, 0xaa, 0x77, 0xf0, 0x9e, 0xac, 0x86, 0x13, 0x0a, 0xf6, 0x0f, 0x15, 0xe9, + 0x51, 0x95, 0xa0, 0x1a, 0x37, 0xb8, 0xf5, 0xe8, 0x6e, 0xf0, 0xc2, 0xa3, 0xba, 0xc1, 0xb7, 0x60, + 0xaa, 0xa9, 0x3d, 0x6e, 0x25, 0x33, 0x79, 0xb5, 0xe7, 0x22, 0xd1, 0xde, 0xc1, 0xb8, 0xca, 0x68, + 0xc9, 0x24, 0x82, 0xd3, 0x54, 0xd1, 0xb7, 0xc3, 0x38, 0x9f, 0x67, 0xd1, 0x0a, 0xb7, 0x58, 0xf8, + 0x44, 0xfe, 0x7a, 0xd1, 0x9b, 0x60, 0x2b, 0xb1, 0xa1, 0x55, 0xc7, 0x06, 0x31, 0xfb, 0x17, 0x47, + 0x61, 0x68, 0x79, 0x8f, 0xf8, 0xf1, 0x29, 0x1c, 0x48, 0x4d, 0x98, 0x74, 0xfd, 0xbd, 0xc0, 0xdb, + 0x23, 0x2d, 0x0e, 0x3f, 0xce, 0xe5, 0x7a, 0x5e, 0x90, 0x9e, 0xac, 0x19, 0x24, 0x70, 0x8a, 0xe4, + 0xa3, 0x90, 0x30, 0x6f, 0xc0, 0x30, 0x9f, 0x7b, 0x21, 0x5e, 0x66, 0x2a, 0x83, 0xd9, 0x20, 0x8a, + 0x5d, 0x90, 0x48, 0xbf, 0x5c, 0xfb, 0x2c, 0xaa, 0xa3, 0x77, 0x61, 0x72, 0xd3, 0x0d, 0xa3, 0x98, + 0x8a, 0x86, 0x51, 0xec, 0xec, 0xb6, 0x1f, 0x42, 0xa2, 0x54, 0xe3, 0xb0, 0x62, 0x50, 0xc2, 0x29, + 0xca, 0x68, 0x0b, 0x26, 0xa8, 0x90, 0x93, 0x34, 0x35, 0x72, 0xec, 0xa6, 0x94, 0xca, 0xe8, 0xb6, + 0x4e, 0x08, 0x9b, 0x74, 0xe9, 0x61, 0xd2, 0x64, 0x42, 0xd1, 0x28, 0xe3, 0x28, 0xd4, 0x61, 0xc2, + 0xa5, 0x21, 0x0e, 0xa3, 0x67, 0x12, 0x33, 0x5b, 0x29, 0x9b, 0x67, 0x92, 0x66, 0x9c, 0xf2, 0x65, + 0x28, 0x13, 0x3a, 0x84, 0x94, 0xb0, 0x50, 0x8c, 0x5f, 0x1b, 0xac, 0xaf, 0xab, 0x6e, 0x33, 0x0c, + 0x4c, 0x59, 0x7e, 0x59, 0x52, 0xc2, 0x09, 0x51, 0xb4, 0x04, 0xc3, 0x11, 0x09, 0x5d, 0x12, 0x09, + 0x15, 0x79, 0x8f, 0x69, 0x64, 0x68, 0xdc, 0xf6, 0x9c, 0xff, 0xc6, 0xa2, 0x2a, 0x5d, 0x5e, 0x0e, + 0x93, 0x86, 0x98, 0x56, 0x5c, 0x5b, 0x5e, 0x0b, 0xac, 0x14, 0x0b, 0x28, 0x7a, 0x03, 0x46, 0x42, + 0xe2, 0x31, 0x65, 0xd1, 0xc4, 0xe0, 0x8b, 0x9c, 0xeb, 0x9e, 0x78, 0x3d, 0x2c, 0x09, 0xa0, 0x5b, + 0x80, 0x42, 0x42, 0x79, 0x08, 0xd7, 0xdf, 0x52, 0xc6, 0x1c, 0x42, 0xd7, 0xfd, 0xb8, 0x68, 0xff, + 0x0c, 0x4e, 0x30, 0xa4, 0x55, 0x2a, 0xce, 0xa8, 0x86, 0x6e, 0xc0, 0x8c, 0x2a, 0xad, 0xf9, 0x51, + 0xec, 0xf8, 0x4d, 0xc2, 0xd4, 0xdc, 0xe5, 0x84, 0x2b, 0xc2, 0x69, 0x04, 0xdc, 0x5d, 0xc7, 0xfe, + 0x69, 0xca, 0xce, 0xd0, 0xd1, 0x3a, 0x05, 0x5e, 0xe0, 0x75, 0x93, 0x17, 0xb8, 0x90, 0x3b, 0x73, + 0x39, 0x7c, 0xc0, 0xa1, 0x05, 0x63, 0xda, 0xcc, 0x26, 0x6b, 0xd6, 0xea, 0xb1, 0x66, 0x3b, 0x30, + 0x4d, 0x57, 0xfa, 0x9d, 0x8d, 0x88, 0x84, 0x7b, 0xa4, 0xc5, 0x16, 0x66, 0xe1, 0xe1, 0x16, 0xa6, + 0x7a, 0x65, 0xbe, 0x9d, 0x22, 0x88, 0xbb, 0x9a, 0x40, 0x9f, 0x91, 0x9a, 0x93, 0xa2, 0x61, 0xa4, + 0xc5, 0xb5, 0x22, 0x47, 0x07, 0x95, 0x69, 0xed, 0x43, 0x74, 0x4d, 0x89, 0xfd, 0x65, 0xf9, 0x8d, + 0xea, 0x35, 0xbf, 0xa9, 0x16, 0x4b, 0xea, 0x35, 0x5f, 0x2d, 0x07, 0x9c, 0xe0, 0xd0, 0x3d, 0x4a, + 0x45, 0x90, 0xf4, 0x6b, 0x3e, 0x15, 0x50, 0x30, 0x83, 0xd8, 0x2f, 0x02, 0x2c, 0x3f, 0x20, 0x4d, + 0xbe, 0xd4, 0xf5, 0x07, 0x48, 0x2b, 0xff, 0x01, 0xd2, 0xfe, 0xb7, 0x16, 0x4c, 0xae, 0x2c, 0x19, + 0x62, 0xe2, 0x3c, 0x00, 0x97, 0x8d, 0xde, 0x7a, 0x6b, 0x4d, 0xea, 0xd6, 0xb9, 0x7a, 0x54, 0x95, + 0x62, 0x0d, 0x03, 0x5d, 0x80, 0xa2, 0xd7, 0xf1, 0x85, 0xc8, 0x32, 0x72, 0x78, 0x50, 0x29, 0xde, + 0xee, 0xf8, 0x98, 0x96, 0x69, 0x16, 0x82, 0xc5, 0x81, 0x2d, 0x04, 0xfb, 0xba, 0x57, 0xa1, 0x0a, + 0x0c, 0xdd, 0xbf, 0xef, 0xb6, 0xb8, 0x11, 0xbb, 0xd0, 0xfb, 0xbf, 0xf5, 0x56, 0xad, 0x1a, 0x61, + 0x5e, 0x6e, 0x7f, 0xb5, 0x08, 0x73, 0x2b, 0x1e, 0x79, 0xf0, 0x01, 0x0d, 0xf9, 0x07, 0xb5, 0x6f, + 0x3c, 0x1e, 0xbf, 0x78, 0x5c, 0x1b, 0xd6, 0xfe, 0xe3, 0xb1, 0x09, 0x23, 0xfc, 0x31, 0x5b, 0x9a, + 0xf5, 0xbf, 0x9a, 0xd5, 0x7a, 0xfe, 0x80, 0xcc, 0xf3, 0x47, 0x71, 0x61, 0xce, 0xaf, 0x6e, 0x5a, + 0x51, 0x8a, 0x25, 0xf1, 0xb9, 0xcf, 0xc2, 0xb8, 0x8e, 0x79, 0x2c, 0x6b, 0xf2, 0x3f, 0x57, 0x84, + 0x69, 0xda, 0x83, 0x47, 0x3a, 0x11, 0x77, 0xbb, 0x27, 0xe2, 0xa4, 0x2d, 0x8a, 0xfb, 0xcf, 0xc6, + 0x3b, 0xe9, 0xd9, 0x78, 0x21, 0x6f, 0x36, 0x4e, 0x7b, 0x0e, 0xbe, 0xdb, 0x82, 0x33, 0x2b, 0x5e, + 0xd0, 0xdc, 0x49, 0x59, 0xfd, 0xbe, 0x0c, 0x63, 0xf4, 0x1c, 0x8f, 0x0c, 0x2f, 0x22, 0xc3, 0xaf, + 0x4c, 0x80, 0xb0, 0x8e, 0xa7, 0x55, 0xbb, 0x7b, 0xb7, 0x56, 0xcd, 0x72, 0x47, 0x13, 0x20, 0xac, + 0xe3, 0xd9, 0x5f, 0xb7, 0xe0, 0xe2, 0x8d, 0xa5, 0xe5, 0x64, 0x29, 0x76, 0x79, 0xc4, 0x51, 0x29, + 0xb0, 0xa5, 0x75, 0x25, 0x91, 0x02, 0xab, 0xac, 0x17, 0x02, 0xfa, 0x51, 0xf1, 0xf6, 0xfc, 0x29, + 0x0b, 0xce, 0xdc, 0x70, 0x63, 0x7a, 0x2d, 0xa7, 0x7d, 0xb3, 0xe8, 0xbd, 0x1c, 0xb9, 0x71, 0x10, + 0xee, 0xa7, 0x7d, 0xb3, 0xb0, 0x82, 0x60, 0x0d, 0x8b, 0xb7, 0xbc, 0xe7, 0x32, 0x33, 0xaa, 0x82, + 0xa9, 0x8a, 0xc2, 0xa2, 0x1c, 0x2b, 0x0c, 0xfa, 0x61, 0x2d, 0x37, 0x64, 0xa2, 0xc4, 0xbe, 0x38, + 0x61, 0xd5, 0x87, 0x55, 0x25, 0x00, 0x27, 0x38, 0xf6, 0x8f, 0x5a, 0x70, 0xee, 0x86, 0xd7, 0x89, + 0x62, 0x12, 0x6e, 0x46, 0x46, 0x67, 0x5f, 0x84, 0x32, 0x91, 0xe2, 0xba, 0xe8, 0xab, 0x62, 0x30, + 0x95, 0x1c, 0xcf, 0x1d, 0xc3, 0x14, 0xde, 0x00, 0x9e, 0x03, 0xc7, 0x73, 0x1d, 0xfb, 0xb9, 0x02, + 0x4c, 0xdc, 0x5c, 0x5f, 0xaf, 0xdf, 0x20, 0xb1, 0xb8, 0xc5, 0xfa, 0xab, 0x9a, 0xb1, 0xa6, 0x31, + 0xeb, 0x25, 0x14, 0x75, 0x62, 0xd7, 0x9b, 0xe7, 0x9e, 0xc8, 0xf3, 0x35, 0x3f, 0xbe, 0x13, 0x36, + 0xe2, 0xd0, 0xf5, 0xb7, 0x32, 0x75, 0x6c, 0xf2, 0xae, 0x2d, 0xe6, 0xdd, 0xb5, 0xe8, 0x45, 0x18, + 0x66, 0xae, 0xd0, 0x52, 0x3c, 0x79, 0x5c, 0xc9, 0x14, 0xac, 0xf4, 0xe8, 0xa0, 0x52, 0xbe, 0x8b, + 0x6b, 0xfc, 0x0f, 0x16, 0xa8, 0xe8, 0x2e, 0x8c, 0x6d, 0xc7, 0x71, 0xfb, 0x26, 0x71, 0x5a, 0x24, + 0x94, 0xa7, 0xc3, 0xa5, 0xac, 0xd3, 0x81, 0x0e, 0x02, 0x47, 0x4b, 0x36, 0x54, 0x52, 0x16, 0x61, + 0x9d, 0x8e, 0xdd, 0x00, 0x48, 0x60, 0x27, 0xa4, 0x5f, 0xb0, 0x7f, 0xdf, 0x82, 0x11, 0xee, 0x95, + 0x16, 0xa2, 0xd7, 0xa0, 0x44, 0x1e, 0x90, 0xa6, 0xe0, 0x1c, 0x33, 0x3b, 0x9c, 0x30, 0x1e, 0x5c, + 0x5b, 0x4e, 0xff, 0x63, 0x56, 0x0b, 0xdd, 0x84, 0x11, 0xda, 0xdb, 0x1b, 0xca, 0x45, 0xef, 0xc9, + 0xbc, 0x2f, 0x56, 0xd3, 0xce, 0x79, 0x15, 0x51, 0x84, 0x65, 0x75, 0xa6, 0xf9, 0x6d, 0xb6, 0x1b, + 0xf4, 0x00, 0x8b, 0x7b, 0xdd, 0xb3, 0xeb, 0x4b, 0x75, 0x8e, 0x24, 0xa8, 0x71, 0xcd, 0xaf, 0x2c, + 0xc4, 0x09, 0x11, 0x7b, 0x1d, 0xca, 0x74, 0x52, 0x17, 0x3c, 0xd7, 0xe9, 0xad, 0x74, 0x7e, 0x16, + 0xca, 0x52, 0x01, 0x1c, 0x09, 0xc7, 0x26, 0x46, 0x55, 0xea, 0x87, 0x23, 0x9c, 0xc0, 0xed, 0x4d, + 0x38, 0xcb, 0x5e, 0xfe, 0x9d, 0x78, 0xdb, 0xd8, 0x63, 0xfd, 0x17, 0xf3, 0x73, 0x42, 0x10, 0xe3, + 0x33, 0x33, 0xab, 0xf9, 0x0e, 0x8c, 0x4b, 0x8a, 0x89, 0x50, 0x66, 0xff, 0x41, 0x09, 0x1e, 0xaf, + 0x35, 0xf2, 0x1d, 0x16, 0x5f, 0x81, 0x71, 0xce, 0xa6, 0xd1, 0xa5, 0xed, 0x78, 0xa2, 0x5d, 0xf5, + 0x2e, 0xb6, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0x2e, 0x42, 0xd1, 0x7d, 0xcf, 0x4f, 0x9b, 0xe1, 0xd6, + 0xde, 0x5c, 0xc3, 0xb4, 0x9c, 0x82, 0x29, 0xc7, 0xc7, 0x8f, 0x52, 0x05, 0x56, 0x5c, 0xdf, 0xeb, + 0x30, 0xe9, 0x46, 0xcd, 0xc8, 0xad, 0xf9, 0xf4, 0x9c, 0x49, 0x9c, 0x5d, 0x13, 0x25, 0x01, 0xed, + 0xb4, 0x82, 0xe2, 0x14, 0xb6, 0x76, 0xae, 0x0f, 0x0d, 0xcc, 0x35, 0xf6, 0xf5, 0xf4, 0xa1, 0x0c, + 0x71, 0x9b, 0x7d, 0x5d, 0xc4, 0x8c, 0xda, 0x04, 0x43, 0xcc, 0x3f, 0x38, 0xc2, 0x12, 0x46, 0x25, + 0xb0, 0xe6, 0xb6, 0xd3, 0x5e, 0xe8, 0xc4, 0xdb, 0x55, 0x37, 0x6a, 0x06, 0x7b, 0x24, 0xdc, 0x67, + 0xc2, 0xf3, 0x68, 0x22, 0x81, 0x29, 0xc0, 0xd2, 0xcd, 0x85, 0x3a, 0xc5, 0xc4, 0xdd, 0x75, 0x4c, + 0xae, 0x10, 0x4e, 0x82, 0x2b, 0x5c, 0x80, 0x29, 0xd9, 0x4c, 0x83, 0x44, 0xec, 0x8e, 0x18, 0x63, + 0x1d, 0x53, 0xa6, 0xb6, 0xa2, 0x58, 0x75, 0x2b, 0x8d, 0x8f, 0x3e, 0x03, 0x13, 0xae, 0xef, 0xc6, + 0xae, 0x13, 0x07, 0x21, 0xbb, 0x61, 0xb9, 0x9c, 0xcc, 0x2c, 0xd9, 0x6a, 0x3a, 0x00, 0x9b, 0x78, + 0xf6, 0x7f, 0x2c, 0xc1, 0x0c, 0x9b, 0xb6, 0x6f, 0xae, 0xb0, 0x8f, 0xcc, 0x0a, 0xbb, 0xdb, 0xbd, + 0xc2, 0x4e, 0x82, 0xdd, 0xfd, 0x30, 0x97, 0xd9, 0xbb, 0x50, 0x56, 0xb6, 0xc0, 0xd2, 0x19, 0xc0, + 0xca, 0x71, 0x06, 0xe8, 0xcf, 0x7d, 0xc8, 0x67, 0xdc, 0x62, 0xe6, 0x33, 0xee, 0xdf, 0xb4, 0x20, + 0x31, 0x89, 0x44, 0x37, 0xa1, 0xdc, 0x0e, 0x98, 0xd9, 0x41, 0x28, 0x6d, 0x79, 0x1e, 0xcf, 0xbc, + 0xa8, 0xf8, 0xa5, 0xc8, 0xc7, 0xaf, 0x2e, 0x6b, 0xe0, 0xa4, 0x32, 0x5a, 0x84, 0x91, 0x76, 0x48, + 0x1a, 0x31, 0x73, 0x81, 0xed, 0x4b, 0x87, 0xaf, 0x11, 0x8e, 0x8f, 0x65, 0x45, 0xfb, 0xe7, 0x2d, + 0x00, 0xfe, 0x52, 0xea, 0xf8, 0x5b, 0xe4, 0x14, 0xb4, 0xbf, 0x55, 0x28, 0x45, 0x6d, 0xd2, 0xec, + 0x65, 0x10, 0x92, 0xf4, 0xa7, 0xd1, 0x26, 0xcd, 0x64, 0xc0, 0xe9, 0x3f, 0xcc, 0x6a, 0xdb, 0xdf, + 0x03, 0x30, 0x99, 0xa0, 0xd5, 0x62, 0xb2, 0x8b, 0x9e, 0x37, 0x5c, 0xe2, 0x2e, 0xa4, 0x5c, 0xe2, + 0xca, 0x0c, 0x5b, 0x53, 0x34, 0xbe, 0x0b, 0xc5, 0x5d, 0xe7, 0x81, 0xd0, 0x24, 0x3d, 0xdb, 0xbb, + 0x1b, 0x94, 0xfe, 0xfc, 0xaa, 0xf3, 0x80, 0xcb, 0x4c, 0xcf, 0xca, 0x05, 0xb2, 0xea, 0x3c, 0x38, + 0xe2, 0x66, 0x1f, 0xec, 0x90, 0xba, 0xed, 0x46, 0xf1, 0x57, 0xfe, 0x43, 0xf2, 0x9f, 0x2d, 0x3b, + 0xda, 0x08, 0x6b, 0xcb, 0xf5, 0xc5, 0xbb, 0xe1, 0x40, 0x6d, 0xb9, 0x7e, 0xba, 0x2d, 0xd7, 0x1f, + 0xa0, 0x2d, 0xd7, 0x47, 0xef, 0xc3, 0x88, 0x78, 0xa3, 0x67, 0xb6, 0xde, 0xa6, 0x96, 0x2a, 0xaf, + 0x3d, 0xf1, 0xc4, 0xcf, 0xdb, 0xbc, 0x26, 0x65, 0x42, 0x51, 0xda, 0xb7, 0x5d, 0xd9, 0x20, 0xfa, + 0x6b, 0x16, 0x4c, 0x8a, 0xdf, 0x98, 0xbc, 0xd7, 0x21, 0x51, 0x2c, 0x78, 0xcf, 0x4f, 0x0f, 0xde, + 0x07, 0x51, 0x91, 0x77, 0xe5, 0xd3, 0xf2, 0x98, 0x35, 0x81, 0x7d, 0x7b, 0x94, 0xea, 0x05, 0xfa, + 0x07, 0x16, 0x9c, 0xdd, 0x75, 0x1e, 0xf0, 0x16, 0x79, 0x19, 0x76, 0x62, 0x37, 0x10, 0xb6, 0xeb, + 0xaf, 0x0d, 0x36, 0xfd, 0x5d, 0xd5, 0x79, 0x27, 0xa5, 0x99, 0xeb, 0xd9, 0x2c, 0x94, 0xbe, 0x5d, + 0xcd, 0xec, 0xd7, 0xdc, 0x26, 0x8c, 0xca, 0xf5, 0x96, 0x21, 0x79, 0x57, 0x75, 0xc6, 0xfa, 0xd8, + 0x26, 0x12, 0xba, 0x5f, 0x1a, 0x6d, 0x47, 0xac, 0xb5, 0x47, 0xda, 0xce, 0xbb, 0x30, 0xae, 0xaf, + 0xb1, 0x47, 0xda, 0xd6, 0x7b, 0x70, 0x26, 0x63, 0x2d, 0x3d, 0xd2, 0x26, 0xef, 0xc3, 0x85, 0xdc, + 0xf5, 0xf1, 0x28, 0x1b, 0xb6, 0x7f, 0xce, 0xd2, 0xcf, 0xc1, 0x53, 0x50, 0xc1, 0x2f, 0x99, 0x2a, + 0xf8, 0x4b, 0xbd, 0x77, 0x4e, 0x8e, 0x1e, 0xfe, 0x1d, 0xbd, 0xd3, 0xf4, 0x54, 0x47, 0x6f, 0xc0, + 0xb0, 0x47, 0x4b, 0xa4, 0x71, 0x88, 0xdd, 0x7f, 0x47, 0x26, 0xbc, 0x14, 0x2b, 0x8f, 0xb0, 0xa0, + 0x60, 0xff, 0x92, 0x05, 0xa5, 0x53, 0x18, 0x09, 0x6c, 0x8e, 0xc4, 0xf3, 0xb9, 0xa4, 0x45, 0x48, + 0xb3, 0x79, 0xec, 0xdc, 0x5f, 0x7e, 0x10, 0x13, 0x3f, 0x62, 0xa2, 0x62, 0xe6, 0xc0, 0x7c, 0x07, + 0x9c, 0xb9, 0x1d, 0x38, 0xad, 0x45, 0xc7, 0x73, 0xfc, 0x26, 0x09, 0x6b, 0xfe, 0x56, 0x5f, 0x2b, + 0x25, 0xdd, 0xa6, 0xa8, 0xd0, 0xcf, 0xa6, 0xc8, 0xde, 0x06, 0xa4, 0x37, 0x20, 0xec, 0x38, 0x31, + 0x8c, 0xb8, 0xbc, 0x29, 0x31, 0xfc, 0x4f, 0x67, 0x73, 0x77, 0x5d, 0x3d, 0xd3, 0x2c, 0x14, 0x79, + 0x01, 0x96, 0x84, 0xec, 0x57, 0x20, 0xd3, 0x77, 0xab, 0xbf, 0xda, 0xc0, 0x7e, 0x19, 0x66, 0x58, + 0xcd, 0xe3, 0x89, 0xb4, 0xf6, 0xf7, 0x59, 0x30, 0xb5, 0x96, 0x8a, 0x4d, 0x71, 0x85, 0xbd, 0xf5, + 0x65, 0xe8, 0x7d, 0x1b, 0xac, 0x14, 0x0b, 0xe8, 0x89, 0xeb, 0x97, 0xfe, 0xc4, 0x82, 0xc4, 0x55, + 0xf2, 0x14, 0x98, 0xaa, 0x25, 0x83, 0xa9, 0xca, 0xd4, 0x7b, 0xa8, 0xee, 0xe4, 0xf1, 0x54, 0xe8, + 0x96, 0x8a, 0x0b, 0xd0, 0x43, 0xe5, 0x91, 0x90, 0xe1, 0x5e, 0xe4, 0x93, 0x66, 0xf0, 0x00, 0x19, + 0x29, 0x80, 0x99, 0x09, 0x29, 0xdc, 0x8f, 0x88, 0x99, 0x90, 0xea, 0x4f, 0xce, 0xee, 0xab, 0x6b, + 0x5d, 0x66, 0xa7, 0xd2, 0xb7, 0x32, 0xb3, 0x6f, 0xc7, 0x73, 0xdf, 0x27, 0x2a, 0xb8, 0x49, 0x45, + 0x98, 0x71, 0x8b, 0xd2, 0xa3, 0x83, 0xca, 0x84, 0xfa, 0xc7, 0x23, 0x60, 0x25, 0x55, 0xec, 0x9b, + 0x30, 0x95, 0x1a, 0x30, 0xf4, 0x32, 0x0c, 0xb5, 0xb7, 0x9d, 0x88, 0xa4, 0x4c, 0x23, 0x87, 0xea, + 0xb4, 0xf0, 0xe8, 0xa0, 0x32, 0xa9, 0x2a, 0xb0, 0x12, 0xcc, 0xb1, 0xed, 0xff, 0x61, 0x41, 0x69, + 0x2d, 0x68, 0x9d, 0xc6, 0x62, 0x7a, 0xdd, 0x58, 0x4c, 0x4f, 0xe4, 0xc5, 0x0f, 0xcc, 0x5d, 0x47, + 0x2b, 0xa9, 0x75, 0x74, 0x29, 0x97, 0x42, 0xef, 0x25, 0xb4, 0x0b, 0x63, 0x2c, 0x2a, 0xa1, 0x30, + 0xd5, 0x7c, 0xd1, 0xe0, 0xef, 0x2b, 0x29, 0xfe, 0x7e, 0x4a, 0x43, 0xd5, 0xb8, 0xfc, 0x67, 0x60, + 0x44, 0x98, 0x0b, 0xa6, 0x0d, 0xdc, 0x05, 0x2e, 0x96, 0x70, 0xfb, 0xc7, 0x8a, 0x60, 0x44, 0x41, + 0x44, 0xbf, 0x62, 0xc1, 0x7c, 0xc8, 0x3d, 0x06, 0x5b, 0xd5, 0x4e, 0xe8, 0xfa, 0x5b, 0x8d, 0xe6, + 0x36, 0x69, 0x75, 0x3c, 0xd7, 0xdf, 0xaa, 0x6d, 0xf9, 0x81, 0x2a, 0x5e, 0x7e, 0x40, 0x9a, 0x1d, + 0xa6, 0xf3, 0xef, 0x13, 0x72, 0x51, 0x99, 0xe3, 0x5c, 0x3f, 0x3c, 0xa8, 0xcc, 0xe3, 0x63, 0xd1, + 0xc6, 0xc7, 0xec, 0x0b, 0xfa, 0xba, 0x05, 0xd7, 0x78, 0x70, 0xc0, 0xc1, 0xfb, 0xdf, 0x43, 0x1a, + 0xaa, 0x4b, 0x52, 0x09, 0x91, 0x75, 0x12, 0xee, 0x2e, 0x7e, 0x46, 0x0c, 0xe8, 0xb5, 0xfa, 0xf1, + 0xda, 0xc2, 0xc7, 0xed, 0x9c, 0xfd, 0xcf, 0x8b, 0x30, 0x21, 0x9c, 0xd5, 0x45, 0x14, 0x94, 0x97, + 0x8d, 0x25, 0xf1, 0x64, 0x6a, 0x49, 0xcc, 0x18, 0xc8, 0x27, 0x13, 0x00, 0x25, 0x82, 0x19, 0xcf, + 0x89, 0xe2, 0x9b, 0xc4, 0x09, 0xe3, 0x0d, 0xe2, 0x70, 0x33, 0x95, 0xe2, 0xb1, 0x4d, 0x6a, 0x94, + 0xfa, 0xe5, 0x76, 0x9a, 0x18, 0xee, 0xa6, 0x8f, 0xf6, 0x00, 0x31, 0x5b, 0x9b, 0xd0, 0xf1, 0x23, + 0xfe, 0x2d, 0xae, 0x78, 0x0f, 0x38, 0x5e, 0xab, 0x73, 0xa2, 0x55, 0x74, 0xbb, 0x8b, 0x1a, 0xce, + 0x68, 0x41, 0xb3, 0xa1, 0x1a, 0x1a, 0xd4, 0x86, 0x6a, 0xb8, 0x8f, 0x17, 0x89, 0x0f, 0xd3, 0x5d, + 0xf1, 0x06, 0xde, 0x86, 0xb2, 0xb2, 0x75, 0x13, 0x87, 0x4e, 0xef, 0xb0, 0x1d, 0x69, 0x0a, 0x5c, + 0x45, 0x92, 0xd8, 0x59, 0x26, 0xe4, 0xec, 0x7f, 0x58, 0x30, 0x1a, 0xe4, 0x93, 0xb8, 0x06, 0xa3, + 0x4e, 0x14, 0xb9, 0x5b, 0x3e, 0x69, 0x89, 0x1d, 0xfb, 0xf1, 0xbc, 0x1d, 0x6b, 0x34, 0xc3, 0xec, + 0x0d, 0x17, 0x44, 0x4d, 0xac, 0x68, 0xa0, 0x9b, 0xdc, 0x18, 0x68, 0x4f, 0xf2, 0xf3, 0x83, 0x51, + 0x03, 0x69, 0x2e, 0xb4, 0x47, 0xb0, 0xa8, 0x8f, 0xbe, 0xc8, 0xad, 0xb5, 0x6e, 0xf9, 0xc1, 0x7d, + 0xff, 0x46, 0x10, 0x48, 0x0f, 0xb3, 0xc1, 0x08, 0xce, 0x48, 0x1b, 0x2d, 0x55, 0x1d, 0x9b, 0xd4, + 0x06, 0x8b, 0xc9, 0xf3, 0x9d, 0x70, 0x86, 0x92, 0x36, 0xfd, 0x44, 0x22, 0x44, 0x60, 0x4a, 0x44, + 0x42, 0x90, 0x65, 0x62, 0xec, 0x32, 0x59, 0x75, 0xb3, 0x76, 0xa2, 0xd0, 0xbb, 0x65, 0x92, 0xc0, + 0x69, 0x9a, 0xf6, 0x4f, 0x5a, 0xc0, 0x2c, 0xdc, 0x4f, 0x81, 0x65, 0xf8, 0x9c, 0xc9, 0x32, 0xcc, + 0xe6, 0x0d, 0x72, 0x0e, 0xb7, 0xf0, 0x12, 0x5f, 0x59, 0xf5, 0x30, 0x78, 0xb0, 0x2f, 0x5e, 0xca, + 0x07, 0xe0, 0x52, 0xff, 0x8f, 0xc5, 0x0f, 0x31, 0xe5, 0x74, 0x8e, 0xbe, 0x0b, 0x46, 0x9b, 0x4e, + 0xdb, 0x69, 0xf2, 0x90, 0xbd, 0xb9, 0x1a, 0x1b, 0xa3, 0xd2, 0xfc, 0x92, 0xa8, 0xc1, 0x35, 0x10, + 0x32, 0xa2, 0xc6, 0xa8, 0x2c, 0xee, 0xab, 0x75, 0x50, 0x4d, 0xce, 0xed, 0xc0, 0x84, 0x41, 0xec, + 0x91, 0x8a, 0xab, 0xdf, 0xc5, 0xaf, 0x58, 0x15, 0x01, 0x66, 0x17, 0x66, 0x7c, 0xed, 0x3f, 0xbd, + 0x50, 0xa4, 0x08, 0xf2, 0xf1, 0x7e, 0x97, 0x28, 0xbb, 0x7d, 0x34, 0x0b, 0xfe, 0x14, 0x19, 0xdc, + 0x4d, 0xd9, 0xfe, 0x71, 0x0b, 0x1e, 0xd3, 0x11, 0xb5, 0x78, 0x00, 0xfd, 0x74, 0xc0, 0x55, 0x18, + 0x0d, 0xda, 0x24, 0x74, 0xe2, 0x20, 0x14, 0xb7, 0xc6, 0x55, 0x39, 0xe8, 0x77, 0x44, 0xf9, 0x91, + 0x88, 0x9d, 0x28, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0x22, 0x1b, 0x86, 0xd9, 0x60, 0x44, 0x22, 0x56, + 0x03, 0x3b, 0x03, 0xd8, 0x73, 0x68, 0x84, 0x05, 0xc4, 0xfe, 0x03, 0x8b, 0x2f, 0x2c, 0xbd, 0xeb, + 0xe8, 0x3d, 0x98, 0xde, 0x75, 0xe2, 0xe6, 0xf6, 0xf2, 0x83, 0x76, 0xc8, 0x55, 0xdf, 0x72, 0x9c, + 0x9e, 0xed, 0x37, 0x4e, 0xda, 0x47, 0x26, 0x06, 0x68, 0xab, 0x29, 0x62, 0xb8, 0x8b, 0x3c, 0xda, + 0x80, 0x31, 0x56, 0xc6, 0x2c, 0x9d, 0xa3, 0x5e, 0xac, 0x41, 0x5e, 0x6b, 0xea, 0x45, 0x79, 0x35, + 0xa1, 0x83, 0x75, 0xa2, 0xf6, 0x57, 0x8a, 0x7c, 0xb7, 0x33, 0x6e, 0xfb, 0x19, 0x18, 0x69, 0x07, + 0xad, 0xa5, 0x5a, 0x15, 0x8b, 0x59, 0x50, 0xd7, 0x48, 0x9d, 0x17, 0x63, 0x09, 0x47, 0xaf, 0x02, + 0x90, 0x07, 0x31, 0x09, 0x7d, 0xc7, 0x53, 0x06, 0x21, 0xca, 0x04, 0xb2, 0x1a, 0xac, 0x05, 0xf1, + 0xdd, 0x88, 0x7c, 0xc7, 0xb2, 0x42, 0xc1, 0x1a, 0x3a, 0xba, 0x0e, 0xd0, 0x0e, 0x83, 0x3d, 0xb7, + 0xc5, 0x5c, 0xe7, 0x8a, 0xa6, 0xb9, 0x44, 0x5d, 0x41, 0xb0, 0x86, 0x85, 0x5e, 0x85, 0x89, 0x8e, + 0x1f, 0x71, 0x0e, 0xc5, 0xd9, 0x10, 0x91, 0x07, 0x47, 0x13, 0xcb, 0x85, 0xbb, 0x3a, 0x10, 0x9b, + 0xb8, 0x68, 0x01, 0x86, 0x63, 0x87, 0xd9, 0x3b, 0x0c, 0xe5, 0xdb, 0x2d, 0xae, 0x53, 0x0c, 0x3d, + 0x60, 0x2c, 0xad, 0x80, 0x45, 0x45, 0xf4, 0xb6, 0xf4, 0x43, 0xe0, 0x67, 0xbd, 0x30, 0x18, 0x1e, + 0xec, 0x5e, 0xd0, 0xbc, 0x10, 0x84, 0x21, 0xb2, 0x41, 0xcb, 0xfe, 0x7a, 0x19, 0x20, 0x61, 0xc7, + 0xd1, 0xfb, 0x5d, 0xe7, 0xd1, 0x73, 0xbd, 0x19, 0xf8, 0x93, 0x3b, 0x8c, 0xd0, 0xf7, 0x5a, 0x30, + 0xe6, 0x78, 0x5e, 0xd0, 0x74, 0x62, 0x36, 0xca, 0x85, 0xde, 0xe7, 0xa1, 0x68, 0x7f, 0x21, 0xa9, + 0xc1, 0xbb, 0xf0, 0xa2, 0x5c, 0x78, 0x1a, 0xa4, 0x6f, 0x2f, 0xf4, 0x86, 0xd1, 0xa7, 0xa4, 0x94, + 0xc6, 0x97, 0xc7, 0x5c, 0x5a, 0x4a, 0x2b, 0xb3, 0xa3, 0x5f, 0x13, 0xd0, 0xd0, 0x5d, 0x23, 0xa8, + 0x5c, 0x29, 0x3f, 0xbe, 0x82, 0xc1, 0x95, 0xf6, 0x8b, 0x27, 0x87, 0xea, 0xba, 0xe3, 0xd4, 0x50, + 0x7e, 0x10, 0x12, 0x4d, 0xfc, 0xe9, 0xe3, 0x34, 0xf5, 0x2e, 0x4c, 0xb5, 0xcc, 0xbb, 0x5d, 0xac, + 0xa6, 0xa7, 0xf3, 0xe8, 0xa6, 0x58, 0x81, 0xe4, 0x36, 0x4f, 0x01, 0x70, 0x9a, 0x30, 0xaa, 0x73, + 0x17, 0xb6, 0x9a, 0xbf, 0x19, 0x08, 0xc3, 0x73, 0x3b, 0x77, 0x2e, 0xf7, 0xa3, 0x98, 0xec, 0x52, + 0xcc, 0xe4, 0xd2, 0x5e, 0x13, 0x75, 0xb1, 0xa2, 0x82, 0xde, 0x80, 0x61, 0xe6, 0x03, 0x1b, 0xcd, + 0x8e, 0xe6, 0x2b, 0x0a, 0xcd, 0xf0, 0x0d, 0xc9, 0xa6, 0x62, 0x7f, 0x23, 0x2c, 0x28, 0xa0, 0x9b, + 0x32, 0xc6, 0x4b, 0x54, 0xf3, 0xef, 0x46, 0x84, 0xc5, 0x78, 0x29, 0x2f, 0x7e, 0x3c, 0x09, 0xdf, + 0xc2, 0xcb, 0x33, 0x43, 0xc3, 0x1b, 0x35, 0x29, 0x73, 0x24, 0xfe, 0xcb, 0x88, 0xf3, 0xb3, 0x90, + 0xdf, 0x3d, 0x33, 0x2a, 0x7d, 0x32, 0x9c, 0xf7, 0x4c, 0x12, 0x38, 0x4d, 0x93, 0x32, 0x9a, 0x7c, + 0xe7, 0x0a, 0xd3, 0xf5, 0x7e, 0xfb, 0x9f, 0xcb, 0xd7, 0xec, 0x92, 0xe1, 0x25, 0x58, 0xd4, 0x3f, + 0xd5, 0x5b, 0x7f, 0xce, 0x87, 0xe9, 0xf4, 0x16, 0x7d, 0xa4, 0x5c, 0xc6, 0xef, 0x97, 0x60, 0xd2, + 0x5c, 0x52, 0xe8, 0x1a, 0x94, 0x05, 0x11, 0x15, 0x70, 0x54, 0xed, 0x92, 0x55, 0x09, 0xc0, 0x09, + 0x0e, 0x8b, 0x33, 0xcb, 0xaa, 0x6b, 0x26, 0x87, 0x49, 0x9c, 0x59, 0x05, 0xc1, 0x1a, 0x16, 0x95, + 0x97, 0x36, 0x82, 0x20, 0x56, 0x97, 0x8a, 0x5a, 0x77, 0x8b, 0xac, 0x14, 0x0b, 0x28, 0xbd, 0x4c, + 0x76, 0x48, 0xe8, 0x13, 0xcf, 0x8c, 0x63, 0xa6, 0x2e, 0x93, 0x5b, 0x3a, 0x10, 0x9b, 0xb8, 0xf4, + 0x96, 0x0c, 0x22, 0xb6, 0x90, 0x85, 0x54, 0x96, 0x98, 0x70, 0x36, 0xb8, 0x37, 0xb9, 0x84, 0xa3, + 0x2f, 0xc0, 0x63, 0xca, 0xf9, 0x1b, 0x73, 0x25, 0xb4, 0x6c, 0x71, 0xd8, 0x50, 0xa2, 0x3c, 0xb6, + 0x94, 0x8d, 0x86, 0xf3, 0xea, 0xa3, 0xd7, 0x61, 0x52, 0x70, 0xee, 0x92, 0xe2, 0x88, 0x69, 0x17, + 0x71, 0xcb, 0x80, 0xe2, 0x14, 0xb6, 0x8c, 0xc4, 0xc6, 0x98, 0x67, 0x49, 0x61, 0xb4, 0x3b, 0x12, + 0x9b, 0x0e, 0xc7, 0x5d, 0x35, 0xd0, 0x02, 0x4c, 0x71, 0xd6, 0xca, 0xf5, 0xb7, 0xf8, 0x9c, 0x08, + 0xcf, 0x12, 0xb5, 0xa5, 0xee, 0x98, 0x60, 0x9c, 0xc6, 0x47, 0xaf, 0xc0, 0xb8, 0x13, 0x36, 0xb7, + 0xdd, 0x98, 0x34, 0xe3, 0x4e, 0xc8, 0x5d, 0x4e, 0x34, 0xc3, 0x92, 0x05, 0x0d, 0x86, 0x0d, 0x4c, + 0xfb, 0x7d, 0x38, 0x93, 0xe1, 0x94, 0x46, 0x17, 0x8e, 0xd3, 0x76, 0xe5, 0x37, 0xa5, 0x8c, 0x31, + 0x17, 0xea, 0x35, 0xf9, 0x35, 0x1a, 0x16, 0x5d, 0x9d, 0xcc, 0x79, 0x4d, 0x4b, 0x30, 0xa1, 0x56, + 0xe7, 0x8a, 0x04, 0xe0, 0x04, 0xc7, 0xfe, 0x9f, 0x05, 0x98, 0xca, 0x50, 0xac, 0xb3, 0x24, 0x07, + 0x29, 0xd9, 0x23, 0xc9, 0x69, 0x60, 0x06, 0xf6, 0x2b, 0x1c, 0x23, 0xb0, 0x5f, 0xb1, 0x5f, 0x60, + 0xbf, 0xd2, 0x07, 0x09, 0xec, 0x67, 0x8e, 0xd8, 0xd0, 0x40, 0x23, 0x96, 0x11, 0x0c, 0x70, 0xf8, + 0x98, 0xc1, 0x00, 0x8d, 0x41, 0x1f, 0x19, 0x60, 0xd0, 0x7f, 0xa8, 0x00, 0xd3, 0x69, 0x03, 0xb8, + 0x53, 0x50, 0xc7, 0xbe, 0x61, 0xa8, 0x63, 0xb3, 0x53, 0x86, 0xa4, 0xcd, 0xf2, 0xf2, 0x54, 0xb3, + 0x38, 0xa5, 0x9a, 0xfd, 0xe4, 0x40, 0xd4, 0x7a, 0xab, 0x69, 0xff, 0x76, 0x01, 0xce, 0xa5, 0xab, + 0x2c, 0x79, 0x8e, 0xbb, 0x7b, 0x0a, 0x63, 0x73, 0xc7, 0x18, 0x9b, 0xe7, 0x07, 0xf9, 0x1a, 0xd6, + 0xb5, 0xdc, 0x01, 0x7a, 0x2b, 0x35, 0x40, 0xd7, 0x06, 0x27, 0xd9, 0x7b, 0x94, 0xbe, 0x51, 0x84, + 0x4b, 0x99, 0xf5, 0x12, 0x6d, 0xe6, 0x8a, 0xa1, 0xcd, 0xbc, 0x9e, 0xd2, 0x66, 0xda, 0xbd, 0x6b, + 0x9f, 0x8c, 0x7a, 0x53, 0x78, 0x0b, 0xb2, 0xe0, 0x6f, 0x0f, 0xa9, 0xda, 0x34, 0xbc, 0x05, 0x15, + 0x21, 0x6c, 0xd2, 0xfd, 0xb3, 0xa4, 0xd2, 0xfc, 0x97, 0x16, 0x5c, 0xc8, 0x9c, 0x9b, 0x53, 0x50, + 0x61, 0xad, 0x99, 0x2a, 0xac, 0x67, 0x06, 0x5e, 0xad, 0x39, 0x3a, 0xad, 0xdf, 0x28, 0xe5, 0x7c, + 0x0b, 0x13, 0xd0, 0xef, 0xc0, 0x98, 0xd3, 0x6c, 0x92, 0x28, 0x5a, 0x0d, 0x5a, 0x2a, 0x18, 0xda, + 0xf3, 0x4c, 0xce, 0x4a, 0x8a, 0x8f, 0x0e, 0x2a, 0x73, 0x69, 0x12, 0x09, 0x18, 0xeb, 0x14, 0xcc, + 0xf8, 0x8d, 0x85, 0x13, 0x8d, 0xdf, 0x78, 0x1d, 0x60, 0x4f, 0x71, 0xeb, 0x69, 0x21, 0x5f, 0xe3, + 0xe3, 0x35, 0x2c, 0xf4, 0x45, 0x18, 0x8d, 0xc4, 0x35, 0x2e, 0x96, 0xe2, 0x8b, 0x03, 0xce, 0x95, + 0xb3, 0x41, 0x3c, 0xd3, 0x2d, 0x5d, 0xe9, 0x43, 0x14, 0x49, 0xf4, 0x6d, 0x30, 0x1d, 0xf1, 0xa8, + 0x27, 0x4b, 0x9e, 0x13, 0x31, 0x1f, 0x07, 0xb1, 0x0a, 0x99, 0xaf, 0x79, 0x23, 0x05, 0xc3, 0x5d, + 0xd8, 0x68, 0x45, 0x7e, 0x14, 0x0b, 0xd1, 0xc2, 0x17, 0xe6, 0x95, 0xe4, 0x83, 0x44, 0x8a, 0xa5, + 0xb3, 0xe9, 0xe1, 0x67, 0x03, 0xaf, 0xd5, 0x44, 0x5f, 0x04, 0xa0, 0xcb, 0x47, 0xe8, 0x12, 0x46, + 0xf2, 0x0f, 0x4f, 0x7a, 0xaa, 0xb4, 0x32, 0xad, 0x3a, 0x99, 0x9f, 0x5e, 0x55, 0x11, 0xc1, 0x1a, + 0x41, 0xfb, 0x87, 0x4a, 0xf0, 0x78, 0x8f, 0x33, 0x12, 0x2d, 0x98, 0x4f, 0xa0, 0xcf, 0xa6, 0x85, + 0xeb, 0xb9, 0xcc, 0xca, 0x86, 0xb4, 0x9d, 0x5a, 0x8a, 0x85, 0x0f, 0xbc, 0x14, 0xbf, 0xdf, 0xd2, + 0xd4, 0x1e, 0xdc, 0x50, 0xef, 0x73, 0xc7, 0x3c, 0xfb, 0x4f, 0x50, 0x0f, 0xb2, 0x99, 0xa1, 0x4c, + 0xb8, 0x3e, 0x70, 0x77, 0x06, 0xd6, 0x2e, 0x9c, 0xae, 0xf2, 0xf7, 0x2b, 0x16, 0x3c, 0x99, 0xd9, + 0x5f, 0xc3, 0x64, 0xe3, 0x1a, 0x94, 0x9b, 0xb4, 0x50, 0x73, 0xcb, 0x4a, 0xfc, 0x55, 0x25, 0x00, + 0x27, 0x38, 0x86, 0x65, 0x46, 0xa1, 0xaf, 0x65, 0xc6, 0x3f, 0xb3, 0xa0, 0x6b, 0x7f, 0x9c, 0xc2, + 0x41, 0x5d, 0x33, 0x0f, 0xea, 0x8f, 0x0f, 0x32, 0x97, 0x39, 0x67, 0xf4, 0x7f, 0x9a, 0x82, 0xf3, + 0x39, 0x7e, 0x18, 0x7b, 0x30, 0xb3, 0xd5, 0x24, 0xa6, 0xc3, 0x9b, 0xf8, 0x98, 0x4c, 0xdf, 0xc0, + 0x9e, 0xde, 0x71, 0x2c, 0xf5, 0xce, 0x4c, 0x17, 0x0a, 0xee, 0x6e, 0x02, 0x7d, 0xc5, 0x82, 0xb3, + 0xce, 0xfd, 0xa8, 0x2b, 0xc1, 0xa2, 0x58, 0x33, 0x2f, 0x65, 0x2a, 0x41, 0xfa, 0x24, 0x64, 0xe4, + 0xb9, 0x88, 0xb2, 0xb0, 0x70, 0x66, 0x5b, 0x08, 0x8b, 0xf0, 0x98, 0x94, 0x9d, 0xef, 0xe1, 0x92, + 0x99, 0xe5, 0x30, 0xc3, 0x8f, 0x6c, 0x09, 0xc1, 0x8a, 0x0e, 0xba, 0x07, 0xe5, 0x2d, 0xe9, 0xc5, + 0x26, 0xae, 0x84, 0xcc, 0x3b, 0x36, 0xd3, 0xd5, 0x8d, 0x3f, 0x4b, 0x2a, 0x10, 0x4e, 0x48, 0xa1, + 0xd7, 0xa1, 0xe8, 0x6f, 0x46, 0xbd, 0x92, 0xf8, 0xa4, 0x2c, 0x99, 0xb8, 0xbb, 0xf3, 0xda, 0x4a, + 0x03, 0xd3, 0x8a, 0xe8, 0x26, 0x14, 0xc3, 0x8d, 0x96, 0xd0, 0xdb, 0x65, 0x9e, 0xdc, 0x78, 0xb1, + 0x9a, 0xbd, 0x48, 0x38, 0x25, 0xbc, 0x58, 0xc5, 0x94, 0x04, 0xaa, 0xc3, 0x10, 0x73, 0x59, 0x10, + 0xb7, 0x40, 0x26, 0xbf, 0xdb, 0xc3, 0xf5, 0x87, 0xfb, 0x44, 0x33, 0x04, 0xcc, 0x09, 0xa1, 0x75, + 0x18, 0x6e, 0xb2, 0x84, 0x2f, 0x22, 0x22, 0xf3, 0xa7, 0x32, 0x35, 0x74, 0x3d, 0x32, 0xe1, 0x08, + 0x85, 0x15, 0xc3, 0xc0, 0x82, 0x16, 0xa3, 0x4a, 0xda, 0xdb, 0x9b, 0x11, 0x93, 0xf0, 0xf3, 0xa8, + 0xf6, 0x48, 0xf0, 0x24, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x42, 0x61, 0xb3, 0x29, 0x3c, + 0x1a, 0x32, 0x55, 0x75, 0xa6, 0xc7, 0xfa, 0xe2, 0xf0, 0xe1, 0x41, 0xa5, 0xb0, 0xb2, 0x84, 0x0b, + 0x9b, 0x4d, 0xb4, 0x06, 0x23, 0x9b, 0xdc, 0xc7, 0x55, 0x68, 0xe3, 0x9e, 0xce, 0x76, 0xbf, 0xed, + 0x72, 0x83, 0xe5, 0x96, 0xf8, 0x02, 0x80, 0x25, 0x11, 0x16, 0x63, 0x52, 0xf9, 0xea, 0x8a, 0x60, + 0xcb, 0xf3, 0xc7, 0xf3, 0xaf, 0xe6, 0xb7, 0x72, 0xe2, 0xf1, 0x8b, 0x35, 0x8a, 0xe8, 0xcb, 0x50, + 0x76, 0x64, 0x6a, 0x3f, 0x11, 0x8c, 0xe2, 0xc5, 0xcc, 0x8d, 0xd9, 0x3b, 0xeb, 0x21, 0x5f, 0xd5, + 0x0a, 0x09, 0x27, 0x44, 0xd1, 0x0e, 0x4c, 0xec, 0x45, 0xed, 0x6d, 0x22, 0x37, 0x32, 0x8b, 0x4d, + 0x91, 0x73, 0x71, 0xdd, 0x13, 0x88, 0x6e, 0x18, 0x77, 0x1c, 0xaf, 0xeb, 0xec, 0x61, 0x6f, 0xd9, + 0xf7, 0x74, 0x62, 0xd8, 0xa4, 0x4d, 0x87, 0xff, 0xbd, 0x4e, 0xb0, 0xb1, 0x1f, 0x13, 0x11, 0x9d, + 0x39, 0x73, 0xf8, 0xdf, 0xe4, 0x28, 0xdd, 0xc3, 0x2f, 0x00, 0x58, 0x12, 0xa1, 0x5b, 0xdd, 0x91, + 0x69, 0x33, 0x59, 0x54, 0xe6, 0x9c, 0xad, 0x9e, 0x99, 0x5b, 0x53, 0x1b, 0x14, 0x76, 0x46, 0x26, + 0xa4, 0xd8, 0xd9, 0xd8, 0xde, 0x0e, 0xe2, 0xc0, 0x4f, 0x9d, 0xcb, 0x33, 0xf9, 0x67, 0x63, 0x3d, + 0x03, 0xbf, 0xfb, 0x6c, 0xcc, 0xc2, 0xc2, 0x99, 0x6d, 0xa1, 0x16, 0x4c, 0xb6, 0x83, 0x30, 0xbe, + 0x1f, 0x84, 0x72, 0x7d, 0xa1, 0x1e, 0xda, 0x04, 0x03, 0x53, 0xb4, 0xc8, 0xa2, 0x85, 0x9b, 0x10, + 0x9c, 0xa2, 0x89, 0x3e, 0x0f, 0x23, 0x51, 0xd3, 0xf1, 0x48, 0xed, 0xce, 0xec, 0x99, 0xfc, 0x4b, + 0xa7, 0xc1, 0x51, 0x72, 0x56, 0x17, 0x9b, 0x1c, 0x81, 0x82, 0x25, 0x39, 0xb4, 0x02, 0x43, 0x2c, + 0xe4, 0x3f, 0x0b, 0x2c, 0x9d, 0x13, 0xf4, 0xa8, 0xcb, 0x66, 0x94, 0x9f, 0x4d, 0xac, 0x18, 0xf3, + 0xea, 0x74, 0x0f, 0x08, 0xa6, 0x3a, 0x88, 0x66, 0xcf, 0xe5, 0xef, 0x01, 0xc1, 0x8b, 0xdf, 0x69, + 0xf4, 0xda, 0x03, 0x0a, 0x09, 0x27, 0x44, 0xe9, 0xc9, 0x4c, 0x4f, 0xd3, 0xf3, 0x3d, 0xcc, 0x58, + 0x72, 0xcf, 0x52, 0x76, 0x32, 0xd3, 0x93, 0x94, 0x92, 0xb0, 0x7f, 0x77, 0xa4, 0x9b, 0x53, 0x61, + 0x62, 0xd8, 0x9f, 0xb7, 0xba, 0x5e, 0xe8, 0x3e, 0x3d, 0xa8, 0x56, 0xe8, 0x04, 0x79, 0xd4, 0xaf, + 0x58, 0x70, 0xbe, 0x9d, 0xf9, 0x21, 0xe2, 0xda, 0x1f, 0x4c, 0xb9, 0xc4, 0x3f, 0x5d, 0x05, 0x7f, + 0xcf, 0x86, 0xe3, 0x9c, 0x96, 0xd2, 0x72, 0x40, 0xf1, 0x03, 0xcb, 0x01, 0xab, 0x30, 0xca, 0x58, + 0xcb, 0x3e, 0x09, 0xd0, 0xd2, 0xe2, 0x10, 0x63, 0x20, 0x96, 0x44, 0x45, 0xac, 0x48, 0xa0, 0x1f, + 0xb0, 0xe0, 0x62, 0xba, 0xeb, 0x98, 0x30, 0xb0, 0x08, 0x95, 0xce, 0x25, 0xc0, 0x15, 0xf1, 0xfd, + 0x17, 0xeb, 0xbd, 0x90, 0x8f, 0xfa, 0x21, 0xe0, 0xde, 0x8d, 0xa1, 0x6a, 0x86, 0x08, 0x3a, 0x6c, + 0xaa, 0xdd, 0x07, 0x10, 0x43, 0x5f, 0x82, 0xf1, 0xdd, 0xa0, 0xe3, 0xc7, 0xc2, 0xea, 0x45, 0xf8, + 0x20, 0xb2, 0x67, 0xe6, 0x55, 0xad, 0x1c, 0x1b, 0x58, 0x29, 0xe1, 0x75, 0xf4, 0xa1, 0x85, 0xd7, + 0x77, 0x52, 0x69, 0xae, 0xcb, 0xf9, 0x21, 0xf9, 0x84, 0x9c, 0x7f, 0x8c, 0x64, 0xd7, 0xa7, 0x2b, + 0x11, 0xfd, 0xb4, 0x95, 0xc1, 0xca, 0x73, 0x19, 0xf9, 0x35, 0x53, 0x46, 0xbe, 0x92, 0x96, 0x91, + 0xbb, 0x54, 0xae, 0x86, 0x78, 0x3c, 0x78, 0x5c, 0xe7, 0x41, 0x03, 0xa5, 0xd9, 0x1e, 0x5c, 0xee, + 0x77, 0x2d, 0x31, 0xf3, 0xa7, 0x96, 0x7a, 0x60, 0x4b, 0xcc, 0x9f, 0x5a, 0xb5, 0x2a, 0x66, 0x90, + 0x41, 0x23, 0x69, 0xd8, 0xff, 0xd5, 0x82, 0x62, 0x3d, 0x68, 0x9d, 0x82, 0x0a, 0xf9, 0x73, 0x86, + 0x0a, 0xf9, 0xf1, 0x9c, 0xf4, 0xe3, 0xb9, 0x0a, 0xe3, 0xe5, 0x94, 0xc2, 0xf8, 0x62, 0x1e, 0x81, + 0xde, 0xea, 0xe1, 0x9f, 0x28, 0x82, 0x9e, 0x2c, 0x1d, 0xfd, 0xc6, 0xc3, 0xd8, 0x1e, 0x17, 0x7b, + 0xe5, 0x4f, 0x17, 0x94, 0x99, 0xd5, 0x94, 0x74, 0xab, 0xfb, 0x53, 0x66, 0x82, 0xfc, 0x16, 0x71, + 0xb7, 0xb6, 0x63, 0xd2, 0x4a, 0x7f, 0xce, 0xe9, 0x99, 0x20, 0xff, 0x67, 0x0b, 0xa6, 0x52, 0xad, + 0x23, 0x0f, 0x26, 0x3c, 0x5d, 0xff, 0x27, 0xd6, 0xe9, 0x43, 0xa9, 0x0e, 0x85, 0x09, 0xa7, 0x56, + 0x84, 0x4d, 0xe2, 0x68, 0x1e, 0x40, 0xbd, 0xcf, 0x49, 0xbd, 0x17, 0xe3, 0xfa, 0xd5, 0x03, 0x5e, + 0x84, 0x35, 0x0c, 0xf4, 0x32, 0x8c, 0xc5, 0x41, 0x3b, 0xf0, 0x82, 0xad, 0xfd, 0x5b, 0x44, 0xc6, + 0x6e, 0x51, 0x86, 0x59, 0xeb, 0x09, 0x08, 0xeb, 0x78, 0xf6, 0x4f, 0x15, 0x21, 0x9d, 0x60, 0xff, + 0x9b, 0x6b, 0xf2, 0xa3, 0xb9, 0x26, 0xbf, 0x61, 0xc1, 0x34, 0x6d, 0x9d, 0x19, 0x89, 0xc8, 0xcb, + 0x56, 0xe5, 0x97, 0xb1, 0x7a, 0xe4, 0x97, 0xb9, 0x42, 0xcf, 0xae, 0x56, 0xd0, 0x89, 0x85, 0xde, + 0x4c, 0x3b, 0x9c, 0x68, 0x29, 0x16, 0x50, 0x81, 0x47, 0xc2, 0x50, 0x78, 0x3e, 0xe9, 0x78, 0x24, + 0x0c, 0xb1, 0x80, 0xca, 0xf4, 0x33, 0xa5, 0x9c, 0xf4, 0x33, 0x2c, 0x12, 0x9d, 0x30, 0x27, 0x10, + 0x6c, 0x8f, 0x16, 0x89, 0x4e, 0xda, 0x19, 0x24, 0x38, 0xf6, 0xcf, 0x15, 0x61, 0xbc, 0x1e, 0xb4, + 0x92, 0x17, 0xb2, 0x97, 0x8c, 0x17, 0xb2, 0xcb, 0xa9, 0x17, 0xb2, 0x69, 0x1d, 0xf7, 0x9b, 0xef, + 0x61, 0x1f, 0xd6, 0x7b, 0xd8, 0x3f, 0xb5, 0xd8, 0xac, 0x55, 0xd7, 0x1a, 0x22, 0xfd, 0xed, 0x0b, + 0x30, 0xc6, 0x0e, 0x24, 0xe6, 0x6a, 0x27, 0x9f, 0x8d, 0x58, 0x64, 0xf9, 0xb5, 0xa4, 0x18, 0xeb, + 0x38, 0xe8, 0x2a, 0x8c, 0x46, 0xc4, 0x09, 0x9b, 0xdb, 0xea, 0x8c, 0x13, 0x8f, 0x2a, 0xbc, 0x0c, + 0x2b, 0x28, 0x7a, 0x33, 0x09, 0x82, 0x56, 0xcc, 0x4f, 0xe4, 0xaa, 0xf7, 0x87, 0x6f, 0x91, 0xfc, + 0xc8, 0x67, 0xf6, 0x5b, 0x80, 0xba, 0xf1, 0x07, 0x08, 0x77, 0x54, 0x31, 0xc3, 0x1d, 0x95, 0xbb, + 0x42, 0x1d, 0xfd, 0xb1, 0x05, 0x93, 0xf5, 0xa0, 0x45, 0xb7, 0xee, 0x9f, 0xa5, 0x7d, 0xaa, 0x47, + 0x80, 0x1c, 0xee, 0x11, 0x01, 0xf2, 0xef, 0x58, 0x30, 0x52, 0x0f, 0x5a, 0xa7, 0xa0, 0x6d, 0x7f, + 0xcd, 0xd4, 0xb6, 0x3f, 0x96, 0xb3, 0x24, 0x72, 0x14, 0xec, 0xbf, 0x50, 0x84, 0x09, 0xda, 0xcf, + 0x60, 0x4b, 0xce, 0x92, 0x31, 0x22, 0xd6, 0x00, 0x23, 0x42, 0xd9, 0xdc, 0xc0, 0xf3, 0x82, 0xfb, + 0xe9, 0x19, 0x5b, 0x61, 0xa5, 0x58, 0x40, 0xd1, 0x73, 0x30, 0xda, 0x0e, 0xc9, 0x9e, 0x1b, 0x08, + 0xfe, 0x51, 0x7b, 0xbb, 0xa8, 0x8b, 0x72, 0xac, 0x30, 0xa8, 0xdc, 0x15, 0xb9, 0x7e, 0x93, 0xc8, + 0x2c, 0xd2, 0x25, 0x96, 0x68, 0x8a, 0x87, 0x76, 0xd6, 0xca, 0xb1, 0x81, 0x85, 0xde, 0x82, 0x32, + 0xfb, 0xcf, 0x4e, 0x94, 0xe3, 0x27, 0xc6, 0x11, 0xf9, 0x14, 0x04, 0x01, 0x9c, 0xd0, 0x42, 0xd7, + 0x01, 0x62, 0x19, 0xfe, 0x37, 0x12, 0x51, 0x6b, 0x14, 0xaf, 0xad, 0x02, 0x03, 0x47, 0x58, 0xc3, + 0x42, 0xcf, 0x42, 0x39, 0x76, 0x5c, 0xef, 0xb6, 0xeb, 0x93, 0x88, 0xa9, 0x9c, 0x8b, 0x32, 0x5d, + 0x82, 0x28, 0xc4, 0x09, 0x9c, 0xf2, 0x3a, 0xcc, 0xa5, 0x9b, 0xa7, 0xd5, 0x1a, 0x65, 0xd8, 0x8c, + 0xd7, 0xb9, 0xad, 0x4a, 0xb1, 0x86, 0x61, 0xbf, 0x02, 0xe7, 0xea, 0x41, 0xab, 0x1e, 0x84, 0xf1, + 0x4a, 0x10, 0xde, 0x77, 0xc2, 0x96, 0x9c, 0xbf, 0x8a, 0x8c, 0xdc, 0x4f, 0xcf, 0x9e, 0x21, 0xbe, + 0x33, 0x8d, 0x98, 0xfc, 0x2f, 0x32, 0x6e, 0xe7, 0x98, 0xae, 0x1c, 0x4d, 0x76, 0xef, 0xaa, 0x0c, + 0x7a, 0x37, 0x9c, 0x98, 0xa0, 0x3b, 0x2c, 0xeb, 0x56, 0x72, 0x05, 0x89, 0xea, 0xcf, 0x68, 0x59, + 0xb7, 0x12, 0x60, 0xe6, 0x9d, 0x65, 0xd6, 0xb7, 0x7f, 0xb5, 0xc8, 0x4e, 0xa3, 0x54, 0x42, 0x39, + 0xf4, 0x25, 0x98, 0x8c, 0xc8, 0x6d, 0xd7, 0xef, 0x3c, 0x90, 0x42, 0x78, 0x0f, 0x67, 0x9c, 0xc6, + 0xb2, 0x8e, 0xc9, 0x55, 0x79, 0x66, 0x19, 0x4e, 0x51, 0xa3, 0xf3, 0x14, 0x76, 0xfc, 0x85, 0xe8, + 0x6e, 0x44, 0x42, 0x91, 0xd0, 0x8c, 0xcd, 0x13, 0x96, 0x85, 0x38, 0x81, 0xd3, 0x75, 0xc9, 0xfe, + 0xac, 0x05, 0x3e, 0x0e, 0x82, 0x58, 0xae, 0x64, 0x96, 0x12, 0x47, 0x2b, 0xc7, 0x06, 0x16, 0x5a, + 0x01, 0x14, 0x75, 0xda, 0x6d, 0x8f, 0x3d, 0xe7, 0x3b, 0xde, 0x8d, 0x30, 0xe8, 0xb4, 0xf9, 0x5b, + 0x67, 0x71, 0xf1, 0x3c, 0xbd, 0xc2, 0x1a, 0x5d, 0x50, 0x9c, 0x51, 0x83, 0x9e, 0x3e, 0x9b, 0x11, + 0xfb, 0xcd, 0x56, 0x77, 0x51, 0xa8, 0xd7, 0x1b, 0xac, 0x08, 0x4b, 0x18, 0x5d, 0x4c, 0xac, 0x79, + 0x8e, 0x39, 0x9c, 0x2c, 0x26, 0xac, 0x4a, 0xb1, 0x86, 0x81, 0x96, 0x61, 0x24, 0xda, 0x8f, 0x9a, + 0xb1, 0x88, 0xb1, 0x94, 0x93, 0x9a, 0xb2, 0xc1, 0x50, 0xb4, 0x74, 0x09, 0xbc, 0x0a, 0x96, 0x75, + 0xed, 0xef, 0x62, 0x97, 0x21, 0x4b, 0x7f, 0x15, 0x77, 0x42, 0x82, 0x76, 0x61, 0xa2, 0xcd, 0xa6, + 0x5c, 0x04, 0x67, 0x16, 0xf3, 0xf6, 0xd2, 0x80, 0x52, 0xed, 0x7d, 0x7a, 0xd0, 0x28, 0xad, 0x13, + 0x13, 0x17, 0xea, 0x3a, 0x39, 0x6c, 0x52, 0xb7, 0xff, 0xd5, 0x0c, 0x3b, 0x73, 0x1b, 0x5c, 0x54, + 0x1d, 0x11, 0x06, 0xc5, 0x82, 0x2f, 0x9f, 0xcb, 0xd7, 0x99, 0x24, 0x5f, 0x24, 0x8c, 0x92, 0xb1, + 0xac, 0x8b, 0xde, 0x64, 0x6f, 0xd3, 0xfc, 0xa0, 0xeb, 0x97, 0x85, 0x98, 0x63, 0x19, 0xcf, 0xd0, + 0xa2, 0x22, 0xd6, 0x88, 0xa0, 0xdb, 0x30, 0x21, 0xb2, 0x25, 0x09, 0xa5, 0x58, 0xd1, 0x50, 0x7a, + 0x4c, 0x60, 0x1d, 0x78, 0x94, 0x2e, 0xc0, 0x66, 0x65, 0xb4, 0x05, 0x17, 0xb5, 0xd4, 0x81, 0x37, + 0x42, 0x87, 0xbd, 0x57, 0xba, 0x6c, 0x13, 0x69, 0xe7, 0xe6, 0x93, 0x87, 0x07, 0x95, 0x8b, 0xeb, + 0xbd, 0x10, 0x71, 0x6f, 0x3a, 0xe8, 0x0e, 0x9c, 0xe3, 0x7e, 0x7b, 0x55, 0xe2, 0xb4, 0x3c, 0xd7, + 0x57, 0x07, 0x33, 0x5f, 0x87, 0x17, 0x0e, 0x0f, 0x2a, 0xe7, 0x16, 0xb2, 0x10, 0x70, 0x76, 0x3d, + 0xf4, 0x1a, 0x94, 0x5b, 0x7e, 0x24, 0xc6, 0x60, 0xd8, 0xc8, 0x8a, 0x59, 0xae, 0xae, 0x35, 0xd4, + 0xf7, 0x27, 0x7f, 0x70, 0x52, 0x01, 0x6d, 0x71, 0xc5, 0x98, 0x92, 0x43, 0x47, 0xf2, 0x33, 0xa0, + 0x8b, 0x25, 0x61, 0x78, 0xee, 0x70, 0x8d, 0xb0, 0xb2, 0x7c, 0x35, 0x9c, 0x7a, 0x0c, 0xc2, 0xe8, + 0x0d, 0x40, 0x94, 0x51, 0x73, 0x9b, 0x64, 0xa1, 0xc9, 0x62, 0x64, 0x33, 0x3d, 0xe2, 0xa8, 0xe1, + 0x29, 0x81, 0x1a, 0x5d, 0x18, 0x38, 0xa3, 0x16, 0xba, 0x49, 0x0f, 0x32, 0xbd, 0x54, 0x58, 0xf0, + 0x4a, 0xe6, 0x7e, 0xb6, 0x4a, 0xda, 0x21, 0x69, 0x3a, 0x31, 0x69, 0x99, 0x14, 0x71, 0xaa, 0x1e, + 0xbd, 0x4b, 0x55, 0xba, 0x1c, 0x30, 0x03, 0x61, 0x74, 0xa7, 0xcc, 0xa1, 0x72, 0xf1, 0x76, 0x10, + 0xc5, 0x6b, 0x24, 0xbe, 0x1f, 0x84, 0x3b, 0x22, 0xee, 0x58, 0x12, 0x02, 0x33, 0x01, 0x61, 0x1d, + 0x8f, 0xf2, 0xc1, 0xec, 0x71, 0xb8, 0x56, 0x65, 0x2f, 0x74, 0xa3, 0xc9, 0x3e, 0xb9, 0xc9, 0x8b, + 0xb1, 0x84, 0x4b, 0xd4, 0x5a, 0x7d, 0x89, 0xbd, 0xb6, 0xa5, 0x50, 0x6b, 0xf5, 0x25, 0x2c, 0xe1, + 0x88, 0x74, 0x67, 0x1c, 0x9d, 0xcc, 0xd7, 0x6a, 0x76, 0x5f, 0x07, 0x03, 0x26, 0x1d, 0xf5, 0x61, + 0x5a, 0xe5, 0x3a, 0xe5, 0x01, 0xd9, 0xa2, 0xd9, 0x29, 0xb6, 0x48, 0x06, 0x8f, 0xe6, 0xa6, 0xf4, + 0xc4, 0xb5, 0x14, 0x25, 0xdc, 0x45, 0xdb, 0x08, 0x4d, 0x32, 0xdd, 0x37, 0xdd, 0xd1, 0x35, 0x28, + 0x47, 0x9d, 0x8d, 0x56, 0xb0, 0xeb, 0xb8, 0x3e, 0x7b, 0x1c, 0xd3, 0x98, 0xac, 0x86, 0x04, 0xe0, + 0x04, 0x07, 0xad, 0xc0, 0xa8, 0x23, 0x95, 0xc0, 0x28, 0x3f, 0x56, 0x81, 0x52, 0xfd, 0x72, 0xf7, + 0x5d, 0xa9, 0xf6, 0x55, 0x75, 0xd1, 0xab, 0x30, 0x21, 0xbc, 0xb5, 0x78, 0x04, 0x07, 0xf6, 0x78, + 0xa5, 0x99, 0xe3, 0x37, 0x74, 0x20, 0x36, 0x71, 0xd1, 0x17, 0x61, 0x92, 0x52, 0x49, 0x0e, 0xb6, + 0xd9, 0xb3, 0x83, 0x9c, 0x88, 0x5a, 0x1a, 0x0b, 0xbd, 0x32, 0x4e, 0x11, 0x43, 0x2d, 0x78, 0xc2, + 0xe9, 0xc4, 0x01, 0x53, 0xa4, 0x9b, 0xeb, 0x7f, 0x3d, 0xd8, 0x21, 0x3e, 0x7b, 0xc3, 0x1a, 0x5d, + 0xbc, 0x7c, 0x78, 0x50, 0x79, 0x62, 0xa1, 0x07, 0x1e, 0xee, 0x49, 0x05, 0xdd, 0x85, 0xb1, 0x38, + 0xf0, 0x98, 0x61, 0x3c, 0x65, 0x25, 0xce, 0xe7, 0x87, 0xf6, 0x59, 0x57, 0x68, 0xba, 0x12, 0x49, + 0x55, 0xc5, 0x3a, 0x1d, 0xb4, 0xce, 0xf7, 0x18, 0x0b, 0x7a, 0x4a, 0xa2, 0xd9, 0xc7, 0xf2, 0x07, + 0x46, 0xc5, 0x46, 0x35, 0xb7, 0xa0, 0xa8, 0x89, 0x75, 0x32, 0xe8, 0x06, 0xcc, 0xb4, 0x43, 0x37, + 0x60, 0x0b, 0x5b, 0x3d, 0x62, 0xcc, 0x9a, 0x99, 0x0b, 0xea, 0x69, 0x04, 0xdc, 0x5d, 0x87, 0x0a, + 0x99, 0xb2, 0x70, 0xf6, 0x02, 0x4f, 0x83, 0xc5, 0x19, 0x6f, 0x5e, 0x86, 0x15, 0x14, 0xad, 0xb2, + 0x73, 0x99, 0x8b, 0x83, 0xb3, 0x73, 0xf9, 0x31, 0x1e, 0x74, 0xb1, 0x91, 0xf3, 0x4b, 0xea, 0x2f, + 0x4e, 0x28, 0xd0, 0x7b, 0x23, 0xda, 0x76, 0x42, 0x52, 0x0f, 0x83, 0x26, 0xe1, 0x9d, 0xe1, 0x36, + 0xf9, 0x8f, 0xf3, 0xd8, 0x8c, 0xf4, 0xde, 0x68, 0x64, 0x21, 0xe0, 0xec, 0x7a, 0xa8, 0xa5, 0x65, + 0x7f, 0xa6, 0x6c, 0x68, 0x34, 0xfb, 0x44, 0x0f, 0x33, 0xa3, 0x14, 0xcf, 0x9a, 0xac, 0x45, 0xa3, + 0x38, 0xc2, 0x29, 0x9a, 0xe8, 0xdb, 0x60, 0x5a, 0x84, 0x32, 0x4a, 0xc6, 0xfd, 0x62, 0x62, 0xbf, + 0x88, 0x53, 0x30, 0xdc, 0x85, 0x3d, 0xf7, 0xad, 0x30, 0xd3, 0x75, 0xe3, 0x1c, 0x2b, 0xb0, 0xf8, + 0x1f, 0x0d, 0x41, 0x59, 0x29, 0xd3, 0xd1, 0x35, 0xf3, 0x8d, 0xe4, 0x42, 0xfa, 0x8d, 0x64, 0x94, + 0xf2, 0xf4, 0xfa, 0xb3, 0xc8, 0xba, 0x61, 0x56, 0x57, 0xc8, 0x4f, 0xe3, 0xa5, 0x73, 0xe5, 0x7d, + 0x5d, 0xf4, 0x34, 0xdd, 0x48, 0x71, 0xe0, 0xc7, 0x96, 0x52, 0x4f, 0x75, 0xcb, 0x80, 0x59, 0x74, + 0xd1, 0x53, 0x54, 0xb0, 0x69, 0xd5, 0xea, 0xe9, 0xb4, 0x92, 0x75, 0x5a, 0x88, 0x39, 0x8c, 0x09, + 0x80, 0x94, 0x3d, 0x62, 0x02, 0xe0, 0xc8, 0x43, 0x0a, 0x80, 0x92, 0x00, 0x4e, 0x68, 0x21, 0x0f, + 0x66, 0x9a, 0x66, 0x46, 0x50, 0xe5, 0x96, 0xf7, 0x54, 0xdf, 0xdc, 0x9c, 0x1d, 0x2d, 0xfd, 0xda, + 0x52, 0x9a, 0x0a, 0xee, 0x26, 0x8c, 0x5e, 0x85, 0xd1, 0xf7, 0x82, 0x88, 0x2d, 0x26, 0xc1, 0x23, + 0x48, 0xf7, 0xa5, 0xd1, 0x37, 0xef, 0x34, 0x58, 0xf9, 0xd1, 0x41, 0x65, 0xac, 0x1e, 0xb4, 0xe4, + 0x5f, 0xac, 0x2a, 0xa0, 0x07, 0x70, 0xce, 0x38, 0x59, 0x55, 0x77, 0x61, 0xf0, 0xee, 0x5e, 0x14, + 0xcd, 0x9d, 0xab, 0x65, 0x51, 0xc2, 0xd9, 0x0d, 0xd0, 0xe3, 0xca, 0x0f, 0x44, 0x36, 0x5d, 0xc9, + 0x87, 0x30, 0x76, 0xa3, 0xac, 0x3b, 0xaf, 0xa7, 0x10, 0x70, 0x77, 0x1d, 0xfb, 0x97, 0xf9, 0xdb, + 0x83, 0xd0, 0x50, 0x92, 0xa8, 0xe3, 0x9d, 0x46, 0xb2, 0xa6, 0x65, 0x43, 0x79, 0xfa, 0xd0, 0xef, + 0x5b, 0xbf, 0x6e, 0xb1, 0xf7, 0xad, 0x75, 0xb2, 0xdb, 0xf6, 0xa8, 0x9c, 0xfc, 0xe8, 0x3b, 0xfe, + 0x26, 0x8c, 0xc6, 0xa2, 0xb5, 0x5e, 0xf9, 0xa5, 0xb4, 0x4e, 0xb1, 0x37, 0x3e, 0xc5, 0xa1, 0xc8, + 0x52, 0xac, 0xc8, 0xd8, 0xff, 0x98, 0xcf, 0x80, 0x84, 0x9c, 0x82, 0x22, 0xab, 0x6a, 0x2a, 0xb2, + 0x2a, 0x7d, 0xbe, 0x20, 0x47, 0xa1, 0xf5, 0x8f, 0xcc, 0x7e, 0x33, 0x61, 0xf0, 0xa3, 0xfe, 0xb0, + 0x6a, 0xff, 0xb0, 0x05, 0x67, 0xb3, 0x2c, 0x91, 0x28, 0x57, 0xc9, 0x45, 0x51, 0xf5, 0xd0, 0xac, + 0x46, 0xf0, 0x9e, 0x28, 0xc7, 0x0a, 0x63, 0xe0, 0xd4, 0x0d, 0xc7, 0x8b, 0xef, 0x76, 0x07, 0x26, + 0xea, 0x21, 0xd1, 0xee, 0x80, 0xd7, 0xb9, 0x1f, 0x1c, 0xef, 0xcf, 0x73, 0xc7, 0xf6, 0x81, 0xb3, + 0x7f, 0xa6, 0x00, 0x67, 0xf9, 0x4b, 0xd1, 0xc2, 0x5e, 0xe0, 0xb6, 0xea, 0x41, 0x4b, 0xa4, 0xdd, + 0x78, 0x1b, 0xc6, 0xdb, 0x9a, 0xfe, 0xa0, 0x57, 0x84, 0x29, 0x5d, 0xcf, 0x90, 0xc8, 0x71, 0x7a, + 0x29, 0x36, 0x68, 0xa1, 0x16, 0x8c, 0x93, 0x3d, 0xb7, 0xa9, 0x9e, 0x1b, 0x0a, 0xc7, 0xbe, 0x1b, + 0x54, 0x2b, 0xcb, 0x1a, 0x1d, 0x6c, 0x50, 0x7d, 0x04, 0x99, 0xd8, 0xec, 0x1f, 0xb1, 0xe0, 0xb1, + 0x9c, 0x78, 0x54, 0xb4, 0xb9, 0xfb, 0xec, 0x4d, 0x4e, 0x24, 0x75, 0x52, 0xcd, 0xf1, 0x97, 0x3a, + 0x2c, 0xa0, 0xe8, 0xf3, 0x00, 0xfc, 0xa5, 0x8d, 0x8a, 0x35, 0xfd, 0x02, 0xf7, 0x18, 0x31, 0x47, + 0xb4, 0x58, 0x11, 0xb2, 0x3e, 0xd6, 0x68, 0xd9, 0x3f, 0x59, 0x84, 0x21, 0xf6, 0xb2, 0x83, 0x56, + 0x60, 0x64, 0x9b, 0x47, 0x5f, 0x1e, 0x24, 0xd0, 0x73, 0x22, 0x1f, 0xf2, 0x02, 0x2c, 0x2b, 0xa3, + 0x55, 0x38, 0xc3, 0xa3, 0x57, 0x7b, 0x55, 0xe2, 0x39, 0xfb, 0x52, 0xcd, 0xc0, 0x13, 0x21, 0xa9, + 0xb8, 0x17, 0xb5, 0x6e, 0x14, 0x9c, 0x55, 0x0f, 0xbd, 0x0e, 0x93, 0x94, 0x2f, 0x0b, 0x3a, 0xb1, + 0xa4, 0xc4, 0xe3, 0x56, 0x2b, 0x46, 0x70, 0xdd, 0x80, 0xe2, 0x14, 0x36, 0x15, 0x98, 0xda, 0x5d, + 0x0a, 0x95, 0xa1, 0x44, 0x60, 0x32, 0x95, 0x28, 0x26, 0x2e, 0x33, 0x41, 0xea, 0x30, 0x83, 0xab, + 0xf5, 0xed, 0x90, 0x44, 0xdb, 0x81, 0xd7, 0x12, 0x79, 0xb4, 0x13, 0x13, 0xa4, 0x14, 0x1c, 0x77, + 0xd5, 0xa0, 0x54, 0x36, 0x1d, 0xd7, 0xeb, 0x84, 0x24, 0xa1, 0x32, 0x6c, 0x52, 0x59, 0x49, 0xc1, + 0x71, 0x57, 0x0d, 0xba, 0x8e, 0xce, 0x89, 0xc4, 0xd6, 0xd2, 0x1b, 0x5f, 0xd9, 0x95, 0x8d, 0x48, + 0xbf, 0xa4, 0x1e, 0xe1, 0x68, 0x84, 0xe5, 0x8d, 0x4a, 0x8d, 0xad, 0xe9, 0x01, 0x85, 0x47, 0x92, + 0xa4, 0xf2, 0x30, 0xe9, 0x95, 0x7f, 0xd7, 0x82, 0x33, 0x19, 0xf6, 0xab, 0xfc, 0xa8, 0xda, 0x72, + 0xa3, 0x58, 0x25, 0x7b, 0xd1, 0x8e, 0x2a, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x0f, 0xfc, 0x30, 0x4c, + 0x1f, 0x80, 0xc2, 0x3e, 0x4c, 0x40, 0x8f, 0x77, 0x00, 0xa2, 0xcb, 0x50, 0xea, 0x44, 0x44, 0x06, + 0x92, 0x52, 0xe7, 0x37, 0xd3, 0x0c, 0x33, 0x08, 0x65, 0x4d, 0xb7, 0x94, 0x52, 0x56, 0x63, 0x4d, + 0xb9, 0xa6, 0x95, 0xc3, 0xec, 0xaf, 0x16, 0xe1, 0x42, 0xae, 0xa5, 0x3a, 0xed, 0xd2, 0x6e, 0xe0, + 0xbb, 0x71, 0xa0, 0x5e, 0x0d, 0x79, 0x28, 0x13, 0xd2, 0xde, 0x5e, 0x15, 0xe5, 0x58, 0x61, 0xa0, + 0x2b, 0x32, 0xc5, 0x7a, 0x3a, 0x9d, 0xcd, 0x62, 0xd5, 0xc8, 0xb2, 0x3e, 0x68, 0xaa, 0xb0, 0xa7, + 0xa0, 0xd4, 0x0e, 0x02, 0x2f, 0x7d, 0x18, 0xd1, 0xee, 0x06, 0x81, 0x87, 0x19, 0x10, 0x7d, 0x42, + 0x8c, 0x43, 0xea, 0x99, 0x0c, 0x3b, 0xad, 0x20, 0xd2, 0x06, 0xe3, 0x19, 0x18, 0xd9, 0x21, 0xfb, + 0xa1, 0xeb, 0x6f, 0xa5, 0x9f, 0x4f, 0x6f, 0xf1, 0x62, 0x2c, 0xe1, 0x66, 0x36, 0x87, 0x91, 0x93, + 0xce, 0xf1, 0x35, 0xda, 0xf7, 0x6a, 0xfb, 0xfe, 0x22, 0x4c, 0xe1, 0xc5, 0xea, 0x37, 0x27, 0xe2, + 0x6e, 0xf7, 0x44, 0x9c, 0x74, 0x8e, 0xaf, 0xfe, 0xb3, 0xf1, 0x0b, 0x16, 0x4c, 0xb1, 0x88, 0xc7, + 0x22, 0x80, 0x86, 0x1b, 0xf8, 0xa7, 0xc0, 0xba, 0x3d, 0x05, 0x43, 0x21, 0x6d, 0x34, 0x9d, 0xb8, + 0x87, 0xf5, 0x04, 0x73, 0x18, 0x7a, 0x02, 0x4a, 0xac, 0x0b, 0x74, 0xf2, 0xc6, 0x79, 0xce, 0x83, + 0xaa, 0x13, 0x3b, 0x98, 0x95, 0x32, 0xaf, 0x70, 0x4c, 0xda, 0x9e, 0xcb, 0x3b, 0x9d, 0x3c, 0x49, + 0x7c, 0x34, 0xbc, 0xc2, 0x33, 0xbb, 0xf6, 0xc1, 0xbc, 0xc2, 0xb3, 0x49, 0xf6, 0x16, 0x8b, 0xfe, + 0x5b, 0x01, 0x2e, 0x65, 0xd6, 0x1b, 0xd8, 0x2b, 0xbc, 0x77, 0xed, 0x93, 0xb1, 0x82, 0xc9, 0x36, + 0x4e, 0x29, 0x9e, 0xa2, 0x71, 0x4a, 0x69, 0x50, 0xce, 0x71, 0x68, 0x00, 0x67, 0xed, 0xcc, 0x21, + 0xfb, 0x88, 0x38, 0x6b, 0x67, 0xf6, 0x2d, 0x47, 0xac, 0xfb, 0x93, 0x42, 0xce, 0xb7, 0x30, 0x01, + 0xef, 0x2a, 0x3d, 0x67, 0x18, 0x30, 0x12, 0x9c, 0xf0, 0x38, 0x3f, 0x63, 0x78, 0x19, 0x56, 0x50, + 0xe4, 0x6a, 0x6e, 0xcf, 0x85, 0xfc, 0xb4, 0x8e, 0xb9, 0x4d, 0xcd, 0x9b, 0x2f, 0x48, 0x6a, 0x08, + 0x32, 0x5c, 0xa0, 0x57, 0x35, 0xa1, 0xbc, 0x38, 0xb8, 0x50, 0x3e, 0x9e, 0x2d, 0x90, 0xa3, 0x05, + 0x98, 0xda, 0x75, 0x7d, 0x96, 0xa6, 0xdf, 0x64, 0x45, 0x55, 0x14, 0x90, 0x55, 0x13, 0x8c, 0xd3, + 0xf8, 0x73, 0xaf, 0xc2, 0xc4, 0xc3, 0xab, 0x23, 0xbf, 0x51, 0x84, 0xc7, 0x7b, 0x6c, 0x7b, 0x7e, + 0xd6, 0x1b, 0x73, 0xa0, 0x9d, 0xf5, 0x5d, 0xf3, 0x50, 0x87, 0xb3, 0x9b, 0x1d, 0xcf, 0xdb, 0x67, + 0xf6, 0x9f, 0xa4, 0x25, 0x31, 0x04, 0xaf, 0xf8, 0x84, 0xcc, 0x32, 0xb1, 0x92, 0x81, 0x83, 0x33, + 0x6b, 0xa2, 0x37, 0x00, 0x05, 0x22, 0xa7, 0xec, 0x0d, 0xe2, 0x0b, 0xbd, 0x3c, 0x1b, 0xf8, 0x62, + 0xb2, 0x19, 0xef, 0x74, 0x61, 0xe0, 0x8c, 0x5a, 0x94, 0xe9, 0xa7, 0xb7, 0xd2, 0xbe, 0xea, 0x56, + 0x8a, 0xe9, 0xc7, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x06, 0xcc, 0x38, 0x7b, 0x8e, 0xcb, 0xa3, 0xe3, + 0x49, 0x02, 0x9c, 0xeb, 0x57, 0x4a, 0xb0, 0x85, 0x34, 0x02, 0xee, 0xae, 0x93, 0x72, 0x8c, 0x1e, + 0xce, 0x77, 0x8c, 0xee, 0x7d, 0x2e, 0xf6, 0xd3, 0xe9, 0xda, 0xff, 0xde, 0xa2, 0xd7, 0x57, 0x46, + 0x5e, 0x78, 0x3a, 0x0e, 0x4a, 0x37, 0xa9, 0xf9, 0x28, 0x9f, 0xd3, 0x2c, 0x3c, 0x12, 0x20, 0x36, + 0x71, 0xf9, 0x82, 0x88, 0x12, 0x27, 0x19, 0x83, 0x75, 0x17, 0x31, 0x0e, 0x14, 0x06, 0xfa, 0x02, + 0x8c, 0xb4, 0xdc, 0x3d, 0x37, 0x0a, 0x42, 0xb1, 0x59, 0x8e, 0xe9, 0x6a, 0x90, 0x9c, 0x83, 0x55, + 0x4e, 0x06, 0x4b, 0x7a, 0xf6, 0xf7, 0x17, 0x60, 0x42, 0xb6, 0xf8, 0x66, 0x27, 0x88, 0x9d, 0x53, + 0xb8, 0x96, 0x6f, 0x18, 0xd7, 0xf2, 0x27, 0x7a, 0x05, 0x7a, 0x60, 0x5d, 0xca, 0xbd, 0x8e, 0xef, + 0xa4, 0xae, 0xe3, 0xa7, 0xfb, 0x93, 0xea, 0x7d, 0x0d, 0xff, 0x13, 0x0b, 0x66, 0x0c, 0xfc, 0x53, + 0xb8, 0x0d, 0x56, 0xcc, 0xdb, 0xe0, 0xc9, 0xbe, 0xdf, 0x90, 0x73, 0x0b, 0x7c, 0x4f, 0x31, 0xd5, + 0x77, 0x76, 0xfa, 0xbf, 0x07, 0xa5, 0x6d, 0x27, 0x6c, 0xf5, 0x0a, 0x28, 0xdb, 0x55, 0x69, 0xfe, + 0xa6, 0x13, 0xb6, 0xf8, 0x19, 0xfe, 0x9c, 0xca, 0x44, 0xe9, 0x84, 0xad, 0xbe, 0x3e, 0x61, 0xac, + 0x29, 0xf4, 0x0a, 0x0c, 0x47, 0xcd, 0xa0, 0xad, 0x2c, 0x36, 0x2f, 0xf3, 0x2c, 0x95, 0xb4, 0xe4, + 0xe8, 0xa0, 0x82, 0xcc, 0xe6, 0x68, 0x31, 0x16, 0xf8, 0xe8, 0x6d, 0x98, 0x60, 0xbf, 0x94, 0xe5, + 0x42, 0x31, 0x3f, 0x8d, 0x41, 0x43, 0x47, 0xe4, 0x06, 0x30, 0x46, 0x11, 0x36, 0x49, 0xcd, 0x6d, + 0x41, 0x59, 0x7d, 0xd6, 0x23, 0xf5, 0xe5, 0xf9, 0x37, 0x45, 0x38, 0x93, 0xb1, 0xe6, 0x50, 0x64, + 0xcc, 0xc4, 0x0b, 0x03, 0x2e, 0xd5, 0x0f, 0x38, 0x17, 0x11, 0x93, 0x86, 0x5a, 0x62, 0x6d, 0x0d, + 0xdc, 0xe8, 0xdd, 0x88, 0xa4, 0x1b, 0xa5, 0x45, 0xfd, 0x1b, 0xa5, 0x8d, 0x9d, 0xda, 0x50, 0xd3, + 0x86, 0x54, 0x4f, 0x1f, 0xe9, 0x9c, 0xfe, 0x61, 0x11, 0xce, 0x66, 0xc5, 0x9e, 0x41, 0xdf, 0x99, + 0x4a, 0x57, 0xf3, 0xd2, 0xa0, 0x51, 0x6b, 0x78, 0x0e, 0x1b, 0x91, 0x7c, 0x79, 0xde, 0x4c, 0x60, + 0xd3, 0x77, 0x98, 0x45, 0x9b, 0xcc, 0x01, 0x34, 0xe4, 0x69, 0x86, 0xe4, 0xf1, 0xf1, 0xe9, 0x81, + 0x3b, 0x20, 0xf2, 0x13, 0x45, 0x29, 0x07, 0x50, 0x59, 0xdc, 0xdf, 0x01, 0x54, 0xb6, 0x3c, 0xe7, + 0xc2, 0x98, 0xf6, 0x35, 0x8f, 0x74, 0xc6, 0x77, 0xe8, 0x6d, 0xa5, 0xf5, 0xfb, 0x91, 0xce, 0xfa, + 0x8f, 0x58, 0x90, 0x32, 0x8f, 0x54, 0xea, 0x2e, 0x2b, 0x57, 0xdd, 0x75, 0x19, 0x4a, 0x61, 0xe0, + 0x91, 0x74, 0x06, 0x19, 0x1c, 0x78, 0x04, 0x33, 0x08, 0xc5, 0x88, 0x13, 0x65, 0xc7, 0xb8, 0x2e, + 0xc8, 0x09, 0x11, 0xed, 0x29, 0x18, 0xf2, 0xc8, 0x1e, 0xf1, 0xd2, 0xe1, 0xd9, 0x6f, 0xd3, 0x42, + 0xcc, 0x61, 0xf6, 0x2f, 0x94, 0xe0, 0x62, 0x4f, 0x17, 0x6a, 0x2a, 0x0e, 0x6d, 0x39, 0x31, 0xb9, + 0xef, 0xec, 0xa7, 0xe3, 0x28, 0xdf, 0xe0, 0xc5, 0x58, 0xc2, 0x99, 0xc5, 0x38, 0x8f, 0x9b, 0x98, + 0x52, 0x0e, 0x8a, 0x70, 0x89, 0x02, 0xfa, 0x08, 0x12, 0xcf, 0x5f, 0x07, 0x88, 0x22, 0x6f, 0xd9, + 0xa7, 0xdc, 0x5d, 0x4b, 0x98, 0xa2, 0x27, 0xf1, 0x35, 0x1b, 0xb7, 0x05, 0x04, 0x6b, 0x58, 0xa8, + 0x0a, 0xd3, 0xed, 0x30, 0x88, 0xb9, 0xae, 0xb5, 0xca, 0x0d, 0x85, 0x86, 0x4c, 0xef, 0xd5, 0x7a, + 0x0a, 0x8e, 0xbb, 0x6a, 0xa0, 0x97, 0x61, 0x4c, 0x78, 0xb4, 0xd6, 0x83, 0xc0, 0x13, 0x6a, 0x20, + 0x65, 0x76, 0xd2, 0x48, 0x40, 0x58, 0xc7, 0xd3, 0xaa, 0x31, 0x05, 0xee, 0x48, 0x66, 0x35, 0xae, + 0xc4, 0xd5, 0xf0, 0x52, 0x71, 0xa8, 0x46, 0x07, 0x8a, 0x43, 0x95, 0x28, 0xc6, 0xca, 0x03, 0xbf, + 0x59, 0x41, 0x5f, 0x55, 0xd2, 0xcf, 0x96, 0xe0, 0x8c, 0x58, 0x38, 0x8f, 0x7a, 0xb9, 0x3c, 0xa2, + 0xf4, 0xf8, 0xdf, 0x5c, 0x33, 0xa7, 0xbd, 0x66, 0x7e, 0xc0, 0x02, 0x93, 0xbd, 0x42, 0xff, 0x5f, + 0x6e, 0x20, 0xfa, 0x97, 0x73, 0xd9, 0xb5, 0x96, 0xbc, 0x40, 0x3e, 0x60, 0x48, 0x7a, 0xfb, 0xdf, + 0x59, 0xf0, 0x64, 0x5f, 0x8a, 0x68, 0x19, 0xca, 0x8c, 0x07, 0xd4, 0xa4, 0xb3, 0xa7, 0x95, 0x21, + 0xa1, 0x04, 0xe4, 0xb0, 0xa4, 0x49, 0x4d, 0xb4, 0xdc, 0x15, 0xf1, 0xff, 0x99, 0x8c, 0x88, 0xff, + 0xe7, 0x8c, 0xe1, 0x79, 0xc8, 0x90, 0xff, 0xbf, 0x5c, 0x84, 0x61, 0xbe, 0xe2, 0x4f, 0x41, 0x0c, + 0x5b, 0x11, 0x7a, 0xdb, 0x1e, 0x91, 0xa8, 0x78, 0x5f, 0xe6, 0xab, 0x4e, 0xec, 0x70, 0x36, 0x41, + 0xdd, 0x56, 0x89, 0x86, 0x17, 0xcd, 0x1b, 0xf7, 0xd9, 0x5c, 0x4a, 0x31, 0x09, 0x9c, 0x86, 0x76, + 0xbb, 0x7d, 0x09, 0x20, 0x62, 0x99, 0xf0, 0x29, 0x0d, 0x11, 0xd3, 0xec, 0x93, 0x3d, 0x5a, 0x6f, + 0x28, 0x64, 0xde, 0x87, 0x64, 0xa7, 0x2b, 0x00, 0xd6, 0x28, 0xce, 0x7d, 0x06, 0xca, 0x0a, 0xb9, + 0x9f, 0x16, 0x67, 0x5c, 0x67, 0x2e, 0x3e, 0x07, 0x53, 0xa9, 0xb6, 0x8e, 0xa5, 0x04, 0xfa, 0x45, + 0x0b, 0xa6, 0x78, 0x97, 0x97, 0xfd, 0x3d, 0x71, 0xa6, 0xbe, 0x0f, 0x67, 0xbd, 0x8c, 0xb3, 0x4d, + 0xcc, 0xe8, 0xe0, 0x67, 0xa1, 0x52, 0xfa, 0x64, 0x41, 0x71, 0x66, 0x1b, 0xe8, 0x2a, 0x5d, 0xb7, + 0xf4, 0xec, 0x72, 0x3c, 0xe1, 0x7d, 0x34, 0xce, 0xd7, 0x2c, 0x2f, 0xc3, 0x0a, 0x6a, 0xff, 0xb6, + 0x05, 0x33, 0xbc, 0xe7, 0xb7, 0xc8, 0xbe, 0xda, 0xe1, 0x1f, 0x66, 0xdf, 0x45, 0x12, 0x8e, 0x42, + 0x4e, 0x12, 0x0e, 0xfd, 0xd3, 0x8a, 0x3d, 0x3f, 0xed, 0x67, 0x2c, 0x10, 0x2b, 0xf0, 0x14, 0x44, + 0xf9, 0x6f, 0x35, 0x45, 0xf9, 0xb9, 0xfc, 0x45, 0x9d, 0x23, 0xc3, 0xff, 0xb1, 0x05, 0xd3, 0x1c, + 0x21, 0x79, 0x4b, 0xfe, 0x50, 0xe7, 0x61, 0x90, 0x6c, 0x7a, 0x2a, 0x7d, 0x76, 0xf6, 0x47, 0x19, + 0x93, 0x55, 0xea, 0x39, 0x59, 0x2d, 0xb9, 0x81, 0x8e, 0x91, 0x25, 0xf2, 0xd8, 0xc1, 0xac, 0xed, + 0x3f, 0xb0, 0x00, 0xf1, 0x66, 0x0c, 0xf6, 0x87, 0x32, 0x15, 0xac, 0x54, 0xbb, 0x2e, 0x92, 0xa3, + 0x46, 0x41, 0xb0, 0x86, 0x75, 0x22, 0xc3, 0x93, 0x32, 0x08, 0x28, 0xf6, 0x37, 0x08, 0x38, 0xc6, + 0x88, 0xfe, 0xef, 0x12, 0xa4, 0xdd, 0x01, 0xd0, 0x3d, 0x18, 0x6f, 0x3a, 0x6d, 0x67, 0xc3, 0xf5, + 0xdc, 0xd8, 0x25, 0x51, 0x2f, 0x4b, 0xa2, 0x25, 0x0d, 0x4f, 0x3c, 0xf5, 0x6a, 0x25, 0xd8, 0xa0, + 0x83, 0xe6, 0x01, 0xda, 0xa1, 0xbb, 0xe7, 0x7a, 0x64, 0x8b, 0x69, 0x1c, 0x98, 0xbf, 0x23, 0x37, + 0x8f, 0x91, 0xa5, 0x58, 0xc3, 0xc8, 0x70, 0x5d, 0x2b, 0x3e, 0x3a, 0xd7, 0xb5, 0xd2, 0x31, 0x5d, + 0xd7, 0x86, 0x06, 0x72, 0x5d, 0xc3, 0x70, 0x5e, 0xb2, 0x48, 0xf4, 0xff, 0x8a, 0xeb, 0x11, 0xc1, + 0x17, 0x73, 0x2f, 0xc8, 0xb9, 0xc3, 0x83, 0xca, 0x79, 0x9c, 0x89, 0x81, 0x73, 0x6a, 0xa2, 0xcf, + 0xc3, 0xac, 0xe3, 0x79, 0xc1, 0x7d, 0x35, 0x6a, 0xcb, 0x51, 0xd3, 0xf1, 0xb8, 0xc6, 0x7e, 0x84, + 0x51, 0x7d, 0xe2, 0xf0, 0xa0, 0x32, 0xbb, 0x90, 0x83, 0x83, 0x73, 0x6b, 0xa7, 0x3c, 0xdf, 0x46, + 0xfb, 0x7a, 0xbe, 0xbd, 0x06, 0xe5, 0x76, 0x18, 0x34, 0x57, 0x35, 0x6f, 0x9c, 0x4b, 0x2c, 0x07, + 0xbd, 0x2c, 0x3c, 0x3a, 0xa8, 0x4c, 0xa8, 0x3f, 0xec, 0x86, 0x4f, 0x2a, 0xd8, 0x3b, 0x70, 0xa6, + 0x41, 0x42, 0x97, 0x65, 0xc0, 0x6c, 0x25, 0x1b, 0x7a, 0x1d, 0xca, 0x61, 0xea, 0x08, 0x1b, 0x28, + 0xb0, 0x92, 0x16, 0xe5, 0x57, 0x1e, 0x59, 0x09, 0x21, 0xfb, 0x8f, 0x2c, 0x18, 0x11, 0x0e, 0x0d, + 0xa7, 0xc0, 0x39, 0x2d, 0x18, 0x0a, 0xec, 0x4a, 0xf6, 0x31, 0xcf, 0x3a, 0x93, 0xab, 0xba, 0xae, + 0xa5, 0x54, 0xd7, 0x4f, 0xf6, 0x22, 0xd2, 0x5b, 0x69, 0xfd, 0x37, 0x8a, 0x30, 0x69, 0x3a, 0x73, + 0x9c, 0xc2, 0x10, 0xac, 0xc1, 0x48, 0x24, 0x3c, 0x87, 0x0a, 0xf9, 0x96, 0xd3, 0xe9, 0x49, 0x4c, + 0xcc, 0xa2, 0x84, 0xaf, 0x90, 0x24, 0x92, 0xe9, 0x92, 0x54, 0x7c, 0x84, 0x2e, 0x49, 0xfd, 0xfc, + 0x69, 0x4a, 0x27, 0xe1, 0x4f, 0x63, 0x7f, 0x8d, 0x5d, 0x35, 0x7a, 0xf9, 0x29, 0x70, 0x21, 0x37, + 0xcc, 0x4b, 0xc9, 0xee, 0xb1, 0xb2, 0x44, 0xa7, 0x72, 0xb8, 0x91, 0x9f, 0xb7, 0xe0, 0x62, 0xc6, + 0x57, 0x69, 0xac, 0xc9, 0x73, 0x30, 0xea, 0x74, 0x5a, 0xae, 0xda, 0xcb, 0xda, 0x33, 0xd6, 0x82, + 0x28, 0xc7, 0x0a, 0x03, 0x2d, 0xc1, 0x0c, 0x79, 0xd0, 0x76, 0xf9, 0x3b, 0xa2, 0x6e, 0xbb, 0x58, + 0xe4, 0x21, 0x66, 0x97, 0xd3, 0x40, 0xdc, 0x8d, 0xaf, 0xdc, 0xb1, 0x8b, 0xb9, 0xee, 0xd8, 0x7f, + 0xdf, 0x82, 0x31, 0xd1, 0xed, 0x53, 0x18, 0xed, 0x6f, 0x33, 0x47, 0xfb, 0xf1, 0x1e, 0xa3, 0x9d, + 0x33, 0xcc, 0x7f, 0xab, 0xa0, 0xfa, 0x5b, 0x0f, 0xc2, 0x78, 0x00, 0x96, 0xe7, 0x15, 0x18, 0x6d, + 0x87, 0x41, 0x1c, 0x34, 0x03, 0x4f, 0x70, 0x3c, 0x4f, 0x24, 0xd1, 0x02, 0x78, 0xf9, 0x91, 0xf6, + 0x1b, 0x2b, 0x6c, 0x36, 0x7a, 0x41, 0x18, 0x0b, 0x2e, 0x23, 0x19, 0xbd, 0x20, 0x8c, 0x31, 0x83, + 0xa0, 0x16, 0x40, 0xec, 0x84, 0x5b, 0x24, 0xa6, 0x65, 0x22, 0xf0, 0x48, 0xfe, 0xe1, 0xd1, 0x89, + 0x5d, 0x6f, 0xde, 0xf5, 0xe3, 0x28, 0x0e, 0xe7, 0x6b, 0x7e, 0x7c, 0x27, 0xe4, 0x02, 0x94, 0xe6, + 0xfe, 0xaf, 0x68, 0x61, 0x8d, 0xae, 0xf4, 0xd1, 0x64, 0x6d, 0x0c, 0x99, 0x0f, 0xe2, 0x6b, 0xa2, + 0x1c, 0x2b, 0x0c, 0xfb, 0x33, 0xec, 0x2a, 0x61, 0x03, 0x74, 0x3c, 0xcf, 0xfc, 0xaf, 0x8f, 0xaa, + 0xa1, 0x65, 0xaf, 0x61, 0x55, 0xdd, 0xff, 0xbf, 0xf7, 0xc9, 0x4d, 0x1b, 0xd6, 0xfd, 0x68, 0x92, + 0x20, 0x01, 0xe8, 0xdb, 0xbb, 0xec, 0x24, 0x9e, 0xef, 0x73, 0x05, 0x1c, 0xc3, 0x32, 0x82, 0x85, + 0xbd, 0x66, 0xe1, 0x81, 0x6b, 0x75, 0xb1, 0xc8, 0xb5, 0xb0, 0xd7, 0x02, 0x80, 0x13, 0x1c, 0x74, + 0x4d, 0x88, 0xdf, 0x25, 0x23, 0xf9, 0x9d, 0x14, 0xbf, 0xe5, 0xe7, 0x6b, 0xf2, 0xf7, 0x0b, 0x30, + 0xa6, 0x92, 0xe0, 0xd5, 0x79, 0x2e, 0x31, 0x11, 0x86, 0x65, 0x39, 0x29, 0xc6, 0x3a, 0x0e, 0x5a, + 0x87, 0xa9, 0x88, 0xeb, 0x5e, 0x54, 0xb4, 0x3d, 0xae, 0xc3, 0xfa, 0xa4, 0xb4, 0xaf, 0x68, 0x98, + 0xe0, 0x23, 0x56, 0xc4, 0x8f, 0x0e, 0xe9, 0x68, 0x99, 0x26, 0x81, 0x5e, 0x87, 0x49, 0x4f, 0x4f, + 0x25, 0x5f, 0x17, 0x2a, 0x2e, 0x65, 0x7e, 0x6c, 0x24, 0x9a, 0xaf, 0xe3, 0x14, 0x36, 0xe5, 0x94, + 0xf4, 0x12, 0x11, 0x21, 0xd2, 0xf1, 0xb7, 0x48, 0x24, 0x52, 0x78, 0x31, 0x4e, 0xe9, 0x76, 0x0e, + 0x0e, 0xce, 0xad, 0x8d, 0x5e, 0x81, 0x71, 0xf9, 0xf9, 0x9a, 0x1b, 0x71, 0x62, 0xe4, 0xae, 0xc1, + 0xb0, 0x81, 0x89, 0xee, 0xc3, 0x39, 0xf9, 0x7f, 0x3d, 0x74, 0x36, 0x37, 0xdd, 0xa6, 0xf0, 0xe2, + 0xe6, 0x9e, 0x3e, 0x0b, 0xd2, 0x75, 0x68, 0x39, 0x0b, 0xe9, 0xe8, 0xa0, 0x72, 0x59, 0x8c, 0x5a, + 0x26, 0x9c, 0x4d, 0x62, 0x36, 0x7d, 0xb4, 0x0a, 0x67, 0xb6, 0x89, 0xe3, 0xc5, 0xdb, 0x4b, 0xdb, + 0xa4, 0xb9, 0x23, 0x37, 0x11, 0x73, 0x4e, 0xd6, 0x4c, 0xc3, 0x6f, 0x76, 0xa3, 0xe0, 0xac, 0x7a, + 0xe8, 0x1d, 0x98, 0x6d, 0x77, 0x36, 0x3c, 0x37, 0xda, 0x5e, 0x0b, 0x62, 0x66, 0xd2, 0xa1, 0x72, + 0xc8, 0x09, 0x2f, 0x66, 0xe5, 0x98, 0x5d, 0xcf, 0xc1, 0xc3, 0xb9, 0x14, 0xd0, 0xfb, 0x70, 0x2e, + 0xb5, 0x18, 0x84, 0x4f, 0xe5, 0x64, 0x7e, 0xbc, 0xdd, 0x46, 0x56, 0x05, 0xe1, 0x23, 0x99, 0x05, + 0xc2, 0xd9, 0x4d, 0x7c, 0x30, 0x43, 0x9f, 0xf7, 0x68, 0x65, 0x8d, 0x29, 0x43, 0x5f, 0x86, 0x71, + 0x7d, 0x15, 0x89, 0x0b, 0xe6, 0x4a, 0x36, 0xcf, 0xa2, 0xad, 0x36, 0xce, 0xd2, 0xa9, 0x15, 0xa5, + 0xc3, 0xb0, 0x41, 0xd1, 0x26, 0x90, 0xfd, 0x7d, 0xe8, 0x36, 0x8c, 0x36, 0x3d, 0x97, 0xf8, 0x71, + 0xad, 0xde, 0x2b, 0xe8, 0xc7, 0x92, 0xc0, 0x11, 0x03, 0x26, 0x02, 0x94, 0xf2, 0x32, 0xac, 0x28, + 0xd8, 0xbf, 0x56, 0x80, 0x4a, 0x9f, 0x68, 0xb7, 0x29, 0x7d, 0xb4, 0x35, 0x90, 0x3e, 0x7a, 0x41, + 0x66, 0xc4, 0x5b, 0x4b, 0x09, 0xe9, 0xa9, 0x6c, 0x77, 0x89, 0xa8, 0x9e, 0xc6, 0x1f, 0xd8, 0x3e, + 0x58, 0x57, 0x69, 0x97, 0xfa, 0x5a, 0xae, 0x1b, 0x4f, 0x59, 0x43, 0x83, 0x0b, 0x22, 0xb9, 0xcf, + 0x12, 0xf6, 0xd7, 0x0a, 0x70, 0x4e, 0x0d, 0xe1, 0x9f, 0xdd, 0x81, 0xbb, 0xdb, 0x3d, 0x70, 0x27, + 0xf0, 0xa8, 0x63, 0xdf, 0x81, 0x61, 0x1e, 0x34, 0x65, 0x00, 0x06, 0xe8, 0x29, 0x33, 0xc2, 0x96, + 0xba, 0xa6, 0x8d, 0x28, 0x5b, 0x7f, 0xc1, 0x82, 0xa9, 0xf5, 0xa5, 0x7a, 0x23, 0x68, 0xee, 0x90, + 0x78, 0x81, 0x33, 0xac, 0x58, 0xf0, 0x3f, 0xd6, 0x43, 0xf2, 0x35, 0x59, 0x1c, 0xd3, 0x65, 0x28, + 0x6d, 0x07, 0x51, 0x9c, 0x7e, 0xf1, 0xbd, 0x19, 0x44, 0x31, 0x66, 0x10, 0xfb, 0x77, 0x2c, 0x18, + 0x62, 0x79, 0x5c, 0xfb, 0x25, 0x17, 0x1e, 0xe4, 0xbb, 0xd0, 0xcb, 0x30, 0x4c, 0x36, 0x37, 0x49, + 0x33, 0x16, 0xb3, 0x2a, 0xdd, 0x51, 0x87, 0x97, 0x59, 0x29, 0xbd, 0xf4, 0x59, 0x63, 0xfc, 0x2f, + 0x16, 0xc8, 0xe8, 0x2d, 0x28, 0xc7, 0xee, 0x2e, 0x59, 0x68, 0xb5, 0xc4, 0x9b, 0xd9, 0x43, 0x78, + 0xff, 0xae, 0x4b, 0x02, 0x38, 0xa1, 0x65, 0x7f, 0xb5, 0x00, 0x90, 0xb8, 0xfe, 0xf7, 0xfb, 0xc4, + 0xc5, 0xae, 0xd7, 0x94, 0x2b, 0x19, 0xaf, 0x29, 0x28, 0x21, 0x98, 0xf1, 0x94, 0xa2, 0x86, 0xa9, + 0x38, 0xd0, 0x30, 0x95, 0x8e, 0x33, 0x4c, 0x4b, 0x30, 0x93, 0x84, 0x2e, 0x30, 0xe3, 0xb8, 0x30, + 0x21, 0x65, 0x3d, 0x0d, 0xc4, 0xdd, 0xf8, 0x36, 0x81, 0xcb, 0x32, 0xa2, 0xa6, 0xbc, 0x6b, 0x98, + 0x49, 0xe6, 0x31, 0xf2, 0x4c, 0x27, 0xcf, 0x45, 0x85, 0xdc, 0xe7, 0xa2, 0x1f, 0xb7, 0xe0, 0x6c, + 0xba, 0x1d, 0xe6, 0xfb, 0xf6, 0x7d, 0x16, 0x9c, 0x63, 0x8f, 0x66, 0xac, 0xd5, 0xee, 0x27, 0xba, + 0x97, 0xb2, 0x43, 0x3a, 0xf4, 0xee, 0x71, 0xe2, 0xf7, 0xbc, 0x9a, 0x45, 0x1a, 0x67, 0xb7, 0x68, + 0xff, 0x65, 0x0b, 0x2e, 0xe4, 0xa6, 0x0f, 0x62, 0x12, 0x64, 0xdb, 0xe5, 0x1a, 0xa9, 0xb4, 0x04, + 0x59, 0xaf, 0x71, 0x9d, 0x94, 0xc2, 0x50, 0xa9, 0x0d, 0x0b, 0xb9, 0xa9, 0x0d, 0xfb, 0x66, 0x2a, + 0xb4, 0xbf, 0xd7, 0x02, 0xe1, 0xf2, 0x34, 0xc0, 0x41, 0xf3, 0xb6, 0xcc, 0x0c, 0x6b, 0x04, 0x34, + 0xbf, 0x9c, 0xef, 0x03, 0x26, 0xc2, 0x98, 0xab, 0x8b, 0xdd, 0x08, 0x5e, 0x6e, 0xd0, 0xb2, 0x5b, + 0x20, 0xa0, 0x55, 0xc2, 0xf4, 0x56, 0xfd, 0x7b, 0x73, 0x1d, 0xa0, 0xc5, 0x70, 0xb5, 0xfc, 0x90, + 0xea, 0x1a, 0xa9, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x1f, 0x2c, 0xc0, 0x98, 0x0c, 0xa0, 0xdd, 0xf1, + 0x07, 0x91, 0x2e, 0x8f, 0x95, 0x47, 0x87, 0x25, 0x54, 0xa5, 0x84, 0xeb, 0x89, 0x50, 0x9e, 0x24, + 0x54, 0x95, 0x00, 0x9c, 0xe0, 0xa0, 0x67, 0x60, 0x24, 0xea, 0x6c, 0x30, 0xf4, 0x94, 0x23, 0x4f, + 0x83, 0x17, 0x63, 0x09, 0x47, 0x9f, 0x87, 0x69, 0x5e, 0x2f, 0x0c, 0xda, 0xce, 0x16, 0x57, 0x81, + 0x0e, 0x29, 0xcf, 0xda, 0xe9, 0xd5, 0x14, 0xec, 0xe8, 0xa0, 0x72, 0x36, 0x5d, 0xc6, 0x94, 0xe7, + 0x5d, 0x54, 0xec, 0x2f, 0x03, 0xea, 0x8e, 0x09, 0x8e, 0xde, 0xe0, 0xe6, 0x54, 0x6e, 0x48, 0x5a, + 0xbd, 0xb4, 0xe2, 0xba, 0x23, 0xa8, 0x34, 0xa6, 0xe7, 0xb5, 0xb0, 0xaa, 0x6f, 0xff, 0x95, 0x22, + 0x4c, 0xa7, 0xdd, 0x02, 0xd1, 0x4d, 0x18, 0xe6, 0x17, 0x9e, 0x20, 0xdf, 0xe3, 0xd1, 0x55, 0x73, + 0x26, 0x64, 0x5b, 0x5f, 0xdc, 0x99, 0xa2, 0x3e, 0x7a, 0x07, 0xc6, 0x5a, 0xc1, 0x7d, 0xff, 0xbe, + 0x13, 0xb6, 0x16, 0xea, 0x35, 0xb1, 0x2e, 0x33, 0xf9, 0xe6, 0x6a, 0x82, 0xa6, 0x3b, 0x28, 0xb2, + 0x07, 0x86, 0x04, 0x84, 0x75, 0x72, 0x68, 0x9d, 0xc5, 0x39, 0xdc, 0x74, 0xb7, 0x56, 0x9d, 0x76, + 0x2f, 0xdb, 0xda, 0x25, 0x89, 0xa4, 0x51, 0x9e, 0x10, 0xc1, 0x10, 0x39, 0x00, 0x27, 0x84, 0xd0, + 0x77, 0xc2, 0x99, 0x28, 0x47, 0xd5, 0x96, 0x97, 0x22, 0xa2, 0x97, 0xf6, 0x69, 0xf1, 0x31, 0x2a, + 0xd1, 0x64, 0x29, 0xe5, 0xb2, 0x9a, 0xb1, 0xbf, 0x72, 0x06, 0x8c, 0xdd, 0x68, 0xe4, 0x09, 0xb2, + 0x4e, 0x28, 0x4f, 0x10, 0x86, 0x51, 0xb2, 0xdb, 0x8e, 0xf7, 0xab, 0x6e, 0xd8, 0x2b, 0x8f, 0xdd, + 0xb2, 0xc0, 0xe9, 0xa6, 0x29, 0x21, 0x58, 0xd1, 0xc9, 0x4e, 0xe6, 0x54, 0xfc, 0x10, 0x93, 0x39, + 0x95, 0x4e, 0x31, 0x99, 0xd3, 0x1a, 0x8c, 0x6c, 0xb9, 0x31, 0x26, 0xed, 0x40, 0xb0, 0x9a, 0x99, + 0xeb, 0xf0, 0x06, 0x47, 0xe9, 0x4e, 0x20, 0x22, 0x00, 0x58, 0x12, 0x41, 0x6f, 0xa8, 0x1d, 0x38, + 0x9c, 0x2f, 0xa9, 0x75, 0xbf, 0x0e, 0x66, 0xee, 0x41, 0x91, 0xbc, 0x69, 0xe4, 0x61, 0x93, 0x37, + 0xad, 0xc8, 0x94, 0x4b, 0xa3, 0xf9, 0x86, 0xf0, 0x2c, 0xa3, 0x52, 0x9f, 0x44, 0x4b, 0x46, 0x72, + 0xaa, 0xf2, 0xc9, 0x25, 0xa7, 0xfa, 0x5e, 0x0b, 0xce, 0xb5, 0xb3, 0xf2, 0xb4, 0x89, 0x44, 0x49, + 0x2f, 0x0f, 0x9c, 0x88, 0xce, 0x68, 0x90, 0x89, 0xec, 0x99, 0x68, 0x38, 0xbb, 0x39, 0x3a, 0xd0, + 0xe1, 0x46, 0x4b, 0x64, 0x57, 0x7a, 0x2a, 0x27, 0xcb, 0x55, 0x8f, 0xdc, 0x56, 0xeb, 0x19, 0x19, + 0x95, 0x3e, 0x9e, 0x97, 0x51, 0x69, 0xe0, 0x3c, 0x4a, 0x6f, 0xa8, 0xfc, 0x56, 0x13, 0xf9, 0x4b, + 0x89, 0x67, 0xaf, 0xea, 0x9b, 0xd5, 0xea, 0x0d, 0x95, 0xd5, 0xaa, 0x47, 0xbc, 0x37, 0x9e, 0xb3, + 0xaa, 0x6f, 0x2e, 0x2b, 0x2d, 0x1f, 0xd5, 0xd4, 0xc9, 0xe4, 0xa3, 0x32, 0xae, 0x1a, 0x9e, 0x12, + 0xe9, 0xd9, 0x3e, 0x57, 0x8d, 0x41, 0xb7, 0xf7, 0x65, 0xc3, 0x73, 0x6f, 0xcd, 0x3c, 0x54, 0xee, + 0xad, 0x7b, 0x7a, 0x2e, 0x2b, 0xd4, 0x27, 0x59, 0x13, 0x45, 0x1a, 0x30, 0x83, 0xd5, 0x3d, 0xfd, + 0x02, 0x3c, 0x93, 0x4f, 0x57, 0xdd, 0x73, 0xdd, 0x74, 0x33, 0xaf, 0xc0, 0xae, 0xcc, 0x58, 0x67, + 0x4f, 0x27, 0x33, 0xd6, 0xb9, 0x13, 0xcf, 0x8c, 0x75, 0xfe, 0x14, 0x32, 0x63, 0x3d, 0xf6, 0xa1, + 0x66, 0xc6, 0x9a, 0x7d, 0x04, 0x99, 0xb1, 0xd6, 0x92, 0xcc, 0x58, 0x17, 0xf2, 0xa7, 0x24, 0xc3, + 0x3a, 0x37, 0x27, 0x1f, 0xd6, 0x3d, 0xf6, 0x44, 0xcf, 0xe3, 0x56, 0x88, 0x80, 0x74, 0xd9, 0xb9, + 0x7f, 0xb3, 0x82, 0x5b, 0xf0, 0x29, 0x51, 0x20, 0x9c, 0x90, 0xa2, 0x74, 0x93, 0xfc, 0x58, 0x8f, + 0xf7, 0x50, 0xca, 0x66, 0xa9, 0xbb, 0xf2, 0xb3, 0x62, 0xd9, 0x7f, 0xb1, 0x00, 0x97, 0x7a, 0xaf, + 0xeb, 0x44, 0x57, 0x56, 0x4f, 0xde, 0x76, 0x52, 0xba, 0x32, 0x2e, 0xe4, 0x24, 0x58, 0x03, 0x07, + 0xf7, 0xb9, 0x01, 0x33, 0xca, 0x2c, 0xd7, 0x73, 0x9b, 0xfb, 0x5a, 0x4e, 0x60, 0xe5, 0x7e, 0xd8, + 0x48, 0x23, 0xe0, 0xee, 0x3a, 0x68, 0x01, 0xa6, 0x8c, 0xc2, 0x5a, 0x55, 0x08, 0x33, 0x4a, 0x39, + 0xd7, 0x30, 0xc1, 0x38, 0x8d, 0x6f, 0xff, 0xb4, 0x05, 0x8f, 0xe5, 0x24, 0x8d, 0x18, 0x38, 0x76, + 0xcd, 0x26, 0x4c, 0xb5, 0xcd, 0xaa, 0x7d, 0x42, 0x5c, 0x19, 0xa9, 0x29, 0x54, 0x5f, 0x53, 0x00, + 0x9c, 0x26, 0xba, 0x78, 0xf5, 0x37, 0x7f, 0xef, 0xd2, 0xc7, 0x7e, 0xeb, 0xf7, 0x2e, 0x7d, 0xec, + 0xb7, 0x7f, 0xef, 0xd2, 0xc7, 0xfe, 0xff, 0xc3, 0x4b, 0xd6, 0x6f, 0x1e, 0x5e, 0xb2, 0x7e, 0xeb, + 0xf0, 0x92, 0xf5, 0xdb, 0x87, 0x97, 0xac, 0xdf, 0x3d, 0xbc, 0x64, 0x7d, 0xf5, 0xf7, 0x2f, 0x7d, + 0xec, 0xed, 0xc2, 0xde, 0x0b, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xab, 0xe8, 0x86, 0xb1, 0xed, + 0xe6, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 61364524bf0..e9570967370 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -4040,6 +4040,13 @@ message SecurityContext { // 2) has CAP_SYS_ADMIN // +optional optional bool allowPrivilegeEscalation = 7; + + // procMount denotes the type of proc mount to use for the containers. + // The default is DefaultProcMount which uses the container runtime defaults for + // readonly paths and masked paths. + // This requires the ProcMountType feature flag to be enabled. + // +optional + optional string procMount = 9; } // SerializedReference is a reference to serialized object. diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index eb69bf0b450..68c8441d867 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1987,6 +1987,7 @@ var map_SecurityContext = map[string]string{ "runAsNonRoot": "Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence.", "readOnlyRootFilesystem": "Whether this container has a read-only root filesystem. Default is false.", "allowPrivilegeEscalation": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN", + "procMount": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.", } func (SecurityContext) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index ec8646e0b0b..c01ad756209 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -4599,6 +4599,11 @@ func (in *SecurityContext) DeepCopyInto(out *SecurityContext) { *out = new(bool) **out = **in } + if in.ProcMount != nil { + in, out := &in.ProcMount, &out.ProcMount + *out = new(ProcMountType) + **out = **in + } return } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go index 9d76a5b938c..72d64db3edd 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.pb.go @@ -2291,6 +2291,23 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + dAtA[i] = 0xaa + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -3512,6 +3529,12 @@ func (m *PodSecurityPolicySpec) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -4247,6 +4270,7 @@ func (this *PodSecurityPolicySpec) String() string { `AllowedFlexVolumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedFlexVolumes), "AllowedFlexVolume", "AllowedFlexVolume", 1), `&`, ``, 1) + `,`, `AllowedUnsafeSysctls:` + fmt.Sprintf("%v", this.AllowedUnsafeSysctls) + `,`, `ForbiddenSysctls:` + fmt.Sprintf("%v", this.ForbiddenSysctls) + `,`, + `AllowedProcMountTypes:` + fmt.Sprintf("%v", this.AllowedProcMountTypes) + `,`, `}`, }, "") return s @@ -10442,6 +10466,35 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { } m.ForbiddenSysctls = append(m.ForbiddenSysctls, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedProcMountTypes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedProcMountTypes = append(m.AllowedProcMountTypes, k8s_io_api_core_v1.ProcMountType(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -12421,232 +12474,235 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3627 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x1c, 0xc7, - 0x72, 0xd7, 0xec, 0x2e, 0xb9, 0xcb, 0xa2, 0xf8, 0xd5, 0xa4, 0xc9, 0xb5, 0x64, 0x71, 0xe5, 0x31, - 0xa0, 0xc8, 0x8e, 0xb4, 0x6b, 0xc9, 0x96, 0xac, 0x58, 0x88, 0x6d, 0x2e, 0x29, 0x4a, 0x74, 0xf8, - 0xa5, 0x5e, 0x52, 0x71, 0x8c, 0xc8, 0xf1, 0x70, 0xb7, 0xb9, 0x1c, 0x71, 0x76, 0x66, 0x3c, 0xd3, - 0x43, 0x73, 0x81, 0x20, 0xc8, 0x21, 0x08, 0x10, 0x20, 0x41, 0x92, 0x83, 0xf3, 0x71, 0x8b, 0x2f, - 0x39, 0x25, 0x48, 0x6e, 0xc9, 0xc1, 0x30, 0x10, 0xc0, 0x01, 0x84, 0xc0, 0x01, 0x7c, 0x8b, 0x4f, - 0x44, 0x4c, 0x9f, 0x82, 0xfc, 0x03, 0x0f, 0x3a, 0x3c, 0x3c, 0x74, 0x4f, 0xcf, 0xf7, 0x0c, 0x77, - 0x97, 0x96, 0x88, 0x87, 0x87, 0x77, 0xe3, 0x76, 0x55, 0xfd, 0xaa, 0xba, 0xba, 0xba, 0xaa, 0xa6, - 0xbb, 0x09, 0xcb, 0xfb, 0x77, 0xec, 0xaa, 0x6a, 0xd4, 0xf6, 0x9d, 0x1d, 0x62, 0xe9, 0x84, 0x12, - 0xbb, 0x76, 0x40, 0xf4, 0x96, 0x61, 0xd5, 0x04, 0x41, 0x31, 0xd5, 0x1a, 0x39, 0xa4, 0x44, 0xb7, - 0x55, 0x43, 0xb7, 0x6b, 0x07, 0x37, 0x76, 0x08, 0x55, 0x6e, 0xd4, 0xda, 0x44, 0x27, 0x96, 0x42, - 0x49, 0xab, 0x6a, 0x5a, 0x06, 0x35, 0xd0, 0x25, 0x97, 0xbd, 0xaa, 0x98, 0x6a, 0x35, 0x60, 0xaf, - 0x0a, 0xf6, 0x0b, 0xd7, 0xdb, 0x2a, 0xdd, 0x73, 0x76, 0xaa, 0x4d, 0xa3, 0x53, 0x6b, 0x1b, 0x6d, - 0xa3, 0xc6, 0xa5, 0x76, 0x9c, 0x5d, 0xfe, 0x8b, 0xff, 0xe0, 0x7f, 0xb9, 0x68, 0x17, 0xe4, 0x90, - 0xf2, 0xa6, 0x61, 0x91, 0xda, 0x41, 0x42, 0xe3, 0x85, 0xb7, 0x03, 0x9e, 0x8e, 0xd2, 0xdc, 0x53, - 0x75, 0x62, 0x75, 0x6b, 0xe6, 0x7e, 0x9b, 0x0b, 0x59, 0xc4, 0x36, 0x1c, 0xab, 0x49, 0x06, 0x92, - 0xb2, 0x6b, 0x1d, 0x42, 0x95, 0x34, 0x5d, 0xb5, 0x2c, 0x29, 0xcb, 0xd1, 0xa9, 0xda, 0x49, 0xaa, - 0xb9, 0xdd, 0x4b, 0xc0, 0x6e, 0xee, 0x91, 0x8e, 0x92, 0x90, 0x7b, 0x2b, 0x4b, 0xce, 0xa1, 0xaa, - 0x56, 0x53, 0x75, 0x6a, 0x53, 0x2b, 0x2e, 0x24, 0xdf, 0x85, 0xa9, 0x05, 0x4d, 0x33, 0x3e, 0x27, - 0xad, 0x65, 0x8d, 0x1c, 0x3e, 0x32, 0x34, 0xa7, 0x43, 0xd0, 0x15, 0x18, 0x6e, 0x59, 0xea, 0x01, - 0xb1, 0xca, 0xd2, 0x65, 0xe9, 0xea, 0x48, 0x7d, 0xfc, 0xe9, 0x51, 0xe5, 0xdc, 0xf1, 0x51, 0x65, - 0x78, 0x89, 0x8f, 0x62, 0x41, 0x95, 0x6d, 0x98, 0x10, 0xc2, 0x0f, 0x0c, 0x9b, 0x6e, 0x2a, 0x74, - 0x0f, 0xdd, 0x04, 0x30, 0x15, 0xba, 0xb7, 0x69, 0x91, 0x5d, 0xf5, 0x50, 0x88, 0x23, 0x21, 0x0e, - 0x9b, 0x3e, 0x05, 0x87, 0xb8, 0xd0, 0x35, 0x28, 0x59, 0x44, 0x69, 0x6d, 0xe8, 0x5a, 0xb7, 0x9c, - 0xbb, 0x2c, 0x5d, 0x2d, 0xd5, 0x27, 0x85, 0x44, 0x09, 0x8b, 0x71, 0xec, 0x73, 0xc8, 0x7f, 0x2f, - 0xc1, 0xcb, 0x8b, 0x8e, 0x4d, 0x8d, 0xce, 0x1a, 0xa1, 0x96, 0xda, 0x5c, 0x74, 0x2c, 0x8b, 0xe8, - 0xb4, 0x41, 0x15, 0xea, 0xd8, 0xe8, 0x32, 0x14, 0x74, 0xa5, 0x43, 0x84, 0xe6, 0xf3, 0x02, 0xa7, - 0xb0, 0xae, 0x74, 0x08, 0xe6, 0x14, 0xf4, 0x31, 0x0c, 0x1d, 0x28, 0x9a, 0x43, 0xb8, 0xaa, 0xd1, - 0x9b, 0xd5, 0x6a, 0x10, 0x7d, 0xbe, 0xdb, 0xaa, 0xe6, 0x7e, 0x9b, 0x87, 0xa3, 0x17, 0x0b, 0xd5, - 0x87, 0x8e, 0xa2, 0x53, 0x95, 0x76, 0xeb, 0x33, 0x02, 0xf2, 0xbc, 0xd0, 0xfb, 0x88, 0x61, 0x61, - 0x17, 0x52, 0xfe, 0x23, 0xb8, 0x94, 0x69, 0xda, 0xaa, 0x6a, 0x53, 0xf4, 0x18, 0x86, 0x54, 0x4a, - 0x3a, 0x76, 0x59, 0xba, 0x9c, 0xbf, 0x3a, 0x7a, 0xf3, 0x4e, 0xf5, 0xc4, 0xd0, 0xaf, 0x66, 0x82, - 0xd5, 0xc7, 0x84, 0x19, 0x43, 0x2b, 0x0c, 0x0e, 0xbb, 0xa8, 0xf2, 0x5f, 0x4b, 0x80, 0xc2, 0x32, - 0x5b, 0x8a, 0xd5, 0x26, 0xb4, 0x0f, 0xa7, 0xfc, 0xde, 0x4f, 0x73, 0xca, 0xb4, 0x80, 0x1c, 0x75, - 0x15, 0x46, 0x7c, 0x62, 0xc2, 0x6c, 0xd2, 0x24, 0xee, 0x8c, 0x47, 0x51, 0x67, 0xdc, 0x18, 0xc0, - 0x19, 0x2e, 0x4a, 0x86, 0x17, 0xbe, 0xc8, 0xc1, 0xc8, 0x92, 0x42, 0x3a, 0x86, 0xde, 0x20, 0x14, - 0x7d, 0x0a, 0x25, 0xb6, 0x35, 0x5b, 0x0a, 0x55, 0xb8, 0x03, 0x46, 0x6f, 0xbe, 0x79, 0xd2, 0xec, - 0xec, 0x2a, 0xe3, 0xae, 0x1e, 0xdc, 0xa8, 0x6e, 0xec, 0x3c, 0x21, 0x4d, 0xba, 0x46, 0xa8, 0x12, - 0x44, 0x70, 0x30, 0x86, 0x7d, 0x54, 0xb4, 0x0e, 0x05, 0xdb, 0x24, 0x4d, 0xe1, 0xbb, 0x6b, 0x3d, - 0xa6, 0xe1, 0x5b, 0xd6, 0x30, 0x49, 0x33, 0x58, 0x0c, 0xf6, 0x0b, 0x73, 0x1c, 0xf4, 0x08, 0x86, - 0x6d, 0xbe, 0xca, 0xe5, 0x7c, 0x62, 0x35, 0x4e, 0x46, 0x74, 0x63, 0xc3, 0xdf, 0xae, 0xee, 0x6f, - 0x2c, 0xd0, 0xe4, 0xff, 0xcb, 0x01, 0xf2, 0x79, 0x17, 0x0d, 0xbd, 0xa5, 0x52, 0xd5, 0xd0, 0xd1, - 0xbb, 0x50, 0xa0, 0x5d, 0xd3, 0x8b, 0x8e, 0x2b, 0x9e, 0x41, 0x5b, 0x5d, 0x93, 0x3c, 0x3b, 0xaa, - 0xcc, 0x26, 0x25, 0x18, 0x05, 0x73, 0x19, 0xb4, 0xea, 0x9b, 0x9a, 0xe3, 0xd2, 0x6f, 0x47, 0x55, - 0x3f, 0x3b, 0xaa, 0xa4, 0xa4, 0xe3, 0xaa, 0x8f, 0x14, 0x35, 0x10, 0x1d, 0x00, 0xd2, 0x14, 0x9b, - 0x6e, 0x59, 0x8a, 0x6e, 0xbb, 0x9a, 0xd4, 0x0e, 0x11, 0x4e, 0x78, 0xa3, 0xbf, 0x45, 0x63, 0x12, - 0xf5, 0x0b, 0xc2, 0x0a, 0xb4, 0x9a, 0x40, 0xc3, 0x29, 0x1a, 0x58, 0xbe, 0xb3, 0x88, 0x62, 0x1b, - 0x7a, 0xb9, 0x10, 0xcd, 0x77, 0x98, 0x8f, 0x62, 0x41, 0x45, 0xaf, 0x43, 0xb1, 0x43, 0x6c, 0x5b, - 0x69, 0x93, 0xf2, 0x10, 0x67, 0x9c, 0x10, 0x8c, 0xc5, 0x35, 0x77, 0x18, 0x7b, 0x74, 0xf9, 0x2b, - 0x09, 0xc6, 0x7c, 0xcf, 0xf1, 0x68, 0xff, 0xfd, 0x44, 0x1c, 0x56, 0xfb, 0x9b, 0x12, 0x93, 0xe6, - 0x51, 0xe8, 0x67, 0x45, 0x6f, 0x24, 0x14, 0x83, 0x6b, 0xde, 0x5e, 0xca, 0xf1, 0xbd, 0x74, 0xb5, - 0xdf, 0x90, 0xc9, 0xd8, 0x42, 0x7f, 0x53, 0x08, 0x99, 0xcf, 0x42, 0x13, 0x3d, 0x86, 0x92, 0x4d, - 0x34, 0xd2, 0xa4, 0x86, 0x25, 0xcc, 0x7f, 0xab, 0x4f, 0xf3, 0x95, 0x1d, 0xa2, 0x35, 0x84, 0x68, - 0xfd, 0x3c, 0xb3, 0xdf, 0xfb, 0x85, 0x7d, 0x48, 0xf4, 0x10, 0x4a, 0x94, 0x74, 0x4c, 0x4d, 0xa1, - 0x5e, 0x0e, 0x7a, 0x2d, 0x3c, 0x05, 0x16, 0x39, 0x0c, 0x6c, 0xd3, 0x68, 0x6d, 0x09, 0x36, 0xbe, - 0x7d, 0x7c, 0x97, 0x78, 0xa3, 0xd8, 0x87, 0x41, 0x07, 0x30, 0xee, 0x98, 0x2d, 0xc6, 0x49, 0x59, - 0xc5, 0x6b, 0x77, 0x45, 0x24, 0xdd, 0xee, 0xd7, 0x37, 0xdb, 0x11, 0xe9, 0xfa, 0xac, 0xd0, 0x35, - 0x1e, 0x1d, 0xc7, 0x31, 0x2d, 0x68, 0x01, 0x26, 0x3a, 0xaa, 0xce, 0x2a, 0x57, 0xb7, 0x41, 0x9a, - 0x86, 0xde, 0xb2, 0x79, 0x58, 0x0d, 0xd5, 0xe7, 0x04, 0xc0, 0xc4, 0x5a, 0x94, 0x8c, 0xe3, 0xfc, - 0xe8, 0x43, 0x40, 0xde, 0x34, 0xee, 0xbb, 0x05, 0x5b, 0x35, 0x74, 0x1e, 0x73, 0xf9, 0x20, 0xb8, - 0xb7, 0x12, 0x1c, 0x38, 0x45, 0x0a, 0xad, 0xc2, 0x8c, 0x45, 0x0e, 0x54, 0x36, 0xc7, 0x07, 0xaa, - 0x4d, 0x0d, 0xab, 0xbb, 0xaa, 0x76, 0x54, 0x5a, 0x1e, 0xe6, 0x36, 0x95, 0x8f, 0x8f, 0x2a, 0x33, - 0x38, 0x85, 0x8e, 0x53, 0xa5, 0xe4, 0xbf, 0x1d, 0x86, 0x89, 0x58, 0xbe, 0x41, 0x8f, 0x60, 0xb6, - 0xe9, 0x16, 0xa7, 0x75, 0xa7, 0xb3, 0x43, 0xac, 0x46, 0x73, 0x8f, 0xb4, 0x1c, 0x8d, 0xb4, 0x78, - 0xa0, 0x0c, 0xd5, 0xe7, 0x85, 0xc5, 0xb3, 0x8b, 0xa9, 0x5c, 0x38, 0x43, 0x9a, 0x79, 0x41, 0xe7, - 0x43, 0x6b, 0xaa, 0x6d, 0xfb, 0x98, 0x39, 0x8e, 0xe9, 0x7b, 0x61, 0x3d, 0xc1, 0x81, 0x53, 0xa4, - 0x98, 0x8d, 0x2d, 0x62, 0xab, 0x16, 0x69, 0xc5, 0x6d, 0xcc, 0x47, 0x6d, 0x5c, 0x4a, 0xe5, 0xc2, - 0x19, 0xd2, 0xe8, 0x16, 0x8c, 0xba, 0xda, 0xf8, 0xfa, 0x89, 0x85, 0xf6, 0xcb, 0xe1, 0x7a, 0x40, - 0xc2, 0x61, 0x3e, 0x36, 0x35, 0x63, 0xc7, 0x26, 0xd6, 0x01, 0x69, 0x65, 0x2f, 0xf0, 0x46, 0x82, - 0x03, 0xa7, 0x48, 0xb1, 0xa9, 0xb9, 0x11, 0x98, 0x98, 0xda, 0x70, 0x74, 0x6a, 0xdb, 0xa9, 0x5c, - 0x38, 0x43, 0x9a, 0xc5, 0xb1, 0x6b, 0xf2, 0xc2, 0x81, 0xa2, 0x6a, 0xca, 0x8e, 0x46, 0xca, 0xc5, - 0x68, 0x1c, 0xaf, 0x47, 0xc9, 0x38, 0xce, 0x8f, 0xee, 0xc3, 0x94, 0x3b, 0xb4, 0xad, 0x2b, 0x3e, - 0x48, 0x89, 0x83, 0xbc, 0x2c, 0x40, 0xa6, 0xd6, 0xe3, 0x0c, 0x38, 0x29, 0x83, 0xde, 0x85, 0xf1, - 0xa6, 0xa1, 0x69, 0x3c, 0x1e, 0x17, 0x0d, 0x47, 0xa7, 0xe5, 0x11, 0x8e, 0x82, 0xd8, 0x7e, 0x5c, - 0x8c, 0x50, 0x70, 0x8c, 0x13, 0x11, 0x80, 0xa6, 0x57, 0x70, 0xec, 0x32, 0xf4, 0xd5, 0x6b, 0x24, - 0x8b, 0x5e, 0xd0, 0x03, 0xf8, 0x43, 0x36, 0x0e, 0x01, 0xcb, 0xff, 0x25, 0xc1, 0x5c, 0x46, 0xea, - 0x40, 0xef, 0x47, 0x4a, 0xec, 0x6f, 0xc6, 0x4a, 0xec, 0xc5, 0x0c, 0xb1, 0x50, 0x9d, 0xd5, 0x61, - 0xcc, 0x62, 0xb3, 0xd2, 0xdb, 0x2e, 0x8b, 0xc8, 0x91, 0xb7, 0x7a, 0x4c, 0x03, 0x87, 0x65, 0x82, - 0x9c, 0x3f, 0x75, 0x7c, 0x54, 0x19, 0x8b, 0xd0, 0x70, 0x14, 0x5e, 0xfe, 0xbb, 0x1c, 0xc0, 0x12, - 0x31, 0x35, 0xa3, 0xdb, 0x21, 0xfa, 0x59, 0xf4, 0x50, 0x1b, 0x91, 0x1e, 0xea, 0x7a, 0xaf, 0xe5, - 0xf1, 0x4d, 0xcb, 0x6c, 0xa2, 0x7e, 0x37, 0xd6, 0x44, 0xd5, 0xfa, 0x87, 0x3c, 0xb9, 0x8b, 0xfa, - 0x9f, 0x3c, 0x4c, 0x07, 0xcc, 0x41, 0x1b, 0x75, 0x37, 0xb2, 0xc6, 0xbf, 0x11, 0x5b, 0xe3, 0xb9, - 0x14, 0x91, 0x17, 0xd6, 0x47, 0x3d, 0xff, 0x7e, 0x06, 0x3d, 0x81, 0x71, 0xd6, 0x38, 0xb9, 0xe1, - 0xc1, 0xdb, 0xb2, 0xe1, 0x81, 0xdb, 0x32, 0xbf, 0x80, 0xae, 0x46, 0x90, 0x70, 0x0c, 0x39, 0xa3, - 0x0d, 0x2c, 0xbe, 0xe8, 0x36, 0x50, 0xfe, 0x5a, 0x82, 0xf1, 0x60, 0x99, 0xce, 0xa0, 0x69, 0x5b, - 0x8f, 0x36, 0x6d, 0xaf, 0xf7, 0x1d, 0xa2, 0x19, 0x5d, 0xdb, 0xcf, 0x58, 0x83, 0xef, 0x33, 0xb1, - 0x0d, 0xbe, 0xa3, 0x34, 0xf7, 0xfb, 0xf8, 0xfc, 0xfb, 0x42, 0x02, 0x24, 0xaa, 0xc0, 0x82, 0xae, - 0x1b, 0x54, 0x71, 0x73, 0xa5, 0x6b, 0xd6, 0x4a, 0xdf, 0x66, 0x79, 0x1a, 0xab, 0xdb, 0x09, 0xac, - 0x7b, 0x3a, 0xb5, 0xba, 0xc1, 0x8a, 0x24, 0x19, 0x70, 0x8a, 0x01, 0x48, 0x01, 0xb0, 0x04, 0xe6, - 0x96, 0x21, 0x36, 0xf2, 0xf5, 0x3e, 0x72, 0x1e, 0x13, 0x58, 0x34, 0xf4, 0x5d, 0xb5, 0x1d, 0xa4, - 0x1d, 0xec, 0x03, 0xe1, 0x10, 0xe8, 0x85, 0x7b, 0x30, 0x97, 0x61, 0x2d, 0x9a, 0x84, 0xfc, 0x3e, - 0xe9, 0xba, 0x6e, 0xc3, 0xec, 0x4f, 0x34, 0x13, 0xfe, 0x4c, 0x1e, 0x11, 0x5f, 0xb8, 0xef, 0xe6, - 0xee, 0x48, 0xf2, 0x57, 0x43, 0xe1, 0xd8, 0xe1, 0x1d, 0xf3, 0x55, 0x28, 0x59, 0xc4, 0xd4, 0xd4, - 0xa6, 0x62, 0x8b, 0x46, 0xe8, 0xbc, 0x7b, 0xa4, 0xe1, 0x8e, 0x61, 0x9f, 0x1a, 0xe9, 0xad, 0x73, - 0x2f, 0xb6, 0xb7, 0xce, 0x3f, 0x9f, 0xde, 0xfa, 0x0f, 0xa0, 0x64, 0x7b, 0x5d, 0x75, 0x81, 0x43, - 0xde, 0x18, 0x20, 0xbf, 0x8a, 0x86, 0xda, 0x57, 0xe0, 0xb7, 0xd2, 0x3e, 0x68, 0x5a, 0x13, 0x3d, - 0x34, 0x60, 0x13, 0xfd, 0x5c, 0x1b, 0x5f, 0x96, 0x53, 0x4d, 0xc5, 0xb1, 0x49, 0x8b, 0x27, 0xa2, - 0x52, 0x90, 0x53, 0x37, 0xf9, 0x28, 0x16, 0x54, 0xf4, 0x38, 0x12, 0xb2, 0xa5, 0xd3, 0x84, 0xec, - 0x78, 0x76, 0xb8, 0xa2, 0x6d, 0x98, 0x33, 0x2d, 0xa3, 0x6d, 0x11, 0xdb, 0x5e, 0x22, 0x4a, 0x4b, - 0x53, 0x75, 0xe2, 0xf9, 0xc7, 0xed, 0x88, 0x2e, 0x1e, 0x1f, 0x55, 0xe6, 0x36, 0xd3, 0x59, 0x70, - 0x96, 0xac, 0xfc, 0xb4, 0x00, 0x93, 0xf1, 0x0a, 0x98, 0xd1, 0xa4, 0x4a, 0xa7, 0x6a, 0x52, 0xaf, - 0x85, 0x36, 0x83, 0xdb, 0xc1, 0x87, 0xce, 0xf8, 0x12, 0x1b, 0x62, 0x01, 0x26, 0x44, 0x36, 0xf0, - 0x88, 0xa2, 0x4d, 0xf7, 0x57, 0x7f, 0x3b, 0x4a, 0xc6, 0x71, 0x7e, 0xd6, 0x7a, 0x06, 0x1d, 0xa5, - 0x07, 0x52, 0x88, 0xb6, 0x9e, 0x0b, 0x71, 0x06, 0x9c, 0x94, 0x41, 0x6b, 0x30, 0xed, 0xe8, 0x49, - 0x28, 0x37, 0x1a, 0x2f, 0x0a, 0xa8, 0xe9, 0xed, 0x24, 0x0b, 0x4e, 0x93, 0x43, 0xbb, 0x91, 0x6e, - 0x74, 0x98, 0x67, 0xd8, 0x9b, 0x7d, 0xef, 0x9d, 0xbe, 0xdb, 0x51, 0x74, 0x17, 0xc6, 0x2c, 0xfe, - 0xdd, 0xe1, 0x19, 0xec, 0xf6, 0xee, 0x2f, 0x09, 0xb1, 0x31, 0x1c, 0x26, 0xe2, 0x28, 0x6f, 0x4a, - 0xbb, 0x5d, 0xea, 0xb7, 0xdd, 0x96, 0xff, 0x43, 0x0a, 0x17, 0x21, 0xbf, 0x05, 0xee, 0x75, 0xca, - 0x94, 0x90, 0x08, 0x75, 0x47, 0x46, 0x7a, 0xf7, 0x7b, 0x7b, 0xa0, 0xee, 0x37, 0x28, 0x9e, 0xbd, - 0xdb, 0xdf, 0x2f, 0x25, 0x98, 0x5d, 0x6e, 0xdc, 0xb7, 0x0c, 0xc7, 0xf4, 0xcc, 0xd9, 0x30, 0x5d, - 0xbf, 0xbe, 0x03, 0x05, 0xcb, 0xd1, 0xbc, 0x79, 0xbc, 0xe6, 0xcd, 0x03, 0x3b, 0x1a, 0x9b, 0xc7, - 0x74, 0x4c, 0xca, 0x9d, 0x04, 0x13, 0x40, 0xeb, 0x30, 0x6c, 0x29, 0x7a, 0x9b, 0x78, 0x65, 0xf5, - 0x4a, 0x0f, 0xeb, 0x57, 0x96, 0x30, 0x63, 0x0f, 0x35, 0x6f, 0x5c, 0x1a, 0x0b, 0x14, 0xf9, 0x2f, - 0x24, 0x98, 0x78, 0xb0, 0xb5, 0xb5, 0xb9, 0xa2, 0xf3, 0x1d, 0xcd, 0x4f, 0xdf, 0x2f, 0x43, 0xc1, - 0x54, 0xe8, 0x5e, 0xbc, 0xd2, 0x33, 0x1a, 0xe6, 0x14, 0xf4, 0x11, 0x14, 0x59, 0x26, 0x21, 0x7a, - 0xab, 0xcf, 0x56, 0x5b, 0xc0, 0xd7, 0x5d, 0xa1, 0xa0, 0x43, 0x14, 0x03, 0xd8, 0x83, 0x93, 0xf7, - 0x61, 0x26, 0x64, 0x0e, 0xf3, 0x07, 0x3f, 0x06, 0x46, 0x0d, 0x18, 0x62, 0x9a, 0xbd, 0x53, 0xde, - 0x5e, 0x87, 0x99, 0xb1, 0x29, 0x05, 0x9d, 0x0e, 0xfb, 0x65, 0x63, 0x17, 0x4b, 0x5e, 0x83, 0x31, - 0x7e, 0xe5, 0x60, 0x58, 0x94, 0xbb, 0x05, 0x5d, 0x82, 0x7c, 0x47, 0xd5, 0x45, 0x9d, 0x1d, 0x15, - 0x32, 0x79, 0x56, 0x23, 0xd8, 0x38, 0x27, 0x2b, 0x87, 0x22, 0xf3, 0x04, 0x64, 0xe5, 0x10, 0xb3, - 0x71, 0xf9, 0x3e, 0x14, 0x85, 0xbb, 0xc3, 0x40, 0xf9, 0x93, 0x81, 0xf2, 0x29, 0x40, 0x1b, 0x50, - 0x5c, 0xd9, 0xac, 0x6b, 0x86, 0xdb, 0x75, 0x35, 0xd5, 0x96, 0x15, 0x5f, 0x8b, 0xc5, 0x95, 0x25, - 0x8c, 0x39, 0x05, 0xc9, 0x30, 0x4c, 0x0e, 0x9b, 0xc4, 0xa4, 0x3c, 0x22, 0x46, 0xea, 0xc0, 0x56, - 0xf9, 0x1e, 0x1f, 0xc1, 0x82, 0x22, 0xff, 0x65, 0x0e, 0x8a, 0xc2, 0x1d, 0x67, 0xf0, 0x15, 0xb6, - 0x1a, 0xf9, 0x0a, 0x7b, 0xa3, 0xbf, 0xd0, 0xc8, 0xfc, 0x04, 0xdb, 0x8a, 0x7d, 0x82, 0x5d, 0xeb, - 0x13, 0xef, 0xe4, 0xef, 0xaf, 0x7f, 0x95, 0x60, 0x3c, 0x1a, 0x94, 0xe8, 0x16, 0x8c, 0xb2, 0x82, - 0xa3, 0x36, 0xc9, 0x7a, 0xd0, 0xe7, 0xfa, 0x87, 0x30, 0x8d, 0x80, 0x84, 0xc3, 0x7c, 0xa8, 0xed, - 0x8b, 0xb1, 0x38, 0x12, 0x93, 0xce, 0x76, 0xa9, 0x43, 0x55, 0xad, 0xea, 0x5e, 0xa3, 0x55, 0x57, - 0x74, 0xba, 0x61, 0x35, 0xa8, 0xa5, 0xea, 0xed, 0x84, 0x22, 0x1e, 0x94, 0x61, 0x64, 0xf9, 0xdf, - 0x25, 0x18, 0x15, 0x26, 0x9f, 0xc1, 0x57, 0xc5, 0xef, 0x44, 0xbf, 0x2a, 0xae, 0xf4, 0xb9, 0xc1, - 0xd3, 0x3f, 0x29, 0xfe, 0x31, 0x30, 0x9d, 0x6d, 0x69, 0x16, 0xd5, 0x7b, 0x86, 0x4d, 0xe3, 0x51, - 0xcd, 0x36, 0x23, 0xe6, 0x14, 0xe4, 0xc0, 0xa4, 0x1a, 0xcb, 0x01, 0xc2, 0xb5, 0xb5, 0xfe, 0x2c, - 0xf1, 0xc5, 0xea, 0x65, 0x01, 0x3f, 0x19, 0xa7, 0xe0, 0x84, 0x0a, 0x99, 0x40, 0x82, 0x0b, 0x3d, - 0x84, 0xc2, 0x1e, 0xa5, 0x66, 0xca, 0x79, 0x75, 0x8f, 0xcc, 0x13, 0x98, 0x50, 0xe2, 0xb3, 0xdb, - 0xda, 0xda, 0xc4, 0x1c, 0x4a, 0xfe, 0x79, 0xe0, 0x8f, 0x86, 0x1b, 0xe3, 0x7e, 0x3e, 0x95, 0x4e, - 0x93, 0x4f, 0x47, 0xd3, 0x72, 0x29, 0x7a, 0x00, 0x79, 0xaa, 0xf5, 0xfb, 0x59, 0x28, 0x10, 0xb7, - 0x56, 0x1b, 0x41, 0x42, 0xda, 0x5a, 0x6d, 0x60, 0x06, 0x81, 0x36, 0x60, 0x88, 0x55, 0x1f, 0xb6, - 0x05, 0xf3, 0xfd, 0x6f, 0x69, 0x36, 0xff, 0x20, 0x20, 0xd8, 0x2f, 0x1b, 0xbb, 0x38, 0xf2, 0x67, - 0x30, 0x16, 0xd9, 0xa7, 0xe8, 0x53, 0x38, 0xaf, 0x19, 0x4a, 0xab, 0xae, 0x68, 0x8a, 0xde, 0x24, - 0xde, 0xe5, 0xc0, 0x95, 0xb4, 0x2f, 0x8c, 0xd5, 0x10, 0x9f, 0xd8, 0xe5, 0xfe, 0x75, 0x6a, 0x98, - 0x86, 0x23, 0x88, 0xb2, 0x02, 0x10, 0xcc, 0x11, 0x55, 0x60, 0x88, 0xc5, 0x99, 0x5b, 0x4f, 0x46, - 0xea, 0x23, 0xcc, 0x42, 0x16, 0x7e, 0x36, 0x76, 0xc7, 0xd1, 0x4d, 0x00, 0x9b, 0x34, 0x2d, 0x42, - 0x79, 0x32, 0xc8, 0x45, 0xaf, 0xa0, 0x1b, 0x3e, 0x05, 0x87, 0xb8, 0xe4, 0xff, 0x94, 0x60, 0x6c, - 0x9d, 0xd0, 0xcf, 0x0d, 0x6b, 0x7f, 0xd3, 0xd0, 0xd4, 0x66, 0xf7, 0x0c, 0x92, 0x2d, 0x8e, 0x24, - 0xdb, 0x37, 0x7b, 0xac, 0x4c, 0xc4, 0xba, 0xac, 0x94, 0x2b, 0x7f, 0x2d, 0xc1, 0x5c, 0x84, 0xf3, - 0x5e, 0xb0, 0x75, 0xb7, 0x61, 0xc8, 0x34, 0x2c, 0xea, 0x15, 0xe2, 0x81, 0x14, 0xb2, 0x34, 0x16, - 0x2a, 0xc5, 0x0c, 0x06, 0xbb, 0x68, 0x68, 0x15, 0x72, 0xd4, 0x10, 0xa1, 0x3a, 0x18, 0x26, 0x21, - 0x56, 0x1d, 0x04, 0x66, 0x6e, 0xcb, 0xc0, 0x39, 0x6a, 0xb0, 0x85, 0x28, 0x47, 0xb8, 0xc2, 0xc9, - 0xe7, 0x05, 0xcd, 0x00, 0x43, 0x61, 0xd7, 0x32, 0x3a, 0xa7, 0x9e, 0x83, 0xbf, 0x10, 0xcb, 0x96, - 0xd1, 0xc1, 0x1c, 0x4b, 0xfe, 0x46, 0x82, 0xa9, 0x08, 0xe7, 0x19, 0x24, 0xfe, 0x87, 0xd1, 0xc4, - 0x7f, 0x6d, 0x90, 0x89, 0x64, 0xa4, 0xff, 0x6f, 0x72, 0xb1, 0x69, 0xb0, 0x09, 0xa3, 0x5d, 0x18, - 0x35, 0x8d, 0x56, 0xe3, 0x39, 0x5c, 0x07, 0x4e, 0xb0, 0xba, 0xb9, 0x19, 0x60, 0xe1, 0x30, 0x30, - 0x3a, 0x84, 0x29, 0x5d, 0xe9, 0x10, 0xdb, 0x54, 0x9a, 0xa4, 0xf1, 0x1c, 0x0e, 0x48, 0x5e, 0xe2, - 0xf7, 0x0d, 0x71, 0x44, 0x9c, 0x54, 0x82, 0xd6, 0xa0, 0xa8, 0x9a, 0xbc, 0x8f, 0x13, 0xbd, 0x4b, - 0xcf, 0x2a, 0xea, 0x76, 0x7d, 0x6e, 0x3e, 0x17, 0x3f, 0xb0, 0x87, 0x21, 0xff, 0x53, 0x3c, 0x1a, - 0x58, 0xfc, 0xa1, 0xfb, 0x50, 0xe2, 0x8f, 0x70, 0x9a, 0x86, 0xe6, 0xdd, 0x0c, 0xb0, 0x95, 0xdd, - 0x14, 0x63, 0xcf, 0x8e, 0x2a, 0x17, 0x53, 0x0e, 0x7d, 0x3d, 0x32, 0xf6, 0x85, 0xd1, 0x3a, 0x14, - 0xcc, 0x9f, 0xd2, 0xc1, 0xf0, 0x22, 0xc7, 0xdb, 0x16, 0x8e, 0x23, 0xff, 0x49, 0x3e, 0x66, 0x2e, - 0x2f, 0x75, 0x4f, 0x9e, 0xdb, 0xaa, 0xfb, 0x1d, 0x53, 0xe6, 0xca, 0xef, 0x40, 0x51, 0x54, 0x78, - 0x11, 0xcc, 0xef, 0x0c, 0x12, 0xcc, 0xe1, 0x2a, 0xe6, 0x7f, 0xb0, 0x78, 0x83, 0x1e, 0x30, 0xfa, - 0x04, 0x86, 0x89, 0xab, 0xc2, 0xad, 0x8d, 0xb7, 0x07, 0x51, 0x11, 0xe4, 0xd5, 0xa0, 0x51, 0x15, - 0x63, 0x02, 0x15, 0xbd, 0xcf, 0xfc, 0xc5, 0x78, 0xd9, 0x47, 0xa0, 0x5d, 0x2e, 0xf0, 0x72, 0x75, - 0xc9, 0x9d, 0xb6, 0x3f, 0xfc, 0xec, 0xa8, 0x02, 0xc1, 0x4f, 0x1c, 0x96, 0x90, 0xff, 0x5b, 0x82, - 0x29, 0xee, 0xa1, 0xa6, 0x63, 0xa9, 0xb4, 0x7b, 0x66, 0x85, 0xe9, 0x51, 0xa4, 0x30, 0xbd, 0xdd, - 0xc3, 0x2d, 0x09, 0x0b, 0x33, 0x8b, 0xd3, 0xb7, 0x12, 0xbc, 0x94, 0xe0, 0x3e, 0x83, 0xbc, 0xb8, - 0x1d, 0xcd, 0x8b, 0x6f, 0x0e, 0x3a, 0xa1, 0xac, 0xd6, 0x78, 0x3c, 0x65, 0x3a, 0x7c, 0xa7, 0xdc, - 0x04, 0x30, 0x2d, 0xf5, 0x40, 0xd5, 0x48, 0x5b, 0x5c, 0x82, 0x97, 0x42, 0x8f, 0xe0, 0x7c, 0x0a, - 0x0e, 0x71, 0x21, 0x1b, 0x66, 0x5b, 0x64, 0x57, 0x71, 0x34, 0xba, 0xd0, 0x6a, 0x2d, 0x2a, 0xa6, - 0xb2, 0xa3, 0x6a, 0x2a, 0x55, 0xc5, 0x71, 0xc1, 0x48, 0xfd, 0xae, 0x7b, 0x39, 0x9d, 0xc6, 0xf1, - 0xec, 0xa8, 0x72, 0x29, 0xed, 0x76, 0xc8, 0x63, 0xe9, 0xe2, 0x0c, 0x68, 0xd4, 0x85, 0xb2, 0x45, - 0x3e, 0x73, 0x54, 0x8b, 0xb4, 0x96, 0x2c, 0xc3, 0x8c, 0xa8, 0xcd, 0x73, 0xb5, 0xbf, 0x7d, 0x7c, - 0x54, 0x29, 0xe3, 0x0c, 0x9e, 0xde, 0x8a, 0x33, 0xe1, 0xd1, 0x13, 0x98, 0x56, 0xdc, 0xb7, 0x83, - 0x11, 0xad, 0xee, 0x2e, 0xb9, 0x73, 0x7c, 0x54, 0x99, 0x5e, 0x48, 0x92, 0x7b, 0x2b, 0x4c, 0x03, - 0x45, 0x35, 0x28, 0x1e, 0xf0, 0x97, 0x8d, 0x76, 0x79, 0x88, 0xe3, 0xb3, 0x42, 0x50, 0x74, 0x1f, - 0x3b, 0x32, 0xcc, 0xe1, 0xe5, 0x06, 0xdf, 0x7d, 0x1e, 0x17, 0xfb, 0xa0, 0x64, 0xbd, 0xa4, 0xd8, - 0xf1, 0xfc, 0xc4, 0xb8, 0x14, 0x64, 0xad, 0x07, 0x01, 0x09, 0x87, 0xf9, 0xd0, 0x63, 0x18, 0xd9, - 0x13, 0xa7, 0x12, 0x76, 0xb9, 0xd8, 0x57, 0x11, 0x8e, 0x9c, 0x62, 0xd4, 0xa7, 0x84, 0x8a, 0x11, - 0x6f, 0xd8, 0xc6, 0x01, 0x22, 0x7a, 0x1d, 0x8a, 0xfc, 0xc7, 0xca, 0x12, 0x3f, 0x8e, 0x2b, 0x05, - 0xb9, 0xed, 0x81, 0x3b, 0x8c, 0x3d, 0xba, 0xc7, 0xba, 0xb2, 0xb9, 0xc8, 0x8f, 0x85, 0x63, 0xac, - 0x2b, 0x9b, 0x8b, 0xd8, 0xa3, 0xa3, 0x4f, 0xa1, 0x68, 0x93, 0x55, 0x55, 0x77, 0x0e, 0xcb, 0xd0, - 0xd7, 0xa5, 0x72, 0xe3, 0x1e, 0xe7, 0x8e, 0x1d, 0x8c, 0x05, 0x1a, 0x04, 0x1d, 0x7b, 0xb0, 0x68, - 0x0f, 0x46, 0x2c, 0x47, 0x5f, 0xb0, 0xb7, 0x6d, 0x62, 0x95, 0x47, 0xb9, 0x8e, 0x5e, 0xe9, 0x1c, - 0x7b, 0xfc, 0x71, 0x2d, 0xbe, 0x87, 0x7c, 0x0e, 0x1c, 0x80, 0xa3, 0x3f, 0x97, 0x00, 0xd9, 0x8e, - 0x69, 0x6a, 0xa4, 0x43, 0x74, 0xaa, 0x68, 0xfc, 0x2c, 0xce, 0x2e, 0x9f, 0xe7, 0x3a, 0x3f, 0xe8, - 0x35, 0xaf, 0x84, 0x60, 0x5c, 0xb9, 0x7f, 0xe8, 0x9d, 0x64, 0xc5, 0x29, 0x7a, 0x99, 0x6b, 0x77, - 0x6d, 0xfe, 0x77, 0x79, 0xac, 0x2f, 0xd7, 0xa6, 0x9f, 0x39, 0x06, 0xae, 0x15, 0x74, 0xec, 0xc1, - 0xa2, 0x47, 0x30, 0xeb, 0x3d, 0x8c, 0xc5, 0x86, 0x41, 0x97, 0x55, 0x8d, 0xd8, 0x5d, 0x9b, 0x92, - 0x4e, 0x79, 0x9c, 0x2f, 0xbb, 0xff, 0xf6, 0x03, 0xa7, 0x72, 0xe1, 0x0c, 0x69, 0xd4, 0x81, 0x8a, - 0x97, 0x32, 0xd8, 0x7e, 0xf2, 0x73, 0xd6, 0x3d, 0xbb, 0xa9, 0x68, 0xee, 0x3d, 0xc0, 0x04, 0x57, - 0xf0, 0xda, 0xf1, 0x51, 0xa5, 0xb2, 0x74, 0x32, 0x2b, 0xee, 0x85, 0x85, 0x3e, 0x82, 0xb2, 0x92, - 0xa5, 0x67, 0x92, 0xeb, 0x79, 0x85, 0xe5, 0xa1, 0x4c, 0x05, 0x99, 0xd2, 0x88, 0xc2, 0xa4, 0x12, - 0x7d, 0xa2, 0x6c, 0x97, 0xa7, 0xfa, 0x3a, 0x88, 0x8c, 0xbd, 0x6c, 0x0e, 0x0e, 0x23, 0x62, 0x04, - 0x1b, 0x27, 0x34, 0xa0, 0x3f, 0x04, 0xa4, 0xc4, 0x5f, 0x55, 0xdb, 0x65, 0xd4, 0x57, 0xf9, 0x49, - 0x3c, 0xc7, 0x0e, 0xc2, 0x2e, 0x41, 0xb2, 0x71, 0x8a, 0x1e, 0xb4, 0x0a, 0x33, 0x62, 0x74, 0x5b, - 0xb7, 0x95, 0x5d, 0xd2, 0xe8, 0xda, 0x4d, 0xaa, 0xd9, 0xe5, 0x69, 0x9e, 0xfb, 0xf8, 0xc5, 0xd7, - 0x42, 0x0a, 0x1d, 0xa7, 0x4a, 0xa1, 0x0f, 0x60, 0x72, 0xd7, 0xb0, 0x76, 0xd4, 0x56, 0x8b, 0xe8, - 0x1e, 0xd2, 0x0c, 0x47, 0x9a, 0x61, 0xde, 0x58, 0x8e, 0xd1, 0x70, 0x82, 0x9b, 0x3f, 0x26, 0x11, - 0x57, 0x0b, 0x67, 0xf3, 0x20, 0x77, 0xb0, 0xc7, 0x24, 0x81, 0x69, 0xcf, 0xed, 0x31, 0x49, 0x08, - 0xf2, 0xe4, 0xc3, 0xcc, 0xff, 0xcf, 0xc1, 0x74, 0xc0, 0xdc, 0xf7, 0x63, 0x92, 0x14, 0x91, 0x5f, - 0x3f, 0xca, 0xed, 0xfd, 0x28, 0xf7, 0x6b, 0x09, 0xc6, 0x03, 0xd7, 0xfd, 0xf2, 0x3d, 0xf0, 0x08, - 0x6c, 0xcb, 0x68, 0x39, 0xff, 0x25, 0x17, 0x9e, 0xc0, 0xaf, 0xfc, 0x2b, 0x83, 0x9f, 0xfe, 0x92, - 0x56, 0xfe, 0x36, 0x0f, 0x93, 0xf1, 0xdd, 0x18, 0xb9, 0x8c, 0x96, 0x7a, 0x5e, 0x46, 0x6f, 0xc2, - 0xcc, 0xae, 0xa3, 0x69, 0x5d, 0xee, 0x86, 0xd0, 0x8d, 0xb4, 0x7b, 0x99, 0xf4, 0x8a, 0x90, 0x9c, - 0x59, 0x4e, 0xe1, 0xc1, 0xa9, 0x92, 0x19, 0x17, 0xeb, 0xf9, 0x53, 0x5d, 0xac, 0x27, 0xee, 0x79, - 0x0b, 0x03, 0xdc, 0xf3, 0xa6, 0x5e, 0x92, 0x0f, 0x9d, 0xe2, 0x92, 0xfc, 0x34, 0xb7, 0xda, 0x29, - 0x49, 0xac, 0xe7, 0x23, 0xcb, 0x57, 0xe0, 0x82, 0x10, 0xa3, 0xfc, 0xc2, 0x59, 0xa7, 0x96, 0xa1, - 0x69, 0xc4, 0x5a, 0x72, 0x3a, 0x9d, 0xae, 0xfc, 0x1e, 0x8c, 0x47, 0x9f, 0x52, 0xb8, 0x2b, 0xed, - 0xbe, 0xe6, 0x10, 0x57, 0x7a, 0xa1, 0x95, 0x76, 0xc7, 0xb1, 0xcf, 0x21, 0xff, 0xa9, 0x04, 0xb3, - 0xe9, 0x4f, 0x26, 0x91, 0x06, 0xe3, 0x1d, 0xe5, 0x30, 0xfc, 0x8c, 0x55, 0x3a, 0xe5, 0x61, 0x0b, - 0xbf, 0x43, 0x5f, 0x8b, 0x60, 0xe1, 0x18, 0xb6, 0xfc, 0xa3, 0x04, 0x73, 0x19, 0xb7, 0xd7, 0x67, - 0x6b, 0x09, 0xfa, 0x18, 0x4a, 0x1d, 0xe5, 0xb0, 0xe1, 0x58, 0x6d, 0x72, 0xea, 0xe3, 0x25, 0x9e, - 0x31, 0xd6, 0x04, 0x0a, 0xf6, 0xf1, 0xe4, 0x2f, 0x25, 0x28, 0x67, 0x35, 0xfa, 0xe8, 0x56, 0xe4, - 0x9e, 0xfd, 0xd5, 0xd8, 0x3d, 0xfb, 0x54, 0x42, 0xee, 0x05, 0xdd, 0xb2, 0xff, 0xb3, 0x04, 0xb3, - 0xe9, 0x1f, 0x3c, 0xe8, 0xad, 0x88, 0x85, 0x95, 0x98, 0x85, 0x13, 0x31, 0x29, 0x61, 0xdf, 0x27, - 0x30, 0x2e, 0x3e, 0x8b, 0x04, 0x8c, 0xf0, 0xaa, 0x9c, 0x96, 0x2b, 0x05, 0x84, 0xf7, 0x19, 0xc0, - 0xd7, 0x2b, 0x3a, 0x86, 0x63, 0x68, 0xf2, 0x9f, 0xe5, 0x60, 0xa8, 0xd1, 0x54, 0x34, 0x72, 0x06, - 0x6d, 0xd6, 0x87, 0x91, 0x36, 0xab, 0xd7, 0xbf, 0x9c, 0x70, 0xab, 0x32, 0x3b, 0x2c, 0x1c, 0xeb, - 0xb0, 0xde, 0xe8, 0x0b, 0xed, 0xe4, 0xe6, 0xea, 0xb7, 0x60, 0xc4, 0x57, 0x3a, 0x58, 0xce, 0x97, - 0xff, 0x21, 0x07, 0xa3, 0x21, 0x15, 0x03, 0x56, 0x8c, 0xdd, 0x48, 0xa5, 0xed, 0xe7, 0x1f, 0xfd, - 0x42, 0xba, 0xaa, 0x5e, 0x6d, 0x75, 0x9f, 0x4c, 0x06, 0x8f, 0xe4, 0x92, 0x25, 0xf7, 0x3d, 0x18, - 0xa7, 0xfc, 0x1f, 0xe1, 0xfc, 0x43, 0xd9, 0x3c, 0x8f, 0x45, 0xff, 0xa1, 0xed, 0x56, 0x84, 0x8a, - 0x63, 0xdc, 0x17, 0xee, 0xc2, 0x58, 0x44, 0xd9, 0x40, 0x2f, 0x1e, 0xff, 0x4d, 0x82, 0x57, 0x7b, - 0x7e, 0x32, 0xa3, 0x7a, 0x64, 0x93, 0x54, 0x63, 0x9b, 0x64, 0x3e, 0x1b, 0xe0, 0xc5, 0xbd, 0x9c, - 0xa9, 0x5f, 0x7f, 0xfa, 0xc3, 0xfc, 0xb9, 0xef, 0x7e, 0x98, 0x3f, 0xf7, 0xfd, 0x0f, 0xf3, 0xe7, - 0xfe, 0xf8, 0x78, 0x5e, 0x7a, 0x7a, 0x3c, 0x2f, 0x7d, 0x77, 0x3c, 0x2f, 0x7d, 0x7f, 0x3c, 0x2f, - 0xfd, 0xef, 0xf1, 0xbc, 0xf4, 0x57, 0x3f, 0xce, 0x9f, 0xfb, 0xb8, 0x28, 0xe0, 0x7e, 0x11, 0x00, - 0x00, 0xff, 0xff, 0x26, 0xef, 0x73, 0xa6, 0xe7, 0x3c, 0x00, 0x00, + // 3665 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5b, 0xcd, 0x6f, 0x24, 0x49, + 0x56, 0xef, 0xac, 0x2a, 0xbb, 0xca, 0xcf, 0xed, 0xaf, 0xb0, 0xdb, 0x5d, 0xdb, 0x33, 0xed, 0xea, + 0xcd, 0x91, 0x9a, 0x9e, 0xa1, 0xa7, 0x6a, 0xba, 0xe7, 0x63, 0x87, 0x69, 0xb1, 0xbb, 0x2e, 0xbb, + 0xdd, 0xed, 0xc5, 0x1f, 0x35, 0x51, 0x76, 0xb3, 0x8c, 0x98, 0x65, 0xd2, 0x55, 0xe1, 0x72, 0x8e, + 0xb3, 0x32, 0x73, 0x33, 0x22, 0xbd, 0x2e, 0x09, 0x21, 0x0e, 0x08, 0x09, 0x09, 0x04, 0x1c, 0x96, + 0x0f, 0x71, 0x61, 0x2f, 0x9c, 0x40, 0x70, 0x83, 0xc3, 0x6a, 0x24, 0xa4, 0x45, 0x1a, 0xa1, 0x45, + 0xda, 0x1b, 0x7b, 0xb2, 0x18, 0xcf, 0x09, 0xf1, 0x0f, 0xa0, 0x3e, 0x20, 0x14, 0x91, 0x91, 0xdf, + 0x99, 0xae, 0x2a, 0x4f, 0xb7, 0x85, 0xd0, 0xde, 0x2a, 0xe3, 0xbd, 0xf7, 0x7b, 0x2f, 0x22, 0x5e, + 0xbc, 0xf7, 0xe2, 0xa3, 0x60, 0xe3, 0xf8, 0x7d, 0x5a, 0xd7, 0xad, 0xc6, 0xb1, 0x7b, 0x40, 0x1c, + 0x93, 0x30, 0x42, 0x1b, 0x27, 0xc4, 0xec, 0x5a, 0x4e, 0x43, 0x12, 0x34, 0x5b, 0x6f, 0x90, 0x53, + 0x46, 0x4c, 0xaa, 0x5b, 0x26, 0x6d, 0x9c, 0x3c, 0x38, 0x20, 0x4c, 0x7b, 0xd0, 0xe8, 0x11, 0x93, + 0x38, 0x1a, 0x23, 0xdd, 0xba, 0xed, 0x58, 0xcc, 0x42, 0xb7, 0x3d, 0xf6, 0xba, 0x66, 0xeb, 0xf5, + 0x90, 0xbd, 0x2e, 0xd9, 0x6f, 0xbd, 0xd9, 0xd3, 0xd9, 0x91, 0x7b, 0x50, 0xef, 0x58, 0xfd, 0x46, + 0xcf, 0xea, 0x59, 0x0d, 0x21, 0x75, 0xe0, 0x1e, 0x8a, 0x2f, 0xf1, 0x21, 0x7e, 0x79, 0x68, 0xb7, + 0xd4, 0x88, 0xf2, 0x8e, 0xe5, 0x90, 0xc6, 0x49, 0x4a, 0xe3, 0xad, 0x77, 0x42, 0x9e, 0xbe, 0xd6, + 0x39, 0xd2, 0x4d, 0xe2, 0x0c, 0x1a, 0xf6, 0x71, 0x4f, 0x08, 0x39, 0x84, 0x5a, 0xae, 0xd3, 0x21, + 0x63, 0x49, 0xd1, 0x46, 0x9f, 0x30, 0x2d, 0x4b, 0x57, 0x23, 0x4f, 0xca, 0x71, 0x4d, 0xa6, 0xf7, + 0xd3, 0x6a, 0xde, 0x1b, 0x26, 0x40, 0x3b, 0x47, 0xa4, 0xaf, 0xa5, 0xe4, 0xde, 0xce, 0x93, 0x73, + 0x99, 0x6e, 0x34, 0x74, 0x93, 0x51, 0xe6, 0x24, 0x85, 0xd4, 0x47, 0xb0, 0xb0, 0x6a, 0x18, 0xd6, + 0x0f, 0x48, 0x77, 0xc3, 0x20, 0xa7, 0xcf, 0x2c, 0xc3, 0xed, 0x13, 0x74, 0x17, 0x26, 0xbb, 0x8e, + 0x7e, 0x42, 0x9c, 0xaa, 0x72, 0x47, 0xb9, 0x37, 0xd5, 0x9c, 0xfd, 0xfc, 0xac, 0x76, 0xed, 0xfc, + 0xac, 0x36, 0xb9, 0x2e, 0x5a, 0xb1, 0xa4, 0xaa, 0x14, 0xe6, 0xa4, 0xf0, 0x53, 0x8b, 0xb2, 0x96, + 0xc6, 0x8e, 0xd0, 0x43, 0x00, 0x5b, 0x63, 0x47, 0x2d, 0x87, 0x1c, 0xea, 0xa7, 0x52, 0x1c, 0x49, + 0x71, 0x68, 0x05, 0x14, 0x1c, 0xe1, 0x42, 0xf7, 0xa1, 0xe2, 0x10, 0xad, 0xbb, 0x6b, 0x1a, 0x83, + 0x6a, 0xe1, 0x8e, 0x72, 0xaf, 0xd2, 0x9c, 0x97, 0x12, 0x15, 0x2c, 0xdb, 0x71, 0xc0, 0xa1, 0xfe, + 0xa5, 0x02, 0x5f, 0x5b, 0x73, 0x29, 0xb3, 0xfa, 0xdb, 0x84, 0x39, 0x7a, 0x67, 0xcd, 0x75, 0x1c, + 0x62, 0xb2, 0x36, 0xd3, 0x98, 0x4b, 0xd1, 0x1d, 0x28, 0x99, 0x5a, 0x9f, 0x48, 0xcd, 0xd7, 0x25, + 0x4e, 0x69, 0x47, 0xeb, 0x13, 0x2c, 0x28, 0xe8, 0x23, 0x98, 0x38, 0xd1, 0x0c, 0x97, 0x08, 0x55, + 0xd3, 0x0f, 0xeb, 0xf5, 0xd0, 0xfb, 0x82, 0x61, 0xab, 0xdb, 0xc7, 0x3d, 0xe1, 0x8e, 0xbe, 0x2f, + 0xd4, 0x3f, 0x74, 0x35, 0x93, 0xe9, 0x6c, 0xd0, 0x5c, 0x92, 0x90, 0xd7, 0xa5, 0xde, 0x67, 0x1c, + 0x0b, 0x7b, 0x90, 0xea, 0xef, 0xc0, 0xed, 0x5c, 0xd3, 0xb6, 0x74, 0xca, 0xd0, 0xc7, 0x30, 0xa1, + 0x33, 0xd2, 0xa7, 0x55, 0xe5, 0x4e, 0xf1, 0xde, 0xf4, 0xc3, 0xf7, 0xeb, 0x17, 0xba, 0x7e, 0x3d, + 0x17, 0xac, 0x39, 0x23, 0xcd, 0x98, 0xd8, 0xe4, 0x70, 0xd8, 0x43, 0x55, 0xff, 0x54, 0x01, 0x14, + 0x95, 0xd9, 0xd3, 0x9c, 0x1e, 0x61, 0x23, 0x0c, 0xca, 0x6f, 0x7c, 0xb5, 0x41, 0x59, 0x94, 0x90, + 0xd3, 0x9e, 0xc2, 0xd8, 0x98, 0xd8, 0xb0, 0x9c, 0x36, 0x49, 0x0c, 0xc6, 0xb3, 0xf8, 0x60, 0x3c, + 0x18, 0x63, 0x30, 0x3c, 0x94, 0x9c, 0x51, 0xf8, 0x61, 0x01, 0xa6, 0xd6, 0x35, 0xd2, 0xb7, 0xcc, + 0x36, 0x61, 0xe8, 0x13, 0xa8, 0xf0, 0xa5, 0xd9, 0xd5, 0x98, 0x26, 0x06, 0x60, 0xfa, 0xe1, 0x5b, + 0x17, 0xf5, 0x8e, 0xd6, 0x39, 0x77, 0xfd, 0xe4, 0x41, 0x7d, 0xf7, 0xe0, 0x53, 0xd2, 0x61, 0xdb, + 0x84, 0x69, 0xa1, 0x07, 0x87, 0x6d, 0x38, 0x40, 0x45, 0x3b, 0x50, 0xa2, 0x36, 0xe9, 0xc8, 0xb1, + 0xbb, 0x3f, 0xa4, 0x1b, 0x81, 0x65, 0x6d, 0x9b, 0x74, 0xc2, 0xc9, 0xe0, 0x5f, 0x58, 0xe0, 0xa0, + 0x67, 0x30, 0x49, 0xc5, 0x2c, 0x57, 0x8b, 0xa9, 0xd9, 0xb8, 0x18, 0xd1, 0xf3, 0x8d, 0x60, 0xb9, + 0x7a, 0xdf, 0x58, 0xa2, 0xa9, 0xff, 0x59, 0x00, 0x14, 0xf0, 0xae, 0x59, 0x66, 0x57, 0x67, 0xba, + 0x65, 0xa2, 0x0f, 0xa0, 0xc4, 0x06, 0xb6, 0xef, 0x1d, 0x77, 0x7d, 0x83, 0xf6, 0x06, 0x36, 0x79, + 0x7e, 0x56, 0x5b, 0x4e, 0x4b, 0x70, 0x0a, 0x16, 0x32, 0x68, 0x2b, 0x30, 0xb5, 0x20, 0xa4, 0xdf, + 0x89, 0xab, 0x7e, 0x7e, 0x56, 0xcb, 0x08, 0xc7, 0xf5, 0x00, 0x29, 0x6e, 0x20, 0x3a, 0x01, 0x64, + 0x68, 0x94, 0xed, 0x39, 0x9a, 0x49, 0x3d, 0x4d, 0x7a, 0x9f, 0xc8, 0x41, 0x78, 0x63, 0xb4, 0x49, + 0xe3, 0x12, 0xcd, 0x5b, 0xd2, 0x0a, 0xb4, 0x95, 0x42, 0xc3, 0x19, 0x1a, 0x78, 0xbc, 0x73, 0x88, + 0x46, 0x2d, 0xb3, 0x5a, 0x8a, 0xc7, 0x3b, 0x2c, 0x5a, 0xb1, 0xa4, 0xa2, 0xd7, 0xa1, 0xdc, 0x27, + 0x94, 0x6a, 0x3d, 0x52, 0x9d, 0x10, 0x8c, 0x73, 0x92, 0xb1, 0xbc, 0xed, 0x35, 0x63, 0x9f, 0xae, + 0xfe, 0x58, 0x81, 0x99, 0x60, 0xe4, 0x84, 0xb7, 0xff, 0x66, 0xca, 0x0f, 0xeb, 0xa3, 0x75, 0x89, + 0x4b, 0x0b, 0x2f, 0x0c, 0xa2, 0xa2, 0xdf, 0x12, 0xf1, 0xc1, 0x6d, 0x7f, 0x2d, 0x15, 0xc4, 0x5a, + 0xba, 0x37, 0xaa, 0xcb, 0xe4, 0x2c, 0xa1, 0x3f, 0x2b, 0x45, 0xcc, 0xe7, 0xae, 0x89, 0x3e, 0x86, + 0x0a, 0x25, 0x06, 0xe9, 0x30, 0xcb, 0x91, 0xe6, 0xbf, 0x3d, 0xa2, 0xf9, 0xda, 0x01, 0x31, 0xda, + 0x52, 0xb4, 0x79, 0x9d, 0xdb, 0xef, 0x7f, 0xe1, 0x00, 0x12, 0x7d, 0x08, 0x15, 0x46, 0xfa, 0xb6, + 0xa1, 0x31, 0x3f, 0x06, 0xbd, 0x16, 0xed, 0x02, 0xf7, 0x1c, 0x0e, 0xd6, 0xb2, 0xba, 0x7b, 0x92, + 0x4d, 0x2c, 0x9f, 0x60, 0x48, 0xfc, 0x56, 0x1c, 0xc0, 0xa0, 0x13, 0x98, 0x75, 0xed, 0x2e, 0xe7, + 0x64, 0x3c, 0xe3, 0xf5, 0x06, 0xd2, 0x93, 0xde, 0x1b, 0x75, 0x6c, 0xf6, 0x63, 0xd2, 0xcd, 0x65, + 0xa9, 0x6b, 0x36, 0xde, 0x8e, 0x13, 0x5a, 0xd0, 0x2a, 0xcc, 0xf5, 0x75, 0x93, 0x67, 0xae, 0x41, + 0x9b, 0x74, 0x2c, 0xb3, 0x4b, 0x85, 0x5b, 0x4d, 0x34, 0x6f, 0x4a, 0x80, 0xb9, 0xed, 0x38, 0x19, + 0x27, 0xf9, 0xd1, 0x77, 0x00, 0xf9, 0xdd, 0x78, 0xe2, 0x25, 0x6c, 0xdd, 0x32, 0x85, 0xcf, 0x15, + 0x43, 0xe7, 0xde, 0x4b, 0x71, 0xe0, 0x0c, 0x29, 0xb4, 0x05, 0x4b, 0x0e, 0x39, 0xd1, 0x79, 0x1f, + 0x9f, 0xea, 0x94, 0x59, 0xce, 0x60, 0x4b, 0xef, 0xeb, 0xac, 0x3a, 0x29, 0x6c, 0xaa, 0x9e, 0x9f, + 0xd5, 0x96, 0x70, 0x06, 0x1d, 0x67, 0x4a, 0xa9, 0x7f, 0x3e, 0x09, 0x73, 0x89, 0x78, 0x83, 0x9e, + 0xc1, 0x72, 0xc7, 0x4b, 0x4e, 0x3b, 0x6e, 0xff, 0x80, 0x38, 0xed, 0xce, 0x11, 0xe9, 0xba, 0x06, + 0xe9, 0x0a, 0x47, 0x99, 0x68, 0xae, 0x48, 0x8b, 0x97, 0xd7, 0x32, 0xb9, 0x70, 0x8e, 0x34, 0x1f, + 0x05, 0x53, 0x34, 0x6d, 0xeb, 0x94, 0x06, 0x98, 0x05, 0x81, 0x19, 0x8c, 0xc2, 0x4e, 0x8a, 0x03, + 0x67, 0x48, 0x71, 0x1b, 0xbb, 0x84, 0xea, 0x0e, 0xe9, 0x26, 0x6d, 0x2c, 0xc6, 0x6d, 0x5c, 0xcf, + 0xe4, 0xc2, 0x39, 0xd2, 0xe8, 0x5d, 0x98, 0xf6, 0xb4, 0x89, 0xf9, 0x93, 0x13, 0x1d, 0xa4, 0xc3, + 0x9d, 0x90, 0x84, 0xa3, 0x7c, 0xbc, 0x6b, 0xd6, 0x01, 0x25, 0xce, 0x09, 0xe9, 0xe6, 0x4f, 0xf0, + 0x6e, 0x8a, 0x03, 0x67, 0x48, 0xf1, 0xae, 0x79, 0x1e, 0x98, 0xea, 0xda, 0x64, 0xbc, 0x6b, 0xfb, + 0x99, 0x5c, 0x38, 0x47, 0x9a, 0xfb, 0xb1, 0x67, 0xf2, 0xea, 0x89, 0xa6, 0x1b, 0xda, 0x81, 0x41, + 0xaa, 0xe5, 0xb8, 0x1f, 0xef, 0xc4, 0xc9, 0x38, 0xc9, 0x8f, 0x9e, 0xc0, 0x82, 0xd7, 0xb4, 0x6f, + 0x6a, 0x01, 0x48, 0x45, 0x80, 0x7c, 0x4d, 0x82, 0x2c, 0xec, 0x24, 0x19, 0x70, 0x5a, 0x06, 0x7d, + 0x00, 0xb3, 0x1d, 0xcb, 0x30, 0x84, 0x3f, 0xae, 0x59, 0xae, 0xc9, 0xaa, 0x53, 0x02, 0x05, 0xf1, + 0xf5, 0xb8, 0x16, 0xa3, 0xe0, 0x04, 0x27, 0x22, 0x00, 0x1d, 0x3f, 0xe1, 0xd0, 0x2a, 0x8c, 0x54, + 0x6b, 0xa4, 0x93, 0x5e, 0x58, 0x03, 0x04, 0x4d, 0x14, 0x47, 0x80, 0xd5, 0x7f, 0x55, 0xe0, 0x66, + 0x4e, 0xe8, 0x40, 0xdf, 0x8a, 0xa5, 0xd8, 0x5f, 0x4e, 0xa4, 0xd8, 0x57, 0x72, 0xc4, 0x22, 0x79, + 0xd6, 0x84, 0x19, 0x87, 0xf7, 0xca, 0xec, 0x79, 0x2c, 0x32, 0x46, 0xbe, 0x3b, 0xa4, 0x1b, 0x38, + 0x2a, 0x13, 0xc6, 0xfc, 0x85, 0xf3, 0xb3, 0xda, 0x4c, 0x8c, 0x86, 0xe3, 0xf0, 0xea, 0x5f, 0x14, + 0x00, 0xd6, 0x89, 0x6d, 0x58, 0x83, 0x3e, 0x31, 0xaf, 0xa2, 0x86, 0xda, 0x8d, 0xd5, 0x50, 0x6f, + 0x0e, 0x9b, 0x9e, 0xc0, 0xb4, 0xdc, 0x22, 0xea, 0xd7, 0x13, 0x45, 0x54, 0x63, 0x74, 0xc8, 0x8b, + 0xab, 0xa8, 0x7f, 0x2f, 0xc2, 0x62, 0xc8, 0x1c, 0x96, 0x51, 0x8f, 0x62, 0x73, 0xfc, 0x4b, 0x89, + 0x39, 0xbe, 0x99, 0x21, 0xf2, 0xd2, 0xea, 0xa8, 0x17, 0x5f, 0xcf, 0xa0, 0x4f, 0x61, 0x96, 0x17, + 0x4e, 0x9e, 0x7b, 0x88, 0xb2, 0x6c, 0x72, 0xec, 0xb2, 0x2c, 0x48, 0xa0, 0x5b, 0x31, 0x24, 0x9c, + 0x40, 0xce, 0x29, 0x03, 0xcb, 0x2f, 0xbb, 0x0c, 0x54, 0x3f, 0x53, 0x60, 0x36, 0x9c, 0xa6, 0x2b, + 0x28, 0xda, 0x76, 0xe2, 0x45, 0xdb, 0xeb, 0x23, 0xbb, 0x68, 0x4e, 0xd5, 0xf6, 0xdf, 0xbc, 0xc0, + 0x0f, 0x98, 0xf8, 0x02, 0x3f, 0xd0, 0x3a, 0xc7, 0x23, 0x6c, 0xff, 0x7e, 0xa8, 0x00, 0x92, 0x59, + 0x60, 0xd5, 0x34, 0x2d, 0xa6, 0x79, 0xb1, 0xd2, 0x33, 0x6b, 0x73, 0x64, 0xb3, 0x7c, 0x8d, 0xf5, + 0xfd, 0x14, 0xd6, 0x63, 0x93, 0x39, 0x83, 0x70, 0x46, 0xd2, 0x0c, 0x38, 0xc3, 0x00, 0xa4, 0x01, + 0x38, 0x12, 0x73, 0xcf, 0x92, 0x0b, 0xf9, 0xcd, 0x11, 0x62, 0x1e, 0x17, 0x58, 0xb3, 0xcc, 0x43, + 0xbd, 0x17, 0x86, 0x1d, 0x1c, 0x00, 0xe1, 0x08, 0xe8, 0xad, 0xc7, 0x70, 0x33, 0xc7, 0x5a, 0x34, + 0x0f, 0xc5, 0x63, 0x32, 0xf0, 0x86, 0x0d, 0xf3, 0x9f, 0x68, 0x29, 0xba, 0x4d, 0x9e, 0x92, 0x3b, + 0xdc, 0x0f, 0x0a, 0xef, 0x2b, 0xea, 0x8f, 0x27, 0xa2, 0xbe, 0x23, 0x2a, 0xe6, 0x7b, 0x50, 0x71, + 0x88, 0x6d, 0xe8, 0x1d, 0x8d, 0xca, 0x42, 0xe8, 0xba, 0x77, 0xa4, 0xe1, 0xb5, 0xe1, 0x80, 0x1a, + 0xab, 0xad, 0x0b, 0x2f, 0xb7, 0xb6, 0x2e, 0xbe, 0x98, 0xda, 0xfa, 0xb7, 0xa0, 0x42, 0xfd, 0xaa, + 0xba, 0x24, 0x20, 0x1f, 0x8c, 0x11, 0x5f, 0x65, 0x41, 0x1d, 0x28, 0x08, 0x4a, 0xe9, 0x00, 0x34, + 0xab, 0x88, 0x9e, 0x18, 0xb3, 0x88, 0x7e, 0xa1, 0x85, 0x2f, 0x8f, 0xa9, 0xb6, 0xe6, 0x52, 0xd2, + 0x15, 0x81, 0xa8, 0x12, 0xc6, 0xd4, 0x96, 0x68, 0xc5, 0x92, 0x8a, 0x3e, 0x8e, 0xb9, 0x6c, 0xe5, + 0x32, 0x2e, 0x3b, 0x9b, 0xef, 0xae, 0x68, 0x1f, 0x6e, 0xda, 0x8e, 0xd5, 0x73, 0x08, 0xa5, 0xeb, + 0x44, 0xeb, 0x1a, 0xba, 0x49, 0xfc, 0xf1, 0xf1, 0x2a, 0xa2, 0x57, 0xce, 0xcf, 0x6a, 0x37, 0x5b, + 0xd9, 0x2c, 0x38, 0x4f, 0x56, 0xfd, 0xbc, 0x04, 0xf3, 0xc9, 0x0c, 0x98, 0x53, 0xa4, 0x2a, 0x97, + 0x2a, 0x52, 0xef, 0x47, 0x16, 0x83, 0x57, 0xc1, 0x47, 0xce, 0xf8, 0x52, 0x0b, 0x62, 0x15, 0xe6, + 0x64, 0x34, 0xf0, 0x89, 0xb2, 0x4c, 0x0f, 0x66, 0x7f, 0x3f, 0x4e, 0xc6, 0x49, 0x7e, 0x5e, 0x7a, + 0x86, 0x15, 0xa5, 0x0f, 0x52, 0x8a, 0x97, 0x9e, 0xab, 0x49, 0x06, 0x9c, 0x96, 0x41, 0xdb, 0xb0, + 0xe8, 0x9a, 0x69, 0x28, 0xcf, 0x1b, 0x5f, 0x91, 0x50, 0x8b, 0xfb, 0x69, 0x16, 0x9c, 0x25, 0x87, + 0x0e, 0x63, 0xd5, 0xe8, 0xa4, 0x88, 0xb0, 0x0f, 0x47, 0x5e, 0x3b, 0x23, 0x97, 0xa3, 0xe8, 0x11, + 0xcc, 0x38, 0x62, 0xdf, 0xe1, 0x1b, 0xec, 0xd5, 0xee, 0x37, 0xa4, 0xd8, 0x0c, 0x8e, 0x12, 0x71, + 0x9c, 0x37, 0xa3, 0xdc, 0xae, 0x8c, 0x5a, 0x6e, 0xab, 0xff, 0xac, 0x44, 0x93, 0x50, 0x50, 0x02, + 0x0f, 0x3b, 0x65, 0x4a, 0x49, 0x44, 0xaa, 0x23, 0x2b, 0xbb, 0xfa, 0x7d, 0x6f, 0xac, 0xea, 0x37, + 0x4c, 0x9e, 0xc3, 0xcb, 0xdf, 0x1f, 0x29, 0xb0, 0xbc, 0xd1, 0x7e, 0xe2, 0x58, 0xae, 0xed, 0x9b, + 0xb3, 0x6b, 0x7b, 0xe3, 0xfa, 0x0d, 0x28, 0x39, 0xae, 0xe1, 0xf7, 0xe3, 0x35, 0xbf, 0x1f, 0xd8, + 0x35, 0x78, 0x3f, 0x16, 0x13, 0x52, 0x5e, 0x27, 0xb8, 0x00, 0xda, 0x81, 0x49, 0x47, 0x33, 0x7b, + 0xc4, 0x4f, 0xab, 0x77, 0x87, 0x58, 0xbf, 0xb9, 0x8e, 0x39, 0x7b, 0xa4, 0x78, 0x13, 0xd2, 0x58, + 0xa2, 0xa8, 0x7f, 0xa4, 0xc0, 0xdc, 0xd3, 0xbd, 0xbd, 0xd6, 0xa6, 0x29, 0x56, 0xb4, 0x38, 0x7d, + 0xbf, 0x03, 0x25, 0x5b, 0x63, 0x47, 0xc9, 0x4c, 0xcf, 0x69, 0x58, 0x50, 0xd0, 0x77, 0xa1, 0xcc, + 0x23, 0x09, 0x31, 0xbb, 0x23, 0x96, 0xda, 0x12, 0xbe, 0xe9, 0x09, 0x85, 0x15, 0xa2, 0x6c, 0xc0, + 0x3e, 0x9c, 0x7a, 0x0c, 0x4b, 0x11, 0x73, 0xf8, 0x78, 0x88, 0x63, 0x60, 0xd4, 0x86, 0x09, 0xae, + 0xd9, 0x3f, 0xe5, 0x1d, 0x76, 0x98, 0x99, 0xe8, 0x52, 0x58, 0xe9, 0xf0, 0x2f, 0x8a, 0x3d, 0x2c, + 0x75, 0x1b, 0x66, 0xc4, 0x95, 0x83, 0xe5, 0x30, 0x31, 0x2c, 0xe8, 0x36, 0x14, 0xfb, 0xba, 0x29, + 0xf3, 0xec, 0xb4, 0x94, 0x29, 0xf2, 0x1c, 0xc1, 0xdb, 0x05, 0x59, 0x3b, 0x95, 0x91, 0x27, 0x24, + 0x6b, 0xa7, 0x98, 0xb7, 0xab, 0x4f, 0xa0, 0x2c, 0x87, 0x3b, 0x0a, 0x54, 0xbc, 0x18, 0xa8, 0x98, + 0x01, 0xb4, 0x0b, 0xe5, 0xcd, 0x56, 0xd3, 0xb0, 0xbc, 0xaa, 0xab, 0xa3, 0x77, 0x9d, 0xe4, 0x5c, + 0xac, 0x6d, 0xae, 0x63, 0x2c, 0x28, 0x48, 0x85, 0x49, 0x72, 0xda, 0x21, 0x36, 0x13, 0x1e, 0x31, + 0xd5, 0x04, 0x3e, 0xcb, 0x8f, 0x45, 0x0b, 0x96, 0x14, 0xf5, 0x8f, 0x0b, 0x50, 0x96, 0xc3, 0x71, + 0x05, 0xbb, 0xb0, 0xad, 0xd8, 0x2e, 0xec, 0x8d, 0xd1, 0x5c, 0x23, 0x77, 0x0b, 0xb6, 0x97, 0xd8, + 0x82, 0xdd, 0x1f, 0x11, 0xef, 0xe2, 0xfd, 0xd7, 0x3f, 0x28, 0x30, 0x1b, 0x77, 0x4a, 0xf4, 0x2e, + 0x4c, 0xf3, 0x84, 0xa3, 0x77, 0xc8, 0x4e, 0x58, 0xe7, 0x06, 0x87, 0x30, 0xed, 0x90, 0x84, 0xa3, + 0x7c, 0xa8, 0x17, 0x88, 0x71, 0x3f, 0x92, 0x9d, 0xce, 0x1f, 0x52, 0x97, 0xe9, 0x46, 0xdd, 0xbb, + 0x46, 0xab, 0x6f, 0x9a, 0x6c, 0xd7, 0x69, 0x33, 0x47, 0x37, 0x7b, 0x29, 0x45, 0xc2, 0x29, 0xa3, + 0xc8, 0xea, 0x3f, 0x29, 0x30, 0x2d, 0x4d, 0xbe, 0x82, 0x5d, 0xc5, 0xaf, 0xc5, 0x77, 0x15, 0x77, + 0x47, 0x5c, 0xe0, 0xd9, 0x5b, 0x8a, 0xbf, 0x09, 0x4d, 0xe7, 0x4b, 0x9a, 0x7b, 0xf5, 0x91, 0x45, + 0x59, 0xd2, 0xab, 0xf9, 0x62, 0xc4, 0x82, 0x82, 0x5c, 0x98, 0xd7, 0x13, 0x31, 0x40, 0x0e, 0x6d, + 0x63, 0x34, 0x4b, 0x02, 0xb1, 0x66, 0x55, 0xc2, 0xcf, 0x27, 0x29, 0x38, 0xa5, 0x42, 0x25, 0x90, + 0xe2, 0x42, 0x1f, 0x42, 0xe9, 0x88, 0x31, 0x3b, 0xe3, 0xbc, 0x7a, 0x48, 0xe4, 0x09, 0x4d, 0xa8, + 0x88, 0xde, 0xed, 0xed, 0xb5, 0xb0, 0x80, 0x52, 0xff, 0x27, 0x1c, 0x8f, 0xb6, 0xe7, 0xe3, 0x41, + 0x3c, 0x55, 0x2e, 0x13, 0x4f, 0xa7, 0xb3, 0x62, 0x29, 0x7a, 0x0a, 0x45, 0x66, 0x8c, 0xba, 0x2d, + 0x94, 0x88, 0x7b, 0x5b, 0xed, 0x30, 0x20, 0xed, 0x6d, 0xb5, 0x31, 0x87, 0x40, 0xbb, 0x30, 0xc1, + 0xb3, 0x0f, 0x5f, 0x82, 0xc5, 0xd1, 0x97, 0x34, 0xef, 0x7f, 0xe8, 0x10, 0xfc, 0x8b, 0x62, 0x0f, + 0x47, 0xfd, 0x3e, 0xcc, 0xc4, 0xd6, 0x29, 0xfa, 0x04, 0xae, 0x1b, 0x96, 0xd6, 0x6d, 0x6a, 0x86, + 0x66, 0x76, 0x88, 0x7f, 0x39, 0x70, 0x37, 0x6b, 0x87, 0xb1, 0x15, 0xe1, 0x93, 0xab, 0x3c, 0xb8, + 0x4e, 0x8d, 0xd2, 0x70, 0x0c, 0x51, 0xd5, 0x00, 0xc2, 0x3e, 0xa2, 0x1a, 0x4c, 0x70, 0x3f, 0xf3, + 0xf2, 0xc9, 0x54, 0x73, 0x8a, 0x5b, 0xc8, 0xdd, 0x8f, 0x62, 0xaf, 0x1d, 0x3d, 0x04, 0xa0, 0xa4, + 0xe3, 0x10, 0x26, 0x82, 0x41, 0x21, 0x7e, 0x05, 0xdd, 0x0e, 0x28, 0x38, 0xc2, 0xa5, 0xfe, 0x8b, + 0x02, 0x33, 0x3b, 0x84, 0xfd, 0xc0, 0x72, 0x8e, 0x5b, 0x96, 0xa1, 0x77, 0x06, 0x57, 0x10, 0x6c, + 0x71, 0x2c, 0xd8, 0xbe, 0x35, 0x64, 0x66, 0x62, 0xd6, 0xe5, 0x85, 0x5c, 0xf5, 0x33, 0x05, 0x6e, + 0xc6, 0x38, 0x1f, 0x87, 0x4b, 0x77, 0x1f, 0x26, 0x6c, 0xcb, 0x61, 0x7e, 0x22, 0x1e, 0x4b, 0x21, + 0x0f, 0x63, 0x91, 0x54, 0xcc, 0x61, 0xb0, 0x87, 0x86, 0xb6, 0xa0, 0xc0, 0x2c, 0xe9, 0xaa, 0xe3, + 0x61, 0x12, 0xe2, 0x34, 0x41, 0x62, 0x16, 0xf6, 0x2c, 0x5c, 0x60, 0x16, 0x9f, 0x88, 0x6a, 0x8c, + 0x2b, 0x1a, 0x7c, 0x5e, 0x52, 0x0f, 0x30, 0x94, 0x0e, 0x1d, 0xab, 0x7f, 0xe9, 0x3e, 0x04, 0x13, + 0xb1, 0xe1, 0x58, 0x7d, 0x2c, 0xb0, 0xd4, 0x9f, 0x28, 0xb0, 0x10, 0xe3, 0xbc, 0x82, 0xc0, 0xff, + 0x61, 0x3c, 0xf0, 0xdf, 0x1f, 0xa7, 0x23, 0x39, 0xe1, 0xff, 0x27, 0x85, 0x44, 0x37, 0x78, 0x87, + 0xd1, 0x21, 0x4c, 0xdb, 0x56, 0xb7, 0xfd, 0x02, 0xae, 0x03, 0xe7, 0x78, 0xde, 0x6c, 0x85, 0x58, + 0x38, 0x0a, 0x8c, 0x4e, 0x61, 0xc1, 0xd4, 0xfa, 0x84, 0xda, 0x5a, 0x87, 0xb4, 0x5f, 0xc0, 0x01, + 0xc9, 0x0d, 0x71, 0xdf, 0x90, 0x44, 0xc4, 0x69, 0x25, 0x68, 0x1b, 0xca, 0xba, 0x2d, 0xea, 0x38, + 0x59, 0xbb, 0x0c, 0xcd, 0xa2, 0x5e, 0xd5, 0xe7, 0xc5, 0x73, 0xf9, 0x81, 0x7d, 0x0c, 0xf5, 0x6f, + 0x93, 0xde, 0xc0, 0xfd, 0x0f, 0x3d, 0x81, 0x8a, 0x78, 0x84, 0xd3, 0xb1, 0x0c, 0xff, 0x66, 0x80, + 0xcf, 0x6c, 0x4b, 0xb6, 0x3d, 0x3f, 0xab, 0xbd, 0x92, 0x71, 0xe8, 0xeb, 0x93, 0x71, 0x20, 0x8c, + 0x76, 0xa0, 0x64, 0x7f, 0x95, 0x0a, 0x46, 0x24, 0x39, 0x51, 0xb6, 0x08, 0x1c, 0xf5, 0xf7, 0x8a, + 0x09, 0x73, 0x45, 0xaa, 0xfb, 0xf4, 0x85, 0xcd, 0x7a, 0x50, 0x31, 0xe5, 0xce, 0xfc, 0x01, 0x94, + 0x65, 0x86, 0x97, 0xce, 0xfc, 0x8d, 0x71, 0x9c, 0x39, 0x9a, 0xc5, 0x82, 0x0d, 0x8b, 0xdf, 0xe8, + 0x03, 0xa3, 0xef, 0xc1, 0x24, 0xf1, 0x54, 0x78, 0xb9, 0xf1, 0xbd, 0x71, 0x54, 0x84, 0x71, 0x35, + 0x2c, 0x54, 0x65, 0x9b, 0x44, 0x45, 0xdf, 0xe2, 0xe3, 0xc5, 0x79, 0xf9, 0x26, 0x90, 0x56, 0x4b, + 0x22, 0x5d, 0xdd, 0xf6, 0xba, 0x1d, 0x34, 0x3f, 0x3f, 0xab, 0x41, 0xf8, 0x89, 0xa3, 0x12, 0xea, + 0xbf, 0x29, 0xb0, 0x20, 0x46, 0xa8, 0xe3, 0x3a, 0x3a, 0x1b, 0x5c, 0x59, 0x62, 0x7a, 0x16, 0x4b, + 0x4c, 0xef, 0x0c, 0x19, 0x96, 0x94, 0x85, 0xb9, 0xc9, 0xe9, 0xa7, 0x0a, 0xdc, 0x48, 0x71, 0x5f, + 0x41, 0x5c, 0xdc, 0x8f, 0xc7, 0xc5, 0xb7, 0xc6, 0xed, 0x50, 0x4e, 0x6c, 0xfc, 0xab, 0xb9, 0x8c, + 0xee, 0x88, 0x95, 0xf2, 0x10, 0xc0, 0x76, 0xf4, 0x13, 0xdd, 0x20, 0x3d, 0x79, 0x09, 0x5e, 0x89, + 0x3c, 0x82, 0x0b, 0x28, 0x38, 0xc2, 0x85, 0x28, 0x2c, 0x77, 0xc9, 0xa1, 0xe6, 0x1a, 0x6c, 0xb5, + 0xdb, 0x5d, 0xd3, 0x6c, 0xed, 0x40, 0x37, 0x74, 0xa6, 0xcb, 0xe3, 0x82, 0xa9, 0xe6, 0x23, 0xef, + 0x72, 0x3a, 0x8b, 0xe3, 0xf9, 0x59, 0xed, 0x76, 0xd6, 0xed, 0x90, 0xcf, 0x32, 0xc0, 0x39, 0xd0, + 0x68, 0x00, 0x55, 0x87, 0x7c, 0xdf, 0xd5, 0x1d, 0xd2, 0x5d, 0x77, 0x2c, 0x3b, 0xa6, 0xb6, 0x28, + 0xd4, 0xfe, 0xea, 0xf9, 0x59, 0xad, 0x8a, 0x73, 0x78, 0x86, 0x2b, 0xce, 0x85, 0x47, 0x9f, 0xc2, + 0xa2, 0xe6, 0xbd, 0x1d, 0x8c, 0x69, 0xf5, 0x56, 0xc9, 0xfb, 0xe7, 0x67, 0xb5, 0xc5, 0xd5, 0x34, + 0x79, 0xb8, 0xc2, 0x2c, 0x50, 0xd4, 0x80, 0xf2, 0x89, 0x78, 0xd9, 0x48, 0xab, 0x13, 0x02, 0x9f, + 0x27, 0x82, 0xb2, 0xf7, 0xd8, 0x91, 0x63, 0x4e, 0x6e, 0xb4, 0xc5, 0xea, 0xf3, 0xb9, 0xf8, 0x86, + 0x92, 0xd7, 0x92, 0x72, 0xc5, 0x8b, 0x13, 0xe3, 0x4a, 0x18, 0xb5, 0x9e, 0x86, 0x24, 0x1c, 0xe5, + 0x43, 0x1f, 0xc3, 0xd4, 0x91, 0x3c, 0x95, 0xa0, 0xd5, 0xf2, 0x48, 0x49, 0x38, 0x76, 0x8a, 0xd1, + 0x5c, 0x90, 0x2a, 0xa6, 0xfc, 0x66, 0x8a, 0x43, 0x44, 0xf4, 0x3a, 0x94, 0xc5, 0xc7, 0xe6, 0xba, + 0x38, 0x8e, 0xab, 0x84, 0xb1, 0xed, 0xa9, 0xd7, 0x8c, 0x7d, 0xba, 0xcf, 0xba, 0xd9, 0x5a, 0x13, + 0xc7, 0xc2, 0x09, 0xd6, 0xcd, 0xd6, 0x1a, 0xf6, 0xe9, 0xe8, 0x13, 0x28, 0x53, 0xb2, 0xa5, 0x9b, + 0xee, 0x69, 0x15, 0x46, 0xba, 0x54, 0x6e, 0x3f, 0x16, 0xdc, 0x89, 0x83, 0xb1, 0x50, 0x83, 0xa4, + 0x63, 0x1f, 0x16, 0x1d, 0xc1, 0x94, 0xe3, 0x9a, 0xab, 0x74, 0x9f, 0x12, 0xa7, 0x3a, 0x2d, 0x74, + 0x0c, 0x0b, 0xe7, 0xd8, 0xe7, 0x4f, 0x6a, 0x09, 0x46, 0x28, 0xe0, 0xc0, 0x21, 0x38, 0xfa, 0x43, + 0x05, 0x10, 0x75, 0x6d, 0xdb, 0x20, 0x7d, 0x62, 0x32, 0xcd, 0x10, 0x67, 0x71, 0xb4, 0x7a, 0x5d, + 0xe8, 0xfc, 0xf6, 0xb0, 0x7e, 0xa5, 0x04, 0x93, 0xca, 0x83, 0x43, 0xef, 0x34, 0x2b, 0xce, 0xd0, + 0xcb, 0x87, 0xf6, 0x90, 0x8a, 0xdf, 0xd5, 0x99, 0x91, 0x86, 0x36, 0xfb, 0xcc, 0x31, 0x1c, 0x5a, + 0x49, 0xc7, 0x3e, 0x2c, 0x7a, 0x06, 0xcb, 0xfe, 0xc3, 0x58, 0x6c, 0x59, 0x6c, 0x43, 0x37, 0x08, + 0x1d, 0x50, 0x46, 0xfa, 0xd5, 0x59, 0x31, 0xed, 0xc1, 0xdb, 0x0f, 0x9c, 0xc9, 0x85, 0x73, 0xa4, + 0x51, 0x1f, 0x6a, 0x7e, 0xc8, 0xe0, 0xeb, 0x29, 0x88, 0x59, 0x8f, 0x69, 0x47, 0x33, 0xbc, 0x7b, + 0x80, 0x39, 0xa1, 0xe0, 0xb5, 0xf3, 0xb3, 0x5a, 0x6d, 0xfd, 0x62, 0x56, 0x3c, 0x0c, 0x0b, 0x7d, + 0x17, 0xaa, 0x5a, 0x9e, 0x9e, 0x79, 0xa1, 0xe7, 0x55, 0x1e, 0x87, 0x72, 0x15, 0xe4, 0x4a, 0x23, + 0x06, 0xf3, 0x5a, 0xfc, 0x89, 0x32, 0xad, 0x2e, 0x8c, 0x74, 0x10, 0x99, 0x78, 0xd9, 0x1c, 0x1e, + 0x46, 0x24, 0x08, 0x14, 0xa7, 0x34, 0xa0, 0xdf, 0x06, 0xa4, 0x25, 0x5f, 0x55, 0xd3, 0x2a, 0x1a, + 0x29, 0xfd, 0xa4, 0x9e, 0x63, 0x87, 0x6e, 0x97, 0x22, 0x51, 0x9c, 0xa1, 0x07, 0x6d, 0xc1, 0x92, + 0x6c, 0xdd, 0x37, 0xa9, 0x76, 0x48, 0xda, 0x03, 0xda, 0x61, 0x06, 0xad, 0x2e, 0x8a, 0xd8, 0x27, + 0x2e, 0xbe, 0x56, 0x33, 0xe8, 0x38, 0x53, 0x0a, 0x7d, 0x1b, 0xe6, 0x0f, 0x2d, 0xe7, 0x40, 0xef, + 0x76, 0x89, 0xe9, 0x23, 0x2d, 0x09, 0xa4, 0x25, 0x3e, 0x1a, 0x1b, 0x09, 0x1a, 0x4e, 0x71, 0x23, + 0x0a, 0x37, 0x24, 0x72, 0xcb, 0xb1, 0x3a, 0xdb, 0x96, 0x6b, 0x32, 0xaf, 0x24, 0xba, 0x11, 0xa4, + 0x98, 0x1b, 0xab, 0x59, 0x0c, 0xcf, 0xcf, 0x6a, 0x77, 0xb2, 0x2b, 0xe0, 0x90, 0x09, 0x67, 0x63, + 0x8b, 0x17, 0x2c, 0xf2, 0x3e, 0xe3, 0x6a, 0x5e, 0x01, 0x8f, 0xf7, 0x82, 0x25, 0x34, 0xed, 0x85, + 0xbd, 0x60, 0x89, 0x40, 0x5e, 0x7c, 0x82, 0xfa, 0x5f, 0x05, 0x58, 0x0c, 0x99, 0x47, 0x7e, 0xc1, + 0x92, 0x21, 0xf2, 0x8b, 0x97, 0xc0, 0xc3, 0x5f, 0x02, 0x7f, 0xa6, 0xc0, 0x6c, 0x38, 0x74, 0xff, + 0xf7, 0x5e, 0x95, 0x84, 0xb6, 0xe5, 0xd4, 0xb9, 0x7f, 0x5f, 0x88, 0x76, 0xe0, 0xff, 0xfd, 0xd3, + 0x86, 0xaf, 0xfe, 0x7c, 0x57, 0xfd, 0x69, 0x11, 0xe6, 0x93, 0xab, 0x31, 0x76, 0x03, 0xae, 0x0c, + 0xbd, 0x01, 0x6f, 0xc1, 0xd2, 0xa1, 0x6b, 0x18, 0x03, 0x31, 0x0c, 0x91, 0x6b, 0x70, 0xef, 0x06, + 0xeb, 0x55, 0x29, 0xb9, 0xb4, 0x91, 0xc1, 0x83, 0x33, 0x25, 0x73, 0x6e, 0xf3, 0x8b, 0x97, 0xba, + 0xcd, 0x4f, 0x5d, 0x2e, 0x97, 0xc6, 0xb8, 0x5c, 0xce, 0xbc, 0x99, 0x9f, 0xb8, 0xc4, 0xcd, 0xfc, + 0x65, 0xae, 0xd2, 0x33, 0x82, 0xd8, 0xd0, 0x97, 0x9d, 0xaf, 0xc2, 0x2d, 0x29, 0xc6, 0xc4, 0x2d, + 0xb7, 0xc9, 0x1c, 0xcb, 0x30, 0x88, 0xb3, 0xee, 0xf6, 0xfb, 0x03, 0xf5, 0x9b, 0x30, 0x1b, 0x7f, + 0xbf, 0xe1, 0xcd, 0xb4, 0xf7, 0x84, 0x44, 0xde, 0x23, 0x46, 0x66, 0xda, 0x6b, 0xc7, 0x01, 0x87, + 0xfa, 0xfb, 0x0a, 0x2c, 0x67, 0xbf, 0xd3, 0x44, 0x06, 0xcc, 0xf6, 0xb5, 0xd3, 0xe8, 0xdb, 0x59, + 0xe5, 0x92, 0x27, 0x3c, 0xe2, 0xe2, 0x7e, 0x3b, 0x86, 0x85, 0x13, 0xd8, 0xea, 0x97, 0x0a, 0xdc, + 0xcc, 0xb9, 0x32, 0xbf, 0x5a, 0x4b, 0xd0, 0x47, 0x50, 0xe9, 0x6b, 0xa7, 0x6d, 0xd7, 0xe9, 0x91, + 0x4b, 0x9f, 0x69, 0x89, 0x88, 0xb1, 0x2d, 0x51, 0x70, 0x80, 0xa7, 0xfe, 0x48, 0x81, 0x6a, 0xde, + 0xee, 0x02, 0xbd, 0x1b, 0xbb, 0xdc, 0xff, 0x7a, 0xe2, 0x72, 0x7f, 0x21, 0x25, 0xf7, 0x92, 0xae, + 0xf6, 0xff, 0x4e, 0x81, 0xe5, 0xec, 0x5d, 0x16, 0x7a, 0x3b, 0x66, 0x61, 0x2d, 0x61, 0xe1, 0x5c, + 0x42, 0x4a, 0xda, 0xf7, 0x3d, 0x98, 0x95, 0x7b, 0x31, 0x09, 0x23, 0x47, 0x55, 0xcd, 0x8a, 0x95, + 0x12, 0xc2, 0xdf, 0x7b, 0x88, 0xf9, 0x8a, 0xb7, 0xe1, 0x04, 0x9a, 0xfa, 0x07, 0x05, 0x98, 0x68, + 0x77, 0x34, 0x83, 0x5c, 0x41, 0x99, 0xf5, 0x9d, 0x58, 0x99, 0x35, 0xec, 0x7f, 0x2e, 0xc2, 0xaa, + 0xdc, 0x0a, 0x0b, 0x27, 0x2a, 0xac, 0x37, 0x46, 0x42, 0xbb, 0xb8, 0xb8, 0xfa, 0x15, 0x98, 0x0a, + 0x94, 0x8e, 0x17, 0xf3, 0xd5, 0xbf, 0x2e, 0xc0, 0x74, 0x44, 0xc5, 0x98, 0x19, 0xe3, 0x30, 0x96, + 0x69, 0x47, 0xf9, 0x77, 0x61, 0x44, 0x57, 0xdd, 0xcf, 0xad, 0xde, 0x3b, 0xcd, 0xf0, 0x65, 0x5e, + 0x3a, 0xe5, 0x7e, 0x13, 0x66, 0x99, 0xf8, 0xf7, 0x5d, 0x70, 0x12, 0x5c, 0x14, 0xbe, 0x18, 0xbc, + 0xee, 0xdd, 0x8b, 0x51, 0x71, 0x82, 0xfb, 0xd6, 0x23, 0x98, 0x89, 0x29, 0x1b, 0xeb, 0x99, 0xe5, + 0x3f, 0x2a, 0xf0, 0xf5, 0xa1, 0xfb, 0x74, 0xd4, 0x8c, 0x2d, 0x92, 0x7a, 0x62, 0x91, 0xac, 0xe4, + 0x03, 0xbc, 0xbc, 0xe7, 0x3a, 0xcd, 0x37, 0x3f, 0xff, 0x62, 0xe5, 0xda, 0xcf, 0xbe, 0x58, 0xb9, + 0xf6, 0xf3, 0x2f, 0x56, 0xae, 0xfd, 0xee, 0xf9, 0x8a, 0xf2, 0xf9, 0xf9, 0x8a, 0xf2, 0xb3, 0xf3, + 0x15, 0xe5, 0xe7, 0xe7, 0x2b, 0xca, 0x7f, 0x9c, 0xaf, 0x28, 0x7f, 0xf2, 0xe5, 0xca, 0xb5, 0x8f, + 0xca, 0x12, 0xee, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xa7, 0xd7, 0xb5, 0x56, 0x5c, 0x3d, 0x00, + 0x00, } diff --git a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto index 1cba30a17c3..1a9b7ebb194 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/extensions/v1beta1/generated.proto @@ -902,6 +902,12 @@ message PodSecurityPolicySpec { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional repeated string forbiddenSysctls = 20; + + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. + // +optional + repeated string allowedProcMountTypes = 21; } // DEPRECATED - This group version of ReplicaSet is deprecated by apps/v1beta2/ReplicaSet. See the release notes for diff --git a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go index 268d2c4fcc9..cdbc490a5ef 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go @@ -481,6 +481,7 @@ var map_PodSecurityPolicySpec = map[string]string{ "allowedFlexVolumes": "allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", + "allowedProcMountTypes": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", } func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go index 0e94ab1fb46..65801c23edb 100644 --- a/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go @@ -1134,6 +1134,11 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowedProcMountTypes != nil { + in, out := &in.AllowedProcMountTypes, &out.AllowedProcMountTypes + *out = make([]corev1.ProcMountType, len(*in)) + copy(*out, *in) + } return } diff --git a/staging/src/k8s.io/api/policy/v1beta1/generated.pb.go b/staging/src/k8s.io/api/policy/v1beta1/generated.pb.go index 505fb0e036f..d7d62dd3ab8 100644 --- a/staging/src/k8s.io/api/policy/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/policy/v1beta1/generated.pb.go @@ -836,6 +836,23 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], s) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + dAtA[i] = 0xaa + i++ + dAtA[i] = 0x1 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } + } return i, nil } @@ -1189,6 +1206,12 @@ func (m *PodSecurityPolicySpec) Size() (n int) { n += 2 + l + sovGenerated(uint64(l)) } } + if len(m.AllowedProcMountTypes) > 0 { + for _, s := range m.AllowedProcMountTypes { + l = len(s) + n += 2 + l + sovGenerated(uint64(l)) + } + } return n } @@ -1417,6 +1440,7 @@ func (this *PodSecurityPolicySpec) String() string { `AllowedFlexVolumes:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.AllowedFlexVolumes), "AllowedFlexVolume", "AllowedFlexVolume", 1), `&`, ``, 1) + `,`, `AllowedUnsafeSysctls:` + fmt.Sprintf("%v", this.AllowedUnsafeSysctls) + `,`, `ForbiddenSysctls:` + fmt.Sprintf("%v", this.ForbiddenSysctls) + `,`, + `AllowedProcMountTypes:` + fmt.Sprintf("%v", this.AllowedProcMountTypes) + `,`, `}`, }, "") return s @@ -3484,6 +3508,35 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error { } m.ForbiddenSysctls = append(m.ForbiddenSysctls, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex + case 21: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedProcMountTypes", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedProcMountTypes = append(m.AllowedProcMountTypes, k8s_io_api_core_v1.ProcMountType(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3947,110 +4000,113 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1679 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4f, 0x6f, 0x23, 0xb7, - 0x15, 0xf7, 0xac, 0x6c, 0x4b, 0xa6, 0x6d, 0xad, 0x4d, 0x7b, 0xdd, 0x89, 0xd1, 0xd5, 0x24, 0x0a, - 0x50, 0x6c, 0x83, 0x64, 0x14, 0x7b, 0x93, 0xd6, 0x68, 0xda, 0x22, 0x1e, 0xcb, 0xff, 0x02, 0xbb, - 0x56, 0xa9, 0xdd, 0xa0, 0x2d, 0xb6, 0x45, 0x29, 0x0d, 0x2d, 0x31, 0x1e, 0xcd, 0x4c, 0x49, 0x8e, - 0x22, 0xdd, 0x7a, 0xe8, 0xa1, 0xe8, 0xa9, 0x5f, 0xa0, 0x9f, 0xa0, 0xe8, 0xa9, 0x5f, 0xc2, 0x05, - 0x8a, 0x22, 0xc7, 0xa0, 0x07, 0xa1, 0xab, 0xa2, 0x5f, 0x22, 0xa7, 0x62, 0x28, 0x8e, 0xa4, 0xf9, - 0x23, 0x79, 0x1d, 0x60, 0xf7, 0xa6, 0xe1, 0xfb, 0xfd, 0x7e, 0xef, 0xf1, 0xf1, 0xf1, 0x91, 0x14, - 0xb0, 0x6e, 0x0e, 0xb8, 0x49, 0xbd, 0xca, 0x4d, 0xd0, 0x20, 0xcc, 0x25, 0x82, 0xf0, 0x4a, 0x97, - 0xb8, 0xb6, 0xc7, 0x2a, 0xca, 0x80, 0x7d, 0x5a, 0xf1, 0x3d, 0x87, 0x36, 0xfb, 0x95, 0xee, 0x5e, - 0x83, 0x08, 0xbc, 0x57, 0x69, 0x11, 0x97, 0x30, 0x2c, 0x88, 0x6d, 0xfa, 0xcc, 0x13, 0x1e, 0x7c, - 0x6b, 0x04, 0x35, 0xb1, 0x4f, 0xcd, 0x11, 0xd4, 0x54, 0xd0, 0xdd, 0x0f, 0x5a, 0x54, 0xb4, 0x83, - 0x86, 0xd9, 0xf4, 0x3a, 0x95, 0x96, 0xd7, 0xf2, 0x2a, 0x92, 0xd1, 0x08, 0xae, 0xe5, 0x97, 0xfc, - 0x90, 0xbf, 0x46, 0x4a, 0xbb, 0xe5, 0x29, 0xa7, 0x4d, 0x8f, 0x91, 0x4a, 0x37, 0xe5, 0x6d, 0xf7, - 0xa3, 0x09, 0xa6, 0x83, 0x9b, 0x6d, 0xea, 0x12, 0xd6, 0xaf, 0xf8, 0x37, 0xad, 0x70, 0x80, 0x57, - 0x3a, 0x44, 0xe0, 0x2c, 0x56, 0x65, 0x16, 0x8b, 0x05, 0xae, 0xa0, 0x1d, 0x92, 0x22, 0xfc, 0xe0, - 0x2e, 0x02, 0x6f, 0xb6, 0x49, 0x07, 0xa7, 0x78, 0x4f, 0x67, 0xf1, 0x02, 0x41, 0x9d, 0x0a, 0x75, - 0x05, 0x17, 0x2c, 0x49, 0x2a, 0x7f, 0x02, 0x36, 0x0f, 0x1d, 0xc7, 0xfb, 0x92, 0xd8, 0x27, 0x0e, - 0xe9, 0x7d, 0xee, 0x39, 0x41, 0x87, 0xc0, 0xef, 0x81, 0x65, 0x9b, 0xd1, 0x2e, 0x61, 0xba, 0xf6, - 0xb6, 0xf6, 0x64, 0xc5, 0x2a, 0xde, 0x0e, 0x8c, 0x85, 0xe1, 0xc0, 0x58, 0xae, 0xca, 0x51, 0xa4, - 0xac, 0x65, 0x0e, 0x1e, 0x2a, 0xf2, 0x99, 0xc7, 0x45, 0x0d, 0x8b, 0x36, 0xdc, 0x07, 0xc0, 0xc7, - 0xa2, 0x5d, 0x63, 0xe4, 0x9a, 0xf6, 0x14, 0x1d, 0x2a, 0x3a, 0xa8, 0x8d, 0x2d, 0x68, 0x0a, 0x05, - 0xdf, 0x07, 0x05, 0x46, 0xb0, 0x7d, 0xe5, 0x3a, 0x7d, 0xfd, 0xc1, 0xdb, 0xda, 0x93, 0x82, 0xb5, - 0xa1, 0x18, 0x05, 0xa4, 0xc6, 0xd1, 0x18, 0x51, 0xfe, 0xb7, 0x06, 0x0a, 0xc7, 0x5d, 0xda, 0x14, - 0xd4, 0x73, 0xe1, 0x6f, 0x41, 0x21, 0xcc, 0xbb, 0x8d, 0x05, 0x96, 0xce, 0x56, 0xf7, 0x3f, 0x34, - 0x27, 0x35, 0x31, 0x4e, 0x83, 0xe9, 0xdf, 0xb4, 0xc2, 0x01, 0x6e, 0x86, 0x68, 0xb3, 0xbb, 0x67, - 0x5e, 0x35, 0xbe, 0x20, 0x4d, 0x71, 0x49, 0x04, 0x9e, 0x84, 0x37, 0x19, 0x43, 0x63, 0x55, 0xe8, - 0x80, 0x75, 0x9b, 0x38, 0x44, 0x90, 0x2b, 0x3f, 0xf4, 0xc8, 0x65, 0x84, 0xab, 0xfb, 0x4f, 0x5f, - 0xcd, 0x4d, 0x75, 0x9a, 0x6a, 0x6d, 0x0e, 0x07, 0xc6, 0x7a, 0x6c, 0x08, 0xc5, 0xc5, 0xcb, 0x7f, - 0xd1, 0xc0, 0xce, 0x49, 0xfd, 0x94, 0x79, 0x81, 0x5f, 0x17, 0xe1, 0x3a, 0xb5, 0xfa, 0xca, 0x04, - 0x7f, 0x08, 0x16, 0x59, 0xe0, 0x10, 0x95, 0xd3, 0x77, 0x55, 0xd0, 0x8b, 0x28, 0x70, 0xc8, 0x37, - 0x03, 0x63, 0x2b, 0xc1, 0x7a, 0xd6, 0xf7, 0x09, 0x92, 0x04, 0xf8, 0x19, 0x58, 0x66, 0xd8, 0x6d, - 0x91, 0x30, 0xf4, 0xdc, 0x93, 0xd5, 0xfd, 0xb2, 0x39, 0x73, 0xd7, 0x98, 0xe7, 0x55, 0x14, 0x42, - 0x27, 0x2b, 0x2e, 0x3f, 0x39, 0x52, 0x0a, 0xe5, 0x4b, 0xb0, 0x2e, 0x97, 0xda, 0x63, 0x42, 0x5a, - 0xe0, 0x63, 0x90, 0xeb, 0x50, 0x57, 0x06, 0xb5, 0x64, 0xad, 0x2a, 0x56, 0xee, 0x92, 0xba, 0x28, - 0x1c, 0x97, 0x66, 0xdc, 0x93, 0x39, 0x9b, 0x36, 0xe3, 0x1e, 0x0a, 0xc7, 0xcb, 0xa7, 0x20, 0xaf, - 0x3c, 0x4e, 0x0b, 0xe5, 0xe6, 0x0b, 0xe5, 0x32, 0x84, 0xfe, 0xfa, 0x00, 0x6c, 0xd5, 0x3c, 0xbb, - 0x4a, 0x39, 0x0b, 0x64, 0xbe, 0xac, 0xc0, 0x6e, 0x11, 0xf1, 0x06, 0xea, 0xe3, 0x19, 0x58, 0xe4, - 0x3e, 0x69, 0xaa, 0xb2, 0xd8, 0x9f, 0x93, 0xdb, 0x8c, 0xf8, 0xea, 0x3e, 0x69, 0x5a, 0x6b, 0xd1, - 0x52, 0x86, 0x5f, 0x48, 0xaa, 0xc1, 0x17, 0x60, 0x99, 0x0b, 0x2c, 0x02, 0xae, 0xe7, 0xa4, 0xee, - 0x47, 0xf7, 0xd4, 0x95, 0xdc, 0xc9, 0x2a, 0x8e, 0xbe, 0x91, 0xd2, 0x2c, 0xff, 0x53, 0x03, 0xdf, - 0xc9, 0x60, 0x5d, 0x50, 0x2e, 0xe0, 0x8b, 0x54, 0xc6, 0xcc, 0x57, 0xcb, 0x58, 0xc8, 0x96, 0xf9, - 0x1a, 0x6f, 0xde, 0x68, 0x64, 0x2a, 0x5b, 0x75, 0xb0, 0x44, 0x05, 0xe9, 0x44, 0xa5, 0x68, 0xde, - 0x6f, 0x5a, 0xd6, 0xba, 0x92, 0x5e, 0x3a, 0x0f, 0x45, 0xd0, 0x48, 0xab, 0xfc, 0xaf, 0x07, 0x99, - 0xd3, 0x09, 0xd3, 0x09, 0xaf, 0xc1, 0x5a, 0x87, 0xba, 0x87, 0x5d, 0x4c, 0x1d, 0xdc, 0x50, 0xbb, - 0x67, 0x5e, 0x11, 0x84, 0xbd, 0xd2, 0x1c, 0xf5, 0x4a, 0xf3, 0xdc, 0x15, 0x57, 0xac, 0x2e, 0x18, - 0x75, 0x5b, 0xd6, 0xc6, 0x70, 0x60, 0xac, 0x5d, 0x4e, 0x29, 0xa1, 0x98, 0x2e, 0xfc, 0x35, 0x28, - 0x70, 0xe2, 0x90, 0xa6, 0xf0, 0xd8, 0xfd, 0x3a, 0xc4, 0x05, 0x6e, 0x10, 0xa7, 0xae, 0xa8, 0xd6, - 0x5a, 0x98, 0xb7, 0xe8, 0x0b, 0x8d, 0x25, 0xa1, 0x03, 0x8a, 0x1d, 0xdc, 0x7b, 0xee, 0xe2, 0xf1, - 0x44, 0x72, 0xdf, 0x72, 0x22, 0x70, 0x38, 0x30, 0x8a, 0x97, 0x31, 0x2d, 0x94, 0xd0, 0x2e, 0xff, - 0x6f, 0x11, 0xbc, 0x35, 0xb3, 0xaa, 0xe0, 0x67, 0x00, 0x7a, 0x0d, 0x4e, 0x58, 0x97, 0xd8, 0xa7, - 0xa3, 0xd3, 0x84, 0x7a, 0xd1, 0xc6, 0xdd, 0x55, 0x0b, 0x04, 0xaf, 0x52, 0x08, 0x94, 0xc1, 0x82, - 0x7f, 0xd0, 0xc0, 0xba, 0x3d, 0x72, 0x43, 0xec, 0x9a, 0x67, 0x47, 0x85, 0x71, 0xfa, 0x6d, 0xea, - 0xdd, 0xac, 0x4e, 0x2b, 0x1d, 0xbb, 0x82, 0xf5, 0xad, 0x47, 0x2a, 0xa0, 0xf5, 0x98, 0x0d, 0xc5, - 0x9d, 0xc2, 0x4b, 0x00, 0xed, 0xb1, 0x24, 0x57, 0x67, 0x9a, 0x4c, 0xf1, 0x92, 0xf5, 0x58, 0x29, - 0x3c, 0x8a, 0xf9, 0x8d, 0x40, 0x28, 0x83, 0x08, 0x7f, 0x0a, 0x8a, 0xcd, 0x80, 0x31, 0xe2, 0x8a, - 0x33, 0x82, 0x1d, 0xd1, 0xee, 0xeb, 0x8b, 0x52, 0x6a, 0x47, 0x49, 0x15, 0x8f, 0x62, 0x56, 0x94, - 0x40, 0x87, 0x7c, 0x9b, 0x70, 0xca, 0x88, 0x1d, 0xf1, 0x97, 0xe2, 0xfc, 0x6a, 0xcc, 0x8a, 0x12, - 0x68, 0x78, 0x00, 0xd6, 0x48, 0xcf, 0x27, 0xcd, 0x28, 0xa7, 0xcb, 0x92, 0xbd, 0xad, 0xd8, 0x6b, - 0xc7, 0x53, 0x36, 0x14, 0x43, 0xee, 0x3a, 0x00, 0xa6, 0x93, 0x08, 0x37, 0x40, 0xee, 0x86, 0xf4, - 0x47, 0x27, 0x0f, 0x0a, 0x7f, 0xc2, 0x4f, 0xc1, 0x52, 0x17, 0x3b, 0x01, 0x51, 0xb5, 0xfe, 0xde, - 0xab, 0xd5, 0xfa, 0x33, 0xda, 0x21, 0x68, 0x44, 0xfc, 0xd1, 0x83, 0x03, 0xad, 0xfc, 0x0f, 0x0d, - 0x6c, 0xd6, 0x3c, 0xbb, 0x4e, 0x9a, 0x01, 0xa3, 0xa2, 0x5f, 0x93, 0xeb, 0xfc, 0x06, 0x7a, 0x36, - 0x8a, 0xf5, 0xec, 0x0f, 0xe7, 0xd7, 0x5a, 0x3c, 0xba, 0x59, 0x1d, 0xbb, 0x7c, 0xab, 0x81, 0x47, - 0x29, 0xf4, 0x1b, 0xe8, 0xa8, 0x3f, 0x8f, 0x77, 0xd4, 0xf7, 0xef, 0x33, 0x99, 0x19, 0xfd, 0xf4, - 0x4f, 0xc5, 0x8c, 0xa9, 0xc8, 0x6e, 0x1a, 0xde, 0xee, 0x18, 0xed, 0x52, 0x87, 0xb4, 0x88, 0x2d, - 0x27, 0x53, 0x98, 0xba, 0xdd, 0x8d, 0x2d, 0x68, 0x0a, 0x05, 0x39, 0xd8, 0xb1, 0xc9, 0x35, 0x0e, - 0x1c, 0x71, 0x68, 0xdb, 0x47, 0xd8, 0xc7, 0x0d, 0xea, 0x50, 0x41, 0xd5, 0x75, 0x64, 0xc5, 0xfa, - 0x64, 0x38, 0x30, 0x76, 0xaa, 0x99, 0x88, 0x6f, 0x06, 0xc6, 0xe3, 0xf4, 0xbd, 0xdc, 0x1c, 0x43, - 0xfa, 0x68, 0x86, 0x34, 0xec, 0x03, 0x9d, 0x91, 0xdf, 0x05, 0xe1, 0xa6, 0xa8, 0x32, 0xcf, 0x8f, - 0xb9, 0xcd, 0x49, 0xb7, 0x3f, 0x19, 0x0e, 0x0c, 0x1d, 0xcd, 0xc0, 0xdc, 0xed, 0x78, 0xa6, 0x3c, - 0xfc, 0x02, 0x6c, 0xe1, 0x51, 0x1f, 0x88, 0x79, 0x5d, 0x94, 0x5e, 0x0f, 0x86, 0x03, 0x63, 0xeb, - 0x30, 0x6d, 0xbe, 0xdb, 0x61, 0x96, 0x28, 0xac, 0x80, 0x7c, 0x57, 0x5e, 0xd9, 0xb9, 0xbe, 0x24, - 0xf5, 0x1f, 0x0d, 0x07, 0x46, 0x7e, 0x74, 0x8b, 0x0f, 0x35, 0x97, 0x4f, 0xea, 0xf2, 0x22, 0x18, - 0xa1, 0xe0, 0xc7, 0x60, 0xb5, 0xed, 0x71, 0xf1, 0x33, 0x22, 0xbe, 0xf4, 0xd8, 0x8d, 0x6c, 0x0c, - 0x05, 0x6b, 0x4b, 0xad, 0xe0, 0xea, 0xd9, 0xc4, 0x84, 0xa6, 0x71, 0xf0, 0x97, 0x60, 0xa5, 0xad, - 0xae, 0x7d, 0x5c, 0xcf, 0xcb, 0x42, 0x7b, 0x32, 0xa7, 0xd0, 0x62, 0x57, 0x44, 0x6b, 0x53, 0xc9, - 0xaf, 0x44, 0xc3, 0x1c, 0x4d, 0xd4, 0xe0, 0xf7, 0x41, 0x5e, 0x7e, 0x9c, 0x57, 0xf5, 0x82, 0x8c, - 0xe6, 0xa1, 0x82, 0xe7, 0xcf, 0x46, 0xc3, 0x28, 0xb2, 0x47, 0xd0, 0xf3, 0xda, 0x91, 0xbe, 0x92, - 0x86, 0x9e, 0xd7, 0x8e, 0x50, 0x64, 0x87, 0x2f, 0x40, 0x9e, 0x93, 0x0b, 0xea, 0x06, 0x3d, 0x1d, - 0xc8, 0x2d, 0xb7, 0x37, 0x27, 0xdc, 0xfa, 0xb1, 0x44, 0x26, 0x2e, 0xdc, 0x13, 0x75, 0x65, 0x47, - 0x91, 0x24, 0xb4, 0xc1, 0x0a, 0x0b, 0xdc, 0x43, 0xfe, 0x9c, 0x13, 0xa6, 0xaf, 0xa6, 0x4e, 0xfb, - 0xa4, 0x3e, 0x8a, 0xb0, 0x49, 0x0f, 0xe3, 0xcc, 0x8c, 0x11, 0x68, 0x22, 0x0c, 0xff, 0xa8, 0x01, - 0xc8, 0x03, 0xdf, 0x77, 0x48, 0x87, 0xb8, 0x02, 0x3b, 0xf2, 0x7e, 0xcf, 0xf5, 0x35, 0xe9, 0xef, - 0xc7, 0xf3, 0xe6, 0x93, 0x22, 0x25, 0x1d, 0x8f, 0x8f, 0xe9, 0x34, 0x14, 0x65, 0xf8, 0x0c, 0xd3, - 0x79, 0xcd, 0xe5, 0x6f, 0x7d, 0xfd, 0xce, 0x74, 0x66, 0xbf, 0x5f, 0x26, 0xe9, 0x54, 0x76, 0x14, - 0x49, 0xc2, 0xcf, 0xc1, 0x4e, 0xf4, 0xba, 0x43, 0x9e, 0x27, 0x4e, 0xa8, 0x43, 0x78, 0x9f, 0x0b, - 0xd2, 0xd1, 0x8b, 0x72, 0x99, 0x4b, 0x8a, 0xb9, 0x83, 0x32, 0x51, 0x68, 0x06, 0x1b, 0x76, 0x80, - 0x11, 0xb5, 0x87, 0x70, 0xef, 0x8c, 0xfb, 0xd3, 0x31, 0x6f, 0x62, 0x67, 0x74, 0x6b, 0x79, 0x28, - 0x1d, 0xbc, 0x3b, 0x1c, 0x18, 0x46, 0x75, 0x3e, 0x14, 0xdd, 0xa5, 0x05, 0x7f, 0x01, 0x74, 0x3c, - 0xcb, 0xcf, 0x86, 0xf4, 0xf3, 0xdd, 0xb0, 0xe7, 0xcc, 0x74, 0x30, 0x93, 0x0d, 0x7d, 0xb0, 0x81, - 0xe3, 0xef, 0x6c, 0xae, 0x6f, 0xca, 0x5d, 0xf8, 0xde, 0x9c, 0x75, 0x48, 0x3c, 0xcd, 0x2d, 0x5d, - 0xa5, 0x71, 0x23, 0x61, 0xe0, 0x28, 0xa5, 0x0e, 0x7b, 0x00, 0xe2, 0xe4, 0xdf, 0x02, 0x5c, 0x87, - 0x77, 0x1e, 0x31, 0xa9, 0xff, 0x12, 0x26, 0xa5, 0x96, 0x32, 0x71, 0x94, 0xe1, 0x03, 0x5e, 0x80, - 0x6d, 0x35, 0xfa, 0xdc, 0xe5, 0xf8, 0x9a, 0xd4, 0xfb, 0xbc, 0x29, 0x1c, 0xae, 0x6f, 0xc9, 0xfe, - 0xa6, 0x0f, 0x07, 0xc6, 0xf6, 0x61, 0x86, 0x1d, 0x65, 0xb2, 0xe0, 0xa7, 0x60, 0xe3, 0xda, 0x63, - 0x0d, 0x6a, 0xdb, 0xc4, 0x8d, 0x94, 0xb6, 0xa5, 0xd2, 0x76, 0x98, 0x89, 0x93, 0x84, 0x0d, 0xa5, - 0xd0, 0xe1, 0x8b, 0x5c, 0x9f, 0xb5, 0x81, 0xe1, 0xc7, 0xb1, 0x37, 0xf9, 0x3b, 0x89, 0x37, 0xf9, - 0x66, 0x8a, 0xf7, 0x1a, 0x5e, 0xe4, 0x7f, 0xd3, 0xc0, 0x4e, 0x76, 0x03, 0x83, 0x4f, 0x63, 0xd1, - 0x19, 0x89, 0xe8, 0x1e, 0x26, 0x58, 0x2a, 0xb6, 0xdf, 0x80, 0xa2, 0x6a, 0x73, 0xf1, 0x3f, 0x3c, - 0x62, 0x31, 0x86, 0xe7, 0x53, 0x78, 0x43, 0x51, 0x12, 0xd1, 0x16, 0x97, 0x6f, 0x8b, 0xf8, 0x18, - 0x4a, 0xa8, 0x95, 0xff, 0xae, 0x81, 0x77, 0xee, 0x6c, 0x50, 0xd0, 0x8a, 0x85, 0x6e, 0x26, 0x42, - 0x2f, 0xcd, 0x16, 0x78, 0x3d, 0xff, 0x7b, 0x58, 0x1f, 0xdc, 0xbe, 0x2c, 0x2d, 0x7c, 0xf5, 0xb2, - 0xb4, 0xf0, 0xf5, 0xcb, 0xd2, 0xc2, 0xef, 0x87, 0x25, 0xed, 0x76, 0x58, 0xd2, 0xbe, 0x1a, 0x96, - 0xb4, 0xaf, 0x87, 0x25, 0xed, 0x3f, 0xc3, 0x92, 0xf6, 0xe7, 0xff, 0x96, 0x16, 0x7e, 0x95, 0x57, - 0x72, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x91, 0xe5, 0x7f, 0xdc, 0x14, 0x00, 0x00, + // 1715 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x58, 0x4f, 0x6f, 0x1b, 0xc7, + 0x15, 0xd7, 0x9a, 0x92, 0x48, 0x8d, 0x24, 0x5a, 0x1a, 0xfd, 0xe9, 0x46, 0xa8, 0xb9, 0x0e, 0x03, + 0x14, 0x6e, 0x90, 0x2c, 0x63, 0x39, 0x69, 0x8d, 0xa6, 0x2d, 0xa2, 0x35, 0x25, 0x5b, 0x81, 0x55, + 0xb1, 0x43, 0x3b, 0x68, 0x0b, 0xb7, 0xe8, 0x70, 0x77, 0x44, 0x4e, 0xb4, 0xdc, 0xdd, 0xce, 0xcc, + 0x32, 0xe4, 0xad, 0x87, 0x1e, 0x7a, 0xec, 0x17, 0xc8, 0x27, 0x28, 0x7a, 0xea, 0x97, 0x50, 0x81, + 0xa2, 0xc8, 0x31, 0xe8, 0x81, 0xa8, 0x59, 0xf4, 0x4b, 0xf8, 0xd2, 0x60, 0x87, 0xb3, 0x24, 0xf7, + 0x0f, 0x29, 0x2b, 0x40, 0x7c, 0xdb, 0x9d, 0xf7, 0xfb, 0xfd, 0xde, 0x9b, 0x37, 0x6f, 0xde, 0xce, + 0x0e, 0xb0, 0x2e, 0x1f, 0x72, 0x93, 0xfa, 0xb5, 0xcb, 0xb0, 0x45, 0x98, 0x47, 0x04, 0xe1, 0xb5, + 0x1e, 0xf1, 0x1c, 0x9f, 0xd5, 0x94, 0x01, 0x07, 0xb4, 0x16, 0xf8, 0x2e, 0xb5, 0x07, 0xb5, 0xde, + 0xfd, 0x16, 0x11, 0xf8, 0x7e, 0xad, 0x4d, 0x3c, 0xc2, 0xb0, 0x20, 0x8e, 0x19, 0x30, 0x5f, 0xf8, + 0xf0, 0xad, 0x31, 0xd4, 0xc4, 0x01, 0x35, 0xc7, 0x50, 0x53, 0x41, 0x0f, 0xde, 0x6f, 0x53, 0xd1, + 0x09, 0x5b, 0xa6, 0xed, 0x77, 0x6b, 0x6d, 0xbf, 0xed, 0xd7, 0x24, 0xa3, 0x15, 0x5e, 0xc8, 0x37, + 0xf9, 0x22, 0x9f, 0xc6, 0x4a, 0x07, 0xd5, 0x19, 0xa7, 0xb6, 0xcf, 0x48, 0xad, 0x97, 0xf1, 0x76, + 0xf0, 0xe1, 0x14, 0xd3, 0xc5, 0x76, 0x87, 0x7a, 0x84, 0x0d, 0x6a, 0xc1, 0x65, 0x3b, 0x1a, 0xe0, + 0xb5, 0x2e, 0x11, 0x38, 0x8f, 0x55, 0x9b, 0xc7, 0x62, 0xa1, 0x27, 0x68, 0x97, 0x64, 0x08, 0x3f, + 0xba, 0x8e, 0xc0, 0xed, 0x0e, 0xe9, 0xe2, 0x0c, 0xef, 0xc1, 0x3c, 0x5e, 0x28, 0xa8, 0x5b, 0xa3, + 0x9e, 0xe0, 0x82, 0xa5, 0x49, 0xd5, 0x8f, 0xc1, 0xf6, 0x91, 0xeb, 0xfa, 0x5f, 0x10, 0xe7, 0xc4, + 0x25, 0xfd, 0xcf, 0x7c, 0x37, 0xec, 0x12, 0xf8, 0x03, 0xb0, 0xea, 0x30, 0xda, 0x23, 0x4c, 0xd7, + 0xee, 0x6a, 0xf7, 0xd6, 0xac, 0xf2, 0xd5, 0xd0, 0x58, 0x1a, 0x0d, 0x8d, 0xd5, 0xba, 0x1c, 0x45, + 0xca, 0x5a, 0xe5, 0xe0, 0xb6, 0x22, 0x3f, 0xf1, 0xb9, 0x68, 0x60, 0xd1, 0x81, 0x87, 0x00, 0x04, + 0x58, 0x74, 0x1a, 0x8c, 0x5c, 0xd0, 0xbe, 0xa2, 0x43, 0x45, 0x07, 0x8d, 0x89, 0x05, 0xcd, 0xa0, + 0xe0, 0x7b, 0xa0, 0xc4, 0x08, 0x76, 0xce, 0x3d, 0x77, 0xa0, 0xdf, 0xba, 0xab, 0xdd, 0x2b, 0x59, + 0x5b, 0x8a, 0x51, 0x42, 0x6a, 0x1c, 0x4d, 0x10, 0xd5, 0x7f, 0x6b, 0xa0, 0x74, 0xdc, 0xa3, 0xb6, + 0xa0, 0xbe, 0x07, 0x7f, 0x0f, 0x4a, 0x51, 0xde, 0x1d, 0x2c, 0xb0, 0x74, 0xb6, 0x7e, 0xf8, 0x81, + 0x39, 0xad, 0x89, 0x49, 0x1a, 0xcc, 0xe0, 0xb2, 0x1d, 0x0d, 0x70, 0x33, 0x42, 0x9b, 0xbd, 0xfb, + 0xe6, 0x79, 0xeb, 0x73, 0x62, 0x8b, 0x33, 0x22, 0xf0, 0x34, 0xbc, 0xe9, 0x18, 0x9a, 0xa8, 0x42, + 0x17, 0x6c, 0x3a, 0xc4, 0x25, 0x82, 0x9c, 0x07, 0x91, 0x47, 0x2e, 0x23, 0x5c, 0x3f, 0x7c, 0xf0, + 0x7a, 0x6e, 0xea, 0xb3, 0x54, 0x6b, 0x7b, 0x34, 0x34, 0x36, 0x13, 0x43, 0x28, 0x29, 0x5e, 0xfd, + 0x52, 0x03, 0xfb, 0x27, 0xcd, 0xc7, 0xcc, 0x0f, 0x83, 0xa6, 0x88, 0xd6, 0xa9, 0x3d, 0x50, 0x26, + 0xf8, 0x63, 0xb0, 0xcc, 0x42, 0x97, 0xa8, 0x9c, 0xbe, 0xa3, 0x82, 0x5e, 0x46, 0xa1, 0x4b, 0x5e, + 0x0d, 0x8d, 0x9d, 0x14, 0xeb, 0xd9, 0x20, 0x20, 0x48, 0x12, 0xe0, 0xa7, 0x60, 0x95, 0x61, 0xaf, + 0x4d, 0xa2, 0xd0, 0x0b, 0xf7, 0xd6, 0x0f, 0xab, 0xe6, 0xdc, 0x5d, 0x63, 0x9e, 0xd6, 0x51, 0x04, + 0x9d, 0xae, 0xb8, 0x7c, 0xe5, 0x48, 0x29, 0x54, 0xcf, 0xc0, 0xa6, 0x5c, 0x6a, 0x9f, 0x09, 0x69, + 0x81, 0x77, 0x40, 0xa1, 0x4b, 0x3d, 0x19, 0xd4, 0x8a, 0xb5, 0xae, 0x58, 0x85, 0x33, 0xea, 0xa1, + 0x68, 0x5c, 0x9a, 0x71, 0x5f, 0xe6, 0x6c, 0xd6, 0x8c, 0xfb, 0x28, 0x1a, 0xaf, 0x3e, 0x06, 0x45, + 0xe5, 0x71, 0x56, 0xa8, 0xb0, 0x58, 0xa8, 0x90, 0x23, 0xf4, 0xd7, 0x5b, 0x60, 0xa7, 0xe1, 0x3b, + 0x75, 0xca, 0x59, 0x28, 0xf3, 0x65, 0x85, 0x4e, 0x9b, 0x88, 0x37, 0x50, 0x1f, 0xcf, 0xc0, 0x32, + 0x0f, 0x88, 0xad, 0xca, 0xe2, 0x70, 0x41, 0x6e, 0x73, 0xe2, 0x6b, 0x06, 0xc4, 0xb6, 0x36, 0xe2, + 0xa5, 0x8c, 0xde, 0x90, 0x54, 0x83, 0x2f, 0xc0, 0x2a, 0x17, 0x58, 0x84, 0x5c, 0x2f, 0x48, 0xdd, + 0x0f, 0x6f, 0xa8, 0x2b, 0xb9, 0xd3, 0x55, 0x1c, 0xbf, 0x23, 0xa5, 0x59, 0xfd, 0xa7, 0x06, 0xbe, + 0x97, 0xc3, 0x7a, 0x4a, 0xb9, 0x80, 0x2f, 0x32, 0x19, 0x33, 0x5f, 0x2f, 0x63, 0x11, 0x5b, 0xe6, + 0x6b, 0xb2, 0x79, 0xe3, 0x91, 0x99, 0x6c, 0x35, 0xc1, 0x0a, 0x15, 0xa4, 0x1b, 0x97, 0xa2, 0x79, + 0xb3, 0x69, 0x59, 0x9b, 0x4a, 0x7a, 0xe5, 0x34, 0x12, 0x41, 0x63, 0xad, 0xea, 0xbf, 0x6e, 0xe5, + 0x4e, 0x27, 0x4a, 0x27, 0xbc, 0x00, 0x1b, 0x5d, 0xea, 0x1d, 0xf5, 0x30, 0x75, 0x71, 0x4b, 0xed, + 0x9e, 0x45, 0x45, 0x10, 0xf5, 0x4a, 0x73, 0xdc, 0x2b, 0xcd, 0x53, 0x4f, 0x9c, 0xb3, 0xa6, 0x60, + 0xd4, 0x6b, 0x5b, 0x5b, 0xa3, 0xa1, 0xb1, 0x71, 0x36, 0xa3, 0x84, 0x12, 0xba, 0xf0, 0xb7, 0xa0, + 0xc4, 0x89, 0x4b, 0x6c, 0xe1, 0xb3, 0x9b, 0x75, 0x88, 0xa7, 0xb8, 0x45, 0xdc, 0xa6, 0xa2, 0x5a, + 0x1b, 0x51, 0xde, 0xe2, 0x37, 0x34, 0x91, 0x84, 0x2e, 0x28, 0x77, 0x71, 0xff, 0xb9, 0x87, 0x27, + 0x13, 0x29, 0x7c, 0xcb, 0x89, 0xc0, 0xd1, 0xd0, 0x28, 0x9f, 0x25, 0xb4, 0x50, 0x4a, 0xbb, 0xfa, + 0xbf, 0x65, 0xf0, 0xd6, 0xdc, 0xaa, 0x82, 0x9f, 0x02, 0xe8, 0xb7, 0x38, 0x61, 0x3d, 0xe2, 0x3c, + 0x1e, 0x7f, 0x4d, 0xa8, 0x1f, 0x6f, 0xdc, 0x03, 0xb5, 0x40, 0xf0, 0x3c, 0x83, 0x40, 0x39, 0x2c, + 0xf8, 0x27, 0x0d, 0x6c, 0x3a, 0x63, 0x37, 0xc4, 0x69, 0xf8, 0x4e, 0x5c, 0x18, 0x8f, 0xbf, 0x4d, + 0xbd, 0x9b, 0xf5, 0x59, 0xa5, 0x63, 0x4f, 0xb0, 0x81, 0xb5, 0xa7, 0x02, 0xda, 0x4c, 0xd8, 0x50, + 0xd2, 0x29, 0x3c, 0x03, 0xd0, 0x99, 0x48, 0x72, 0xf5, 0x4d, 0x93, 0x29, 0x5e, 0xb1, 0xee, 0x28, + 0x85, 0xbd, 0x84, 0xdf, 0x18, 0x84, 0x72, 0x88, 0xf0, 0xe7, 0xa0, 0x6c, 0x87, 0x8c, 0x11, 0x4f, + 0x3c, 0x21, 0xd8, 0x15, 0x9d, 0x81, 0xbe, 0x2c, 0xa5, 0xf6, 0x95, 0x54, 0xf9, 0x51, 0xc2, 0x8a, + 0x52, 0xe8, 0x88, 0xef, 0x10, 0x4e, 0x19, 0x71, 0x62, 0xfe, 0x4a, 0x92, 0x5f, 0x4f, 0x58, 0x51, + 0x0a, 0x0d, 0x1f, 0x82, 0x0d, 0xd2, 0x0f, 0x88, 0x1d, 0xe7, 0x74, 0x55, 0xb2, 0x77, 0x15, 0x7b, + 0xe3, 0x78, 0xc6, 0x86, 0x12, 0xc8, 0x03, 0x17, 0xc0, 0x6c, 0x12, 0xe1, 0x16, 0x28, 0x5c, 0x92, + 0xc1, 0xf8, 0xcb, 0x83, 0xa2, 0x47, 0xf8, 0x09, 0x58, 0xe9, 0x61, 0x37, 0x24, 0xaa, 0xd6, 0xdf, + 0x7d, 0xbd, 0x5a, 0x7f, 0x46, 0xbb, 0x04, 0x8d, 0x89, 0x3f, 0xb9, 0xf5, 0x50, 0xab, 0xfe, 0x43, + 0x03, 0xdb, 0x0d, 0xdf, 0x69, 0x12, 0x3b, 0x64, 0x54, 0x0c, 0x1a, 0x72, 0x9d, 0xdf, 0x40, 0xcf, + 0x46, 0x89, 0x9e, 0xfd, 0xc1, 0xe2, 0x5a, 0x4b, 0x46, 0x37, 0xaf, 0x63, 0x57, 0xaf, 0x34, 0xb0, + 0x97, 0x41, 0xbf, 0x81, 0x8e, 0xfa, 0xcb, 0x64, 0x47, 0x7d, 0xef, 0x26, 0x93, 0x99, 0xd3, 0x4f, + 0xff, 0x5f, 0xce, 0x99, 0x8a, 0xec, 0xa6, 0xd1, 0xe9, 0x8e, 0xd1, 0x1e, 0x75, 0x49, 0x9b, 0x38, + 0x72, 0x32, 0xa5, 0x99, 0xd3, 0xdd, 0xc4, 0x82, 0x66, 0x50, 0x90, 0x83, 0x7d, 0x87, 0x5c, 0xe0, + 0xd0, 0x15, 0x47, 0x8e, 0xf3, 0x08, 0x07, 0xb8, 0x45, 0x5d, 0x2a, 0xa8, 0x3a, 0x8e, 0xac, 0x59, + 0x1f, 0x8f, 0x86, 0xc6, 0x7e, 0x3d, 0x17, 0xf1, 0x6a, 0x68, 0xdc, 0xc9, 0x9e, 0xcb, 0xcd, 0x09, + 0x64, 0x80, 0xe6, 0x48, 0xc3, 0x01, 0xd0, 0x19, 0xf9, 0x43, 0x18, 0x6d, 0x8a, 0x3a, 0xf3, 0x83, + 0x84, 0xdb, 0x82, 0x74, 0xfb, 0xb3, 0xd1, 0xd0, 0xd0, 0xd1, 0x1c, 0xcc, 0xf5, 0x8e, 0xe7, 0xca, + 0xc3, 0xcf, 0xc1, 0x0e, 0x1e, 0xf7, 0x81, 0x84, 0xd7, 0x65, 0xe9, 0xf5, 0xe1, 0x68, 0x68, 0xec, + 0x1c, 0x65, 0xcd, 0xd7, 0x3b, 0xcc, 0x13, 0x85, 0x35, 0x50, 0xec, 0xc9, 0x23, 0x3b, 0xd7, 0x57, + 0xa4, 0xfe, 0xde, 0x68, 0x68, 0x14, 0xc7, 0xa7, 0xf8, 0x48, 0x73, 0xf5, 0xa4, 0x29, 0x0f, 0x82, + 0x31, 0x0a, 0x7e, 0x04, 0xd6, 0x3b, 0x3e, 0x17, 0xbf, 0x20, 0xe2, 0x0b, 0x9f, 0x5d, 0xca, 0xc6, + 0x50, 0xb2, 0x76, 0xd4, 0x0a, 0xae, 0x3f, 0x99, 0x9a, 0xd0, 0x2c, 0x0e, 0xfe, 0x1a, 0xac, 0x75, + 0xd4, 0xb1, 0x8f, 0xeb, 0x45, 0x59, 0x68, 0xf7, 0x16, 0x14, 0x5a, 0xe2, 0x88, 0x68, 0x6d, 0x2b, + 0xf9, 0xb5, 0x78, 0x98, 0xa3, 0xa9, 0x1a, 0xfc, 0x21, 0x28, 0xca, 0x97, 0xd3, 0xba, 0x5e, 0x92, + 0xd1, 0xdc, 0x56, 0xf0, 0xe2, 0x93, 0xf1, 0x30, 0x8a, 0xed, 0x31, 0xf4, 0xb4, 0xf1, 0x48, 0x5f, + 0xcb, 0x42, 0x4f, 0x1b, 0x8f, 0x50, 0x6c, 0x87, 0x2f, 0x40, 0x91, 0x93, 0xa7, 0xd4, 0x0b, 0xfb, + 0x3a, 0x90, 0x5b, 0xee, 0xfe, 0x82, 0x70, 0x9b, 0xc7, 0x12, 0x99, 0x3a, 0x70, 0x4f, 0xd5, 0x95, + 0x1d, 0xc5, 0x92, 0xd0, 0x01, 0x6b, 0x2c, 0xf4, 0x8e, 0xf8, 0x73, 0x4e, 0x98, 0xbe, 0x9e, 0xf9, + 0xda, 0xa7, 0xf5, 0x51, 0x8c, 0x4d, 0x7b, 0x98, 0x64, 0x66, 0x82, 0x40, 0x53, 0x61, 0xf8, 0x67, + 0x0d, 0x40, 0x1e, 0x06, 0x81, 0x4b, 0xba, 0xc4, 0x13, 0xd8, 0x95, 0xe7, 0x7b, 0xae, 0x6f, 0x48, + 0x7f, 0x3f, 0x5d, 0x34, 0x9f, 0x0c, 0x29, 0xed, 0x78, 0xf2, 0x99, 0xce, 0x42, 0x51, 0x8e, 0xcf, + 0x28, 0x9d, 0x17, 0x5c, 0x3e, 0xeb, 0x9b, 0xd7, 0xa6, 0x33, 0xff, 0xff, 0x65, 0x9a, 0x4e, 0x65, + 0x47, 0xb1, 0x24, 0xfc, 0x0c, 0xec, 0xc7, 0x7f, 0x77, 0xc8, 0xf7, 0xc5, 0x09, 0x75, 0x09, 0x1f, + 0x70, 0x41, 0xba, 0x7a, 0x59, 0x2e, 0x73, 0x45, 0x31, 0xf7, 0x51, 0x2e, 0x0a, 0xcd, 0x61, 0xc3, + 0x2e, 0x30, 0xe2, 0xf6, 0x10, 0xed, 0x9d, 0x49, 0x7f, 0x3a, 0xe6, 0x36, 0x76, 0xc7, 0xa7, 0x96, + 0xdb, 0xd2, 0xc1, 0x3b, 0xa3, 0xa1, 0x61, 0xd4, 0x17, 0x43, 0xd1, 0x75, 0x5a, 0xf0, 0x57, 0x40, + 0xc7, 0xf3, 0xfc, 0x6c, 0x49, 0x3f, 0xdf, 0x8f, 0x7a, 0xce, 0x5c, 0x07, 0x73, 0xd9, 0x30, 0x00, + 0x5b, 0x38, 0xf9, 0x9f, 0xcd, 0xf5, 0x6d, 0xb9, 0x0b, 0xdf, 0x5d, 0xb0, 0x0e, 0xa9, 0x5f, 0x73, + 0x4b, 0x57, 0x69, 0xdc, 0x4a, 0x19, 0x38, 0xca, 0xa8, 0xc3, 0x3e, 0x80, 0x38, 0x7d, 0x2d, 0xc0, + 0x75, 0x78, 0xed, 0x27, 0x26, 0x73, 0x97, 0x30, 0x2d, 0xb5, 0x8c, 0x89, 0xa3, 0x1c, 0x1f, 0xf0, + 0x29, 0xd8, 0x55, 0xa3, 0xcf, 0x3d, 0x8e, 0x2f, 0x48, 0x73, 0xc0, 0x6d, 0xe1, 0x72, 0x7d, 0x47, + 0xf6, 0x37, 0x7d, 0x34, 0x34, 0x76, 0x8f, 0x72, 0xec, 0x28, 0x97, 0x05, 0x3f, 0x01, 0x5b, 0x17, + 0x3e, 0x6b, 0x51, 0xc7, 0x21, 0x5e, 0xac, 0xb4, 0x2b, 0x95, 0x76, 0xa3, 0x4c, 0x9c, 0xa4, 0x6c, + 0x28, 0x83, 0x86, 0x1c, 0xec, 0x29, 0xe5, 0x06, 0xf3, 0xed, 0x33, 0x3f, 0xf4, 0x44, 0xd4, 0x52, + 0xb9, 0xbe, 0x37, 0xf9, 0x8c, 0xec, 0x1d, 0xe5, 0x01, 0x5e, 0x0d, 0x8d, 0xbb, 0x39, 0x2d, 0x3d, + 0x01, 0x42, 0xf9, 0xda, 0xd5, 0x2f, 0x35, 0xa0, 0xcf, 0xeb, 0x1a, 0xf0, 0xa3, 0xc4, 0x45, 0xc0, + 0xdb, 0xa9, 0x8b, 0x80, 0xed, 0x0c, 0xef, 0x3b, 0xb8, 0x06, 0xf8, 0x9b, 0x06, 0xf6, 0xf3, 0xbb, + 0x26, 0x7c, 0x90, 0x88, 0xce, 0x48, 0x45, 0x77, 0x3b, 0xc5, 0x52, 0xb1, 0xfd, 0x0e, 0x94, 0x55, + 0x6f, 0x4d, 0xde, 0xb2, 0x24, 0x62, 0x8c, 0x32, 0x18, 0x1d, 0x8b, 0x94, 0x44, 0xdc, 0x57, 0xe4, + 0x0f, 0x4d, 0x72, 0x0c, 0xa5, 0xd4, 0xaa, 0x7f, 0xd7, 0xc0, 0xdb, 0xd7, 0x76, 0x45, 0x68, 0x25, + 0x42, 0x37, 0x53, 0xa1, 0x57, 0xe6, 0x0b, 0x7c, 0x37, 0x97, 0x2d, 0xd6, 0xfb, 0x57, 0x2f, 0x2b, + 0x4b, 0x5f, 0xbd, 0xac, 0x2c, 0x7d, 0xfd, 0xb2, 0xb2, 0xf4, 0xc7, 0x51, 0x45, 0xbb, 0x1a, 0x55, + 0xb4, 0xaf, 0x46, 0x15, 0xed, 0xeb, 0x51, 0x45, 0xfb, 0xcf, 0xa8, 0xa2, 0xfd, 0xe5, 0xbf, 0x95, + 0xa5, 0xdf, 0x14, 0x95, 0xdc, 0x37, 0x01, 0x00, 0x00, 0xff, 0xff, 0xa8, 0xba, 0x23, 0xa4, 0x51, + 0x15, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/policy/v1beta1/generated.proto b/staging/src/k8s.io/api/policy/v1beta1/generated.proto index 9353d423dbc..aa37d948f52 100644 --- a/staging/src/k8s.io/api/policy/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/policy/v1beta1/generated.proto @@ -297,6 +297,12 @@ message PodSecurityPolicySpec { // e.g. "foo.*" forbids "foo.bar", "foo.baz", etc. // +optional repeated string forbiddenSysctls = 20; + + // AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. + // Empty or nil indicates that only the DefaultProcMountType may be used. + // This requires the ProcMountType feature flag to be enabled. + // +optional + repeated string allowedProcMountTypes = 21; } // RunAsUserStrategyOptions defines the strategy type and any options used to create the strategy. diff --git a/staging/src/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go index 12228764539..df10b2a29b8 100644 --- a/staging/src/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go @@ -171,6 +171,7 @@ var map_PodSecurityPolicySpec = map[string]string{ "allowedFlexVolumes": "allowedFlexVolumes is a whitelist of allowed Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to whitelist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", + "allowedProcMountTypes": "AllowedProcMountTypes is a whitelist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", } func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go index 96e350967bf..9af268a4382 100644 --- a/staging/src/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go @@ -380,6 +380,11 @@ func (in *PodSecurityPolicySpec) DeepCopyInto(out *PodSecurityPolicySpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.AllowedProcMountTypes != nil { + in, out := &in.AllowedProcMountTypes, &out.AllowedProcMountTypes + *out = make([]corev1.ProcMountType, len(*in)) + copy(*out, *in) + } return } diff --git a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index 9b89dd19a27..c242ef26781 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -12,11 +12,11 @@ }, { "ImportPath": "github.com/Azure/go-ansiterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/Azure/go-ansiterm/winterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/NYTimes/gziphandler", @@ -364,11 +364,11 @@ }, { "ImportPath": "github.com/docker/docker/pkg/term", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/term/windows", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/elazarl/go-bindata-assetfs", diff --git a/staging/src/k8s.io/apiserver/Godeps/Godeps.json b/staging/src/k8s.io/apiserver/Godeps/Godeps.json index b273dc2de46..b9686508ca0 100644 --- a/staging/src/k8s.io/apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/apiserver/Godeps/Godeps.json @@ -12,11 +12,11 @@ }, { "ImportPath": "github.com/Azure/go-ansiterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/Azure/go-ansiterm/winterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/NYTimes/gziphandler", @@ -364,11 +364,11 @@ }, { "ImportPath": "github.com/docker/docker/pkg/term", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/term/windows", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/elazarl/go-bindata-assetfs", diff --git a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json index 25eed4678b8..2a695aea3c6 100644 --- a/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json +++ b/staging/src/k8s.io/kube-aggregator/Godeps/Godeps.json @@ -12,11 +12,11 @@ }, { "ImportPath": "github.com/Azure/go-ansiterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/Azure/go-ansiterm/winterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/NYTimes/gziphandler", @@ -96,11 +96,11 @@ }, { "ImportPath": "github.com/docker/docker/pkg/term", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/term/windows", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/spdystream", diff --git a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json index 897e1db4d5e..ef20126e516 100644 --- a/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json +++ b/staging/src/k8s.io/sample-apiserver/Godeps/Godeps.json @@ -12,11 +12,11 @@ }, { "ImportPath": "github.com/Azure/go-ansiterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/Azure/go-ansiterm/winterm", - "Rev": "19f72df4d05d31cbe1c56bfc8045c96babff6c7e" + "Rev": "d6e3b3328b783f23731bc4d058875b0371ff8109" }, { "ImportPath": "github.com/NYTimes/gziphandler", @@ -96,11 +96,11 @@ }, { "ImportPath": "github.com/docker/docker/pkg/term", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/docker/docker/pkg/term/windows", - "Rev": "4f3616fb1c112e206b88cb7a9922bf49067a7756" + "Rev": "a9fbbdc8dd8794b20af358382ab780559bca589d" }, { "ImportPath": "github.com/elazarl/go-bindata-assetfs",