Question: func init() { proto.RegisterFile("api.proto", fileDescriptorApi) } var fileDescriptorApi = []byte{ <del> // 4051 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3b, 0x4d, 0x73, 0x1b, 0x47, 0x76, 0x04, 0xc0, 0x0f, 0xe0, 0x81, 0x00, 0xc1, 0x16, 0x45, 0x42, 0x90, 0x44, 0xd3, 0x23, 0xcb, 0x96, 0xb4, 0x2b, 0x59, 0xa6, 0xd7, 0x76, 0x2c, 0x7f, 0x09, 0x26, 0x29, 0x17, 0x2d, 0x89, 0xe4, 0x0e, 0x44, 0xef, 0x6e, 0x36, 0x55, 0x93, 0x21, 0xa6, 0x09, 0x8e, 0x0d, 0x4c, 0xcf, 0xce, 0xf4, 0xc8, 0x62, 0x4e, 0xc9, 0x2d, 0x47, 0xe7, 0x98, 0x5b, 0x0e, 0xa9, 0xda, 0xca, 0x25, 0x87, 0x9c, 0xf2, 0x0b, 0x52, 0x5b, 0x95, 0x4a, 0x55, 0x0e, 0xa9, 0x54, 0x72, 0xdb, 0x55, 0x0e, 0x39, 0xa4, 0x2a, 0xbf, 0x61, 0xab, 0xbf, 0x66, 0x7a, 0xbe, 0x20, 0x52, 0x76, 0xed, 0xea, 0x36, 0xfd, 0xfa, 0xbd, 0xd7, 0xaf, 0xfb, 0xbd, 0x7e, 0xfd, 0xde, 0xeb, 0x1e, 0x68, 0xd8, 0xbe, 0x7b, 0xc7, 0x0f, 0x08, 0x25, 0x68, 0x21, 0x88, 0x3c, 0xea, 0x4e, 0x70, 0xef, 0xf6, 0xc8, 0xa5, 0x27, 0xd1, 0xd1, 0x9d, 0x21, 0x99, 0xbc, 0x3d, 0x22, 0x23, 0xf2, 0x36, 0xef, 0x3f, 0x8a, 0x8e, 0x79, 0x8b, 0x37, 0xf8, 0x97, 0xa0, 0x33, 0x6e, 0x41, 0xfb, 0x2b, 0x1c, 0x84, 0x2e, 0xf1, 0x4c, 0xfc, 0xab, 0x08, 0x87, 0x14, 0x75, 0x61, 0xe1, 0xa9, 0x80, 0x74, 0x2b, 0x1b, 0x95, 0x1b, 0x0d, 0x53, 0x35, 0x8d, 0x5f, 0x57, 0x60, 0x29, 0x46, 0x0e, 0x7d, 0xe2, 0x85, 0xb8, 0x1c, 0x1b, 0xbd, 0x0e, 0x8b, 0x52, 0x26, 0xcb, 0xb3, 0x27, 0xb8, 0x5b, 0xe5, 0xdd, 0x4d, 0x09, 0xdb, 0xb3, 0x27, 0x18, 0xbd, 0x05, 0x4b, 0x0a, 0x45, 0x31, 0xa9, 0x71, 0xac, 0xb6, 0x04, 0xcb, 0xd1, 0xd0, 0x1d, 0xb8, 0xa0, 0x10, 0x6d, 0xdf, 0x8d, 0x91, 0x67, 0x39, 0xf2, 0xb2, 0xec, 0xea, 0xfb, 0xae, 0xc4, 0x37, 0x7e, 0x09, 0x8d, 0xed, 0xbd, 0xc1, 0x16, 0xf1, 0x8e, 0xdd, 0x11, 0x13, 0x31, 0xc4, 0x01, 0xa3, 0xe9, 0x56, 0x36, 0x6a, 0x4c, 0x44, 0xd9, 0x44, 0x3d, 0xa8, 0x87, 0xd8, 0x0e, 0x86, 0x27, 0x38, 0xec, 0x56, 0x79, 0x57, 0xdc, 0x66, 0x54, 0xc4, 0xa7, 0x2e, 0xf1, 0xc2, 0x6e, 0x4d, 0x50, 0xc9, 0xa6, 0xf1, 0xb7, 0x15, 0x68, 0x1e, 0x90, 0x80, 0x3e, 0xb6, 0x7d, 0xdf, 0xf5, 0x46, 0xe8, 0x36, 0xd4, 0xf9, 0x5a, 0x0e, 0xc9, 0x98, 0xaf, 0x41, 0x7b, 0x73, 0xf9, 0x8e, 0x14, 0xe9, 0xce, 0x81, 0xec, 0x30, 0x63, 0x14, 0x74, 0x1d, 0xda, 0x43, 0xe2, 0x51, 0xdb, 0xf5, 0x70, 0x60, 0xf9, 0x24, 0xa0, 0x7c, 0x65, 0xe6, 0xcc, 0x56, 0x0c, 0x65, 0xcc, 0xd1, 0x65, 0x68, 0x9c, 0x90, 0x90, 0x0a, 0x8c, 0x1a, 0xc7, 0xa8, 0x33, 0x00, 0xef, 0x5c, 0x83, 0x05, 0xde, 0xe9, 0xfa, 0x72, 0x0d, 0xe6, 0x59, 0x73, 0xd7, 0x37, 0xbe, 0xab, 0xc0, 0xdc, 0x63, 0x12, 0x79, 0x34, 0x33, 0x8c, 0x4d, 0x4f, 0xa4, 0x7e, 0xb4, 0x61, 0x6c, 0x7a, 0x92, 0x0c, 0xc3, 0x30, 0x84, 0x8a, 0xc4, 0x30, 0xac, 0xb3, 0x07, 0xf5, 0x00, 0xdb, 0x0e, 0xf1, 0xc6, 0xa7, 0x5c, 0x84, 0xba, 0x19, 0xb7, 0x99, 0xee, 0x42, 0x3c, 0x76, 0xbd, 0xe8, 0x99, 0x15, 0xe0, 0xb1, 0x7d, 0x84, 0xc7, 0x5c, 0x94, 0xba, 0xd9, 0x96, 0x60, 0x53, 0x40, 0x8d, 0xaf, 0x61, 0x89, 0x29, 0x3b, 0xf4, 0xed, 0x21, 0xde, 0xe7, 0x4b, 0xc8, 0x4c, 0x83, 0x0f, 0xea, 0x61, 0xfa, 0x2d, 0x09, 0xbe, 0xe1, 0x92, 0xd5, 0xcd, 0x26, 0x83, 0xed, 0x09, 0x10, 0xba, 0x04, 0x75, 0x21, 0x97, 0xeb, 0x70, 0xb1, 0xea, 0x26, 0x9f, 0xf1, 0x81, 0xeb, 0xc4, 0x5d, 0xae, 0x3f, 0x94, 0x52, 0x2d, 0x88, 0xd9, 0x0f, 0x0d, 0x03, 0x60, 0xd7, 0xa3, 0xef, 0xff, 0xe4, 0x2b, 0x7b, 0x1c, 0x61, 0xb4, 0x02, 0x73, 0x4f, 0xd9, 0x07, 0xe7, 0x5f, 0x33, 0x45, 0xc3, 0xf8, 0x8f, 0x2a, 0x5c, 0x7e, 0xc4, 0x04, 0x1c, 0xd8, 0x9e, 0x73, 0x44, 0x9e, 0x0d, 0xf0, 0x30, 0x0a, 0x5c, 0x7a, 0xba, 0x45, 0x3c, 0x8a, 0x9f, 0x51, 0xb4, 0x03, 0xcb, 0x9e, 0x92, 0xd7, 0x52, 0x26, 0xc0, 0x38, 0x34, 0x37, 0xbb, 0xb1, 0x5e, 0x33, 0x33, 0x32, 0x3b, 0x5e, 0x1a, 0x10, 0xa2, 0xcf, 0x92, 0xf5, 0x51, 0x4c, 0xaa, 0x9c, 0xc9, 0x6a, 0xcc, 0x64, 0xb0, 0xc3, 0xe5, 0x90, 0x2c, 0xd4, 0xba, 0x29, 0x06, 0xef, 0x02, 0xdb, 0x2b, 0x96, 0x1d, 0x5a, 0x51, 0x88, 0x03, 0x3e, 0xd3, 0xe6, 0xe6, 0x85, 0x98, 0x38, 0x99, 0xa7, 0xd9, 0x08, 0x22, 0xaf, 0x1f, 0x1e, 0x86, 0x38, 0xe0, 0x3b, 0x4a, 0x6a, 0xc8, 0x0a, 0x08, 0xa1, 0xc7, 0xa1, 0xd2, 0x8a, 0x02, 0x9b, 0x1c, 0x8a, 0xde, 0x86, 0x0b, 0x61, 0xe4, 0xfb, 0x63, 0x3c, 0xc1, 0x1e, 0xb5, 0xc7, 0xd6, 0x28, 0x20, 0x91, 0x1f, 0x76, 0xe7, 0x36, 0x6a, 0x37, 0x6a, 0x26, 0xd2, 0xbb, 0xbe, 0xe0, 0x3d, 0x68, 0x1d, 0xc0, 0x0f, 0xdc, 0xa7, 0xee, 0x18, 0x8f, 0xb0, 0xd3, 0x9d, 0xe7, 0x4c, 0x35, 0x88, 0xf1, 0x5d, 0x15, 0x2e, 0xf2, 0xe9, 0x1c, 0x10, 0x47, 0xae, 0xac, 0xdc, 0x7f, 0xd7, 0xa0, 0x35, 0xe4, 0xec, 0x2d, 0xdf, 0x0e, 0xb0, 0x47, 0xa5, 0x21, 0x2e, 0x0a, 0xe0, 0x01, 0x87, 0xa1, 0x7d, 0xe8, 0x84, 0x52, 0x11, 0xd6, 0x50, 0x68, 0x42, 0xae, 0xd7, 0x1b, 0xf1, 0x94, 0xa7, 0x68, 0xcd, 0x5c, 0x0a, 0x73, 0x6a, 0x5c, 0x08, 0x4f, 0xc3, 0x21, 0x1d, 0x8b, 0xfd, 0xdb, 0xdc, 0xfc, 0x51, 0x9a, 0x4f, 0x56, 0xcc, 0x3b, 0x03, 0x81, 0xbd, 0xe3, 0xd1, 0xe0, 0xd4, 0x54, 0xb4, 0xbd, 0x7b, 0xb0, 0xa8, 0x77, 0xa0, 0x0e, 0xd4, 0xbe, 0xc1, 0xa7, 0x72, 0x0a, 0xec, 0x33, 0xb1, 0x32, 0xb1, 0x7b, 0x44, 0xe3, 0x5e, 0xf5, 0x4f, 0x2a, 0x46, 0x00, 0x28, 0x19, 0xe5, 0x31, 0xa6, 0xb6, 0x63, 0x53, 0x1b, 0x21, 0x98, 0xe5, 0xfe, 0x50, 0xb0, 0xe0, 0xdf, 0x8c, 0x6b, 0x24, 0x0d, 0xbd, 0x61, 0xb2, 0x4f, 0x74, 0x05, 0x1a, 0xb1, 0x49, 0x49, 0xa7, 0x98, 0x00, 0x98, 0x73, 0xb2, 0x29, 0xc5, 0x13, 0x9f, 0x72, 0xf5, 0xb6, 0x4c, 0xd5, 0x34, 0xfe, 0x79, 0x16, 0x3a, 0x39, 0x0d, 0x7c, 0x00, 0xf5, 0x89, 0x1c, 0x5e, 0x5a, 0xf2, 0xe5, 0xc4, 0x43, 0xe5, 0x24, 0x34, 0x63, 0x64, 0xe6, 0x00, 0xd8, 0xd6, 0xd2, 0xfc, 0x77, 0xdc, 0x66, 0x6a, 0x1d, 0x93, 0x91, 0xe5, 0xb8, 0x01, 0x1e, 0x52, 0x12, 0x9c, 0x4a, 0x29, 0x17, 0xc7, 0x64, 0xb4, 0xad, 0x60, 0xe8, 0x1d, 0x00, 0xc7, 0x0b, 0x99, 0x46, 0x8f, 0xdd, 0x11, 0x97, 0xb5, 0xb9, 0x89, 0xe2, 0xb1, 0x63, 0x1f, 0x6d, 0x36, 0x1c, 0x2f, 0x94, 0xc2, 0x7e, 0x08, 0x2d, 0xe6, 0xf3, 0xac, 0x89, 0x70, 0xaf, 0xc2, 0x26, 0x9b, 0x9b, 0x2b, 0x9a, 0xc4, 0xb1, 0xef, 0x35, 0x17, 0xfd, 0xa4, 0x11, 0xa2, 0x4f, 0x60, 0x9e, 0xfb, 0x9c, 0xb0, 0x3b, 0xcf, 0x69, 0xae, 0x17, 0xcc, 0x52, 0x6a, 0xfb, 0x11, 0xc7, 0x13, 0xca, 0x96, 0x44, 0xe8, 0x11, 0x34, 0x6d, 0xcf, 0x23, 0xd4, 0x16, 0xdb, 0x75, 0x81, 0xf3, 0xb8, 0x55, 0xce, 0xa3, 0x9f, 0x20, 0x0b, 0x46, 0x3a, 0x39, 0xfa, 0x09, 0xcc, 0xf1, 0xfd, 0xdc, 0xad, 0xf3, 0x59, 0xaf, 0x4f, 0x37, 0x3f, 0x53, 0x20, 0xf7, 0x3e, 0x84, 0xa6, 0x26, 0xda, 0x79, 0xcc, 0xad, 0xf7, 0x29, 0x74, 0xb2, 0x12, 0x9d, 0xcb, 0x5c, 0x77, 0x61, 0xc5, 0x8c, 0xbc, 0x44, 0x30, 0x15, 0x10, 0xbc, 0x03, 0xf3, 0x52, 0x7f, 0xc2, 0x76, 0x2e, 0x95, 0xae, 0x88, 0x29, 0x11, 0x8d, 0x4f, 0xe0, 0x62, 0x86, 0x95, 0x0c, 0x17, 0xde, 0x80, 0xb6, 0x4f, 0x1c, 0x2b, 0x14, 0x60, 0xcb, 0x75, 0x94, 0x33, 0xf0, 0x63, 0xdc, 0x5d, 0x87, 0x91, 0x0f, 0x28, 0xf1, 0xf3, 0xa2, 0x9c, 0x8d, 0xbc, 0x0b, 0xab, 0x59, 0x72, 0x31, 0xbc, 0xf1, 0x19, 0xac, 0x99, 0x78, 0x42, 0x9e, 0xe2, 0x97, 0x65, 0xdd, 0x83, 0x6e, 0x9e, 0x41, 0xc2, 0x3c, 0x81, 0x0e, 0xa8, 0x4d, 0xa3, 0xf0, 0x7c, 0xcc, 0x6f, 0xea, 0x0c, 0xe4, 0x41, 0x28, 0xf8, 0xa0, 0x36, 0x54, 0x5d, 0x5f, 0x12, 0x55, 0x5d, 0xdf, 0xf8, 0x0c, 0x1a, 0xf1, 0x11, 0x84, 0x36, 0x93, 0x50, 0xa5, 0xfa, 0x82, 0x73, 0x2a, 0x0e, 0x62, 0x1e, 0xe6, 0xbc, 0xb5, 0x1c, 0x69, 0x13, 0x20, 0xf6, 0x33, 0xea, 0xdc, 0x43, 0x79, 0x7e, 0xa6, 0x86, 0x65, 0xfc, 0x7d, 0xca, 0xe9, 0x68, 0x22, 0x3b, 0xb1, 0xc8, 0x4e, 0xca, 0x09, 0x55, 0xcf, 0xe3, 0x84, 0xee, 0xc0, 0x5c, 0x48, 0x6d, 0x2a, 0xdc, 0x60, 0x5b, 0x9b, 0x5c, 0x7a, 0x48, 0x6c, 0x0a, 0x34, 0x74, 0x15, 0x60, 0x18, 0x60, 0x9b, 0x62, 0xc7, 0xb2, 0x85, 0x7f, 0xac, 0x99, 0x0d, 0x09, 0xe9, 0x53, 0x74, 0x0f, 0x16, 0x54, 0xdc, 0x31, 0xc7, 0xc5, 0xd8, 0x28, 0x60, 0x98, 0x5a, 0x7d, 0x53, 0x11, 0x24, 0x7b, 0x7a, 0x7e, 0xfa, 0x9e, 0x96, 0x74, 0x02, 0x59, 0x73, 0x4b, 0x0b, 0xa5, 0x6e, 0x49, 0x50, 0x9c, 0xc5, 0x2d, 0xd5, 0x4b, 0xdd, 0x92, 0xe4, 0x31, 0xd5, 0x2d, 0xfd, 0x31, 0x1d, 0xcc, 0x63, 0xe8, 0xe6, 0x37, 0x88, 0x74, 0x0c, 0xef, 0xc0, 0x7c, 0xc8, 0x21, 0x53, 0x9c, 0x8c, 0x24, 0x91, 0x88, 0xc6, 0x03, 0x58, 0xc9, 0x58, 0x80, 0x08, 0xfb, 0x62, 0x7b, 0xa9, 0x9c, 0xc9, 0x5e, 0x8c, 0xff, 0xaf, 0xe8, 0xd6, 0xfb, 0xc0, 0x1d, 0x53, 0x1c, 0xe4, 0xac, 0xf7, 0x5d, 0xc5, 0x54, 0x98, 0xee, 0xd5, 0x32, 0xa6, 0x22, 0x22, 0x93, 0x96, 0x38, 0x80, 0x36, 0xd7, 0xa1, 0x15, 0xe2, 0x31, 0x3f, 0x10, 0x65, 0x28, 0xf2, 0xe3, 0x02, 0x6a, 0x31, 0xae, 0x30, 0x80, 0x81, 0x44, 0x17, 0xea, 0x6b, 0x8d, 0x75, 0x58, 0xef, 0x3e, 0xa0, 0x3c, 0xd2, 0xb9, 0xf4, 0xf0, 0x25, 0xdb, 0xfb, 0x2c, 0x93, 0x28, 0xf0, 0xf4, 0xc7, 0x5c, 0x8c, 0x29, 0x4a, 0x10, 0x72, 0x9a, 0x12, 0xd1, 0xf8, 0xbb, 0x1a, 0x40, 0xd2, 0xf9, 0xca, 0x6e, 0xfa, 0x0f, 0xe2, 0x2d, 0x28, 0xa2, 0x89, 0xd7, 0x0a, 0xf8, 0x15, 0x6e, 0xbe, 0x07, 0xe9, 0xcd, 0x27, 0xe2, 0x8a, 0x37, 0x8a, 0xa8, 0x5f, 0xd9, 0x6d, 0xb7, 0x05, 0xab, 0x59, 0x75, 0xcb, 0x4d, 0x77, 0x13, 0xe6, 0x5c, 0x8a, 0x27, 0x22, 0x2f, 0xd6, 0x93, 0x0b, 0x0d, 0x57, 0x60, 0x18, 0xaf, 0x43, 0x63, 0x77, 0x62, 0x8f, 0xf0, 0xc0, 0xc7, 0x43, 0x36, 0x96, 0xcb, 0x1a, 0x72, 0x7c, 0xd1, 0x30, 0x36, 0xa1, 0xfe, 0x10, 0x9f, 0x8a, 0x3d, 0x78, 0x46, 0xf9, 0x8c, 0x7f, 0xad, 0xc0, 0x1a, 0xf7, 0x9d, 0x5b, 0x2a, 0x2b, 0x35, 0x71, 0x48, 0xa2, 0x60, 0x88, 0x43, 0xae, 0x52, 0x3f, 0xb2, 0x7c, 0x1c, 0xb8, 0xc4, 0x91, 0x39, 0x5c, 0x63, 0xe8, 0x47, 0x07, 0x1c, 0xc0, 0x32, 0x57, 0xd6, 0xfd, 0xab, 0x88, 0x48, 0xdb, 0xaa, 0x99, 0xf5, 0xa1, 0x1f, 0xfd, 0x94, 0xb5, 0x15, 0x6d, 0x78, 0x62, 0x07, 0x38, 0xe4, 0x36, 0x24, 0x68, 0x07, 0x1c, 0x80, 0xde, 0x81, 0x8b, 0x13, 0x3c, 0x21, 0xc1, 0xa9, 0x35, 0x76, 0x27, 0x2e, 0xb5, 0x5c, 0xcf, 0x3a, 0x3a, 0xa5, 0x38, 0x94, 0x86, 0x83, 0x44, 0xe7, 0x23, 0xd6, 0xb7, 0xeb, 0x7d, 0xce, 0x7a, 0x90, 0x01, 0x2d, 0x42, 0x26, 0x56, 0x38, 0x24, 0x01, 0xb6, 0x6c, 0xe7, 0x6b, 0x7e, 0x78, 0xd4, 0xcc, 0x26, 0x21, 0x93, 0x01, 0x83, 0xf5, 0x9d, 0xaf, 0x0d, 0x1b, 0x5a, 0xa9, 0x9c, 0x8e, 0xc5, 0xfa, 0x3c, 0x79, 0x93, 0xb1, 0x3e, 0xfb, 0x66, 0xb0, 0x80, 0x8c, 0xd5, 0x3a, 0xf0, 0x6f, 0x06, 0xa3, 0xa7, 0xbe, 0x0a, 0xf4, 0xf9, 0x37, 0x5b, 0xb0, 0x31, 0x7e, 0x2a, 0xd3, 0xea, 0x86, 0x29, 0x1a, 0x86, 0x03, 0xb0, 0x65, 0xfb, 0xf6, 0x91, 0x3b, 0x76, 0xe9, 0x29, 0xba, 0x09, 0x1d, 0xdb, 0x71, 0xac, 0xa1, 0x82, 0xb8, 0x58, 0xd5, 0x38, 0x96, 0x6c, 0xc7, 0xd9, 0xd2, 0xc0, 0xe8, 0x47, 0xb0, 0xec, 0x04, 0xc4, 0x4f, 0xe3, 0x8a, 0xa2, 0x47, 0x87, 0x75, 0xe8, 0xc8, 0xc6, 0xf3, 0x1a, 0x5c, 0x4d, 0xab, 0x25, 0x9b, 0x25, 0x7f, 0x00, 0x8b, 0x99, 0x51, 0xd3, 0xe9, 0x69, 0x22, 0xa4, 0x99, 0x42, 0xcc, 0xe4, 0x91, 0xd5, 0x6c, 0x1e, 0x59, 0x9c, 0x7e, 0xd7, 0x7e, 0x88, 0xf4, 0x7b, 0xf6, 0xfb, 0xa4, 0xdf, 0x73, 0x67, 0x4a, 0xbf, 0xdf, 0xe4, 0x05, 0x2d, 0x45, 0xc4, 0xd3, 0xa6, 0x79, 0x51, 0x75, 0x89, 0x71, 0x3c, 0x55, 0xf8, 0xca, 0xa4, 0xe9, 0x0b, 0xe7, 0x49, 0xd3, 0xeb, 0xa5, 0x69, 0x3a, 0xb3, 0x08, 0xdf, 0xb7, 0x83, 0x09, 0x09, 0x2c, 0x3f, 0x20, 0xc7, 0xee, 0x18, 0x77, 0x1b, 0x5c, 0x84, 0x25, 0x05, 0x3f, 0x10, 0x60, 0xe3, 0x1f, 0x2a, 0xb0, 0x92, 0x56, 0xb2, 0xcc, 0xc0, 0x3e, 0x85, 0x46, 0xa0, 0x76, 0xa1, 0x54, 0xec, 0x46, 0x3a, 0xd2, 0xc9, 0xef, 0x56, 0x33, 0x21, 0x41, 0x3f, 0x2d, 0xcd, 0xe5, 0xdf, 0x2c, 0x61, 0xf3, 0xa2, 0x6c, 0xde, 0xe8, 0xc3, 0x72, 0x8c, 0x3c, 0x35, 0x93, 0xd6, 0x32, 0xe3, 0x6a, 0x3a, 0x33, 0xf6, 0x60, 0x7e, 0x1b, 0x3f, 0x75, 0x87, 0xf8, 0x07, 0x29, 0x8d, 0x6d, 0x40, 0xd3, 0xc7, 0xc1, 0xc4, 0x0d, 0xc3, 0xd8, 0x40, 0x1b, 0xa6, 0x0e, 0x32, 0xfe, 0x7b, 0x0e, 0x96, 0xb2, 0x2b, 0xfb, 0x7e, 0x2e, 0x11, 0xef, 0x25, 0x3b, 0x26, 0x3b, 0x3f, 0xed, 0x34, 0xbc, 0xa1, 0x1c, 0x6e, 0x35, 0x13, 0x8f, 0xc7, 0x3e, 0x59, 0x3a, 0x61, 0x36, 0xff, 0x21, 0x99, 0x4c, 0x6c, 0xcf, 0x51, 0x65, 0x4b, 0xd9, 0x64, 0xab, 0x65, 0x07, 0x23, 0xb6, 0x0d, 0x18, 0x98, 0x7f, 0xa3, 0xd7, 0xa0, 0xc9, 0xe2, 0x5a, 0xd7, 0xe3, 0x79, 0x3c, 0x37, 0xf2, 0x86, 0x09, 0x12, 0xb4, 0xed, 0x06, 0xe8, 0x3a, 0xcc, 0x62, 0xef, 0xa9, 0x3a, 0xf7, 0x92, 0xba, 0xa6, 0x72, 0xf4, 0x26, 0xef, 0x46, 0x6f, 0xc2, 0xfc, 0x84, 0x44, 0x1e, 0x55, 0x11, 0x6e, 0x3b, 0x46, 0xe4, 0xc5, 0x48, 0x53, 0xf6, 0xa2, 0x9b, 0xb0, 0xe0, 0x70, 0x1d, 0xa8, 0x30, 0x76, 0x29, 0xa9, 0x05, 0x70, 0xb8, 0xa9, 0xfa, 0xd1, 0xc7, 0xf1, 0x89, 0xdd, 0xc8, 0x9c, 0xb9, 0x99, 0x45, 0x2d, 0x3c, 0xb6, 0x1f, 0xa6, 0x8f, 0x6d, 0xe0, 0x2c, 0x6e, 0x96, 0xb2, 0x98, 0x9e, 0xc9, 0x5f, 0x82, 0xfa, 0x98, 0x8c, 0x84, 0x1d, 0x34, 0x45, 0x91, 0x7b, 0x4c, 0x46, 0xdc, 0x0c, 0x56, 0x58, 0x98, 0xe2, 0xb8, 0x5e, 0x77, 0x91, 0x6f, 0x5f, 0xd1, 0x60, 0xa7, 0x0f, 0xff, 0xb0, 0x88, 0x37, 0xc4, 0xdd, 0x16, 0xef, 0x6a, 0x70, 0xc8, 0xbe, 0x37, 0xe4, 0x87, 0x23, 0xa5, 0xa7, 0xdd, 0x36, 0x87, 0xb3, 0x4f, 0x16, 0x5d, 0x8a, 0xbc, 0x62, 0x29, 0x13, 0x5d, 0x16, 0xed, 0xcf, 0x57, 0xa0, 0x54, 0xf0, 0x4f, 0x15, 0x58, 0xdd, 0xe2, 0xc1, 0x95, 0xe6, 0x09, 0xce, 0x91, 0xea, 0xa2, 0xbb, 0x71, 0x4d, 0x21, 0x9b, 0xb1, 0x66, 0x27, 0x2b, 0xf1, 0xd0, 0x7d, 0x68, 0x2b, 0x9e, 0x92, 0xb2, 0xf6, 0xa2, 0x6a, 0x44, 0x2b, 0xd4, 0x9b, 0xc6, 0xc7, 0xb0, 0x96, 0x93, 0x59, 0x06, 0x42, 0xaf, 0xc3, 0x62, 0xe2, 0x11, 0x62, 0x91, 0x9b, 0x31, 0x6c, 0xd7, 0x31, 0xee, 0xc1, 0xc5, 0x01, 0xb5, 0x03, 0x9a, 0x9b, 0xf0, 0x19, 0x68, 0x79, 0x41, 0x22, 0x4d, 0x2b, 0x6b, 0x06, 0x03, 0x58, 0x19, 0x50, 0xe2, 0xbf, 0x04, 0x53, 0xb6, 0xd3, 0xd9, 0xb4, 0x49, 0x44, 0x65, 0xf4, 0xa3, 0x9a, 0xc6, 0x9a, 0x28, 0x9f, 0xe4, 0x47, 0xfb, 0x08, 0x56, 0x45, 0xf5, 0xe2, 0x65, 0x26, 0x71, 0x49, 0xd5, 0x4e, 0xf2, 0x7c, 0xb7, 0xe1, 0x42, 0xe2, 0xca, 0x93, 0x44, 0xec, 0x76, 0x3a, 0x11, 0x5b, 0xcb, 0xeb, 0x38, 0x95, 0x87, 0xfd, 0x4d, 0x55, 0x73, 0x98, 0x25, 0x69, 0xd8, 0x66, 0x3a, 0x0d, 0xbb, 0x52, 0xc2, 0x32, 0x95, 0x85, 0xe5, 0x2d, 0xb2, 0x56, 0x60, 0x91, 0x66, 0x2e, 0x57, 0x9b, 0xcd, 0x94, 0x8d, 0x33, 0xb2, 0xfd, 0x41, 0x52, 0xb5, 0x5d, 0x91, 0xaa, 0xc5, 0x43, 0xc7, 0x15, 0xa5, 0xbb, 0x99, 0x54, 0xad, 0x5b, 0x26, 0x66, 0x9c, 0xa9, 0xfd, 0xf5, 0x2c, 0x34, 0xe2, 0xbe, 0xdc, 0xc2, 0xe6, 0x17, 0xa9, 0x5a, 0xb0, 0x48, 0xfa, 0xf9, 0x55, 0x7b, 0x99, 0xf3, 0x6b, 0xf6, 0x45, 0xe7, 0xd7, 0x65, 0x68, 0xf0, 0x0f, 0x2b, 0xc0, 0xc7, 0xf2, 0x3c, 0xaa, 0x73, 0x80, 0x89, 0x8f, 0x13, 0x83, 0x9a, 0x3f, 0x8b, 0x41, 0x65, 0x72, 0xc2, 0x85, 0x6c, 0x4e, 0xf8, 0x7e, 0x7c, 0xc2, 0x88, 0xb3, 0x68, 0x3d, 0xcf, 0xae, 0xf0, 0x6c, 0xd9, 0x49, 0x9f, 0x2d, 0xe2, 0x78, 0xba, 0x56, 0x40, 0xfc, 0xca, 0x66, 0x84, 0x8f, 0x44, 0x46, 0xa8, 0x5b, 0x95, 0x74, 0x84, 0x9b, 0x00, 0xf1, 0x9e, 0x57, 0x69, 0x21, 0xca, 0x4f, 0xcd, 0xd4, 0xb0, 0x98, 0x57, 0x49, 0xad, 0x7f, 0x52, 0xf6, 0x3c, 0x83, 0x57, 0xf9, 0x17, 0x3d, 0x4a, 0x2a, 0xa9, 0x1c, 0xbe, 0x9f, 0x2b, 0x22, 0x9c, 0xcd, 0xea, 0x6e, 0xa7, 0x6b, 0x08, 0xe7, 0x33, 0x97, 0x5c, 0x09, 0x81, 0x1f, 0xea, 0x76, 0x20, 0xbb, 0x45, 0xf6, 0xd7, 0x90, 0x90, 0x3e, 0x65, 0xa1, 0xd4, 0xb1, 0xeb, 0xb9, 0xe1, 0x89, 0xe8, 0x9f, 0xe7, 0xfd, 0xa0, 0x40, 0x7d, 0x7e, 0xa1, 0x8b, 0x9f, 0xb9, 0xd4, 0x1a, 0x12, 0x07, 0x73, 0x63, 0x9c, 0x33, 0xeb, 0x0c, 0xb0, 0x45, 0x1c, 0x9c, 0x6c, 0x90, 0xfa, 0xb9, 0x36, 0x48, 0x23, 0xb3, 0x41, 0x56, 0x61, 0x3e, 0xc0, 0x76, 0x48, 0xbc, 0x2e, 0x88, 0x6b, 0x61, 0xd1, 0x62, 0x67, 0xc5, 0x04, 0x87, 0x21, 0x1b, 0x40, 0x06, 0x30, 0xb2, 0xa9, 0x85, 0x59, 0x8b, 0x65, 0x61, 0xd6, 0x94, 0xd2, 0x64, 0x26, 0xcc, 0x6a, 0x95, 0x85, 0x59, 0x67, 0xa9, 0x4c, 0x6a, 0x41, 0x64, 0x7b, 0x6a, 0x10, 0xa9, 0x87, 0x63, 0x4b, 0xa9, 0x70, 0xec, 0x8f, 0xb9, 0xa7, 0x1e, 0xc2, 0x5a, 0x6e, 0x17, 0xc8, 0x4d, 0x75, 0x37, 0x53, 0xdb, 0xec, 0x96, 0x2d, 0x50, 0x5c, 0xda, 0xfc, 0x73, 0x58, 0xda, 0x79, 0x86, 0x87, 0x83, 0x53, 0x6f, 0x78, 0x8e, 0x88, 0xa0, 0x03, 0xb5, 0xe1, 0xc4, 0x91, 0x49, 0x3d, 0xfb, 0xd4, 0x63, 0x84, 0x5a, 0x3a, 0x46, 0xb0, 0xa0, 0x93, 0x8c, 0x20, 0xe5, 0x5c, 0x65, 0x72, 0x3a, 0x0c, 0x99, 0x31, 0x5f, 0x34, 0x65, 0x4b, 0xc2, 0x71, 0x10, 0xf0, 0x59, 0x0b, 0x38, 0x0e, 0x82, 0xb4, 0x45, 0xd7, 0xd2, 0x16, 0x6d, 0x7c, 0x0d, 0x4d, 0x36, 0xc0, 0xf7, 0x12, 0x5f, 0x06, 0xca, 0xb5, 0x24, 0x50, 0x8e, 0xe3, 0xed, 0x59, 0x2d, 0xde, 0x36, 0x36, 0x60, 0x51, 0x8c, 0x25, 0x27, 0xd2, 0x81, 0x5a, 0x14, 0x8c, 0x95, 0xde, 0xa2, 0x60, 0x6c, 0xfc, 0x29, 0xb4, 0xfa, 0x94, 0xda, 0xc3, 0x93, 0x73, 0xc8, 0x13, 0x8f, 0x55, 0xd5, 0x63, 0xfb, 0x9c, 0x4c, 0x86, 0x01, 0x6d, 0xc5, 0xbb, 0x74, 0xfc, 0x3d, 0x40, 0x07, 0x24, 0xa0, 0x0f, 0x48, 0xf0, 0xad, 0x1d, 0x38, 0xe7, 0x8b, 0x95, 0x11, 0xcc, 0xca, 0x67, 0x22, 0xb5, 0x1b, 0x73, 0x26, 0xff, 0x36, 0xde, 0x82, 0x0b, 0x29, 0x7e, 0xa5, 0x03, 0x7f, 0x00, 0x4d, 0xee, 0x42, 0x64, 0x3c, 0x75, 0x43, 0xaf, 0xdc, 0x4d, 0xf3, 0x33, 0x2c, 0xe3, 0x66, 0x67, 0x04, 0x87, 0xc7, 0x0e, 0xfd, 0xc7, 0x99, 0xa8, 0x63, 0x25, 0x4d, 0x9f, 0x89, 0x38, 0xfe, 0xb1, 0x02, 0x73, 0x1c, 0x9e, 0xf3, 0xe8, 0x97, 0xa1, 0x11, 0x60, 0x9f, 0x58, 0xd4, 0x1e, 0xc5, 0x2f, 0x6f, 0x18, 0xe0, 0x89, 0x3d, 0x0a, 0xf9, 0xc3, 0x21, 0xd6, 0xe9, 0xb8, 0x23, 0x1c, 0x52, 0xf5, 0xfc, 0xa6, 0xc9, 0x60, 0xdb, 0x02, 0xc4, 0x96, 0x24, 0x74, 0xff, 0x42, 0x84, 0x13, 0xb3, 0x26, 0xff, 0x46, 0xd7, 0xc5, 0x1d, 0xfa, 0x94, 0x42, 0x0d, 0xbf, 0x58, 0xef, 0x41, 0x3d, 0x53, 0x9b, 0x89, 0xdb, 0xc6, 0xc7, 0x80, 0xf4, 0x39, 0xcb, 0x45, 0x7d, 0x13, 0xe6, 0xf9, 0x92, 0xa8, 0xf3, 0xb0, 0x9d, 0x9e, 0xb4, 0x29, 0x7b, 0x8d, 0x4f, 0x01, 0x89, 0x55, 0x4c, 0x9d, 0x81, 0x67, 0x5f, 0xf1, 0x8f, 0xe0, 0x42, 0x8a, 0x3e, 0xbe, 0x32, 0x4d, 0x31, 0xc8, 0x8e, 0x2e, 0x89, 0xff, 0xad, 0x02, 0xd0, 0x8f, 0xe8, 0x89, 0x2c, 0x34, 0xe8, 0xb3, 0xac, 0xa4, 0x67, 0xc9, 0xfa, 0x7c, 0x3b, 0x0c, 0xbf, 0x25, 0x81, 0x0a, 0xf2, 0xe2, 0x36, 0x2f, 0x12, 0x44, 0xf4, 0x44, 0x15, 0x22, 0xd9, 0x37, 0xba, 0x0e, 0x6d, 0xf1, 0x60, 0xca, 0xb2, 0x1d, 0x27, 0xc0, 0x61, 0x28, 0x2b, 0x92, 0x2d, 0x01, 0xed, 0x0b, 0x20, 0x43, 0x73, 0x1d, 0xec, 0x51, 0x97, 0x9e, 0x5a, 0x94, 0x7c, 0x83, 0x3d, 0x19, 0xbe, 0xb5, 0x14, 0xf4, 0x09, 0x03, 0x32, 0xb4, 0x00, 0x8f, 0xdc, 0x90, 0x06, 0x0a, 0x4d, 0x55, 0xc8, 0x24, 0x94, 0xa3, 0x19, 0xbf, 0xae, 0x40, 0xe7, 0x20, 0x1a, 0x8f, 0xc5, 0x24, 0xcf, 0xbb, 0x96, 0xe8, 0x2d, 0x39, 0x8f, 0x6a, 0xc6, 0x1a, 0x92, 0x25, 0x92, 0x93, 0xfb, 0xfe, 0x69, 0xe5, 0x5d, 0x58, 0xd6, 0x04, 0x95, 0x4a, 0x4b, 0x9d, 0xd2, 0x95, 0xf4, 0x29, 0xcd, 0x0c, 0x45, 0x64, 0x52, 0x2f, 0x37, 0x39, 0xe3, 0x22, 0x5c, 0x48, 0xd1, 0xcb, 0x2c, 0xec, 0x16, 0xb4, 0xe4, 0xb5, 0xa5, 0x34, 0x82, 0x4b, 0x50, 0x67, 0xee, 0x65, 0xe8, 0x3a, 0xaa, 0x02, 0xbd, 0xe0, 0x13, 0x67, 0xcb, 0x75, 0x02, 0x63, 0x0f, 0x5a, 0xa6, 0x60, 0x2f, 0x71, 0x3f, 0x81, 0xb6, 0xbc, 0xe4, 0xb4, 0x52, 0x97, 0xfd, 0x49, 0xb9, 0x34, 0xc5, 0xdb, 0x6c, 0x79, 0x7a, 0xd3, 0xf8, 0x25, 0xf4, 0x0e, 0x7d, 0x87, 0x05, 0x53, 0x3a, 0x57, 0x35, 0xb5, 0x4f, 0x40, 0x3d, 0xe8, 0x2b, 0x63, 0x9e, 0x26, 0x6b, 0x05, 0x7a, 0xd3, 0xb8, 0x0a, 0x97, 0x0b, 0x99, 0xcb, 0x79, 0xfb, 0xd0, 0x49, 0x3a, 0x1c, 0x57, 0x15, 0xde, 0x79, 0x41, 0xbd, 0xa2, 0x15, 0xd4, 0x57, 0xe3, 0x63, 0x58, 0x38, 0x74, 0xd9, 0xd2, 0x82, 0xa6, 0x5a, 0x59, 0xd0, 0x34, 0x9b, 0x0a, 0x9a, 0x8c, 0x2f, 0xe3, 0xd5, 0x93, 0x11, 0xeb, 0x87, 0x3c, 0x6c, 0x16, 0x63, 0x2b, 0x37, 0x71, 0xa9, 0x60, 0x72, 0x02, 0xc3, 0xd4, 0x90, 0x8d, 0x25, 0x68, 0xa5, 0x1c, 0x86, 0x71, 0x1f, 0xda, 0x19, 0x0f, 0x70, 0x27, 0x13, 0x3f, 0xe4, 0x96, 0x2d, 0x13, 0x3d, 0xac, 0x48, 0x47, 0xf4, 0x20, 0xdc, 0xf5, 0x8e, 0x89, 0xe2, 0x7b, 0x0d, 0x9a, 0x87, 0x65, 0x8f, 0xe3, 0x66, 0xd5, 0x7d, 0xcc, 0x5b, 0xb0, 0x3c, 0xa0, 0x24, 0xb0, 0x47, 0x78, 0x97, 0xef, 0xda, 0x63, 0x57, 0xdc, 0x58, 0x44, 0x51, 0xec, 0xbf, 0xf9, 0xb7, 0xf1, 0x9f, 0x15, 0x58, 0x7a, 0xe0, 0x8e, 0x71, 0x78, 0x1a, 0x52, 0x3c, 0x39, 0xe4, 0xb1, 0xe4, 0x15, 0x68, 0x30, 0x69, 0x42, 0x6a, 0x4f, 0x7c, 0x75, 0x5f, 0x13, 0x03, 0xd8, 0x1a, 0x85, 0x82, 0xb5, 0xca, 0x2e, 0xf5, 0x38, 0x3e, 0x37, 0x2a, 0x8b, 0xad, 0x25, 0x08, 0xbd, 0x0b, 0x10, 0x85, 0xd8, 0x91, 0x77, 0x34, 0xb5, 0xcc, 0xd1, 0x73, 0xa8, 0xd7, 0xe2, 0x19, 0x9e, 0xb8, 0xb0, 0x79, 0x0f, 0x9a, 0xae, 0x47, 0x1c, 0xcc, 0x6b, 0xf1, 0x8e, 0xcc, 0x3c, 0x8b, 0xa9, 0x40, 0x20, 0x1e, 0x86, 0xd8, 0x31, 0xfe, 0x4c, 0x7a, 0x61, 0xb5, 0x78, 0x52, 0x07, 0x3b, 0xb0, 0x2c, 0x36, 0xf4, 0x71, 0x3c, 0x69, 0xa5, 0xe8, 0x24, 0x9c, 0xcb, 0x2c, 0x88, 0xd9, 0x71, 0xe5, 0xa9, 0xa8, 0x28, 0x8c, 0x7b, 0x70, 0x31, 0x15, 0xf3, 0x9d, 0x27, 0x55, 0xfa, 0x22, 0x93, 0x67, 0x25, 0x06, 0x22, 0x13, 0x1d, 0x65, 0x1f, 0x25, 0x89, 0x4e, 0x28, 0x12, 0x9d, 0xd0, 0x30, 0xe1, 0x52, 0x2a, 0xfd, 0x4b, 0x09, 0xf2, 0x5e, 0xe6, 0x88, 0xbf, 0x5a, 0xc2, 0x2c, 0x73, 0xd6, 0xff, 0x6f, 0x05, 0x56, 0x8a, 0x10, 0x5e, 0xb2, 0xd0, 0xf0, 0xb3, 0x92, 0x9b, 0xf3, 0xbb, 0x53, 0xa5, 0xf9, 0x83, 0x94, 0x64, 0x1e, 0x42, 0xaf, 0x68, 0xf5, 0xf2, 0xaa, 0xa8, 0x9d, 0x41, 0x15, 0xff, 0x57, 0xd5, 0x4a, 0x67, 0x7d, 0x4a, 0x03, 0xf7, 0x28, 0x62, 0xc6, 0xfb, 0x43, 0xa5, 0xc0, 0xf7, 0xe3, 0xf4, 0x4e, 0xac, 0xdf, 0x8d, 0x3c, 0x55, 0x32, 0x6a, 0x61, 0x8a, 0xb7, 0x9f, 0x4e, 0xf1, 0x44, 0x51, 0xec, 0xf6, 0x54, 0x36, 0xaf, 0x6c, 0xdd, 0xe3, 0x79, 0x05, 0xda, 0x69, 0x3d, 0xa0, 0x8f, 0x01, 0xec, 0x58, 0x72, 0x69, 0xf2, 0x57, 0xa6, 0xcd, 0xce, 0xd4, 0xf0, 0xd1, 0x35, 0xa8, 0x0d, 0xfd, 0x48, 0x6a, 0x24, 0xb9, 0x1d, 0xd9, 0xf2, 0x23, 0xe1, 0x00, 0x58, 0x2f, 0x0b, 0x9a, 0xc5, 0x7d, 0x72, 0xce, 0x73, 0x3d, 0xe6, 0x60, 0x81, 0x2a, 0x71, 0xd0, 0x67, 0xd0, 0xfe, 0x36, 0x70, 0xa9, 0x7d, 0x34, 0xc6, 0xd6, 0xd8, 0x3e, 0xc5, 0x81, 0xf4, 0x5c, 0xe5, 0x5e, 0xa6, 0xa5, 0xf0, 0x1f, 0x31, 0x74, 0x23, 0x82, 0xba, 0x1a, 0xff, 0x05, 0x1e, 0xf9, 0x21, 0xac, 0x45, 0x0c, 0xcd, 0xe2, 0x77, 0xda, 0x9e, 0xed, 0x11, 0x2b, 0xc4, 0xec, 0x68, 0x52, 0xef, 0xc8, 0x8a, 0xbd, 0xe5, 0x0a, 0x27, 0xda, 0x22, 0x01, 0xde, 0xb3, 0x3d, 0x32, 0x10, 0x14, 0xc6, 0x04, 0x9a, 0xda, 0x74, 0x5e, 0x30, 0xf2, 0x7d, 0x58, 0x56, 0xf7, 0x4e, 0x21, 0xa6, 0xd2, 0xaf, 0x4f, 0x1b, 0x73, 0x49, 0xa2, 0x0f, 0x30, 0xe5, 0xde, 0xfd, 0xd6, 0x15, 0xa8, 0xab, 0xb7, 0xf5, 0x68, 0x01, 0x6a, 0x4f, 0xb6, 0x0e, 0x3a, 0x33, 0xec, 0xe3, 0x70, 0xfb, 0xa0, 0x53, 0xb9, 0x75, 0x0f, 0x96, 0x32, 0xef, 0x44, 0xd0, 0x32, 0xb4, 0x06, 0xfd, 0xbd, 0xed, 0xcf, 0xf7, 0x7f, 0x6e, 0x99, 0x3b, 0xfd, 0xed, 0x5f, 0x74, 0x66, 0xd0, 0x0a, 0x74, 0x14, 0x68, 0x6f, 0xff, 0x89, 0x80, 0x56, 0x6e, 0x7d, 0x93, 0xb1, 0x11, 0x8c, 0x2e, 0xc2, 0xf2, 0xd6, 0xfe, 0xde, 0x93, 0xfe, 0xee, 0xde, 0x8e, 0x69, 0x6d, 0x99, 0x3b, 0xfd, 0x27, 0x3b, 0xdb, 0x9d, 0x99, 0x34, 0xd8, 0x3c, 0xdc, 0xdb, 0xdb, 0xdd, 0xfb, 0xa2, 0x53, 0x61, 0x5c, 0x13, 0xf0, 0xce, 0xcf, 0x77, 0x19, 0x72, 0x35, 0x8d, 0x7c, 0xb8, 0xf7, 0x70, 0x6f, 0xff, 0x67, 0x7b, 0x9d, 0xda, 0xe6, 0x6f, 0x17, 0xa1, 0xad, 0x0e, 0x71, 0x1c, 0xf0, 0xdb, 0xc9, 0x4f, 0x61, 0x41, 0xfd, 0xf6, 0x90, 0x78, 0x8f, 0xf4, 0x3f, 0x1a, 0xbd, 0x6e, 0xbe, 0x43, 0x06, 0x43, 0x33, 0xe8, 0x80, 0x07, 0x27, 0xda, 0x9b, 0x9c, 0xab, 0x7a, 0xb8, 0x90, 0x7b, 0xf4, 0xd3, 0x5b, 0x2f, 0xeb, 0x8e, 0x39, 0x0e, 0x58, 0x44, 0xa2, 0xbf, 0xa7, 0x44, 0xeb, 0xfa, 0xb9, 0x9d, 0x7f, 0xa7, 0xd9, 0x7b, 0xad, 0xb4, 0x3f, 0x66, 0xfa, 0x0b, 0xe8, 0x64, 0x5f, 0x52, 0xa2, 0xe4, 0x96, 0xb9, 0xe4, 0x95, 0x66, 0xef, 0xf5, 0x29, 0x18, 0x3a, 0xeb, 0xdc, 0x6b, 0xc4, 0x8d, 0xf2, 0xf7, 0x64, 0x39, 0xd6, 0x65, 0x8f, 0xd4, 0xc4, 0x52, 0xa4, 0xdf, 0xd2, 0x20, 0xfd, 0x0d, 0x60, 0xc1, 0x9b, 0x2a, 0x6d, 0x29, 0x8a, 0x1f, 0xe1, 0x18, 0x33, 0xe8, 0x2b, 0x58, 0xca, 0x5c, 0x4c, 0xa1, 0x84, 0xaa, 0xf8, 0x9a, 0xad, 0xb7, 0x51, 0x8e, 0x90, 0xd6, 0x9b, 0x7e, 0xed, 0x94, 0xd2, 0x5b, 0xc1, 0x5d, 0x56, 0x4a, 0x6f, 0x85, 0xf7, 0x55, 0xdc, 0xbc, 0x52, 0x97, 0x4b, 0x9a, 0x79, 0x15, 0xdd, 0x64, 0xf5, 0xd6, 0xcb, 0xba, 0xf5, 0xe9, 0x67, 0x2e, 0x96, 0xb4, 0xe9, 0x17, 0xdf, 0x57, 0xf5, 0x36, 0xca, 0x11, 0xb2, 0xba, 0x4a, 0xaa, 0xdc, 0x19, 0x5d, 0xe5, 0x2e, 0x55, 0x32, 0xba, 0xca, 0x97, 0xc7, 0xa5, 0xae, 0x32, 0xe5, 0xea, 0xd7, 0x4a, 0xcb, 0x79, 0x79, 0x5d, 0x15, 0x57, 0x08, 0x8d, 0x19, 0xd4, 0x87, 0xba, 0xaa, 0xc7, 0xa1, 0x64, 0x77, 0x67, 0x8a, 0x80, 0xbd, 0x4b, 0x05, 0x3d, 0x31, 0x8b, 0xf7, 0x60, 0x96, 0x41, 0xd1, 0x4a, 0x0a, 0x49, 0x91, 0x5e, 0xcc, 0x40, 0x63, 0xb2, 0x8f, 0x60, 0x5e, 0x94, 0xaf, 0x50, 0x92, 0x57, 0xa4, 0x6a, 0x65, 0xbd, 0xb5, 0x1c, 0x3c, 0x26, 0xfe, 0x52, 0xfc, 0x0a, 0x25, 0xeb, 0x50, 0xe8, 0x72, 0xea, 0x91, 0x7e, 0xba, 0xda, 0xd5, 0xbb, 0x52, 0xdc, 0xa9, 0xeb, 0x2b, 0x73, 0x38, 0xaf, 0x97, 0x45, 0x4f, 0x39, 0x7d, 0x15, 0x47, 0x63, 0xc6, 0x0c, 0xb2, 0x44, 0x49, 0x27, 0xc3, 0xd8, 0x28, 0x56, 0x74, 0x8a, 0xf9, 0xb5, 0xa9, 0x38, 0xf1, 0x00, 0x47, 0x70, 0xa1, 0x20, 0x39, 0x45, 0x09, 0x75, 0x79, 0x5e, 0xdc, 0x7b, 0x63, 0x3a, 0x92, 0xae, 0x22, 0x69, 0x6b, 0xab, 0xfa, 0x06, 0xd5, 0x4c, 0x6c, 0x2d, 0x07, 0x57, 0xc4, 0x9b, 0x7f, 0x55, 0x83, 0x45, 0x51, 0x42, 0x90, 0x07, 0xcc, 0x17, 0x00, 0x49, 0x95, 0x0b, 0xf5, 0x52, 0xd3, 0x4c, 0x95, 0xfb, 0x7a, 0x97, 0x0b, 0xfb, 0x74, 0xe5, 0x6b, 0x05, 0x2b, 0x4d, 0xf9, 0xf9, 0x32, 0x98, 0xa6, 0xfc, 0x82, 0x1a, 0x97, 0x31, 0x83, 0xb6, 0xa1, 0x11, 0x57, 0x51, 0x90, 0x56, 0x7c, 0xc9, 0x94, 0x80, 0x7a, 0xbd, 0xa2, 0x2e, 0x5d, 0x22, 0xad, 0x32, 0xa2, 0x49, 0x94, 0xaf, 0xb7, 0x68, 0x12, 0x15, 0x15, 0x53, 0x92, 0xd9, 0x89, 0x44, 0x30, 0x3b, 0xbb, 0x54, 0x6e, 0x9d, 0x9d, 0x5d, 0x3a, 0x77, 0x34, 0x66, 0x3e, 0xbf, 0xf2, 0x9b, 0xdf, 0xad, 0x57, 0xfe, 0xeb, 0x77, 0xeb, 0x33, 0x7f, 0xf9, 0x7c, 0xbd, 0xf2, 0x9b, 0xe7, 0xeb, 0x95, 0x7f, 0x7f, 0xbe, 0x5e, 0xf9, 0xed, 0xf3, 0xf5, 0xca, 0x77, 0xff, 0xb3, 0x3e, 0x73, 0x34, 0xcf, 0xff, 0x0d, 0x7c, 0xf7, 0xf7, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xdd, 0x86, 0xaa, 0xcf, 0x39, 0x00, 0x00, </del> <ins> // 4074 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x3b, 0x4d, 0x6f, 0x1c, 0x47, 0x76, 0x9c, 0x19, 0x7e, 0xcc, 0xbc, 0xe1, 0x0c, 0x87, 0x25, 0x8a, 0x1c, 0x8d, 0x24, 0x9a, 0x6e, 0x59, 0xb6, 0xa4, 0x5d, 0xc9, 0x32, 0xbd, 0xb6, 0x63, 0xf9, 0x4b, 0x63, 0x92, 0x32, 0x68, 0x49, 0x24, 0xb7, 0x47, 0xf4, 0xee, 0x66, 0x03, 0x74, 0x9a, 0xd3, 0xc5, 0x61, 0xdb, 0x33, 0x5d, 0xbd, 0xdd, 0xd5, 0xb2, 0x98, 0x53, 0x72, 0xcb, 0xd1, 0x01, 0x72, 0xc9, 0x2d, 0x87, 0x00, 0x8b, 0x5c, 0x72, 0xc8, 0x29, 0xbf, 0x20, 0x58, 0x20, 0x08, 0x90, 0x43, 0x10, 0x24, 0xb7, 0x5d, 0xe5, 0x90, 0x43, 0x80, 0xfc, 0x86, 0xa0, 0xbe, 0xba, 0xab, 0xbf, 0x46, 0xa4, 0x6c, 0xec, 0xea, 0xd6, 0xf5, 0xea, 0xbd, 0x57, 0xaf, 0xea, 0xbd, 0x7a, 0xf5, 0xde, 0xab, 0x6a, 0x68, 0xd8, 0xbe, 0x7b, 0xc7, 0x0f, 0x08, 0x25, 0x68, 0x21, 0x88, 0x3c, 0xea, 0x4e, 0x70, 0xef, 0xf6, 0xc8, 0xa5, 0x27, 0xd1, 0xd1, 0x9d, 0x21, 0x99, 0xbc, 0x3d, 0x22, 0x23, 0xf2, 0x36, 0xef, 0x3f, 0x8a, 0x8e, 0x79, 0x8b, 0x37, 0xf8, 0x97, 0xa0, 0x33, 0x6e, 0x41, 0xfb, 0x2b, 0x1c, 0x84, 0x2e, 0xf1, 0x4c, 0xfc, 0xab, 0x08, 0x87, 0x14, 0x75, 0x61, 0xe1, 0xa9, 0x80, 0x74, 0x2b, 0x1b, 0x95, 0x1b, 0x0d, 0x53, 0x35, 0x8d, 0x5f, 0x57, 0x60, 0x29, 0x46, 0x0e, 0x7d, 0xe2, 0x85, 0xb8, 0x1c, 0x1b, 0xbd, 0x0e, 0x8b, 0x52, 0x26, 0xcb, 0xb3, 0x27, 0xb8, 0x5b, 0xe5, 0xdd, 0x4d, 0x09, 0xdb, 0xb3, 0x27, 0x18, 0xbd, 0x05, 0x4b, 0x0a, 0x45, 0x31, 0xa9, 0x71, 0xac, 0xb6, 0x04, 0xcb, 0xd1, 0xd0, 0x1d, 0xb8, 0xa0, 0x10, 0x6d, 0xdf, 0x8d, 0x91, 0x67, 0x39, 0xf2, 0xb2, 0xec, 0xea, 0xfb, 0xae, 0xc4, 0x37, 0x7e, 0x09, 0x8d, 0xed, 0xbd, 0xc1, 0x16, 0xf1, 0x8e, 0xdd, 0x11, 0x13, 0x31, 0xc4, 0x01, 0xa3, 0xe9, 0x56, 0x36, 0x6a, 0x4c, 0x44, 0xd9, 0x44, 0x3d, 0xa8, 0x87, 0xd8, 0x0e, 0x86, 0x27, 0x38, 0xec, 0x56, 0x79, 0x57, 0xdc, 0x66, 0x54, 0xc4, 0xa7, 0x2e, 0xf1, 0xc2, 0x6e, 0x4d, 0x50, 0xc9, 0xa6, 0xf1, 0x37, 0x15, 0x68, 0x1e, 0x90, 0x80, 0x3e, 0xb6, 0x7d, 0xdf, 0xf5, 0x46, 0xe8, 0x36, 0xd4, 0xf9, 0x5a, 0x0e, 0xc9, 0x98, 0xaf, 0x41, 0x7b, 0x73, 0xf9, 0x8e, 0x14, 0xe9, 0xce, 0x81, 0xec, 0x30, 0x63, 0x14, 0x74, 0x1d, 0xda, 0x43, 0xe2, 0x51, 0xdb, 0xf5, 0x70, 0x60, 0xf9, 0x24, 0xa0, 0x7c, 0x65, 0xe6, 0xcc, 0x56, 0x0c, 0x65, 0xcc, 0xd1, 0x65, 0x68, 0x9c, 0x90, 0x90, 0x0a, 0x8c, 0x1a, 0xc7, 0xa8, 0x33, 0x00, 0xef, 0x5c, 0x83, 0x05, 0xde, 0xe9, 0xfa, 0x72, 0x0d, 0xe6, 0x59, 0x73, 0xd7, 0x37, 0xbe, 0xab, 0xc0, 0xdc, 0x63, 0x12, 0x79, 0x34, 0x33, 0x8c, 0x4d, 0x4f, 0xa4, 0x7e, 0xb4, 0x61, 0x6c, 0x7a, 0x92, 0x0c, 0xc3, 0x30, 0x84, 0x8a, 0xc4, 0x30, 0xac, 0xb3, 0x07, 0xf5, 0x00, 0xdb, 0x0e, 0xf1, 0xc6, 0xa7, 0x5c, 0x84, 0xba, 0x19, 0xb7, 0x99, 0xee, 0x42, 0x3c, 0x76, 0xbd, 0xe8, 0x99, 0x15, 0xe0, 0xb1, 0x7d, 0x84, 0xc7, 0x5c, 0x94, 0xba, 0xd9, 0x96, 0x60, 0x53, 0x40, 0x8d, 0xaf, 0x61, 0x89, 0x29, 0x3b, 0xf4, 0xed, 0x21, 0xde, 0xe7, 0x4b, 0xc8, 0x4c, 0x83, 0x0f, 0xea, 0x61, 0xfa, 0x2d, 0x09, 0xbe, 0xe1, 0x92, 0xd5, 0xcd, 0x26, 0x83, 0xed, 0x09, 0x10, 0xba, 0x04, 0x75, 0x21, 0x97, 0xeb, 0x70, 0xb1, 0xea, 0x26, 0x9f, 0xf1, 0x81, 0xeb, 0xc4, 0x5d, 0xae, 0x3f, 0x94, 0x52, 0x2d, 0x88, 0xd9, 0x0f, 0x0d, 0x03, 0x60, 0xd7, 0xa3, 0xef, 0xff, 0xe4, 0x2b, 0x7b, 0x1c, 0x61, 0xb4, 0x02, 0x73, 0x4f, 0xd9, 0x07, 0xe7, 0x5f, 0x33, 0x45, 0xc3, 0xf8, 0xf7, 0x2a, 0x5c, 0x7e, 0xc4, 0x04, 0x1c, 0xd8, 0x9e, 0x73, 0x44, 0x9e, 0x0d, 0xf0, 0x30, 0x0a, 0x5c, 0x7a, 0xba, 0x45, 0x3c, 0x8a, 0x9f, 0x51, 0xb4, 0x03, 0xcb, 0x9e, 0x92, 0xd7, 0x52, 0x26, 0xc0, 0x38, 0x34, 0x37, 0xbb, 0xb1, 0x5e, 0x33, 0x33, 0x32, 0x3b, 0x5e, 0x1a, 0x10, 0xa2, 0xcf, 0x92, 0xf5, 0x51, 0x4c, 0xaa, 0x9c, 0xc9, 0x6a, 0xcc, 0x64, 0xb0, 0xc3, 0xe5, 0x90, 0x2c, 0xd4, 0xba, 0x29, 0x06, 0xef, 0x02, 0xdb, 0x2b, 0x96, 0x1d, 0x5a, 0x51, 0x88, 0x03, 0x3e, 0xd3, 0xe6, 0xe6, 0x85, 0x98, 0x38, 0x99, 0xa7, 0xd9, 0x08, 0x22, 0xaf, 0x1f, 0x1e, 0x86, 0x38, 0xe0, 0x3b, 0x4a, 0x6a, 0xc8, 0x0a, 0x08, 0xa1, 0xc7, 0xa1, 0xd2, 0x8a, 0x02, 0x9b, 0x1c, 0x8a, 0xde, 0x86, 0x0b, 0x61, 0xe4, 0xfb, 0x63, 0x3c, 0xc1, 0x1e, 0xb5, 0xc7, 0xd6, 0x28, 0x20, 0x91, 0x1f, 0x76, 0xe7, 0x36, 0x6a, 0x37, 0x6a, 0x26, 0xd2, 0xbb, 0xbe, 0xe0, 0x3d, 0x68, 0x1d, 0xc0, 0x0f, 0xdc, 0xa7, 0xee, 0x18, 0x8f, 0xb0, 0xd3, 0x9d, 0xe7, 0x4c, 0x35, 0x88, 0xf1, 0x5d, 0x15, 0x2e, 0xf2, 0xe9, 0x1c, 0x10, 0x47, 0xae, 0xac, 0xdc, 0x7f, 0xd7, 0xa0, 0x35, 0xe4, 0xec, 0x2d, 0xdf, 0x0e, 0xb0, 0x47, 0xa5, 0x21, 0x2e, 0x0a, 0xe0, 0x01, 0x87, 0xa1, 0x7d, 0xe8, 0x84, 0x52, 0x11, 0xd6, 0x50, 0x68, 0x42, 0xae, 0xd7, 0x1b, 0xf1, 0x94, 0xa7, 0x68, 0xcd, 0x5c, 0x0a, 0x73, 0x6a, 0x5c, 0x08, 0x4f, 0xc3, 0x21, 0x1d, 0x8b, 0xfd, 0xdb, 0xdc, 0xfc, 0x51, 0x9a, 0x4f, 0x56, 0xcc, 0x3b, 0x03, 0x81, 0xbd, 0xe3, 0xd1, 0xe0, 0xd4, 0x54, 0xb4, 0xbd, 0x7b, 0xb0, 0xa8, 0x77, 0xa0, 0x0e, 0xd4, 0xbe, 0xc1, 0xa7, 0x72, 0x0a, 0xec, 0x33, 0xb1, 0x32, 0xb1, 0x7b, 0x44, 0xe3, 0x5e, 0xf5, 0x8f, 0x2a, 0x46, 0x00, 0x28, 0x19, 0xe5, 0x31, 0xa6, 0xb6, 0x63, 0x53, 0x1b, 0x21, 0x98, 0xe5, 0xfe, 0x50, 0xb0, 0xe0, 0xdf, 0x8c, 0x6b, 0x24, 0x0d, 0xbd, 0x61, 0xb2, 0x4f, 0x74, 0x05, 0x1a, 0xb1, 0x49, 0x49, 0xa7, 0x98, 0x00, 0x98, 0x73, 0xb2, 0x29, 0xc5, 0x13, 0x9f, 0x72, 0xf5, 0xb6, 0x4c, 0xd5, 0x34, 0xfe, 0x69, 0x16, 0x3a, 0x39, 0x0d, 0x7c, 0x00, 0xf5, 0x89, 0x1c, 0x5e, 0x5a, 0xf2, 0xe5, 0xc4, 0x43, 0xe5, 0x24, 0x34, 0x63, 0x64, 0xe6, 0x00, 0xd8, 0xd6, 0xd2, 0xfc, 0x77, 0xdc, 0x66, 0x6a, 0x1d, 0x93, 0x91, 0xe5, 0xb8, 0x01, 0x1e, 0x52, 0x12, 0x9c, 0x4a, 0x29, 0x17, 0xc7, 0x64, 0xb4, 0xad, 0x60, 0xe8, 0x1d, 0x00, 0xc7, 0x0b, 0x99, 0x46, 0x8f, 0xdd, 0x11, 0x97, 0xb5, 0xb9, 0x89, 0xe2, 0xb1, 0x63, 0x1f, 0x6d, 0x36, 0x1c, 0x2f, 0x94, 0xc2, 0x7e, 0x08, 0x2d, 0xe6, 0xf3, 0xac, 0x89, 0x70, 0xaf, 0xc2, 0x26, 0x9b, 0x9b, 0x2b, 0x9a, 0xc4, 0xb1, 0xef, 0x35, 0x17, 0xfd, 0xa4, 0x11, 0xa2, 0x4f, 0x60, 0x9e, 0xfb, 0x9c, 0xb0, 0x3b, 0xcf, 0x69, 0xae, 0x17, 0xcc, 0x52, 0x6a, 0xfb, 0x11, 0xc7, 0x13, 0xca, 0x96, 0x44, 0xe8, 0x11, 0x34, 0x6d, 0xcf, 0x23, 0xd4, 0x16, 0xdb, 0x75, 0x81, 0xf3, 0xb8, 0x55, 0xce, 0xa3, 0x9f, 0x20, 0x0b, 0x46, 0x3a, 0x39, 0xfa, 0x09, 0xcc, 0xf1, 0xfd, 0xdc, 0xad, 0xf3, 0x59, 0xaf, 0x4f, 0x37, 0x3f, 0x53, 0x20, 0xf7, 0x3e, 0x84, 0xa6, 0x26, 0xda, 0x79, 0xcc, 0xad, 0xf7, 0x29, 0x74, 0xb2, 0x12, 0x9d, 0xcb, 0x5c, 0x77, 0x61, 0xc5, 0x8c, 0xbc, 0x44, 0x30, 0x15, 0x10, 0xbc, 0x03, 0xf3, 0x52, 0x7f, 0xc2, 0x76, 0x2e, 0x95, 0xae, 0x88, 0x29, 0x11, 0x8d, 0x4f, 0xe0, 0x62, 0x86, 0x95, 0x0c, 0x17, 0xde, 0x80, 0xb6, 0x4f, 0x1c, 0x2b, 0x14, 0x60, 0xcb, 0x75, 0x94, 0x33, 0xf0, 0x63, 0xdc, 0x5d, 0x87, 0x91, 0x0f, 0x28, 0xf1, 0xf3, 0xa2, 0x9c, 0x8d, 0xbc, 0x0b, 0xab, 0x59, 0x72, 0x31, 0xbc, 0xf1, 0x19, 0xac, 0x99, 0x78, 0x42, 0x9e, 0xe2, 0x97, 0x65, 0xdd, 0x83, 0x6e, 0x9e, 0x41, 0xc2, 0x3c, 0x81, 0x0e, 0xa8, 0x4d, 0xa3, 0xf0, 0x7c, 0xcc, 0x6f, 0xea, 0x0c, 0xe4, 0x41, 0x28, 0xf8, 0xa0, 0x36, 0x54, 0x5d, 0x5f, 0x12, 0x55, 0x5d, 0xdf, 0xf8, 0x0c, 0x1a, 0xf1, 0x11, 0x84, 0x36, 0x93, 0x50, 0xa5, 0xfa, 0x82, 0x73, 0x2a, 0x0e, 0x62, 0x1e, 0xe6, 0xbc, 0xb5, 0x1c, 0x69, 0x13, 0x20, 0xf6, 0x33, 0xea, 0xdc, 0x43, 0x79, 0x7e, 0xa6, 0x86, 0x65, 0xfc, 0x5d, 0xca, 0xe9, 0x68, 0x22, 0x3b, 0xb1, 0xc8, 0x4e, 0xca, 0x09, 0x55, 0xcf, 0xe3, 0x84, 0xee, 0xc0, 0x5c, 0x48, 0x6d, 0x2a, 0xdc, 0x60, 0x5b, 0x9b, 0x5c, 0x7a, 0x48, 0x6c, 0x0a, 0x34, 0x74, 0x15, 0x60, 0x18, 0x60, 0x9b, 0x62, 0xc7, 0xb2, 0x85, 0x7f, 0xac, 0x99, 0x0d, 0x09, 0xe9, 0x53, 0x74, 0x0f, 0x16, 0x54, 0xdc, 0x31, 0xc7, 0xc5, 0xd8, 0x28, 0x60, 0x98, 0x5a, 0x7d, 0x53, 0x11, 0x24, 0x7b, 0x7a, 0x7e, 0xfa, 0x9e, 0x96, 0x74, 0x02, 0x59, 0x73, 0x4b, 0x0b, 0xa5, 0x6e, 0x49, 0x50, 0x9c, 0xc5, 0x2d, 0xd5, 0x4b, 0xdd, 0x92, 0xe4, 0x31, 0xd5, 0x2d, 0xfd, 0x21, 0x1d, 0xcc, 0x63, 0xe8, 0xe6, 0x37, 0x88, 0x74, 0x0c, 0xef, 0xc0, 0x7c, 0xc8, 0x21, 0x53, 0x9c, 0x8c, 0x24, 0x91, 0x88, 0xc6, 0x03, 0x58, 0xc9, 0x58, 0x80, 0x08, 0xfb, 0x62, 0x7b, 0xa9, 0x9c, 0xc9, 0x5e, 0x8c, 0xff, 0xab, 0xe8, 0xd6, 0xfb, 0xc0, 0x1d, 0x53, 0x1c, 0xe4, 0xac, 0xf7, 0x5d, 0xc5, 0x54, 0x98, 0xee, 0xd5, 0x32, 0xa6, 0x22, 0x22, 0x93, 0x96, 0x38, 0x80, 0x36, 0xd7, 0xa1, 0x15, 0xe2, 0x31, 0x3f, 0x10, 0x65, 0x28, 0xf2, 0xe3, 0x02, 0x6a, 0x31, 0xae, 0x30, 0x80, 0x81, 0x44, 0x17, 0xea, 0x6b, 0x8d, 0x75, 0x58, 0xef, 0x3e, 0xa0, 0x3c, 0xd2, 0xb9, 0xf4, 0xf0, 0x25, 0xdb, 0xfb, 0x2c, 0x93, 0x28, 0xf0, 0xf4, 0xc7, 0x5c, 0x8c, 0x29, 0x4a, 0x10, 0x72, 0x9a, 0x12, 0xd1, 0xf8, 0xdb, 0x1a, 0x40, 0xd2, 0xf9, 0xca, 0x6e, 0xfa, 0x0f, 0xe2, 0x2d, 0x28, 0xa2, 0x89, 0xd7, 0x0a, 0xf8, 0x15, 0x6e, 0xbe, 0x07, 0xe9, 0xcd, 0x27, 0xe2, 0x8a, 0x37, 0x8a, 0xa8, 0x5f, 0xd9, 0x6d, 0xb7, 0x05, 0xab, 0x59, 0x75, 0xcb, 0x4d, 0x77, 0x13, 0xe6, 0x5c, 0x8a, 0x27, 0x22, 0x2f, 0xd6, 0x93, 0x0b, 0x0d, 0x57, 0x60, 0x18, 0xaf, 0x43, 0x63, 0x77, 0x62, 0x8f, 0xf0, 0xc0, 0xc7, 0x43, 0x36, 0x96, 0xcb, 0x1a, 0x72, 0x7c, 0xd1, 0x30, 0x36, 0xa1, 0xfe, 0x10, 0x9f, 0x8a, 0x3d, 0x78, 0x46, 0xf9, 0x8c, 0x7f, 0xa9, 0xc0, 0x1a, 0xf7, 0x9d, 0x5b, 0x2a, 0x2b, 0x35, 0x71, 0x48, 0xa2, 0x60, 0x88, 0x43, 0xae, 0x52, 0x3f, 0xb2, 0x7c, 0x1c, 0xb8, 0xc4, 0x91, 0x39, 0x5c, 0x63, 0xe8, 0x47, 0x07, 0x1c, 0xc0, 0x32, 0x57, 0xd6, 0xfd, 0xab, 0x88, 0x48, 0xdb, 0xaa, 0x99, 0xf5, 0xa1, 0x1f, 0xfd, 0x94, 0xb5, 0x15, 0x6d, 0x78, 0x62, 0x07, 0x38, 0xe4, 0x36, 0x24, 0x68, 0x07, 0x1c, 0x80, 0xde, 0x81, 0x8b, 0x13, 0x3c, 0x21, 0xc1, 0xa9, 0x35, 0x76, 0x27, 0x2e, 0xb5, 0x5c, 0xcf, 0x3a, 0x3a, 0xa5, 0x38, 0x94, 0x86, 0x83, 0x44, 0xe7, 0x23, 0xd6, 0xb7, 0xeb, 0x7d, 0xce, 0x7a, 0x90, 0x01, 0x2d, 0x42, 0x26, 0x56, 0x38, 0x24, 0x01, 0xb6, 0x6c, 0xe7, 0x6b, 0x7e, 0x78, 0xd4, 0xcc, 0x26, 0x21, 0x93, 0x01, 0x83, 0xf5, 0x9d, 0xaf, 0x0d, 0x1b, 0x5a, 0xa9, 0x9c, 0x8e, 0xc5, 0xfa, 0x3c, 0x79, 0x93, 0xb1, 0x3e, 0xfb, 0x66, 0xb0, 0x80, 0x8c, 0xd5, 0x3a, 0xf0, 0x6f, 0x06, 0xa3, 0xa7, 0xbe, 0x0a, 0xf4, 0xf9, 0x37, 0x5b, 0xb0, 0x31, 0x7e, 0x2a, 0xd3, 0xea, 0x86, 0x29, 0x1a, 0x86, 0x03, 0xb0, 0x65, 0xfb, 0xf6, 0x91, 0x3b, 0x76, 0xe9, 0x29, 0xba, 0x09, 0x1d, 0xdb, 0x71, 0xac, 0xa1, 0x82, 0xb8, 0x58, 0xd5, 0x38, 0x96, 0x6c, 0xc7, 0xd9, 0xd2, 0xc0, 0xe8, 0x47, 0xb0, 0xec, 0x04, 0xc4, 0x4f, 0xe3, 0x8a, 0xa2, 0x47, 0x87, 0x75, 0xe8, 0xc8, 0xc6, 0x5f, 0xcf, 0xc2, 0xd5, 0xb4, 0x5a, 0xb2, 0x59, 0xf2, 0x07, 0xb0, 0x98, 0x19, 0x35, 0x9d, 0x9e, 0x26, 0x42, 0x9a, 0x29, 0xc4, 0x4c, 0x1e, 0x59, 0xcd, 0xe6, 0x91, 0xc5, 0xe9, 0x77, 0xed, 0x87, 0x48, 0xbf, 0x67, 0xbf, 0x4f, 0xfa, 0x3d, 0x77, 0xa6, 0xf4, 0xfb, 0x4d, 0x5e, 0xd0, 0x52, 0x44, 0x3c, 0x6d, 0x9a, 0x17, 0x55, 0x97, 0x18, 0xc7, 0x53, 0x85, 0xaf, 0x4c, 0x9a, 0xbe, 0x70, 0x9e, 0x34, 0xbd, 0x5e, 0x9a, 0xa6, 0x33, 0x8b, 0xf0, 0x7d, 0x3b, 0x98, 0x90, 0xc0, 0xf2, 0x03, 0x72, 0xec, 0x8e, 0x71, 0xb7, 0xc1, 0x45, 0x58, 0x52, 0xf0, 0x03, 0x01, 0x46, 0x77, 0x61, 0x25, 0xc4, 0xc3, 0x21, 0x99, 0xf8, 0x0a, 0x53, 0x54, 0x81, 0x80, 0xa3, 0x23, 0xd9, 0x27, 0xb1, 0x0f, 0x6c, 0x7a, 0x62, 0xfc, 0x7d, 0x05, 0x56, 0xd2, 0x66, 0x21, 0x73, 0xb6, 0x4f, 0xa1, 0x11, 0xa8, 0x7d, 0x2b, 0x4d, 0x61, 0x23, 0x1d, 0x1b, 0xe5, 0xf7, 0xb7, 0x99, 0x90, 0xa0, 0x9f, 0x96, 0x66, 0xff, 0x6f, 0x96, 0xb0, 0x79, 0x51, 0xfe, 0x6f, 0xf4, 0x61, 0x39, 0x46, 0x9e, 0x9a, 0x7b, 0x6b, 0xb9, 0x74, 0x35, 0x9d, 0x4b, 0x7b, 0x30, 0xbf, 0x8d, 0x9f, 0xba, 0x43, 0xfc, 0x83, 0x14, 0xd3, 0x36, 0xa0, 0xe9, 0xe3, 0x60, 0xe2, 0x86, 0x61, 0x6c, 0xd2, 0x0d, 0x53, 0x07, 0x19, 0xff, 0x35, 0x07, 0x4b, 0xd9, 0x95, 0x7d, 0x3f, 0x97, 0xba, 0xf7, 0x92, 0x3d, 0x96, 0x9d, 0x9f, 0x76, 0x7e, 0xde, 0x50, 0x2e, 0xba, 0x9a, 0x89, 0xe0, 0x63, 0x2f, 0x2e, 0xdd, 0x36, 0x9b, 0xff, 0x90, 0x4c, 0x26, 0xb6, 0xe7, 0xa8, 0x42, 0xa7, 0x6c, 0xb2, 0xd5, 0xb2, 0x83, 0x11, 0xdb, 0x38, 0x0c, 0xcc, 0xbf, 0xd1, 0x6b, 0xd0, 0x64, 0x91, 0xb0, 0xeb, 0xf1, 0xcc, 0x9f, 0x6f, 0x8b, 0x86, 0x09, 0x12, 0xb4, 0xed, 0x06, 0xe8, 0x3a, 0xcc, 0x62, 0xef, 0xa9, 0x3a, 0x29, 0x93, 0x4a, 0xa8, 0x3a, 0x1a, 0x4c, 0xde, 0x8d, 0xde, 0x84, 0xf9, 0x09, 0x89, 0x3c, 0xaa, 0x62, 0xe2, 0x76, 0x8c, 0xc8, 0xcb, 0x97, 0xa6, 0xec, 0x45, 0x37, 0x61, 0xc1, 0xe1, 0x3a, 0x50, 0x81, 0xef, 0x52, 0x52, 0x3d, 0xe0, 0x70, 0x53, 0xf5, 0xa3, 0x8f, 0xe3, 0x33, 0xbe, 0x91, 0x39, 0xa5, 0x33, 0x8b, 0x5a, 0x78, 0xd0, 0x3f, 0x4c, 0x1f, 0xf4, 0xc0, 0x59, 0xdc, 0x2c, 0x65, 0x31, 0x3d, 0xf7, 0xbf, 0x04, 0xf5, 0x31, 0x19, 0x09, 0x3b, 0x68, 0x8a, 0xb2, 0xf8, 0x98, 0x8c, 0xb8, 0x19, 0xac, 0xb0, 0xc0, 0xc6, 0x71, 0xbd, 0xee, 0x22, 0xdf, 0xf0, 0xa2, 0xc1, 0xce, 0x2b, 0xfe, 0x61, 0x11, 0x6f, 0x88, 0xbb, 0x2d, 0xde, 0xd5, 0xe0, 0x90, 0x7d, 0x6f, 0xc8, 0x8f, 0x53, 0x4a, 0x4f, 0xbb, 0x6d, 0x0e, 0x67, 0x9f, 0x2c, 0x1e, 0x15, 0x99, 0xc8, 0x52, 0x26, 0x1e, 0x2d, 0xda, 0x9f, 0xaf, 0x40, 0x71, 0xe1, 0x1f, 0x2b, 0xb0, 0xba, 0xc5, 0xc3, 0x31, 0xcd, 0x13, 0x9c, 0x23, 0x39, 0x46, 0x77, 0xe3, 0x2a, 0x44, 0x36, 0xc7, 0xcd, 0x4e, 0x56, 0xe2, 0xa1, 0xfb, 0xd0, 0x56, 0x3c, 0x25, 0x65, 0xed, 0x45, 0xf5, 0x8b, 0x56, 0xa8, 0x37, 0x8d, 0x8f, 0x61, 0x2d, 0x27, 0xb3, 0x0c, 0x9d, 0x5e, 0x87, 0xc5, 0xc4, 0x23, 0xc4, 0x22, 0x37, 0x63, 0xd8, 0xae, 0x63, 0xdc, 0x83, 0x8b, 0x03, 0x6a, 0x07, 0x34, 0x37, 0xe1, 0x33, 0xd0, 0xf2, 0x12, 0x46, 0x9a, 0x56, 0x56, 0x19, 0x06, 0xb0, 0x32, 0xa0, 0xc4, 0x7f, 0x09, 0xa6, 0x6c, 0xa7, 0xb3, 0x69, 0x93, 0x88, 0xca, 0x78, 0x49, 0x35, 0x8d, 0x35, 0x51, 0x70, 0xc9, 0x8f, 0xf6, 0x11, 0xac, 0x8a, 0x7a, 0xc7, 0xcb, 0x4c, 0xe2, 0x92, 0xaa, 0xb6, 0xe4, 0xf9, 0x6e, 0xc3, 0x85, 0xc4, 0x95, 0x27, 0xa9, 0xdb, 0xed, 0x74, 0xea, 0xb6, 0x96, 0xd7, 0x71, 0x2a, 0x73, 0xfb, 0xab, 0xaa, 0xe6, 0x30, 0x4b, 0x12, 0xb7, 0xcd, 0x74, 0xe2, 0x76, 0xa5, 0x84, 0x65, 0x2a, 0x6f, 0xcb, 0x5b, 0x64, 0xad, 0xc0, 0x22, 0xcd, 0x5c, 0x76, 0x37, 0x9b, 0x29, 0x34, 0x67, 0x64, 0xfb, 0xbd, 0x24, 0x77, 0xbb, 0x22, 0xb9, 0x8b, 0x87, 0x8e, 0x6b, 0x50, 0x77, 0x33, 0xc9, 0x5d, 0xb7, 0x4c, 0xcc, 0x38, 0xb7, 0xfb, 0xcb, 0x59, 0x68, 0xc4, 0x7d, 0xb9, 0x85, 0xcd, 0x2f, 0x52, 0xb5, 0x60, 0x91, 0xf4, 0xf3, 0xab, 0xf6, 0x32, 0xe7, 0xd7, 0xec, 0x8b, 0xce, 0xaf, 0xcb, 0xd0, 0xe0, 0x1f, 0x56, 0x80, 0x8f, 0xe5, 0x79, 0x54, 0xe7, 0x00, 0x13, 0x1f, 0x27, 0x06, 0x35, 0x7f, 0x16, 0x83, 0xca, 0x64, 0x91, 0x0b, 0xd9, 0x2c, 0xf2, 0xfd, 0xf8, 0x84, 0x11, 0x67, 0xd1, 0x7a, 0x9e, 0x5d, 0xe1, 0xd9, 0xb2, 0x93, 0x3e, 0x5b, 0xc4, 0xf1, 0x74, 0xad, 0x80, 0xf8, 0x95, 0xcd, 0x21, 0x1f, 0x89, 0x1c, 0x52, 0xb7, 0x2a, 0xe9, 0x08, 0x37, 0x01, 0xe2, 0x3d, 0xaf, 0x12, 0x49, 0x94, 0x9f, 0x9a, 0xa9, 0x61, 0x31, 0xaf, 0x92, 0x5a, 0xff, 0xa4, 0x50, 0x7a, 0x06, 0xaf, 0xf2, 0xcf, 0x7a, 0x94, 0x54, 0x52, 0x6b, 0x7c, 0x3f, 0x57, 0x76, 0x38, 0x9b, 0xd5, 0xdd, 0x4e, 0x57, 0x1d, 0xce, 0x67, 0x2e, 0xb9, 0xa2, 0x03, 0x3f, 0xd4, 0xed, 0x40, 0x76, 0x8b, 0x7c, 0xb1, 0x21, 0x21, 0x7d, 0xca, 0x42, 0xa9, 0x63, 0xd7, 0x73, 0xc3, 0x13, 0xd1, 0x3f, 0xcf, 0xfb, 0x41, 0x81, 0xfa, 0xfc, 0x0a, 0x18, 0x3f, 0x73, 0xa9, 0x35, 0x24, 0x0e, 0xe6, 0xc6, 0x38, 0x67, 0xd6, 0x19, 0x60, 0x8b, 0x38, 0x38, 0xd9, 0x20, 0xf5, 0x73, 0x6d, 0x90, 0x46, 0x66, 0x83, 0xac, 0xc2, 0x7c, 0x80, 0xed, 0x90, 0x78, 0x32, 0xec, 0x97, 0x2d, 0x76, 0x56, 0x4c, 0x70, 0x18, 0xb2, 0x01, 0x64, 0x00, 0x23, 0x9b, 0x5a, 0x98, 0xb5, 0x58, 0x16, 0x66, 0x4d, 0x29, 0x66, 0x66, 0xc2, 0xac, 0x56, 0x59, 0x98, 0x75, 0x96, 0x5a, 0xa6, 0x16, 0x44, 0xb6, 0xa7, 0x06, 0x91, 0x7a, 0x38, 0xb6, 0x94, 0x0a, 0xc7, 0xfe, 0x90, 0x7b, 0xea, 0x21, 0xac, 0xe5, 0x76, 0x81, 0xdc, 0x54, 0x77, 0x33, 0xd5, 0xd0, 0x6e, 0xd9, 0x02, 0xc5, 0xc5, 0xd0, 0x3f, 0x85, 0xa5, 0x9d, 0x67, 0x78, 0x38, 0x38, 0xf5, 0x86, 0xe7, 0x88, 0x08, 0x3a, 0x50, 0x1b, 0x4e, 0x1c, 0x59, 0x06, 0x60, 0x9f, 0x7a, 0x8c, 0x50, 0x4b, 0xc7, 0x08, 0x16, 0x74, 0x92, 0x11, 0xa4, 0x9c, 0xab, 0x4c, 0x4e, 0x87, 0x21, 0x33, 0xe6, 0x8b, 0xa6, 0x6c, 0x49, 0x38, 0x0e, 0x02, 0x3e, 0x6b, 0x01, 0xc7, 0x41, 0x90, 0xb6, 0xe8, 0x5a, 0xda, 0xa2, 0x8d, 0xaf, 0xa1, 0xc9, 0x06, 0xf8, 0x5e, 0xe2, 0xcb, 0x40, 0xb9, 0x96, 0x04, 0xca, 0x71, 0xbc, 0x3d, 0xab, 0xc5, 0xdb, 0xc6, 0x06, 0x2c, 0x8a, 0xb1, 0xe4, 0x44, 0x3a, 0x50, 0x8b, 0x82, 0xb1, 0xd2, 0x5b, 0x14, 0x8c, 0x8d, 0x3f, 0x86, 0x56, 0x9f, 0x52, 0x7b, 0x78, 0x72, 0x0e, 0x79, 0xe2, 0xb1, 0xaa, 0x7a, 0x6c, 0x9f, 0x93, 0xc9, 0x30, 0xa0, 0xad, 0x78, 0x97, 0x8e, 0xbf, 0x07, 0xe8, 0x80, 0x04, 0xf4, 0x01, 0x09, 0xbe, 0xb5, 0x03, 0xe7, 0x7c, 0xb1, 0x32, 0x82, 0x59, 0xf9, 0xb0, 0xa4, 0x76, 0x63, 0xce, 0xe4, 0xdf, 0xc6, 0x5b, 0x70, 0x21, 0xc5, 0xaf, 0x74, 0xe0, 0x0f, 0xa0, 0xc9, 0x5d, 0x88, 0x8c, 0xa7, 0x6e, 0xe8, 0xb5, 0xbe, 0x69, 0x7e, 0x86, 0x65, 0xdc, 0xec, 0x8c, 0xe0, 0xf0, 0xd8, 0xa1, 0xff, 0x38, 0x13, 0x75, 0xac, 0xa4, 0xe9, 0x33, 0x11, 0xc7, 0x3f, 0x54, 0x60, 0x8e, 0xc3, 0x73, 0x1e, 0xfd, 0x32, 0x34, 0x02, 0xec, 0x13, 0x8b, 0xda, 0xa3, 0xf8, 0xad, 0x0e, 0x03, 0x3c, 0xb1, 0x47, 0x21, 0x7f, 0x6a, 0xc4, 0x3a, 0x1d, 0x77, 0x84, 0x43, 0xaa, 0x1e, 0xec, 0x34, 0x19, 0x6c, 0x5b, 0x80, 0xd8, 0x92, 0x84, 0xee, 0x9f, 0x89, 0x70, 0x62, 0xd6, 0xe4, 0xdf, 0xe8, 0xba, 0xb8, 0x75, 0x9f, 0x52, 0xda, 0xe1, 0x57, 0xf1, 0x3d, 0xa8, 0x67, 0xaa, 0x39, 0x71, 0xdb, 0xf8, 0x18, 0x90, 0x3e, 0x67, 0xb9, 0xa8, 0x6f, 0xc2, 0x3c, 0x5f, 0x12, 0x75, 0x1e, 0xb6, 0xd3, 0x93, 0x36, 0x65, 0xaf, 0xf1, 0x29, 0x20, 0xb1, 0x8a, 0xa9, 0x33, 0xf0, 0xec, 0x2b, 0xfe, 0x11, 0x5c, 0x48, 0xd1, 0xc7, 0x97, 0xac, 0x29, 0x06, 0xd9, 0xd1, 0x25, 0xf1, 0xbf, 0x56, 0x00, 0xfa, 0x11, 0x3d, 0x91, 0x85, 0x06, 0x7d, 0x96, 0x95, 0xf4, 0x2c, 0x59, 0x9f, 0x6f, 0x87, 0xe1, 0xb7, 0x24, 0x50, 0x41, 0x5e, 0xdc, 0xe6, 0x45, 0x82, 0x88, 0x9e, 0xa8, 0xd2, 0x25, 0xfb, 0x46, 0xd7, 0xa1, 0x2d, 0x9e, 0x58, 0x59, 0xb6, 0xe3, 0x04, 0x38, 0x0c, 0x65, 0x0d, 0xb3, 0x25, 0xa0, 0x7d, 0x01, 0x64, 0x68, 0xae, 0x83, 0x3d, 0xea, 0xd2, 0x53, 0x8b, 0x92, 0x6f, 0xb0, 0x27, 0xc3, 0xb7, 0x96, 0x82, 0x3e, 0x61, 0x40, 0x86, 0x16, 0xe0, 0x91, 0x1b, 0xd2, 0x40, 0xa1, 0xa9, 0x9a, 0x9a, 0x84, 0x72, 0x34, 0xe3, 0xd7, 0x15, 0xe8, 0x1c, 0x44, 0xe3, 0xb1, 0x98, 0xe4, 0x79, 0xd7, 0x12, 0xbd, 0x25, 0xe7, 0x51, 0xcd, 0x58, 0x43, 0xb2, 0x44, 0x72, 0x72, 0xdf, 0x3f, 0xad, 0xbc, 0x0b, 0xcb, 0x9a, 0xa0, 0x52, 0x69, 0xa9, 0x53, 0xba, 0x92, 0x3e, 0xa5, 0x99, 0xa1, 0x88, 0x4c, 0xea, 0xe5, 0x26, 0x67, 0x5c, 0x84, 0x0b, 0x29, 0x7a, 0x99, 0x85, 0xdd, 0x82, 0x96, 0xbc, 0xe8, 0x94, 0x46, 0x70, 0x09, 0xea, 0xcc, 0xbd, 0x0c, 0x5d, 0x47, 0xd5, 0xac, 0x17, 0x7c, 0xe2, 0x6c, 0xb9, 0x4e, 0x60, 0xec, 0x41, 0xcb, 0x14, 0xec, 0x25, 0xee, 0x27, 0xd0, 0x96, 0xd7, 0xa2, 0x56, 0xea, 0x79, 0x40, 0x52, 0x60, 0x4d, 0xf1, 0x36, 0x5b, 0x9e, 0xde, 0x34, 0x7e, 0x09, 0xbd, 0x43, 0xdf, 0x61, 0xc1, 0x94, 0xce, 0x55, 0x4d, 0xed, 0x13, 0x50, 0x4f, 0x00, 0xcb, 0x98, 0xa7, 0xc9, 0x5a, 0x81, 0xde, 0x34, 0xae, 0xc2, 0xe5, 0x42, 0xe6, 0x72, 0xde, 0x3e, 0x74, 0x92, 0x0e, 0xc7, 0x55, 0xa5, 0x7a, 0x5e, 0x82, 0xaf, 0x68, 0x25, 0xf8, 0xd5, 0xf8, 0x18, 0x16, 0x0e, 0x5d, 0xb6, 0xb4, 0xa0, 0xa9, 0x56, 0x16, 0x34, 0xcd, 0xa6, 0x82, 0x26, 0xe3, 0xcb, 0x78, 0xf5, 0x64, 0xc4, 0xfa, 0x21, 0x0f, 0x9b, 0xc5, 0xd8, 0xca, 0x4d, 0x5c, 0x2a, 0x98, 0x9c, 0xc0, 0x30, 0x35, 0x64, 0x63, 0x09, 0x5a, 0x29, 0x87, 0x61, 0xdc, 0x87, 0x76, 0xc6, 0x03, 0xdc, 0xc9, 0xc4, 0x0f, 0xb9, 0x65, 0xcb, 0x44, 0x0f, 0x2b, 0xd2, 0x11, 0x3d, 0x08, 0x77, 0xbd, 0x63, 0xa2, 0xf8, 0x5e, 0x83, 0xe6, 0x61, 0xd9, 0x73, 0xba, 0x59, 0x75, 0x83, 0xf3, 0x16, 0x2c, 0x0f, 0x28, 0x09, 0xec, 0x11, 0xde, 0xe5, 0xbb, 0xf6, 0xd8, 0x15, 0x77, 0x1c, 0x51, 0x14, 0xfb, 0x6f, 0xfe, 0x6d, 0xfc, 0x47, 0x05, 0x96, 0x1e, 0xb8, 0x63, 0x1c, 0x9e, 0x86, 0x14, 0x4f, 0x0e, 0x79, 0x2c, 0x79, 0x05, 0x1a, 0x4c, 0x9a, 0x90, 0xda, 0x13, 0x5f, 0xdd, 0xf0, 0xc4, 0x00, 0xb6, 0x46, 0xa1, 0x60, 0xad, 0xb2, 0x4b, 0x3d, 0x8e, 0xcf, 0x8d, 0xca, 0x62, 0x6b, 0x09, 0x42, 0xef, 0x02, 0x44, 0x21, 0x76, 0xe4, 0xad, 0x4e, 0x2d, 0x73, 0xf4, 0x1c, 0xea, 0xd5, 0x7b, 0x86, 0x27, 0xae, 0x78, 0xde, 0x83, 0xa6, 0xeb, 0x11, 0x07, 0xf3, 0xea, 0xbd, 0x23, 0x33, 0xcf, 0x62, 0x2a, 0x10, 0x88, 0x87, 0x21, 0x76, 0x8c, 0x3f, 0x91, 0x5e, 0x58, 0x2d, 0x9e, 0xd4, 0xc1, 0x0e, 0x2c, 0x8b, 0x0d, 0x7d, 0x1c, 0x4f, 0x5a, 0x29, 0x3a, 0x09, 0xe7, 0x32, 0x0b, 0x62, 0x76, 0x5c, 0x79, 0x2a, 0x2a, 0x0a, 0xe3, 0x1e, 0x5c, 0x4c, 0xc5, 0x7c, 0xe7, 0x49, 0x95, 0xbe, 0xc8, 0xe4, 0x59, 0x89, 0x81, 0xc8, 0x44, 0x47, 0xd9, 0x47, 0x49, 0xa2, 0x13, 0x8a, 0x44, 0x27, 0x34, 0x4c, 0xb8, 0x94, 0x4a, 0xff, 0x52, 0x82, 0xbc, 0x97, 0x39, 0xe2, 0xaf, 0x96, 0x30, 0xcb, 0x9c, 0xf5, 0xff, 0x53, 0x81, 0x95, 0x22, 0x84, 0x97, 0x2c, 0x34, 0xfc, 0xac, 0xe4, 0xae, 0xfd, 0xee, 0x54, 0x69, 0x7e, 0x2f, 0x25, 0x99, 0x87, 0xd0, 0x2b, 0x5a, 0xbd, 0xbc, 0x2a, 0x6a, 0x67, 0x50, 0xc5, 0xff, 0x56, 0xb5, 0xd2, 0x59, 0x9f, 0xd2, 0xc0, 0x3d, 0x8a, 0x98, 0xf1, 0xfe, 0x50, 0x29, 0xf0, 0xfd, 0x38, 0xbd, 0x13, 0xeb, 0x77, 0x23, 0x4f, 0x95, 0x8c, 0x5a, 0x98, 0xe2, 0xed, 0xa7, 0x53, 0x3c, 0x51, 0x14, 0xbb, 0x3d, 0x95, 0xcd, 0x2b, 0x5b, 0xf7, 0x78, 0x5e, 0x81, 0x76, 0x5a, 0x0f, 0xe8, 0x63, 0x00, 0x3b, 0x96, 0x5c, 0x9a, 0xfc, 0x95, 0x69, 0xb3, 0x33, 0x35, 0x7c, 0x74, 0x0d, 0x6a, 0x43, 0x3f, 0x92, 0x1a, 0x49, 0x6e, 0x47, 0xb6, 0xfc, 0x48, 0x38, 0x00, 0xd6, 0xcb, 0x82, 0x66, 0x71, 0x03, 0x9d, 0xf3, 0x5c, 0x8f, 0x39, 0x58, 0xa0, 0x4a, 0x1c, 0xf4, 0x19, 0xb4, 0xbf, 0x0d, 0x5c, 0x6a, 0x1f, 0x8d, 0xb1, 0x35, 0xb6, 0x4f, 0x71, 0x20, 0x3d, 0x57, 0xb9, 0x97, 0x69, 0x29, 0xfc, 0x47, 0x0c, 0xdd, 0x88, 0xa0, 0xae, 0xc6, 0x7f, 0x81, 0x47, 0x7e, 0x08, 0x6b, 0x11, 0x43, 0xb3, 0xf8, 0x2d, 0xb8, 0x67, 0x7b, 0xc4, 0x0a, 0x31, 0x3b, 0x9a, 0xd4, 0xcb, 0xb3, 0x62, 0x6f, 0xb9, 0xc2, 0x89, 0xb6, 0x48, 0x80, 0xf7, 0x6c, 0x8f, 0x0c, 0x04, 0x85, 0x31, 0x81, 0xa6, 0x36, 0x9d, 0x17, 0x8c, 0x7c, 0x1f, 0x96, 0xd5, 0xbd, 0x53, 0x88, 0xa9, 0xf4, 0xeb, 0xd3, 0xc6, 0x5c, 0x92, 0xe8, 0x03, 0x4c, 0xb9, 0x77, 0xbf, 0x75, 0x05, 0xea, 0xea, 0x35, 0x3e, 0x5a, 0x80, 0xda, 0x93, 0xad, 0x83, 0xce, 0x0c, 0xfb, 0x38, 0xdc, 0x3e, 0xe8, 0x54, 0x6e, 0xdd, 0x83, 0xa5, 0xcc, 0xcb, 0x12, 0xb4, 0x0c, 0xad, 0x41, 0x7f, 0x6f, 0xfb, 0xf3, 0xfd, 0x9f, 0x5b, 0xe6, 0x4e, 0x7f, 0xfb, 0x17, 0x9d, 0x19, 0xb4, 0x02, 0x1d, 0x05, 0xda, 0xdb, 0x7f, 0x22, 0xa0, 0x95, 0x5b, 0xdf, 0x64, 0x6c, 0x04, 0xa3, 0x8b, 0xb0, 0xbc, 0xb5, 0xbf, 0xf7, 0xa4, 0xbf, 0xbb, 0xb7, 0x63, 0x5a, 0x5b, 0xe6, 0x4e, 0xff, 0xc9, 0xce, 0x76, 0x67, 0x26, 0x0d, 0x36, 0x0f, 0xf7, 0xf6, 0x76, 0xf7, 0xbe, 0xe8, 0x54, 0x18, 0xd7, 0x04, 0xbc, 0xf3, 0xf3, 0x5d, 0x86, 0x5c, 0x4d, 0x23, 0x1f, 0xee, 0x3d, 0xdc, 0xdb, 0xff, 0xd9, 0x5e, 0xa7, 0xb6, 0xf9, 0xdb, 0x45, 0x68, 0xab, 0x43, 0x1c, 0x07, 0xfc, 0x76, 0xf2, 0x53, 0x58, 0x50, 0x3f, 0x4a, 0x24, 0xde, 0x23, 0xfd, 0x57, 0x47, 0xaf, 0x9b, 0xef, 0x90, 0xc1, 0xd0, 0x0c, 0x3a, 0xe0, 0xc1, 0x89, 0xf6, 0x8a, 0xe7, 0xaa, 0x1e, 0x2e, 0xe4, 0x9e, 0x09, 0xf5, 0xd6, 0xcb, 0xba, 0x63, 0x8e, 0x03, 0x16, 0x91, 0xe8, 0x2f, 0x30, 0xd1, 0xba, 0x7e, 0x6e, 0xe7, 0x5f, 0x76, 0xf6, 0x5e, 0x2b, 0xed, 0x8f, 0x99, 0xfe, 0x02, 0x3a, 0xd9, 0xb7, 0x97, 0x28, 0xb9, 0x65, 0x2e, 0x79, 0xd7, 0xd9, 0x7b, 0x7d, 0x0a, 0x86, 0xce, 0x3a, 0xf7, 0x7e, 0x71, 0xa3, 0xfc, 0x05, 0x5a, 0x8e, 0x75, 0xd9, 0xb3, 0x36, 0xb1, 0x14, 0xe9, 0xd7, 0x37, 0x48, 0x7f, 0x35, 0x58, 0xf0, 0x0a, 0x4b, 0x5b, 0x8a, 0xe2, 0x67, 0x3b, 0xc6, 0x0c, 0xfa, 0x0a, 0x96, 0x32, 0x17, 0x53, 0x28, 0xa1, 0x2a, 0xbe, 0x66, 0xeb, 0x6d, 0x94, 0x23, 0xa4, 0xf5, 0xa6, 0x5f, 0x3b, 0xa5, 0xf4, 0x56, 0x70, 0x97, 0x95, 0xd2, 0x5b, 0xe1, 0x7d, 0x15, 0x37, 0xaf, 0xd4, 0xe5, 0x92, 0x66, 0x5e, 0x45, 0x37, 0x59, 0xbd, 0xf5, 0xb2, 0x6e, 0x7d, 0xfa, 0x99, 0x8b, 0x25, 0x6d, 0xfa, 0xc5, 0xf7, 0x55, 0xbd, 0x8d, 0x72, 0x84, 0xac, 0xae, 0x92, 0x2a, 0x77, 0x46, 0x57, 0xb9, 0x4b, 0x95, 0x8c, 0xae, 0xf2, 0xe5, 0x71, 0xa9, 0xab, 0x4c, 0xb9, 0xfa, 0xb5, 0xd2, 0x72, 0x5e, 0x5e, 0x57, 0xc5, 0x15, 0x42, 0x63, 0x06, 0xf5, 0xa1, 0xae, 0xea, 0x71, 0x28, 0xd9, 0xdd, 0x99, 0x22, 0x60, 0xef, 0x52, 0x41, 0x4f, 0xcc, 0xe2, 0x3d, 0x98, 0x65, 0x50, 0xb4, 0x92, 0x42, 0x52, 0xa4, 0x17, 0x33, 0xd0, 0x98, 0xec, 0x23, 0x98, 0x17, 0xe5, 0x2b, 0x94, 0xe4, 0x15, 0xa9, 0x5a, 0x59, 0x6f, 0x2d, 0x07, 0x8f, 0x89, 0xbf, 0x14, 0x3f, 0x4f, 0xc9, 0x3a, 0x14, 0xba, 0x9c, 0x7a, 0xd6, 0x9f, 0xae, 0x76, 0xf5, 0xae, 0x14, 0x77, 0xea, 0xfa, 0xca, 0x1c, 0xce, 0xeb, 0x65, 0xd1, 0x53, 0x4e, 0x5f, 0xc5, 0xd1, 0x98, 0x31, 0x83, 0x2c, 0x51, 0xd2, 0xc9, 0x30, 0x36, 0x8a, 0x15, 0x9d, 0x62, 0x7e, 0x6d, 0x2a, 0x4e, 0x3c, 0xc0, 0x11, 0x5c, 0x28, 0x48, 0x4e, 0x51, 0x42, 0x5d, 0x9e, 0x17, 0xf7, 0xde, 0x98, 0x8e, 0xa4, 0xab, 0x48, 0xda, 0xda, 0xaa, 0xbe, 0x41, 0x35, 0x13, 0x5b, 0xcb, 0xc1, 0x15, 0xf1, 0xe6, 0x5f, 0xd4, 0x60, 0x51, 0x94, 0x10, 0xe4, 0x01, 0xf3, 0x05, 0x40, 0x52, 0xe5, 0x42, 0xbd, 0xd4, 0x34, 0x53, 0xe5, 0xbe, 0xde, 0xe5, 0xc2, 0x3e, 0x5d, 0xf9, 0x5a, 0xc1, 0x4a, 0x53, 0x7e, 0xbe, 0x0c, 0xa6, 0x29, 0xbf, 0xa0, 0xc6, 0x65, 0xcc, 0xa0, 0x6d, 0x68, 0xc4, 0x55, 0x14, 0xa4, 0x15, 0x5f, 0x32, 0x25, 0xa0, 0x5e, 0xaf, 0xa8, 0x4b, 0x97, 0x48, 0xab, 0x8c, 0x68, 0x12, 0xe5, 0xeb, 0x2d, 0x9a, 0x44, 0x45, 0xc5, 0x94, 0x64, 0x76, 0x22, 0x11, 0xcc, 0xce, 0x2e, 0x95, 0x5b, 0x67, 0x67, 0x97, 0xce, 0x1d, 0x8d, 0x99, 0xcf, 0xaf, 0xfc, 0xe6, 0x77, 0xeb, 0x95, 0xff, 0xfc, 0xdd, 0xfa, 0xcc, 0x9f, 0x3f, 0x5f, 0xaf, 0xfc, 0xe6, 0xf9, 0x7a, 0xe5, 0xdf, 0x9e, 0xaf, 0x57, 0x7e, 0xfb, 0x7c, 0xbd, 0xf2, 0xdd, 0x7f, 0xaf, 0xcf, 0x1c, 0xcd, 0xf3, 0xbf, 0x09, 0xdf, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xef, 0x34, 0xd8, 0x03, 0x01, 0x3a, 0x00, 0x00, </ins> }

It also means that if different runtimes support different feature sets, we'll be stuck either tracking only the common features, or specifying features that may be ignored by the runtime. This may be a non-issue if the seccomp feature set rarely changes.
Well, yes, but that applies to everything in the CRI, and is one of the tradeoffs we ma[d|k]e by introducing this abstraction in the first place.
My $0.02: Moving the existing logic/information for seccomp into a first-class field for CRI (as in ) is productive because of the known problems with the annotation approach. My initial proposal for seccomp support included a resource similar to what has proposed in kubernetes/community and we were unable to come to an agreement on the issue refers to here: I do not necessarily expect that we will be able to come to an agreement about the seccomp resource in time for 1.7, so I think we should proceed with and do backward compatible CRI changes later if we need to inject the content of the seccomp profile instead of the path. I think we would deeply regret embedding API surface to describe seccomp profiles in the Pod API :)


