Browse code

Bump swarmkit vendoring

Includes the following changes since last vendoring:

docker/swarmkit#2795 - Add capabilities list to container specification
docker/swarmkit#2845 - Fix linting error
docker/swarmkit#2848 - Bump fernet/fernet-go
docker/swarmkit#2856 - Add ListServiceStatuses grpc method
docker/swarmkit#2857 - Use Service Placement Constraints in Enforcer

Signed-off-by: Drew Erny <drew.erny@docker.com>

Drew Erny authored on 2019/05/25 01:56:56
Showing 11 changed files
... ...
@@ -130,10 +130,10 @@ github.com/containerd/ttrpc                         f02858b1457c5ca3aaec3a0803eb
130 130
 github.com/gogo/googleapis                          d31c731455cb061f42baff3bda55bad0118b126b # v1.2.0
131 131
 
132 132
 # cluster
133
-github.com/docker/swarmkit                          59163bf75df38489d4a10392265d27156dc473c5
133
+github.com/docker/swarmkit                          1e20cbf4caaeaba79c75af00bce5f41085db4082
134 134
 github.com/gogo/protobuf                            ba06b47c162d49f2af050fb4c75bcbc86a159d5c # v1.2.1
135 135
 github.com/cloudflare/cfssl                         5d63dbd981b5c408effbb58c442d54761ff94fbd # 1.3.2
136
-github.com/fernet/fernet-go                         1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2
136
+github.com/fernet/fernet-go                         9eac43b88a5efb8651d24de9b68e87567e029736
137 137
 github.com/google/certificate-transparency-go       37a384cd035e722ea46e55029093e26687138edf # v1.0.20
138 138
 golang.org/x/crypto                                 88737f569e3a9c7ab309cdc09a07fe7fc87233c3
139 139
 golang.org/x/time                                   fbb02b2291d28baffd63558aa44b4b56f178d650
... ...
@@ -51,6 +51,8 @@
51 51
 		RemoveServiceResponse
52 52
 		ListServicesRequest
53 53
 		ListServicesResponse
54
+		ListServiceStatusesRequest
55
+		ListServiceStatusesResponse
54 56
 		CreateNetworkRequest
55 57
 		CreateNetworkResponse
56 58
 		GetNetworkRequest
