docker: support group allocated ports and host_networks (#8623)

* docker: support group allocated ports

* docker: add new ports driver config to specify which group ports are mapped

* docker: update port mapping docs
This commit is contained in:
Nick Ethier
2020-08-11 18:30:22 -04:00
committed by GitHub
parent 8272654dab
commit c11dbcd001
11 changed files with 534 additions and 316 deletions

View File

@@ -936,6 +936,7 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig {
alloc := tr.Alloc()
invocationid := uuid.Generate()[:8]
taskResources := tr.taskResources
ports := tr.Alloc().AllocatedResources.Shared.Ports
env := tr.envBuilder.Build()
tr.networkIsolationLock.Lock()
defer tr.networkIsolationLock.Unlock()
@@ -964,6 +965,7 @@ func (tr *TaskRunner) buildTaskConfig() *drivers.TaskConfig {
CPUShares: taskResources.Cpu.CpuShares,
PercentTicks: float64(taskResources.Cpu.CpuShares) / float64(tr.clientConfig.Node.NodeResources.Cpu.CpuShares),
},
Ports: &ports,
},
Devices: tr.hookResources.getDevices(),
Mounts: tr.hookResources.getMounts(),

View File

@@ -347,6 +347,7 @@ var (
"runtime": hclspec.NewAttr("runtime", "string", false),
"pids_limit": hclspec.NewAttr("pids_limit", "number", false),
"pid_mode": hclspec.NewAttr("pid_mode", "string", false),
"ports": hclspec.NewAttr("ports", "list(string)", false),
"port_map": hclspec.NewAttr("port_map", "list(map(number))", false),
"privileged": hclspec.NewAttr("privileged", "bool", false),
"readonly_rootfs": hclspec.NewAttr("readonly_rootfs", "bool", false),
@@ -413,6 +414,7 @@ type TaskConfig struct {
Runtime string `codec:"runtime"`
PidsLimit int64 `codec:"pids_limit"`
PidMode string `codec:"pid_mode"`
Ports []string `codec:"ports"`
PortMap hclutils.MapStrInt `codec:"port_map"`
Privileged bool `codec:"privileged"`
ReadonlyRootfs bool `codec:"readonly_rootfs"`

View File

@@ -264,7 +264,8 @@ config {
network_aliases = ["redis"]
network_mode = "host"
pids_limit = 2000
pid_mode = "host"
pid_mode = "host"
ports = ["http", "https"]
port_map {
http = 80
redis = 6379
@@ -395,6 +396,7 @@ config {
NetworkMode: "host",
PidsLimit: 2000,
PidMode: "host",
Ports: []string{"http", "https"},
PortMap: map[string]int{
"http": 80,
"redis": 6379,

View File

@@ -1032,61 +1032,39 @@ func (d *Driver) createContainerConfig(task *drivers.TaskConfig, driverConfig *T
}
// Setup port mapping and exposed ports
if len(task.Resources.NomadResources.Networks) == 0 {
if len(driverConfig.PortMap) > 0 {
return c, fmt.Errorf("Trying to map ports but no network interface is available")
ports := newPublishedPorts(logger)
switch {
case task.Resources.Ports != nil && len(driverConfig.Ports) > 0:
// Do not set up docker port mapping if shared alloc networking is used
if strings.HasPrefix(hostConfig.NetworkMode, "container:") {
break
}
} else {
// TODO add support for more than one network
for _, port := range driverConfig.Ports {
if mapping, ok := task.Resources.Ports.Get(port); ok {
ports.add(mapping.Label, mapping.HostIP, mapping.Value, mapping.To)
} else {
return c, fmt.Errorf("Port %q not found, check network stanza", port)
}
}
case len(task.Resources.NomadResources.Networks) > 0:
network := task.Resources.NomadResources.Networks[0]
publishedPorts := map[docker.Port][]docker.PortBinding{}
exposedPorts := map[docker.Port]struct{}{}
for _, port := range network.ReservedPorts {
// By default we will map the allocated port 1:1 to the container
containerPortInt := port.Value
// If the user has mapped a port using port_map we'll change it here
if mapped, ok := driverConfig.PortMap[port.Label]; ok {
containerPortInt = mapped
}
hostPortStr := strconv.Itoa(port.Value)
containerPort := docker.Port(strconv.Itoa(containerPortInt))
publishedPorts[containerPort+"/tcp"] = getPortBinding(network.IP, hostPortStr)
publishedPorts[containerPort+"/udp"] = getPortBinding(network.IP, hostPortStr)
logger.Debug("allocated static port", "ip", network.IP, "port", port.Value)
exposedPorts[containerPort+"/tcp"] = struct{}{}
exposedPorts[containerPort+"/udp"] = struct{}{}
logger.Debug("exposed port", "port", port.Value)
ports.addMapped(port.Label, network.IP, port.Value, driverConfig.PortMap)
}
for _, port := range network.DynamicPorts {
// By default we will map the allocated port 1:1 to the container
containerPortInt := port.Value
// If the user has mapped a port using port_map we'll change it here
if mapped, ok := driverConfig.PortMap[port.Label]; ok {
containerPortInt = mapped
}
hostPortStr := strconv.Itoa(port.Value)
containerPort := docker.Port(strconv.Itoa(containerPortInt))
publishedPorts[containerPort+"/tcp"] = getPortBinding(network.IP, hostPortStr)
publishedPorts[containerPort+"/udp"] = getPortBinding(network.IP, hostPortStr)
logger.Debug("allocated mapped port", "ip", network.IP, "port", port.Value)
exposedPorts[containerPort+"/tcp"] = struct{}{}
exposedPorts[containerPort+"/udp"] = struct{}{}
logger.Debug("exposed port", "port", containerPort)
ports.addMapped(port.Label, network.IP, port.Value, driverConfig.PortMap)
}
hostConfig.PortBindings = publishedPorts
config.ExposedPorts = exposedPorts
default:
if len(driverConfig.PortMap) > 0 {
return c, fmt.Errorf("Trying to map ports but no network interface is available")
}
}
hostConfig.PortBindings = ports.publishedPorts
config.ExposedPorts = ports.exposedPorts
// If the user specified a custom command to run, we'll inject it here.
if driverConfig.Command != "" {

View File

@@ -1533,6 +1533,49 @@ func TestDockerDriver_PortsMapping(t *testing.T) {
require.Exactly(t, expectedPortBindings, container.HostConfig.PortBindings)
}
func TestDockerDriver_CreateContainerConfig_Ports(t *testing.T) {
t.Parallel()
task, cfg, ports := dockerTask(t)
defer freeport.Return(ports)
hostIP := "127.0.0.1"
if runtime.GOOS == "windows" {
hostIP = ""
}
portmappings := structs.AllocatedPorts(make([]structs.AllocatedPortMapping, len(ports)))
portmappings[0] = structs.AllocatedPortMapping{
Label: "main",
Value: ports[0],
HostIP: hostIP,
To: 8080,
}
portmappings[1] = structs.AllocatedPortMapping{
Label: "REDIS",
Value: ports[1],
HostIP: hostIP,
To: 6379,
}
task.Resources.Ports = &portmappings
cfg.Ports = []string{"main", "REDIS"}
dh := dockerDriverHarness(t, nil)
driver := dh.Impl().(*Driver)
c, err := driver.createContainerConfig(task, cfg, "org/repo:0.1")
require.NoError(t, err)
require.Equal(t, "org/repo:0.1", c.Config.Image)
// Verify that the correct ports are FORWARDED
expectedPortBindings := map[docker.Port][]docker.PortBinding{
docker.Port("8080/tcp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[0])}},
docker.Port("8080/udp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[0])}},
docker.Port("6379/tcp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[1])}},
docker.Port("6379/udp"): {{HostIP: hostIP, HostPort: fmt.Sprintf("%d", ports[1])}},
}
require.Exactly(t, expectedPortBindings, c.HostConfig.PortBindings)
}
func TestDockerDriver_CreateContainerConfig_PortsMapping(t *testing.T) {
t.Parallel()

52
drivers/docker/ports.go Normal file
View File

@@ -0,0 +1,52 @@
package docker
import (
"strconv"
docker "github.com/fsouza/go-dockerclient"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/nomad/helper/pluginutils/hclutils"
)
type publishedPorts struct {
logger hclog.Logger
publishedPorts map[docker.Port][]docker.PortBinding
exposedPorts map[docker.Port]struct{}
}
func newPublishedPorts(logger hclog.Logger) *publishedPorts {
return &publishedPorts{
logger: logger,
publishedPorts: map[docker.Port][]docker.PortBinding{},
exposedPorts: map[docker.Port]struct{}{},
}
}
// adds the port to the structures the Docker API expects for declaring mapped ports
func (p *publishedPorts) addMapped(label, ip string, port int, portMap hclutils.MapStrInt) {
// By default we will map the allocated port 1:1 to the container
containerPortInt := port
// If the user has mapped a port using port_map we'll change it here
if mapped, ok := portMap[label]; ok {
containerPortInt = mapped
}
p.add(label, ip, port, containerPortInt)
}
func (p *publishedPorts) add(label, ip string, port, to int) {
if to == 0 {
to = port
}
hostPortStr := strconv.Itoa(port)
containerPort := docker.Port(strconv.Itoa(to))
p.publishedPorts[containerPort+"/tcp"] = getPortBinding(ip, hostPortStr)
p.publishedPorts[containerPort+"/udp"] = getPortBinding(ip, hostPortStr)
p.logger.Debug("allocated static port", "ip", ip, "port", port)
p.exposedPorts[containerPort+"/tcp"] = struct{}{}
p.exposedPorts[containerPort+"/udp"] = struct{}{}
p.logger.Debug("exposed port", "port", port)
}

View File

@@ -334,6 +334,7 @@ func (tc *TaskConfig) EncodeConcreteDriverConfig(t interface{}) error {
type Resources struct {
NomadResources *structs.AllocatedTaskResources
LinuxResources *LinuxResources
Ports *structs.AllocatedPorts
}
func (r *Resources) Copy() *Resources {
@@ -347,6 +348,11 @@ func (r *Resources) Copy() *Resources {
if r.LinuxResources != nil {
res.LinuxResources = r.LinuxResources.Copy()
}
if r.Ports != nil {
ports := structs.AllocatedPorts(append(make([]structs.AllocatedPortMapping, 0, len(*r.Ports)), *r.Ports...))
res.Ports = &ports
}
return res
}

View File

@@ -233,7 +233,7 @@ func (x CPUUsage_Fields) String() string {
}
func (CPUUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{52, 0}
return fileDescriptor_4a8f45747846a74d, []int{53, 0}
}
type MemoryUsage_Fields int32
@@ -273,7 +273,7 @@ func (x MemoryUsage_Fields) String() string {
}
func (MemoryUsage_Fields) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{53, 0}
return fileDescriptor_4a8f45747846a74d, []int{54, 0}
}
type TaskConfigSchemaRequest struct {
@@ -2213,10 +2213,13 @@ type Resources struct {
// AllocatedResources are the resources set for the task
AllocatedResources *AllocatedTaskResources `protobuf:"bytes,1,opt,name=allocated_resources,json=allocatedResources,proto3" json:"allocated_resources,omitempty"`
// LinuxResources are the computed values to set for specific Linux features
LinuxResources *LinuxResources `protobuf:"bytes,2,opt,name=linux_resources,json=linuxResources,proto3" json:"linux_resources,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
LinuxResources *LinuxResources `protobuf:"bytes,2,opt,name=linux_resources,json=linuxResources,proto3" json:"linux_resources,omitempty"`
// Ports are the allocated port mappings for the allocation.
// A task may use these to manually configure port mapping if shared network namespaces aren't being used.
Ports []*PortMapping `protobuf:"bytes,3,rep,name=ports,proto3" json:"ports,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Resources) Reset() { *m = Resources{} }
@@ -2258,6 +2261,13 @@ func (m *Resources) GetLinuxResources() *LinuxResources {
return nil
}
func (m *Resources) GetPorts() []*PortMapping {
if m != nil {
return m.Ports
}
return nil
}
type AllocatedTaskResources struct {
Cpu *AllocatedCpuResources `protobuf:"bytes,1,opt,name=cpu,proto3" json:"cpu,omitempty"`
Memory *AllocatedMemoryResources `protobuf:"bytes,2,opt,name=memory,proto3" json:"memory,omitempty"`
@@ -2517,6 +2527,69 @@ func (m *NetworkPort) GetValue() int32 {
return 0
}
type PortMapping struct {
Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
Value int32 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
To int32 `protobuf:"varint,3,opt,name=to,proto3" json:"to,omitempty"`
HostIp string `protobuf:"bytes,4,opt,name=host_ip,json=hostIp,proto3" json:"host_ip,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *PortMapping) Reset() { *m = PortMapping{} }
func (m *PortMapping) String() string { return proto.CompactTextString(m) }
func (*PortMapping) ProtoMessage() {}
func (*PortMapping) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{42}
}
func (m *PortMapping) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PortMapping.Unmarshal(m, b)
}
func (m *PortMapping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PortMapping.Marshal(b, m, deterministic)
}
func (m *PortMapping) XXX_Merge(src proto.Message) {
xxx_messageInfo_PortMapping.Merge(m, src)
}
func (m *PortMapping) XXX_Size() int {
return xxx_messageInfo_PortMapping.Size(m)
}
func (m *PortMapping) XXX_DiscardUnknown() {
xxx_messageInfo_PortMapping.DiscardUnknown(m)
}
var xxx_messageInfo_PortMapping proto.InternalMessageInfo
func (m *PortMapping) GetLabel() string {
if m != nil {
return m.Label
}
return ""
}
func (m *PortMapping) GetValue() int32 {
if m != nil {
return m.Value
}
return 0
}
func (m *PortMapping) GetTo() int32 {
if m != nil {
return m.To
}
return 0
}
func (m *PortMapping) GetHostIp() string {
if m != nil {
return m.HostIp
}
return ""
}
type LinuxResources struct {
// CPU CFS (Completely Fair Scheduler) period. Default: 0 (not specified)
CpuPeriod int64 `protobuf:"varint,1,opt,name=cpu_period,json=cpuPeriod,proto3" json:"cpu_period,omitempty"`
@@ -2543,7 +2616,7 @@ func (m *LinuxResources) Reset() { *m = LinuxResources{} }
func (m *LinuxResources) String() string { return proto.CompactTextString(m) }
func (*LinuxResources) ProtoMessage() {}
func (*LinuxResources) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{42}
return fileDescriptor_4a8f45747846a74d, []int{43}
}
func (m *LinuxResources) XXX_Unmarshal(b []byte) error {
@@ -2636,7 +2709,7 @@ func (m *Mount) Reset() { *m = Mount{} }
func (m *Mount) String() string { return proto.CompactTextString(m) }
func (*Mount) ProtoMessage() {}
func (*Mount) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{43}
return fileDescriptor_4a8f45747846a74d, []int{44}
}
func (m *Mount) XXX_Unmarshal(b []byte) error {
@@ -2700,7 +2773,7 @@ func (m *Device) Reset() { *m = Device{} }
func (m *Device) String() string { return proto.CompactTextString(m) }
func (*Device) ProtoMessage() {}
func (*Device) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{44}
return fileDescriptor_4a8f45747846a74d, []int{45}
}
func (m *Device) XXX_Unmarshal(b []byte) error {
@@ -2762,7 +2835,7 @@ func (m *TaskHandle) Reset() { *m = TaskHandle{} }
func (m *TaskHandle) String() string { return proto.CompactTextString(m) }
func (*TaskHandle) ProtoMessage() {}
func (*TaskHandle) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{45}
return fileDescriptor_4a8f45747846a74d, []int{46}
}
func (m *TaskHandle) XXX_Unmarshal(b []byte) error {
@@ -2830,7 +2903,7 @@ func (m *NetworkOverride) Reset() { *m = NetworkOverride{} }
func (m *NetworkOverride) String() string { return proto.CompactTextString(m) }
func (*NetworkOverride) ProtoMessage() {}
func (*NetworkOverride) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{46}
return fileDescriptor_4a8f45747846a74d, []int{47}
}
func (m *NetworkOverride) XXX_Unmarshal(b []byte) error {
@@ -2889,7 +2962,7 @@ func (m *ExitResult) Reset() { *m = ExitResult{} }
func (m *ExitResult) String() string { return proto.CompactTextString(m) }
func (*ExitResult) ProtoMessage() {}
func (*ExitResult) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{47}
return fileDescriptor_4a8f45747846a74d, []int{48}
}
func (m *ExitResult) XXX_Unmarshal(b []byte) error {
@@ -2953,7 +3026,7 @@ func (m *TaskStatus) Reset() { *m = TaskStatus{} }
func (m *TaskStatus) String() string { return proto.CompactTextString(m) }
func (*TaskStatus) ProtoMessage() {}
func (*TaskStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{48}
return fileDescriptor_4a8f45747846a74d, []int{49}
}
func (m *TaskStatus) XXX_Unmarshal(b []byte) error {
@@ -3029,7 +3102,7 @@ func (m *TaskDriverStatus) Reset() { *m = TaskDriverStatus{} }
func (m *TaskDriverStatus) String() string { return proto.CompactTextString(m) }
func (*TaskDriverStatus) ProtoMessage() {}
func (*TaskDriverStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{49}
return fileDescriptor_4a8f45747846a74d, []int{50}
}
func (m *TaskDriverStatus) XXX_Unmarshal(b []byte) error {
@@ -3075,7 +3148,7 @@ func (m *TaskStats) Reset() { *m = TaskStats{} }
func (m *TaskStats) String() string { return proto.CompactTextString(m) }
func (*TaskStats) ProtoMessage() {}
func (*TaskStats) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{50}
return fileDescriptor_4a8f45747846a74d, []int{51}
}
func (m *TaskStats) XXX_Unmarshal(b []byte) error {
@@ -3138,7 +3211,7 @@ func (m *TaskResourceUsage) Reset() { *m = TaskResourceUsage{} }
func (m *TaskResourceUsage) String() string { return proto.CompactTextString(m) }
func (*TaskResourceUsage) ProtoMessage() {}
func (*TaskResourceUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{51}
return fileDescriptor_4a8f45747846a74d, []int{52}
}
func (m *TaskResourceUsage) XXX_Unmarshal(b []byte) error {
@@ -3191,7 +3264,7 @@ func (m *CPUUsage) Reset() { *m = CPUUsage{} }
func (m *CPUUsage) String() string { return proto.CompactTextString(m) }
func (*CPUUsage) ProtoMessage() {}
func (*CPUUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{52}
return fileDescriptor_4a8f45747846a74d, []int{53}
}
func (m *CPUUsage) XXX_Unmarshal(b []byte) error {
@@ -3280,7 +3353,7 @@ func (m *MemoryUsage) Reset() { *m = MemoryUsage{} }
func (m *MemoryUsage) String() string { return proto.CompactTextString(m) }
func (*MemoryUsage) ProtoMessage() {}
func (*MemoryUsage) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{53}
return fileDescriptor_4a8f45747846a74d, []int{54}
}
func (m *MemoryUsage) XXX_Unmarshal(b []byte) error {
@@ -3379,7 +3452,7 @@ func (m *DriverTaskEvent) Reset() { *m = DriverTaskEvent{} }
func (m *DriverTaskEvent) String() string { return proto.CompactTextString(m) }
func (*DriverTaskEvent) ProtoMessage() {}
func (*DriverTaskEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_4a8f45747846a74d, []int{54}
return fileDescriptor_4a8f45747846a74d, []int{55}
}
func (m *DriverTaskEvent) XXX_Unmarshal(b []byte) error {
@@ -3499,6 +3572,7 @@ func init() {
proto.RegisterType((*AllocatedMemoryResources)(nil), "hashicorp.nomad.plugins.drivers.proto.AllocatedMemoryResources")
proto.RegisterType((*NetworkResource)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkResource")
proto.RegisterType((*NetworkPort)(nil), "hashicorp.nomad.plugins.drivers.proto.NetworkPort")
proto.RegisterType((*PortMapping)(nil), "hashicorp.nomad.plugins.drivers.proto.PortMapping")
proto.RegisterType((*LinuxResources)(nil), "hashicorp.nomad.plugins.drivers.proto.LinuxResources")
proto.RegisterType((*Mount)(nil), "hashicorp.nomad.plugins.drivers.proto.Mount")
proto.RegisterType((*Device)(nil), "hashicorp.nomad.plugins.drivers.proto.Device")
@@ -3523,235 +3597,238 @@ func init() {
}
var fileDescriptor_4a8f45747846a74d = []byte{
// 3643 bytes of a gzipped FileDescriptorProto
// 3692 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x5a, 0x4f, 0x6f, 0x1b, 0x49,
0x76, 0x57, 0xf3, 0x9f, 0xc8, 0x47, 0x89, 0x6a, 0x95, 0x65, 0x0f, 0xcd, 0x49, 0x32, 0xde, 0x06,
0x36, 0x10, 0x76, 0x67, 0xe8, 0x19, 0x2d, 0x32, 0x1e, 0xcd, 0x7a, 0xd6, 0xc3, 0xa1, 0x68, 0x49,
0x63, 0x89, 0x52, 0x8a, 0x14, 0xbc, 0x8e, 0xb3, 0xd3, 0x69, 0x75, 0x97, 0xc9, 0xb6, 0xd8, 0x7f,
0xdc, 0xd5, 0x94, 0xa5, 0x0d, 0x82, 0x04, 0x1b, 0x20, 0xd8, 0x00, 0x09, 0x92, 0xcb, 0x64, 0x2f,
0x39, 0x6d, 0x8e, 0xf9, 0x02, 0x41, 0x82, 0x3d, 0xe7, 0x0b, 0xe4, 0x96, 0x5c, 0x72, 0xcb, 0x25,
0x40, 0xf2, 0x0d, 0x16, 0xf5, 0xa7, 0x9b, 0xdd, 0x24, 0x3d, 0x6e, 0x52, 0x3e, 0x91, 0xef, 0x55,
0xd5, 0xaf, 0x5e, 0xbd, 0xf7, 0xaa, 0xde, 0xab, 0xea, 0x07, 0x9a, 0x3f, 0x1a, 0x0f, 0x6c, 0x97,
0xde, 0xb7, 0x02, 0xfb, 0x92, 0x04, 0xf4, 0xbe, 0x1f, 0x78, 0xa1, 0x27, 0xa9, 0x26, 0x27, 0xd0,
0xf7, 0x87, 0x06, 0x1d, 0xda, 0xa6, 0x17, 0xf8, 0x4d, 0xd7, 0x73, 0x0c, 0xab, 0x29, 0xc7, 0x34,
0xe5, 0x18, 0xd1, 0xad, 0xf1, 0x7b, 0x03, 0xcf, 0x1b, 0x8c, 0x88, 0x40, 0x38, 0x1f, 0xbf, 0xb8,
0x6f, 0x8d, 0x03, 0x23, 0xb4, 0x3d, 0x57, 0xb6, 0x7f, 0x30, 0xdd, 0x1e, 0xda, 0x0e, 0xa1, 0xa1,
0xe1, 0xf8, 0xb2, 0xc3, 0x97, 0x03, 0x3b, 0x1c, 0x8e, 0xcf, 0x9b, 0xa6, 0xe7, 0xdc, 0x8f, 0xa7,
0xbc, 0xcf, 0xa7, 0xbc, 0x1f, 0x89, 0x49, 0x87, 0x46, 0x40, 0xac, 0xfb, 0x43, 0x73, 0x44, 0x7d,
0x62, 0xb2, 0x5f, 0x9d, 0xfd, 0x91, 0x08, 0xfb, 0xd9, 0x11, 0x68, 0x18, 0x8c, 0xcd, 0x30, 0x5a,
0xaf, 0x11, 0x86, 0x81, 0x7d, 0x3e, 0x0e, 0x89, 0x00, 0xd2, 0xee, 0xc2, 0x7b, 0x7d, 0x83, 0x5e,
0xb4, 0x3d, 0xf7, 0x85, 0x3d, 0xe8, 0x99, 0x43, 0xe2, 0x18, 0x98, 0xbc, 0x1a, 0x13, 0x1a, 0x6a,
0x7f, 0x0c, 0xf5, 0xd9, 0x26, 0xea, 0x7b, 0x2e, 0x25, 0xe8, 0x4b, 0x28, 0x30, 0x69, 0xea, 0xca,
0x3d, 0x65, 0xbb, 0xba, 0xf3, 0x61, 0xf3, 0x4d, 0x8a, 0x13, 0x32, 0x34, 0xe5, 0x2a, 0x9a, 0x3d,
0x9f, 0x98, 0x98, 0x8f, 0xd4, 0x6e, 0xc3, 0xad, 0xb6, 0xe1, 0x1b, 0xe7, 0xf6, 0xc8, 0x0e, 0x6d,
0x42, 0xa3, 0x49, 0xc7, 0xb0, 0x95, 0x66, 0xcb, 0x09, 0x7f, 0x06, 0x6b, 0x66, 0x82, 0x2f, 0x27,
0xde, 0x6d, 0x66, 0xb2, 0x58, 0x73, 0x8f, 0x53, 0x29, 0xe0, 0x14, 0x9c, 0xb6, 0x05, 0xe8, 0xb1,
0xed, 0x0e, 0x48, 0xe0, 0x07, 0xb6, 0x1b, 0x46, 0xc2, 0xfc, 0x26, 0x0f, 0xb7, 0x52, 0x6c, 0x29,
0xcc, 0x4b, 0x80, 0x58, 0x8f, 0x4c, 0x94, 0xfc, 0x76, 0x75, 0xe7, 0xeb, 0x8c, 0xa2, 0xcc, 0xc1,
0x6b, 0xb6, 0x62, 0xb0, 0x8e, 0x1b, 0x06, 0xd7, 0x38, 0x81, 0x8e, 0xbe, 0x81, 0xd2, 0x90, 0x18,
0xa3, 0x70, 0x58, 0xcf, 0xdd, 0x53, 0xb6, 0x6b, 0x3b, 0x8f, 0x6f, 0x30, 0xcf, 0x01, 0x07, 0xea,
0x85, 0x46, 0x48, 0xb0, 0x44, 0x45, 0x1f, 0x01, 0x12, 0xff, 0x74, 0x8b, 0x50, 0x33, 0xb0, 0x7d,
0xe6, 0xc8, 0xf5, 0xfc, 0x3d, 0x65, 0xbb, 0x82, 0x37, 0x45, 0xcb, 0xde, 0xa4, 0xa1, 0xe1, 0xc3,
0xc6, 0x94, 0xb4, 0x48, 0x85, 0xfc, 0x05, 0xb9, 0xe6, 0x16, 0xa9, 0x60, 0xf6, 0x17, 0xed, 0x43,
0xf1, 0xd2, 0x18, 0x8d, 0x09, 0x17, 0xb9, 0xba, 0xf3, 0xc9, 0xdb, 0xdc, 0x43, 0xba, 0xe8, 0x44,
0x0f, 0x58, 0x8c, 0xff, 0x3c, 0xf7, 0x99, 0xa2, 0xed, 0x42, 0x35, 0x21, 0x37, 0xaa, 0x01, 0x9c,
0x75, 0xf7, 0x3a, 0xfd, 0x4e, 0xbb, 0xdf, 0xd9, 0x53, 0x57, 0xd0, 0x3a, 0x54, 0xce, 0xba, 0x07,
0x9d, 0xd6, 0x51, 0xff, 0xe0, 0x99, 0xaa, 0xa0, 0x2a, 0xac, 0x46, 0x44, 0x4e, 0xbb, 0x02, 0x84,
0x89, 0xe9, 0x5d, 0x92, 0x80, 0x39, 0xb2, 0xb4, 0x2a, 0x7a, 0x0f, 0x56, 0x43, 0x83, 0x5e, 0xe8,
0xb6, 0x25, 0x65, 0x2e, 0x31, 0xf2, 0xd0, 0x42, 0x87, 0x50, 0x1a, 0x1a, 0xae, 0x35, 0x7a, 0xbb,
0xdc, 0x69, 0x55, 0x33, 0xf0, 0x03, 0x3e, 0x10, 0x4b, 0x00, 0xe6, 0xdd, 0xa9, 0x99, 0x85, 0x01,
0xb4, 0x67, 0xa0, 0xf6, 0x42, 0x23, 0x08, 0x93, 0xe2, 0x74, 0xa0, 0xc0, 0xe6, 0x97, 0x1e, 0xbd,
0xc8, 0x9c, 0x62, 0x67, 0x62, 0x3e, 0x5c, 0xfb, 0xff, 0x1c, 0x6c, 0x26, 0xb0, 0xa5, 0xa7, 0x3e,
0x85, 0x52, 0x40, 0xe8, 0x78, 0x14, 0x72, 0xf8, 0xda, 0xce, 0xa3, 0x8c, 0xf0, 0x33, 0x48, 0x4d,
0xcc, 0x61, 0xb0, 0x84, 0x43, 0xdb, 0xa0, 0x8a, 0x11, 0x3a, 0x09, 0x02, 0x2f, 0xd0, 0x1d, 0x3a,
0xe0, 0x5a, 0xab, 0xe0, 0x9a, 0xe0, 0x77, 0x18, 0xfb, 0x98, 0x0e, 0x12, 0x5a, 0xcd, 0xdf, 0x50,
0xab, 0xc8, 0x00, 0xd5, 0x25, 0xe1, 0x6b, 0x2f, 0xb8, 0xd0, 0x99, 0x6a, 0x03, 0xdb, 0x22, 0xf5,
0xdc, 0x5d, 0x94, 0xa5, 0x0d, 0x82, 0x04, 0x1b, 0x20, 0xd8, 0x00, 0x09, 0x92, 0xcb, 0x64, 0x2f,
0x39, 0x6d, 0x90, 0x53, 0xbe, 0x40, 0x90, 0x60, 0xcf, 0xf9, 0x02, 0x39, 0xe6, 0x92, 0x5b, 0x2e,
0x01, 0x92, 0x6f, 0xb0, 0xa8, 0x3f, 0xdd, 0xec, 0x26, 0xe9, 0x71, 0x93, 0xf2, 0x89, 0x7c, 0xaf,
0xaa, 0x7e, 0xf5, 0xfa, 0xbd, 0x57, 0xf5, 0x5e, 0x55, 0x3d, 0xd0, 0xfc, 0xd1, 0x78, 0x60, 0xbb,
0xe1, 0x7d, 0x2b, 0xb0, 0x2f, 0x49, 0x10, 0xde, 0xf7, 0x03, 0x8f, 0x7a, 0x92, 0x6a, 0x72, 0x02,
0x7d, 0x7f, 0x68, 0x84, 0x43, 0xdb, 0xf4, 0x02, 0xbf, 0xe9, 0x7a, 0x8e, 0x61, 0x35, 0xe5, 0x98,
0xa6, 0x1c, 0x23, 0xba, 0x35, 0x7e, 0x6f, 0xe0, 0x79, 0x83, 0x11, 0x11, 0x08, 0xe7, 0xe3, 0x17,
0xf7, 0xad, 0x71, 0x60, 0x50, 0xdb, 0x73, 0x65, 0xfb, 0x07, 0xd3, 0xed, 0xd4, 0x76, 0x48, 0x48,
0x0d, 0xc7, 0x97, 0x1d, 0xbe, 0x1c, 0xd8, 0x74, 0x38, 0x3e, 0x6f, 0x9a, 0x9e, 0x73, 0x3f, 0x9e,
0xf2, 0x3e, 0x9f, 0xf2, 0x7e, 0x24, 0x66, 0x38, 0x34, 0x02, 0x62, 0xdd, 0x1f, 0x9a, 0xa3, 0xd0,
0x27, 0x26, 0xfb, 0xd5, 0xd9, 0x1f, 0x89, 0xb0, 0x9f, 0x1d, 0x21, 0xa4, 0xc1, 0xd8, 0xa4, 0xd1,
0xf7, 0x1a, 0x94, 0x06, 0xf6, 0xf9, 0x98, 0x12, 0x01, 0xa4, 0xdd, 0x85, 0xf7, 0xfa, 0x46, 0x78,
0xd1, 0xf6, 0xdc, 0x17, 0xf6, 0xa0, 0x67, 0x0e, 0x89, 0x63, 0x60, 0xf2, 0x6a, 0x4c, 0x42, 0xaa,
0xfd, 0x31, 0xd4, 0x67, 0x9b, 0x42, 0xdf, 0x73, 0x43, 0x82, 0xbe, 0x84, 0x02, 0x93, 0xa6, 0xae,
0xdc, 0x53, 0xb6, 0xab, 0x3b, 0x1f, 0x36, 0xdf, 0xa4, 0x38, 0x21, 0x43, 0x53, 0x7e, 0x45, 0xb3,
0xe7, 0x13, 0x13, 0xf3, 0x91, 0xda, 0x6d, 0xb8, 0xd5, 0x36, 0x7c, 0xe3, 0xdc, 0x1e, 0xd9, 0xd4,
0x26, 0x61, 0x34, 0xe9, 0x18, 0xb6, 0xd2, 0x6c, 0x39, 0xe1, 0xcf, 0x60, 0xcd, 0x4c, 0xf0, 0xe5,
0xc4, 0xbb, 0xcd, 0x4c, 0x16, 0x6b, 0xee, 0x71, 0x2a, 0x05, 0x9c, 0x82, 0xd3, 0xb6, 0x00, 0x3d,
0xb6, 0xdd, 0x01, 0x09, 0xfc, 0xc0, 0x76, 0x69, 0x24, 0xcc, 0x6f, 0xf2, 0x70, 0x2b, 0xc5, 0x96,
0xc2, 0xbc, 0x04, 0x88, 0xf5, 0xc8, 0x44, 0xc9, 0x6f, 0x57, 0x77, 0xbe, 0xce, 0x28, 0xca, 0x1c,
0xbc, 0x66, 0x2b, 0x06, 0xeb, 0xb8, 0x34, 0xb8, 0xc6, 0x09, 0x74, 0xf4, 0x0d, 0x94, 0x86, 0xc4,
0x18, 0xd1, 0x61, 0x3d, 0x77, 0x4f, 0xd9, 0xae, 0xed, 0x3c, 0xbe, 0xc1, 0x3c, 0x07, 0x1c, 0xa8,
0x47, 0x0d, 0x4a, 0xb0, 0x44, 0x45, 0x1f, 0x01, 0x12, 0xff, 0x74, 0x8b, 0x84, 0x66, 0x60, 0xfb,
0xcc, 0x91, 0xeb, 0xf9, 0x7b, 0xca, 0x76, 0x05, 0x6f, 0x8a, 0x96, 0xbd, 0x49, 0x43, 0xc3, 0x87,
0x8d, 0x29, 0x69, 0x91, 0x0a, 0xf9, 0x0b, 0x72, 0xcd, 0x2d, 0x52, 0xc1, 0xec, 0x2f, 0xda, 0x87,
0xe2, 0xa5, 0x31, 0x1a, 0x13, 0x2e, 0x72, 0x75, 0xe7, 0x93, 0xb7, 0xb9, 0x87, 0x74, 0xd1, 0x89,
0x1e, 0xb0, 0x18, 0xff, 0x79, 0xee, 0x33, 0x45, 0xdb, 0x85, 0x6a, 0x42, 0x6e, 0x54, 0x03, 0x38,
0xeb, 0xee, 0x75, 0xfa, 0x9d, 0x76, 0xbf, 0xb3, 0xa7, 0xae, 0xa0, 0x75, 0xa8, 0x9c, 0x75, 0x0f,
0x3a, 0xad, 0xa3, 0xfe, 0xc1, 0x33, 0x55, 0x41, 0x55, 0x58, 0x8d, 0x88, 0x9c, 0x76, 0x05, 0x08,
0x13, 0xd3, 0xbb, 0x24, 0x01, 0x73, 0x64, 0x69, 0x55, 0xf4, 0x1e, 0xac, 0x52, 0x23, 0xbc, 0xd0,
0x6d, 0x4b, 0xca, 0x5c, 0x62, 0xe4, 0xa1, 0x85, 0x0e, 0xa1, 0x34, 0x34, 0x5c, 0x6b, 0xf4, 0x76,
0xb9, 0xd3, 0xaa, 0x66, 0xe0, 0x07, 0x7c, 0x20, 0x96, 0x00, 0xcc, 0xbb, 0x53, 0x33, 0x0b, 0x03,
0x68, 0xcf, 0x40, 0xed, 0x51, 0x23, 0xa0, 0x49, 0x71, 0x3a, 0x50, 0x60, 0xf3, 0x4b, 0x8f, 0x5e,
0x64, 0x4e, 0xb1, 0x32, 0x31, 0x1f, 0xae, 0xfd, 0x7f, 0x0e, 0x36, 0x13, 0xd8, 0xd2, 0x53, 0x9f,
0x42, 0x29, 0x20, 0xe1, 0x78, 0x44, 0x39, 0x7c, 0x6d, 0xe7, 0x51, 0x46, 0xf8, 0x19, 0xa4, 0x26,
0xe6, 0x30, 0x58, 0xc2, 0xa1, 0x6d, 0x50, 0xc5, 0x08, 0x9d, 0x04, 0x81, 0x17, 0xe8, 0x4e, 0x38,
0xe0, 0x5a, 0xab, 0xe0, 0x9a, 0xe0, 0x77, 0x18, 0xfb, 0x38, 0x1c, 0x24, 0xb4, 0x9a, 0xbf, 0xa1,
0x56, 0x91, 0x01, 0xaa, 0x4b, 0xe8, 0x6b, 0x2f, 0xb8, 0xd0, 0x99, 0x6a, 0x03, 0xdb, 0x22, 0xf5,
0x02, 0x07, 0xfd, 0x34, 0x23, 0x68, 0x57, 0x0c, 0x3f, 0x91, 0xa3, 0xf1, 0x86, 0x9b, 0x66, 0x68,
0x3f, 0x84, 0x92, 0x58, 0x29, 0xf3, 0xa4, 0xde, 0x59, 0xbb, 0xdd, 0xe9, 0xf5, 0xd4, 0x15, 0x54,
0x81, 0x22, 0xee, 0xf4, 0x31, 0xf3, 0xb0, 0x0a, 0x14, 0x1f, 0xb7, 0xfa, 0xad, 0x23, 0x35, 0xa7,
0xfd, 0x00, 0x36, 0x9e, 0x1a, 0x76, 0x98, 0xc5, 0xb9, 0x34, 0x0f, 0xd4, 0x49, 0x5f, 0x69, 0x9d,
0xc3, 0x94, 0x75, 0xb2, 0xab, 0xa6, 0x73, 0x65, 0x87, 0x53, 0xf6, 0x50, 0x21, 0x4f, 0x82, 0x40,
0x9a, 0x80, 0xfd, 0xd5, 0x5e, 0xc3, 0x46, 0x2f, 0xf4, 0xfc, 0x4c, 0x9e, 0xff, 0x23, 0x58, 0x65,
0x31, 0xca, 0x1b, 0x87, 0xd2, 0xf5, 0xef, 0x36, 0x45, 0x0c, 0x6b, 0x46, 0x31, 0xac, 0xb9, 0x27,
0x63, 0x1c, 0x8e, 0x7a, 0xa2, 0x3b, 0x50, 0xa2, 0xf6, 0xc0, 0x35, 0x46, 0xf2, 0xb4, 0x90, 0x94,
0x86, 0x98, 0x93, 0x47, 0x13, 0x4b, 0xc7, 0x6f, 0x03, 0xda, 0x23, 0x34, 0x0c, 0xbc, 0xeb, 0x4c,
0xf2, 0x6c, 0x41, 0xf1, 0x85, 0x17, 0x98, 0x62, 0x23, 0x96, 0xb1, 0x20, 0xd8, 0xa6, 0x4a, 0x81,
0x48, 0xec, 0x8f, 0x00, 0x1d, 0xba, 0x2c, 0xa6, 0x64, 0x33, 0xc4, 0xdf, 0xe7, 0xe0, 0x56, 0xaa,
0xbf, 0x34, 0xc6, 0xf2, 0xfb, 0x90, 0x1d, 0x4c, 0x63, 0x2a, 0xf6, 0x21, 0x3a, 0x81, 0x92, 0xe8,
0x21, 0x35, 0xf9, 0x60, 0x01, 0x20, 0x11, 0xa6, 0x24, 0x9c, 0x84, 0x99, 0xeb, 0xf4, 0xf9, 0x77,
0xeb, 0xf4, 0xaf, 0x41, 0x8d, 0xd6, 0x41, 0xdf, 0x6a, 0x9b, 0xaf, 0xe1, 0x96, 0xe9, 0x8d, 0x46,
0xc4, 0x64, 0xde, 0xa0, 0xdb, 0x6e, 0x48, 0x82, 0x4b, 0x63, 0xf4, 0x76, 0xbf, 0x41, 0x93, 0x51,
0x87, 0x72, 0x90, 0xf6, 0x1c, 0x36, 0x13, 0x13, 0x4b, 0x43, 0x3c, 0x86, 0x22, 0x65, 0x0c, 0x69,
0x89, 0x8f, 0x17, 0xb4, 0x04, 0xc5, 0x62, 0xb8, 0x76, 0x4b, 0x80, 0x77, 0x2e, 0x89, 0x1b, 0x2f,
0x4b, 0xdb, 0x83, 0xcd, 0x1e, 0x77, 0xd3, 0x4c, 0x7e, 0x38, 0x71, 0xf1, 0x5c, 0xca, 0xc5, 0xb7,
0x00, 0x25, 0x51, 0xa4, 0x23, 0x5e, 0xc3, 0x46, 0xe7, 0x8a, 0x98, 0x99, 0x90, 0xeb, 0xb0, 0x6a,
0x7a, 0x8e, 0x63, 0xb8, 0x56, 0x3d, 0x77, 0x2f, 0xbf, 0x5d, 0xc1, 0x11, 0x99, 0xdc, 0x8b, 0xf9,
0xac, 0x7b, 0x51, 0xfb, 0x5b, 0x05, 0xd4, 0xc9, 0xdc, 0x52, 0x91, 0x4c, 0xfa, 0xd0, 0x62, 0x40,
0x6c, 0xee, 0x35, 0x2c, 0x29, 0xc9, 0x8f, 0x8e, 0x0b, 0xc1, 0x27, 0x41, 0x90, 0x38, 0x8e, 0xf2,
0x37, 0x3c, 0x8e, 0xb4, 0x03, 0xf8, 0x9d, 0x48, 0x9c, 0x5e, 0x18, 0x10, 0xc3, 0xb1, 0xdd, 0xc1,
0xe1, 0xc9, 0x89, 0x4f, 0x84, 0xe0, 0x08, 0x41, 0xc1, 0x32, 0x42, 0x43, 0x0a, 0xc6, 0xff, 0xb3,
0x4d, 0x6f, 0x8e, 0x3c, 0x1a, 0x6f, 0x7a, 0x4e, 0x68, 0xff, 0x9e, 0x87, 0xfa, 0x0c, 0x54, 0xa4,
0xde, 0xe7, 0x50, 0xa4, 0x24, 0x1c, 0xfb, 0xd2, 0x55, 0x3a, 0x99, 0x05, 0x9e, 0x8f, 0xd7, 0xec,
0x31, 0x30, 0x2c, 0x30, 0xd1, 0x00, 0xca, 0x61, 0x78, 0xad, 0x53, 0xfb, 0xe7, 0x51, 0x42, 0x70,
0x74, 0x53, 0xfc, 0x3e, 0x09, 0x1c, 0xdb, 0x35, 0x46, 0x3d, 0xfb, 0xe7, 0x04, 0xaf, 0x86, 0xe1,
0x35, 0xfb, 0x83, 0x9e, 0x31, 0x87, 0xb7, 0x6c, 0x57, 0xaa, 0xbd, 0xbd, 0xec, 0x2c, 0x09, 0x05,
0x63, 0x81, 0xd8, 0x38, 0x82, 0x22, 0x5f, 0xd3, 0x32, 0x8e, 0xa8, 0x42, 0x3e, 0x0c, 0xaf, 0xb9,
0x50, 0x65, 0xcc, 0xfe, 0x36, 0x1e, 0xc2, 0x5a, 0x72, 0x05, 0xcc, 0x91, 0x86, 0xc4, 0x1e, 0x0c,
0x85, 0x83, 0x15, 0xb1, 0xa4, 0x98, 0x25, 0x5f, 0xdb, 0x96, 0x4c, 0x59, 0x8b, 0x58, 0x10, 0xda,
0xbf, 0xe4, 0xe0, 0xee, 0x1c, 0xcd, 0x48, 0x67, 0x7d, 0x9e, 0x72, 0xd6, 0x77, 0xa4, 0x85, 0xc8,
0xe3, 0x9f, 0xa7, 0x3c, 0xfe, 0x1d, 0x82, 0xb3, 0x6d, 0x73, 0x07, 0x4a, 0xe4, 0xca, 0x0e, 0x89,
0x25, 0x55, 0x25, 0xa9, 0xc4, 0x76, 0x2a, 0xdc, 0x74, 0x3b, 0x7d, 0x02, 0x5b, 0xed, 0x80, 0x18,
0x21, 0x91, 0x47, 0x79, 0xe4, 0xff, 0x77, 0xa1, 0x6c, 0x8c, 0x46, 0x9e, 0x39, 0x31, 0xeb, 0x2a,
0xa7, 0x0f, 0x2d, 0xed, 0x5b, 0x05, 0x6e, 0x4f, 0x8d, 0x91, 0x9a, 0x3e, 0x87, 0x9a, 0x4d, 0xbd,
0x11, 0x5f, 0x84, 0x9e, 0xb8, 0xc5, 0xfd, 0x78, 0xb1, 0x70, 0x72, 0x18, 0x61, 0xf0, 0x4b, 0xdd,
0xba, 0x9d, 0x24, 0xb9, 0x57, 0xf1, 0xc9, 0x2d, 0xb9, 0x9b, 0x23, 0x52, 0xfb, 0x07, 0x05, 0x6e,
0xcb, 0x28, 0x9e, 0x79, 0x31, 0x73, 0x44, 0xce, 0xbd, 0x6b, 0x91, 0xb5, 0x3a, 0xdc, 0x99, 0x96,
0x4b, 0x9e, 0xeb, 0xff, 0x51, 0x00, 0x34, 0x7b, 0x83, 0x44, 0xdf, 0x83, 0x35, 0x4a, 0x5c, 0x4b,
0x17, 0x31, 0x41, 0x84, 0xab, 0x32, 0xae, 0x32, 0x9e, 0x08, 0x0e, 0x94, 0x1d, 0x73, 0xe4, 0x4a,
0x4a, 0x5b, 0xc6, 0xfc, 0x3f, 0x1a, 0xc2, 0xda, 0x0b, 0xaa, 0xc7, 0x73, 0x73, 0xa7, 0xa9, 0x65,
0x3e, 0xba, 0x66, 0xe5, 0x68, 0x3e, 0xee, 0xc5, 0xeb, 0xc2, 0xd5, 0x17, 0x34, 0x26, 0xd0, 0x2f,
0x15, 0x78, 0x2f, 0x4a, 0x1d, 0x26, 0xea, 0x73, 0x3c, 0x8b, 0xd0, 0x7a, 0xe1, 0x5e, 0x7e, 0xbb,
0xb6, 0x73, 0x7a, 0x03, 0xfd, 0xcd, 0x30, 0x8f, 0x3d, 0x8b, 0xe0, 0xdb, 0xee, 0x1c, 0x2e, 0x45,
0x4d, 0xb8, 0xe5, 0x8c, 0x69, 0xa8, 0x0b, 0x2f, 0xd0, 0x65, 0xa7, 0x7a, 0x91, 0xeb, 0x65, 0x93,
0x35, 0xa5, 0x7c, 0x15, 0x5d, 0xc0, 0xba, 0xe3, 0x8d, 0xdd, 0x50, 0x37, 0xf9, 0x1d, 0x87, 0xd6,
0x4b, 0x0b, 0x5d, 0x7e, 0xe7, 0x68, 0xe9, 0x98, 0xc1, 0x89, 0x1b, 0x13, 0xc5, 0x6b, 0x4e, 0x82,
0xd2, 0x9a, 0x50, 0x4d, 0xe8, 0x10, 0x95, 0xa1, 0xd0, 0x3d, 0xe9, 0x76, 0xd4, 0x15, 0x04, 0x50,
0x6a, 0x1f, 0xe0, 0x93, 0x93, 0xbe, 0x48, 0xfb, 0x0f, 0x8f, 0x5b, 0xfb, 0x1d, 0x35, 0xa7, 0x75,
0x60, 0x2d, 0x89, 0x86, 0x10, 0xd4, 0xce, 0xba, 0x4f, 0xba, 0x27, 0x4f, 0xbb, 0xfa, 0xf1, 0xc9,
0x59, 0xb7, 0xcf, 0x2e, 0x0c, 0x35, 0x80, 0x56, 0xf7, 0xd9, 0x84, 0x5e, 0x87, 0x4a, 0xf7, 0x24,
0x22, 0x95, 0x46, 0x4e, 0x55, 0xb4, 0xff, 0xcd, 0xc1, 0xd6, 0x3c, 0xc5, 0x22, 0x0b, 0x0a, 0xcc,
0x48, 0xf2, 0xca, 0xf6, 0xee, 0x6d, 0xc4, 0xd1, 0x99, 0x6f, 0xfa, 0x86, 0x3c, 0xa3, 0x2b, 0x98,
0xff, 0x47, 0x3a, 0x94, 0x46, 0xc6, 0x39, 0x19, 0xd1, 0x7a, 0x9e, 0x3f, 0x6a, 0xec, 0xdf, 0x64,
0xee, 0x23, 0x8e, 0x24, 0x5e, 0x34, 0x24, 0x6c, 0x63, 0x17, 0xaa, 0x09, 0xf6, 0x9c, 0xa7, 0x83,
0xad, 0xe4, 0xd3, 0x41, 0x25, 0xf9, 0x0e, 0xf0, 0x68, 0x56, 0x5b, 0x6c, 0x35, 0xcc, 0x5c, 0x07,
0x27, 0xbd, 0xbe, 0xb8, 0xa4, 0xed, 0xe3, 0x93, 0xb3, 0x53, 0x55, 0x61, 0xcc, 0x7e, 0xab, 0xf7,
0x44, 0xcd, 0xc5, 0xd6, 0xcc, 0x6b, 0xcf, 0xa1, 0xb2, 0xd7, 0xed, 0x09, 0xa3, 0xb1, 0x03, 0x8a,
0x92, 0x80, 0x2d, 0x81, 0xbf, 0xdf, 0x54, 0x70, 0x44, 0xa2, 0x06, 0x94, 0x29, 0x31, 0x02, 0x73,
0x48, 0xa8, 0x8c, 0x88, 0x31, 0xcd, 0x46, 0x79, 0xfc, 0x1d, 0x44, 0x28, 0xa8, 0x82, 0x23, 0x52,
0xfb, 0xbf, 0x55, 0x80, 0xc9, 0x9d, 0x1c, 0xd5, 0x20, 0x17, 0x9f, 0x62, 0x39, 0xdb, 0x62, 0xca,
0x76, 0x0d, 0x27, 0x5a, 0x15, 0xff, 0x8f, 0x76, 0xe0, 0xb6, 0x43, 0x07, 0xbe, 0x61, 0x5e, 0xe8,
0xf2, 0x2a, 0x2d, 0x9c, 0x9d, 0x9f, 0x08, 0x6b, 0xf8, 0x96, 0x6c, 0x94, 0xbe, 0x2c, 0x70, 0x8f,
0x20, 0x4f, 0xdc, 0x4b, 0xbe, 0x7b, 0xab, 0x3b, 0x9f, 0x2f, 0xfc, 0x56, 0xd0, 0xec, 0xb8, 0x97,
0xc2, 0x20, 0x0c, 0x06, 0xe9, 0x00, 0x16, 0xb9, 0xb4, 0x4d, 0xa2, 0x33, 0xd0, 0x22, 0x07, 0xfd,
0x72, 0x71, 0xd0, 0x3d, 0x8e, 0x11, 0x43, 0x57, 0xac, 0x88, 0x46, 0x5d, 0xa8, 0x04, 0x84, 0x7a,
0xe3, 0xc0, 0x24, 0x62, 0x0b, 0x67, 0x4f, 0xe7, 0x71, 0x34, 0x0e, 0x4f, 0x20, 0xd0, 0x1e, 0x94,
0xf8, 0xce, 0xa5, 0xf5, 0x55, 0x2e, 0xec, 0x87, 0x19, 0xc1, 0xf8, 0x76, 0xc5, 0x72, 0x2c, 0xda,
0x87, 0x55, 0x21, 0x22, 0xad, 0x97, 0x39, 0xcc, 0x47, 0x59, 0x8f, 0x15, 0x3e, 0x0a, 0x47, 0xa3,
0x99, 0x55, 0xc7, 0x94, 0x04, 0xf5, 0x8a, 0xb0, 0x2a, 0xfb, 0x8f, 0xde, 0x87, 0x8a, 0x88, 0x62,
0x96, 0x1d, 0xd4, 0x81, 0x37, 0x88, 0xb0, 0xb6, 0x67, 0x07, 0xe8, 0x03, 0xa8, 0x8a, 0x8c, 0x44,
0xe7, 0x5b, 0xaf, 0xca, 0x9b, 0x41, 0xb0, 0x4e, 0xd9, 0x06, 0x14, 0x1d, 0x48, 0x10, 0x88, 0x0e,
0x6b, 0x71, 0x07, 0x12, 0x04, 0xbc, 0xc3, 0xef, 0xc3, 0x06, 0xcf, 0xe3, 0x06, 0x81, 0x37, 0xf6,
0x75, 0xee, 0x53, 0xeb, 0xbc, 0xd3, 0x3a, 0x63, 0xef, 0x33, 0x6e, 0x97, 0x39, 0xd7, 0x5d, 0x28,
0xbf, 0xf4, 0xce, 0x45, 0x87, 0x9a, 0x08, 0xa6, 0x2f, 0xbd, 0xf3, 0xa8, 0x29, 0x8e, 0xb3, 0x1b,
0xe9, 0x38, 0xfb, 0x0a, 0xee, 0xcc, 0x06, 0x0c, 0x1e, 0x6f, 0xd5, 0x9b, 0xc7, 0xdb, 0x2d, 0x77,
0xde, 0x61, 0xf7, 0x15, 0xe4, 0x2d, 0x97, 0xd6, 0x37, 0x17, 0x72, 0x8e, 0x78, 0x1f, 0x63, 0x36,
0xb8, 0xf1, 0x29, 0x94, 0x23, 0xef, 0x5b, 0xe4, 0x48, 0x69, 0x3c, 0x84, 0x5a, 0xda, 0x77, 0x17,
0x3a, 0x90, 0xfe, 0x53, 0x81, 0x4a, 0xec, 0xa5, 0xc8, 0x85, 0x5b, 0x5c, 0x8b, 0x2c, 0xc9, 0xd1,
0x27, 0x4e, 0x2f, 0x52, 0xab, 0x2f, 0x32, 0xae, 0xab, 0x15, 0x21, 0xc8, 0x7b, 0x9c, 0xdc, 0x01,
0x28, 0x46, 0x9e, 0xcc, 0xf7, 0x0d, 0x6c, 0x8c, 0x6c, 0x77, 0x7c, 0x95, 0x98, 0x4b, 0xe4, 0x44,
0x7f, 0x90, 0x71, 0xae, 0x23, 0x36, 0x7a, 0x32, 0x47, 0x6d, 0x94, 0xa2, 0xb5, 0x6f, 0x73, 0x70,
0x67, 0xbe, 0x38, 0xa8, 0x0b, 0x79, 0xd3, 0x1f, 0xcb, 0xa5, 0x3d, 0x5c, 0x74, 0x69, 0x6d, 0x7f,
0x3c, 0x99, 0x95, 0x01, 0xa1, 0xa7, 0x50, 0x72, 0x88, 0xe3, 0x05, 0xd7, 0x72, 0x05, 0x8f, 0x16,
0x85, 0x3c, 0xe6, 0xa3, 0x27, 0xa8, 0x12, 0x0e, 0x61, 0x28, 0x4b, 0x9f, 0xa3, 0xf2, 0x74, 0x5b,
0xf0, 0xc9, 0x24, 0x82, 0xc4, 0x31, 0x8e, 0xf6, 0x29, 0xdc, 0x9e, 0xbb, 0x14, 0xf4, 0xbb, 0x00,
0xa6, 0x3f, 0xd6, 0xf9, 0x93, 0xb6, 0xb0, 0x7b, 0x1e, 0x57, 0x4c, 0x7f, 0xdc, 0xe3, 0x0c, 0xed,
0x01, 0xd4, 0xdf, 0x24, 0x2f, 0x3b, 0x33, 0x84, 0xc4, 0xba, 0x73, 0xce, 0x75, 0x90, 0xc7, 0x65,
0xc1, 0x38, 0x3e, 0xd7, 0x7e, 0x95, 0x83, 0x8d, 0x29, 0x71, 0xd8, 0x95, 0x43, 0x9c, 0x41, 0xd1,
0x65, 0x4e, 0x50, 0xec, 0x40, 0x32, 0x6d, 0x2b, 0x7a, 0x06, 0xe4, 0xff, 0x79, 0x28, 0xf2, 0xe5,
0x13, 0x5d, 0xce, 0xf6, 0x99, 0x43, 0x3b, 0xe7, 0x76, 0x48, 0xf9, 0xad, 0xa4, 0x88, 0x05, 0x81,
0x9e, 0x41, 0x2d, 0x20, 0x3c, 0x04, 0x5a, 0xba, 0xef, 0x05, 0x61, 0xa4, 0xb0, 0x9d, 0xc5, 0x14,
0x76, 0xea, 0x05, 0x21, 0x5e, 0x8f, 0x90, 0x18, 0x45, 0xd1, 0x53, 0x58, 0xb7, 0xae, 0x5d, 0xc3,
0xb1, 0x4d, 0x89, 0x5c, 0x5a, 0x1a, 0x79, 0x4d, 0x02, 0x71, 0x60, 0x6d, 0x17, 0xaa, 0x89, 0x46,
0xb6, 0x30, 0x9e, 0x65, 0x48, 0x9d, 0x08, 0x22, 0xbd, 0x7f, 0x8b, 0x72, 0xff, 0x6a, 0xff, 0x94,
0x83, 0x5a, 0x7a, 0x03, 0x44, 0xf6, 0xf3, 0x49, 0x60, 0x7b, 0x56, 0xc2, 0x7e, 0xa7, 0x9c, 0xc1,
0x6c, 0xc4, 0x9a, 0x5f, 0x8d, 0xbd, 0xd0, 0x88, 0x6c, 0x64, 0xfa, 0xe3, 0x3f, 0x64, 0xf4, 0x94,
0xed, 0xf3, 0x53, 0xb6, 0x47, 0x1f, 0x02, 0x92, 0xf6, 0x1d, 0xd9, 0x8e, 0x1d, 0xea, 0xe7, 0xd7,
0x21, 0x11, 0xfa, 0xcf, 0x63, 0x55, 0xb4, 0x1c, 0xb1, 0x86, 0xaf, 0x18, 0x1f, 0x69, 0xb0, 0xee,
0x79, 0x8e, 0x4e, 0x4d, 0x2f, 0x20, 0xba, 0x61, 0xbd, 0xe4, 0x59, 0x72, 0x1e, 0x57, 0x3d, 0xcf,
0xe9, 0x31, 0x5e, 0xcb, 0x7a, 0xc9, 0xe2, 0x84, 0xe9, 0x8f, 0x29, 0x09, 0x75, 0xf6, 0xc3, 0x43,
0x6b, 0x05, 0x83, 0x60, 0xb5, 0xfd, 0x31, 0x4d, 0x74, 0x70, 0x88, 0xc3, 0xc2, 0x65, 0xa2, 0xc3,
0x31, 0x71, 0xd8, 0x2c, 0x6b, 0xa7, 0x24, 0x30, 0x89, 0x1b, 0xf6, 0x6d, 0xf3, 0x82, 0x45, 0x42,
0x65, 0x5b, 0xc1, 0x29, 0x9e, 0xf6, 0x33, 0x28, 0xf2, 0xc8, 0xc9, 0x16, 0xcf, 0xa3, 0x0e, 0x0f,
0x4a, 0x42, 0xbd, 0x65, 0xc6, 0xe0, 0x21, 0xe9, 0x7d, 0xa8, 0x0c, 0x3d, 0x2a, 0x43, 0x9a, 0xf0,
0xbc, 0x32, 0x63, 0xf0, 0xc6, 0x06, 0x94, 0x03, 0x62, 0x58, 0x9e, 0x3b, 0x8a, 0x5e, 0x12, 0x62,
0x5a, 0x7b, 0x05, 0x25, 0x71, 0xfc, 0xde, 0x00, 0xff, 0x23, 0x40, 0xa6, 0x88, 0x85, 0x3e, 0x09,
0x1c, 0x9b, 0x52, 0x99, 0x9c, 0xf1, 0xcf, 0x57, 0xa2, 0xe5, 0x74, 0xd2, 0xa0, 0xfd, 0x97, 0x22,
0xd2, 0x34, 0xf1, 0x61, 0x81, 0xe5, 0x73, 0xcc, 0xd3, 0xd8, 0x35, 0x4c, 0xbc, 0x60, 0x44, 0x24,
0xbb, 0xbc, 0xcb, 0x6c, 0x2c, 0xb7, 0xec, 0x77, 0x19, 0x09, 0x10, 0xbd, 0x67, 0x12, 0x79, 0xd3,
0x5b, 0xf4, 0x3d, 0x93, 0x88, 0xf7, 0x4c, 0xc2, 0xee, 0x9b, 0x32, 0x4f, 0x14, 0x70, 0x05, 0x9e,
0x26, 0x56, 0xad, 0xf8, 0xd1, 0x98, 0x68, 0xff, 0xa3, 0xc4, 0x67, 0x45, 0xf4, 0xb8, 0x8b, 0xbe,
0x81, 0x32, 0xdb, 0x76, 0xba, 0x63, 0xf8, 0xf2, 0x53, 0x65, 0x7b, 0xb9, 0x77, 0xe3, 0x26, 0xdb,
0x65, 0xc7, 0x86, 0x2f, 0xb2, 0xbc, 0x55, 0x5f, 0x50, 0xec, 0xcc, 0x31, 0xac, 0xc9, 0x99, 0xc3,
0xfe, 0xa3, 0xef, 0x43, 0xcd, 0x18, 0x87, 0x9e, 0x6e, 0x58, 0x97, 0x24, 0x08, 0x6d, 0x4a, 0xa4,
0xed, 0xd7, 0x19, 0xb7, 0x15, 0x31, 0x1b, 0x9f, 0xc3, 0x5a, 0x12, 0xf3, 0x6d, 0xd1, 0xb7, 0x98,
0x8c, 0xbe, 0x7f, 0x02, 0x30, 0x79, 0x28, 0x61, 0x3e, 0x42, 0xae, 0x6c, 0x76, 0x5d, 0x94, 0xf7,
0xa6, 0x22, 0x2e, 0x33, 0x46, 0x9b, 0xdd, 0x10, 0xd2, 0xaf, 0xb8, 0xc5, 0xe8, 0x15, 0x97, 0xed,
0x5a, 0xb6, 0xd1, 0x2e, 0xec, 0xd1, 0x28, 0x7e, 0xbc, 0xa9, 0x78, 0x9e, 0xf3, 0x84, 0x33, 0xb4,
0xdf, 0xe4, 0x84, 0xaf, 0x88, 0xf7, 0xf8, 0x4c, 0x29, 0xfd, 0xbb, 0x32, 0xf5, 0x2e, 0x00, 0x0d,
0x8d, 0x80, 0xa5, 0x12, 0x46, 0xf4, 0x7c, 0xd4, 0x98, 0x79, 0x06, 0xee, 0x47, 0x65, 0x05, 0xb8,
0x22, 0x7b, 0xb7, 0x42, 0xf4, 0x05, 0xac, 0x99, 0x9e, 0xe3, 0x8f, 0x88, 0x1c, 0x5c, 0x7c, 0xeb,
0xe0, 0x6a, 0xdc, 0xbf, 0x15, 0x26, 0x1e, 0xad, 0x4a, 0x37, 0x7d, 0xb4, 0xfa, 0x57, 0x45, 0x7c,
0x56, 0x48, 0x7e, 0xd5, 0x40, 0x83, 0x39, 0x9f, 0xce, 0xf7, 0x97, 0xfc, 0x44, 0xf2, 0x5d, 0xdf,
0xcd, 0x1b, 0x5f, 0x64, 0xf9, 0x50, 0xfd, 0xe6, 0xe4, 0xee, 0xdf, 0xf2, 0x50, 0x89, 0xbf, 0x28,
0xcc, 0xd8, 0xfe, 0x33, 0xa8, 0xc4, 0x35, 0x1d, 0xf2, 0x80, 0xf8, 0x4e, 0xf3, 0xc4, 0x9d, 0xd1,
0x0b, 0x40, 0xc6, 0x60, 0x10, 0x27, 0x6d, 0xfa, 0x98, 0x1a, 0x83, 0xe8, 0x7b, 0xce, 0x67, 0x0b,
0xe8, 0x21, 0x8a, 0x5b, 0x67, 0x6c, 0x3c, 0x56, 0x8d, 0xc1, 0x20, 0xc5, 0x41, 0x7f, 0x0a, 0xb7,
0xd3, 0x73, 0xe8, 0xe7, 0xd7, 0xba, 0x6f, 0x5b, 0xf2, 0xea, 0x78, 0xb0, 0xe8, 0x47, 0x95, 0x66,
0x0a, 0xfe, 0xab, 0xeb, 0x53, 0xdb, 0x12, 0x3a, 0x47, 0xc1, 0x4c, 0x43, 0xe3, 0xcf, 0xe1, 0xbd,
0x37, 0x74, 0x9f, 0x63, 0x83, 0x6e, 0xba, 0x58, 0x60, 0x79, 0x25, 0x24, 0xac, 0xf7, 0x6b, 0x45,
0x7c, 0xfb, 0x49, 0xeb, 0xa4, 0x95, 0xcc, 0x5b, 0xef, 0x67, 0x9c, 0xa7, 0x7d, 0x7a, 0x26, 0xe0,
0x79, 0xaa, 0xfa, 0xf5, 0x54, 0xaa, 0x9a, 0x35, 0x89, 0x11, 0x19, 0x9f, 0x00, 0x92, 0x08, 0xda,
0x3f, 0xe7, 0xa1, 0x1c, 0xa1, 0xf3, 0x8b, 0xdf, 0x35, 0x0d, 0x89, 0xa3, 0xc7, 0x4f, 0x3f, 0x0a,
0x06, 0xc1, 0xe2, 0xcf, 0x1c, 0xef, 0x43, 0x85, 0xdd, 0x2f, 0x45, 0x73, 0x8e, 0x37, 0x97, 0x19,
0x83, 0x37, 0x7e, 0x00, 0xd5, 0xd0, 0x0b, 0x8d, 0x91, 0x1e, 0xf2, 0x58, 0x9e, 0x17, 0xa3, 0x39,
0x8b, 0x47, 0x72, 0xf4, 0x43, 0xd8, 0x0c, 0x87, 0x81, 0x17, 0x86, 0x23, 0x96, 0xdf, 0xf1, 0x8c,
0x46, 0x24, 0x20, 0x05, 0xac, 0xc6, 0x0d, 0x22, 0xd3, 0xa1, 0xec, 0xf4, 0x9e, 0x74, 0x66, 0xae,
0xcb, 0x0f, 0x91, 0x02, 0x5e, 0x8f, 0xb9, 0xcc, 0xb5, 0x59, 0xf0, 0xf4, 0x45, 0xb6, 0xc0, 0xcf,
0x0a, 0x05, 0x47, 0x24, 0xd2, 0x61, 0xc3, 0x21, 0x06, 0x1d, 0x07, 0xc4, 0xd2, 0x5f, 0xd8, 0x64,
0x64, 0x89, 0xfb, 0x7a, 0x2d, 0x73, 0xfa, 0x1d, 0xa9, 0xa5, 0xf9, 0x98, 0x8f, 0xc6, 0xb5, 0x08,
0x4e, 0xd0, 0x2c, 0x73, 0x10, 0xff, 0xd0, 0x06, 0x54, 0x7b, 0xcf, 0x7a, 0xfd, 0xce, 0xb1, 0x7e,
0x7c, 0xb2, 0xd7, 0x91, 0xf5, 0x20, 0xbd, 0x0e, 0x16, 0xa4, 0xc2, 0xda, 0xfb, 0x27, 0xfd, 0xd6,
0x91, 0xde, 0x3f, 0x6c, 0x3f, 0xe9, 0xa9, 0x39, 0x74, 0x1b, 0x36, 0xfb, 0x07, 0xf8, 0xa4, 0xdf,
0x3f, 0xea, 0xec, 0xe9, 0xa7, 0x1d, 0x7c, 0x78, 0xb2, 0xd7, 0x53, 0xf3, 0x08, 0x41, 0x6d, 0xc2,
0xee, 0x1f, 0x1e, 0x77, 0xd4, 0x02, 0xaa, 0xc2, 0xea, 0x69, 0x07, 0xb7, 0x3b, 0xdd, 0xbe, 0x5a,
0xd4, 0x7e, 0x95, 0x87, 0x6a, 0xc2, 0x8a, 0xcc, 0x91, 0x03, 0x2a, 0xf2, 0xfc, 0x02, 0x66, 0x7f,
0xf9, 0xf7, 0x2b, 0xc3, 0x1c, 0x0a, 0xeb, 0x14, 0xb0, 0x20, 0x78, 0x6e, 0x6f, 0x5c, 0x25, 0xf6,
0x79, 0x01, 0x97, 0x1d, 0xe3, 0x4a, 0x80, 0x7c, 0x0f, 0xd6, 0x2e, 0x48, 0xe0, 0x92, 0x91, 0x6c,
0x17, 0x16, 0xa9, 0x0a, 0x9e, 0xe8, 0xb2, 0x0d, 0xaa, 0xec, 0x32, 0x81, 0x11, 0xe6, 0xa8, 0x09,
0xfe, 0x71, 0x04, 0xb6, 0x05, 0x45, 0xd1, 0xbc, 0x2a, 0xe6, 0xe7, 0x04, 0x0b, 0x53, 0xf4, 0xb5,
0xe1, 0xf3, 0xfc, 0xae, 0x80, 0xf9, 0x7f, 0x74, 0x3e, 0x6b, 0x9f, 0x12, 0xb7, 0xcf, 0xee, 0xe2,
0xee, 0xfc, 0x26, 0x13, 0x0d, 0x63, 0x13, 0xad, 0x42, 0x1e, 0x47, 0x45, 0x14, 0xed, 0x56, 0xfb,
0x80, 0x99, 0x65, 0x1d, 0x2a, 0xc7, 0xad, 0x9f, 0xea, 0x67, 0x3d, 0xfe, 0xa2, 0x8a, 0x54, 0x58,
0x7b, 0xd2, 0xc1, 0xdd, 0xce, 0x91, 0xe4, 0xe4, 0xd1, 0x16, 0xa8, 0x92, 0x33, 0xe9, 0x57, 0x60,
0x08, 0xe2, 0x6f, 0x11, 0x95, 0xa1, 0xd0, 0x7b, 0xda, 0x3a, 0x55, 0x4b, 0xda, 0x7f, 0xe7, 0x60,
0x43, 0x84, 0x85, 0xf8, 0x73, 0xef, 0x9b, 0x3f, 0x77, 0x25, 0x1f, 0x3f, 0x72, 0xe9, 0xc7, 0x8f,
0x28, 0x09, 0xe5, 0x51, 0x3d, 0x3f, 0x49, 0x42, 0xf9, 0xa3, 0x49, 0xea, 0xc4, 0x2f, 0x2c, 0x72,
0xe2, 0xd7, 0x61, 0xd5, 0x21, 0x34, 0xb6, 0x5b, 0x05, 0x47, 0x24, 0xb2, 0xa1, 0x6a, 0xb8, 0xae,
0x17, 0x1a, 0xe2, 0x45, 0xb1, 0xb4, 0x50, 0x30, 0x9c, 0x5a, 0x71, 0xb3, 0x35, 0x41, 0x12, 0x07,
0x73, 0x12, 0xbb, 0xf1, 0x13, 0x50, 0xa7, 0x3b, 0x2c, 0x12, 0x0e, 0x7f, 0xf0, 0xc9, 0x24, 0x1a,
0x12, 0xb6, 0x2f, 0xe4, 0x7b, 0xb7, 0xba, 0xc2, 0x08, 0x7c, 0xd6, 0xed, 0x1e, 0x76, 0xf7, 0x55,
0x05, 0x01, 0x94, 0x3a, 0x3f, 0x3d, 0xec, 0x77, 0xf6, 0xd4, 0xdc, 0xce, 0xaf, 0x37, 0xa1, 0x24,
0x84, 0x44, 0xdf, 0xca, 0x4c, 0x20, 0x59, 0x4a, 0x88, 0x7e, 0xb2, 0x70, 0x46, 0x9d, 0x2a, 0x4f,
0x6c, 0x3c, 0x5a, 0x7a, 0xbc, 0xfc, 0xac, 0xb3, 0x82, 0xfe, 0x5a, 0x81, 0xb5, 0xd4, 0x27, 0x9d,
0xac, 0x2f, 0xaa, 0x73, 0x2a, 0x17, 0x1b, 0x3f, 0x5e, 0x6a, 0x6c, 0x2c, 0xcb, 0x2f, 0x15, 0xa8,
0x26, 0x6a, 0xf6, 0xd0, 0xee, 0x32, 0x75, 0x7e, 0x42, 0x92, 0xcf, 0x97, 0x2f, 0x11, 0xd4, 0x56,
0x3e, 0x56, 0xd0, 0x5f, 0x29, 0x50, 0x4d, 0x54, 0xaf, 0x65, 0x16, 0x65, 0xb6, 0xd6, 0x2e, 0xb3,
0x28, 0xf3, 0x8a, 0xe5, 0x56, 0xd0, 0x5f, 0x28, 0x50, 0x89, 0x2b, 0xd1, 0xd0, 0x83, 0xc5, 0x6b,
0xd7, 0x84, 0x10, 0x9f, 0x2d, 0x5b, 0xf4, 0xa6, 0xad, 0xa0, 0x3f, 0x83, 0x72, 0x54, 0xb6, 0x85,
0xb2, 0x46, 0xaf, 0xa9, 0x9a, 0xb0, 0xc6, 0x83, 0x85, 0xc7, 0x25, 0xa7, 0x8f, 0x6a, 0xa9, 0x32,
0x4f, 0x3f, 0x55, 0xf5, 0xd5, 0x78, 0xb0, 0xf0, 0xb8, 0x78, 0x7a, 0xe6, 0x09, 0x89, 0x92, 0xab,
0xcc, 0x9e, 0x30, 0x5b, 0xeb, 0x95, 0xd9, 0x13, 0xe6, 0x55, 0x78, 0x09, 0x41, 0x12, 0x45, 0x5b,
0x99, 0x05, 0x99, 0x2d, 0x0c, 0xcb, 0x2c, 0xc8, 0x9c, 0x1a, 0x31, 0x6d, 0x05, 0xfd, 0x42, 0x49,
0xde, 0x0b, 0x1e, 0x2c, 0x5c, 0x9b, 0xb4, 0xa0, 0x4b, 0xce, 0x54, 0x47, 0xf1, 0x0d, 0xfa, 0x0b,
0xf9, 0x8a, 0x21, 0x4a, 0x9b, 0xd0, 0x22, 0x60, 0xa9, 0x6a, 0xa8, 0xc6, 0xa7, 0xcb, 0x05, 0x1b,
0x2e, 0xc4, 0x5f, 0x2a, 0x00, 0x93, 0x22, 0xa8, 0xcc, 0x42, 0xcc, 0x54, 0x5f, 0x35, 0x76, 0x97,
0x18, 0x99, 0xdc, 0x20, 0x51, 0x91, 0x46, 0xe6, 0x0d, 0x32, 0x55, 0xa4, 0x95, 0x79, 0x83, 0x4c,
0x17, 0x58, 0x69, 0x2b, 0xe8, 0x1f, 0x15, 0xd8, 0x9c, 0x29, 0x12, 0x41, 0x8f, 0x6e, 0x58, 0x27,
0xd4, 0xf8, 0x72, 0x79, 0x80, 0x48, 0xb4, 0x6d, 0xe5, 0x63, 0x05, 0xfd, 0x8d, 0x02, 0xeb, 0xe9,
0x0f, 0xeb, 0x99, 0xa3, 0xd4, 0x9c, 0x72, 0x93, 0xc6, 0xc3, 0xe5, 0x06, 0xc7, 0xda, 0xfa, 0x3b,
0x05, 0x6a, 0xe9, 0x1a, 0x0b, 0xf4, 0x70, 0xb1, 0x63, 0x61, 0x4a, 0xa0, 0x2f, 0x96, 0x1c, 0x1d,
0x49, 0xf4, 0xd5, 0xea, 0x1f, 0x15, 0x45, 0xf6, 0x56, 0xe2, 0x3f, 0x3f, 0xfa, 0x6d, 0x00, 0x00,
0x00, 0xff, 0xff, 0x29, 0x1e, 0x98, 0x4c, 0x27, 0x32, 0x00, 0x00,
0x3f, 0x84, 0x92, 0xf8, 0x52, 0xe6, 0x49, 0xbd, 0xb3, 0x76, 0xbb, 0xd3, 0xeb, 0xa9, 0x2b, 0xa8,
0x02, 0x45, 0xdc, 0xe9, 0x63, 0xe6, 0x61, 0x15, 0x28, 0x3e, 0x6e, 0xf5, 0x5b, 0x47, 0x6a, 0x4e,
0xfb, 0x01, 0x6c, 0x3c, 0x35, 0x6c, 0x9a, 0xc5, 0xb9, 0x34, 0x0f, 0xd4, 0x49, 0x5f, 0x69, 0x9d,
0xc3, 0x94, 0x75, 0xb2, 0xab, 0xa6, 0x73, 0x65, 0xd3, 0x29, 0x7b, 0xa8, 0x90, 0x27, 0x41, 0x20,
0x4d, 0xc0, 0xfe, 0x6a, 0xaf, 0x61, 0xa3, 0x47, 0x3d, 0x3f, 0x93, 0xe7, 0xff, 0x08, 0x56, 0x59,
0x8c, 0xf2, 0xc6, 0x54, 0xba, 0xfe, 0xdd, 0xa6, 0x88, 0x61, 0xcd, 0x28, 0x86, 0x35, 0xf7, 0x64,
0x8c, 0xc3, 0x51, 0x4f, 0x74, 0x07, 0x4a, 0xa1, 0x3d, 0x70, 0x8d, 0x91, 0xdc, 0x2d, 0x24, 0xa5,
0x21, 0xe6, 0xe4, 0xd1, 0xc4, 0xd2, 0xf1, 0xdb, 0x80, 0xf6, 0x48, 0x48, 0x03, 0xef, 0x3a, 0x93,
0x3c, 0x5b, 0x50, 0x7c, 0xe1, 0x05, 0xa6, 0x58, 0x88, 0x65, 0x2c, 0x08, 0xb6, 0xa8, 0x52, 0x20,
0x12, 0xfb, 0x23, 0x40, 0x87, 0x2e, 0x8b, 0x29, 0xd9, 0x0c, 0xf1, 0xf7, 0x39, 0xb8, 0x95, 0xea,
0x2f, 0x8d, 0xb1, 0xfc, 0x3a, 0x64, 0x1b, 0xd3, 0x38, 0x14, 0xeb, 0x10, 0x9d, 0x40, 0x49, 0xf4,
0x90, 0x9a, 0x7c, 0xb0, 0x00, 0x90, 0x08, 0x53, 0x12, 0x4e, 0xc2, 0xcc, 0x75, 0xfa, 0xfc, 0xbb,
0x75, 0xfa, 0xd7, 0xa0, 0x46, 0xdf, 0x11, 0xbe, 0xd5, 0x36, 0x5f, 0xc3, 0x2d, 0xd3, 0x1b, 0x8d,
0x88, 0xc9, 0xbc, 0x41, 0xb7, 0x5d, 0x4a, 0x82, 0x4b, 0x63, 0xf4, 0x76, 0xbf, 0x41, 0x93, 0x51,
0x87, 0x72, 0x90, 0xf6, 0x1c, 0x36, 0x13, 0x13, 0x4b, 0x43, 0x3c, 0x86, 0x62, 0xc8, 0x18, 0xd2,
0x12, 0x1f, 0x2f, 0x68, 0x89, 0x10, 0x8b, 0xe1, 0xda, 0x2d, 0x01, 0xde, 0xb9, 0x24, 0x6e, 0xfc,
0x59, 0xda, 0x1e, 0x6c, 0xf6, 0xb8, 0x9b, 0x66, 0xf2, 0xc3, 0x89, 0x8b, 0xe7, 0x52, 0x2e, 0xbe,
0x05, 0x28, 0x89, 0x22, 0x1d, 0xf1, 0x1a, 0x36, 0x3a, 0x57, 0xc4, 0xcc, 0x84, 0x5c, 0x87, 0x55,
0xd3, 0x73, 0x1c, 0xc3, 0xb5, 0xea, 0xb9, 0x7b, 0xf9, 0xed, 0x0a, 0x8e, 0xc8, 0xe4, 0x5a, 0xcc,
0x67, 0x5d, 0x8b, 0xda, 0xdf, 0x2a, 0xa0, 0x4e, 0xe6, 0x96, 0x8a, 0x64, 0xd2, 0x53, 0x8b, 0x01,
0xb1, 0xb9, 0xd7, 0xb0, 0xa4, 0x24, 0x3f, 0xda, 0x2e, 0x04, 0x9f, 0x04, 0x41, 0x62, 0x3b, 0xca,
0xdf, 0x70, 0x3b, 0xd2, 0x0e, 0xe0, 0x77, 0x22, 0x71, 0x7a, 0x34, 0x20, 0x86, 0x63, 0xbb, 0x83,
0xc3, 0x93, 0x13, 0x9f, 0x08, 0xc1, 0x11, 0x82, 0x82, 0x65, 0x50, 0x43, 0x0a, 0xc6, 0xff, 0xb3,
0x45, 0x6f, 0x8e, 0xbc, 0x30, 0x5e, 0xf4, 0x9c, 0xd0, 0xfe, 0x23, 0x0f, 0xf5, 0x19, 0xa8, 0x48,
0xbd, 0xcf, 0xa1, 0x18, 0x12, 0x3a, 0xf6, 0xa5, 0xab, 0x74, 0x32, 0x0b, 0x3c, 0x1f, 0xaf, 0xd9,
0x63, 0x60, 0x58, 0x60, 0xa2, 0x01, 0x94, 0x29, 0xbd, 0xd6, 0x43, 0xfb, 0xe7, 0x51, 0x42, 0x70,
0x74, 0x53, 0xfc, 0x3e, 0x09, 0x1c, 0xdb, 0x35, 0x46, 0x3d, 0xfb, 0xe7, 0x04, 0xaf, 0x52, 0x7a,
0xcd, 0xfe, 0xa0, 0x67, 0xcc, 0xe1, 0x2d, 0xdb, 0x95, 0x6a, 0x6f, 0x2f, 0x3b, 0x4b, 0x42, 0xc1,
0x58, 0x20, 0x36, 0x8e, 0xa0, 0xc8, 0xbf, 0x69, 0x19, 0x47, 0x54, 0x21, 0x4f, 0xe9, 0x35, 0x17,
0xaa, 0x8c, 0xd9, 0xdf, 0xc6, 0x43, 0x58, 0x4b, 0x7e, 0x01, 0x73, 0xa4, 0x21, 0xb1, 0x07, 0x43,
0xe1, 0x60, 0x45, 0x2c, 0x29, 0x66, 0xc9, 0xd7, 0xb6, 0x25, 0x53, 0xd6, 0x22, 0x16, 0x84, 0xf6,
0xaf, 0x39, 0xb8, 0x3b, 0x47, 0x33, 0xd2, 0x59, 0x9f, 0xa7, 0x9c, 0xf5, 0x1d, 0x69, 0x21, 0xf2,
0xf8, 0xe7, 0x29, 0x8f, 0x7f, 0x87, 0xe0, 0x6c, 0xd9, 0xdc, 0x81, 0x12, 0xb9, 0xb2, 0x29, 0xb1,
0xa4, 0xaa, 0x24, 0x95, 0x58, 0x4e, 0x85, 0x9b, 0x2e, 0xa7, 0x4f, 0x60, 0xab, 0x1d, 0x10, 0x83,
0x12, 0xb9, 0x95, 0x47, 0xfe, 0x7f, 0x17, 0xca, 0xc6, 0x68, 0xe4, 0x99, 0x13, 0xb3, 0xae, 0x72,
0xfa, 0xd0, 0xd2, 0xbe, 0x55, 0xe0, 0xf6, 0xd4, 0x18, 0xa9, 0xe9, 0x73, 0xa8, 0xd9, 0xa1, 0x37,
0xe2, 0x1f, 0xa1, 0x27, 0x4e, 0x71, 0x3f, 0x5e, 0x2c, 0x9c, 0x1c, 0x46, 0x18, 0xfc, 0x50, 0xb7,
0x6e, 0x27, 0x49, 0xee, 0x55, 0x7c, 0x72, 0x4b, 0xae, 0xe6, 0x88, 0xd4, 0xfe, 0x41, 0x81, 0xdb,
0x32, 0x8a, 0x67, 0xfe, 0x98, 0x39, 0x22, 0xe7, 0xde, 0xb5, 0xc8, 0x5a, 0x1d, 0xee, 0x4c, 0xcb,
0x25, 0xf7, 0xf5, 0xff, 0x2c, 0x00, 0x9a, 0x3d, 0x41, 0xa2, 0xef, 0xc1, 0x5a, 0x48, 0x5c, 0x4b,
0x17, 0x31, 0x41, 0x84, 0xab, 0x32, 0xae, 0x32, 0x9e, 0x08, 0x0e, 0x21, 0xdb, 0xe6, 0xc8, 0x95,
0x94, 0xb6, 0x8c, 0xf9, 0x7f, 0x34, 0x84, 0xb5, 0x17, 0xa1, 0x1e, 0xcf, 0xcd, 0x9d, 0xa6, 0x96,
0x79, 0xeb, 0x9a, 0x95, 0xa3, 0xf9, 0xb8, 0x17, 0x7f, 0x17, 0xae, 0xbe, 0x08, 0x63, 0x02, 0xfd,
0x52, 0x81, 0xf7, 0xa2, 0xd4, 0x61, 0xa2, 0x3e, 0xc7, 0xb3, 0x48, 0x58, 0x2f, 0xdc, 0xcb, 0x6f,
0xd7, 0x76, 0x4e, 0x6f, 0xa0, 0xbf, 0x19, 0xe6, 0xb1, 0x67, 0x11, 0x7c, 0xdb, 0x9d, 0xc3, 0x0d,
0x51, 0x13, 0x6e, 0x39, 0xe3, 0x90, 0xea, 0xc2, 0x0b, 0x74, 0xd9, 0xa9, 0x5e, 0xe4, 0x7a, 0xd9,
0x64, 0x4d, 0x29, 0x5f, 0x45, 0x17, 0xb0, 0xee, 0x78, 0x63, 0x97, 0xea, 0x26, 0x3f, 0xe3, 0x84,
0xf5, 0xd2, 0x42, 0x87, 0xdf, 0x39, 0x5a, 0x3a, 0x66, 0x70, 0xe2, 0xc4, 0x14, 0xe2, 0x35, 0x27,
0x41, 0x69, 0x4d, 0xa8, 0x26, 0x74, 0x88, 0xca, 0x50, 0xe8, 0x9e, 0x74, 0x3b, 0xea, 0x0a, 0x02,
0x28, 0xb5, 0x0f, 0xf0, 0xc9, 0x49, 0x5f, 0xa4, 0xfd, 0x87, 0xc7, 0xad, 0xfd, 0x8e, 0x9a, 0xd3,
0x3a, 0xb0, 0x96, 0x44, 0x43, 0x08, 0x6a, 0x67, 0xdd, 0x27, 0xdd, 0x93, 0xa7, 0x5d, 0xfd, 0xf8,
0xe4, 0xac, 0xdb, 0x67, 0x07, 0x86, 0x1a, 0x40, 0xab, 0xfb, 0x6c, 0x42, 0xaf, 0x43, 0xa5, 0x7b,
0x12, 0x91, 0x4a, 0x23, 0xa7, 0x2a, 0xda, 0xff, 0xe6, 0x60, 0x6b, 0x9e, 0x62, 0x91, 0x05, 0x05,
0x66, 0x24, 0x79, 0x64, 0x7b, 0xf7, 0x36, 0xe2, 0xe8, 0xcc, 0x37, 0x7d, 0x43, 0xee, 0xd1, 0x15,
0xcc, 0xff, 0x23, 0x1d, 0x4a, 0x23, 0xe3, 0x9c, 0x8c, 0xc2, 0x7a, 0x9e, 0x5f, 0x6a, 0xec, 0xdf,
0x64, 0xee, 0x23, 0x8e, 0x24, 0x6e, 0x34, 0x24, 0x6c, 0x63, 0x17, 0xaa, 0x09, 0xf6, 0x9c, 0xab,
0x83, 0xad, 0xe4, 0xd5, 0x41, 0x25, 0x79, 0x0f, 0xf0, 0x68, 0x56, 0x5b, 0xec, 0x6b, 0x98, 0xb9,
0x0e, 0x4e, 0x7a, 0x7d, 0x71, 0x48, 0xdb, 0xc7, 0x27, 0x67, 0xa7, 0xaa, 0xc2, 0x98, 0xfd, 0x56,
0xef, 0x89, 0x9a, 0x8b, 0xad, 0x99, 0xd7, 0x9e, 0x43, 0x65, 0xaf, 0xdb, 0x13, 0x46, 0x63, 0x1b,
0x54, 0x48, 0x02, 0xf6, 0x09, 0xfc, 0xfe, 0xa6, 0x82, 0x23, 0x12, 0x35, 0xa0, 0x1c, 0x12, 0x23,
0x30, 0x87, 0x24, 0x94, 0x11, 0x31, 0xa6, 0xd9, 0x28, 0x8f, 0xdf, 0x83, 0x08, 0x05, 0x55, 0x70,
0x44, 0x6a, 0xff, 0xb7, 0x0a, 0x30, 0x39, 0x93, 0xa3, 0x1a, 0xe4, 0xe2, 0x5d, 0x2c, 0x67, 0x5b,
0x4c, 0xd9, 0xae, 0xe1, 0x44, 0x5f, 0xc5, 0xff, 0xa3, 0x1d, 0xb8, 0xed, 0x84, 0x03, 0xdf, 0x30,
0x2f, 0x74, 0x79, 0x94, 0x16, 0xce, 0xce, 0x77, 0x84, 0x35, 0x7c, 0x4b, 0x36, 0x4a, 0x5f, 0x16,
0xb8, 0x47, 0x90, 0x27, 0xee, 0x25, 0x5f, 0xbd, 0xd5, 0x9d, 0xcf, 0x17, 0xbe, 0x2b, 0x68, 0x76,
0xdc, 0x4b, 0x61, 0x10, 0x06, 0x83, 0x74, 0x00, 0x8b, 0x5c, 0xda, 0x26, 0xd1, 0x19, 0x68, 0x91,
0x83, 0x7e, 0xb9, 0x38, 0xe8, 0x1e, 0xc7, 0x88, 0xa1, 0x2b, 0x56, 0x44, 0xa3, 0x2e, 0x54, 0x02,
0x12, 0x7a, 0xe3, 0xc0, 0x24, 0x62, 0x09, 0x67, 0x4f, 0xe7, 0x71, 0x34, 0x0e, 0x4f, 0x20, 0xd0,
0x1e, 0x94, 0xf8, 0xca, 0x0d, 0xeb, 0xab, 0x5c, 0xd8, 0x0f, 0x33, 0x82, 0xf1, 0xe5, 0x8a, 0xe5,
0x58, 0xb4, 0x0f, 0xab, 0x42, 0xc4, 0xb0, 0x5e, 0xe6, 0x30, 0x1f, 0x65, 0xdd, 0x56, 0xf8, 0x28,
0x1c, 0x8d, 0x66, 0x56, 0x1d, 0x87, 0x24, 0xa8, 0x57, 0x84, 0x55, 0xd9, 0x7f, 0xf4, 0x3e, 0x54,
0x44, 0x14, 0xb3, 0xec, 0xa0, 0x0e, 0xbc, 0x41, 0x84, 0xb5, 0x3d, 0x3b, 0x40, 0x1f, 0x40, 0x55,
0x64, 0x24, 0x3a, 0x5f, 0x7a, 0x55, 0xde, 0x0c, 0x82, 0x75, 0xca, 0x16, 0xa0, 0xe8, 0x40, 0x82,
0x40, 0x74, 0x58, 0x8b, 0x3b, 0x90, 0x20, 0xe0, 0x1d, 0x7e, 0x1f, 0x36, 0x78, 0x1e, 0x37, 0x08,
0xbc, 0xb1, 0xaf, 0x73, 0x9f, 0x5a, 0xe7, 0x9d, 0xd6, 0x19, 0x7b, 0x9f, 0x71, 0xbb, 0xcc, 0xb9,
0xee, 0x42, 0xf9, 0xa5, 0x77, 0x2e, 0x3a, 0xd4, 0x44, 0x30, 0x7d, 0xe9, 0x9d, 0x47, 0x4d, 0x71,
0x9c, 0xdd, 0x48, 0xc7, 0xd9, 0x57, 0x70, 0x67, 0x36, 0x60, 0xf0, 0x78, 0xab, 0xde, 0x3c, 0xde,
0x6e, 0xb9, 0xf3, 0x36, 0xbb, 0xaf, 0x20, 0x6f, 0xb9, 0x61, 0x7d, 0x73, 0x21, 0xe7, 0x88, 0xd7,
0x31, 0x66, 0x83, 0x1b, 0x9f, 0x42, 0x39, 0xf2, 0xbe, 0x45, 0xb6, 0x94, 0xc6, 0x43, 0xa8, 0xa5,
0x7d, 0x77, 0xa1, 0x0d, 0xe9, 0x9f, 0x73, 0x50, 0x89, 0xbd, 0x14, 0xb9, 0x70, 0x8b, 0x6b, 0x91,
0x25, 0x39, 0xfa, 0xc4, 0xe9, 0x45, 0x6a, 0xf5, 0x45, 0xc6, 0xef, 0x6a, 0x45, 0x08, 0xf2, 0x1c,
0x27, 0x57, 0x00, 0x8a, 0x91, 0x27, 0xf3, 0x7d, 0x03, 0x1b, 0x23, 0xdb, 0x1d, 0x5f, 0x25, 0xe6,
0x12, 0x39, 0xd1, 0x1f, 0x64, 0x9c, 0xeb, 0x88, 0x8d, 0x9e, 0xcc, 0x51, 0x1b, 0xa5, 0x68, 0x74,
0x00, 0x45, 0xdf, 0x0b, 0x68, 0x14, 0x09, 0x76, 0x32, 0xa2, 0x9e, 0x7a, 0x01, 0x3d, 0x36, 0x7c,
0x9f, 0xa5, 0xf6, 0x02, 0x40, 0xfb, 0x36, 0x07, 0x77, 0xe6, 0x7f, 0x18, 0xea, 0x42, 0xde, 0xf4,
0xc7, 0x52, 0x49, 0x0f, 0x17, 0x55, 0x52, 0xdb, 0x1f, 0x4f, 0xe4, 0x67, 0x40, 0xe8, 0x29, 0x94,
0x1c, 0xe2, 0x78, 0xc1, 0xb5, 0xd4, 0xc5, 0xa3, 0x45, 0x21, 0x8f, 0xf9, 0xe8, 0x09, 0xaa, 0x84,
0x43, 0x18, 0xca, 0xd2, 0x7b, 0x43, 0xb9, 0x4f, 0x2e, 0x78, 0xf9, 0x12, 0x41, 0xe2, 0x18, 0x47,
0xfb, 0x14, 0x6e, 0xcf, 0xfd, 0x14, 0xf4, 0xbb, 0x00, 0xa6, 0x3f, 0xd6, 0xf9, 0xe5, 0xb8, 0xf0,
0xa0, 0x3c, 0xae, 0x98, 0xfe, 0xb8, 0xc7, 0x19, 0xda, 0x03, 0xa8, 0xbf, 0x49, 0x5e, 0xb6, 0xfb,
0x08, 0x89, 0x75, 0xe7, 0x9c, 0xeb, 0x20, 0x8f, 0xcb, 0x82, 0x71, 0x7c, 0xae, 0xfd, 0x2a, 0x07,
0x1b, 0x53, 0xe2, 0xb0, 0xc3, 0x8b, 0xd8, 0xcd, 0xa2, 0x63, 0xa1, 0xa0, 0xd8, 0xd6, 0x66, 0xda,
0x56, 0x74, 0xa1, 0xc8, 0xff, 0xf3, 0xa0, 0xe6, 0xcb, 0xcb, 0xbe, 0x9c, 0xed, 0xb3, 0xa5, 0xe1,
0x9c, 0xdb, 0x34, 0xe4, 0xe7, 0x9b, 0x22, 0x16, 0x04, 0x7a, 0x06, 0xb5, 0x80, 0xf0, 0x60, 0x6a,
0xe9, 0xc2, 0x83, 0x8a, 0x0b, 0x79, 0x90, 0x94, 0x90, 0x39, 0x12, 0x5e, 0x8f, 0x90, 0x18, 0x15,
0xa2, 0xa7, 0xb0, 0x6e, 0x5d, 0xbb, 0x86, 0x63, 0x9b, 0x12, 0xb9, 0xb4, 0x34, 0xf2, 0x9a, 0x04,
0xe2, 0xc0, 0xda, 0x2e, 0x54, 0x13, 0x8d, 0xec, 0xc3, 0x78, 0xbe, 0x22, 0x75, 0x22, 0x88, 0xf4,
0x4e, 0x50, 0x94, 0x3b, 0x81, 0x76, 0x0e, 0xd5, 0x84, 0xcf, 0x2f, 0x32, 0x94, 0xe9, 0x93, 0x7a,
0x5c, 0x9f, 0x45, 0x9c, 0xa3, 0x1e, 0x3b, 0xa3, 0x0f, 0xbd, 0x90, 0xea, 0xb6, 0xcf, 0x35, 0x5a,
0xc1, 0x25, 0x46, 0x1e, 0xfa, 0xda, 0x3f, 0xe5, 0xa0, 0x96, 0x5e, 0xae, 0x91, 0x8f, 0xf8, 0x24,
0xb0, 0x3d, 0x2b, 0xe1, 0x23, 0xa7, 0x9c, 0xc1, 0xfc, 0x80, 0x35, 0xbf, 0x1a, 0x7b, 0xd4, 0x88,
0xfc, 0xc0, 0xf4, 0xc7, 0x7f, 0xc8, 0xe8, 0x29, 0xff, 0xca, 0x4f, 0xf9, 0x17, 0xfa, 0x10, 0x90,
0xf4, 0xa1, 0x91, 0xed, 0xd8, 0x54, 0x3f, 0xbf, 0xa6, 0x44, 0xd8, 0x38, 0x8f, 0x55, 0xd1, 0x72,
0xc4, 0x1a, 0xbe, 0x62, 0x7c, 0xa4, 0xc1, 0xba, 0xe7, 0x39, 0x7a, 0x68, 0x7a, 0x01, 0xd1, 0x0d,
0xeb, 0x25, 0xcf, 0xe9, 0xf3, 0xb8, 0xea, 0x79, 0x4e, 0x8f, 0xf1, 0x5a, 0xd6, 0x4b, 0x16, 0xd5,
0x4c, 0x7f, 0x1c, 0x12, 0xaa, 0xb3, 0x1f, 0x9e, 0x08, 0x54, 0x30, 0x08, 0x56, 0xdb, 0x1f, 0x87,
0x89, 0x0e, 0x0e, 0x71, 0x58, 0x70, 0x4f, 0x74, 0x38, 0x26, 0x0e, 0x9b, 0x65, 0xed, 0x94, 0x04,
0x26, 0x71, 0x69, 0xdf, 0x36, 0x2f, 0x58, 0xdc, 0x56, 0xb6, 0x15, 0x9c, 0xe2, 0x69, 0x3f, 0x83,
0x22, 0x8f, 0xf3, 0xec, 0xe3, 0x79, 0x8c, 0xe4, 0x21, 0x54, 0xd8, 0xa1, 0xcc, 0x18, 0x3c, 0x80,
0xbe, 0x0f, 0x15, 0xae, 0xe4, 0x44, 0xee, 0x5b, 0x66, 0x0c, 0xde, 0xd8, 0x80, 0x72, 0x40, 0x0c,
0xcb, 0x73, 0x47, 0xd1, 0xbd, 0x47, 0x4c, 0x6b, 0xaf, 0xa0, 0x24, 0x82, 0xc5, 0x0d, 0xf0, 0x3f,
0x02, 0x64, 0x8a, 0xc8, 0xed, 0x93, 0xc0, 0xb1, 0xc3, 0x50, 0xa6, 0x92, 0xfc, 0xb1, 0x4d, 0xb4,
0x9c, 0x4e, 0x1a, 0xb4, 0xff, 0x52, 0x44, 0x52, 0x29, 0x9e, 0x41, 0x58, 0xf6, 0xc9, 0xbc, 0x99,
0x1d, 0x1a, 0xc5, 0x7d, 0x4b, 0x44, 0xa2, 0x43, 0x28, 0xc9, 0xdc, 0x31, 0xb7, 0xec, 0x2b, 0x92,
0x04, 0x88, 0x6e, 0x5f, 0x89, 0x3c, 0x97, 0x2e, 0x7a, 0xfb, 0x4a, 0xc4, 0xed, 0x2b, 0x61, 0xa7,
0x63, 0x99, 0xd5, 0x0a, 0xb8, 0x02, 0x4f, 0x6a, 0xab, 0x56, 0x7c, 0xc5, 0x4d, 0xb4, 0xff, 0x51,
0xe2, 0xfd, 0x28, 0xba, 0x8a, 0x46, 0xdf, 0x40, 0x99, 0x2d, 0x6d, 0xdd, 0x31, 0x7c, 0xf9, 0xb0,
0xda, 0x5e, 0xee, 0x96, 0x3b, 0x8a, 0x44, 0x22, 0x27, 0x5d, 0xf5, 0x05, 0xc5, 0xf6, 0x35, 0xc3,
0x9a, 0xec, 0x6b, 0xec, 0x3f, 0xfa, 0x3e, 0xd4, 0x8c, 0x31, 0xf5, 0x74, 0xc3, 0xba, 0x24, 0x01,
0xb5, 0x43, 0x22, 0x6d, 0xbf, 0xce, 0xb8, 0xad, 0x88, 0xd9, 0xf8, 0x1c, 0xd6, 0x92, 0x98, 0x6f,
0xcb, 0x15, 0x8a, 0xc9, 0x5c, 0xe1, 0x4f, 0x00, 0x26, 0xd7, 0x3a, 0xcc, 0x47, 0xc8, 0x95, 0xcd,
0x0e, 0xb7, 0xf2, 0x94, 0x57, 0xc4, 0x65, 0xc6, 0x68, 0xb3, 0xf3, 0x4c, 0xfa, 0xce, 0xb9, 0x18,
0xdd, 0x39, 0xb3, 0x55, 0xcb, 0x16, 0xda, 0x85, 0x3d, 0x1a, 0xc5, 0x57, 0x4d, 0x15, 0xcf, 0x73,
0x9e, 0x70, 0x86, 0xf6, 0x9b, 0x9c, 0xf0, 0x15, 0xf1, 0x7a, 0x90, 0xe9, 0x00, 0xf2, 0xae, 0x4c,
0xbd, 0x0b, 0x10, 0x52, 0x23, 0x60, 0x89, 0x8f, 0x11, 0x5d, 0x76, 0x35, 0x66, 0x2e, 0xad, 0xfb,
0x51, 0x11, 0x04, 0xae, 0xc8, 0xde, 0x2d, 0x8a, 0xbe, 0x80, 0x35, 0xd3, 0x73, 0xfc, 0x11, 0x91,
0x83, 0x8b, 0x6f, 0x1d, 0x5c, 0x8d, 0xfb, 0xb7, 0x68, 0xe2, 0x8a, 0xad, 0x74, 0xd3, 0x2b, 0xb6,
0x7f, 0x53, 0xc4, 0x23, 0x48, 0xf2, 0x0d, 0x06, 0x0d, 0xe6, 0x3c, 0xf4, 0xef, 0x2f, 0xf9, 0xa0,
0xf3, 0x5d, 0xaf, 0xfc, 0x8d, 0x2f, 0xb2, 0x3c, 0xab, 0xbf, 0x39, 0x15, 0xfd, 0xf7, 0x3c, 0x54,
0xe2, 0xf7, 0x8f, 0x19, 0xdb, 0x7f, 0x06, 0x95, 0xb8, 0x02, 0x45, 0x6e, 0x10, 0xdf, 0x69, 0x9e,
0xb8, 0x33, 0x7a, 0x01, 0xc8, 0x18, 0x0c, 0xe2, 0x14, 0x53, 0x1f, 0x87, 0xc6, 0x20, 0x7a, 0x7d,
0xfa, 0x6c, 0x01, 0x3d, 0x44, 0x71, 0xeb, 0x8c, 0x8d, 0xc7, 0xaa, 0x31, 0x18, 0xa4, 0x38, 0xe8,
0x4f, 0xe1, 0x76, 0x7a, 0x0e, 0xfd, 0xfc, 0x5a, 0xf7, 0x6d, 0x4b, 0x1e, 0x74, 0x0f, 0x16, 0x7d,
0x02, 0x6a, 0xa6, 0xe0, 0xbf, 0xba, 0x3e, 0xb5, 0x2d, 0xa1, 0x73, 0x14, 0xcc, 0x34, 0x34, 0xfe,
0x1c, 0xde, 0x7b, 0x43, 0xf7, 0x39, 0x36, 0xe8, 0xa6, 0x4b, 0x1b, 0x96, 0x57, 0x42, 0xc2, 0x7a,
0xbf, 0x56, 0xc4, 0x4b, 0x55, 0x5a, 0x27, 0xad, 0x64, 0x6e, 0x7c, 0x3f, 0xe3, 0x3c, 0xed, 0xd3,
0x33, 0x01, 0xcf, 0xd3, 0xe1, 0xaf, 0xa7, 0xd2, 0xe1, 0xac, 0x89, 0x92, 0xc8, 0x2a, 0x05, 0x90,
0x44, 0xd0, 0xfe, 0x25, 0x0f, 0xe5, 0x08, 0x9d, 0x1f, 0x53, 0xaf, 0x43, 0x4a, 0x1c, 0x3d, 0xbe,
0xa8, 0x52, 0x30, 0x08, 0x16, 0xbf, 0x94, 0x79, 0x1f, 0x2a, 0xec, 0x34, 0x2c, 0x9a, 0x73, 0xbc,
0xb9, 0xcc, 0x18, 0xbc, 0xf1, 0x03, 0xa8, 0x52, 0x8f, 0x1a, 0x23, 0x9d, 0xf2, 0x58, 0x9e, 0x17,
0xa3, 0x39, 0x8b, 0x47, 0x72, 0xf4, 0x43, 0xd8, 0xa4, 0xc3, 0xc0, 0xa3, 0x74, 0xc4, 0x72, 0x48,
0x9e, 0xd1, 0x88, 0x04, 0xa4, 0x80, 0xd5, 0xb8, 0x41, 0x64, 0x3a, 0x21, 0xdb, 0xbd, 0x27, 0x9d,
0x99, 0xeb, 0xf2, 0x4d, 0xa4, 0x80, 0xd7, 0x63, 0x2e, 0x73, 0x6d, 0x16, 0x3c, 0x7d, 0x91, 0x2d,
0xf0, 0xbd, 0x42, 0xc1, 0x11, 0x89, 0x74, 0xd8, 0x70, 0x88, 0x11, 0x8e, 0x03, 0x62, 0xe9, 0x2f,
0x6c, 0x32, 0xb2, 0xc4, 0xed, 0x42, 0x2d, 0x73, 0x8a, 0x1f, 0xa9, 0xa5, 0xf9, 0x98, 0x8f, 0xc6,
0xb5, 0x08, 0x4e, 0xd0, 0x2c, 0x73, 0x10, 0xff, 0xd0, 0x06, 0x54, 0x7b, 0xcf, 0x7a, 0xfd, 0xce,
0xb1, 0x7e, 0x7c, 0xb2, 0xd7, 0x91, 0xd5, 0x2b, 0xbd, 0x0e, 0x16, 0xa4, 0xc2, 0xda, 0xfb, 0x27,
0xfd, 0xd6, 0x91, 0xde, 0x3f, 0x6c, 0x3f, 0xe9, 0xa9, 0x39, 0x74, 0x1b, 0x36, 0xfb, 0x07, 0xf8,
0xa4, 0xdf, 0x3f, 0xea, 0xec, 0xe9, 0xa7, 0x1d, 0x7c, 0x78, 0xb2, 0xd7, 0x53, 0xf3, 0x08, 0x41,
0x6d, 0xc2, 0xee, 0x1f, 0x1e, 0x77, 0xd4, 0x02, 0xaa, 0xc2, 0xea, 0x69, 0x07, 0xb7, 0x3b, 0xdd,
0xbe, 0x5a, 0xd4, 0x7e, 0x95, 0x87, 0x6a, 0xc2, 0x8a, 0xcc, 0x91, 0x83, 0x50, 0x9c, 0x25, 0x0a,
0x98, 0xfd, 0xe5, 0xaf, 0x6d, 0x86, 0x39, 0x14, 0xd6, 0x29, 0x60, 0x41, 0xf0, 0xf3, 0x83, 0x71,
0x95, 0x58, 0xe7, 0x05, 0x5c, 0x76, 0x8c, 0x2b, 0x01, 0xf2, 0x3d, 0x58, 0xbb, 0x20, 0x81, 0x4b,
0x46, 0xb2, 0x5d, 0x58, 0xa4, 0x2a, 0x78, 0xa2, 0xcb, 0x36, 0xa8, 0xb2, 0xcb, 0x04, 0x46, 0x98,
0xa3, 0x26, 0xf8, 0xc7, 0x11, 0xd8, 0x16, 0x14, 0x45, 0xf3, 0xaa, 0x98, 0x9f, 0x13, 0x2c, 0x4c,
0x85, 0xaf, 0x0d, 0x9f, 0xe7, 0x77, 0x05, 0xcc, 0xff, 0xa3, 0xf3, 0x59, 0xfb, 0x94, 0xb8, 0x7d,
0x76, 0x17, 0x77, 0xe7, 0x37, 0x99, 0x68, 0x18, 0x9b, 0x68, 0x15, 0xf2, 0x38, 0x2a, 0xf9, 0x68,
0xb7, 0xda, 0x07, 0xcc, 0x2c, 0xeb, 0x50, 0x39, 0x6e, 0xfd, 0x54, 0x3f, 0xeb, 0xf1, 0xfb, 0x5f,
0xa4, 0xc2, 0xda, 0x93, 0x0e, 0xee, 0x76, 0x8e, 0x24, 0x27, 0x8f, 0xb6, 0x40, 0x95, 0x9c, 0x49,
0xbf, 0x02, 0x43, 0x10, 0x7f, 0x8b, 0xa8, 0x0c, 0x85, 0xde, 0xd3, 0xd6, 0xa9, 0x5a, 0xd2, 0xfe,
0x3b, 0x07, 0x1b, 0x22, 0x2c, 0xc4, 0x8f, 0xd3, 0x6f, 0x7e, 0x9c, 0x4b, 0x5e, 0xd5, 0xe4, 0xd2,
0x57, 0x35, 0x51, 0x12, 0xca, 0xa3, 0x7a, 0x7e, 0x92, 0x84, 0xf2, 0x2b, 0x9e, 0xd4, 0x8e, 0x5f,
0x58, 0x64, 0xc7, 0xaf, 0xc3, 0xaa, 0x43, 0xc2, 0xd8, 0x6e, 0x15, 0x1c, 0x91, 0xc8, 0x86, 0xaa,
0xe1, 0xba, 0x1e, 0x35, 0xc4, 0xfd, 0x67, 0x69, 0xa1, 0x60, 0x38, 0xf5, 0xc5, 0xcd, 0xd6, 0x04,
0x49, 0x6c, 0xcc, 0x49, 0xec, 0xc6, 0x4f, 0x40, 0x9d, 0xee, 0xb0, 0x48, 0x38, 0xfc, 0xc1, 0x27,
0x93, 0x68, 0x48, 0xd8, 0xba, 0x90, 0xb7, 0xf3, 0xea, 0x0a, 0x23, 0xf0, 0x59, 0xb7, 0x7b, 0xd8,
0xdd, 0x57, 0x15, 0x04, 0x50, 0xea, 0xfc, 0xf4, 0xb0, 0xdf, 0xd9, 0x53, 0x73, 0x3b, 0xbf, 0xde,
0x84, 0x92, 0x10, 0x12, 0x7d, 0x2b, 0x33, 0x81, 0x64, 0xe1, 0x23, 0xfa, 0xc9, 0xc2, 0x19, 0x75,
0xaa, 0x98, 0xb2, 0xf1, 0x68, 0xe9, 0xf1, 0xf2, 0x11, 0x6a, 0x05, 0xfd, 0xb5, 0x02, 0x6b, 0xa9,
0x07, 0xa8, 0xac, 0xf7, 0xbf, 0x73, 0xea, 0x2c, 0x1b, 0x3f, 0x5e, 0x6a, 0x6c, 0x2c, 0xcb, 0x2f,
0x15, 0xa8, 0x26, 0x2a, 0x0c, 0xd1, 0xee, 0x32, 0x55, 0x89, 0x42, 0x92, 0xcf, 0x97, 0x2f, 0x68,
0xd4, 0x56, 0x3e, 0x56, 0xd0, 0x5f, 0x29, 0x50, 0x4d, 0xd4, 0xda, 0x65, 0x16, 0x65, 0xb6, 0x32,
0x30, 0xb3, 0x28, 0xf3, 0x4a, 0xfb, 0x56, 0xd0, 0x5f, 0x28, 0x50, 0x89, 0xeb, 0xe6, 0xd0, 0x83,
0xc5, 0x2b, 0xed, 0x84, 0x10, 0x9f, 0x2d, 0x5b, 0xa2, 0xa7, 0xad, 0xa0, 0x3f, 0x83, 0x72, 0x54,
0x64, 0x86, 0xb2, 0x46, 0xaf, 0xa9, 0x0a, 0xb6, 0xc6, 0x83, 0x85, 0xc7, 0x25, 0xa7, 0x8f, 0x2a,
0xbf, 0x32, 0x4f, 0x3f, 0x55, 0xa3, 0xd6, 0x78, 0xb0, 0xf0, 0xb8, 0x78, 0x7a, 0xe6, 0x09, 0x89,
0x02, 0xb1, 0xcc, 0x9e, 0x30, 0x5b, 0x99, 0x96, 0xd9, 0x13, 0xe6, 0xd5, 0xa3, 0x09, 0x41, 0x12,
0x25, 0x66, 0x99, 0x05, 0x99, 0x2d, 0x63, 0xcb, 0x2c, 0xc8, 0x9c, 0x8a, 0x36, 0x6d, 0x05, 0xfd,
0x42, 0x49, 0x9e, 0x0b, 0x1e, 0x2c, 0x5c, 0x49, 0xb5, 0xa0, 0x4b, 0xce, 0xd4, 0x72, 0xf1, 0x05,
0xfa, 0x0b, 0x79, 0x8b, 0x21, 0x0a, 0xb1, 0xd0, 0x22, 0x60, 0xa9, 0xda, 0xad, 0xc6, 0xa7, 0xcb,
0x05, 0x1b, 0x2e, 0xc4, 0x5f, 0x2a, 0x00, 0x93, 0x92, 0xad, 0xcc, 0x42, 0xcc, 0xd4, 0x8a, 0x35,
0x76, 0x97, 0x18, 0x99, 0x5c, 0x20, 0x51, 0x49, 0x49, 0xe6, 0x05, 0x32, 0x55, 0x52, 0x96, 0x79,
0x81, 0x4c, 0x97, 0x83, 0x69, 0x2b, 0xe8, 0x1f, 0x15, 0xd8, 0x9c, 0x29, 0x69, 0x41, 0x8f, 0x6e,
0x58, 0xd5, 0xd4, 0xf8, 0x72, 0x79, 0x80, 0x48, 0xb4, 0x6d, 0xe5, 0x63, 0x05, 0xfd, 0x8d, 0x02,
0xeb, 0xe9, 0x32, 0x80, 0xcc, 0x51, 0x6a, 0x4e, 0x71, 0x4c, 0xe3, 0xe1, 0x72, 0x83, 0x63, 0x6d,
0xfd, 0x9d, 0x02, 0xb5, 0x74, 0x45, 0x08, 0x7a, 0xb8, 0xd8, 0xb6, 0x30, 0x25, 0xd0, 0x17, 0x4b,
0x8e, 0x8e, 0x24, 0xfa, 0x6a, 0xf5, 0x8f, 0x8a, 0x22, 0x7b, 0x2b, 0xf1, 0x9f, 0x1f, 0xfd, 0x36,
0x00, 0x00, 0xff, 0xff, 0x80, 0x65, 0x7d, 0xb1, 0xd5, 0x32, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

View File

@@ -467,6 +467,10 @@ message Resources {
// LinuxResources are the computed values to set for specific Linux features
LinuxResources linux_resources = 2;
// Ports are the allocated port mappings for the allocation.
// A task may use these to manually configure port mapping if shared network namespaces aren't being used.
repeated PortMapping ports = 3;
}
message AllocatedTaskResources {
@@ -497,6 +501,13 @@ message NetworkPort {
int32 value = 2;
}
message PortMapping {
string label = 1;
int32 value = 2;
int32 to = 3;
string host_ip = 4;
}
message LinuxResources {
// CPU CFS (Completely Fair Scheduler) period. Default: 0 (not specified)

View File

@@ -147,6 +147,19 @@ func ResourcesFromProto(pb *proto.Resources) *Resources {
}
}
if pb.Ports != nil {
ports := structs.AllocatedPorts(make([]structs.AllocatedPortMapping, len(pb.Ports)))
for i, port := range pb.Ports {
ports[i] = structs.AllocatedPortMapping{
Label: port.Label,
Value: int(port.Value),
To: int(port.To),
HostIP: port.HostIp,
}
}
r.Ports = &ports
}
return &r
}
@@ -203,6 +216,20 @@ func ResourcesToProto(r *Resources) *proto.Resources {
}
}
if r.Ports != nil {
ports := make([]*proto.PortMapping, len(*r.Ports))
for i, port := range *r.Ports {
ports[i] = &proto.PortMapping{
Label: port.Label,
Value: int32(port.Value),
To: int32(port.To),
HostIp: port.HostIP,
}
}
pb.Ports = ports
}
return &pb
}

View File

@@ -218,7 +218,9 @@ The `docker` driver supports the following configuration in the job spec. Only
to be configured to allow privileged containers.
See below for more details.
- `port_map` - (Optional) A key-value map of port labels (see below).
- `ports` - (Optional) A list of port labels to map into the container (see below).
- `port_map` - (Optional) *Deprecated* A key-value map of port labels (see below).
- `security_opt` - (Optional) A list of string flags to pass directly to
[`--security-opt`](https://docs.docker.com/engine/reference/run/#security-configuration).
@@ -536,13 +538,15 @@ You can allocate ports to your task using the port syntax described on the
[networking page](/docs/job-specification/network). Here is a recap:
```hcl
task "example" {
driver = "docker"
resources {
network {
port "http" {}
port "https" {}
group {
network {
port "http" {}
port "https {}
}
task "example" {
driver = "docker"
config {
ports = ["http", "https"]
}
}
}
@@ -554,16 +558,25 @@ A Docker container typically specifies which port a service will listen on by
specifying the `EXPOSE` directive in the `Dockerfile`.
Because dynamic ports will not match the ports exposed in your Dockerfile,
Nomad will automatically expose all of the ports it allocates to your
container.
Nomad will automatically expose any ports specified in the `ports` field.
These ports will be identified via environment variables. For example:
```hcl
port "http" {}
group {
network {
port "http" {}
}
task "api" {
driver = "docker"
config {
ports = ["http"]
}
}
}
```
If Nomad allocates port `23332` to your task for `http`, `23332` will be
If Nomad allocates port `23332` to your api task for `http`, `23332` will be
automatically exposed and forwarded to your container, and the driver will set
an environment variable `NOMAD_PORT_http` with the value `23332` that you can
read inside your container.
@@ -574,30 +587,25 @@ performance.
### Using the Port Map
If you prefer to use the traditional port-mapping method, you can specify the
`port_map` option in your job specification. It looks like this:
the `to` field in the port configuration. It looks like this:
```hcl
task "example" {
driver = "docker"
config {
image = "redis"
port_map {
redis = 6379
}
group "example" {
network {
port "redis" { to = 6379 }
}
task "example" {
driver = "docker"
resources {
network {
mbits = 20
port "redis" {}
config {
image = "redis"
ports = ["redis"]
}
}
}
```
If Nomad allocates port `23332` to your task, the Docker driver will
If Nomad allocates port `23332` to your allocation, the Docker driver will
automatically setup the port mapping from `23332` on the host to `6379` in your
container, so it will just work!
@@ -605,6 +613,16 @@ Note that by default this only works with `bridged` networking mode. It may
also work with custom networking plugins which implement the same API for
expose and port forwarding.
#### Deprecated `port_map` Syntax
Up until Nomad 0.12, ports could be specified in a task's resource stanza and set using the docker
`port_map` field. As more features have been added to the group network resource allocation, task based
network resources are deprecated. With it the `port_map` field is also deprecated and can only be used
with task network resources.
Users should migrate their jobs to define ports in the group network stanza and specified which ports
a task maps with the `ports` field.
### Advertising Container IPs
_New in Nomad 0.6._