Question: kubectl delete secret test-secret --namespace=test-secrets ### Create a docker-registry secret in a specific namespace <ins> if [[ "${WAIT_FOR_DELETION:-}" == "true" ]]; then kube::test::wait_object_assert 'secrets --namespace=test-secrets' "{{range.items}}{{$id_field}}:{{end}}" '' fi </ins> # Pre-condition: no SECRET exists kube::test::get_object_assert 'secrets --namespace=test-secrets' "{{range.items}}{{$id_field}}:{{end}}" '' # Command

disabled them since was flaky. We need to find and fix the issue and then reenable these tests. cc Related issues: and
Probably should be higher priority so it doesn't get dropped
The issue is that we dont wait for the resource to be deleted unless we are using a reaper: This breaks for federation since we use finalizers. kubectl should wait for the resource to be deleted. We should also set OrphanDependents = false. This will have no effect in kubernetes but will enable cascading deletion in federation. Ref cc Will send a fix.
Sent
Updated to remove the wait (GET) at the end so it no longer fixes this issue. Sent to update the test to include a wait which fixes this issue.


Question: out.Annotations[PodInitContainerStatusesBetaAnnotationKey] = string(value) } <del> // We need to reset certain fields for mirror pods from pre-v1.1 kubelet // (#15960). // TODO: Remove this code after we drop support for v1.0 kubelets. if value, ok := in.Annotations[mirrorAnnotationKey]; ok && value == mirrorAnnotationValue_1_0 { // Reset the TerminationGracePeriodSeconds. out.Spec.TerminationGracePeriodSeconds = nil // Reset the resource requests. for i := range out.Spec.Containers { out.Spec.Containers[i].Resources.Requests = nil } } </del> return nil }