... ...
@@ -321,13 +321,62 @@ func (m *ListServicesResponse) Reset()                    { *m = ListServicesRes
321 321
 func (*ListServicesResponse) ProtoMessage()               {}
322 322
 func (*ListServicesResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{23} }
323 323
 
324
+// ListServiceStatusesRequest is a request to get the aggregate status of a
325
+// service by computing the number of running vs desired tasks. It includes
326
+// only a service ID.
327
+type ListServiceStatusesRequest struct {
328
+	// Services is a list of service IDs to get statuses for.
329
+	Services []string `protobuf:"bytes,1,rep,name=services" json:"services,omitempty"`
330
+}
331
+
332
+func (m *ListServiceStatusesRequest) Reset()      { *m = ListServiceStatusesRequest{} }
333
+func (*ListServiceStatusesRequest) ProtoMessage() {}
334
+func (*ListServiceStatusesRequest) Descriptor() ([]byte, []int) {
335
+	return fileDescriptorControl, []int{24}
336
+}
337
+
338
+// ListServiceStatusesResponse is a response containing the aggregate status of
339
+// a service, formed by computing the number of running vs desired tasks. The
340
+// values returned are only valid for the point in time at which the request is
341
+// made.
342
+type ListServiceStatusesResponse struct {
343
+	Statuses []*ListServiceStatusesResponse_ServiceStatus `protobuf:"bytes,1,rep,name=statuses" json:"statuses,omitempty"`
344
+}
345
+
346
+func (m *ListServiceStatusesResponse) Reset()      { *m = ListServiceStatusesResponse{} }
347
+func (*ListServiceStatusesResponse) ProtoMessage() {}
348
+func (*ListServiceStatusesResponse) Descriptor() ([]byte, []int) {
349
+	return fileDescriptorControl, []int{25}
350
+}
351
+
352
+type ListServiceStatusesResponse_ServiceStatus struct {
353
+	// ServiceID is the ID of the service this status describes
354
+	ServiceID string `protobuf:"bytes,1,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
355
+	// DesiredTasks is the number of tasks desired to be running according to the
356
+	// service definition at request time. It is a uint64 because that is what
357
+	// the replicas field on the service spec is
358
+	DesiredTasks uint64 `protobuf:"varint,2,opt,name=desired_tasks,json=desiredTasks,proto3" json:"desired_tasks,omitempty"`
359
+	// RunningTasks is the number of tasks currently in the Running state at
360
+	// request time. This may be larger than desired tasks if, for example, a
361
+	// service has been scaled down.
362
+	RunningTasks uint64 `protobuf:"varint,3,opt,name=running_tasks,json=runningTasks,proto3" json:"running_tasks,omitempty"`
363
+}
364
+
365
+func (m *ListServiceStatusesResponse_ServiceStatus) Reset() {
366
+	*m = ListServiceStatusesResponse_ServiceStatus{}
367
+}
368
+func (*ListServiceStatusesResponse_ServiceStatus) ProtoMessage() {}
369
+func (*ListServiceStatusesResponse_ServiceStatus) Descriptor() ([]byte, []int) {
370
+	return fileDescriptorControl, []int{25, 0}
371
+}
372
+
324 373
 type CreateNetworkRequest struct {
325 374
 	Spec *NetworkSpec `protobuf:"bytes,1,opt,name=spec" json:"spec,omitempty"`
326 375
 }
327 376
 
328 377
 func (m *CreateNetworkRequest) Reset()                    { *m = CreateNetworkRequest{} }
329 378
 func (*CreateNetworkRequest) ProtoMessage()               {}
330
-func (*CreateNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{24} }
379
+func (*CreateNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{26} }
331 380
 
332 381
 type CreateNetworkResponse struct {
333 382
 	Network *Network `protobuf:"bytes,1,opt,name=network" json:"network,omitempty"`
... ...
@@ -335,7 +384,7 @@ type CreateNetworkResponse struct {
335 335
 
336 336
 func (m *CreateNetworkResponse) Reset()                    { *m = CreateNetworkResponse{} }
337 337
 func (*CreateNetworkResponse) ProtoMessage()               {}
338
-func (*CreateNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{25} }
338
+func (*CreateNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{27} }
339 339
 
340 340
 type GetNetworkRequest struct {
341 341
 	Name      string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
... ...
@@ -344,7 +393,7 @@ type GetNetworkRequest struct {
344 344
 
345 345
 func (m *GetNetworkRequest) Reset()                    { *m = GetNetworkRequest{} }
346 346
 func (*GetNetworkRequest) ProtoMessage()               {}
347
-func (*GetNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{26} }
347
+func (*GetNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{28} }
348 348
 
349 349
 type GetNetworkResponse struct {
350 350
 	Network *Network `protobuf:"bytes,1,opt,name=network" json:"network,omitempty"`
... ...
@@ -352,7 +401,7 @@ type GetNetworkResponse struct {
352 352
 
353 353
 func (m *GetNetworkResponse) Reset()                    { *m = GetNetworkResponse{} }
354 354
 func (*GetNetworkResponse) ProtoMessage()               {}
355
-func (*GetNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{27} }
355
+func (*GetNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{29} }
356 356
 
357 357
 type RemoveNetworkRequest struct {
358 358
 	Name      string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
... ...
@@ -361,14 +410,14 @@ type RemoveNetworkRequest struct {
361 361
 
362 362
 func (m *RemoveNetworkRequest) Reset()                    { *m = RemoveNetworkRequest{} }
363 363
 func (*RemoveNetworkRequest) ProtoMessage()               {}
364
-func (*RemoveNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{28} }
364
+func (*RemoveNetworkRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{30} }
365 365
 
366 366
 type RemoveNetworkResponse struct {
367 367
 }
368 368
 
369 369
 func (m *RemoveNetworkResponse) Reset()                    { *m = RemoveNetworkResponse{} }
370 370
 func (*RemoveNetworkResponse) ProtoMessage()               {}
371
-func (*RemoveNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{29} }
371
+func (*RemoveNetworkResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{31} }
372 372
 
373 373
 type ListNetworksRequest struct {
374 374
 	Filters *ListNetworksRequest_Filters `protobuf:"bytes,1,opt,name=filters" json:"filters,omitempty"`
... ...
@@ -376,7 +425,7 @@ type ListNetworksRequest struct {
376 376
 
377 377
 func (m *ListNetworksRequest) Reset()                    { *m = ListNetworksRequest{} }
378 378
 func (*ListNetworksRequest) ProtoMessage()               {}
379
-func (*ListNetworksRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{30} }
379
+func (*ListNetworksRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{32} }
380 380
 
381 381
 type ListNetworksRequest_Filters struct {
382 382
 	Names      []string          `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"`
... ...
@@ -389,7 +438,7 @@ type ListNetworksRequest_Filters struct {
389 389
 func (m *ListNetworksRequest_Filters) Reset()      { *m = ListNetworksRequest_Filters{} }
390 390
 func (*ListNetworksRequest_Filters) ProtoMessage() {}
391 391
 func (*ListNetworksRequest_Filters) Descriptor() ([]byte, []int) {
392
-	return fileDescriptorControl, []int{30, 0}
392
+	return fileDescriptorControl, []int{32, 0}
393 393
 }
394 394
 
395 395
 type ListNetworksResponse struct {
... ...
@@ -398,7 +447,7 @@ type ListNetworksResponse struct {
398 398
 
399 399
 func (m *ListNetworksResponse) Reset()                    { *m = ListNetworksResponse{} }
400 400
 func (*ListNetworksResponse) ProtoMessage()               {}
401
-func (*ListNetworksResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{31} }
401
+func (*ListNetworksResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{33} }
402 402
 
403 403
 type GetClusterRequest struct {
404 404
 	ClusterID string `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"`
... ...
@@ -406,7 +455,7 @@ type GetClusterRequest struct {
406 406
 
407 407
 func (m *GetClusterRequest) Reset()                    { *m = GetClusterRequest{} }
408 408
 func (*GetClusterRequest) ProtoMessage()               {}
409
-func (*GetClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{32} }
409
+func (*GetClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{34} }
410 410
 
411 411
 type GetClusterResponse struct {
412 412
 	Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster" json:"cluster,omitempty"`
... ...
@@ -414,7 +463,7 @@ type GetClusterResponse struct {
414 414
 
415 415
 func (m *GetClusterResponse) Reset()                    { *m = GetClusterResponse{} }
416 416
 func (*GetClusterResponse) ProtoMessage()               {}
417
-func (*GetClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{33} }
417
+func (*GetClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{35} }
418 418
 
419 419
 type ListClustersRequest struct {
420 420
 	Filters *ListClustersRequest_Filters `protobuf:"bytes,1,opt,name=filters" json:"filters,omitempty"`
... ...
@@ -422,7 +471,7 @@ type ListClustersRequest struct {
422 422
 
423 423
 func (m *ListClustersRequest) Reset()                    { *m = ListClustersRequest{} }
424 424
 func (*ListClustersRequest) ProtoMessage()               {}
425
-func (*ListClustersRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{34} }
425
+func (*ListClustersRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{36} }
426 426
 
427 427
 type ListClustersRequest_Filters struct {
428 428
 	Names      []string          `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"`
... ...
@@ -435,7 +484,7 @@ type ListClustersRequest_Filters struct {
435 435
 func (m *ListClustersRequest_Filters) Reset()      { *m = ListClustersRequest_Filters{} }
436 436
 func (*ListClustersRequest_Filters) ProtoMessage() {}
437 437
 func (*ListClustersRequest_Filters) Descriptor() ([]byte, []int) {
438
-	return fileDescriptorControl, []int{34, 0}
438
+	return fileDescriptorControl, []int{36, 0}
439 439
 }
440 440
 
441 441
 type ListClustersResponse struct {
... ...
@@ -444,7 +493,7 @@ type ListClustersResponse struct {
444 444
 
445 445
 func (m *ListClustersResponse) Reset()                    { *m = ListClustersResponse{} }
446 446
 func (*ListClustersResponse) ProtoMessage()               {}
447
-func (*ListClustersResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{35} }
447
+func (*ListClustersResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{37} }
448 448
 
449 449
 // KeyRotation tells UpdateCluster what items to rotate
450 450
 type KeyRotation struct {
... ...
@@ -458,7 +507,7 @@ type KeyRotation struct {
458 458
 
459 459
 func (m *KeyRotation) Reset()                    { *m = KeyRotation{} }
460 460
 func (*KeyRotation) ProtoMessage()               {}
461
-func (*KeyRotation) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{36} }
461
+func (*KeyRotation) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{38} }
462 462
 
463 463
 type UpdateClusterRequest struct {
464 464
 	// ClusterID is the cluster ID to update.
... ...
@@ -473,7 +522,7 @@ type UpdateClusterRequest struct {
473 473
 
474 474
 func (m *UpdateClusterRequest) Reset()                    { *m = UpdateClusterRequest{} }
475 475
 func (*UpdateClusterRequest) ProtoMessage()               {}
476
-func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{37} }
476
+func (*UpdateClusterRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{39} }
477 477
 
478 478
 type UpdateClusterResponse struct {
479 479
 	Cluster *Cluster `protobuf:"bytes,1,opt,name=cluster" json:"cluster,omitempty"`
... ...
@@ -481,7 +530,7 @@ type UpdateClusterResponse struct {
481 481
 
482 482
 func (m *UpdateClusterResponse) Reset()                    { *m = UpdateClusterResponse{} }
483 483
 func (*UpdateClusterResponse) ProtoMessage()               {}
484
-func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{38} }
484
+func (*UpdateClusterResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{40} }
485 485
 
486 486
 // GetSecretRequest is the request to get a `Secret` object given a secret id.
487 487
 type GetSecretRequest struct {
... ...
@@ -490,7 +539,7 @@ type GetSecretRequest struct {
490 490
 
491 491
 func (m *GetSecretRequest) Reset()                    { *m = GetSecretRequest{} }
492 492
 func (*GetSecretRequest) ProtoMessage()               {}
493
-func (*GetSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{39} }
493
+func (*GetSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{41} }
494 494
 
495 495
 // GetSecretResponse contains the Secret corresponding to the id in
496 496
 // `GetSecretRequest`, but the `Secret.Spec.Data` field in each `Secret`
... ...
@@ -501,7 +550,7 @@ type GetSecretResponse struct {
501 501
 
502 502
 func (m *GetSecretResponse) Reset()                    { *m = GetSecretResponse{} }
503 503
 func (*GetSecretResponse) ProtoMessage()               {}
504
-func (*GetSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{40} }
504
+func (*GetSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{42} }
505 505
 
506 506
 type UpdateSecretRequest struct {
507 507
 	// SecretID is the secret ID to update.
... ...
@@ -515,7 +564,7 @@ type UpdateSecretRequest struct {
515 515
 
516 516
 func (m *UpdateSecretRequest) Reset()                    { *m = UpdateSecretRequest{} }
517 517
 func (*UpdateSecretRequest) ProtoMessage()               {}
518
-func (*UpdateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{41} }
518
+func (*UpdateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{43} }
519 519
 
520 520
 type UpdateSecretResponse struct {
521 521
 	Secret *Secret `protobuf:"bytes,1,opt,name=secret" json:"secret,omitempty"`
... ...
@@ -523,7 +572,7 @@ type UpdateSecretResponse struct {
523 523
 
524 524
 func (m *UpdateSecretResponse) Reset()                    { *m = UpdateSecretResponse{} }
525 525
 func (*UpdateSecretResponse) ProtoMessage()               {}
526
-func (*UpdateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{42} }
526
+func (*UpdateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{44} }
527 527
 
528 528
 // ListSecretRequest is the request to list all non-internal secrets in the secret store,
529 529
 // or all secrets filtered by (name or name prefix or id prefix) and labels.
... ...
@@ -533,7 +582,7 @@ type ListSecretsRequest struct {
533 533
 
534 534
 func (m *ListSecretsRequest) Reset()                    { *m = ListSecretsRequest{} }
535 535
 func (*ListSecretsRequest) ProtoMessage()               {}
536
-func (*ListSecretsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{43} }
536
+func (*ListSecretsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{45} }
537 537
 
538 538
 type ListSecretsRequest_Filters struct {
539 539
 	Names        []string          `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"`
... ...
@@ -545,7 +594,7 @@ type ListSecretsRequest_Filters struct {
545 545
 func (m *ListSecretsRequest_Filters) Reset()      { *m = ListSecretsRequest_Filters{} }
546 546
 func (*ListSecretsRequest_Filters) ProtoMessage() {}
547 547
 func (*ListSecretsRequest_Filters) Descriptor() ([]byte, []int) {
548
-	return fileDescriptorControl, []int{43, 0}
548
+	return fileDescriptorControl, []int{45, 0}
549 549
 }
550 550
 
551 551
 // ListSecretResponse contains a list of all the secrets that match the name or
... ...
@@ -558,7 +607,7 @@ type ListSecretsResponse struct {
558 558
 
559 559
 func (m *ListSecretsResponse) Reset()                    { *m = ListSecretsResponse{} }
560 560
 func (*ListSecretsResponse) ProtoMessage()               {}
561
-func (*ListSecretsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{44} }
561
+func (*ListSecretsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{46} }
562 562
 
563 563
 // CreateSecretRequest specifies a new secret (it will not update an existing
564 564
 // secret) to create.
... ...
@@ -568,7 +617,7 @@ type CreateSecretRequest struct {
568 568
 
569 569
 func (m *CreateSecretRequest) Reset()                    { *m = CreateSecretRequest{} }
570 570
 func (*CreateSecretRequest) ProtoMessage()               {}
571
-func (*CreateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{45} }
571
+func (*CreateSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{47} }
572 572
 
573 573
 // CreateSecretResponse contains the newly created `Secret` corresponding to the
574 574
 // name in `CreateSecretRequest`.  The `Secret.Spec.Data` field should be nil instead
... ...
@@ -579,7 +628,7 @@ type CreateSecretResponse struct {
579 579
 
580 580
 func (m *CreateSecretResponse) Reset()                    { *m = CreateSecretResponse{} }
581 581
 func (*CreateSecretResponse) ProtoMessage()               {}
582
-func (*CreateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{46} }
582
+func (*CreateSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{48} }
583 583
 
584 584
 // RemoveSecretRequest contains the ID of the secret that should be removed.  This
585 585
 // removes all versions of the secret.
... ...
@@ -589,7 +638,7 @@ type RemoveSecretRequest struct {
589 589
 
590 590
 func (m *RemoveSecretRequest) Reset()                    { *m = RemoveSecretRequest{} }
591 591
 func (*RemoveSecretRequest) ProtoMessage()               {}
592
-func (*RemoveSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{47} }
592
+func (*RemoveSecretRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{49} }
593 593
 
594 594
 // RemoveSecretResponse is an empty object indicating the successful removal of
595 595
 // a secret.
... ...
@@ -598,7 +647,7 @@ type RemoveSecretResponse struct {
598 598
 
599 599
 func (m *RemoveSecretResponse) Reset()                    { *m = RemoveSecretResponse{} }
600 600
 func (*RemoveSecretResponse) ProtoMessage()               {}
601
-func (*RemoveSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{48} }
601
+func (*RemoveSecretResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{50} }
602 602
 
603 603
 // GetConfigRequest is the request to get a `Config` object given a config id.
604 604
 type GetConfigRequest struct {
... ...
@@ -607,7 +656,7 @@ type GetConfigRequest struct {
607 607
 
608 608
 func (m *GetConfigRequest) Reset()                    { *m = GetConfigRequest{} }
609 609
 func (*GetConfigRequest) ProtoMessage()               {}
610
-func (*GetConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{49} }
610
+func (*GetConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{51} }
611 611
 
612 612
 // GetConfigResponse contains the Config corresponding to the id in
613 613
 // `GetConfigRequest`.
... ...
@@ -617,7 +666,7 @@ type GetConfigResponse struct {
617 617
 
618 618
 func (m *GetConfigResponse) Reset()                    { *m = GetConfigResponse{} }
619 619
 func (*GetConfigResponse) ProtoMessage()               {}
620
-func (*GetConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{50} }
620
+func (*GetConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{52} }
621 621
 
622 622
 type UpdateConfigRequest struct {
623 623
 	// ConfigID is the config ID to update.
... ...
@@ -631,7 +680,7 @@ type UpdateConfigRequest struct {
631 631
 
632 632
 func (m *UpdateConfigRequest) Reset()                    { *m = UpdateConfigRequest{} }
633 633
 func (*UpdateConfigRequest) ProtoMessage()               {}
634
-func (*UpdateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{51} }
634
+func (*UpdateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{53} }
635 635
 
636 636
 type UpdateConfigResponse struct {
637 637
 	Config *Config `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"`
... ...
@@ -639,7 +688,7 @@ type UpdateConfigResponse struct {
639 639
 
640 640
 func (m *UpdateConfigResponse) Reset()                    { *m = UpdateConfigResponse{} }
641 641
 func (*UpdateConfigResponse) ProtoMessage()               {}
642
-func (*UpdateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{52} }
642
+func (*UpdateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{54} }
643 643
 
644 644
 // ListConfigRequest is the request to list all configs in the config store,
645 645
 // or all configs filtered by (name or name prefix or id prefix) and labels.
... ...
@@ -649,7 +698,7 @@ type ListConfigsRequest struct {
649 649
 
650 650
 func (m *ListConfigsRequest) Reset()                    { *m = ListConfigsRequest{} }
651 651
 func (*ListConfigsRequest) ProtoMessage()               {}
652
-func (*ListConfigsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{53} }
652
+func (*ListConfigsRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{55} }
653 653
 
654 654
 type ListConfigsRequest_Filters struct {
655 655
 	Names        []string          `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"`
... ...
@@ -661,7 +710,7 @@ type ListConfigsRequest_Filters struct {
661 661
 func (m *ListConfigsRequest_Filters) Reset()      { *m = ListConfigsRequest_Filters{} }
662 662
 func (*ListConfigsRequest_Filters) ProtoMessage() {}
663 663
 func (*ListConfigsRequest_Filters) Descriptor() ([]byte, []int) {
664
-	return fileDescriptorControl, []int{53, 0}
664
+	return fileDescriptorControl, []int{55, 0}
665 665
 }
666 666
 
667 667
 // ListConfigResponse contains a list of all the configs that match the name or
... ...
@@ -672,7 +721,7 @@ type ListConfigsResponse struct {
672 672
 
673 673
 func (m *ListConfigsResponse) Reset()                    { *m = ListConfigsResponse{} }
674 674
 func (*ListConfigsResponse) ProtoMessage()               {}
675
-func (*ListConfigsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{54} }
675
+func (*ListConfigsResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{56} }
676 676
 
677 677
 // CreateConfigRequest specifies a new config (it will not update an existing
678 678
 // config) to create.
... ...
@@ -682,7 +731,7 @@ type CreateConfigRequest struct {
682 682
 
683 683
 func (m *CreateConfigRequest) Reset()                    { *m = CreateConfigRequest{} }
684 684
 func (*CreateConfigRequest) ProtoMessage()               {}
685
-func (*CreateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{55} }
685
+func (*CreateConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{57} }
686 686
 
687 687
 // CreateConfigResponse contains the newly created `Config` corresponding to the
688 688
 // name in `CreateConfigRequest`.
... ...
@@ -692,7 +741,7 @@ type CreateConfigResponse struct {
692 692
 
693 693
 func (m *CreateConfigResponse) Reset()                    { *m = CreateConfigResponse{} }
694 694
 func (*CreateConfigResponse) ProtoMessage()               {}
695
-func (*CreateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{56} }
695
+func (*CreateConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{58} }
696 696
 
697 697
 // RemoveConfigRequest contains the ID of the config that should be removed.  This
698 698
 // removes all versions of the config.
... ...
@@ -702,7 +751,7 @@ type RemoveConfigRequest struct {
702 702
 
703 703
 func (m *RemoveConfigRequest) Reset()                    { *m = RemoveConfigRequest{} }
704 704
 func (*RemoveConfigRequest) ProtoMessage()               {}
705
-func (*RemoveConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{57} }
705
+func (*RemoveConfigRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{59} }
706 706
 
707 707
 // RemoveConfigResponse is an empty object indicating the successful removal of
708 708
 // a config.
... ...
@@ -711,7 +760,7 @@ type RemoveConfigResponse struct {
711 711
 
712 712
 func (m *RemoveConfigResponse) Reset()                    { *m = RemoveConfigResponse{} }
713 713
 func (*RemoveConfigResponse) ProtoMessage()               {}
714
-func (*RemoveConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{58} }
714
+func (*RemoveConfigResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{60} }
715 715
 
716 716
 // CreateExtensionRequest creates a new extension as specified by the provided
717 717
 // parameters
... ...
@@ -722,7 +771,7 @@ type CreateExtensionRequest struct {
722 722
 
723 723
 func (m *CreateExtensionRequest) Reset()                    { *m = CreateExtensionRequest{} }
724 724
 func (*CreateExtensionRequest) ProtoMessage()               {}
725
-func (*CreateExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{59} }
725
+func (*CreateExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{61} }
726 726
 
727 727
 // CreateExtensionResponse contains the newly created `Extension` corresponding
728 728
 // to the parameters in the CreateExtensionRequest.
... ...
@@ -732,7 +781,7 @@ type CreateExtensionResponse struct {
732 732
 
733 733
 func (m *CreateExtensionResponse) Reset()                    { *m = CreateExtensionResponse{} }
734 734
 func (*CreateExtensionResponse) ProtoMessage()               {}
735
-func (*CreateExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{60} }
735
+func (*CreateExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{62} }
736 736
 
737 737
 // RemoveExtensionRequest contains the ID of the extension that should be removed. This
738 738
 // removes all versions of the extension.
... ...
@@ -742,7 +791,7 @@ type RemoveExtensionRequest struct {
742 742
 
743 743
 func (m *RemoveExtensionRequest) Reset()                    { *m = RemoveExtensionRequest{} }
744 744
 func (*RemoveExtensionRequest) ProtoMessage()               {}
745
-func (*RemoveExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{61} }
745
+func (*RemoveExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{63} }
746 746
 
747 747
 // RemoveExtensionResponse is an empty object indicating the successful removal
748 748
 // of an extension.
... ...
@@ -751,7 +800,7 @@ type RemoveExtensionResponse struct {
751 751
 
752 752
 func (m *RemoveExtensionResponse) Reset()                    { *m = RemoveExtensionResponse{} }
753 753
 func (*RemoveExtensionResponse) ProtoMessage()               {}
754
-func (*RemoveExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{62} }
754
+func (*RemoveExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{64} }
755 755
 
756 756
 // GetResourceRequest is the request to get a Extension object given a extension id.
757 757
 type GetExtensionRequest struct {
... ...
@@ -760,7 +809,7 @@ type GetExtensionRequest struct {
760 760
 
761 761
 func (m *GetExtensionRequest) Reset()                    { *m = GetExtensionRequest{} }
762 762
 func (*GetExtensionRequest) ProtoMessage()               {}
763
-func (*GetExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{63} }
763
+func (*GetExtensionRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{65} }
764 764
 
765 765
 // GetExtensionResponse contains the Extension corresponding to the id in
766 766
 // `GetExtensionRequest`.
... ...
@@ -770,7 +819,7 @@ type GetExtensionResponse struct {
770 770
 
771 771
 func (m *GetExtensionResponse) Reset()                    { *m = GetExtensionResponse{} }
772 772
 func (*GetExtensionResponse) ProtoMessage()               {}
773
-func (*GetExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{64} }
773
+func (*GetExtensionResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{66} }
774 774
 
775 775
 // CreateResourceRequest creates a new resource specified by the included
776 776
 // resource object. An existing resource will not be updated.
... ...
@@ -782,7 +831,7 @@ type CreateResourceRequest struct {
782 782
 
783 783
 func (m *CreateResourceRequest) Reset()                    { *m = CreateResourceRequest{} }
784 784
 func (*CreateResourceRequest) ProtoMessage()               {}
785
-func (*CreateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{65} }
785
+func (*CreateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{67} }
786 786
 
787 787
 // CreateResourceResponse contains the newly created `Resource` corresponding
788 788
 // to the resource in the CreateResourceRequest.
... ...
@@ -792,7 +841,7 @@ type CreateResourceResponse struct {
792 792
 
793 793
 func (m *CreateResourceResponse) Reset()                    { *m = CreateResourceResponse{} }
794 794
 func (*CreateResourceResponse) ProtoMessage()               {}
795
-func (*CreateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{66} }
795
+func (*CreateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{68} }
796 796
 
797 797
 // RemoveResourceRequest contains the ID of the resource that should be removed. This
798 798
 // removes all versions of the resource.
... ...
@@ -802,7 +851,7 @@ type RemoveResourceRequest struct {
802 802
 
803 803
 func (m *RemoveResourceRequest) Reset()                    { *m = RemoveResourceRequest{} }
804 804
 func (*RemoveResourceRequest) ProtoMessage()               {}
805
-func (*RemoveResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{67} }
805
+func (*RemoveResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{69} }
806 806
 
807 807
 // RemoveResourceResponse is an empty object indicating the successful removal
808 808
 // of a resource.
... ...
@@ -811,7 +860,7 @@ type RemoveResourceResponse struct {
811 811
 
812 812
 func (m *RemoveResourceResponse) Reset()                    { *m = RemoveResourceResponse{} }
813 813
 func (*RemoveResourceResponse) ProtoMessage()               {}
814
-func (*RemoveResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{68} }
814
+func (*RemoveResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{70} }
815 815
 
816 816
 // UpdateResourceRequest updates the resource specified by the given resource object.
817 817
 type UpdateResourceRequest struct {
... ...
@@ -828,7 +877,7 @@ type UpdateResourceRequest struct {
828 828
 
829 829
 func (m *UpdateResourceRequest) Reset()                    { *m = UpdateResourceRequest{} }
830 830
 func (*UpdateResourceRequest) ProtoMessage()               {}
831
-func (*UpdateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{69} }
831
+func (*UpdateResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{71} }
832 832
 
833 833
 type UpdateResourceResponse struct {
834 834
 	Resource *Resource `protobuf:"bytes,1,opt,name=resource" json:"resource,omitempty"`
... ...
@@ -836,7 +885,7 @@ type UpdateResourceResponse struct {
836 836
 
837 837
 func (m *UpdateResourceResponse) Reset()                    { *m = UpdateResourceResponse{} }
838 838
 func (*UpdateResourceResponse) ProtoMessage()               {}
839
-func (*UpdateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{70} }
839
+func (*UpdateResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{72} }
840 840
 
841 841
 // GetResourceRequest is the request to get a Resource object given a resource id.
842 842
 type GetResourceRequest struct {
... ...
@@ -845,7 +894,7 @@ type GetResourceRequest struct {
845 845
 
846 846
 func (m *GetResourceRequest) Reset()                    { *m = GetResourceRequest{} }
847 847
 func (*GetResourceRequest) ProtoMessage()               {}
848
-func (*GetResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{71} }
848
+func (*GetResourceRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{73} }
849 849
 
850 850
 // GetResourceResponse contains the Resource corresponding to the id in
851 851
 // `GetResourceRequest`.
... ...
@@ -855,7 +904,7 @@ type GetResourceResponse struct {
855 855
 
856 856
 func (m *GetResourceResponse) Reset()                    { *m = GetResourceResponse{} }
857 857
 func (*GetResourceResponse) ProtoMessage()               {}
858
-func (*GetResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{72} }
858
+func (*GetResourceResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{74} }
859 859
 
860 860
 // ListResourcesRequest is the request to list all resources in the raft store,
861 861
 // or all resources filtered by (name or name prefix or id prefix), labels and extension.
... ...
@@ -865,7 +914,7 @@ type ListResourcesRequest struct {
865 865
 
866 866
 func (m *ListResourcesRequest) Reset()                    { *m = ListResourcesRequest{} }
867 867
 func (*ListResourcesRequest) ProtoMessage()               {}
868
-func (*ListResourcesRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{73} }
868
+func (*ListResourcesRequest) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{75} }
869 869
 
870 870
 type ListResourcesRequest_Filters struct {
871 871
 	Names        []string          `protobuf:"bytes,1,rep,name=names" json:"names,omitempty"`
... ...
@@ -878,7 +927,7 @@ type ListResourcesRequest_Filters struct {
878 878
 func (m *ListResourcesRequest_Filters) Reset()      { *m = ListResourcesRequest_Filters{} }
879 879
 func (*ListResourcesRequest_Filters) ProtoMessage() {}
880 880
 func (*ListResourcesRequest_Filters) Descriptor() ([]byte, []int) {
881
-	return fileDescriptorControl, []int{73, 0}
881
+	return fileDescriptorControl, []int{75, 0}
882 882
 }
883 883
 
884 884
 // ListResourcesResponse contains a list of all the resources that match the name or
... ...
@@ -889,7 +938,7 @@ type ListResourcesResponse struct {
889 889
 
890 890
 func (m *ListResourcesResponse) Reset()                    { *m = ListResourcesResponse{} }
891 891
 func (*ListResourcesResponse) ProtoMessage()               {}
892
-func (*ListResourcesResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{74} }
892
+func (*ListResourcesResponse) Descriptor() ([]byte, []int) { return fileDescriptorControl, []int{76} }
893 893
 
894 894
 func init() {
895 895
 	proto.RegisterType((*GetNodeRequest)(nil), "docker.swarmkit.v1.GetNodeRequest")
... ...
@@ -919,6 +968,9 @@ func init() {
919 919
 	proto.RegisterType((*ListServicesRequest)(nil), "docker.swarmkit.v1.ListServicesRequest")
920 920
 	proto.RegisterType((*ListServicesRequest_Filters)(nil), "docker.swarmkit.v1.ListServicesRequest.Filters")
921 921
 	proto.RegisterType((*ListServicesResponse)(nil), "docker.swarmkit.v1.ListServicesResponse")
922
+	proto.RegisterType((*ListServiceStatusesRequest)(nil), "docker.swarmkit.v1.ListServiceStatusesRequest")
923
+	proto.RegisterType((*ListServiceStatusesResponse)(nil), "docker.swarmkit.v1.ListServiceStatusesResponse")
924
+	proto.RegisterType((*ListServiceStatusesResponse_ServiceStatus)(nil), "docker.swarmkit.v1.ListServiceStatusesResponse.ServiceStatus")
922 925
 	proto.RegisterType((*CreateNetworkRequest)(nil), "docker.swarmkit.v1.CreateNetworkRequest")
923 926
 	proto.RegisterType((*CreateNetworkResponse)(nil), "docker.swarmkit.v1.CreateNetworkResponse")
924 927
 	proto.RegisterType((*GetNetworkRequest)(nil), "docker.swarmkit.v1.GetNetworkRequest")
... ...
@@ -1086,6 +1138,14 @@ func (p *authenticatedWrapperControlServer) RemoveService(ctx context.Context, r
1086 1086
 	return p.local.RemoveService(ctx, r)
1087 1087
 }
1088 1088
 
1089
+func (p *authenticatedWrapperControlServer) ListServiceStatuses(ctx context.Context, r *ListServiceStatusesRequest) (*ListServiceStatusesResponse, error) {
1090
+
1091
+	if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil {
1092
+		return nil, err
1093
+	}
1094
+	return p.local.ListServiceStatuses(ctx, r)
1095
+}
1096
+
1089 1097
 func (p *authenticatedWrapperControlServer) GetNetwork(ctx context.Context, r *GetNetworkRequest) (*GetNetworkResponse, error) {
1090 1098
 
1091 1099
 	if err := p.authorize(ctx, []string{"swarm-manager"}); err != nil {
... ...
@@ -1864,6 +1924,64 @@ func (m *ListServicesResponse) CopyFrom(src interface{}) {
1864 1864
 
1865 1865
 }
1866 1866
 
1867
+func (m *ListServiceStatusesRequest) Copy() *ListServiceStatusesRequest {
1868
+	if m == nil {
1869
+		return nil
1870
+	}
1871
+	o := &ListServiceStatusesRequest{}
1872
+	o.CopyFrom(m)
1873
+	return o
1874
+}
1875
+
1876
+func (m *ListServiceStatusesRequest) CopyFrom(src interface{}) {
1877
+
1878
+	o := src.(*ListServiceStatusesRequest)
1879
+	*m = *o
1880
+	if o.Services != nil {
1881
+		m.Services = make([]string, len(o.Services))
1882
+		copy(m.Services, o.Services)
1883
+	}
1884
+
1885
+}
1886
+
1887
+func (m *ListServiceStatusesResponse) Copy() *ListServiceStatusesResponse {
1888
+	if m == nil {
1889
+		return nil
1890
+	}
1891
+	o := &ListServiceStatusesResponse{}
1892
+	o.CopyFrom(m)
1893
+	return o
1894
+}
1895
+
1896
+func (m *ListServiceStatusesResponse) CopyFrom(src interface{}) {
1897
+
1898
+	o := src.(*ListServiceStatusesResponse)
1899
+	*m = *o
1900
+	if o.Statuses != nil {
1901
+		m.Statuses = make([]*ListServiceStatusesResponse_ServiceStatus, len(o.Statuses))
1902
+		for i := range m.Statuses {
1903
+			m.Statuses[i] = &ListServiceStatusesResponse_ServiceStatus{}
1904
+			deepcopy.Copy(m.Statuses[i], o.Statuses[i])
1905
+		}
1906
+	}
1907
+
1908
+}
1909
+
1910
+func (m *ListServiceStatusesResponse_ServiceStatus) Copy() *ListServiceStatusesResponse_ServiceStatus {
1911
+	if m == nil {
1912
+		return nil
1913
+	}
1914
+	o := &ListServiceStatusesResponse_ServiceStatus{}
1915
+	o.CopyFrom(m)
1916
+	return o
1917
+}
1918
+
1919
+func (m *ListServiceStatusesResponse_ServiceStatus) CopyFrom(src interface{}) {
1920
+
1921
+	o := src.(*ListServiceStatusesResponse_ServiceStatus)
1922
+	*m = *o
1923
+}
1924
+
1867 1925
 func (m *CreateNetworkRequest) Copy() *CreateNetworkRequest {
1868 1926
 	if m == nil {
1869 1927
 		return nil
... ...
@@ -2993,6 +3111,13 @@ type ControlClient interface {
2993 2993
 	CreateService(ctx context.Context, in *CreateServiceRequest, opts ...grpc.CallOption) (*CreateServiceResponse, error)
2994 2994
 	UpdateService(ctx context.Context, in *UpdateServiceRequest, opts ...grpc.CallOption) (*UpdateServiceResponse, error)
2995 2995
 	RemoveService(ctx context.Context, in *RemoveServiceRequest, opts ...grpc.CallOption) (*RemoveServiceResponse, error)
2996
+	// ListServiceStatuses returns a `ListServiceStatusesResponse` with the
2997
+	// status of the requested services, formed by computing the number of
2998
+	// running vs desired tasks. It is provided as a shortcut or helper method,
2999
+	// which allows a client to avoid having to calculate this value by listing
3000
+	// all Tasks. If any service requested does not exist, it will be returned
3001
+	// but with empty status values.
3002
+	ListServiceStatuses(ctx context.Context, in *ListServiceStatusesRequest, opts ...grpc.CallOption) (*ListServiceStatusesResponse, error)
2996 3003
 	GetNetwork(ctx context.Context, in *GetNetworkRequest, opts ...grpc.CallOption) (*GetNetworkResponse, error)
2997 3004
 	ListNetworks(ctx context.Context, in *ListNetworksRequest, opts ...grpc.CallOption) (*ListNetworksResponse, error)
2998 3005
 	CreateNetwork(ctx context.Context, in *CreateNetworkRequest, opts ...grpc.CallOption) (*CreateNetworkResponse, error)
... ...
@@ -3222,6 +3347,15 @@ func (c *controlClient) RemoveService(ctx context.Context, in *RemoveServiceRequ
3222 3222
 	return out, nil
3223 3223
 }
3224 3224
 
3225
+func (c *controlClient) ListServiceStatuses(ctx context.Context, in *ListServiceStatusesRequest, opts ...grpc.CallOption) (*ListServiceStatusesResponse, error) {
3226
+	out := new(ListServiceStatusesResponse)
3227
+	err := grpc.Invoke(ctx, "/docker.swarmkit.v1.Control/ListServiceStatuses", in, out, c.cc, opts...)
3228
+	if err != nil {
3229
+		return nil, err
3230
+	}
3231
+	return out, nil
3232
+}
3233
+
3225 3234
 func (c *controlClient) GetNetwork(ctx context.Context, in *GetNetworkRequest, opts ...grpc.CallOption) (*GetNetworkResponse, error) {
3226 3235
 	out := new(GetNetworkResponse)
3227 3236
 	err := grpc.Invoke(ctx, "/docker.swarmkit.v1.Control/GetNetwork", in, out, c.cc, opts...)
... ...
@@ -3462,6 +3596,13 @@ type ControlServer interface {
3462 3462
 	CreateService(context.Context, *CreateServiceRequest) (*CreateServiceResponse, error)
3463 3463
 	UpdateService(context.Context, *UpdateServiceRequest) (*UpdateServiceResponse, error)
3464 3464
 	RemoveService(context.Context, *RemoveServiceRequest) (*RemoveServiceResponse, error)
3465
+	// ListServiceStatuses returns a `ListServiceStatusesResponse` with the
3466
+	// status of the requested services, formed by computing the number of
3467
+	// running vs desired tasks. It is provided as a shortcut or helper method,
3468
+	// which allows a client to avoid having to calculate this value by listing
3469
+	// all Tasks. If any service requested does not exist, it will be returned
3470
+	// but with empty status values.
3471
+	ListServiceStatuses(context.Context, *ListServiceStatusesRequest) (*ListServiceStatusesResponse, error)
3465 3472
 	GetNetwork(context.Context, *GetNetworkRequest) (*GetNetworkResponse, error)
3466 3473
 	ListNetworks(context.Context, *ListNetworksRequest) (*ListNetworksResponse, error)
3467 3474
 	CreateNetwork(context.Context, *CreateNetworkRequest) (*CreateNetworkResponse, error)
... ...
@@ -3795,6 +3936,24 @@ func _Control_RemoveService_Handler(srv interface{}, ctx context.Context, dec fu
3795 3795
 	return interceptor(ctx, in, info, handler)
3796 3796
 }
3797 3797
 
3798
+func _Control_ListServiceStatuses_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
3799
+	in := new(ListServiceStatusesRequest)
3800
+	if err := dec(in); err != nil {
3801
+		return nil, err
3802
+	}
3803
+	if interceptor == nil {
3804
+		return srv.(ControlServer).ListServiceStatuses(ctx, in)
3805
+	}
3806
+	info := &grpc.UnaryServerInfo{
3807
+		Server:     srv,
3808
+		FullMethod: "/docker.swarmkit.v1.Control/ListServiceStatuses",
3809
+	}
3810
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
3811
+		return srv.(ControlServer).ListServiceStatuses(ctx, req.(*ListServiceStatusesRequest))
3812
+	}
3813
+	return interceptor(ctx, in, info, handler)
3814
+}
3815
+
3798 3816
 func _Control_GetNetwork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
3799 3817
 	in := new(GetNetworkRequest)
3800 3818
 	if err := dec(in); err != nil {
... ...
@@ -4298,6 +4457,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{
4298 4298
 			Handler:    _Control_RemoveService_Handler,
4299 4299
 		},
4300 4300
 		{
4301
+			MethodName: "ListServiceStatuses",
4302
+			Handler:    _Control_ListServiceStatuses_Handler,
4303
+		},
4304
+		{
4301 4305
 			MethodName: "GetNetwork",
4302 4306
 			Handler:    _Control_GetNetwork_Handler,
4303 4307
 		},
... ...
@@ -5431,6 +5594,103 @@ func (m *ListServicesResponse) MarshalTo(dAtA []byte) (int, error) {
5431 5431
 	return i, nil
5432 5432
 }
5433 5433
 
5434
+func (m *ListServiceStatusesRequest) Marshal() (dAtA []byte, err error) {
5435
+	size := m.Size()
5436
+	dAtA = make([]byte, size)
5437
+	n, err := m.MarshalTo(dAtA)
5438
+	if err != nil {
5439
+		return nil, err
5440
+	}
5441
+	return dAtA[:n], nil
5442
+}
5443
+
5444
+func (m *ListServiceStatusesRequest) MarshalTo(dAtA []byte) (int, error) {
5445
+	var i int
5446
+	_ = i
5447
+	var l int
5448
+	_ = l
5449
+	if len(m.Services) > 0 {
5450
+		for _, s := range m.Services {
5451
+			dAtA[i] = 0xa
5452
+			i++
5453
+			l = len(s)
5454
+			for l >= 1<<7 {
5455
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
5456
+				l >>= 7
5457
+				i++
5458
+			}
5459
+			dAtA[i] = uint8(l)
5460
+			i++
5461
+			i += copy(dAtA[i:], s)
5462
+		}
5463
+	}
5464
+	return i, nil
5465
+}
5466
+
5467
+func (m *ListServiceStatusesResponse) Marshal() (dAtA []byte, err error) {
5468
+	size := m.Size()
5469
+	dAtA = make([]byte, size)
5470
+	n, err := m.MarshalTo(dAtA)
5471
+	if err != nil {
5472
+		return nil, err
5473
+	}
5474
+	return dAtA[:n], nil
5475
+}
5476
+
5477
+func (m *ListServiceStatusesResponse) MarshalTo(dAtA []byte) (int, error) {
5478
+	var i int
5479
+	_ = i
5480
+	var l int
5481
+	_ = l
5482
+	if len(m.Statuses) > 0 {
5483
+		for _, msg := range m.Statuses {
5484
+			dAtA[i] = 0xa
5485
+			i++
5486
+			i = encodeVarintControl(dAtA, i, uint64(msg.Size()))
5487
+			n, err := msg.MarshalTo(dAtA[i:])
5488
+			if err != nil {
5489
+				return 0, err
5490
+			}
5491
+			i += n
5492
+		}
5493
+	}
5494
+	return i, nil
5495
+}
5496
+
5497
+func (m *ListServiceStatusesResponse_ServiceStatus) Marshal() (dAtA []byte, err error) {
5498
+	size := m.Size()
5499
+	dAtA = make([]byte, size)
5500
+	n, err := m.MarshalTo(dAtA)
5501
+	if err != nil {
5502
+		return nil, err
5503
+	}
5504
+	return dAtA[:n], nil
5505
+}
5506
+
5507
+func (m *ListServiceStatusesResponse_ServiceStatus) MarshalTo(dAtA []byte) (int, error) {
5508
+	var i int
5509
+	_ = i
5510
+	var l int
5511
+	_ = l
5512
+	if len(m.ServiceID) > 0 {
5513
+		dAtA[i] = 0xa
5514
+		i++
5515
+		i = encodeVarintControl(dAtA, i, uint64(len(m.ServiceID)))
5516
+		i += copy(dAtA[i:], m.ServiceID)
5517
+	}
5518
+	if m.DesiredTasks != 0 {
5519
+		dAtA[i] = 0x10
5520
+		i++
5521
+		i = encodeVarintControl(dAtA, i, uint64(m.DesiredTasks))
5522
+	}
5523
+	if m.RunningTasks != 0 {
5524
+		dAtA[i] = 0x18
5525
+		i++
5526
+		i = encodeVarintControl(dAtA, i, uint64(m.RunningTasks))
5527
+	}
5528
+	return i, nil
5529
+}
5530
+
5434 5531
 func (m *CreateNetworkRequest) Marshal() (dAtA []byte, err error) {
5435 5532
 	size := m.Size()
5436 5533
 	dAtA = make([]byte, size)
... ...
@@ -7819,6 +8079,41 @@ func (p *raftProxyControlServer) RemoveService(ctx context.Context, r *RemoveSer
7819 7819
 	return resp, err
7820 7820
 }
7821 7821
 
7822
+func (p *raftProxyControlServer) ListServiceStatuses(ctx context.Context, r *ListServiceStatusesRequest) (*ListServiceStatusesResponse, error) {
7823
+
7824
+	conn, err := p.connSelector.LeaderConn(ctx)
7825
+	if err != nil {
7826
+		if err == raftselector.ErrIsLeader {
7827
+			ctx, err = p.runCtxMods(ctx, p.localCtxMods)
7828
+			if err != nil {
7829
+				return nil, err
7830
+			}
7831
+			return p.local.ListServiceStatuses(ctx, r)
7832
+		}
7833
+		return nil, err
7834
+	}
7835
+	modCtx, err := p.runCtxMods(ctx, p.remoteCtxMods)
7836
+	if err != nil {
7837
+		return nil, err
7838
+	}
7839
+
7840
+	resp, err := NewControlClient(conn).ListServiceStatuses(modCtx, r)
7841
+	if err != nil {
7842
+		if !strings.Contains(err.Error(), "is closing") && !strings.Contains(err.Error(), "the connection is unavailable") && !strings.Contains(err.Error(), "connection error") {
7843
+			return resp, err
7844
+		}
7845
+		conn, err := p.pollNewLeaderConn(ctx)
7846
+		if err != nil {
7847
+			if err == raftselector.ErrIsLeader {
7848
+				return p.local.ListServiceStatuses(ctx, r)
7849
+			}
7850
+			return nil, err
7851
+		}
7852
+		return NewControlClient(conn).ListServiceStatuses(modCtx, r)
7853
+	}
7854
+	return resp, err
7855
+}
7856
+
7822 7857
 func (p *raftProxyControlServer) GetNetwork(ctx context.Context, r *GetNetworkRequest) (*GetNetworkResponse, error) {
7823 7858
 
7824 7859
 	conn, err := p.connSelector.LeaderConn(ctx)
... ...
@@ -9099,6 +9394,46 @@ func (m *ListServicesResponse) Size() (n int) {
9099 9099
 	return n
9100 9100
 }
9101 9101
 
9102
+func (m *ListServiceStatusesRequest) Size() (n int) {
9103
+	var l int
9104
+	_ = l
9105
+	if len(m.Services) > 0 {
9106
+		for _, s := range m.Services {
9107
+			l = len(s)
9108
+			n += 1 + l + sovControl(uint64(l))
9109
+		}
9110
+	}
9111
+	return n
9112
+}
9113
+
9114
+func (m *ListServiceStatusesResponse) Size() (n int) {
9115
+	var l int
9116
+	_ = l
9117
+	if len(m.Statuses) > 0 {
9118
+		for _, e := range m.Statuses {
9119
+			l = e.Size()
9120
+			n += 1 + l + sovControl(uint64(l))
9121
+		}
9122
+	}
9123
+	return n
9124
+}
9125
+
9126
+func (m *ListServiceStatusesResponse_ServiceStatus) Size() (n int) {
9127
+	var l int
9128
+	_ = l
9129
+	l = len(m.ServiceID)
9130
+	if l > 0 {
9131
+		n += 1 + l + sovControl(uint64(l))
9132
+	}
9133
+	if m.DesiredTasks != 0 {
9134
+		n += 1 + sovControl(uint64(m.DesiredTasks))
9135
+	}
9136
+	if m.RunningTasks != 0 {
9137
+		n += 1 + sovControl(uint64(m.RunningTasks))
9138
+	}
9139
+	return n
9140
+}
9141
+
9102 9142
 func (m *CreateNetworkRequest) Size() (n int) {
9103 9143
 	var l int
9104 9144
 	_ = l
... ...
@@ -10171,6 +10506,38 @@ func (this *ListServicesResponse) String() string {
10171 10171
 	}, "")
10172 10172
 	return s
10173 10173
 }
10174
+func (this *ListServiceStatusesRequest) String() string {
10175
+	if this == nil {
10176
+		return "nil"
10177
+	}
10178
+	s := strings.Join([]string{`&ListServiceStatusesRequest{`,
10179
+		`Services:` + fmt.Sprintf("%v", this.Services) + `,`,
10180
+		`}`,
10181
+	}, "")
10182
+	return s
10183
+}
10184
+func (this *ListServiceStatusesResponse) String() string {
10185
+	if this == nil {
10186
+		return "nil"
10187
+	}
10188
+	s := strings.Join([]string{`&ListServiceStatusesResponse{`,
10189
+		`Statuses:` + strings.Replace(fmt.Sprintf("%v", this.Statuses), "ListServiceStatusesResponse_ServiceStatus", "ListServiceStatusesResponse_ServiceStatus", 1) + `,`,
10190
+		`}`,
10191
+	}, "")
10192
+	return s
10193
+}
10194
+func (this *ListServiceStatusesResponse_ServiceStatus) String() string {
10195
+	if this == nil {
10196
+		return "nil"
10197
+	}
10198
+	s := strings.Join([]string{`&ListServiceStatusesResponse_ServiceStatus{`,
10199
+		`ServiceID:` + fmt.Sprintf("%v", this.ServiceID) + `,`,
10200
+		`DesiredTasks:` + fmt.Sprintf("%v", this.DesiredTasks) + `,`,
10201
+		`RunningTasks:` + fmt.Sprintf("%v", this.RunningTasks) + `,`,
10202
+		`}`,
10203
+	}, "")
10204
+	return s
10205
+}
10174 10206
 func (this *CreateNetworkRequest) String() string {
10175 10207
 	if this == nil {
10176 10208
 		return "nil"
... ...
@@ -14068,6 +14435,283 @@ func (m *ListServicesResponse) Unmarshal(dAtA []byte) error {
14068 14068
 	}
14069 14069
 	return nil
14070 14070
 }
14071
+func (m *ListServiceStatusesRequest) Unmarshal(dAtA []byte) error {
14072
+	l := len(dAtA)
14073
+	iNdEx := 0
14074
+	for iNdEx < l {
14075
+		preIndex := iNdEx
14076
+		var wire uint64
14077
+		for shift := uint(0); ; shift += 7 {
14078
+			if shift >= 64 {
14079
+				return ErrIntOverflowControl
14080
+			}
14081
+			if iNdEx >= l {
14082
+				return io.ErrUnexpectedEOF
14083
+			}
14084
+			b := dAtA[iNdEx]
14085
+			iNdEx++
14086
+			wire |= (uint64(b) & 0x7F) << shift
14087
+			if b < 0x80 {
14088
+				break
14089
+			}
14090
+		}
14091
+		fieldNum := int32(wire >> 3)
14092
+		wireType := int(wire & 0x7)
14093
+		if wireType == 4 {
14094
+			return fmt.Errorf("proto: ListServiceStatusesRequest: wiretype end group for non-group")
14095
+		}
14096
+		if fieldNum <= 0 {
14097
+			return fmt.Errorf("proto: ListServiceStatusesRequest: illegal tag %d (wire type %d)", fieldNum, wire)
14098
+		}
14099
+		switch fieldNum {
14100
+		case 1:
14101
+			if wireType != 2 {
14102
+				return fmt.Errorf("proto: wrong wireType = %d for field Services", wireType)
14103
+			}
14104
+			var stringLen uint64
14105
+			for shift := uint(0); ; shift += 7 {
14106
+				if shift >= 64 {
14107
+					return ErrIntOverflowControl
14108
+				}
14109
+				if iNdEx >= l {
14110
+					return io.ErrUnexpectedEOF
14111
+				}
14112
+				b := dAtA[iNdEx]
14113
+				iNdEx++
14114
+				stringLen |= (uint64(b) & 0x7F) << shift
14115
+				if b < 0x80 {
14116
+					break
14117
+				}
14118
+			}
14119
+			intStringLen := int(stringLen)
14120
+			if intStringLen < 0 {
14121
+				return ErrInvalidLengthControl
14122
+			}
14123
+			postIndex := iNdEx + intStringLen
14124
+			if postIndex > l {
14125
+				return io.ErrUnexpectedEOF
14126
+			}
14127
+			m.Services = append(m.Services, string(dAtA[iNdEx:postIndex]))
14128
+			iNdEx = postIndex
14129
+		default:
14130
+			iNdEx = preIndex
14131
+			skippy, err := skipControl(dAtA[iNdEx:])
14132
+			if err != nil {
14133
+				return err
14134
+			}
14135
+			if skippy < 0 {
14136
+				return ErrInvalidLengthControl
14137
+			}
14138
+			if (iNdEx + skippy) > l {
14139
+				return io.ErrUnexpectedEOF
14140
+			}
14141
+			iNdEx += skippy
14142
+		}
14143
+	}
14144
+
14145
+	if iNdEx > l {
14146
+		return io.ErrUnexpectedEOF
14147
+	}
14148
+	return nil
14149
+}
14150
+func (m *ListServiceStatusesResponse) Unmarshal(dAtA []byte) error {
14151
+	l := len(dAtA)
14152
+	iNdEx := 0
14153
+	for iNdEx < l {
14154
+		preIndex := iNdEx
14155
+		var wire uint64
14156
+		for shift := uint(0); ; shift += 7 {
14157
+			if shift >= 64 {
14158
+				return ErrIntOverflowControl
14159
+			}
14160
+			if iNdEx >= l {
14161
+				return io.ErrUnexpectedEOF
14162
+			}
14163
+			b := dAtA[iNdEx]
14164
+			iNdEx++
14165
+			wire |= (uint64(b) & 0x7F) << shift
14166
+			if b < 0x80 {
14167
+				break
14168
+			}
14169
+		}
14170
+		fieldNum := int32(wire >> 3)
14171
+		wireType := int(wire & 0x7)
14172
+		if wireType == 4 {
14173
+			return fmt.Errorf("proto: ListServiceStatusesResponse: wiretype end group for non-group")
14174
+		}
14175
+		if fieldNum <= 0 {
14176
+			return fmt.Errorf("proto: ListServiceStatusesResponse: illegal tag %d (wire type %d)", fieldNum, wire)
14177
+		}
14178
+		switch fieldNum {
14179
+		case 1:
14180
+			if wireType != 2 {
14181
+				return fmt.Errorf("proto: wrong wireType = %d for field Statuses", wireType)
14182
+			}
14183
+			var msglen int
14184
+			for shift := uint(0); ; shift += 7 {
14185
+				if shift >= 64 {
14186
+					return ErrIntOverflowControl
14187
+				}
14188
+				if iNdEx >= l {
14189
+					return io.ErrUnexpectedEOF
14190
+				}
14191
+				b := dAtA[iNdEx]
14192
+				iNdEx++
14193
+				msglen |= (int(b) & 0x7F) << shift
14194
+				if b < 0x80 {
14195
+					break
14196
+				}
14197
+			}
14198
+			if msglen < 0 {
14199
+				return ErrInvalidLengthControl
14200
+			}
14201
+			postIndex := iNdEx + msglen
14202
+			if postIndex > l {
14203
+				return io.ErrUnexpectedEOF
14204
+			}
14205
+			m.Statuses = append(m.Statuses, &ListServiceStatusesResponse_ServiceStatus{})
14206
+			if err := m.Statuses[len(m.Statuses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
14207
+				return err
14208
+			}
14209
+			iNdEx = postIndex
14210
+		default:
14211
+			iNdEx = preIndex
14212
+			skippy, err := skipControl(dAtA[iNdEx:])
14213
+			if err != nil {
14214
+				return err
14215
+			}
14216
+			if skippy < 0 {
14217
+				return ErrInvalidLengthControl
14218
+			}
14219
+			if (iNdEx + skippy) > l {
14220
+				return io.ErrUnexpectedEOF
14221
+			}
14222
+			iNdEx += skippy
14223
+		}
14224
+	}
14225
+
14226
+	if iNdEx > l {
14227
+		return io.ErrUnexpectedEOF
14228
+	}
14229
+	return nil
14230
+}
14231
+func (m *ListServiceStatusesResponse_ServiceStatus) Unmarshal(dAtA []byte) error {
14232
+	l := len(dAtA)
14233
+	iNdEx := 0
14234
+	for iNdEx < l {
14235
+		preIndex := iNdEx
14236
+		var wire uint64
14237
+		for shift := uint(0); ; shift += 7 {
14238
+			if shift >= 64 {
14239
+				return ErrIntOverflowControl
14240
+			}
14241
+			if iNdEx >= l {
14242
+				return io.ErrUnexpectedEOF
14243
+			}
14244
+			b := dAtA[iNdEx]
14245
+			iNdEx++
14246
+			wire |= (uint64(b) & 0x7F) << shift
14247
+			if b < 0x80 {
14248
+				break
14249
+			}
14250
+		}
14251
+		fieldNum := int32(wire >> 3)
14252
+		wireType := int(wire & 0x7)
14253
+		if wireType == 4 {
14254
+			return fmt.Errorf("proto: ServiceStatus: wiretype end group for non-group")
14255
+		}
14256
+		if fieldNum <= 0 {
14257
+			return fmt.Errorf("proto: ServiceStatus: illegal tag %d (wire type %d)", fieldNum, wire)
14258
+		}
14259
+		switch fieldNum {
14260
+		case 1:
14261
+			if wireType != 2 {
14262
+				return fmt.Errorf("proto: wrong wireType = %d for field ServiceID", wireType)
14263
+			}
14264
+			var stringLen uint64
14265
+			for shift := uint(0); ; shift += 7 {
14266
+				if shift >= 64 {
14267
+					return ErrIntOverflowControl
14268
+				}
14269
+				if iNdEx >= l {
14270
+					return io.ErrUnexpectedEOF
14271
+				}
14272
+				b := dAtA[iNdEx]
14273
+				iNdEx++
14274
+				stringLen |= (uint64(b) & 0x7F) << shift
14275
+				if b < 0x80 {
14276
+					break
14277
+				}
14278
+			}
14279
+			intStringLen := int(stringLen)
14280
+			if intStringLen < 0 {
14281
+				return ErrInvalidLengthControl
14282
+			}
14283
+			postIndex := iNdEx + intStringLen
14284
+			if postIndex > l {
14285
+				return io.ErrUnexpectedEOF
14286
+			}
14287
+			m.ServiceID = string(dAtA[iNdEx:postIndex])
14288
+			iNdEx = postIndex
14289
+		case 2:
14290
+			if wireType != 0 {
14291
+				return fmt.Errorf("proto: wrong wireType = %d for field DesiredTasks", wireType)
14292
+			}
14293
+			m.DesiredTasks = 0
14294
+			for shift := uint(0); ; shift += 7 {
14295
+				if shift >= 64 {
14296
+					return ErrIntOverflowControl
14297
+				}
14298
+				if iNdEx >= l {
14299
+					return io.ErrUnexpectedEOF
14300
+				}
14301
+				b := dAtA[iNdEx]
14302
+				iNdEx++
14303
+				m.DesiredTasks |= (uint64(b) & 0x7F) << shift
14304
+				if b < 0x80 {
14305
+					break
14306
+				}
14307
+			}
14308
+		case 3:
14309
+			if wireType != 0 {
14310
+				return fmt.Errorf("proto: wrong wireType = %d for field RunningTasks", wireType)
14311
+			}
14312
+			m.RunningTasks = 0
14313
+			for shift := uint(0); ; shift += 7 {
14314
+				if shift >= 64 {
14315
+					return ErrIntOverflowControl
14316
+				}
14317
+				if iNdEx >= l {
14318
+					return io.ErrUnexpectedEOF
14319
+				}
14320
+				b := dAtA[iNdEx]
14321
+				iNdEx++
14322
+				m.RunningTasks |= (uint64(b) & 0x7F) << shift
14323
+				if b < 0x80 {
14324
+					break
14325
+				}
14326
+			}
14327
+		default:
14328
+			iNdEx = preIndex
14329
+			skippy, err := skipControl(dAtA[iNdEx:])
14330
+			if err != nil {
14331
+				return err
14332
+			}
14333
+			if skippy < 0 {
14334
+				return ErrInvalidLengthControl
14335
+			}
14336
+			if (iNdEx + skippy) > l {
14337
+				return io.ErrUnexpectedEOF
14338
+			}
14339
+			iNdEx += skippy
14340
+		}
14341
+	}
14342
+
14343
+	if iNdEx > l {
14344
+		return io.ErrUnexpectedEOF
14345
+	}
14346
+	return nil
14347
+}
14071 14348
 func (m *CreateNetworkRequest) Unmarshal(dAtA []byte) error {
14072 14349
 	l := len(dAtA)
14073 14350
 	iNdEx := 0
... ...
@@ -19981,171 +20625,177 @@ var (
19981 19981
 func init() { proto.RegisterFile("github.com/docker/swarmkit/api/control.proto", fileDescriptorControl) }
19982 19982
 
19983 19983
 var fileDescriptorControl = []byte{
19984
-	// 2641 bytes of a gzipped FileDescriptorProto
19985
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xc9, 0x6f, 0x1b, 0xc9,
19986
-	0xf5, 0x36, 0x29, 0x4a, 0x22, 0x1f, 0xb5, 0xb9, 0x2c, 0xdb, 0x1c, 0x8e, 0x7f, 0x92, 0xd1, 0xfe,
19987
-	0xd9, 0xa6, 0x1d, 0x87, 0x9c, 0xa1, 0x33, 0x19, 0xc7, 0x33, 0x93, 0xc4, 0xb2, 0xbc, 0xd0, 0x8b,
19988
-	0x6c, 0xb4, 0x6c, 0x23, 0x97, 0x40, 0x68, 0x91, 0x25, 0x4d, 0x9b, 0x54, 0x37, 0xd3, 0xdd, 0xf4,
19989
-	0x58, 0x08, 0x12, 0x64, 0x71, 0xfe, 0x84, 0x00, 0x41, 0x0e, 0x01, 0x72, 0x0a, 0x90, 0x43, 0x0e,
19990
-	0x39, 0xe5, 0x90, 0x3f, 0xc0, 0xc8, 0x29, 0xc7, 0x9c, 0x94, 0x8c, 0x80, 0x00, 0x39, 0xe5, 0x9a,
19991
-	0x63, 0x82, 0xda, 0x7a, 0x29, 0x56, 0x2f, 0x5c, 0x00, 0xcf, 0x49, 0x62, 0xf5, 0xf7, 0xea, 0xbd,
19992
-	0xaa, 0xf7, 0xd5, 0x57, 0xd5, 0xaf, 0x1a, 0xae, 0xed, 0x9b, 0xde, 0xe7, 0x83, 0xdd, 0x7a, 0xdb,
19993
-	0x3e, 0x68, 0x74, 0xec, 0x76, 0x17, 0x3b, 0x0d, 0xf7, 0x0b, 0xc3, 0x39, 0xe8, 0x9a, 0x5e, 0xc3,
19994
-	0xe8, 0x9b, 0x8d, 0xb6, 0x6d, 0x79, 0x8e, 0xdd, 0xab, 0xf7, 0x1d, 0xdb, 0xb3, 0x11, 0x62, 0x90,
19995
-	0xba, 0x80, 0xd4, 0x5f, 0x7d, 0x58, 0xbd, 0x9a, 0xd2, 0x83, 0xdb, 0xc7, 0x6d, 0x97, 0xd9, 0x57,
19996
-	0xd3, 0xbc, 0xd9, 0xbb, 0x2f, 0x71, 0xdb, 0x13, 0xe8, 0xb4, 0x9e, 0xbd, 0xc3, 0x3e, 0x16, 0xd8,
19997
-	0xd5, 0x7d, 0x7b, 0xdf, 0xa6, 0xff, 0x36, 0xc8, 0x7f, 0xbc, 0xf5, 0xbd, 0x7d, 0xdb, 0xde, 0xef,
19998
-	0xe1, 0x06, 0xfd, 0xb5, 0x3b, 0xd8, 0x6b, 0x18, 0xd6, 0x21, 0x7f, 0xf4, 0x71, 0x42, 0xe7, 0x3e,
19999
-	0xbc, 0xdf, 0x1b, 0xec, 0x9b, 0x16, 0xff, 0xc3, 0x0c, 0xb5, 0x8f, 0x60, 0xe9, 0x1e, 0xf6, 0xb6,
20000
-	0xec, 0x0e, 0xd6, 0xf1, 0x0f, 0x06, 0xd8, 0xf5, 0xd0, 0x05, 0x98, 0xb7, 0xec, 0x0e, 0xde, 0x31,
20001
-	0x3b, 0x95, 0xdc, 0xf9, 0x5c, 0xad, 0xb4, 0x01, 0xc7, 0x47, 0xeb, 0x73, 0x04, 0xd1, 0xda, 0xd4,
20002
-	0xe7, 0xc8, 0xa3, 0x56, 0x47, 0xfb, 0x0e, 0x2c, 0xfb, 0x66, 0x6e, 0xdf, 0xb6, 0x5c, 0x8c, 0xae,
20003
-	0x41, 0x81, 0x3c, 0xa4, 0x46, 0xe5, 0x66, 0xa5, 0x3e, 0x3c, 0xb9, 0x75, 0x8a, 0xa7, 0x28, 0xed,
20004
-	0xcd, 0x2c, 0xac, 0x3c, 0x32, 0x5d, 0xda, 0x85, 0x2b, 0x5c, 0xdf, 0x85, 0xf9, 0x3d, 0xb3, 0xe7,
20005
-	0x61, 0xc7, 0xe5, 0xbd, 0x5c, 0x53, 0xf5, 0x22, 0x9b, 0xd5, 0xef, 0x32, 0x1b, 0x5d, 0x18, 0x57,
20006
-	0x7f, 0x57, 0x80, 0x79, 0xde, 0x88, 0x56, 0x61, 0xd6, 0x32, 0x0e, 0x30, 0xe9, 0x71, 0xa6, 0x56,
20007
-	0xd2, 0xd9, 0x0f, 0xd4, 0x80, 0xb2, 0xd9, 0xd9, 0xe9, 0x3b, 0x78, 0xcf, 0x7c, 0x8d, 0xdd, 0x4a,
20008
-	0x9e, 0x3c, 0xdb, 0x58, 0x3a, 0x3e, 0x5a, 0x87, 0xd6, 0xe6, 0x53, 0xde, 0xaa, 0x83, 0xd9, 0x11,
20009
-	0xff, 0xa3, 0xa7, 0x30, 0xd7, 0x33, 0x76, 0x71, 0xcf, 0xad, 0xcc, 0x9c, 0x9f, 0xa9, 0x95, 0x9b,
20010
-	0x37, 0x46, 0x89, 0xac, 0xfe, 0x88, 0x9a, 0xde, 0xb1, 0x3c, 0xe7, 0x50, 0xe7, 0xfd, 0xa0, 0xc7,
20011
-	0x50, 0x3e, 0xc0, 0x07, 0xbb, 0xd8, 0x71, 0x3f, 0x37, 0xfb, 0x6e, 0xa5, 0x70, 0x7e, 0xa6, 0xb6,
20012
-	0xd4, 0xbc, 0x1c, 0x37, 0x6d, 0xdb, 0x7d, 0xdc, 0xae, 0x3f, 0xf6, 0xf1, 0x1b, 0xf9, 0x95, 0x13,
20013
-	0x7a, 0xd8, 0x1e, 0x7d, 0x13, 0x66, 0x1d, 0xbb, 0x87, 0xdd, 0xca, 0x2c, 0xed, 0xe8, 0x5c, 0xec,
20014
-	0xfc, 0xdb, 0x3d, 0x4c, 0xad, 0x19, 0x1c, 0x5d, 0x80, 0x45, 0x32, 0x25, 0xc1, 0x5c, 0xcc, 0xd1,
20015
-	0x79, 0x5a, 0x20, 0x8d, 0xfe, 0xe8, 0xbf, 0x0f, 0x65, 0xca, 0x09, 0x3e, 0x05, 0xf3, 0x74, 0x0a,
20016
-	0x3e, 0x1d, 0x69, 0x0a, 0x48, 0x63, 0x78, 0x1a, 0xc0, 0xf2, 0x1b, 0xaa, 0xdf, 0x82, 0x72, 0xe8,
20017
-	0x11, 0x5a, 0x81, 0x99, 0x2e, 0x3e, 0x64, 0xec, 0xd3, 0xc9, 0xbf, 0x24, 0x89, 0xaf, 0x8c, 0xde,
20018
-	0x00, 0x57, 0xf2, 0xb4, 0x8d, 0xfd, 0xb8, 0x99, 0xbf, 0x91, 0xab, 0x7e, 0x06, 0xcb, 0x52, 0xcf,
20019
-	0xa3, 0x98, 0x6b, 0xb7, 0xe1, 0x64, 0x28, 0x62, 0xce, 0xe4, 0x3a, 0xcc, 0x92, 0xe0, 0x18, 0x65,
20020
-	0x92, 0xa8, 0xcc, 0x60, 0xda, 0xef, 0x73, 0x70, 0xf2, 0x79, 0xbf, 0x63, 0x78, 0x78, 0xd4, 0x75,
20021
-	0x84, 0xbe, 0x0d, 0x0b, 0x14, 0xf4, 0x0a, 0x3b, 0xae, 0x69, 0x5b, 0x34, 0xc0, 0x72, 0xf3, 0x7d,
20022
-	0x95, 0xc7, 0x17, 0x0c, 0xa2, 0xd3, 0x4c, 0xf0, 0x1f, 0xe8, 0x03, 0x28, 0x10, 0x45, 0xaa, 0xcc,
20023
-	0x50, 0xbb, 0x73, 0x49, 0xec, 0xd1, 0x29, 0x52, 0xdb, 0x00, 0x14, 0x8e, 0x75, 0xac, 0xc5, 0xbb,
20024
-	0x05, 0x27, 0x75, 0x7c, 0x60, 0xbf, 0x1a, 0x7d, 0xbc, 0xab, 0x30, 0xbb, 0x67, 0x3b, 0x6d, 0x96,
20025
-	0x89, 0xa2, 0xce, 0x7e, 0x68, 0xab, 0x80, 0xc2, 0xfd, 0xb1, 0x98, 0xb8, 0x34, 0x3d, 0x33, 0xdc,
20026
-	0x6e, 0xc8, 0x85, 0x67, 0xb8, 0x5d, 0xc9, 0x05, 0x41, 0x10, 0x17, 0xe4, 0x91, 0x2f, 0x4d, 0xcc,
20027
-	0x2c, 0x18, 0x1d, 0x79, 0x98, 0x34, 0x3a, 0x8a, 0xa7, 0x28, 0xed, 0x86, 0x18, 0xdd, 0xc8, 0xae,
20028
-	0xfd, 0x71, 0x84, 0xbd, 0x6b, 0x7f, 0x2e, 0x30, 0xa9, 0x23, 0x8d, 0x63, 0x48, 0x5d, 0xd8, 0x6c,
20029
-	0x58, 0xea, 0xfe, 0x3e, 0xf3, 0xee, 0xa4, 0x4e, 0x15, 0x99, 0x52, 0xea, 0x1a, 0x50, 0x76, 0xb1,
20030
-	0xf3, 0xca, 0x6c, 0x13, 0x76, 0x30, 0xa9, 0xe3, 0x21, 0x6c, 0xb3, 0xe6, 0xd6, 0xa6, 0xab, 0x03,
20031
-	0x87, 0xb4, 0x3a, 0x2e, 0xba, 0x04, 0x45, 0xce, 0x25, 0xa6, 0x67, 0xa5, 0x8d, 0xf2, 0xf1, 0xd1,
20032
-	0xfa, 0x3c, 0x23, 0x93, 0xab, 0xcf, 0x33, 0x36, 0xb9, 0xe8, 0x3e, 0x2c, 0x75, 0xb0, 0x6b, 0x3a,
20033
-	0xb8, 0xb3, 0xe3, 0x7a, 0x86, 0xc7, 0xd5, 0x6b, 0xa9, 0xf9, 0x7f, 0x71, 0x29, 0xde, 0x26, 0x28,
20034
-	0x2a, 0x7f, 0x8b, 0xdc, 0x90, 0xb6, 0x28, 0x64, 0x70, 0x5e, 0x21, 0x83, 0xe7, 0x00, 0x06, 0xfd,
20035
-	0x1d, 0xcf, 0xde, 0x21, 0xeb, 0xa7, 0x52, 0xa4, 0x14, 0x2e, 0x0e, 0xfa, 0xcf, 0xec, 0x4d, 0xc3,
20036
-	0xc3, 0xa8, 0x0a, 0x45, 0x67, 0x60, 0x79, 0x26, 0xc9, 0x40, 0x89, 0x5a, 0xfb, 0xbf, 0x27, 0x50,
20037
-	0x38, 0x21, 0x51, 0x7c, 0xb2, 0x03, 0x89, 0x22, 0x9c, 0x4b, 0x94, 0x28, 0x4a, 0x42, 0x06, 0xd3,
20038
-	0x1e, 0xc2, 0xea, 0x6d, 0x07, 0x1b, 0x1e, 0xe6, 0x13, 0x2e, 0x68, 0x78, 0x9d, 0xeb, 0x07, 0xe3,
20039
-	0xe0, 0xba, 0xaa, 0x1b, 0x6e, 0x11, 0x92, 0x90, 0x2d, 0x38, 0x2d, 0x75, 0xc6, 0xa3, 0xfa, 0x08,
20040
-	0xe6, 0x79, 0x12, 0x79, 0x87, 0xef, 0x27, 0x74, 0xa8, 0x0b, 0xac, 0xf6, 0x12, 0x4e, 0xde, 0xc3,
20041
-	0x9e, 0x14, 0xd9, 0x35, 0x80, 0x80, 0x33, 0x7c, 0xcd, 0x2d, 0x1e, 0x1f, 0xad, 0x97, 0x7c, 0xca,
20042
-	0xe8, 0x25, 0x9f, 0x31, 0xe8, 0x32, 0x2c, 0x9b, 0x96, 0x8b, 0x1d, 0x6f, 0xa7, 0x83, 0xf7, 0x8c,
20043
-	0x41, 0xcf, 0x73, 0xb9, 0xc2, 0x2c, 0xb1, 0xe6, 0x4d, 0xde, 0xaa, 0x3d, 0x04, 0x14, 0xf6, 0x35,
20044
-	0x59, 0xe0, 0x7f, 0xcc, 0xc3, 0x2a, 0x13, 0xd3, 0x89, 0x82, 0xdf, 0x84, 0x65, 0x81, 0x1e, 0x61,
20045
-	0x1f, 0x58, 0xe2, 0x36, 0x62, 0x2b, 0xb8, 0x1e, 0xd9, 0x0a, 0xb2, 0xa5, 0x12, 0x3d, 0x86, 0xa2,
20046
-	0x63, 0xf7, 0x7a, 0xbb, 0x46, 0xbb, 0x5b, 0x29, 0x9c, 0xcf, 0xd5, 0x96, 0x9a, 0x1f, 0xaa, 0x0c,
20047
-	0x55, 0x83, 0xac, 0xeb, 0xdc, 0x50, 0xf7, 0xbb, 0xd0, 0x34, 0x28, 0x8a, 0x56, 0x54, 0x84, 0xc2,
20048
-	0xd6, 0x93, 0xad, 0x3b, 0x2b, 0x27, 0xd0, 0x02, 0x14, 0x9f, 0xea, 0x77, 0x5e, 0xb4, 0x9e, 0x3c,
20049
-	0xdf, 0x5e, 0xc9, 0x11, 0xf6, 0x48, 0xdd, 0x4d, 0x96, 0x84, 0x4d, 0x58, 0x65, 0xa2, 0x3b, 0x49,
20050
-	0x0e, 0xb4, 0xb3, 0x70, 0x5a, 0xea, 0x85, 0xab, 0xf7, 0x9b, 0x19, 0x38, 0x45, 0xd6, 0x1f, 0x6f,
20051
-	0xf7, 0x05, 0xbc, 0x25, 0x0b, 0x78, 0x23, 0x4e, 0x26, 0x25, 0xcb, 0x61, 0x0d, 0xff, 0x6d, 0x7e,
20052
-	0xea, 0x1a, 0xbe, 0x2d, 0x69, 0xf8, 0x27, 0x23, 0x06, 0xa7, 0x94, 0xf1, 0x21, 0x8d, 0x2c, 0x28,
20053
-	0x34, 0x32, 0xac, 0x82, 0xb3, 0xd3, 0x53, 0xc1, 0x27, 0xb0, 0x1a, 0x0d, 0x97, 0x93, 0xe6, 0x63,
20054
-	0x28, 0xf2, 0x24, 0x0a, 0x2d, 0x4c, 0x64, 0x8d, 0x0f, 0x0e, 0x14, 0x71, 0x0b, 0x7b, 0x5f, 0xd8,
20055
-	0x4e, 0x77, 0x04, 0x45, 0xe4, 0x16, 0x2a, 0x45, 0xf4, 0x3b, 0x0b, 0x38, 0x6d, 0xb1, 0xa6, 0x24,
20056
-	0x4e, 0x0b, 0x2b, 0x81, 0xd5, 0x9e, 0x53, 0x45, 0x94, 0x22, 0x43, 0x50, 0x20, 0x33, 0xcd, 0xe7,
20057
-	0x8b, 0xfe, 0x4f, 0x48, 0xce, 0x6d, 0x08, 0xc9, 0xf3, 0x01, 0xc9, 0xb9, 0x2d, 0x21, 0x39, 0x07,
20058
-	0xb4, 0x3a, 0x5c, 0xfc, 0xa6, 0x14, 0xe3, 0xf7, 0xc4, 0xba, 0x9b, 0x7a, 0x98, 0xfe, 0x5a, 0x94,
20059
-	0x22, 0xd5, 0xfe, 0x95, 0x67, 0x6b, 0x91, 0xb7, 0x8f, 0xb1, 0x16, 0x25, 0xcb, 0xe1, 0xb5, 0xf8,
20060
-	0x8b, 0x77, 0xb8, 0x16, 0x63, 0x82, 0x1b, 0x7b, 0x2d, 0x4e, 0x61, 0xbd, 0x05, 0x21, 0x05, 0xeb,
20061
-	0x8d, 0x27, 0x2a, 0x71, 0xbd, 0x89, 0xcc, 0xf9, 0x60, 0xed, 0x16, 0xa5, 0xf4, 0xed, 0xde, 0xc0,
20062
-	0xf5, 0xb0, 0x13, 0xd2, 0xe8, 0x36, 0x6b, 0x91, 0x34, 0x9a, 0xe3, 0x08, 0x2f, 0x38, 0xc0, 0xa7,
20063
-	0xaf, 0xdf, 0x45, 0x40, 0x5f, 0x0e, 0x49, 0xa2, 0xaf, 0xb0, 0x12, 0x58, 0x9f, 0x4b, 0xfc, 0xc1,
20064
-	0x18, 0x5c, 0x92, 0x2c, 0xbf, 0x5a, 0x5c, 0x8a, 0x09, 0xee, 0x5d, 0x72, 0x29, 0x08, 0x29, 0xe0,
20065
-	0x12, 0xcf, 0x46, 0x22, 0x97, 0x44, 0xea, 0x7c, 0xb0, 0xf6, 0xcb, 0x1c, 0x94, 0x1f, 0xe2, 0x43,
20066
-	0xdd, 0xf6, 0x0c, 0x8f, 0x1c, 0x7d, 0xae, 0xc2, 0x49, 0x42, 0x32, 0xec, 0xec, 0xbc, 0xb4, 0x4d,
20067
-	0x6b, 0xc7, 0xb3, 0xbb, 0xd8, 0xa2, 0xa1, 0x15, 0xf5, 0x65, 0xf6, 0xe0, 0x81, 0x6d, 0x5a, 0xcf,
20068
-	0x48, 0x33, 0xba, 0x06, 0xe8, 0xc0, 0xb0, 0x8c, 0xfd, 0x28, 0x98, 0x1d, 0x16, 0x57, 0xf8, 0x13,
20069
-	0x25, 0x7a, 0x60, 0xf5, 0xec, 0x76, 0x77, 0x87, 0x8c, 0x7a, 0x26, 0x82, 0x7e, 0x4e, 0x1f, 0x3c,
20070
-	0xc4, 0x87, 0xda, 0xcf, 0xfc, 0xf3, 0xe0, 0x24, 0x3c, 0x27, 0xe7, 0x41, 0x81, 0x1e, 0xe5, 0x3c,
20071
-	0xc8, 0x6d, 0x46, 0x38, 0x0f, 0x72, 0xef, 0xa1, 0xf3, 0xe0, 0x2d, 0x72, 0x1e, 0x64, 0xb3, 0x4a,
20072
-	0xcf, 0x83, 0x31, 0x86, 0xa1, 0xc9, 0xdf, 0x28, 0xbc, 0x3d, 0x5a, 0x3f, 0xa1, 0xfb, 0x66, 0xc1,
20073
-	0xf9, 0x6e, 0x4a, 0x0b, 0xf5, 0x33, 0x58, 0xa1, 0x27, 0xf6, 0xb6, 0x83, 0x3d, 0x31, 0x9f, 0x57,
20074
-	0xa0, 0xe4, 0xd2, 0x86, 0x60, 0x3a, 0x17, 0x8e, 0x8f, 0xd6, 0x8b, 0x0c, 0xd5, 0xda, 0x24, 0xfb,
20075
-	0x3c, 0xfd, 0xaf, 0xa3, 0xdd, 0xe3, 0x2f, 0x17, 0xcc, 0x9c, 0x87, 0xd2, 0x84, 0x39, 0x06, 0xe0,
20076
-	0x91, 0x54, 0xd5, 0x67, 0x06, 0x6a, 0xc3, 0x91, 0xda, 0x9f, 0x72, 0x70, 0x4a, 0x1c, 0x5c, 0xc7,
20077
-	0x8b, 0x05, 0x6d, 0xc0, 0x12, 0x87, 0x8e, 0x90, 0xd7, 0x45, 0x66, 0x22, 0xd2, 0xda, 0x8c, 0xa4,
20078
-	0x75, 0x2d, 0x3e, 0xf0, 0xd0, 0xf1, 0xe4, 0x41, 0xf0, 0x9a, 0x32, 0xf1, 0x34, 0xfc, 0x33, 0x0f,
20079
-	0x88, 0x9d, 0xc4, 0xc8, 0x4f, 0x5f, 0x36, 0xef, 0xcb, 0xb2, 0x59, 0x8f, 0x3f, 0x71, 0x86, 0x0d,
20080
-	0x87, 0x55, 0xf3, 0xcd, 0xf4, 0x55, 0x53, 0x97, 0x54, 0xf3, 0xe6, 0x68, 0xb1, 0xbd, 0x13, 0xd1,
20081
-	0x7c, 0x28, 0x5e, 0x3b, 0x78, 0x44, 0x3c, 0x65, 0xdf, 0x20, 0x2f, 0x49, 0xb4, 0x89, 0x4b, 0x66,
20082
-	0x52, 0xce, 0x04, 0x54, 0x6b, 0xc1, 0x29, 0xf1, 0xc6, 0x1e, 0xa6, 0x6e, 0x33, 0x72, 0xd6, 0xcd,
20083
-	0xcc, 0xa5, 0x68, 0x57, 0x13, 0x70, 0xe9, 0xbb, 0x70, 0x4a, 0xbc, 0x74, 0x8d, 0xb9, 0xba, 0xcf,
20084
-	0x04, 0x2f, 0x7f, 0xe1, 0x68, 0xb8, 0x68, 0xdc, 0xb6, 0xad, 0x3d, 0x73, 0x3f, 0xd4, 0x6d, 0x9b,
20085
-	0x36, 0x48, 0xdd, 0x32, 0x14, 0xe9, 0x96, 0x3d, 0xf6, 0x45, 0x43, 0x98, 0x07, 0x23, 0x64, 0x80,
20086
-	0xa4, 0x11, 0x72, 0x1b, 0x8e, 0x0c, 0x89, 0xc6, 0xb8, 0xb1, 0x10, 0xd1, 0xe0, 0xd0, 0x51, 0x44,
20087
-	0x83, 0x99, 0x8c, 0x20, 0x1a, 0xcc, 0xb3, 0x4a, 0x34, 0xa6, 0x30, 0x0d, 0x42, 0x34, 0x58, 0xf3,
20088
-	0x18, 0xa2, 0x11, 0x35, 0xfc, 0x6a, 0x89, 0x86, 0x3a, 0xb6, 0x77, 0x29, 0x1a, 0x7e, 0x44, 0x81,
20089
-	0x68, 0xb0, 0x44, 0x24, 0x8a, 0x06, 0xcf, 0x99, 0x80, 0x06, 0xa2, 0x11, 0xa5, 0x6e, 0x06, 0xd1,
20090
-	0x50, 0x71, 0x29, 0xda, 0xd5, 0x04, 0x5c, 0xf2, 0x45, 0x63, 0xec, 0xd5, 0xed, 0x8b, 0x46, 0x34,
20091
-	0x1a, 0xed, 0x47, 0x70, 0x86, 0x45, 0x79, 0xe7, 0xb5, 0x87, 0x2d, 0xba, 0x8e, 0x78, 0xe7, 0xb7,
20092
-	0xa0, 0x6c, 0x58, 0x16, 0x3f, 0xe1, 0xb8, 0x49, 0xb5, 0x81, 0x5b, 0x01, 0x4c, 0x0f, 0xdb, 0xa0,
20093
-	0xf3, 0x50, 0xee, 0x60, 0xb7, 0xed, 0x98, 0x7d, 0x4f, 0xac, 0xe1, 0x92, 0x1e, 0x6e, 0xd2, 0x5e,
20094
-	0xc0, 0xd9, 0x21, 0xf7, 0x7c, 0x9e, 0x3e, 0x81, 0x12, 0x16, 0x8d, 0xdc, 0xbb, 0xb2, 0xc4, 0x1d,
20095
-	0x58, 0x06, 0x78, 0xed, 0x11, 0x9c, 0x61, 0xc3, 0x1d, 0x1a, 0x56, 0x13, 0x16, 0x7c, 0x58, 0x30,
20096
-	0x6d, 0xcb, 0xc7, 0x47, 0xeb, 0x65, 0x1f, 0xdb, 0xda, 0xd4, 0xcb, 0x3e, 0xa8, 0xd5, 0xd1, 0xde,
20097
-	0x83, 0xb3, 0x43, 0xbd, 0xf1, 0xf9, 0x6b, 0xc1, 0xa9, 0x7b, 0xd8, 0x9b, 0x8a, 0x97, 0x6d, 0x58,
20098
-	0x8d, 0x76, 0x35, 0x8d, 0x89, 0xf8, 0x4d, 0x4e, 0x94, 0x69, 0x74, 0xec, 0xda, 0x03, 0x27, 0xa8,
20099
-	0x15, 0x4e, 0x21, 0xbf, 0x08, 0x0a, 0x5d, 0xd3, 0xe2, 0xc5, 0x0d, 0x9d, 0xfe, 0x8f, 0xea, 0x30,
20100
-	0xdf, 0x37, 0x0e, 0x7b, 0xb6, 0xd1, 0xe1, 0xca, 0xbb, 0x5a, 0x67, 0x57, 0xf8, 0x75, 0x71, 0x27,
20101
-	0x5f, 0xbf, 0x65, 0x1d, 0xea, 0x02, 0xa4, 0xe9, 0x82, 0x80, 0x41, 0x7c, 0x7c, 0xdc, 0x37, 0xa0,
20102
-	0xe8, 0xf0, 0x36, 0x1e, 0x9d, 0xf2, 0xae, 0xcf, 0xb7, 0xf3, 0xd1, 0xda, 0x7d, 0x51, 0x4c, 0x91,
20103
-	0xc7, 0xdc, 0x80, 0xb2, 0x00, 0x05, 0x59, 0xa1, 0x82, 0x28, 0x90, 0xad, 0x4d, 0x1d, 0x04, 0xa4,
20104
-	0xd5, 0xd1, 0x2a, 0x82, 0x47, 0x72, 0x74, 0xda, 0xcf, 0xf3, 0xe2, 0xcc, 0x3f, 0xa9, 0x13, 0x74,
20105
-	0x17, 0x56, 0x7c, 0x83, 0x11, 0xf6, 0xbb, 0x65, 0x61, 0x24, 0x76, 0x3c, 0x29, 0xa3, 0x33, 0x63,
20106
-	0x64, 0x34, 0x94, 0xbd, 0x42, 0xc6, 0xec, 0xc9, 0x93, 0x30, 0x71, 0xf6, 0xee, 0xd0, 0x92, 0xc7,
20107
-	0xc4, 0xa9, 0x7b, 0x42, 0x57, 0xe6, 0x14, 0xe3, 0xfa, 0x6f, 0x9e, 0xbd, 0xd3, 0x8b, 0x47, 0xfe,
20108
-	0x96, 0xfe, 0x40, 0xde, 0xd2, 0x3f, 0x88, 0xdb, 0x36, 0x65, 0xd3, 0xe1, 0x4d, 0xfd, 0xd7, 0xd3,
20109
-	0xdf, 0xd4, 0x9f, 0x49, 0x9b, 0xfa, 0xa7, 0xa3, 0x46, 0x37, 0x7e, 0x61, 0x5c, 0x08, 0xc4, 0x6c,
20110
-	0x20, 0x10, 0x93, 0x6c, 0xf5, 0xdb, 0x70, 0x5a, 0x8a, 0x93, 0x27, 0xf5, 0x26, 0x94, 0x44, 0x9a,
20111
-	0xc4, 0x76, 0x9f, 0x9c, 0xd5, 0x00, 0xde, 0xfc, 0x8f, 0x06, 0xf3, 0xb7, 0xd9, 0x37, 0x52, 0xc8,
20112
-	0x84, 0x79, 0xfe, 0x89, 0x0f, 0xd2, 0x54, 0xf6, 0xd1, 0xcf, 0x86, 0xaa, 0x17, 0x12, 0x31, 0x5c,
20113
-	0x28, 0x4e, 0xff, 0xe5, 0x0f, 0xff, 0xfe, 0x55, 0x7e, 0x19, 0x16, 0x29, 0xe8, 0xeb, 0xbc, 0x80,
20114
-	0x82, 0x6c, 0x28, 0xf9, 0x5f, 0x61, 0xa0, 0xff, 0xcf, 0xf2, 0x59, 0x49, 0xf5, 0x62, 0x0a, 0x2a,
20115
-	0xd9, 0xa1, 0x03, 0x10, 0x7c, 0x04, 0x81, 0x2e, 0xc6, 0x5f, 0x79, 0x85, 0x47, 0x78, 0x29, 0x0d,
20116
-	0x96, 0xea, 0x33, 0xf8, 0xc8, 0x41, 0xed, 0x73, 0xe8, 0xa3, 0x0a, 0xb5, 0x4f, 0xc5, 0xb7, 0x12,
20117
-	0x31, 0x3e, 0x59, 0x0e, 0x9f, 0x19, 0x6e, 0x37, 0x36, 0x87, 0xa1, 0x8f, 0x1c, 0x62, 0x73, 0x18,
20118
-	0xf9, 0x9c, 0x21, 0x39, 0x87, 0xf4, 0x9a, 0x3a, 0x3e, 0x87, 0xe1, 0x4f, 0x06, 0xe2, 0x73, 0x18,
20119
-	0xb9, 0xeb, 0x4e, 0x9d, 0x4f, 0x3a, 0xbc, 0x84, 0xf9, 0x0c, 0x8f, 0xf0, 0x52, 0x1a, 0x2c, 0xd5,
20120
-	0x67, 0x70, 0x7b, 0xac, 0xf6, 0x39, 0x74, 0x93, 0xad, 0xf6, 0x39, 0x7c, 0x09, 0x1d, 0xe7, 0xf3,
20121
-	0x35, 0x2c, 0x84, 0x6f, 0xbe, 0xd0, 0xe5, 0x8c, 0x57, 0x79, 0xd5, 0x5a, 0x3a, 0x30, 0xd9, 0xf3,
20122
-	0x0f, 0x61, 0x31, 0x72, 0xcf, 0x8f, 0x94, 0x3d, 0xaa, 0xbe, 0x2b, 0xa8, 0x5e, 0xc9, 0x80, 0x4c,
20123
-	0x75, 0x1e, 0xb9, 0x26, 0x56, 0x3b, 0x57, 0x5d, 0x4c, 0xab, 0x9d, 0x2b, 0xef, 0x9c, 0x13, 0x9c,
20124
-	0x47, 0x6e, 0x83, 0xd5, 0xce, 0x55, 0xd7, 0xce, 0x6a, 0xe7, 0xea, 0xab, 0xe5, 0x44, 0x92, 0xf1,
20125
-	0x1b, 0x94, 0x58, 0x92, 0x45, 0x6f, 0xdd, 0x62, 0x49, 0x26, 0x5f, 0xa1, 0x25, 0x93, 0x4c, 0x5c,
20126
-	0xf7, 0xc4, 0x93, 0x4c, 0xba, 0xa3, 0x8a, 0x27, 0x99, 0x7c, 0x73, 0x94, 0x4a, 0x32, 0x31, 0xe0,
20127
-	0x04, 0x92, 0x49, 0x63, 0xbe, 0x92, 0x01, 0x99, 0x31, 0xcf, 0x89, 0xce, 0x55, 0xd7, 0x9c, 0x49,
20128
-	0x79, 0xce, 0xe8, 0x9c, 0xe5, 0x99, 0xd7, 0xbb, 0x63, 0xf3, 0x1c, 0xbd, 0x49, 0x88, 0xcd, 0xb3,
20129
-	0x54, 0x6c, 0x4f, 0xc9, 0xb3, 0xb8, 0x8a, 0x89, 0xcf, 0xb3, 0x74, 0x7f, 0x14, 0x9f, 0x67, 0xf9,
20130
-	0x56, 0x27, 0x75, 0x3d, 0x8b, 0x01, 0x27, 0xac, 0x67, 0x69, 0xcc, 0x57, 0x32, 0x20, 0x53, 0x37,
20131
-	0x27, 0xff, 0x12, 0x40, 0xbd, 0x39, 0xc9, 0x57, 0x0c, 0xd5, 0x8b, 0x29, 0xa8, 0xd4, 0x79, 0x0e,
20132
-	0x57, 0xdc, 0xd5, 0xf3, 0xac, 0xb8, 0x4d, 0xa8, 0xd6, 0xd2, 0x81, 0xc9, 0x9e, 0x07, 0x50, 0x0e,
20133
-	0xd5, 0x8d, 0xd1, 0xa5, 0x6c, 0xa5, 0xee, 0xea, 0xe5, 0x54, 0x5c, 0xea, 0x80, 0xc3, 0x65, 0x61,
20134
-	0xf5, 0x80, 0x15, 0x35, 0xe8, 0x6a, 0x2d, 0x1d, 0x98, 0xea, 0x39, 0x5c, 0x02, 0x56, 0x7b, 0x56,
20135
-	0x94, 0x99, 0xab, 0xb5, 0x74, 0x60, 0x16, 0x56, 0xb1, 0x22, 0x52, 0x2c, 0xab, 0x22, 0x55, 0xaa,
20136
-	0x58, 0x56, 0x49, 0x95, 0xa8, 0x34, 0x56, 0x71, 0x9f, 0x09, 0xac, 0x8a, 0xba, 0xad, 0xa5, 0x03,
20137
-	0x33, 0xb1, 0x8a, 0x17, 0x16, 0xe3, 0x59, 0x15, 0xad, 0x85, 0xc6, 0xb3, 0x4a, 0xaa, 0x50, 0xa6,
20138
-	0xb2, 0x2a, 0x69, 0xc0, 0x8a, 0x22, 0x65, 0x12, 0xab, 0x32, 0x4f, 0x75, 0xb8, 0x46, 0x98, 0xc4,
20139
-	0xaa, 0x0c, 0x9e, 0x95, 0xe5, 0xc6, 0x78, 0xcf, 0xe1, 0xd2, 0x97, 0xda, 0xb3, 0xa2, 0xce, 0xa6,
20140
-	0xf6, 0xac, 0xaa, 0xa2, 0xc5, 0x79, 0xfe, 0x69, 0x0e, 0x96, 0xa5, 0x0a, 0x24, 0xba, 0x1a, 0x3f,
20141
-	0x91, 0x43, 0x01, 0x7c, 0x2d, 0x13, 0x36, 0x3d, 0x06, 0xa9, 0xbe, 0xa8, 0x8e, 0x41, 0x5d, 0xd2,
20142
-	0x54, 0xc7, 0x10, 0x57, 0xb0, 0x8c, 0x27, 0x7b, 0xa8, 0x5a, 0x82, 0xe2, 0xb6, 0x5c, 0xa9, 0x2a,
20143
-	0x53, 0xbd, 0x9c, 0x8a, 0x4b, 0x76, 0xfb, 0x63, 0x58, 0x8a, 0xd6, 0x8f, 0x50, 0xc2, 0xc6, 0x27,
20144
-	0x3b, 0xbf, 0x9a, 0x05, 0x9a, 0xba, 0x43, 0x47, 0x2a, 0x0a, 0xa8, 0x96, 0xb5, 0x38, 0xa2, 0xde,
20145
-	0xa1, 0x95, 0xe5, 0x89, 0x84, 0xc1, 0x47, 0x4b, 0x9f, 0x28, 0xe1, 0x74, 0x97, 0x69, 0xf0, 0xea,
20146
-	0x4a, 0x6a, 0x82, 0xff, 0x68, 0x71, 0x13, 0x25, 0x1c, 0xf0, 0x32, 0xf9, 0x8f, 0xa9, 0x95, 0xaa,
20147
-	0xfd, 0x6f, 0x54, 0xde, 0x7e, 0xb9, 0x76, 0xe2, 0x6f, 0x5f, 0xae, 0x9d, 0xf8, 0xc9, 0xf1, 0x5a,
20148
-	0xee, 0xed, 0xf1, 0x5a, 0xee, 0xaf, 0xc7, 0x6b, 0xb9, 0x7f, 0x1c, 0xaf, 0xe5, 0x76, 0xe7, 0x68,
20149
-	0xb5, 0xf1, 0xfa, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0e, 0xa1, 0x5f, 0x52, 0xdc, 0x36, 0x00,
20150
-	0x00,
19984
+	// 2744 bytes of a gzipped FileDescriptorProto
19985
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0x49, 0x6f, 0x1b, 0xc9,
19986
+	0x15, 0x36, 0x29, 0x4a, 0x22, 0x1f, 0xb5, 0xb9, 0x2c, 0xdb, 0x1c, 0xda, 0x91, 0x8c, 0xf6, 0x46,
19987
+	0x3b, 0x0e, 0x39, 0x43, 0x67, 0x32, 0x8e, 0x67, 0x9c, 0xc4, 0xb2, 0xbc, 0xd0, 0x8b, 0x6c, 0xb4,
19988
+	0x64, 0x23, 0x39, 0x04, 0x02, 0x45, 0x96, 0x34, 0x6d, 0x52, 0xdd, 0x4c, 0x77, 0xd3, 0x63, 0x21,
19989
+	0x48, 0x90, 0xc5, 0xc1, 0x9c, 0x72, 0x0c, 0x10, 0xe4, 0x10, 0x20, 0xa7, 0x00, 0x39, 0xe4, 0x90,
19990
+	0x53, 0x0e, 0xf9, 0x01, 0x46, 0x4e, 0x39, 0xe6, 0xa4, 0x64, 0x04, 0x04, 0xc8, 0x29, 0x7f, 0x21,
19991
+	0x83, 0xda, 0x7a, 0x29, 0x56, 0x2f, 0x5c, 0x00, 0xcf, 0x49, 0x62, 0xf5, 0xf7, 0xea, 0xbd, 0x7a,
19992
+	0xef, 0xf5, 0x57, 0xd5, 0xef, 0x15, 0x5c, 0xdb, 0x33, 0xdc, 0x4f, 0xfb, 0x3b, 0xd5, 0x96, 0xb5,
19993
+	0x5f, 0x6b, 0x5b, 0xad, 0x0e, 0xb6, 0x6b, 0xce, 0x67, 0x4d, 0x7b, 0xbf, 0x63, 0xb8, 0xb5, 0x66,
19994
+	0xcf, 0xa8, 0xb5, 0x2c, 0xd3, 0xb5, 0xad, 0x6e, 0xb5, 0x67, 0x5b, 0xae, 0x85, 0x10, 0x83, 0x54,
19995
+	0x05, 0xa4, 0xfa, 0xea, 0x83, 0xf2, 0xd5, 0x84, 0x19, 0x9c, 0x1e, 0x6e, 0x39, 0x4c, 0xbe, 0x9c,
19996
+	0xa4, 0xcd, 0xda, 0x79, 0x89, 0x5b, 0xae, 0x40, 0x27, 0xcd, 0xec, 0x1e, 0xf4, 0xb0, 0xc0, 0x2e,
19997
+	0xef, 0x59, 0x7b, 0x16, 0xfd, 0xb7, 0x46, 0xfe, 0xe3, 0xa3, 0xef, 0xed, 0x59, 0xd6, 0x5e, 0x17,
19998
+	0xd7, 0xe8, 0xaf, 0x9d, 0xfe, 0x6e, 0xad, 0x69, 0x1e, 0xf0, 0x47, 0x1f, 0xc5, 0x4c, 0xee, 0xc1,
19999
+	0x7b, 0xdd, 0xfe, 0x9e, 0x61, 0xf2, 0x3f, 0x4c, 0x50, 0xfb, 0x10, 0x16, 0xee, 0x63, 0x77, 0xc3,
20000
+	0x6a, 0x63, 0x1d, 0xff, 0xa8, 0x8f, 0x1d, 0x17, 0x9d, 0x87, 0x59, 0xd3, 0x6a, 0xe3, 0x6d, 0xa3,
20001
+	0x5d, 0xca, 0x9c, 0xcb, 0x54, 0x0a, 0x6b, 0x70, 0x74, 0xb8, 0x3a, 0x43, 0x10, 0x8d, 0x75, 0x7d,
20002
+	0x86, 0x3c, 0x6a, 0xb4, 0xb5, 0xef, 0xc2, 0xa2, 0x27, 0xe6, 0xf4, 0x2c, 0xd3, 0xc1, 0xe8, 0x1a,
20003
+	0xe4, 0xc8, 0x43, 0x2a, 0x54, 0xac, 0x97, 0xaa, 0x83, 0xce, 0xad, 0x52, 0x3c, 0x45, 0x69, 0x6f,
20004
+	0xa6, 0x61, 0xe9, 0xb1, 0xe1, 0xd0, 0x29, 0x1c, 0xa1, 0xfa, 0x1e, 0xcc, 0xee, 0x1a, 0x5d, 0x17,
20005
+	0xdb, 0x0e, 0x9f, 0xe5, 0x9a, 0x6a, 0x16, 0x59, 0xac, 0x7a, 0x8f, 0xc9, 0xe8, 0x42, 0xb8, 0xfc,
20006
+	0xc7, 0x1c, 0xcc, 0xf2, 0x41, 0xb4, 0x0c, 0xd3, 0x66, 0x73, 0x1f, 0x93, 0x19, 0xa7, 0x2a, 0x05,
20007
+	0x9d, 0xfd, 0x40, 0x35, 0x28, 0x1a, 0xed, 0xed, 0x9e, 0x8d, 0x77, 0x8d, 0xd7, 0xd8, 0x29, 0x65,
20008
+	0xc9, 0xb3, 0xb5, 0x85, 0xa3, 0xc3, 0x55, 0x68, 0xac, 0x3f, 0xe3, 0xa3, 0x3a, 0x18, 0x6d, 0xf1,
20009
+	0x3f, 0x7a, 0x06, 0x33, 0xdd, 0xe6, 0x0e, 0xee, 0x3a, 0xa5, 0xa9, 0x73, 0x53, 0x95, 0x62, 0xfd,
20010
+	0xc6, 0x30, 0x96, 0x55, 0x1f, 0x53, 0xd1, 0xbb, 0xa6, 0x6b, 0x1f, 0xe8, 0x7c, 0x1e, 0xf4, 0x04,
20011
+	0x8a, 0xfb, 0x78, 0x7f, 0x07, 0xdb, 0xce, 0xa7, 0x46, 0xcf, 0x29, 0xe5, 0xce, 0x4d, 0x55, 0x16,
20012
+	0xea, 0x97, 0xa3, 0xdc, 0xb6, 0xd9, 0xc3, 0xad, 0xea, 0x13, 0x0f, 0xbf, 0x96, 0x5d, 0x3a, 0xa6,
20013
+	0x07, 0xe5, 0xd1, 0xb7, 0x60, 0xda, 0xb6, 0xba, 0xd8, 0x29, 0x4d, 0xd3, 0x89, 0xce, 0x46, 0xfa,
20014
+	0xdf, 0xea, 0x62, 0x2a, 0xcd, 0xe0, 0xe8, 0x3c, 0xcc, 0x13, 0x97, 0xf8, 0xbe, 0x98, 0xa1, 0x7e,
20015
+	0x9a, 0x23, 0x83, 0xde, 0xea, 0x7f, 0x08, 0x45, 0x9a, 0x13, 0xdc, 0x05, 0xb3, 0xd4, 0x05, 0x9f,
20016
+	0x0c, 0xe5, 0x02, 0x32, 0x18, 0x74, 0x03, 0x98, 0xde, 0x40, 0xf9, 0xdb, 0x50, 0x0c, 0x3c, 0x42,
20017
+	0x4b, 0x30, 0xd5, 0xc1, 0x07, 0x2c, 0xfb, 0x74, 0xf2, 0x2f, 0x09, 0xe2, 0xab, 0x66, 0xb7, 0x8f,
20018
+	0x4b, 0x59, 0x3a, 0xc6, 0x7e, 0xdc, 0xcc, 0xde, 0xc8, 0x94, 0x6f, 0xc1, 0xa2, 0x34, 0xf3, 0x30,
20019
+	0xe2, 0xda, 0x1d, 0x38, 0x1e, 0xb0, 0x98, 0x67, 0x72, 0x15, 0xa6, 0x89, 0x71, 0x2c, 0x65, 0xe2,
20020
+	0x52, 0x99, 0xc1, 0xb4, 0x3f, 0x65, 0xe0, 0xf8, 0xf3, 0x5e, 0xbb, 0xe9, 0xe2, 0x61, 0xdf, 0x23,
20021
+	0xf4, 0x1d, 0x98, 0xa3, 0xa0, 0x57, 0xd8, 0x76, 0x0c, 0xcb, 0xa4, 0x06, 0x16, 0xeb, 0x67, 0x54,
20022
+	0x1a, 0x5f, 0x30, 0x88, 0x4e, 0x23, 0xc1, 0x7f, 0xa0, 0xf7, 0x21, 0x47, 0x18, 0xa9, 0x34, 0x45,
20023
+	0xe5, 0xce, 0xc6, 0x65, 0x8f, 0x4e, 0x91, 0xda, 0x1a, 0xa0, 0xa0, 0xad, 0x23, 0xbd, 0xbc, 0x1b,
20024
+	0x70, 0x5c, 0xc7, 0xfb, 0xd6, 0xab, 0xe1, 0xd7, 0xbb, 0x0c, 0xd3, 0xbb, 0x96, 0xdd, 0x62, 0x91,
20025
+	0xc8, 0xeb, 0xec, 0x87, 0xb6, 0x0c, 0x28, 0x38, 0x1f, 0xb3, 0x89, 0x53, 0xd3, 0x56, 0xd3, 0xe9,
20026
+	0x04, 0x54, 0xb8, 0x4d, 0xa7, 0x23, 0xa9, 0x20, 0x08, 0xa2, 0x82, 0x3c, 0xf2, 0xa8, 0x89, 0x89,
20027
+	0xf9, 0xab, 0x23, 0x0f, 0xe3, 0x56, 0x47, 0xf1, 0x14, 0xa5, 0xdd, 0x10, 0xab, 0x1b, 0x5a, 0xb5,
20028
+	0xb7, 0x8e, 0xa0, 0x76, 0xed, 0x6f, 0x39, 0x46, 0x75, 0x64, 0x70, 0x04, 0xaa, 0x0b, 0x8a, 0x0d,
20029
+	0x52, 0xdd, 0xbf, 0xa6, 0xde, 0x1d, 0xd5, 0xa9, 0x2c, 0x53, 0x52, 0x5d, 0x0d, 0x8a, 0x0e, 0xb6,
20030
+	0x5f, 0x19, 0x2d, 0x92, 0x1d, 0x8c, 0xea, 0xb8, 0x09, 0x9b, 0x6c, 0xb8, 0xb1, 0xee, 0xe8, 0xc0,
20031
+	0x21, 0x8d, 0xb6, 0x83, 0x2e, 0x41, 0x9e, 0xe7, 0x12, 0xe3, 0xb3, 0xc2, 0x5a, 0xf1, 0xe8, 0x70,
20032
+	0x75, 0x96, 0x25, 0x93, 0xa3, 0xcf, 0xb2, 0x6c, 0x72, 0xd0, 0x03, 0x58, 0x68, 0x63, 0xc7, 0xb0,
20033
+	0x71, 0x7b, 0xdb, 0x71, 0x9b, 0x2e, 0x67, 0xaf, 0x85, 0xfa, 0xd7, 0xa2, 0x42, 0xbc, 0x49, 0x50,
20034
+	0x94, 0xfe, 0xe6, 0xb9, 0x20, 0x1d, 0x51, 0xd0, 0xe0, 0xac, 0x82, 0x06, 0xcf, 0x02, 0xf4, 0x7b,
20035
+	0xdb, 0xae, 0xb5, 0x4d, 0xde, 0x9f, 0x52, 0x9e, 0xa6, 0x70, 0xbe, 0xdf, 0xdb, 0xb2, 0xd6, 0x9b,
20036
+	0x2e, 0x46, 0x65, 0xc8, 0xdb, 0x7d, 0xd3, 0x35, 0x48, 0x04, 0x0a, 0x54, 0xda, 0xfb, 0x3d, 0x06,
20037
+	0xc3, 0x09, 0x8a, 0xe2, 0xce, 0xf6, 0x29, 0x8a, 0xe4, 0x5c, 0x2c, 0x45, 0xd1, 0x24, 0x64, 0x30,
20038
+	0xed, 0x11, 0x2c, 0xdf, 0xb1, 0x71, 0xd3, 0xc5, 0xdc, 0xe1, 0x22, 0x0d, 0xaf, 0x73, 0xfe, 0x60,
20039
+	0x39, 0xb8, 0xaa, 0x9a, 0x86, 0x4b, 0x04, 0x28, 0x64, 0x03, 0x4e, 0x4a, 0x93, 0x71, 0xab, 0x3e,
20040
+	0x84, 0x59, 0x1e, 0x44, 0x3e, 0xe1, 0x99, 0x98, 0x09, 0x75, 0x81, 0xd5, 0x5e, 0xc2, 0xf1, 0xfb,
20041
+	0xd8, 0x95, 0x2c, 0xbb, 0x06, 0xe0, 0xe7, 0x0c, 0x7f, 0xe7, 0xe6, 0x8f, 0x0e, 0x57, 0x0b, 0x5e,
20042
+	0xca, 0xe8, 0x05, 0x2f, 0x63, 0xd0, 0x65, 0x58, 0x34, 0x4c, 0x07, 0xdb, 0xee, 0x76, 0x1b, 0xef,
20043
+	0x36, 0xfb, 0x5d, 0xd7, 0xe1, 0x0c, 0xb3, 0xc0, 0x86, 0xd7, 0xf9, 0xa8, 0xf6, 0x08, 0x50, 0x50,
20044
+	0xd7, 0x78, 0x86, 0xff, 0x25, 0x0b, 0xcb, 0x8c, 0x4c, 0xc7, 0x32, 0x7e, 0x1d, 0x16, 0x05, 0x7a,
20045
+	0x88, 0x7d, 0x60, 0x81, 0xcb, 0x88, 0xad, 0xe0, 0x7a, 0x68, 0x2b, 0x48, 0x17, 0x4a, 0xf4, 0x04,
20046
+	0xf2, 0xb6, 0xd5, 0xed, 0xee, 0x34, 0x5b, 0x9d, 0x52, 0xee, 0x5c, 0xa6, 0xb2, 0x50, 0xff, 0x40,
20047
+	0x25, 0xa8, 0x5a, 0x64, 0x55, 0xe7, 0x82, 0xba, 0x37, 0x85, 0xa6, 0x41, 0x5e, 0x8c, 0xa2, 0x3c,
20048
+	0xe4, 0x36, 0x9e, 0x6e, 0xdc, 0x5d, 0x3a, 0x86, 0xe6, 0x20, 0xff, 0x4c, 0xbf, 0xfb, 0xa2, 0xf1,
20049
+	0xf4, 0xf9, 0xe6, 0x52, 0x86, 0x64, 0x8f, 0x34, 0xdd, 0x78, 0x41, 0x58, 0x87, 0x65, 0x46, 0xba,
20050
+	0xe3, 0xc4, 0x40, 0x3b, 0x0d, 0x27, 0xa5, 0x59, 0x38, 0x7b, 0xbf, 0x99, 0x82, 0x13, 0xe4, 0xfd,
20051
+	0xe3, 0xe3, 0x1e, 0x81, 0x37, 0x64, 0x02, 0xaf, 0x45, 0xd1, 0xa4, 0x24, 0x39, 0xc8, 0xe1, 0x7f,
20052
+	0xc8, 0x4e, 0x9c, 0xc3, 0x37, 0x25, 0x0e, 0xff, 0x78, 0x48, 0xe3, 0x94, 0x34, 0x3e, 0xc0, 0x91,
20053
+	0x39, 0x05, 0x47, 0x06, 0x59, 0x70, 0x7a, 0x72, 0x2c, 0xf8, 0x14, 0x96, 0xc3, 0xe6, 0xf2, 0xa4,
20054
+	0xf9, 0x08, 0xf2, 0x3c, 0x88, 0x82, 0x0b, 0x63, 0xb3, 0xc6, 0x03, 0x6b, 0x37, 0xa0, 0x1c, 0x98,
20055
+	0x90, 0xec, 0x02, 0x7d, 0xc7, 0x8f, 0x6e, 0x59, 0x9a, 0xb6, 0x10, 0x90, 0xfc, 0x45, 0x16, 0xce,
20056
+	0x28, 0x45, 0xb9, 0x49, 0x3f, 0x80, 0xbc, 0xc3, 0xc7, 0xb8, 0x49, 0xb7, 0x12, 0xbc, 0x2f, 0x4f,
20057
+	0x51, 0x0d, 0x8d, 0xeb, 0xde, 0x74, 0xe5, 0xcf, 0x33, 0x30, 0x1f, 0x7a, 0x36, 0x24, 0xd3, 0x9c,
20058
+	0x07, 0xb1, 0xed, 0x6d, 0xb3, 0xed, 0x83, 0xf8, 0x39, 0xa7, 0xcf, 0xf1, 0x41, 0xba, 0xc7, 0x10,
20059
+	0x90, 0xdd, 0x37, 0x4d, 0xc3, 0xdc, 0xe3, 0xa0, 0x29, 0x06, 0xe2, 0x83, 0x5b, 0xe1, 0x0d, 0x65,
20060
+	0x03, 0xbb, 0x9f, 0x59, 0x76, 0x67, 0x88, 0x0d, 0x85, 0x4b, 0xa8, 0x36, 0x14, 0x6f, 0x32, 0x9f,
20061
+	0x12, 0x4c, 0x36, 0x14, 0x47, 0x09, 0x42, 0x4a, 0x60, 0xb5, 0xe7, 0x74, 0x43, 0x91, 0x2c, 0x43,
20062
+	0x90, 0x23, 0x89, 0xca, 0xd3, 0x8d, 0xfe, 0x4f, 0xbc, 0xc7, 0x65, 0x88, 0xf7, 0xb2, 0xbe, 0xf7,
20063
+	0xb8, 0x2c, 0xf1, 0x1e, 0x07, 0x34, 0xda, 0x7c, 0xef, 0x98, 0x90, 0x8d, 0xdf, 0x17, 0xb4, 0x35,
20064
+	0x71, 0x33, 0x3d, 0x2a, 0x93, 0x2c, 0xd5, 0xfe, 0x9b, 0x65, 0x54, 0xc6, 0xc7, 0x47, 0xa0, 0x32,
20065
+	0x49, 0x72, 0x90, 0xca, 0x7e, 0xf5, 0x0e, 0xa9, 0x2c, 0xc2, 0xb8, 0x91, 0xa9, 0x6c, 0x02, 0x74,
20066
+	0xe5, 0x9b, 0xe4, 0xd3, 0x15, 0x0f, 0x54, 0x2c, 0x5d, 0x89, 0xc8, 0x79, 0x60, 0xed, 0x36, 0x4d,
20067
+	0xe9, 0x3b, 0xdd, 0xbe, 0xe3, 0x62, 0x3b, 0xb0, 0xc5, 0xb5, 0xd8, 0x88, 0xf4, 0xf2, 0x73, 0x1c,
20068
+	0xc9, 0x0b, 0x0e, 0xf0, 0xd2, 0xd7, 0x9b, 0xc2, 0x4f, 0x5f, 0x0e, 0x89, 0x4b, 0x5f, 0x21, 0x25,
20069
+	0xb0, 0x5e, 0x2e, 0xf1, 0x07, 0x23, 0xe4, 0x92, 0x24, 0xf9, 0xd5, 0xca, 0xa5, 0x08, 0xe3, 0xde,
20070
+	0x65, 0x2e, 0xf9, 0x26, 0xf9, 0xb9, 0xc4, 0xa3, 0x11, 0x9b, 0x4b, 0x22, 0x74, 0x1e, 0x58, 0xfb,
20071
+	0x4d, 0x06, 0x8a, 0x8f, 0xf0, 0x81, 0x6e, 0xb9, 0x4d, 0x97, 0x9c, 0x1c, 0xaf, 0xc2, 0x71, 0x92,
20072
+	0x64, 0xd8, 0xde, 0x7e, 0x69, 0x19, 0xe6, 0xb6, 0x6b, 0x75, 0xb0, 0x49, 0x4d, 0xcb, 0xeb, 0x8b,
20073
+	0xec, 0xc1, 0x43, 0xcb, 0x30, 0xb7, 0xc8, 0x30, 0xba, 0x06, 0x68, 0xbf, 0x69, 0x36, 0xf7, 0xc2,
20074
+	0x60, 0x76, 0xd6, 0x5e, 0xe2, 0x4f, 0x94, 0xe8, 0xbe, 0xd9, 0xb5, 0x5a, 0x9d, 0x6d, 0xb2, 0xea,
20075
+	0xa9, 0x10, 0xfa, 0x39, 0x7d, 0xf0, 0x08, 0x1f, 0x90, 0x8d, 0x95, 0x1f, 0xa7, 0xc7, 0xc9, 0x73,
20076
+	0x72, 0x9c, 0x16, 0xe8, 0x61, 0x8e, 0xd3, 0x5c, 0x66, 0x88, 0xe3, 0x34, 0xd7, 0x1e, 0x38, 0x4e,
20077
+	0xdf, 0x26, 0xc7, 0x69, 0xe6, 0x55, 0x7a, 0x9c, 0x8e, 0x10, 0x0c, 0x38, 0x7f, 0x2d, 0xf7, 0xf6,
20078
+	0x70, 0xf5, 0x98, 0xee, 0x89, 0xf9, 0xc7, 0xe3, 0x09, 0xbd, 0xa8, 0xb7, 0x60, 0x89, 0x7e, 0xf0,
20079
+	0xb4, 0x6c, 0xec, 0x0a, 0x7f, 0x5e, 0x81, 0x82, 0x43, 0x07, 0x7c, 0x77, 0xce, 0x1d, 0x1d, 0xae,
20080
+	0xe6, 0x19, 0xaa, 0xb1, 0x4e, 0x0e, 0x3b, 0xf4, 0xbf, 0xb6, 0x76, 0x9f, 0x7f, 0x9b, 0x31, 0x71,
20081
+	0x6e, 0x4a, 0x1d, 0x66, 0x18, 0x80, 0x5b, 0x52, 0x56, 0x1f, 0xb9, 0xa8, 0x0c, 0x47, 0x6a, 0x7f,
20082
+	0xcd, 0xc0, 0x09, 0x71, 0xee, 0x1f, 0xcd, 0x16, 0xb4, 0x06, 0x0b, 0x1c, 0x3a, 0x44, 0x5c, 0xe7,
20083
+	0x99, 0x88, 0x08, 0x6b, 0x3d, 0x14, 0xd6, 0x95, 0x68, 0xc3, 0x03, 0xc7, 0x93, 0x87, 0xfe, 0x57,
20084
+	0xde, 0xd8, 0x6e, 0xf8, 0x4f, 0x16, 0x10, 0x3b, 0xf9, 0x91, 0x9f, 0x1e, 0x6d, 0x3e, 0x90, 0x69,
20085
+	0xb3, 0x1a, 0x7d, 0x64, 0x0c, 0x0a, 0x0e, 0xb2, 0xe6, 0x9b, 0xc9, 0xb3, 0xa6, 0x2e, 0xb1, 0xe6,
20086
+	0xcd, 0xe1, 0x6c, 0x7b, 0x27, 0xa4, 0xf9, 0x48, 0x7c, 0xb5, 0x71, 0x8b, 0x78, 0xc8, 0xbe, 0x49,
20087
+	0xbe, 0x31, 0xe9, 0x10, 0xa7, 0xcc, 0xb8, 0x98, 0x09, 0xa8, 0xd6, 0x80, 0x13, 0xa2, 0xe0, 0x11,
20088
+	0x4c, 0xdd, 0x7a, 0xe8, 0xac, 0x9b, 0x3a, 0x97, 0xc2, 0x53, 0x8d, 0x91, 0x4b, 0xdf, 0x83, 0x13,
20089
+	0xe2, 0x9b, 0x75, 0xc4, 0xb7, 0xfb, 0x94, 0xff, 0xed, 0x1c, 0xb4, 0x86, 0x93, 0xc6, 0x1d, 0xcb,
20090
+	0xdc, 0x35, 0xf6, 0x02, 0xd3, 0xb6, 0xe8, 0x80, 0x34, 0x2d, 0x43, 0x91, 0x69, 0xd9, 0x63, 0x8f,
20091
+	0x34, 0x84, 0xb8, 0xbf, 0x42, 0x06, 0x88, 0x5b, 0x21, 0x97, 0xe1, 0xc8, 0x00, 0x69, 0x8c, 0x6a,
20092
+	0x0b, 0x21, 0x0d, 0x0e, 0x1d, 0x86, 0x34, 0x98, 0xc8, 0x10, 0xa4, 0xc1, 0x34, 0xab, 0x48, 0x63,
20093
+	0x02, 0x6e, 0x10, 0xa4, 0xc1, 0x86, 0x47, 0x20, 0x8d, 0xb0, 0xe0, 0x57, 0x8b, 0x34, 0xd4, 0xb6,
20094
+	0xbd, 0x4b, 0xd2, 0xf0, 0x2c, 0xf2, 0x49, 0x83, 0x05, 0x22, 0x96, 0x34, 0x78, 0xcc, 0x04, 0xd4,
20095
+	0x27, 0x8d, 0x70, 0xea, 0xa6, 0x20, 0x0d, 0x55, 0x2e, 0x85, 0xa7, 0x1a, 0x23, 0x97, 0x3c, 0xd2,
20096
+	0x18, 0xf9, 0xed, 0xf6, 0x48, 0x23, 0x6c, 0x8d, 0xf6, 0x13, 0x38, 0xc5, 0xac, 0xbc, 0xfb, 0xda,
20097
+	0xc5, 0x26, 0x7d, 0x8f, 0xf8, 0xe4, 0xb7, 0xa1, 0xd8, 0x34, 0x4d, 0x7e, 0xc2, 0x71, 0xe2, 0x6a,
20098
+	0x03, 0xb7, 0x7d, 0x98, 0x1e, 0x94, 0x41, 0xe7, 0xa0, 0xd8, 0xc6, 0x4e, 0xcb, 0x36, 0x7a, 0xae,
20099
+	0x78, 0x87, 0x0b, 0x7a, 0x70, 0x48, 0x7b, 0x01, 0xa7, 0x07, 0xd4, 0x73, 0x3f, 0x7d, 0x0c, 0x05,
20100
+	0x2c, 0x06, 0xb9, 0x76, 0x65, 0x87, 0xc0, 0x97, 0xf4, 0xf1, 0xda, 0x63, 0x38, 0xc5, 0x96, 0x3b,
20101
+	0xb0, 0xac, 0x3a, 0xcc, 0x79, 0x30, 0xdf, 0x6d, 0x8b, 0x47, 0x87, 0xab, 0x45, 0x0f, 0xdb, 0x58,
20102
+	0xd7, 0x8b, 0x1e, 0xa8, 0xd1, 0xd6, 0xde, 0x83, 0xd3, 0x03, 0xb3, 0x71, 0xff, 0x35, 0xe0, 0xc4,
20103
+	0x7d, 0xec, 0x4e, 0x44, 0xcb, 0x26, 0x2c, 0x87, 0xa7, 0x9a, 0x84, 0x23, 0x7e, 0x9f, 0x11, 0x65,
20104
+	0x1a, 0x1d, 0x3b, 0x56, 0xdf, 0xf6, 0x4b, 0xad, 0x13, 0x88, 0x2f, 0x82, 0x5c, 0xc7, 0x30, 0x79,
20105
+	0x71, 0x43, 0xa7, 0xff, 0xa3, 0x2a, 0xcc, 0xf6, 0x9a, 0x07, 0x5d, 0xab, 0xd9, 0xe6, 0xcc, 0xbb,
20106
+	0x5c, 0x65, 0x37, 0x20, 0xaa, 0xe2, 0x4a, 0x43, 0xf5, 0xb6, 0x79, 0xa0, 0x0b, 0x90, 0xa6, 0x8b,
20107
+	0x04, 0xf4, 0xed, 0xe3, 0xeb, 0xbe, 0x01, 0x79, 0x9b, 0x8f, 0x71, 0xeb, 0x94, 0xad, 0x52, 0x4f,
20108
+	0xce, 0x43, 0x6b, 0x0f, 0x44, 0x31, 0x45, 0x5e, 0x73, 0x0d, 0x8a, 0x02, 0xe4, 0x47, 0x85, 0x12,
20109
+	0xa2, 0x40, 0x36, 0xd6, 0x75, 0x10, 0x90, 0x46, 0x5b, 0x2b, 0x89, 0x3c, 0x92, 0xad, 0xd3, 0x7e,
20110
+	0x99, 0x15, 0x67, 0xfe, 0x71, 0x95, 0xa0, 0x7b, 0xb0, 0xe4, 0x09, 0x0c, 0xb1, 0xdf, 0x2d, 0x0a,
20111
+	0x21, 0xb1, 0xe3, 0x49, 0x11, 0x9d, 0x1a, 0x21, 0xa2, 0x81, 0xe8, 0xe5, 0x52, 0x46, 0x4f, 0x76,
20112
+	0xc2, 0xd8, 0xd1, 0xbb, 0x4b, 0x4b, 0x1e, 0x63, 0x87, 0xee, 0x29, 0x7d, 0x33, 0x27, 0x68, 0xd7,
20113
+	0xff, 0xb3, 0xec, 0x9b, 0x5e, 0x3c, 0xf2, 0xb6, 0xf4, 0x87, 0xf2, 0x96, 0xfe, 0x7e, 0xd4, 0xb6,
20114
+	0x29, 0x8b, 0x0e, 0x6e, 0xea, 0xbf, 0x9b, 0xfc, 0xa6, 0xbe, 0x25, 0x6d, 0xea, 0x9f, 0x0c, 0x6b,
20115
+	0xdd, 0xe8, 0x7d, 0x05, 0x41, 0x10, 0xd3, 0x3e, 0x41, 0x8c, 0xb3, 0xd5, 0x6f, 0xc2, 0x49, 0xc9,
20116
+	0x4e, 0x1e, 0xd4, 0x9b, 0x50, 0x10, 0x61, 0x12, 0xdb, 0x7d, 0x7c, 0x54, 0x7d, 0x78, 0xfd, 0xf3,
20117
+	0x0b, 0x30, 0x7b, 0x87, 0x5d, 0x31, 0x43, 0x06, 0xcc, 0xf2, 0x1b, 0x52, 0x48, 0x53, 0xc9, 0x87,
20118
+	0x6f, 0x5d, 0x95, 0xcf, 0xc7, 0x62, 0x38, 0x51, 0x9c, 0xfc, 0xfb, 0x9f, 0xff, 0xf7, 0xdb, 0xec,
20119
+	0x22, 0xcc, 0x53, 0xd0, 0x37, 0x78, 0x01, 0x05, 0x59, 0x50, 0xf0, 0x2e, 0xb1, 0xa0, 0x0b, 0x69,
20120
+	0x6e, 0xe5, 0x94, 0x2f, 0x26, 0xa0, 0xe2, 0x15, 0xda, 0x00, 0xfe, 0x1d, 0x12, 0x74, 0x31, 0xba,
20121
+	0x63, 0x18, 0x5c, 0xe1, 0xa5, 0x24, 0x58, 0xa2, 0x4e, 0xff, 0x8e, 0x88, 0x5a, 0xe7, 0xc0, 0x9d,
20122
+	0x14, 0xb5, 0x4e, 0xc5, 0x55, 0x93, 0x08, 0x9d, 0x2c, 0x86, 0x5b, 0x4d, 0xa7, 0x13, 0x19, 0xc3,
20123
+	0xc0, 0x1d, 0x91, 0xc8, 0x18, 0x86, 0x6e, 0x83, 0xc4, 0xc7, 0x90, 0x75, 0x60, 0x2e, 0xa4, 0xb9,
20124
+	0x71, 0x11, 0x1d, 0xc3, 0xd0, 0x55, 0x81, 0x44, 0x7f, 0xd2, 0xe5, 0xc5, 0xf8, 0x33, 0xb8, 0xc2,
20125
+	0x4b, 0x49, 0xb0, 0x44, 0x9d, 0x7e, 0xf3, 0x5d, 0xad, 0x73, 0xe0, 0x22, 0x80, 0x5a, 0xe7, 0x60,
20126
+	0x0f, 0x3f, 0x4a, 0xe7, 0x6b, 0x98, 0x0b, 0x36, 0x0e, 0xd1, 0xe5, 0x94, 0x9d, 0xd0, 0x72, 0x25,
20127
+	0x19, 0x18, 0xaf, 0xf9, 0xc7, 0x30, 0x1f, 0xba, 0x26, 0x81, 0x94, 0x33, 0xaa, 0xae, 0x65, 0x94,
20128
+	0xaf, 0xa4, 0x40, 0x26, 0x2a, 0x0f, 0x75, 0xd9, 0xd5, 0xca, 0x55, 0x7d, 0x7d, 0xb5, 0x72, 0x65,
20129
+	0xcb, 0x3e, 0x46, 0x79, 0xa8, 0x99, 0xae, 0x56, 0xae, 0xea, 0xda, 0xab, 0x95, 0xab, 0x3b, 0xf3,
20130
+	0x11, 0xca, 0x7f, 0x9d, 0x09, 0x35, 0xec, 0x45, 0x6f, 0x15, 0x55, 0x53, 0x37, 0x61, 0x99, 0x25,
20131
+	0xb5, 0x21, 0x9b, 0xb6, 0xf1, 0x49, 0xcf, 0x3b, 0x3a, 0x91, 0x49, 0x1f, 0xee, 0x02, 0x46, 0x26,
20132
+	0xbd, 0xdc, 0xd2, 0x8b, 0x4f, 0x7a, 0xd1, 0x7e, 0x8a, 0x4e, 0x7a, 0xa9, 0x67, 0x16, 0x9d, 0xf4,
20133
+	0x72, 0x27, 0x2b, 0x31, 0xe9, 0xc5, 0x82, 0x63, 0x92, 0x5e, 0x5a, 0xf3, 0x95, 0x14, 0xc8, 0x94,
20134
+	0x79, 0x17, 0xab, 0x5c, 0xd5, 0x76, 0x8d, 0xcb, 0xbb, 0x94, 0xca, 0x59, 0x9c, 0x79, 0xfd, 0x3d,
20135
+	0x32, 0xce, 0xe1, 0xce, 0x46, 0x64, 0x9c, 0xa5, 0xe2, 0x7f, 0x42, 0x9c, 0x45, 0x6b, 0x28, 0x3a,
20136
+	0xce, 0x52, 0x3f, 0x2b, 0x3a, 0xce, 0x72, 0x97, 0x29, 0x91, 0x5f, 0xc4, 0x82, 0x63, 0xf8, 0x45,
20137
+	0x5a, 0xf3, 0x95, 0x14, 0xc8, 0xc4, 0xcd, 0xd2, 0x6b, 0x4a, 0xa8, 0x37, 0x4b, 0xb9, 0xe5, 0x51,
20138
+	0xbe, 0x98, 0x80, 0x4a, 0xf4, 0x73, 0xb0, 0x03, 0xa0, 0xf6, 0xb3, 0xa2, 0xbb, 0x51, 0xae, 0x24,
20139
+	0x03, 0xe3, 0x35, 0xf7, 0xa1, 0x18, 0xa8, 0x63, 0xa3, 0x4b, 0xe9, 0x4a, 0xef, 0xe5, 0xcb, 0x89,
20140
+	0xb8, 0xc4, 0x05, 0x07, 0xcb, 0xd4, 0xea, 0x05, 0x2b, 0x6a, 0xe2, 0xe5, 0x4a, 0x32, 0x30, 0x51,
20141
+	0x73, 0xb0, 0x24, 0xad, 0xd6, 0xac, 0x28, 0x7b, 0x97, 0x2b, 0xc9, 0xc0, 0x34, 0x59, 0xc5, 0x8a,
20142
+	0x5a, 0x91, 0x59, 0x15, 0xaa, 0x9a, 0x45, 0x66, 0x95, 0x54, 0x19, 0x4b, 0xca, 0x2a, 0xae, 0x33,
20143
+	0x26, 0xab, 0xc2, 0x6a, 0x2b, 0xc9, 0xc0, 0x54, 0x59, 0xc5, 0x0b, 0x9d, 0xd1, 0x59, 0x15, 0xae,
20144
+	0xcd, 0x46, 0x67, 0x95, 0x54, 0x31, 0x4d, 0xcc, 0xaa, 0xb8, 0x05, 0x2b, 0x8a, 0xa6, 0x71, 0x59,
20145
+	0x95, 0xda, 0xd5, 0xc1, 0x9a, 0x65, 0x5c, 0x56, 0xa5, 0xd0, 0xac, 0x2c, 0x7f, 0x46, 0x6b, 0x0e,
20146
+	0x96, 0xe2, 0xd4, 0x9a, 0x15, 0x75, 0x3f, 0xb5, 0x66, 0x55, 0x55, 0x2f, 0x4a, 0xf3, 0xcf, 0x33,
20147
+	0xb0, 0x28, 0x55, 0x44, 0xd1, 0xd5, 0x68, 0x47, 0x0e, 0x18, 0xf0, 0xf5, 0x54, 0xd8, 0x64, 0x1b,
20148
+	0xa4, 0x7a, 0xa7, 0xda, 0x06, 0x75, 0x89, 0x55, 0x6d, 0x43, 0x54, 0x01, 0x35, 0x3a, 0xd9, 0x03,
20149
+	0xd5, 0x1b, 0x14, 0xb5, 0xe5, 0x4a, 0x55, 0xa2, 0xf2, 0xe5, 0x44, 0x5c, 0xbc, 0xda, 0x9f, 0xc2,
20150
+	0x42, 0xb8, 0x9e, 0x85, 0x62, 0x36, 0x3e, 0x59, 0xf9, 0xd5, 0x34, 0xd0, 0xc4, 0x1d, 0x3a, 0x54,
20151
+	0xe1, 0x40, 0x95, 0xb4, 0xc5, 0x1a, 0xf5, 0x0e, 0xad, 0x2c, 0x97, 0xc4, 0x2c, 0x3e, 0x5c, 0x8a,
20152
+	0x45, 0x31, 0xa7, 0xbb, 0x54, 0x8b, 0x57, 0x57, 0x76, 0x63, 0xf4, 0x87, 0x8b, 0xad, 0x28, 0xe6,
20153
+	0x80, 0x97, 0x4a, 0x7f, 0x44, 0xed, 0x56, 0xad, 0x7f, 0xad, 0xf4, 0xf6, 0x8b, 0x95, 0x63, 0xff,
20154
+	0xfc, 0x62, 0xe5, 0xd8, 0xcf, 0x8e, 0x56, 0x32, 0x6f, 0x8f, 0x56, 0x32, 0xff, 0x38, 0x5a, 0xc9,
20155
+	0xfc, 0xfb, 0x68, 0x25, 0xb3, 0x33, 0x43, 0xab, 0x9f, 0xd7, 0xbf, 0x0c, 0x00, 0x00, 0xff, 0xff,
20156
+	0x83, 0x6a, 0xc0, 0xe5, 0xab, 0x38, 0x00, 0x00,
20151 20157
 }
... ...
@@ -50,6 +50,16 @@ service Control {
50 50
 		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
51 51
 	};
52 52
 
53
+	// ListServiceStatuses returns a `ListServiceStatusesResponse` with the
54
+	// status of the requested services, formed by computing the number of
55
+	// running vs desired tasks. It is provided as a shortcut or helper method,
56
+	// which allows a client to avoid having to calculate this value by listing
57
+	// all Tasks. If any service requested does not exist, it will be returned
58
+	// but with empty status values.
59
+	rpc ListServiceStatuses(ListServiceStatusesRequest) returns (ListServiceStatusesResponse) {
60
+		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
61
+	};
62
+
53 63
 	rpc GetNetwork(GetNetworkRequest) returns (GetNetworkResponse) {
54 64
 		option (docker.protobuf.plugin.tls_authorization) = { roles: "swarm-manager" };
55 65
 	};
... ...
@@ -397,6 +407,37 @@ message ListServicesResponse {
397 397
 	repeated Service services = 1;
398 398
 }
399 399
 
400
+// ListServiceStatusesRequest is a request to get the aggregate status of a
401
+// service by computing the number of running vs desired tasks. It includes
402
+// only a service ID.
403
+message ListServiceStatusesRequest {
404
+	// Services is a list of service IDs to get statuses for.
405
+	repeated string services = 1;
406
+}
407
+
408
+// ListServiceStatusesResponse is a response containing the aggregate status of
409
+// a service, formed by computing the number of running vs desired tasks. The
410
+// values returned are only valid for the point in time at which the request is
411
+// made.
412
+message ListServiceStatusesResponse {
413
+	message ServiceStatus {
414
+		// ServiceID is the ID of the service this status describes
415
+		string service_id = 1;
416
+
417
+		// DesiredTasks is the number of tasks desired to be running according to the
418
+		// service definition at request time. It is a uint64 because that is what
419
+		// the replicas field on the service spec is
420
+		uint64 desired_tasks = 2;
421
+		
422
+		// RunningTasks is the number of tasks currently in the Running state at
423
+		// request time. This may be larger than desired tasks if, for example, a
424
+		// service has been scaled down.
425
+		uint64 running_tasks = 3;
426
+	}
427
+
428
+	repeated ServiceStatus statuses = 1;
429
+}
430
+
400 431
 message CreateNetworkRequest {
401 432
 	NetworkSpec spec = 1;
402 433
 }
... ...
@@ -636,6 +636,8 @@ type ContainerSpec struct {
636 636
 	//
637 637
 	// https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime
638 638
 	Sysctls map[string]string `protobuf:"bytes,26,rep,name=sysctls" json:"sysctls,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
639
+	// Capabilities is the list of Linux capabilities to be available for container (this overrides the default set of capabilities)
640
+	Capabilities []string `protobuf:"bytes,27,rep,name=capabilities" json:"capabilities,omitempty"`
639 641
 }
640 642
 
641 643
 func (m *ContainerSpec) Reset()                    { *m = ContainerSpec{} }
... ...
@@ -1197,6 +1199,11 @@ func (m *ContainerSpec) CopyFrom(src interface{}) {
1197 1197
 		}
1198 1198
 	}
1199 1199
 
1200
+	if o.Capabilities != nil {
1201
+		m.Capabilities = make([]string, len(o.Capabilities))
1202
+		copy(m.Capabilities, o.Capabilities)
1203
+	}
1204
+
1200 1205
 }
1201 1206
 
1202 1207
 func (m *ContainerSpec_PullOptions) Copy() *ContainerSpec_PullOptions {
... ...
@@ -2104,6 +2111,23 @@ func (m *ContainerSpec) MarshalTo(dAtA []byte) (int, error) {
2104 2104
 			i += copy(dAtA[i:], v)
2105 2105
 		}
2106 2106
 	}
2107
+	if len(m.Capabilities) > 0 {
2108
+		for _, s := range m.Capabilities {
2109
+			dAtA[i] = 0xda
2110
+			i++
2111
+			dAtA[i] = 0x1
2112
+			i++
2113
+			l = len(s)
2114
+			for l >= 1<<7 {
2115
+				dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
2116
+				l >>= 7
2117
+				i++
2118
+			}
2119
+			dAtA[i] = uint8(l)
2120
+			i++
2121
+			i += copy(dAtA[i:], s)
2122
+		}
2123
+	}
2107 2124
 	return i, nil
2108 2125
 }
2109 2126
 
... ...
@@ -2829,6 +2853,12 @@ func (m *ContainerSpec) Size() (n int) {
2829 2829
 			n += mapEntrySize + 2 + sovSpecs(uint64(mapEntrySize))
2830 2830
 		}
2831 2831
 	}
2832
+	if len(m.Capabilities) > 0 {
2833
+		for _, s := range m.Capabilities {
2834
+			l = len(s)
2835
+			n += 2 + l + sovSpecs(uint64(l))
2836
+		}
2837
+	}
2832 2838
 	return n
2833 2839
 }
2834 2840
 
... ...
@@ -3188,6 +3218,7 @@ func (this *ContainerSpec) String() string {
3188 3188
 		`Isolation:` + fmt.Sprintf("%v", this.Isolation) + `,`,
3189 3189
 		`PidsLimit:` + fmt.Sprintf("%v", this.PidsLimit) + `,`,
3190 3190
 		`Sysctls:` + mapStringForSysctls + `,`,
3191
+		`Capabilities:` + fmt.Sprintf("%v", this.Capabilities) + `,`,
3191 3192
 		`}`,
3192 3193
 	}, "")
3193 3194
 	return s
... ...
@@ -5454,6 +5485,35 @@ func (m *ContainerSpec) Unmarshal(dAtA []byte) error {
5454 5454
 			}
5455 5455
 			m.Sysctls[mapkey] = mapvalue
5456 5456
 			iNdEx = postIndex
5457
+		case 27:
5458
+			if wireType != 2 {
5459
+				return fmt.Errorf("proto: wrong wireType = %d for field Capabilities", wireType)
5460
+			}
5461
+			var stringLen uint64
5462
+			for shift := uint(0); ; shift += 7 {
5463
+				if shift >= 64 {
5464
+					return ErrIntOverflowSpecs
5465
+				}
5466
+				if iNdEx >= l {
5467
+					return io.ErrUnexpectedEOF
5468
+				}
5469
+				b := dAtA[iNdEx]
5470
+				iNdEx++
5471
+				stringLen |= (uint64(b) & 0x7F) << shift
5472
+				if b < 0x80 {
5473
+					break
5474
+				}
5475
+			}
5476
+			intStringLen := int(stringLen)
5477
+			if intStringLen < 0 {
5478
+				return ErrInvalidLengthSpecs
5479
+			}
5480
+			postIndex := iNdEx + intStringLen
5481
+			if postIndex > l {
5482
+				return io.ErrUnexpectedEOF
5483
+			}
5484
+			m.Capabilities = append(m.Capabilities, string(dAtA[iNdEx:postIndex]))
5485
+			iNdEx = postIndex
5457 5486
 		default:
5458 5487
 			iNdEx = preIndex
5459 5488
 			skippy, err := skipSpecs(dAtA[iNdEx:])
... ...
@@ -6765,141 +6825,142 @@ var (
6765 6765
 func init() { proto.RegisterFile("github.com/docker/swarmkit/api/specs.proto", fileDescriptorSpecs) }
6766 6766
 
6767 6767
 var fileDescriptorSpecs = []byte{
6768
-	// 2166 bytes of a gzipped FileDescriptorProto
6769
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4d, 0x6f, 0x1b, 0xc9,
6770
-	0xd1, 0x16, 0x25, 0x8a, 0x1f, 0x35, 0x94, 0x4d, 0xf5, 0xda, 0xde, 0x11, 0x6d, 0x4b, 0x34, 0xd7,
6771
-	0xeb, 0x57, 0xbb, 0x8b, 0x97, 0x42, 0x94, 0xc5, 0xc6, 0x6b, 0x67, 0x93, 0x90, 0x22, 0x57, 0x62,
6772
-	0x6c, 0x4b, 0x44, 0x53, 0x56, 0x62, 0x20, 0x00, 0xd1, 0x9a, 0x69, 0x91, 0x03, 0x0d, 0xa7, 0x27,
6773
-	0xdd, 0x4d, 0x19, 0xbc, 0xe5, 0xb8, 0x50, 0x7e, 0x83, 0x90, 0x43, 0x90, 0x7b, 0xf2, 0x2f, 0x7c,
6774
-	0xcc, 0x31, 0xb9, 0x08, 0x59, 0x1d, 0xf2, 0x07, 0x72, 0xcb, 0x25, 0x41, 0xf7, 0xf4, 0xf0, 0x43,
6775
-	0x1e, 0x59, 0x0e, 0xe2, 0x43, 0x6e, 0xdd, 0x35, 0xcf, 0x53, 0xfd, 0xf5, 0x54, 0x75, 0xf5, 0xc0,
6776
-	0xe7, 0x3d, 0x4f, 0xf6, 0x87, 0x87, 0x55, 0x87, 0x0d, 0x36, 0x5c, 0xe6, 0x1c, 0x53, 0xbe, 0x21,
6777
-	0x5e, 0x13, 0x3e, 0x38, 0xf6, 0xe4, 0x06, 0x09, 0xbd, 0x0d, 0x11, 0x52, 0x47, 0x54, 0x43, 0xce,
6778
-	0x24, 0x43, 0x28, 0x02, 0x54, 0x63, 0x40, 0xf5, 0xe4, 0x07, 0xa5, 0xeb, 0xf8, 0x72, 0x14, 0x52,
6779
-	0xc3, 0x2f, 0xdd, 0xea, 0xb1, 0x1e, 0xd3, 0xcd, 0x0d, 0xd5, 0x32, 0xd6, 0xd5, 0x1e, 0x63, 0x3d,
6780
-	0x9f, 0x6e, 0xe8, 0xde, 0xe1, 0xf0, 0x68, 0xc3, 0x1d, 0x72, 0x22, 0x3d, 0x16, 0x98, 0xef, 0x2b,
6781
-	0x97, 0xbf, 0x93, 0x60, 0x74, 0x15, 0xf5, 0x35, 0x27, 0x61, 0x48, 0xb9, 0x19, 0xb0, 0x72, 0x96,
6782
-	0x86, 0xdc, 0x2e, 0x73, 0x69, 0x27, 0xa4, 0x0e, 0xda, 0x06, 0x8b, 0x04, 0x01, 0x93, 0xda, 0xb7,
6783
-	0xb0, 0x53, 0xe5, 0xd4, 0xba, 0xb5, 0xb9, 0x56, 0x7d, 0x7b, 0x4d, 0xd5, 0xda, 0x04, 0x56, 0x4f,
6784
-	0xbf, 0x39, 0x5f, 0x9b, 0xc3, 0xd3, 0x4c, 0xf4, 0x53, 0x28, 0xb8, 0x54, 0x78, 0x9c, 0xba, 0x5d,
6785
-	0xce, 0x7c, 0x6a, 0xcf, 0x97, 0x53, 0xeb, 0x37, 0x36, 0xef, 0x25, 0x79, 0x52, 0x83, 0x63, 0xe6,
6786
-	0x53, 0x6c, 0x19, 0x86, 0xea, 0xa0, 0x6d, 0x80, 0x01, 0x1d, 0x1c, 0x52, 0x2e, 0xfa, 0x5e, 0x68,
6787
-	0x2f, 0x68, 0xfa, 0xff, 0x5d, 0x45, 0x57, 0x73, 0xaf, 0xbe, 0x18, 0xc3, 0xf1, 0x14, 0x15, 0xbd,
6788
-	0x80, 0x02, 0x39, 0x21, 0x9e, 0x4f, 0x0e, 0x3d, 0xdf, 0x93, 0x23, 0x3b, 0xad, 0x5d, 0x7d, 0xf6,
6789
-	0x4e, 0x57, 0xb5, 0x29, 0x02, 0x9e, 0xa1, 0x57, 0x5c, 0x80, 0xc9, 0x40, 0xe8, 0x11, 0x64, 0xdb,
6790
-	0xcd, 0xdd, 0x46, 0x6b, 0x77, 0xbb, 0x38, 0x57, 0x5a, 0x39, 0x3d, 0x2b, 0xdf, 0x56, 0x3e, 0x26,
6791
-	0x80, 0x36, 0x0d, 0x5c, 0x2f, 0xe8, 0xa1, 0x75, 0xc8, 0xd5, 0xb6, 0xb6, 0x9a, 0xed, 0xfd, 0x66,
6792
-	0xa3, 0x98, 0x2a, 0x95, 0x4e, 0xcf, 0xca, 0x77, 0x66, 0x81, 0x35, 0xc7, 0xa1, 0xa1, 0xa4, 0x6e,
6793
-	0x29, 0xfd, 0xdd, 0xef, 0x57, 0xe7, 0x2a, 0xdf, 0xa5, 0xa0, 0x30, 0x3d, 0x09, 0xf4, 0x08, 0x32,
6794
-	0xb5, 0xad, 0xfd, 0xd6, 0x41, 0xb3, 0x38, 0x37, 0xa1, 0x4f, 0x23, 0x6a, 0x8e, 0xf4, 0x4e, 0x28,
6795
-	0x7a, 0x08, 0x8b, 0xed, 0xda, 0xcb, 0x4e, 0xb3, 0x98, 0x9a, 0x4c, 0x67, 0x1a, 0xd6, 0x26, 0x43,
6796
-	0xa1, 0x51, 0x0d, 0x5c, 0x6b, 0xed, 0x16, 0xe7, 0x93, 0x51, 0x0d, 0x4e, 0xbc, 0xc0, 0x4c, 0xe5,
6797
-	0x77, 0x69, 0xb0, 0x3a, 0x94, 0x9f, 0x78, 0xce, 0x07, 0x96, 0xc8, 0x57, 0x90, 0x96, 0x44, 0x1c,
6798
-	0x6b, 0x69, 0x58, 0xc9, 0xd2, 0xd8, 0x27, 0xe2, 0x58, 0x0d, 0x6a, 0xe8, 0x1a, 0xaf, 0x94, 0xc1,
6799
-	0x69, 0xe8, 0x7b, 0x0e, 0x91, 0xd4, 0xd5, 0xca, 0xb0, 0x36, 0x3f, 0x4d, 0x62, 0xe3, 0x31, 0xca,
6800
-	0xcc, 0x7f, 0x67, 0x0e, 0x4f, 0x51, 0xd1, 0x53, 0xc8, 0xf4, 0x7c, 0x76, 0x48, 0x7c, 0xad, 0x09,
6801
-	0x6b, 0xf3, 0x41, 0x92, 0x93, 0x6d, 0x8d, 0x98, 0x38, 0x30, 0x14, 0xf4, 0x18, 0x32, 0xc3, 0xd0,
6802
-	0x25, 0x92, 0xda, 0x19, 0x4d, 0x2e, 0x27, 0x91, 0x5f, 0x6a, 0xc4, 0x16, 0x0b, 0x8e, 0xbc, 0x1e,
6803
-	0x36, 0x78, 0xf4, 0x0c, 0x72, 0x01, 0x95, 0xaf, 0x19, 0x3f, 0x16, 0x76, 0xb6, 0xbc, 0xb0, 0x6e,
6804
-	0x6d, 0x7e, 0x91, 0x28, 0xc6, 0x08, 0x53, 0x93, 0x92, 0x38, 0xfd, 0x01, 0x0d, 0x64, 0xe4, 0xa6,
6805
-	0x3e, 0x6f, 0xa7, 0xf0, 0xd8, 0x01, 0xfa, 0x31, 0xe4, 0x68, 0xe0, 0x86, 0xcc, 0x0b, 0xa4, 0x9d,
6806
-	0xbb, 0x7a, 0x22, 0x4d, 0x83, 0x51, 0x9b, 0x89, 0xc7, 0x0c, 0xc5, 0xe6, 0xcc, 0xf7, 0x0f, 0x89,
6807
-	0x73, 0x6c, 0xe7, 0xdf, 0x73, 0x19, 0x63, 0x46, 0x3d, 0x03, 0xe9, 0x01, 0x73, 0x69, 0x65, 0x03,
6808
-	0x96, 0xdf, 0xda, 0x6a, 0x54, 0x82, 0x9c, 0xd9, 0xea, 0x48, 0x23, 0x69, 0x3c, 0xee, 0x57, 0x6e,
6809
-	0xc2, 0xd2, 0xcc, 0xb6, 0x56, 0xfe, 0xb8, 0x08, 0xb9, 0xf8, 0xac, 0x51, 0x0d, 0xf2, 0x0e, 0x0b,
6810
-	0x24, 0xf1, 0x02, 0xca, 0x8d, 0xbc, 0x12, 0x4f, 0x66, 0x2b, 0x06, 0x29, 0xd6, 0xce, 0x1c, 0x9e,
6811
-	0xb0, 0xd0, 0xb7, 0x90, 0xe7, 0x54, 0xb0, 0x21, 0x77, 0xa8, 0x30, 0xfa, 0x5a, 0x4f, 0x56, 0x48,
6812
-	0x04, 0xc2, 0xf4, 0xd7, 0x43, 0x8f, 0x53, 0xb5, 0xcb, 0x02, 0x4f, 0xa8, 0xe8, 0x29, 0x64, 0x39,
6813
-	0x15, 0x92, 0x70, 0xf9, 0x2e, 0x89, 0xe0, 0x08, 0xd2, 0x66, 0xbe, 0xe7, 0x8c, 0x70, 0xcc, 0x40,
6814
-	0x4f, 0x21, 0x1f, 0xfa, 0xc4, 0xd1, 0x5e, 0xed, 0x45, 0x4d, 0xbf, 0x9f, 0x44, 0x6f, 0xc7, 0x20,
6815
-	0x3c, 0xc1, 0xa3, 0xaf, 0x01, 0x7c, 0xd6, 0xeb, 0xba, 0xdc, 0x3b, 0xa1, 0xdc, 0x48, 0xac, 0x94,
6816
-	0xc4, 0x6e, 0x68, 0x04, 0xce, 0xfb, 0xac, 0x17, 0x35, 0xd1, 0xf6, 0x7f, 0xa5, 0xaf, 0x29, 0x6d,
6817
-	0x3d, 0x03, 0x20, 0xe3, 0xaf, 0x46, 0x5d, 0x9f, 0xbd, 0x97, 0x2b, 0x73, 0x22, 0x53, 0x74, 0xf4,
6818
-	0x00, 0x0a, 0x47, 0x8c, 0x3b, 0xb4, 0x6b, 0xa2, 0x26, 0xaf, 0x35, 0x61, 0x69, 0x5b, 0xa4, 0x2f,
6819
-	0x54, 0x87, 0x6c, 0x8f, 0x06, 0x94, 0x7b, 0x8e, 0x0d, 0x7a, 0xb0, 0x47, 0x89, 0x01, 0x19, 0x41,
6820
-	0xf0, 0x30, 0x90, 0xde, 0x80, 0x9a, 0x91, 0x62, 0x22, 0xfa, 0x15, 0x7c, 0x14, 0x1f, 0x5f, 0x97,
6821
-	0xd3, 0x23, 0xca, 0x69, 0xa0, 0x34, 0x60, 0xe9, 0x7d, 0xf8, 0xf4, 0xdd, 0x1a, 0x30, 0x68, 0x93,
6822
-	0x6c, 0x10, 0xbf, 0xfc, 0x41, 0xd4, 0xf3, 0x90, 0xe5, 0xd1, 0xb8, 0x95, 0xdf, 0xa6, 0x94, 0xea,
6823
-	0x2f, 0x21, 0xd0, 0x06, 0x58, 0xe3, 0xe1, 0x3d, 0x57, 0xab, 0x37, 0x5f, 0xbf, 0x71, 0x71, 0xbe,
6824
-	0x06, 0x31, 0xb6, 0xd5, 0x50, 0x39, 0xc8, 0xb4, 0x5d, 0xd4, 0x84, 0xa5, 0x31, 0x41, 0x95, 0x01,
6825
-	0xe6, 0xa2, 0x2c, 0xbf, 0x6b, 0xa6, 0xfb, 0xa3, 0x90, 0xe2, 0x02, 0x9f, 0xea, 0x55, 0x7e, 0x09,
6826
-	0xe8, 0xed, 0x7d, 0x41, 0x08, 0xd2, 0xc7, 0x5e, 0x60, 0xa6, 0x81, 0x75, 0x1b, 0x55, 0x21, 0x1b,
6827
-	0x92, 0x91, 0xcf, 0x88, 0x6b, 0x02, 0xe3, 0x56, 0x35, 0x2a, 0x10, 0xaa, 0x71, 0x81, 0x50, 0xad,
6828
-	0x05, 0x23, 0x1c, 0x83, 0x2a, 0xcf, 0xe0, 0x76, 0xe2, 0xf1, 0xa2, 0x4d, 0x28, 0x8c, 0x03, 0x6e,
6829
-	0xb2, 0xd6, 0x9b, 0x17, 0xe7, 0x6b, 0xd6, 0x38, 0x32, 0x5b, 0x0d, 0x6c, 0x8d, 0x41, 0x2d, 0xb7,
6830
-	0xf2, 0xf7, 0x02, 0x2c, 0xcd, 0x84, 0x2d, 0xba, 0x05, 0x8b, 0xde, 0x80, 0xf4, 0xa8, 0x99, 0x63,
6831
-	0xd4, 0x41, 0x4d, 0xc8, 0xf8, 0xe4, 0x90, 0xfa, 0x2a, 0x78, 0xd5, 0xc1, 0xfd, 0xff, 0xb5, 0xf1,
6832
-	0x5f, 0x7d, 0xae, 0xf1, 0xcd, 0x40, 0xf2, 0x11, 0x36, 0x64, 0x64, 0x43, 0xd6, 0x61, 0x83, 0x01,
6833
-	0x09, 0xd4, 0x35, 0xb1, 0xb0, 0x9e, 0xc7, 0x71, 0x57, 0xed, 0x0c, 0xe1, 0x3d, 0x61, 0xa7, 0xb5,
6834
-	0x59, 0xb7, 0x51, 0x11, 0x16, 0x68, 0x70, 0x62, 0x2f, 0x6a, 0x93, 0x6a, 0x2a, 0x8b, 0xeb, 0x45,
6835
-	0xd1, 0x97, 0xc7, 0xaa, 0xa9, 0x78, 0x43, 0x41, 0xb9, 0x9d, 0x8d, 0x76, 0x54, 0xb5, 0xd1, 0x8f,
6836
-	0x20, 0x33, 0x60, 0xc3, 0x40, 0x0a, 0x3b, 0xa7, 0x27, 0xbb, 0x92, 0x34, 0xd9, 0x17, 0x0a, 0x61,
6837
-	0x94, 0x65, 0xe0, 0xa8, 0x09, 0xcb, 0x42, 0xb2, 0xb0, 0xdb, 0xe3, 0xc4, 0xa1, 0xdd, 0x90, 0x72,
6838
-	0x8f, 0xb9, 0x26, 0x0d, 0xaf, 0xbc, 0x75, 0x28, 0x0d, 0x53, 0xf0, 0xe1, 0x9b, 0x8a, 0xb3, 0xad,
6839
-	0x28, 0x6d, 0xcd, 0x40, 0x6d, 0x28, 0x84, 0x43, 0xdf, 0xef, 0xb2, 0x30, 0xba, 0x91, 0xa3, 0xd8,
6840
-	0x79, 0x8f, 0x2d, 0x6b, 0x0f, 0x7d, 0x7f, 0x2f, 0x22, 0x61, 0x2b, 0x9c, 0x74, 0xd0, 0x1d, 0xc8,
6841
-	0xf4, 0x38, 0x1b, 0x86, 0x51, 0xdc, 0xe4, 0xb1, 0xe9, 0xa1, 0x6f, 0x20, 0x2b, 0xa8, 0xc3, 0xa9,
6842
-	0x14, 0x76, 0x41, 0x2f, 0xf5, 0x93, 0xa4, 0x41, 0x3a, 0x1a, 0x32, 0x8e, 0x09, 0x1c, 0x73, 0xd0,
6843
-	0x0a, 0x2c, 0x48, 0x39, 0xb2, 0x97, 0xca, 0xa9, 0xf5, 0x5c, 0x3d, 0x7b, 0x71, 0xbe, 0xb6, 0xb0,
6844
-	0xbf, 0xff, 0x0a, 0x2b, 0x9b, 0xba, 0x2d, 0xfa, 0x4c, 0xc8, 0x80, 0x0c, 0xa8, 0x7d, 0x43, 0xef,
6845
-	0xed, 0xb8, 0x8f, 0x5e, 0x01, 0xb8, 0x81, 0xe8, 0x3a, 0x3a, 0x3d, 0xd9, 0x37, 0xf5, 0xea, 0xbe,
6846
-	0xb8, 0x7e, 0x75, 0x8d, 0xdd, 0x8e, 0xb9, 0x31, 0x97, 0x2e, 0xce, 0xd7, 0xf2, 0xe3, 0x2e, 0xce,
6847
-	0xbb, 0x81, 0x88, 0x9a, 0xa8, 0x0e, 0x56, 0x9f, 0x12, 0x5f, 0xf6, 0x9d, 0x3e, 0x75, 0x8e, 0xed,
6848
-	0xe2, 0xd5, 0x57, 0xe0, 0x8e, 0x86, 0x19, 0x0f, 0xd3, 0x24, 0xa5, 0x60, 0x35, 0x55, 0x61, 0x2f,
6849
-	0xeb, 0xbd, 0x8a, 0x3a, 0xe8, 0x3e, 0x00, 0x0b, 0x69, 0xd0, 0x15, 0xd2, 0xf5, 0x02, 0x1b, 0xa9,
6850
-	0x25, 0xe3, 0xbc, 0xb2, 0x74, 0x94, 0x01, 0xdd, 0x55, 0x17, 0x14, 0x71, 0xbb, 0x2c, 0xf0, 0x47,
6851
-	0xf6, 0x47, 0xfa, 0x6b, 0x4e, 0x19, 0xf6, 0x02, 0x7f, 0x84, 0xd6, 0xc0, 0xd2, 0xba, 0x10, 0x5e,
6852
-	0x2f, 0x20, 0xbe, 0x7d, 0x4b, 0xef, 0x07, 0x28, 0x53, 0x47, 0x5b, 0xd4, 0x39, 0x44, 0xbb, 0x21,
6853
-	0xec, 0xdb, 0x57, 0x9f, 0x83, 0x99, 0xec, 0xe4, 0x1c, 0x0c, 0x07, 0xfd, 0x04, 0x20, 0xe4, 0xde,
6854
-	0x89, 0xe7, 0xd3, 0x1e, 0x15, 0xf6, 0x1d, 0xbd, 0xe8, 0xd5, 0xc4, 0x9b, 0x69, 0x8c, 0xc2, 0x53,
6855
-	0x0c, 0x54, 0x85, 0xb4, 0x17, 0x78, 0xd2, 0xfe, 0xd8, 0xdc, 0x4a, 0x97, 0xa5, 0x5a, 0x67, 0xcc,
6856
-	0x3f, 0x20, 0xfe, 0x90, 0x62, 0x8d, 0x43, 0x2d, 0xc8, 0x7b, 0x82, 0xf9, 0x5a, 0xbe, 0xb6, 0xad,
6857
-	0xf3, 0xdb, 0x7b, 0x9c, 0x5f, 0x2b, 0xa6, 0xe0, 0x09, 0x1b, 0xdd, 0x83, 0x7c, 0xe8, 0xb9, 0xe2,
6858
-	0xb9, 0x37, 0xf0, 0xa4, 0xbd, 0x52, 0x4e, 0xad, 0x2f, 0xe0, 0x89, 0x01, 0xed, 0x40, 0x56, 0x8c,
6859
-	0x84, 0x23, 0x7d, 0x61, 0x97, 0xf4, 0xbe, 0x54, 0xaf, 0x1f, 0xa6, 0x13, 0x11, 0xa2, 0xc4, 0x11,
6860
-	0xd3, 0x4b, 0x5f, 0x83, 0x35, 0x95, 0x50, 0x54, 0x22, 0x38, 0xa6, 0x23, 0x93, 0xa3, 0x54, 0x53,
6861
-	0x9d, 0xfa, 0x89, 0x5a, 0xa2, 0x4e, 0xa2, 0x79, 0x1c, 0x75, 0x9e, 0xcc, 0x3f, 0x4e, 0x95, 0x36,
6862
-	0xc1, 0x9a, 0x0a, 0x2c, 0xf4, 0x89, 0x4a, 0xf0, 0x3d, 0x4f, 0x48, 0x3e, 0xea, 0x92, 0xa1, 0xec,
6863
-	0xdb, 0x3f, 0xd3, 0x84, 0x42, 0x6c, 0xac, 0x0d, 0x65, 0xbf, 0xd4, 0x85, 0x89, 0x3e, 0x51, 0x19,
6864
-	0x2c, 0xa5, 0x7b, 0x41, 0xf9, 0x09, 0xe5, 0xaa, 0x78, 0x52, 0xb2, 0x9a, 0x36, 0xa9, 0xf8, 0x14,
6865
-	0x94, 0x70, 0xa7, 0xaf, 0xd3, 0x63, 0x1e, 0x9b, 0x9e, 0xca, 0x77, 0x71, 0x12, 0x30, 0xf9, 0xce,
6866
-	0x74, 0x4b, 0x4f, 0xa0, 0x30, 0xbd, 0xd0, 0xff, 0x64, 0x41, 0x95, 0x3f, 0xa5, 0x20, 0x3f, 0x3e,
6867
-	0x0c, 0xf4, 0x25, 0x2c, 0xb7, 0x3a, 0x7b, 0xcf, 0x6b, 0xfb, 0xad, 0xbd, 0xdd, 0x6e, 0xa3, 0xf9,
6868
-	0x6d, 0xed, 0xe5, 0xf3, 0xfd, 0xe2, 0x5c, 0xe9, 0xfe, 0xe9, 0x59, 0x79, 0x65, 0x92, 0xf7, 0x63,
6869
-	0x78, 0x83, 0x1e, 0x91, 0xa1, 0x2f, 0x67, 0x59, 0x6d, 0xbc, 0xb7, 0xd5, 0xec, 0x74, 0x8a, 0xa9,
6870
-	0xab, 0x58, 0x6d, 0xce, 0x1c, 0x2a, 0x04, 0xda, 0x84, 0xe2, 0x84, 0xb5, 0xf3, 0xaa, 0xdd, 0xc4,
6871
-	0x07, 0xc5, 0xf9, 0xd2, 0xbd, 0xd3, 0xb3, 0xb2, 0xfd, 0x36, 0x69, 0x67, 0x14, 0x52, 0x7e, 0x60,
6872
-	0x1e, 0x2d, 0xff, 0x48, 0x41, 0x61, 0xba, 0xe6, 0x45, 0x5b, 0x51, 0xad, 0xaa, 0x57, 0x7c, 0x63,
6873
-	0x73, 0xe3, 0xba, 0x1a, 0x59, 0xdf, 0xb5, 0xfe, 0x50, 0xf9, 0x7d, 0xa1, 0x9e, 0xa7, 0x9a, 0x8c,
6874
-	0xbe, 0x84, 0xc5, 0x90, 0x71, 0x19, 0xdf, 0x4a, 0xc9, 0x31, 0xc3, 0x78, 0x5c, 0x49, 0x45, 0xe0,
6875
-	0x4a, 0x1f, 0x6e, 0xcc, 0x7a, 0x43, 0x0f, 0x61, 0xe1, 0xa0, 0xd5, 0x2e, 0xce, 0x95, 0xee, 0x9e,
6876
-	0x9e, 0x95, 0x3f, 0x9e, 0xfd, 0x78, 0xe0, 0x71, 0x39, 0x24, 0x7e, 0xab, 0x8d, 0x3e, 0x87, 0xc5,
6877
-	0xc6, 0x6e, 0x07, 0xe3, 0x62, 0xaa, 0xb4, 0x76, 0x7a, 0x56, 0xbe, 0x3b, 0x8b, 0x53, 0x9f, 0xd8,
6878
-	0x30, 0x70, 0x31, 0x3b, 0x1c, 0x3f, 0xd5, 0xfe, 0x39, 0x0f, 0x96, 0xb9, 0xac, 0x3f, 0xf4, 0x6b,
6879
-	0x7e, 0x29, 0xaa, 0x44, 0xe3, 0x2c, 0x3c, 0x7f, 0x6d, 0x41, 0x5a, 0x88, 0x08, 0x46, 0xd3, 0x0f,
6880
-	0xa0, 0xe0, 0x85, 0x27, 0x5f, 0x75, 0x69, 0x40, 0x0e, 0x7d, 0xf3, 0x6a, 0xcb, 0x61, 0x4b, 0xd9,
6881
-	0x9a, 0x91, 0x49, 0x5d, 0x01, 0x5e, 0x20, 0x29, 0x0f, 0xcc, 0x7b, 0x2c, 0x87, 0xc7, 0x7d, 0xf4,
6882
-	0x0d, 0xa4, 0xbd, 0x90, 0x0c, 0x4c, 0x15, 0x9d, 0xb8, 0x82, 0x56, 0xbb, 0xf6, 0xc2, 0xc4, 0x5c,
6883
-	0x3d, 0x77, 0x71, 0xbe, 0x96, 0x56, 0x06, 0xac, 0x69, 0x68, 0x35, 0x2e, 0x64, 0xd5, 0x48, 0xfa,
6884
-	0x3a, 0xcf, 0xe1, 0x29, 0x8b, 0x8a, 0x1b, 0x2f, 0xe8, 0x71, 0x2a, 0x84, 0xbe, 0xd8, 0x73, 0x38,
6885
-	0xee, 0xa2, 0x12, 0x64, 0x4d, 0x39, 0xac, 0xeb, 0xdf, 0xbc, 0x2a, 0x35, 0x8d, 0xa1, 0xbe, 0x04,
6886
-	0x56, 0xb4, 0x1b, 0xdd, 0x23, 0xce, 0x06, 0x95, 0x7f, 0xa5, 0xc1, 0xda, 0xf2, 0x87, 0x42, 0x9a,
6887
-	0xca, 0xe6, 0x83, 0x6d, 0xfe, 0x2b, 0x58, 0x26, 0xfa, 0xef, 0x00, 0x09, 0x54, 0x99, 0xa0, 0x5f,
6888
-	0x19, 0xe6, 0x00, 0x1e, 0x26, 0xba, 0x1b, 0x83, 0xa3, 0x17, 0x49, 0x3d, 0xa3, 0x7c, 0xda, 0x29,
6889
-	0x5c, 0x24, 0x97, 0xbe, 0xa0, 0x0e, 0x2c, 0x31, 0xee, 0xf4, 0xa9, 0x90, 0x51, 0x71, 0x61, 0x5e,
6890
-	0xd3, 0x89, 0xff, 0x59, 0xf6, 0xa6, 0x81, 0xe6, 0x66, 0x8d, 0x66, 0x3b, 0xeb, 0x03, 0x3d, 0x86,
6891
-	0x34, 0x27, 0x47, 0xf1, 0x8b, 0x29, 0x31, 0x48, 0x30, 0x39, 0x92, 0x33, 0x2e, 0x34, 0x03, 0xfd,
6892
-	0x1c, 0xc0, 0xf5, 0x44, 0x48, 0xa4, 0xd3, 0xa7, 0xdc, 0x1c, 0x76, 0xe2, 0x12, 0x1b, 0x63, 0xd4,
6893
-	0x8c, 0x97, 0x29, 0x36, 0x7a, 0x06, 0x79, 0x87, 0xc4, 0x72, 0xcd, 0x5c, 0xfd, 0x8b, 0x61, 0xab,
6894
-	0x66, 0x5c, 0x14, 0x95, 0x8b, 0x8b, 0xf3, 0xb5, 0x5c, 0x6c, 0xc1, 0x39, 0x87, 0x18, 0xf9, 0x3e,
6895
-	0x83, 0x25, 0x49, 0xc4, 0x71, 0xd7, 0x8d, 0xd2, 0x59, 0x24, 0x93, 0x2b, 0x2a, 0x05, 0xf5, 0x8e,
6896
-	0x35, 0x69, 0x2f, 0x3e, 0xce, 0x82, 0x9c, 0xb2, 0xa1, 0x5f, 0xc0, 0x32, 0x0d, 0x1c, 0x3e, 0xd2,
6897
-	0x62, 0x8d, 0x67, 0x98, 0xbb, 0x7a, 0xb1, 0xcd, 0x31, 0x78, 0x66, 0xb1, 0x45, 0x7a, 0xc9, 0x5e,
6898
-	0xf9, 0x6b, 0x0a, 0x20, 0x2a, 0xbe, 0x3e, 0xac, 0x00, 0x11, 0xa4, 0x5d, 0x22, 0x89, 0xd6, 0x5c,
6899
-	0x01, 0xeb, 0x36, 0x7a, 0x02, 0x20, 0xe9, 0x20, 0x54, 0xa9, 0x37, 0xe8, 0x19, 0xd9, 0xbc, 0x2b,
6900
-	0x1d, 0x4c, 0xa1, 0xd1, 0x26, 0x64, 0xcc, 0xbb, 0x36, 0x7d, 0x2d, 0xcf, 0x20, 0x2b, 0x7f, 0x48,
6901
-	0x01, 0x44, 0xcb, 0xfc, 0x9f, 0x5e, 0x5b, 0xdd, 0x7e, 0xf3, 0xfd, 0xea, 0xdc, 0x5f, 0xbe, 0x5f,
6902
-	0x9d, 0xfb, 0xcd, 0xc5, 0x6a, 0xea, 0xcd, 0xc5, 0x6a, 0xea, 0xcf, 0x17, 0xab, 0xa9, 0xbf, 0x5d,
6903
-	0xac, 0xa6, 0x0e, 0x33, 0xba, 0x3e, 0xfa, 0xe1, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x32, 0x89,
6904
-	0x54, 0x8a, 0x4d, 0x16, 0x00, 0x00,
6768
+	// 2178 bytes of a gzipped FileDescriptorProto
6769
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4f, 0x6f, 0x1b, 0xb9,
6770
+	0x15, 0xb7, 0x6c, 0x59, 0x7f, 0x9e, 0xe4, 0x44, 0xe6, 0x26, 0xd9, 0xb1, 0x92, 0xd8, 0x8a, 0x36,
6771
+	0x9b, 0x7a, 0x77, 0x51, 0x19, 0x75, 0x17, 0xdb, 0x6c, 0xd2, 0x6d, 0x2b, 0x59, 0x5a, 0x5b, 0x4d,
6772
+	0x62, 0x0b, 0x94, 0xe3, 0x36, 0x40, 0x01, 0x81, 0x9e, 0xa1, 0x25, 0xc2, 0xa3, 0xe1, 0x94, 0xa4,
6773
+	0x1c, 0xe8, 0xd6, 0xe3, 0xc2, 0xfd, 0x0c, 0x46, 0x0f, 0x45, 0xef, 0xed, 0xb7, 0xc8, 0xb1, 0xc7,
6774
+	0xf6, 0x62, 0x74, 0xfd, 0x15, 0x7a, 0xeb, 0xa5, 0x05, 0x39, 0x1c, 0xfd, 0x71, 0xe4, 0x38, 0x45,
6775
+	0x73, 0xe8, 0x8d, 0x7c, 0xf3, 0xfb, 0x3d, 0xfe, 0xfb, 0xbd, 0xc7, 0xc7, 0x81, 0xcf, 0xbb, 0x4c,
6776
+	0xf5, 0x06, 0x87, 0x15, 0x97, 0xf7, 0x37, 0x3c, 0xee, 0x1e, 0x53, 0xb1, 0x21, 0x5f, 0x13, 0xd1,
6777
+	0x3f, 0x66, 0x6a, 0x83, 0x84, 0x6c, 0x43, 0x86, 0xd4, 0x95, 0x95, 0x50, 0x70, 0xc5, 0x11, 0x8a,
6778
+	0x00, 0x95, 0x18, 0x50, 0x39, 0xf9, 0x51, 0xf1, 0x3a, 0xbe, 0x1a, 0x86, 0xd4, 0xf2, 0x8b, 0xb7,
6779
+	0xba, 0xbc, 0xcb, 0x4d, 0x73, 0x43, 0xb7, 0xac, 0x75, 0xb5, 0xcb, 0x79, 0xd7, 0xa7, 0x1b, 0xa6,
6780
+	0x77, 0x38, 0x38, 0xda, 0xf0, 0x06, 0x82, 0x28, 0xc6, 0x03, 0xfb, 0x7d, 0xe5, 0xf2, 0x77, 0x12,
6781
+	0x0c, 0xaf, 0xa2, 0xbe, 0x16, 0x24, 0x0c, 0xa9, 0xb0, 0x03, 0x96, 0xcf, 0x92, 0x90, 0xd9, 0xe5,
6782
+	0x1e, 0x6d, 0x87, 0xd4, 0x45, 0xdb, 0x90, 0x23, 0x41, 0xc0, 0x95, 0xf1, 0x2d, 0x9d, 0x44, 0x29,
6783
+	0xb1, 0x9e, 0xdb, 0x5c, 0xab, 0xbc, 0xbd, 0xa6, 0x4a, 0x75, 0x0c, 0xab, 0x25, 0xdf, 0x9c, 0xaf,
6784
+	0xcd, 0xe1, 0x49, 0x26, 0xfa, 0x39, 0xe4, 0x3d, 0x2a, 0x99, 0xa0, 0x5e, 0x47, 0x70, 0x9f, 0x3a,
6785
+	0xf3, 0xa5, 0xc4, 0xfa, 0x8d, 0xcd, 0x7b, 0xb3, 0x3c, 0xe9, 0xc1, 0x31, 0xf7, 0x29, 0xce, 0x59,
6786
+	0x86, 0xee, 0xa0, 0x6d, 0x80, 0x3e, 0xed, 0x1f, 0x52, 0x21, 0x7b, 0x2c, 0x74, 0x16, 0x0c, 0xfd,
6787
+	0x07, 0x57, 0xd1, 0xf5, 0xdc, 0x2b, 0x2f, 0x46, 0x70, 0x3c, 0x41, 0x45, 0x2f, 0x20, 0x4f, 0x4e,
6788
+	0x08, 0xf3, 0xc9, 0x21, 0xf3, 0x99, 0x1a, 0x3a, 0x49, 0xe3, 0xea, 0xb3, 0x77, 0xba, 0xaa, 0x4e,
6789
+	0x10, 0xf0, 0x14, 0xbd, 0xec, 0x01, 0x8c, 0x07, 0x42, 0x8f, 0x20, 0xdd, 0x6a, 0xec, 0xd6, 0x9b,
6790
+	0xbb, 0xdb, 0x85, 0xb9, 0xe2, 0xca, 0xe9, 0x59, 0xe9, 0xb6, 0xf6, 0x31, 0x06, 0xb4, 0x68, 0xe0,
6791
+	0xb1, 0xa0, 0x8b, 0xd6, 0x21, 0x53, 0xdd, 0xda, 0x6a, 0xb4, 0xf6, 0x1b, 0xf5, 0x42, 0xa2, 0x58,
6792
+	0x3c, 0x3d, 0x2b, 0xdd, 0x99, 0x06, 0x56, 0x5d, 0x97, 0x86, 0x8a, 0x7a, 0xc5, 0xe4, 0x77, 0x7f,
6793
+	0x5c, 0x9d, 0x2b, 0x7f, 0x97, 0x80, 0xfc, 0xe4, 0x24, 0xd0, 0x23, 0x48, 0x55, 0xb7, 0xf6, 0x9b,
6794
+	0x07, 0x8d, 0xc2, 0xdc, 0x98, 0x3e, 0x89, 0xa8, 0xba, 0x8a, 0x9d, 0x50, 0xf4, 0x10, 0x16, 0x5b,
6795
+	0xd5, 0x97, 0xed, 0x46, 0x21, 0x31, 0x9e, 0xce, 0x24, 0xac, 0x45, 0x06, 0xd2, 0xa0, 0xea, 0xb8,
6796
+	0xda, 0xdc, 0x2d, 0xcc, 0xcf, 0x46, 0xd5, 0x05, 0x61, 0x81, 0x9d, 0xca, 0x1f, 0x92, 0x90, 0x6b,
6797
+	0x53, 0x71, 0xc2, 0xdc, 0x0f, 0x2c, 0x91, 0xaf, 0x20, 0xa9, 0x88, 0x3c, 0x36, 0xd2, 0xc8, 0xcd,
6798
+	0x96, 0xc6, 0x3e, 0x91, 0xc7, 0x7a, 0x50, 0x4b, 0x37, 0x78, 0xad, 0x0c, 0x41, 0x43, 0x9f, 0xb9,
6799
+	0x44, 0x51, 0xcf, 0x28, 0x23, 0xb7, 0xf9, 0xe9, 0x2c, 0x36, 0x1e, 0xa1, 0xec, 0xfc, 0x77, 0xe6,
6800
+	0xf0, 0x04, 0x15, 0x3d, 0x85, 0x54, 0xd7, 0xe7, 0x87, 0xc4, 0x37, 0x9a, 0xc8, 0x6d, 0x3e, 0x98,
6801
+	0xe5, 0x64, 0xdb, 0x20, 0xc6, 0x0e, 0x2c, 0x05, 0x3d, 0x86, 0xd4, 0x20, 0xf4, 0x88, 0xa2, 0x4e,
6802
+	0xca, 0x90, 0x4b, 0xb3, 0xc8, 0x2f, 0x0d, 0x62, 0x8b, 0x07, 0x47, 0xac, 0x8b, 0x2d, 0x1e, 0x3d,
6803
+	0x83, 0x4c, 0x40, 0xd5, 0x6b, 0x2e, 0x8e, 0xa5, 0x93, 0x2e, 0x2d, 0xac, 0xe7, 0x36, 0xbf, 0x98,
6804
+	0x29, 0xc6, 0x08, 0x53, 0x55, 0x8a, 0xb8, 0xbd, 0x3e, 0x0d, 0x54, 0xe4, 0xa6, 0x36, 0xef, 0x24,
6805
+	0xf0, 0xc8, 0x01, 0xfa, 0x29, 0x64, 0x68, 0xe0, 0x85, 0x9c, 0x05, 0xca, 0xc9, 0x5c, 0x3d, 0x91,
6806
+	0x86, 0xc5, 0xe8, 0xcd, 0xc4, 0x23, 0x86, 0x66, 0x0b, 0xee, 0xfb, 0x87, 0xc4, 0x3d, 0x76, 0xb2,
6807
+	0xef, 0xb9, 0x8c, 0x11, 0xa3, 0x96, 0x82, 0x64, 0x9f, 0x7b, 0xb4, 0xbc, 0x01, 0xcb, 0x6f, 0x6d,
6808
+	0x35, 0x2a, 0x42, 0xc6, 0x6e, 0x75, 0xa4, 0x91, 0x24, 0x1e, 0xf5, 0xcb, 0x37, 0x61, 0x69, 0x6a,
6809
+	0x5b, 0xcb, 0x7f, 0x5e, 0x84, 0x4c, 0x7c, 0xd6, 0xa8, 0x0a, 0x59, 0x97, 0x07, 0x8a, 0xb0, 0x80,
6810
+	0x0a, 0x2b, 0xaf, 0x99, 0x27, 0xb3, 0x15, 0x83, 0x34, 0x6b, 0x67, 0x0e, 0x8f, 0x59, 0xe8, 0x5b,
6811
+	0xc8, 0x0a, 0x2a, 0xf9, 0x40, 0xb8, 0x54, 0x5a, 0x7d, 0xad, 0xcf, 0x56, 0x48, 0x04, 0xc2, 0xf4,
6812
+	0xb7, 0x03, 0x26, 0xa8, 0xde, 0x65, 0x89, 0xc7, 0x54, 0xf4, 0x14, 0xd2, 0x82, 0x4a, 0x45, 0x84,
6813
+	0x7a, 0x97, 0x44, 0x70, 0x04, 0x69, 0x71, 0x9f, 0xb9, 0x43, 0x1c, 0x33, 0xd0, 0x53, 0xc8, 0x86,
6814
+	0x3e, 0x71, 0x8d, 0x57, 0x67, 0xd1, 0xd0, 0xef, 0xcf, 0xa2, 0xb7, 0x62, 0x10, 0x1e, 0xe3, 0xd1,
6815
+	0xd7, 0x00, 0x3e, 0xef, 0x76, 0x3c, 0xc1, 0x4e, 0xa8, 0xb0, 0x12, 0x2b, 0xce, 0x62, 0xd7, 0x0d,
6816
+	0x02, 0x67, 0x7d, 0xde, 0x8d, 0x9a, 0x68, 0xfb, 0x7f, 0xd2, 0xd7, 0x84, 0xb6, 0x9e, 0x01, 0x90,
6817
+	0xd1, 0x57, 0xab, 0xae, 0xcf, 0xde, 0xcb, 0x95, 0x3d, 0x91, 0x09, 0x3a, 0x7a, 0x00, 0xf9, 0x23,
6818
+	0x2e, 0x5c, 0xda, 0xb1, 0x51, 0x93, 0x35, 0x9a, 0xc8, 0x19, 0x5b, 0xa4, 0x2f, 0x54, 0x83, 0x74,
6819
+	0x97, 0x06, 0x54, 0x30, 0xd7, 0x01, 0x33, 0xd8, 0xa3, 0x99, 0x01, 0x19, 0x41, 0xf0, 0x20, 0x50,
6820
+	0xac, 0x4f, 0xed, 0x48, 0x31, 0x11, 0xfd, 0x06, 0x3e, 0x8a, 0x8f, 0xaf, 0x23, 0xe8, 0x11, 0x15,
6821
+	0x34, 0xd0, 0x1a, 0xc8, 0x99, 0x7d, 0xf8, 0xf4, 0xdd, 0x1a, 0xb0, 0x68, 0x9b, 0x6c, 0x90, 0xb8,
6822
+	0xfc, 0x41, 0xd6, 0xb2, 0x90, 0x16, 0xd1, 0xb8, 0xe5, 0xdf, 0x27, 0xb4, 0xea, 0x2f, 0x21, 0xd0,
6823
+	0x06, 0xe4, 0x46, 0xc3, 0x33, 0xcf, 0xa8, 0x37, 0x5b, 0xbb, 0x71, 0x71, 0xbe, 0x06, 0x31, 0xb6,
6824
+	0x59, 0xd7, 0x39, 0xc8, 0xb6, 0x3d, 0xd4, 0x80, 0xa5, 0x11, 0x41, 0x97, 0x01, 0xf6, 0xa2, 0x2c,
6825
+	0xbd, 0x6b, 0xa6, 0xfb, 0xc3, 0x90, 0xe2, 0xbc, 0x98, 0xe8, 0x95, 0x7f, 0x0d, 0xe8, 0xed, 0x7d,
6826
+	0x41, 0x08, 0x92, 0xc7, 0x2c, 0xb0, 0xd3, 0xc0, 0xa6, 0x8d, 0x2a, 0x90, 0x0e, 0xc9, 0xd0, 0xe7,
6827
+	0xc4, 0xb3, 0x81, 0x71, 0xab, 0x12, 0x15, 0x08, 0x95, 0xb8, 0x40, 0xa8, 0x54, 0x83, 0x21, 0x8e,
6828
+	0x41, 0xe5, 0x67, 0x70, 0x7b, 0xe6, 0xf1, 0xa2, 0x4d, 0xc8, 0x8f, 0x02, 0x6e, 0xbc, 0xd6, 0x9b,
6829
+	0x17, 0xe7, 0x6b, 0xb9, 0x51, 0x64, 0x36, 0xeb, 0x38, 0x37, 0x02, 0x35, 0xbd, 0xf2, 0xe9, 0x12,
6830
+	0x2c, 0x4d, 0x85, 0x2d, 0xba, 0x05, 0x8b, 0xac, 0x4f, 0xba, 0xd4, 0xce, 0x31, 0xea, 0xa0, 0x06,
6831
+	0xa4, 0x7c, 0x72, 0x48, 0x7d, 0x1d, 0xbc, 0xfa, 0xe0, 0x7e, 0x78, 0x6d, 0xfc, 0x57, 0x9e, 0x1b,
6832
+	0x7c, 0x23, 0x50, 0x62, 0x88, 0x2d, 0x19, 0x39, 0x90, 0x76, 0x79, 0xbf, 0x4f, 0x02, 0x7d, 0x4d,
6833
+	0x2c, 0xac, 0x67, 0x71, 0xdc, 0xd5, 0x3b, 0x43, 0x44, 0x57, 0x3a, 0x49, 0x63, 0x36, 0x6d, 0x54,
6834
+	0x80, 0x05, 0x1a, 0x9c, 0x38, 0x8b, 0xc6, 0xa4, 0x9b, 0xda, 0xe2, 0xb1, 0x28, 0xfa, 0xb2, 0x58,
6835
+	0x37, 0x35, 0x6f, 0x20, 0xa9, 0x70, 0xd2, 0xd1, 0x8e, 0xea, 0x36, 0xfa, 0x09, 0xa4, 0xfa, 0x7c,
6836
+	0x10, 0x28, 0xe9, 0x64, 0xcc, 0x64, 0x57, 0x66, 0x4d, 0xf6, 0x85, 0x46, 0x58, 0x65, 0x59, 0x38,
6837
+	0x6a, 0xc0, 0xb2, 0x54, 0x3c, 0xec, 0x74, 0x05, 0x71, 0x69, 0x27, 0xa4, 0x82, 0x71, 0xcf, 0xa6,
6838
+	0xe1, 0x95, 0xb7, 0x0e, 0xa5, 0x6e, 0x0b, 0x3e, 0x7c, 0x53, 0x73, 0xb6, 0x35, 0xa5, 0x65, 0x18,
6839
+	0xa8, 0x05, 0xf9, 0x70, 0xe0, 0xfb, 0x1d, 0x1e, 0x46, 0x37, 0x72, 0x14, 0x3b, 0xef, 0xb1, 0x65,
6840
+	0xad, 0x81, 0xef, 0xef, 0x45, 0x24, 0x9c, 0x0b, 0xc7, 0x1d, 0x74, 0x07, 0x52, 0x5d, 0xc1, 0x07,
6841
+	0x61, 0x14, 0x37, 0x59, 0x6c, 0x7b, 0xe8, 0x1b, 0x48, 0x4b, 0xea, 0x0a, 0xaa, 0xa4, 0x93, 0x37,
6842
+	0x4b, 0xfd, 0x64, 0xd6, 0x20, 0x6d, 0x03, 0x19, 0xc5, 0x04, 0x8e, 0x39, 0x68, 0x05, 0x16, 0x94,
6843
+	0x1a, 0x3a, 0x4b, 0xa5, 0xc4, 0x7a, 0xa6, 0x96, 0xbe, 0x38, 0x5f, 0x5b, 0xd8, 0xdf, 0x7f, 0x85,
6844
+	0xb5, 0x4d, 0xdf, 0x16, 0x3d, 0x2e, 0x55, 0x40, 0xfa, 0xd4, 0xb9, 0x61, 0xf6, 0x76, 0xd4, 0x47,
6845
+	0xaf, 0x00, 0xbc, 0x40, 0x76, 0x5c, 0x93, 0x9e, 0x9c, 0x9b, 0x66, 0x75, 0x5f, 0x5c, 0xbf, 0xba,
6846
+	0xfa, 0x6e, 0xdb, 0xde, 0x98, 0x4b, 0x17, 0xe7, 0x6b, 0xd9, 0x51, 0x17, 0x67, 0xbd, 0x40, 0x46,
6847
+	0x4d, 0x54, 0x83, 0x5c, 0x8f, 0x12, 0x5f, 0xf5, 0xdc, 0x1e, 0x75, 0x8f, 0x9d, 0xc2, 0xd5, 0x57,
6848
+	0xe0, 0x8e, 0x81, 0x59, 0x0f, 0x93, 0x24, 0xad, 0x60, 0x3d, 0x55, 0xe9, 0x2c, 0x9b, 0xbd, 0x8a,
6849
+	0x3a, 0xe8, 0x3e, 0x00, 0x0f, 0x69, 0xd0, 0x91, 0xca, 0x63, 0x81, 0x83, 0xf4, 0x92, 0x71, 0x56,
6850
+	0x5b, 0xda, 0xda, 0x80, 0xee, 0xea, 0x0b, 0x8a, 0x78, 0x1d, 0x1e, 0xf8, 0x43, 0xe7, 0x23, 0xf3,
6851
+	0x35, 0xa3, 0x0d, 0x7b, 0x81, 0x3f, 0x44, 0x6b, 0x90, 0x33, 0xba, 0x90, 0xac, 0x1b, 0x10, 0xdf,
6852
+	0xb9, 0x65, 0xf6, 0x03, 0xb4, 0xa9, 0x6d, 0x2c, 0xfa, 0x1c, 0xa2, 0xdd, 0x90, 0xce, 0xed, 0xab,
6853
+	0xcf, 0xc1, 0x4e, 0x76, 0x7c, 0x0e, 0x96, 0x83, 0x7e, 0x06, 0x10, 0x0a, 0x76, 0xc2, 0x7c, 0xda,
6854
+	0xa5, 0xd2, 0xb9, 0x63, 0x16, 0xbd, 0x3a, 0xf3, 0x66, 0x1a, 0xa1, 0xf0, 0x04, 0x03, 0x55, 0x20,
6855
+	0xc9, 0x02, 0xa6, 0x9c, 0x8f, 0xed, 0xad, 0x74, 0x59, 0xaa, 0x35, 0xce, 0xfd, 0x03, 0xe2, 0x0f,
6856
+	0x28, 0x36, 0x38, 0xd4, 0x84, 0x2c, 0x93, 0xdc, 0x37, 0xf2, 0x75, 0x1c, 0x93, 0xdf, 0xde, 0xe3,
6857
+	0xfc, 0x9a, 0x31, 0x05, 0x8f, 0xd9, 0xe8, 0x1e, 0x64, 0x43, 0xe6, 0xc9, 0xe7, 0xac, 0xcf, 0x94,
6858
+	0xb3, 0x52, 0x4a, 0xac, 0x2f, 0xe0, 0xb1, 0x01, 0xed, 0x40, 0x5a, 0x0e, 0xa5, 0xab, 0x7c, 0xe9,
6859
+	0x14, 0xcd, 0xbe, 0x54, 0xae, 0x1f, 0xa6, 0x1d, 0x11, 0xa2, 0xc4, 0x11, 0xd3, 0x51, 0x19, 0xf2,
6860
+	0x2e, 0x09, 0xa3, 0x6a, 0x98, 0x51, 0xe9, 0xdc, 0x35, 0x67, 0x3b, 0x65, 0x2b, 0x7e, 0x0d, 0xb9,
6861
+	0x89, 0xa4, 0xa3, 0x93, 0xc5, 0x31, 0x1d, 0xda, 0x3c, 0xa6, 0x9b, 0x5a, 0x19, 0x27, 0x7a, 0x1b,
6862
+	0x4c, 0xa2, 0xcd, 0xe2, 0xa8, 0xf3, 0x64, 0xfe, 0x71, 0xa2, 0xb8, 0x09, 0xb9, 0x89, 0xe0, 0x43,
6863
+	0x9f, 0xe8, 0x4b, 0xa0, 0xcb, 0xa4, 0x12, 0xc3, 0x0e, 0x19, 0xa8, 0x9e, 0xf3, 0x0b, 0x43, 0xc8,
6864
+	0xc7, 0xc6, 0xea, 0x40, 0xf5, 0x8a, 0x1d, 0x18, 0x6b, 0x18, 0x95, 0x20, 0xa7, 0x63, 0x43, 0x52,
6865
+	0x71, 0x42, 0x85, 0x2e, 0xb0, 0xf4, 0xf4, 0x26, 0x4d, 0x3a, 0x86, 0x25, 0x25, 0xc2, 0xed, 0x99,
6866
+	0x14, 0x9a, 0xc5, 0xb6, 0xa7, 0x73, 0x62, 0x9c, 0x28, 0x6c, 0x4e, 0xb4, 0xdd, 0xe2, 0x13, 0xc8,
6867
+	0x4f, 0x6e, 0xc6, 0x7f, 0xb3, 0xa0, 0xf2, 0x5f, 0x12, 0x90, 0x1d, 0x1d, 0x18, 0xfa, 0x12, 0x96,
6868
+	0x9b, 0xed, 0xbd, 0xe7, 0xd5, 0xfd, 0xe6, 0xde, 0x6e, 0xa7, 0xde, 0xf8, 0xb6, 0xfa, 0xf2, 0xf9,
6869
+	0x7e, 0x61, 0xae, 0x78, 0xff, 0xf4, 0xac, 0xb4, 0x32, 0xbe, 0x1b, 0x62, 0x78, 0x9d, 0x1e, 0x91,
6870
+	0x81, 0xaf, 0xa6, 0x59, 0x2d, 0xbc, 0xb7, 0xd5, 0x68, 0xb7, 0x0b, 0x89, 0xab, 0x58, 0x2d, 0xc1,
6871
+	0x5d, 0x2a, 0x25, 0xda, 0x84, 0xc2, 0x98, 0xb5, 0xf3, 0xaa, 0xd5, 0xc0, 0x07, 0x85, 0xf9, 0xe2,
6872
+	0xbd, 0xd3, 0xb3, 0x92, 0xf3, 0x36, 0x69, 0x67, 0x18, 0x52, 0x71, 0x60, 0x1f, 0x36, 0xff, 0x4c,
6873
+	0x40, 0x7e, 0xb2, 0x2e, 0x46, 0x5b, 0x51, 0x3d, 0x6b, 0x56, 0x7c, 0x63, 0x73, 0xe3, 0xba, 0x3a,
6874
+	0xda, 0xdc, 0xc7, 0xfe, 0x40, 0xfb, 0x7d, 0xa1, 0x9f, 0xb0, 0x86, 0x8c, 0xbe, 0x84, 0xc5, 0x90,
6875
+	0x0b, 0x15, 0xdf, 0x5c, 0xb3, 0xe3, 0x8a, 0x8b, 0xb8, 0xda, 0x8a, 0xc0, 0xe5, 0x1e, 0xdc, 0x98,
6876
+	0xf6, 0x86, 0x1e, 0xc2, 0xc2, 0x41, 0xb3, 0x55, 0x98, 0x2b, 0xde, 0x3d, 0x3d, 0x2b, 0x7d, 0x3c,
6877
+	0xfd, 0xf1, 0x80, 0x09, 0x35, 0x20, 0x7e, 0xb3, 0x85, 0x3e, 0x87, 0xc5, 0xfa, 0x6e, 0x1b, 0xe3,
6878
+	0x42, 0xa2, 0xb8, 0x76, 0x7a, 0x56, 0xba, 0x3b, 0x8d, 0xd3, 0x9f, 0xf8, 0x20, 0xf0, 0x30, 0x3f,
6879
+	0x1c, 0x3d, 0xe7, 0xfe, 0x35, 0x0f, 0x39, 0x7b, 0xa1, 0x7f, 0xe8, 0x17, 0xff, 0x52, 0x54, 0xad,
6880
+	0xc6, 0x99, 0x7a, 0xfe, 0xda, 0xa2, 0x35, 0x1f, 0x11, 0xac, 0xa6, 0x1f, 0x40, 0x9e, 0x85, 0x27,
6881
+	0x5f, 0x75, 0x68, 0x40, 0x0e, 0x7d, 0xfb, 0xb2, 0xcb, 0xe0, 0x9c, 0xb6, 0x35, 0x22, 0x93, 0xbe,
6882
+	0x26, 0x58, 0xa0, 0xa8, 0x08, 0xec, 0x9b, 0x2d, 0x83, 0x47, 0x7d, 0xf4, 0x0d, 0x24, 0x59, 0x48,
6883
+	0xfa, 0xb6, 0xd2, 0x9e, 0xb9, 0x82, 0x66, 0xab, 0xfa, 0xc2, 0xc6, 0x5c, 0x2d, 0x73, 0x71, 0xbe,
6884
+	0x96, 0xd4, 0x06, 0x6c, 0x68, 0x68, 0x35, 0x2e, 0x76, 0xf5, 0x48, 0xe6, 0xca, 0xcf, 0xe0, 0x09,
6885
+	0x8b, 0x8e, 0x1b, 0x16, 0x74, 0x05, 0x95, 0xd2, 0x5c, 0xfe, 0x19, 0x1c, 0x77, 0x51, 0x11, 0xd2,
6886
+	0xb6, 0x64, 0x36, 0x35, 0x72, 0x56, 0x97, 0xa3, 0xd6, 0x50, 0x5b, 0x82, 0x5c, 0xb4, 0x1b, 0x9d,
6887
+	0x23, 0xc1, 0xfb, 0xe5, 0x7f, 0x27, 0x21, 0xb7, 0xe5, 0x0f, 0xa4, 0xb2, 0xd5, 0xcf, 0x07, 0xdb,
6888
+	0xfc, 0x57, 0xb0, 0x4c, 0xcc, 0x1f, 0x04, 0x12, 0xe8, 0x52, 0xc2, 0xbc, 0x44, 0xec, 0x01, 0x3c,
6889
+	0x9c, 0xe9, 0x6e, 0x04, 0x8e, 0x5e, 0x2d, 0xb5, 0x94, 0xf6, 0xe9, 0x24, 0x70, 0x81, 0x5c, 0xfa,
6890
+	0x82, 0xda, 0xb0, 0xc4, 0x85, 0xdb, 0xa3, 0x52, 0x45, 0x05, 0x88, 0x7d, 0x71, 0xcf, 0xfc, 0x17,
6891
+	0xb3, 0x37, 0x09, 0xb4, 0xb7, 0x6f, 0x34, 0xdb, 0x69, 0x1f, 0xe8, 0x31, 0x24, 0x05, 0x39, 0x8a,
6892
+	0x5f, 0x55, 0x33, 0x83, 0x04, 0x93, 0x23, 0x35, 0xe5, 0xc2, 0x30, 0xd0, 0x2f, 0x01, 0x3c, 0x26,
6893
+	0x43, 0xa2, 0xdc, 0x1e, 0x15, 0xf6, 0xb0, 0x67, 0x2e, 0xb1, 0x3e, 0x42, 0x4d, 0x79, 0x99, 0x60,
6894
+	0xa3, 0x67, 0x90, 0x75, 0x49, 0x2c, 0xd7, 0xd4, 0xd5, 0xbf, 0x21, 0xb6, 0xaa, 0xd6, 0x45, 0x41,
6895
+	0xbb, 0xb8, 0x38, 0x5f, 0xcb, 0xc4, 0x16, 0x9c, 0x71, 0x89, 0x95, 0xef, 0x33, 0x58, 0x52, 0x44,
6896
+	0x1e, 0x77, 0xbc, 0x28, 0x9d, 0x45, 0x32, 0xb9, 0xa2, 0x9a, 0xd0, 0x6f, 0x5d, 0x9b, 0xf6, 0xe2,
6897
+	0xe3, 0xcc, 0xab, 0x09, 0x1b, 0xfa, 0x15, 0x2c, 0xd3, 0xc0, 0x15, 0x43, 0x23, 0xd6, 0x78, 0x86,
6898
+	0x99, 0xab, 0x17, 0xdb, 0x18, 0x81, 0xa7, 0x16, 0x5b, 0xa0, 0x97, 0xec, 0xe5, 0xbf, 0x27, 0x00,
6899
+	0xa2, 0x02, 0xed, 0xc3, 0x0a, 0x10, 0x41, 0xd2, 0x23, 0x8a, 0x18, 0xcd, 0xe5, 0xb1, 0x69, 0xa3,
6900
+	0x27, 0x00, 0x8a, 0xf6, 0x43, 0x9d, 0x7a, 0x83, 0xae, 0x95, 0xcd, 0xbb, 0xd2, 0xc1, 0x04, 0x1a,
6901
+	0x6d, 0x42, 0xca, 0xbe, 0x7d, 0x93, 0xd7, 0xf2, 0x2c, 0xb2, 0xfc, 0xa7, 0x04, 0x40, 0xb4, 0xcc,
6902
+	0xff, 0xeb, 0xb5, 0xd5, 0x9c, 0x37, 0xdf, 0xaf, 0xce, 0xfd, 0xed, 0xfb, 0xd5, 0xb9, 0xdf, 0x5d,
6903
+	0xac, 0x26, 0xde, 0x5c, 0xac, 0x26, 0xfe, 0x7a, 0xb1, 0x9a, 0xf8, 0xc7, 0xc5, 0x6a, 0xe2, 0x30,
6904
+	0x65, 0x6a, 0xa8, 0x1f, 0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x9c, 0x13, 0x42, 0x73, 0x71, 0x16,
6905
+	0x00, 0x00,
6905 6906
 }
... ...
@@ -333,6 +333,9 @@ message ContainerSpec {
333 333
 	//
334 334
 	// https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime
335 335
 	map<string, string> sysctls = 26;
336
+
337
+	// Capabilities is the list of Linux capabilities to be available for container (this overrides the default set of capabilities)
338
+	repeated string capabilities = 27;
336 339
 }
337 340
 
338 341
 // EndpointSpec defines the properties that can be configured to
... ...
@@ -184,7 +184,7 @@ func (a *Allocator) doNetworkAlloc(ctx context.Context, ev events.Event) {
184 184
 		}
185 185
 		if IsIngressNetwork(n) && nc.ingressNetwork != nil {
186 186
 			log.G(ctx).Errorf("Cannot allocate ingress network %s (%s) because another ingress network is already present: %s (%s)",
187
-				n.ID, n.Spec.Annotations.Name, nc.ingressNetwork.ID, nc.ingressNetwork.Spec.Annotations)
187
+				n.ID, n.Spec.Annotations.Name, nc.ingressNetwork.ID, nc.ingressNetwork.Spec.Annotations.Name)
188 188
 			break
189 189
 		}
190 190
 
... ...
@@ -968,3 +968,67 @@ func (s *Server) ListServices(ctx context.Context, request *api.ListServicesRequ
968 968
 		Services: services,
969 969
 	}, nil
970 970
 }
971
+
972
+// ListServiceStatuses returns a `ListServiceStatusesResponse` with the status
973
+// of the requested services, formed by computing the number of running vs
974
+// desired tasks. It is provided as a shortcut or helper method, which allows a
975
+// client to avoid having to calculate this value by listing all Tasks.  If any
976
+// service requested does not exist, it will be returned but with empty status
977
+// values.
978
+func (s *Server) ListServiceStatuses(ctx context.Context, req *api.ListServiceStatusesRequest) (*api.ListServiceStatusesResponse, error) {
979
+	resp := &api.ListServiceStatusesResponse{}
980
+	if req == nil {
981
+		return resp, nil
982
+	}
983
+
984
+	s.store.View(func(tx store.ReadTx) {
985
+		for _, id := range req.Services {
986
+			status := &api.ListServiceStatusesResponse_ServiceStatus{
987
+				ServiceID: id,
988
+			}
989
+			// no matter what, add this status to the list.
990
+			resp.Statuses = append(resp.Statuses, status)
991
+
992
+			tasks, findErr := store.FindTasks(tx, store.ByServiceID(id))
993
+			if findErr != nil {
994
+				// if there is another kind of error here (not sure what it
995
+				// could be) then still return 0/0 for this service.
996
+				continue
997
+			}
998
+
999
+			// use a boolean to see global vs replicated. this avoids us having to
1000
+			// iterate the task list twice.
1001
+			global := false
1002
+			service := store.GetService(tx, id)
1003
+			// a service might be deleted, but it may still have tasks. in that
1004
+			// case, we will be using 0 as the desired task count.
1005
+			if service != nil {
1006
+				// figure out how many tasks the service requires. for replicated
1007
+				// services, this is easy: we can just check the replicas field. for
1008
+				// global services, this is a bit harder and we'll need to do some
1009
+				// numbercrunchin
1010
+				if replicated := service.Spec.GetReplicated(); replicated != nil {
1011
+					status.DesiredTasks = replicated.Replicas
1012
+				} else {
1013
+					global = true
1014
+				}
1015
+			}
1016
+
1017
+			// now, figure out how many tasks are running. Pretty easy, and
1018
+			// universal across both global and replicated services
1019
+			for _, task := range tasks {
1020
+				if task.Status.State == api.TaskStateRunning {
1021
+					status.RunningTasks++
1022
+				}
1023
+				// if the service is global,  a shortcut for figuring out the
1024
+				// number of tasks desired is to look at all tasks, and take a
1025
+				// count of the ones whose desired state is not Shutdown.
1026
+				if global && task.DesiredState == api.TaskStateRunning {
1027
+					status.DesiredTasks++
1028
+				}
1029
+			}
1030
+		}
1031
+	})
1032
+
1033
+	return resp, nil
1034
+}
... ...
@@ -76,8 +76,22 @@ func (ce *ConstraintEnforcer) rejectNoncompliantTasks(node *api.Node) {
76 76
 		err   error
77 77
 	)
78 78
 
79
+	services := map[string]*api.Service{}
79 80
 	ce.store.View(func(tx store.ReadTx) {
80 81
 		tasks, err = store.FindTasks(tx, store.ByNodeID(node.ID))
82
+		if err != nil {
83
+			return
84
+		}
85
+
86
+		// Deduplicate service IDs using the services map. It's okay for the
87
+		// values to be nil for now, we will look them up from the store next.
88
+		for _, task := range tasks {
89
+			services[task.ServiceID] = nil
90
+		}
91
+
92
+		for serviceID := range services {
93
+			services[serviceID] = store.GetService(tx, serviceID)
94
+		}
81 95
 	})
82 96
 
83 97
 	if err != nil {
... ...
@@ -105,10 +119,44 @@ loop:
105 105
 			continue
106 106
 		}
107 107
 
108
-		// Ensure that the task still meets scheduling
109
-		// constraints.
110
-		if t.Spec.Placement != nil && len(t.Spec.Placement.Constraints) != 0 {
111
-			constraints, _ := constraint.Parse(t.Spec.Placement.Constraints)
108
+		// Ensure that the node still satisfies placement constraints.
109
+		// NOTE: If the task is associacted with a service then we must use the
110
+		// constraints from the current service spec rather than the
111
+		// constraints from the task spec because they may be outdated. This
112
+		// will happen if the service was previously updated in a way which
113
+		// only changes the placement constraints and the node matched the
114
+		// placement constraints both before and after that update. In the case
115
+		// of such updates, the tasks are not considered "dirty" and are not
116
+		// restarted but it will mean that the task spec's placement
117
+		// constraints are outdated. Consider this example:
118
+		// - A service is created with no constraints and a task is scheduled
119
+		//   to a node.
120
+		// - The node is updated to add a label, this doesn't affect the task
121
+		//   on that node because it has no constraints.
122
+		// - The service is updated to add a node label constraint which
123
+		//   matches the label which was just added to the node. The updater
124
+		//   does not shut down the task because the only the constraints have
125
+		//   changed and the node still matches the updated constraints.
126
+		// - The node is updated to remove the node label. The node no longer
127
+		//   satisfies the placement constraints of the service, so the task
128
+		//   should be shutdown. However, the task's spec still has the
129
+		//   original and outdated constraints (that are still satisfied by
130
+		//   the node). If we used those original constraints then the task
131
+		//   would incorrectly not be removed. This is why the constraints
132
+		//   from the service spec should be used instead.
133
+		var placement *api.Placement
134
+		if service := services[t.ServiceID]; service != nil {
135
+			// This task is associated with a service, so we use the service's
136
+			// current placement constraints.
137
+			placement = service.Spec.Task.Placement
138
+		} else {
139
+			// This task is not associated with a service (or the service no
140
+			// longer exists), so we use the placement constraints from the
141
+			// original task spec.
142
+			placement = t.Spec.Placement
143
+		}
144
+		if placement != nil && len(placement.Constraints) > 0 {
145
+			constraints, _ := constraint.Parse(placement.Constraints)
112 146
 			if !constraint.NodeMatches(constraints, node) {
113 147
 				removeTasks[t.ID] = t
114 148
 				continue
... ...
@@ -19,7 +19,7 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
19 19
 github.com/docker/go-metrics d466d4f6fd960e01820085bd7e1a24426ee7ef18
20 20
 
21 21
 # etcd/raft
22
-github.com/coreos/etcd v3.3.9
22
+github.com/coreos/etcd d57e8b8d97adfc4a6c224fe116714bf1a1f3beb9 # v3.3.12
23 23
 github.com/coreos/go-systemd v17
24 24
 github.com/coreos/pkg v3
25 25
 github.com/prometheus/client_golang v0.8.0
... ...
@@ -27,8 +27,8 @@ github.com/prometheus/client_model 6f3806018612930941127f2a7c6c453ba2c527d2
27 27
 github.com/prometheus/common 7600349dcfe1abd18d72d3a1770870d9800a7801
28 28
 github.com/prometheus/procfs 7d6f385de8bea29190f15ba9931442a0eaef9af7
29 29
 
30
-github.com/docker/distribution 83389a148052d74ac602f5f1d62f86ff2f3c4aa5
31
-github.com/docker/docker 5a718ef0f94f605fe4e4885937133c2f76ad2a41
30
+github.com/docker/distribution 0d3efadf0154c2b8a4e7b6621fff9809655cc580
31
+github.com/docker/docker 827cb09f87964ed38b46502f22a585f2ed4a78e1
32 32
 github.com/docker/go-connections 7395e3f8aa162843a74ed6d48e79627d9792ac55 # v0.4.0
33 33
 github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9
34 34
 github.com/docker/go-units 9e638d38cf6977a37a8ea0078f3ee75a7cdb2dd1
... ...
@@ -45,7 +45,7 @@ github.com/sirupsen/logrus v1.0.6
45 45
 github.com/beorn7/perks 3a771d992973f24aa725d07868b467d1ddfceaf
46 46
 github.com/cloudflare/cfssl 1.3.2
47 47
 github.com/dustin/go-humanize 8929fe90cee4b2cb9deb468b51fb34eba64d1bf0
48
-github.com/fernet/fernet-go 1b2437bc582b3cfbb341ee5a29f8ef5b42912ff2
48
+github.com/fernet/fernet-go 9eac43b88a5efb8651d24de9b68e87567e029736
49 49
 github.com/google/certificate-transparency-go v1.0.20
50 50
 github.com/hashicorp/go-immutable-radix 826af9ccf0feeee615d546d69b11f8e98da8c8f1 git://github.com/tonistiigi/go-immutable-radix.git
51 51
 github.com/hashicorp/go-memdb cb9a474f84cc5e41b273b20c6927680b2a8776ad
... ...
@@ -67,7 +67,7 @@ func verify(msg, tok []byte, ttl time.Duration, now time.Time, k *Key) []byte {
67 67
 		return nil
68 68
 	}
69 69
 	ts := time.Unix(int64(binary.BigEndian.Uint64(tok[1:])), 0)
70
-	if ttl >= 0 && (now.After(ts.Add(ttl)) || ts.After(now.Add(maxClockSkew))) {
70
+	if ttl > 0 && (now.After(ts.Add(ttl)) || ts.After(now.Add(maxClockSkew))) {
71 71
 		return nil
72 72
 	}
73 73
 	n := len(tok) - sha256.Size