Nodes can't recognize the static pods that they create possibly because the defaulting is different. always returns false. Here is a json diff of two pod specs before and after they are Semenatic.DeepEqual'd where before is created pod and after is what kubelet things the created pod should be. ! Thus: p0 for triage
I think the solution is to not apply defaults to mirror pods in the API Server.
Yes,we have to add specific code to API Server to detect the mirror pod, then not apply defaults.
The right fix should be , which we didn't get to before v1.0. I will start on this and at least get it in for v1.1 to prevent future complications. Since we cannot update the node/kubelet, options are: suggests to disable applying defaults to mirror pods as a temporary fix. IIRC, was against treating mirror pod differently at the apiserver. Since this is only a workaround, perhaps we can relax the constraint? a script to update the pod manifest files.
Disabling defaults has a number of problems: are version-specific. Conversion may fail if defaults are not applied. may fail if defaults are not applied. using defaulted fields assumes default values have been applied. defaulting pass is not the only place where values can be set, as mentioned in . For instance, if the user were to change the kube-system LimitRange, that would cause the same problem. This is another case where would have been useful. Which gives me another idea. For mirror pods, we could capture the entire metadata+spec provided by the user as an annotation, as we do in the client for kubectl apply, and then we could return that in GET. PUT may not work. We'd have to resolve the size concerns raised by . How serious of a problem is this delete-recreate loop?
Ok, we are going with approach proposed in . I am closing this issue as dup of
"entire metadata+spec" in plain text? It'd be hard for kubelet to diff using this. It'd be better to let kubelet store hash of its own choosing so that it can easily compare when there is any change.
Even with , we can't fix v1.0 kubelet.
I agree with
Yes, I were confused.


Question: out.Annotations[PodInitContainerStatusesBetaAnnotationKey] = string(value) } <del> // We need to reset certain fields for mirror pods from pre-v1.1 kubelet // (#15960). // TODO: Remove this code after we drop support for v1.0 kubelets. if value, ok := in.Annotations[mirrorAnnotationKey]; ok && value == mirrorAnnotationValue_1_0 { // Reset the TerminationGracePeriodSeconds. out.Spec.TerminationGracePeriodSeconds = nil // Reset the resource requests. for i := range out.Spec.Containers { out.Spec.Containers[i].Resources.Requests = nil } } </del> return nil }

The comparison is in Kubelet, and we cannot patch 1.0 kubelet in this case.
There are no serious issues with this bug: static pods are running properly, but corresponding mirror pods coming and gone. cc/ Can we treat this as part of GKE cluster upgrade process? Can we upgrade GKE master nodes, then ask the users to upgrade their fluentd yaml file in their cluster? For OSS kubernetes users, most likely they won't run into this issue. But we should document this as known issue for 1.1.
Or can we update the fluentd yaml files when updating the master?
cc/
This is a cc issue, really. But the fast answer is no, because "then ask the users to upgrade their fluentd yaml file in their cluster?" Historically our users are extremely slow to do maintenance.
Our current plan for this issue is just document as a known issue for 1.1 release.
In a 100 node cluster this is going to cause +100 writes +100 deletes per second. Is that extra load a concern?
This would be +100 writes +100 deletes every 10 seconds in a 100-node cluster. We are still discussing options to let user update their manifest files.
Ok, from the logs in the issue description, it looked more frequent but most of the deletes are failing with key not found
's easy to trigger a sync for all pods in kubelet. Any change in any pod would trigger a sync. In this case, the DELETE/ADD of the mirror pod could also trigger another sync. So, yes, it could be worse than 10s... We are looking at patching this in the apiserver, based on suggestion.
Yeah, my suggestion is fixing defaulting/conversion/validation as needed to make exceptions for mirror pods.
I'm not 100% sure it's needed, but if necessary we can turn the defaulting fix on in apiserver, and leave it off in scheduler, so that it gets the defaults it expects.
Yeah, it is way more frequent than 10s. I pointed this out to earlier. We had a meeting with and looks like: Providing a scripts to convert fluentd yaml file and asking the user to run is not a solution. Our users are very slow on such maintenance work. Piggyback such conversion work on master updating might not a solution for GKE clusters.


Question: out.Annotations[PodInitContainerStatusesBetaAnnotationKey] = string(value) } <del> // We need to reset certain fields for mirror pods from pre-v1.1 kubelet // (#15960). // TODO: Remove this code after we drop support for v1.0 kubelets. if value, ok := in.Annotations[mirrorAnnotationKey]; ok && value == mirrorAnnotationValue_1_0 { // Reset the TerminationGracePeriodSeconds. out.Spec.TerminationGracePeriodSeconds = nil // Reset the resource requests. for i := range out.Spec.Containers { out.Spec.Containers[i].Resources.Requests = nil } } </del> return nil }

We do have access to GKE nodes, and we don't do that. To obtain the permission to run script and sync a file requires more work from PM side. This is a API backward compatibility issue anyway. Given today's version management policy, we should handle such compatibility issue. I checked our default code: request diff was introduced by TerminationGracePeriodSeconds was introduced along with graceful termination support. There is no conversion for both fields There is no validation checking both fields today I think it is safe to disable such defaulting for mirror pods shouldn't cause any issue for 1.1 release. Sending PR shortly.
In order to not break the v1.1+ kubelet (which applies newer defaults), we should only skip defaulting for pods from pre-v1.1 kubelets. An easy way to do this is to reuse , which changes the mirror key annotation value from "mirror" to the hash of the pod manifest file. In short, if the key exists, it's a mirror pod. If the value is "mirror", it is sent by a pre-v1.1 kubelet. Otherwise, it's sent by a v1.1+ kubelet. Note that we will also need to maintain the special defaulting case for the future releases until we drop support for v1.0 nodes.
Just this morning, we discussed providing a script/tool to update static pod configs for people with large clusters. Why have we changed that plan? Any hack in apiserver is going to be confusing and fragile. For instance, a LimitRange installed for kube-system would defeat the hack. If we were to add a hack in apiserver, we'd need to remove it in 1.2.
we talked to and the conclusion was that node update may not be feasible as . I agree that any apiserver fix is hacky and fragile, but it seems the most viable option right now. We would need to carry this fix in apiserver as long as GKE supports v1.N master + v1.0 node, unless we can make updating the configs part of the cluster upgrade process.
Ah. These fields are problems because they existed in 1.0, but weren't used nor populated. Entirely new fields are silently dropped during decoding.


Question: out.Annotations[PodInitContainerStatusesBetaAnnotationKey] = string(value) } <del> // We need to reset certain fields for mirror pods from pre-v1.1 kubelet // (#15960). // TODO: Remove this code after we drop support for v1.0 kubelets. if value, ok := in.Annotations[mirrorAnnotationKey]; ok && value == mirrorAnnotationValue_1_0 { // Reset the TerminationGracePeriodSeconds. out.Spec.TerminationGracePeriodSeconds = nil // Reset the resource requests. for i := range out.Spec.Containers { out.Spec.Containers[i].Resources.Requests = nil } } </del> return nil }

We should cherrypick the solution into 1.0.7, since it appears there will be one.
That is, we should cherrypick into the 1.0 branch.
Ref.
If the hack is going to remain indefinitely, I'm not comfortable circumventing defaulting, conversion, and validation.
Just not performing the defaulting for these specific fields on just mirror pods seems safer.
In particular, I could easily imagine a new version of the pod API in 1.2 or 1.3, which will require defaulting and conversion to be applied, in general.
We'll be discussing this soon after 1.1 lands, I expect. My proposal would be for v1.N masters to support v1.N-1 and v1.N-2 (and maybe v1.N-3) nodes. That gives users 6-9 months to lag their nodes behind their masters. But it warrants much further discussion. This isn't a viable solution either, because we can't depend on users updating their nodes to the latest 1.0 rev. We expect arbitrary 1.0 nodes to work, including 1.0.6 all the way back to 1.0.1, per our current .
As Ike noted, cherrypicking into 1.0 kubelets is not feasible for solving this, because the whole reason for the problem is that people aren't updating their nodes. The conversion fix in is much preferable to the defaulting fix: it's less brittle, and components that need the defaulting (e.g. scheduler) will see the defaulting (because they run the conversion stack themselves), but on the wire the mirror pods from old kubelets will remain undefaulted.
I didn't say cherrypicking into 1.0 would solve the problem for everything. The behavior in 1.0 is pretty broken, even when not considering upgrade. We have a fix. We should cherrypick it into 1.0.
I don't see how different components would see different values for these fields, assuming they are all updated to the new code. As discussed offline, the scheduler and node controller need to handle cases of empty requests and pod termination for 1.0 kubelets, anyway, so I think the conversion approach is fine. Please put the explanation in code comments, though, not just in issue/PR comments.


Question: out.Annotations[PodInitContainerStatusesBetaAnnotationKey] = string(value) } <del> // We need to reset certain fields for mirror pods from pre-v1.1 kubelet // (#15960). // TODO: Remove this code after we drop support for v1.0 kubelets. if value, ok := in.Annotations[mirrorAnnotationKey]; ok && value == mirrorAnnotationValue_1_0 { // Reset the TerminationGracePeriodSeconds. out.Spec.TerminationGracePeriodSeconds = nil // Reset the resource requests. for i := range out.Spec.Containers { out.Spec.Containers[i].Resources.Requests = nil } } </del> return nil }

Since the conversion stack does the defaulting at the end and runs in every component, and scheduler, node-controller, etc all consume api.Pod objects (instead of v1.Pod objects), they will have a view of the object with the fields defaulted. The conversion based fix essentially retains the defaulting in *api.Pod objects, but undoes it in any serialized representation of the object. Over the wire the defaulting will not be baked in to the object. Older clients that have not been recompiled (including these kubelets) would see a version of the object without the fields being defaulted.
Defaulting is run first:
Oh, you're right, I somehow had that backwards in my head. Sorry, everyone. I think that tilts me back in favor of . This means that defaulting is part of the versioned structs and therefore changing the defaulting is an API breaking change, which we claimed we wouldn't do. Can we change our minds about the defaulting? How about moving this particular defaulting into conversion functions, which is the intended way of doing something like this?
In , we only reset the defaults when converting api.Pod to v1.Pod. Shouldn't all components still see the defaulting values? Agreed that this is an API breaking change. Perhaps we should not change the defaults at all? mentioned in that scheduler already deals with empty requests. It's true in , but seems untrue in . Maybe this should be fixed. As for , we can also ask kubelet to apply a default value if we truly on to have the 30 second dfault.
resources.requests and terminationGracePeriodSeconds are effectively newly fields, so setting defaults is not a breaking change for most clients. If Kubelet were comparing the pre-decoded pods returned by apisever, it would barf on every new field we've . It's an accident of the implementation that it broke on exactly these fields.
Actually, neither priorities nor predicates takes values from limits any longer. That code is rely on the defaulting pass to copy limits to requests in the case that the requests field is absent. We would need to change that, yes, if we were to not set requests for the 1.0 mirror pods.
This Kubelet behavior was known to be broken back in May: What we're trying to do now is figure out a workaround for this broken behavior.


Question: out.Annotations[PodInitContainerStatusesBetaAnnotationKey] = string(value) } <del> // We need to reset certain fields for mirror pods from pre-v1.1 kubelet // (#15960). // TODO: Remove this code after we drop support for v1.0 kubelets. if value, ok := in.Annotations[mirrorAnnotationKey]; ok && value == mirrorAnnotationValue_1_0 { // Reset the TerminationGracePeriodSeconds. out.Spec.TerminationGracePeriodSeconds = nil // Reset the resource requests. for i := range out.Spec.Containers { out.Spec.Containers[i].Resources.Requests = nil } } </del> return nil }

My recommended solution is: not set resources.requests and terminationGracePeriodSeconds to non-nil values for just 1.0 mirror pods. All other fields and all other pods, including 1.1 mirror pods, should have default values set normally. Doing this in the defaulting pass makes the most sense, assuming that it's straightforward to do given the structure of that pass. the scheduler fit and priority functions to use limits for pods where requests are entirely absent. that the new code in the node controller to handle termination of pods on 1.0 kubelets deals with unset terminationGracePeriodSeconds appropriately. a kind/workaround-removal issue to remove these hacks once we don't need to worry about 1.0 kubelets.
Just for comparison, an alternative: this default setting from the defaulting function. it to the conversion function instead. mirror pods from 1.0 kubelets (MPF1K), store the original value in an annotation. MPF1K, when converting to v1, restore the original value & remove the annotation. No changes needed anywhere else in the system, maintenance cost is very low, we can carry this as long as needed.
I don't see how that keeps the default values off the wire.
Actually, I think I see. Yes, I think that could work.
The defaults are on the v1-internal transition, and removed on the internal-v1 transition.
(3) is converting v1 to IR, and (4) is converting IR to v1, either for storing to etcd or to communicate to another component, such as Kubelet.
I'm saying stop using the default setting code for setting these "breaking" defaults.
Right.
I don't think we want to do this for pods in general, though, just for MPF1K
So I think we can actually just add a few more changes to PR and it should work. (Just move the defaulting.)
Yes, I agree. Just for MPF1K. We can easily broaden it if needed.
SGTM
We're going to want to do something similar for new fields to alpha API versions that we don't want to expose in the stable, serialized version of the API.
So if this works, we should add it to
Yes. Changing defaults is a breaking change and therefore needs to happen in conversion.


Question: out.Annotations[PodInitContainerStatusesBetaAnnotationKey] = string(value) } <del> // We need to reset certain fields for mirror pods from pre-v1.1 kubelet // (#15960). // TODO: Remove this code after we drop support for v1.0 kubelets. if value, ok := in.Annotations[mirrorAnnotationKey]; ok && value == mirrorAnnotationValue_1_0 { // Reset the TerminationGracePeriodSeconds. out.Spec.TerminationGracePeriodSeconds = nil // Reset the resource requests. for i := range out.Spec.Containers { out.Spec.Containers[i].Resources.Requests = nil } } </del> return nil }

Adding new fields with new defaults is fine, just not changing the behavior of existing fields. course I do think kubelet is being a very inflexible client here, but we can't fix the stuff that's already out there.
+1 to both points. We should've patched kubelet sooner to avoid this, but it's out there and kubelet 1.0 remains a stubborn client. Sorry for that. thanks for coming up with the solution! Since both of you agreed on , I will change my PR acoordingly.
So that there is no misunderstanding that leads to future such problems: Whether fields are new or pre-existing, it is an invalid assumption that unset fields may not be changed, whether by defaulting or by some other process, such as admission control.
This issue will be considered fixed for 1.1 once is submitted. (I didn't read this thread carefully enough yet to know whether additional work is necessary before considering this whole issue closed.)
Update: has just been merged. Closing the issue.
Probably we should not close this issue until we do a cherrypick?
The change was cherrypicked, so closing this issue


Question: return &sha1SignatureChecker{ counterRaiser: &counterRaiser{ counter: counter, <ins> id:      "insecure-sha1", </ins> reason:  "uses an insecure SHA-1 signature", }, }

go1.18 dropped support for certificates signed with the SHA-1 hash function - While this does improve security, and publicly trusted Certificate Authorities no longer issue such certificates, it is possible that user-provided certificates issued by private Certificate Authorities and used in webhooks or aggregated API servers do still use this. Similar to removal of support for certificates without subjectAltNames in go1.17, we need to: [x] add metrics when webhook/conversion/aggregated certificates with this hash are encountered - [x] document use of and the metric from 1 as a mitigation for clusters which still need to identify and replace use of such certificates - to release note and known issues [x] add audit annotation when SHA-1 cert is encountered - [x] update docs at and - /sig api-machinery instrumentation docs /priority important-soon /milestone v1.24 /kind bug documentation Upgraded 1.23 clusters to continue working as-is Configure an admission webhook, conversion webhook, or aggregated server with a serving certificate signed with the SHA-1 hash function. Upgrade to HEAD of 1.24. The certificate will no longer work by default No response 24 HEAD (go1.18-based) n/a n/a No response No response No response
it looks like NewMissingSANRoundTripperWrapperConstructor already has all the plumbing, and instead of missing SANs we could check the SignatureAlgorithm and output a distinct metric
had a not-yet-tested WIP branch at with a sketch of what it might look like
/assign who offered to pick this up
GitHub didn't allow me to assign the following users: stlaz. Note that only , repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time. For more information please see <detailsIn response to : /assign who offered to pick this up Instructions for interacting with me using PR comments are available . If you have questions or suggestions related to my behavior, please file an issue against the repository. </details
Indeed, please, you should trust Jordan :slightlysmilingface:
/assign
/triage accepted
These restrictions are on the GitHub side, this message is posted when it receives a specific error from the GitHub API while attempting to assign It is an annoying GitHub limitation, and one that seemingly does not exist in the web client vs the API.


Question: return &sha1SignatureChecker{ counterRaiser: &counterRaiser{ counter: counter, <ins> id:      "insecure-sha1", </ins> reason:  "uses an insecure SHA-1 signature", }, }

adds the metrics. the release note on that issue describes the go change, links to go docs, describes use of the option, the new metrics, and the kube-apiserver logs what would you expect kubeadm to do with this? GODEBUG off by default and let users override GODEBUG on their own (is this possible)? GODEBUG by default on all clusters? GODEBUG by default only on upgrade? The risk of 1 is that a user upgrades without reading release notes and breaks a cluster that has SHA-1 certs in webhooks, etc The risk of 2 is that we propagate accepting insecure certificates longer, even in new clusters that we know don't have any pre-existing bad certs The risk of 3 is that it makes an upgraded 1.23 → 1.24 cluster and a new 1.24 cluster inconsistent
the majority of kubeadm users use kubeadm managed CA and certificates. there are less users that use external CA to sign their own certificates. sha1 attacks surfaced more than a before kubeadm's creation and Git hash collusion made the problem more known around 2017 - that was at a time when kubeadm did not support external CA. given these facts, an estimate on my side is that there are currently no kubeadm users that use sha1 certificates, but i would not exclude the possibility entirely. if such users exists, they are on they own and my vote goes for option 1, until they migrate their PKI to something secure. if the same users log tickets for us, our response would be "please use GODEBUG and migrate ASAP". all users should be able to see the notes in IMO, the PR needs an "action required" to appear on top of the release notes.
that's helpful, thanks agreed. weird, I set , but the label didn't get . the label manually.
and there's a way for them to set that envvar in kube-apiserver manifests when using kubeadm?
There's been a lot of intermittent github webhook delivery issues in the past few weeks or so, slash commands are going to be somewhat unreliable :/
they could use kubeadm patches to override the YAML manifest defaults - i.e. the contents of v1.Container -Env:


Question: in_pkg_root="$2" shift 2 ;; <ins> "--one-input-api") one_input_api="/$2" shift 2 ;; </ins> "--output-pkg-root") out_pkg_root="$2" shift 2

function in script has following issues: function only supports file but we have multiple types file with name as in . Hence this function is not working in our case. For the mitigation there is already an open . I have asked for including our changes as well. We have multiple files under a for example and . Because of this for appears twice and it generates duplicate informers We only need unique elements before passing it to . I followed this approach for unique elements: We have packages under . Earlier we were generating client only for and . But with the new I am not able to do that. I am using the following call to function: It results in following flags to As there is no directory as , it doesnot generate anything. Is it still possible to call on specific folder as it was done with earlier scripts? One mitigation I can think of is to call function on whole and then remove the marker from the types for which genclient is not needed. But the issue is we won't be able to pass the flag for each pkg. function in script is not working as expected.
/sig api-machinery
/cc
/triage accepted
Hi . I knew that there were all sorts of clients out there doing all sorts of things with these scripts, so I am not surprised to find you. :) Do you have a PR which attempts to use kube_codegen, so I can repro your issues directly?
I think you have one too many in there Aside from that, the real problem here is that these old codegen tools make some deeeeeeep assumptions about the ability to string-join various arguments and get the right results. It's awful. I was trying to make it simpler in this script, which I did for all of the in-tree consumers, but out of tree people apparently don't always follow the same conventions. For example, we generate clients for every directory that requests it. For a reason I do not know, you have files like which say but you don't actually want a client? If you specify then it t
So this code expects that you generate an omnibus client. What if I add a flag, like which you can use to call it for each API to make distinct clients? In truth the codegen tools need to be fixed, but that has SO MUCH ripple I just can't right now.


Question: in_pkg_root="$2" shift 2 ;; <ins> "--one-input-api") one_input_api="/$2" shift 2 ;; </ins> "--output-pkg-root") out_pkg_root="$2" shift 2

As the codegen was breaking us at several step, hence didn't prepared the PR.
Thanks for the PR. I have one more concern, is it possible to call and client-gen on the same pkg? With the current script, that is not possible because of the line It removes all the generated files first and then calls the . Hence the later clientset gen will remove the earlier generated clients.
Why are you generating a client for an internal version that isn't served?
My mistake. We need to stop using clients for internal versions.


Question: kubectl get pods "${kube_flags[@]}" kubectl get pod redis-master "${kube_flags[@]}" [ "$(kubectl get pod redis-master -o template --output-version=v1beta1 -t '{{ .id }}' "${kube_flags[@]}")" == "redis-master" ] <del> output_pod=$(kubectl get pod redis-master -o json --output-version=v1beta1 "${kube_flags[@]}") </del> <ins> output_pod=$(kubectl get pod redis-master -o yaml --output-version=v1beta1 "${kube_flags[@]}") </ins> kubectl delete pod redis-master "${kube_flags[@]}" before="$(kubectl get pods -o template -t "{{ len .items }}" "${kube_flags[@]}")" <del> echo $output_pod | kubectl create -f - "${kube_flags[@]}" </del> <ins> echo "${output_pod}" | kubectl create -f - "${kube_flags[@]}" </ins> after="$(kubectl get pods -o template -t "{{ len .items }}" "${kube_flags[@]}")" [ "$((${after} - ${before}))" -eq 1 ] kubectl get pods -o yaml --output-version=v1beta1 "${kube_flags[@]}" | grep -q "id: redis-master"

If I stuff into a file and use that after -f, it works fine. cc
What's on stdin?
Bug, I'm only accepting json because I naively reused watch partitioner and we don't have test cases. Will fix tonight.
If that's the problem, why did it work when I gave it that file not over stdin?
Different code path. Stdin supports streaming json a la watch (multiple json objects in a stream), so you can do Unfortunately I missed yaml input and didn't use a segmenting yaml decoder (returning a stream of yaml objects).
Ah! Thanks for explanation. I think it would be good for us to ask for e2e runs before merging kubectl changes, since there's not quite enough coverage in test- yet.
Yeah, I'm slacking on that for these changes.
Fix incoming.
Fix provided. More tests to test-cmd... :)


Question: ginkgo.Describe("Kubectl diff", func() { /* <del> Release : v1.18 </del> <ins> Release : v1.19 </ins> Testname: Kubectl, diff Deployment Description: Create a Deployment with httpd image. Declare the same Deployment with a different image, busybox. Diff of live Deployment with declared Deployment MUST include the difference between live and declared image. */ <del> ginkgo.It("should find diff in Deployment", func() { </del> <ins> framework.ConformanceIt("should check if kubectl diff finds a difference for Deployments", func() { </ins> ginkgo.By("create deployment with httpd image") deployment := commonutils.SubstituteImageName(string(readTestFileOrDie(httpdDeployment3Filename))) framework.RunKubectlOrDieInput(ns, deployment, "create", "-f", "-")

and server-side dry-run are being promoted to stable features in 1.18. Conformance should ensure that cloud providers support these features. As a user, I expect to work, which requires that cloud providers for cloud default webhooks. Conformance would generally avoid cloud-specific issues like this one: This suggestion is from /area conformance
/sig testing /sig architecture
/wg apply
There are some good references for conformance tests in the conformance meeting notes:
once merges, we need to promote the e2e test to conformance in a follow up PR, in accordance to this doc: It seems like we meet the conformance test requirements. Here's the process specifically, which includes sig-arch and a review board group:


Question: } stats[path.Base(key)] = info } <del> return stats </del> <ins> return stats, cinfosByPodCgroupKey </ins> }

<!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks! If the matter is security related, please disclose it privately via --For single node with hundreds and thousands of pods and containers, the cpu usage of kubelet becomes high, one bottleneck is the cadvisor stats provider as below: the method iterate all containerInfos for every podStats cause high cpu the method should not iterate allcontainerInfos for every podStats, use map instead Kubernetes version (use ): v1.19.4 Cloud provider or hardware configuration: OS (e.g: ): Kernel (e.g. ): Install tools: Network plugin and version (if this is a network-related bug): Others:
/sig node
/triage accepted
/assign
I’ve done an analysis on the code and this is what I have found, I believe we have two issues to address. There are multiple range loops being performed over v2.ContainerInfo / PodStat maps within the ListPodStatus method which can be contributing to the high cpu utilisation. The allInfos argument which is supplied to the getCadvisorContainerInfo function is a map which uses a cgroup path as the key, in order to find matching container info to podUID, processing of the keys in the map needs to be performed until a match is found. Examples of keys are as follows: /kubepods/burstable/podf9e3a173-1470-451a-9ca2-/d8426b82582fbcfae16085bc794c49769d3a9648bd5463976aca4071f9342754 /docker/2dfa17fc81e781212bcc26e189ebb724721fe097394b4de3cbeb7e069bf23290 My recommendation would be to apply the following updates: Refactor the getCadvisorContainerInfo function to allow for a filter and key type parameter to be supplied by the caller, this enables reducing the number of range loops being performed over the container info map by removing elements that are not required and the ability to set the key being used in the returned container infos map to enable fast lookup of container info.


Question: } stats[path.Base(key)] = info } <del> return stats </del> <ins> return stats, cinfosByPodCgroupKey </ins> }

My initial thoughts are to use an enumeration which has two values KEYCGROUPPATH to provide backwards compatibility and KEYPODUID to enable fast lookups via podUID Refactor ListPodStats method to be more efficient in constructing the PodStats slice and taking into account the fast lookup via podUID I think this is the best approach instead of pushing the data structure implementation for the container info upstream to the cadviser clients, this will at least initially provide a better optimisation scoped within the kubelet/stats package and reduce other possible impacts to changing the cadvisor clients Please advise.
Just realized this looks like a duplicate issue and looking as fixed by PR Both this issue and were raised by Zac
/unassign
/close
You can't close an active issue/PR unless you authored it or you are a collaborator. <detailsIn response to : /close Instructions for interacting with me using PR comments are available . If you have questions or suggestions related to my behavior, please file an issue against the repository. </details
Didn't think I could close this, leaving this with
this will be automatically closed once the PR merges


Question: } done := func() bool { <del> // ensure the response body is closed before we reconnect, so that we reuse the same // TCP connection defer resp.Body.Close() </del> <ins> // Ensure the response body is fully read and closed // before we reconnect, so that we reuse the same TCP // connection. defer func() { const maxBodySlurpSize = 2 << 10 if resp.ContentLength <= maxBodySlurpSize { io.Copy(ioutil.Discard, &io.LimitedReader{R: resp.Body, N: maxBodySlurpSize}) } resp.Body.Close() }() </ins> retries++ if seconds, wait := checkWait(resp); wait && retries < maxRetries {

From the recent runs of different scalability tests, I have a hypothesis that we are not reusing connections after "429" error is returned to the client. Here is description of one tests that I've seen failed: in 2000-node kubemark all watches were dropped at some point (that's a separate issue that is a bit unrelated here). happened next is that basically all watchers decided to do list + watch, and obvious a bunch of lists failed with 429 error (this is still expected). And we started retrying them. And this is still ok. that point, apiserver started consuming ~30 cores (which also isn't completely unexpected). what IS unexpected to me, is that looking into profile ~70% of the CPU (which was ~20 cores) were spend in "doFullHandshake". And this is a bit strange to me. Do we do something specific on 429 errors (e.g. close the connection) so that we won't be able to reuse it in the future? Or do you have any other hypothesis, why we were mostly doing "full handshakes" at that time?
On the server side, we can use on http server to get more info. Can we do the same thing on the client? I don't see anything obvious, but knowing when a connection from a client is closed (vs. terminated by the server, vs gracefully terminated via Connection: Close) might be useful in debugging these cases. The only thing I can think of is that the kubelet has multiple connections to the master, and so instead of reusing its pooled connections it's asking for new connections all at once (and blowing out the pool size in the client). Can we verify that the kubelet TCP connection pool size is greater than the default (which is 2?). Kubelet should definitely have a number of idle connections proportional to number of watches.
There's definitely a branch in the rest client where I think we don't fully read the response body on a 429. Though not explicitly stated in the docs, I think failing to read the entire body of a request also causes the TCP connection to not be reused. This is a code snippet from the HTTP client's redirect code: I can certainly add something like this to . I'm not sure if this is a problem for HTTP2 though.


Question: } done := func() bool { <del> // ensure the response body is closed before we reconnect, so that we reuse the same // TCP connection defer resp.Body.Close() </del> <ins> // Ensure the response body is fully read and closed // before we reconnect, so that we reuse the same TCP // connection. defer func() { const maxBodySlurpSize = 2 << 10 if resp.ContentLength <= maxBodySlurpSize { io.Copy(ioutil.Discard, &io.LimitedReader{R: resp.Body, N: maxBodySlurpSize}) } resp.Body.Close() }() </ins> retries++ if seconds, wait := checkWait(resp); wait && retries < maxRetries {

was this running with HTTP2 enabled? I can't remember the status of that.
I'm pretty sure HTTP2 is off still. , krousey wrote:
Found the doc: I will go ahead and patch this.
Did we add a new error case that didn't catch this? Since this is the 3rd time we've fixed an edge case on reading the entire body, we should probably do what we can to make sure others don't show up.
It's the case where it's 429 or = 500 and there's a Retry-After header. I'm going to add it to the same place where we ensure that the body is closed so that it should always catch it.
k, thanks
Thanks for debugging it (and yes, http2 was switched off in my tests). And looking forward to see the fix. Thanks!


Question: import ( "fmt" "io/ioutil" <ins> "os" </ins> "path/filepath" "k8s.io/api/core/v1"

Error Logs /kind bug /priority failing-test /priority critical-urgent /milestone v1.11 /assign cc Possible breaking change as per offline discussions.
- Timeline of breakage aligns with merge of , nothing else was in flight to cause it.
could this be the problem?
Is that's the problem, may be this will help
/sig cluster-lifecycle
/status approved-for-milestone
[MILESTONENOTIFIER] Milestone Issue Needs Attention Action required: During code freeze, issues in the milestone should be in progress. If this issue is not being actively worked on, please remove it from the milestone. If it is being worked on, please add the label so it can be tracked with other in-flight issues. Note: This issue is marked as , and must be updated every 1 day during code freeze. Example update: <details<summaryIssue Labels</summary- : Issue will be escalated to these SIGs if needed. : Never automatically move issue out of a release milestone; continually escalate to contributor and SIG through all available channels. : Fixes a bug discovered during the current release. </details<details<summaryHelp</summary<ul<li<a href=""Additional instructions</a</li<li<a href=""Commands for setting labels</a</li</ul</details
you can't re-open an issue/PR unless you authored it or you are assigned to it. <detailsIn response to : /reopen Instructions for interacting with me using PR comments are available . If you have questions or suggestions related to my behavior, please file an issue against the repository. </details
https://k8s- https://k8s- both jobs are better now (past the failure where they keeled over before the test suite started). But both seem to have some test failures
we have one green run on each, so let's close this out. https://k8s- https://k8s- /close


Question: <ins> #!/bin/bash # Copyright 2014 Google Inc. All rights reserved. # # 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. # This command resizes a replication controller using kubectl. KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. KUBECTL="${KUBE_ROOT}/cluster/kubectl.sh" if [[ $# != 2 ]] ; then echo "usage: $0 <replication controller name> <size>" >&2 exit 1 fi rc="$1" size="$2" "${KUBECTL}" get -o json rc "$rc" | sed 's/"replicas": [0-9][0-9]*/"replicas": '"$size"'/' | "${KUBECTL}" update -f - rc "$rc" </ins>

kubectl describe emits 1024 NULL characters prior to actual text. This prevents all text-based processing tools from working on its output. /cc
This has got to be due to:
(IRL discussion: there's no reason to pass 1024 0 bytes to NewBuffer.)
Fixing in PR .


Question: // Known values for the tag. const ( <del> tagValueTrue  = "true" tagValueFalse = "false" </del> <ins> tagValueTrue       = "true" tagValueFalse      = "false" tagExtensionPrefix = "x-kubernetes-" </ins> ) <ins> func getOpenAPITagValue(comments []string) []string { return types.ExtractCommentTags("+", comments)[tagName] } </ins> func hasOpenAPITagValue(comments []string, value string) bool { <del> tagValues := types.ExtractCommentTags("+", comments)[tagName] if tagValues == nil { return false } </del> <ins> tagValues := getOpenAPITagValue(comments) </ins> for _, val := range tagValues { if val == value { return true

Background: kubectl and the Kubernetes reference docs both depend on the spec to operate on Kubernetes resources. The lacks important information required by kubectl and the docs. Usecase: kubectl can identify the patchStrategy and mergeKey for resource fields kubectl can identify the columns to print for on resources docs can parse and display the default value for fields docs can identify top-level objects Solution: Add items to the comment tag: Example: The long term plan is to remove the and struct tags once all code has been updated to use the swagger spec instead. Until then, comments should be for the struct tags and . Some verification process will need to be written to make sure the struct tags and comments remain in sync.
I think this wouldn't fall under sig-apps. cc
I would not do the columns stuff - we're moving get to the server side. Top level objects is already available in some form by the client - specifically the list that we use (should use) to get the swagger doc tells us what the top level type is (or is that for something like explain). Merge key, patch strategy, default values all belong as "real" attributes, although we had not necessarily intended those to be arguments to k8s:openapi-gen, but actual tags in their own right (like "+optional")
Thanks Is there a design proposal / eta for this? This is for generating the docs from swagger. Right now the list of top level resources for the docs to display is hardcoded in a . I would like to move the majority of the metadata out of the config file so that: same tool can generate reference docs for federated apiservers without writing a custom config. don't need to manually maintain and update the config for each release - e.g. adding new types I have no strong opinion about this as long as they appear in the swagger so it is possible right tools the can use this data. Can you comment on why openapi-gen vs specific tags?
Describe in the server makes sense to me. IIUC, just prints out a set of columns. Was the idea that the server would just print out the columns or return a list of column / values or something more complicated? No need to answer if it is in the issue / proposal already.


Question: // Known values for the tag. const ( <del> tagValueTrue  = "true" tagValueFalse = "false" </del> <ins> tagValueTrue       = "true" tagValueFalse      = "false" tagExtensionPrefix = "x-kubernetes-" </ins> ) <ins> func getOpenAPITagValue(comments []string) []string { return types.ExtractCommentTags("+", comments)[tagName] } </ins> func hasOpenAPITagValue(comments []string, value string) bool { <del> tagValues := types.ExtractCommentTags("+", comments)[tagName] if tagValues == nil { return false } </del> <ins> tagValues := getOpenAPITagValue(comments) </ins> for _, val := range tagValues { if val == value { return true

is the bigger issue that touches on a rough overview, I can't find my rambling brain dump of the problem, but get would be rough tabular json, you could also get that as csv, and describe could be a richer but not quite full structured key/value structure.
regarding tags, they do not need to be in the same k8s:openapi-gen tag, it can be repeated: they can also be separate tags but still general like this: The idea is to have a general way to add arbitrary extension to a type so we don't need to change code generator for each specific tag. I have no strong feeling about the format, but I would like it to be general vs tags like +optional. The difference is +optional is a defined tag in OpenAPI () but extensions does not have any meaning for code generator. They better to be general so generate can pass them without change.
No, I mean we should define conventions in our API code that match the intent (optional) rather than have tons and tons of repeated code that is setting x-kubernete-describe-columns (or similar)
I spent some time thinking about your comments last night. I don't think this is mutually exclusive with , and could be complementary. IMHO this is general metadata associated with the type, and including it in the doesn't preclude supporting an api endpoint that pre-parses and formats the data. However, including it in the swagger does allow clients using the swagger to take advantage of it. Following is an example of where the swagger would be useful even if get was in the sever. A generated Java client could use the display columns for the "toString" method of the resource. Another use case that had mentioned to me was to allow some kubectl commands to operate on directly on local files. e.g. (strawman) could print the columns. I don't think we want to do this now, but it is an example of why keeping this object metadata private to the server limits what we can do. My hope is that this swagger tags solution will also oprove portable to easily work with ThirdPartyResources as well by writing the display-columns as an annotation on the TPR and keeping the same format. is a can of worms, and I would agree that the solution is capable of providing a richer experience for aggregating information across multiple resource types - e.g.


Question: // Known values for the tag. const ( <del> tagValueTrue  = "true" tagValueFalse = "false" </del> <ins> tagValueTrue       = "true" tagValueFalse      = "false" tagExtensionPrefix = "x-kubernetes-" </ins> ) <ins> func getOpenAPITagValue(comments []string) []string { return types.ExtractCommentTags("+", comments)[tagName] } </ins> func hasOpenAPITagValue(comments []string, value string) bool { <del> tagValues := types.ExtractCommentTags("+", comments)[tagName] if tagValues == nil { return false } </del> <ins> tagValues := getOpenAPITagValue(comments) </ins> for _, val := range tagValues { if val == value { return true

how describing Nodes fetches Pod information. I still think that the solution is compatible with the richer solution you proposed and there is not much additional cost in doing it. Howv What would you think of supporting a set of optional ALPHA extensions for "display-columns" and "describe-columns" allowing any consumers of the swagger to print the objects. In theory it could also be used by the UI to provide a summary view without having to do separate lookups. As an ALPHA feature we could try it for supporting sig-service-catalog and revisit it in 1.7. If we consider it successful, the solution outlined in could become another consumer of the display-columns tag? I like this approach. My biggest concern here is being able to get this into 1.6. Since kubectl supports +/-1 version skew, we need will need to maintain the old logic for at least 1 full release after we add support for the new swagger based logic. That puts us at 6 months from now to fully migrate if we don't have any swagger extensions in 1.6.
I think that's a nice to have in the long run - but then people will say "why are the columns different when the server prints them from the local print"? And most of the pod columns in no way can represent the full complexity of what they print with swagger, so the best effort local printing is going to be really, really, really best effort. Also, local print is a really specialized case - if we just did the generic metadata print that would probably be ok. So while I agree it's valid, it seems like a lot of work for very little practical value. Again, not opposed, just don't want to do two things halfway and then have nothing. So just biased towards not adding more client complexity in the near term. So you want to hack this in for service catalog in 1.6 on TPR? I feel like that's a lot of hacks - the generic printer stuff at least gives you name and namespace, and I'd rather do nothing in 1.7 for generic client printer rather than jump ahead. I won't stop you if you want to spend time and effort on it, but it's a lot of specialized work that will then be neglected while we do the server side stuff.