text:
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: clients.proto

package proto

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	math "math"
	proto1 "www.velocidex.com/golang/velociraptor/actions/proto"
	_ "www.velocidex.com/golang/velociraptor/proto"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type ApiClient_IPAddressClass int32

const (
	ApiClient_UNKNOWN  ApiClient_IPAddressClass = 0
	ApiClient_INTERNAL ApiClient_IPAddressClass = 1
	ApiClient_EXTERNAL ApiClient_IPAddressClass = 2
	ApiClient_VPN      ApiClient_IPAddressClass = 3
)

var ApiClient_IPAddressClass_name = map[int32]string{
	0: "UNKNOWN",
	1: "INTERNAL",
	2: "EXTERNAL",
	3: "VPN",
}

var ApiClient_IPAddressClass_value = map[string]int32{
	"UNKNOWN":  0,
	"INTERNAL": 1,
	"EXTERNAL": 2,
	"VPN":      3,
}

func (x ApiClient_IPAddressClass) String() string {
	return proto.EnumName(ApiClient_IPAddressClass_name, int32(x))
}

func (ApiClient_IPAddressClass) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{1, 0}
}

type SearchClientsRequest_QueryType int32

const (
	SearchClientsRequest_VALUE SearchClientsRequest_QueryType = 0
	SearchClientsRequest_KEY   SearchClientsRequest_QueryType = 1
)

var SearchClientsRequest_QueryType_name = map[int32]string{
	0: "VALUE",
	1: "KEY",
}

var SearchClientsRequest_QueryType_value = map[string]int32{
	"VALUE": 0,
	"KEY":   1,
}

func (x SearchClientsRequest_QueryType) String() string {
	return proto.EnumName(SearchClientsRequest_QueryType_name, int32(x))
}

func (SearchClientsRequest_QueryType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{3, 0}
}

// GRR uses an int for client_version which is difficult to use
// semantic versioning. We use a string instead which represents the
// commit number.
type AgentInformation struct {
	Version              string   `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"`
	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	BuildTime            string   `protobuf:"bytes,3,opt,name=build_time,json=buildTime,proto3" json:"build_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AgentInformation) Reset()         { *m = AgentInformation{} }
func (m *AgentInformation) String() string { return proto.CompactTextString(m) }
func (*AgentInformation) ProtoMessage()    {}
func (*AgentInformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{0}
}

func (m *AgentInformation) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AgentInformation.Unmarshal(m, b)
}
func (m *AgentInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AgentInformation.Marshal(b, m, deterministic)
}
func (m *AgentInformation) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AgentInformation.Merge(m, src)
}
func (m *AgentInformation) XXX_Size() int {
	return xxx_messageInfo_AgentInformation.Size(m)
}
func (m *AgentInformation) XXX_DiscardUnknown() {
	xxx_messageInfo_AgentInformation.DiscardUnknown(m)
}

var xxx_messageInfo_AgentInformation proto.InternalMessageInfo

func (m *AgentInformation) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

func (m *AgentInformation) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *AgentInformation) GetBuildTime() string {
	if m != nil {
		return m.BuildTime
	}
	return ""
}

// Describe a client. We fill in some metadata about the client but
// this is by no means exhaustive.
type ApiClient struct {
	ClientId             string                   `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"`
	AgentInformation     *AgentInformation        `protobuf:"bytes,2,opt,name=agent_information,json=agentInformation,proto3" json:"agent_information,omitempty"`
	OsInfo               *proto1.Uname            `protobuf:"bytes,3,opt,name=os_info,json=osInfo,proto3" json:"os_info,omitempty"`
	FirstSeenAt          uint64                   `protobuf:"varint,6,opt,name=first_seen_at,json=firstSeenAt,proto3" json:"first_seen_at,omitempty"`
	LastSeenAt           uint64                   `protobuf:"varint,7,opt,name=last_seen_at,json=lastSeenAt,proto3" json:"last_seen_at,omitempty"`
	LastBootedAt         uint64                   `protobuf:"varint,8,opt,name=last_booted_at,json=lastBootedAt,proto3" json:"last_booted_at,omitempty"`
	LastClock            uint64                   `protobuf:"varint,9,opt,name=last_clock,json=lastClock,proto3" json:"last_clock,omitempty"`
	LastCrashAt          uint64                   `protobuf:"varint,10,opt,name=last_crash_at,json=lastCrashAt,proto3" json:"last_crash_at,omitempty"`
	LastIp               string                   `protobuf:"bytes,16,opt,name=last_ip,json=lastIp,proto3" json:"last_ip,omitempty"`
	LastIpClass          ApiClient_IPAddressClass `protobuf:"varint,17,opt,name=last_ip_class,json=lastIpClass,proto3,enum=proto.ApiClient_IPAddressClass" json:"last_ip_class,omitempty"`
	Users                []*proto1.User           `protobuf:"bytes,13,rep,name=users,proto3" json:"users,omitempty"`
	Interfaces           []*Interface             `protobuf:"bytes,14,rep,name=interfaces,proto3" json:"interfaces,omitempty"`
	Info                 []*proto1.VQLResponse    `protobuf:"bytes,15,rep,name=info,proto3" json:"info,omitempty"`
	Labels               []string                 `protobuf:"bytes,18,rep,name=labels,proto3" json:"labels,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *ApiClient) Reset()         { *m = ApiClient{} }
func (m *ApiClient) String() string { return proto.CompactTextString(m) }
func (*ApiClient) ProtoMessage()    {}
func (*ApiClient) Descriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{1}
}

func (m *ApiClient) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ApiClient.Unmarshal(m, b)
}
func (m *ApiClient) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ApiClient.Marshal(b, m, deterministic)
}
func (m *ApiClient) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ApiClient.Merge(m, src)
}
func (m *ApiClient) XXX_Size() int {
	return xxx_messageInfo_ApiClient.Size(m)
}
func (m *ApiClient) XXX_DiscardUnknown() {
	xxx_messageInfo_ApiClient.DiscardUnknown(m)
}

var xxx_messageInfo_ApiClient proto.InternalMessageInfo

func (m *ApiClient) GetClientId() string {
	if m != nil {
		return m.ClientId
	}
	return ""
}

func (m *ApiClient) GetAgentInformation() *AgentInformation {
	if m != nil {
		return m.AgentInformation
	}
	return nil
}

func (m *ApiClient) GetOsInfo() *proto1.Uname {
	if m != nil {
		return m.OsInfo
	}
	return nil
}

func (m *ApiClient) GetFirstSeenAt() uint64 {
	if m != nil {
		return m.FirstSeenAt
	}
	return 0
}

func (m *ApiClient) GetLastSeenAt() uint64 {
	if m != nil {
		return m.LastSeenAt
	}
	return 0
}

func (m *ApiClient) GetLastBootedAt() uint64 {
	if m != nil {
		return m.LastBootedAt
	}
	return 0
}

func (m *ApiClient) GetLastClock() uint64 {
	if m != nil {
		return m.LastClock
	}
	return 0
}

func (m *ApiClient) GetLastCrashAt() uint64 {
	if m != nil {
		return m.LastCrashAt
	}
	return 0
}

func (m *ApiClient) GetLastIp() string {
	if m != nil {
		return m.LastIp
	}
	return ""
}

func (m *ApiClient) GetLastIpClass() ApiClient_IPAddressClass {
	if m != nil {
		return m.LastIpClass
	}
	return ApiClient_UNKNOWN
}

func (m *ApiClient) GetUsers() []*proto1.User {
	if m != nil {
		return m.Users
	}
	return nil
}

func (m *ApiClient) GetInterfaces() []*Interface {
	if m != nil {
		return m.Interfaces
	}
	return nil
}

func (m *ApiClient) GetInfo() []*proto1.VQLResponse {
	if m != nil {
		return m.Info
	}
	return nil
}

func (m *ApiClient) GetLabels() []string {
	if m != nil {
		return m.Labels
	}
	return nil
}

type Interface struct {
	MacAddress           string   `protobuf:"bytes,1,opt,name=mac_address,json=macAddress,proto3" json:"mac_address,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Interface) Reset()         { *m = Interface{} }
func (m *Interface) String() string { return proto.CompactTextString(m) }
func (*Interface) ProtoMessage()    {}
func (*Interface) Descriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{2}
}

func (m *Interface) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Interface.Unmarshal(m, b)
}
func (m *Interface) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Interface.Marshal(b, m, deterministic)
}
func (m *Interface) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Interface.Merge(m, src)
}
func (m *Interface) XXX_Size() int {
	return xxx_messageInfo_Interface.Size(m)
}
func (m *Interface) XXX_DiscardUnknown() {
	xxx_messageInfo_Interface.DiscardUnknown(m)
}

var xxx_messageInfo_Interface proto.InternalMessageInfo

func (m *Interface) GetMacAddress() string {
	if m != nil {
		return m.MacAddress
	}
	return ""
}

type SearchClientsRequest struct {
	Offset               uint64                         `protobuf:"varint,1,opt,name=offset,proto3" json:"offset,omitempty"`
	Limit                uint64                         `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"`
	Query                string                         `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"`
	NameOnly             bool                           `protobuf:"varint,4,opt,name=name_only,json=nameOnly,proto3" json:"name_only,omitempty"`
	Type                 SearchClientsRequest_QueryType `protobuf:"varint,5,opt,name=type,proto3,enum=proto.SearchClientsRequest_QueryType" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

func (m *SearchClientsRequest) Reset()         { *m = SearchClientsRequest{} }
func (m *SearchClientsRequest) String() string { return proto.CompactTextString(m) }
func (*SearchClientsRequest) ProtoMessage()    {}
func (*SearchClientsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{3}
}

func (m *SearchClientsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SearchClientsRequest.Unmarshal(m, b)
}
func (m *SearchClientsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SearchClientsRequest.Marshal(b, m, deterministic)
}
func (m *SearchClientsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SearchClientsRequest.Merge(m, src)
}
func (m *SearchClientsRequest) XXX_Size() int {
	return xxx_messageInfo_SearchClientsRequest.Size(m)
}
func (m *SearchClientsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_SearchClientsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_SearchClientsRequest proto.InternalMessageInfo

func (m *SearchClientsRequest) GetOffset() uint64 {
	if m != nil {
		return m.Offset
	}
	return 0
}

func (m *SearchClientsRequest) GetLimit() uint64 {
	if m != nil {
		return m.Limit
	}
	return 0
}

func (m *SearchClientsRequest) GetQuery() string {
	if m != nil {
		return m.Query
	}
	return ""
}

func (m *SearchClientsRequest) GetNameOnly() bool {
	if m != nil {
		return m.NameOnly
	}
	return false
}

func (m *SearchClientsRequest) GetType() SearchClientsRequest_QueryType {
	if m != nil {
		return m.Type
	}
	return SearchClientsRequest_VALUE
}

type SearchClientsResponse struct {
	Items                []*ApiClient `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
	Names                []string     `protobuf:"bytes,2,rep,name=names,proto3" json:"names,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *SearchClientsResponse) Reset()         { *m = SearchClientsResponse{} }
func (m *SearchClientsResponse) String() string { return proto.CompactTextString(m) }
func (*SearchClientsResponse) ProtoMessage()    {}
func (*SearchClientsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{4}
}

func (m *SearchClientsResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SearchClientsResponse.Unmarshal(m, b)
}
func (m *SearchClientsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SearchClientsResponse.Marshal(b, m, deterministic)
}
func (m *SearchClientsResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SearchClientsResponse.Merge(m, src)
}
func (m *SearchClientsResponse) XXX_Size() int {
	return xxx_messageInfo_SearchClientsResponse.Size(m)
}
func (m *SearchClientsResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_SearchClientsResponse.DiscardUnknown(m)
}

var xxx_messageInfo_SearchClientsResponse proto.InternalMessageInfo

func (m *SearchClientsResponse) GetItems() []*ApiClient {
	if m != nil {
		return m.Items
	}
	return nil
}

func (m *SearchClientsResponse) GetNames() []string {
	if m != nil {
		return m.Names
	}
	return nil
}

type GetClientRequest struct {
	ClientId             string   `protobuf:"bytes,1,opt,name=client_id,json=clientId,proto3" json:"client_id,omitempty"`
	Lightweight          bool     `protobuf:"varint,2,opt,name=lightweight,proto3" json:"lightweight,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetClientRequest) Reset()         { *m = GetClientRequest{} }
func (m *GetClientRequest) String() string { return proto.CompactTextString(m) }
func (*GetClientRequest) ProtoMessage()    {}
func (*GetClientRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{5}
}

func (m *GetClientRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetClientRequest.Unmarshal(m, b)
}
func (m *GetClientRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetClientRequest.Marshal(b, m, deterministic)
}
func (m *GetClientRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetClientRequest.Merge(m, src)
}
func (m *GetClientRequest) XXX_Size() int {
	return xxx_messageInfo_GetClientRequest.Size(m)
}
func (m *GetClientRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetClientRequest.DiscardUnknown(m)
}

var xxx_messageInfo_GetClientRequest proto.InternalMessageInfo

func (m *GetClientRequest) GetClientId() string {
	if m != nil {
		return m.ClientId
	}
	return ""
}

func (m *GetClientRequest) GetLightweight() bool {
	if m != nil {
		return m.Lightweight
	}
	return false
}

type LabelClientsRequest struct {
	ClientIds            []string `protobuf:"bytes,1,rep,name=client_ids,json=clientIds,proto3" json:"client_ids,omitempty"`
	Labels               []string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"`
	Operation            string   `protobuf:"bytes,3,opt,name=operation,proto3" json:"operation,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LabelClientsRequest) Reset()         { *m = LabelClientsRequest{} }
func (m *LabelClientsRequest) String() string { return proto.CompactTextString(m) }
func (*LabelClientsRequest) ProtoMessage()    {}
func (*LabelClientsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6c7b36ecb5ad4a28, []int{6}
}

func (m *LabelClientsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LabelClientsRequest.Unmarshal(m, b)
}
func (m *LabelClientsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LabelClientsRequest.Marshal(b, m, deterministic)
}
func (m *LabelClientsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LabelClientsRequest.Merge(m, src)
}
func (m *LabelClientsRequest) XXX_Size() int {
	return xxx_messageInfo_LabelClientsRequest.Size(m)
}
func (m *LabelClientsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_LabelClientsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_LabelClientsRequest proto.InternalMessageInfo

func (m *LabelClientsRequest) GetClientIds() []string {
	if m != nil {
		return m.ClientIds
	}
	return nil
}

func (m *LabelClientsRequest) GetLabels() []string {
	if m != nil {
		return m.Labels
	}
	return nil
}

func (m *LabelClientsRequest) GetOperation() string {
	if m != nil {
		return m.Operation
	}
	return ""
}

func init() {
	proto.RegisterEnum("proto.ApiClient_IPAddressClass", ApiClient_IPAddressClass_name, ApiClient_IPAddressClass_value)
	proto.RegisterEnum("proto.SearchClientsRequest_QueryType", SearchClientsRequest_QueryType_name, SearchClientsRequest_QueryType_value)
	proto.RegisterType((*AgentInformation)(nil), "proto.AgentInformation")
	proto.RegisterType((*ApiClient)(nil), "proto.ApiClient")
	proto.RegisterType((*Interface)(nil), "proto.Interface")
	proto.RegisterType((*SearchClientsRequest)(nil), "proto.SearchClientsRequest")
	proto.RegisterType((*SearchClientsResponse)(nil), "proto.SearchClientsResponse")
	proto.RegisterType((*GetClientRequest)(nil), "proto.GetClientRequest")
	proto.RegisterType((*LabelClientsRequest)(nil), "proto.LabelClientsRequest")
}

func init() { proto.RegisterFile("clients.proto", fileDescriptor_6c7b36ecb5ad4a28) }

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

repository: jpalanco/edr

repo_name: jpalanco/edr

extension: go


text:
# Define installation prefix
set(PREFIX "${CMAKE_INSTALL_PREFIX}")

# Define configuration dir
if (NOT DEFINED SYSCONFDIR)
  set(SYSCONFDIR "${PREFIX}/etc/adtnPlus" CACHE PATH "System configuration files path" FORCE)
endif()

#Define data dir
if (NOT DEFINED DATADIR)
  set(DATADIR "/var/lib/adtnPlus" CACHE PATH "Data files path" FORCE)
endif()

option(TOOLS "Build the given tools." ON)
option(TESTS "Build test program." OFF)
option(PYTHON "Build the python library." ON)
option(LEPTON "Build for lepton use." OFF)

repository: SeNDA-UAB/aDTNPlus

license_type: permissive

repo_name: SeNDA-UAB/aDTNPlus

branch_name: refs/heads/master

extension: in


text:
package main

import (
	"github.com/jacereda/webm"
	"github.com/jacereda/glcv-go/canvas"
	"github.com/jacereda/glcv-go/key"
	"github.com/gordonklaus/portaudio"
	"flag"
	gl "github.com/chsc/gogl/gl21"
	"log"
	"math"
	"os"
	"runtime"
	"time"
)

var (
	in         = flag.String("i", "", "Input file (required)")
	unsync     = flag.Bool("u", false, "Unsynchronized display")
	notc       = flag.Bool("t", false, "Ignore timecodes")
	blend      = flag.Bool("b", false, "Blend between images")
	fullscreen = flag.Bool("f", false, "Fullscreen mode")
	justaudio  = flag.Bool("a", false, "Just audio")
	justvideo  = flag.Bool("v", false, "Just video")
	loops      = flag.Int("l", 0, "Loops")
)

const (
	vss = `
void main() {
  gl_TexCoord[0] = gl_MultiTexCoord0;
  gl_Position = ftransform();
}
`

	ycbcr2rgb = `
const mat3 ycbcr2rgb = mat3(
                          1.164, 0, 1.596,
                          1.164, -0.392, -0.813,
                          1.164, 2.017, 0.0
                          );
const float ysub = 0.0625;
vec3 ycbcr2rgb(vec3 c) {
   vec3 ycbcr = vec3(c.x - ysub, c.y - 0.5, c.z - 0.5);
   return ycbcr * ycbcr2rgb;
}
`

	fss = ycbcr2rgb + `
uniform sampler2D yt1;
uniform sampler2D cbt1;
uniform sampler2D crt1;

void main() {
   vec3 c = vec3(texture2D(yt1, gl_TexCoord[0].st).r,
                 texture2D(cbt1, gl_TexCoord[0].st).r,
                 texture2D(crt1, gl_TexCoord[0].st).r);
   gl_FragColor = vec4(ycbcr2rgb(c), 1.0);
}
`
	bfss = ycbcr2rgb + `
uniform sampler2D yt1;
uniform sampler2D cbt1;
uniform sampler2D crt1;
uniform sampler2D yt0;
uniform sampler2D cbt0;
uniform sampler2D crt0;
uniform float factor;

void main() {
   vec3 c0 = vec3(texture2D(yt0, gl_TexCoord[0].st).r,
                  texture2D(cbt0, gl_TexCoord[0].st).r,
                  texture2D(crt0, gl_TexCoord[0].st).r);
   vec3 c1 = vec3(texture2D(yt1, gl_TexCoord[0].st).r,
                  texture2D(cbt1, gl_TexCoord[0].st).r,
                  texture2D(crt1, gl_TexCoord[0].st).r);
   gl_FragColor = vec4(ycbcr2rgb(mix(c0, c1, factor)), 1);
}
`
)

func texinit(id int) {
	gl.BindTexture(gl.TEXTURE_2D, gl.Uint(id))
	gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
	gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
	gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
	gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
}

func shinit() gl.Int {
	vs := loadShader(gl.VERTEX_SHADER, vss)
	var sfs string
	if *blend {
		sfs = bfss
	} else {
		sfs = fss
	}
	fs := loadShader(gl.FRAGMENT_SHADER, sfs)
	prg := gl.CreateProgram()
	gl.AttachShader(prg, vs)
	gl.AttachShader(prg, fs)
	gl.LinkProgram(prg)
	var l int
	if *blend {
		l = 6
	} else {
		l = 3
	}
	gl.UseProgram(prg)
	names := []string{"yt1", "cbt1", "crt1", "yt0", "cbt0", "crt0"}
	for i := 0; i < l; i++ {
		loc := gl.GetUniformLocation(prg, gl.GLString(names[i]))
		gl.Uniform1i(loc, gl.Int(i))
	}
	return gl.GetUniformLocation(prg, gl.GLString("factor"))
}

func upload(id gl.Uint, data []byte, stride int, w int, h int) {
	gl.BindTexture(gl.TEXTURE_2D, id)
	gl.PixelStorei(gl.UNPACK_ROW_LENGTH, gl.Int(stride))
	gl.PixelStorei(gl.UNPACK_ALIGNMENT, 1)
	gl.TexImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE,
		gl.Sizei(w), gl.Sizei(h), 0,
		gl.LUMINANCE, gl.UNSIGNED_BYTE, gl.Pointer(&data[0]))
}

func initquad() {
	ver := []gl.Float{-1, 1, 1, 1, -1, -1, 1, -1}
	gl.BindBuffer(gl.ARRAY_BUFFER, 1)
	gl.BufferData(gl.ARRAY_BUFFER, gl.Sizeiptr(4*len(ver)),
		gl.Pointer(&ver[0]), gl.STATIC_DRAW)
	gl.VertexPointer(2, gl.FLOAT, 0, nil)
	tex := []gl.Float{0, 0, 1, 0, 0, 1, 1, 1}
	gl.BindBuffer(gl.ARRAY_BUFFER, 2)
	gl.BufferData(gl.ARRAY_BUFFER, gl.Sizeiptr(4*len(tex)),
		gl.Pointer(&tex[0]), gl.STATIC_DRAW)
	gl.TexCoordPointer(2, gl.FLOAT, 0, nil)
	gl.EnableClientState(gl.VERTEX_ARRAY)
	gl.EnableClientState(gl.TEXTURE_COORD_ARRAY)
}

func loadShader(shtype gl.Enum, src string) gl.Uint {
	sh := gl.CreateShader(shtype)
	gsrc := gl.GLString(src)
	gl.ShaderSource(sh, 1, &gsrc, nil)
	gl.CompileShader(sh)
	return sh
}

func factor(t time.Time, tc0 time.Time, tc1 time.Time) gl.Float {
	num := t.Sub(tc0)
	den := tc1.Sub(tc0)
	res := num.Seconds() / den.Seconds()
	res = math.Max(res, 0)
	res = math.Min(res, 1)
	return gl.Float(res)
}

func chk(err error) {
	if err != nil {
		log.Println(err)
		panic(err)
	}
}

type app struct {
	canvas.Canvas
	r         *os.File
	reader    *webm.Reader
	vchan     <-chan webm.Frame
	img       webm.Frame
	pimg      webm.Frame
	tbase     time.Time
	flushing  bool
	shutdown  bool
	seek      time.Duration
	duration  time.Duration
	fduration time.Duration
	steps     uint
	quiet     uint
	factorloc gl.Int
	pastream  *portaudio.Stream
	aw        *AudioWriter
}

func (a *app) tseek(t time.Duration) {
	a.seek = t
	if a.seek < 0 {
		a.seek = 0
	}
}

func (a *app) xseek(x int) {
	factor := float64(x) / float64(a.Width())
	a.tseek(time.Duration(float64(a.duration) * factor))
}

func (a *app) OnMotion(x, y int) {
	if a.Pressed(key.MOUSELEFT) {
		a.xseek(x)
	}
	a.quiet = 0
}

func (a *app) enterFullscreen() {
	a.Fullscreen()
	*fullscreen = true
}

func (a *app) leaveFullscreen() {
	a.Windowed()
	*fullscreen = false
}

func (a *app) toggleFullscreen() {
	if *fullscreen {
		a.leaveFullscreen()
	} else {
		a.enterFullscreen()
	}
}

func (a *app) OnPress(k key.Id) {
	switch k {
	case key.MOUSELEFT:
		x, _ := a.Mouse()
		a.xseek(x)
	case key.P:
		a.steps = 0
	case key.R:
		a.steps = 0xffffffff
		a.tseek(a.img.Timecode)
	case key.F:
		a.steps = 1
		a.tseek(a.img.Timecode + a.fduration)
	case key.B:
		a.steps = 1
		a.tseek(a.img.Timecode - a.fduration)
	case key.S:
		a.steps = 1
	case key.ESCAPE:
		a.Quit()
	case key.RETURN:
		a.toggleFullscreen()
	}
}

func (a *app) Name() string {
	return *in
}

func (a *app) imgW() int {
	if a.vchan == nil {
		return 256
	}
	return a.img.Rect.Dx()
}

func (a *app) imgH() int {
	if a.vchan == nil {
		return 256;
	}
	return a.img.Rect.Dy()
}

func (a *app) Geometry() (x, y, w, h int) {
	return 20, 20, a.imgW(), a.imgH()
}

func (a *app) OnInit() {
	var err error
	a.r, err = os.Open(*in)
	if err != nil {
		log.Fatalf("Unable to open file '%s': %s", *in, err)
	}
	var wm webm.WebM
	a.reader, err = webm.Parse(a.r, &wm)
	if err != nil {
		log.Fatal("Unable to parse file: ", err)
	}
	a.duration = wm.GetDuration()
	var vtrack *webm.TrackEntry
	if !*justaudio {
		vtrack = wm.FindFirstVideoTrack()
	}
	var vstream *webm.Stream
	if vtrack != nil {
		vstream = webm.NewStream(vtrack)
		a.fduration = vtrack.GetDefaultDuration()
		a.vchan = vstream.VideoChannel()
	}
	var atrack *webm.TrackEntry
	if !*justvideo {
		atrack = wm.FindFirstAudioTrack()
	}
	var astream *webm.Stream
	if atrack != nil {
		astream = webm.NewStream(atrack)
	}
	splitter := webm.NewSplitter(a.reader.Chan)
	splitter.Split(astream, vstream)

	a.steps = uint(0xffffffff)
	if a.vchan != nil {
		a.img = <-a.vchan
		a.pimg = a.img
	}

	if atrack != nil {
		channels := int(atrack.Audio.Channels)
		a.aw = &AudioWriter{ch: astream.AudioChannel(),
			channels: channels, active: true}
		chk(portaudio.Initialize())
		a.pastream, err = portaudio.OpenDefaultStream(0, channels,
			atrack.Audio.SamplingFrequency, 0, a.aw.processAudio)
		chk(err)
		chk(a.pastream.Start())
	}
}

func (a *app) OnTerm() {
	if a.pastream != nil {
		a.pastream.Stop()
		a.pastream.Close()
		chk(portaudio.Terminate())
	}
	a.r.Close()
}

func (a *app) OnGLInit() {
	gl.Init()
	var ntex int
	if *blend {
		ntex = 6
	} else {
		ntex = 3
	}
	for i := 0; i < ntex; i++ {
		texinit(i + 1)
	}
	a.factorloc = shinit()
	initquad()
	gl.Enable(gl.TEXTURE_2D)
	gl.Disable(gl.DEPTH_TEST)
	a.tbase = time.Now()
	if *fullscreen {
		a.enterFullscreen()
	}
}

func (a *app) OnResize(w, h int) {
	oaspect := float64(a.imgW()) / float64(a.imgH())
	haspect := float64(w) / float64(h)
	vaspect := float64(h) / float64(w)
	var scx, scy float64
	if oaspect > haspect {
		scx = 1
		scy = haspect / oaspect
	} else {
		scx = vaspect * oaspect
		scy = 1
	}
	gl.Viewport(0, 0, gl.Sizei(w), gl.Sizei(h))
	gl.LoadIdentity()
	gl.Scaled(gl.Double(scx), gl.Double(scy), 1)
}

func (a *app) OnClose() {
	if !a.shutdown {
		a.reader.Shutdown()
		a.shutdown = true
	}
}

func (a *app) OnUpdate() {
	switch a.quiet {
	case 0:
		a.DefaultCursor()
	case 60:
		a.HideCursor()
	}
	a.quiet++
	if a.seek != webm.BadTC {
		a.flushing = true
		if a.aw != nil {
			a.aw.flushing = true
		}
		a.reader.Seek(a.seek)
		a.seek = webm.BadTC
	}
	t := time.Now()
	if a.flushing || a.shutdown ||
		(a.steps > 0 && (*notc || t.After(a.tbase.Add(a.img.Timecode)))) {
		a.pimg = a.img
		nimg, ok := <-a.vchan
		if !ok {
			a.Quit()
			return
		}
		if nimg.EOS {
			if *loops != 0 {
				*loops--
				a.tseek(0) //reader.Seek(0)
			} else if !a.shutdown {
				a.reader.Shutdown()
				a.shutdown = true
			}
		}

		if false && nimg.Timecode == a.pimg.Timecode {
			log.Println("same timecode", a.img.Timecode)
		}
		if nimg.Rebase {
			a.tbase = time.Now().Add(-nimg.Timecode)
			a.flushing = false
		}
		if !a.flushing && !nimg.EOS {
			if a.steps > 0 {
				a.steps--
			}
			a.img = nimg
		}
	}
	if a.vchan != nil {
		a.draw(t)
	}
	runtime.GC()
}

func (a *app) draw(t time.Time) {
	gl.Clear(gl.COLOR_BUFFER_BIT)
	img := a.img
	w := img.Rect.Dx()
	h := img.Rect.Dy()
	gl.ActiveTexture(gl.TEXTURE0)
	upload(1, img.Y, img.YStride, w, h)
	gl.ActiveTexture(gl.TEXTURE1)
	upload(2, img.Cb, img.CStride, w/2, h/2)
	gl.ActiveTexture(gl.TEXTURE2)
	upload(3, img.Cr, img.CStride, w/2, h/2)
	if *blend {
		pimg := a.pimg
		gl.Uniform1f(a.factorloc, factor(t,
			a.tbase.Add(pimg.Timecode),
			a.tbase.Add(img.Timecode)))
		gl.ActiveTexture(gl.TEXTURE3)
		upload(4, pimg.Y, pimg.YStride, w, h)
		gl.ActiveTexture(gl.TEXTURE4)
		upload(5, pimg.Cb, pimg.CStride, w/2, h/2)
		gl.ActiveTexture(gl.TEXTURE5)
		upload(6, pimg.Cr, pimg.CStride, w/2, h/2)
	}
	gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 4)
}

type AudioWriter struct {
	ch       <-chan webm.Samples
	channels int
	active   bool
	sofar    int
	curr     webm.Samples
	flushing bool
}

func (aw *AudioWriter) processAudio(out []float32) {
	for sent, lo := 0, len(out); sent < lo; {
		if aw.sofar == len(aw.curr.Data) {
			var pkt webm.Samples
			pkt, aw.active = <-aw.ch
			if !aw.active {
				return
			}
			if pkt.Rebase {
				aw.flushing = false
			} else if pkt.EOS || aw.flushing {
				continue
			}
			aw.curr = pkt
			aw.sofar = 0
			//log.Println("timecode", aw.curr.Timecode)
		}
		s := copy(out[sent:], aw.curr.Data[aw.sofar:])
		sent += s
		aw.sofar += s
	}
}

func main() {
	flag.Parse()
	if *in == "" {
		flag.Usage()
		return
	}
	var a app
	a.InitCanvas(&a)
	a.Go()
}

repository: jacereda/webmplay

repo_name: jacereda/webmplay


text:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE eagle SYSTEM "eagle.dtd">
<eagle version="7.2.0">
<drawing>
<settings>
<setting alwaysvectorfont="yes"/>
<setting verticaltext="up"/>
</settings>
<grid distance="5" unitdist="mil" unit="mm" style="lines" multiple="1" display="no" altdistance="0.025" altunitdist="inch" altunit="inch"/>
<layers>
<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="2" name="Route2" color="1" fill="3" visible="no" active="no"/>
<layer number="3" name="Route3" color="4" fill="3" visible="no" active="no"/>
<layer number="4" name="Route4" color="1" fill="4" visible="no" active="no"/>
<layer number="5" name="Route5" color="4" fill="4" visible="no" active="no"/>
<layer number="6" name="Route6" color="1" fill="8" visible="no" active="no"/>
<layer number="7" name="Route7" color="4" fill="8" visible="no" active="no"/>
<layer number="8" name="Route8" color="1" fill="2" visible="no" active="no"/>
<layer number="9" name="Route9" color="4" fill="2" visible="no" active="no"/>
<layer number="10" name="Route10" color="1" fill="7" visible="no" active="no"/>
<layer number="11" name="Route11" color="4" fill="7" visible="no" active="no"/>
<layer number="12" name="Route12" color="1" fill="5" visible="no" active="no"/>
<layer number="13" name="Route13" color="4" fill="5" visible="no" active="no"/>
<layer number="14" name="Route14" color="1" fill="6" visible="no" active="no"/>
<layer number="15" name="Route15" color="4" fill="6" visible="no" active="no"/>
<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>
<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>
<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>
<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>
<layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes"/>
<layer number="21" name="tPlace" color="14" fill="1" visible="yes" active="yes"/>
<layer number="22" name="bPlace" color="5" fill="1" visible="yes" active="yes"/>
<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>
<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="29" name="tStop" color="7" fill="3" visible="yes" active="yes"/>
<layer number="30" name="bStop" color="7" fill="6" visible="yes" active="yes"/>
<layer number="31" name="tCream" color="7" fill="4" visible="yes" active="yes"/>
<layer number="32" name="bCream" color="7" fill="5" visible="yes" active="yes"/>
<layer number="33" name="tFinish" color="6" fill="3" visible="yes" active="yes"/>
<layer number="34" name="bFinish" color="6" fill="6" visible="yes" active="yes"/>
<layer number="35" name="tGlue" color="7" fill="4" visible="yes" active="yes"/>
<layer number="36" name="bGlue" color="7" fill="5" visible="yes" active="yes"/>
<layer number="37" name="tTest" color="7" fill="1" visible="yes" active="yes"/>
<layer number="38" name="bTest" color="7" fill="1" visible="yes" active="yes"/>
<layer number="39" name="tKeepout" color="4" fill="11" visible="yes" active="yes"/>
<layer number="40" name="bKeepout" color="1" fill="11" visible="yes" active="yes"/>
<layer number="41" name="tRestrict" color="4" fill="10" visible="yes" active="yes"/>
<layer number="42" name="bRestrict" color="1" fill="10" visible="yes" active="yes"/>
<layer number="43" name="vRestrict" color="2" fill="10" visible="yes" active="yes"/>
<layer number="44" name="Drills" color="7" fill="1" visible="yes" active="yes"/>
<layer number="45" name="Holes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="46" name="Milling" color="3" fill="1" visible="yes" active="yes"/>
<layer number="47" name="Measures" color="7" fill="1" visible="yes" active="yes"/>
<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>
<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>
<layer number="50" name="dxf" color="7" fill="1" visible="yes" active="yes"/>
<layer number="51" name="tDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="52" name="bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="53" name="tGND_GNDA" color="7" fill="9" visible="no" active="no"/>
<layer number="54" name="bGND_GNDA" color="1" fill="9" visible="no" active="no"/>
<layer number="56" name="wert" color="7" fill="1" visible="yes" active="yes"/>
<layer number="57" name="tCAD" color="7" fill="1" visible="yes" active="yes"/>
<layer number="90" name="Modules" color="5" fill="1" visible="no" active="no"/>
<layer number="91" name="Nets" color="2" fill="1" visible="no" active="no"/>
<layer number="92" name="Busses" color="1" fill="1" visible="no" active="no"/>
<layer number="93" name="Pins" color="2" fill="1" visible="no" active="no"/>
<layer number="94" name="Symbols" color="4" fill="1" visible="no" active="no"/>
<layer number="95" name="Names" color="7" fill="1" visible="no" active="no"/>
<layer number="96" name="Values" color="7" fill="1" visible="no" active="no"/>
<layer number="97" name="Info" color="7" fill="1" visible="no" active="no"/>
<layer number="98" name="Guide" color="6" fill="1" visible="no" active="no"/>
<layer number="99" name="SpiceOrder" color="7" fill="1" visible="no" active="no"/>
<layer number="100" name="Muster" color="7" fill="1" visible="no" active="no"/>
<layer number="101" name="Patch_Top" color="12" fill="4" visible="yes" active="yes"/>
<layer number="102" name="Vscore" color="7" fill="1" visible="yes" active="yes"/>
<layer number="103" name="fp3" color="7" fill="1" visible="yes" active="yes"/>
<layer number="104" name="Name" color="7" fill="1" visible="yes" active="yes"/>
<layer number="105" name="Beschreib" color="9" fill="1" visible="yes" active="yes"/>
<layer number="106" name="BGA-Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="107" name="BD-Top" color="5" fill="1" visible="yes" active="yes"/>
<layer number="108" name="fp8" color="7" fill="1" visible="yes" active="yes"/>
<layer number="109" name="fp9" color="7" fill="1" visible="yes" active="yes"/>
<layer number="110" name="fp0" color="7" fill="1" visible="yes" active="yes"/>
<layer number="111" name="LPC17xx" color="7" fill="1" visible="yes" active="yes"/>
<layer number="112" name="tSilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="113" name="IDFDebug" color="7" fill="1" visible="yes" active="yes"/>
<layer number="116" name="Patch_BOT" color="9" fill="4" visible="yes" active="yes"/>
<layer number="118" name="Rect_Pads" color="7" fill="1" visible="yes" active="yes"/>
<layer number="120" name="Descript" color="7" fill="1" visible="yes" active="yes"/>
<layer number="121" name="_tsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="122" name="_bsilk" color="7" fill="1" visible="yes" active="yes"/>
<layer number="123" name="tTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="124" name="bTestmark" color="7" fill="1" visible="yes" active="yes"/>
<layer number="125" name="_tNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="126" name="_bNames" color="7" fill="1" visible="yes" active="yes"/>
<layer number="127" name="_tValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="128" name="_bValues" color="7" fill="1" visible="yes" active="yes"/>
<layer number="131" name="tAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="132" name="bAdjust" color="7" fill="1" visible="yes" active="yes"/>
<layer number="144" name="Drill_legend" color="7" fill="1" visible="yes" active="yes"/>
<layer number="150" name="Notes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="151" name="HeatSink" color="7" fill="1" visible="yes" active="yes"/>
<layer number="152" name="_bDocu" color="7" fill="1" visible="yes" active="yes"/>
<layer number="153" name="FabDoc1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="154" name="FabDoc2" color="7" fill="1" visible="yes" active="yes"/>
<layer number="155" name="FabDoc3" color="7" fill="1" visible="yes" active="yes"/>
<layer number="199" name="Contour" color="7" fill="1" visible="yes" active="yes"/>
<layer number="200" name="200bmp" color="1" fill="10" visible="yes" active="yes"/>
<layer number="201" name="201bmp" color="2" fill="1" visible="no" active="no"/>
<layer number="202" name="202bmp" color="3" fill="1" visible="no" active="no"/>
<layer number="203" name="203bmp" color="4" fill="10" visible="yes" active="yes"/>
<layer number="204" name="204bmp" color="5" fill="10" visible="yes" active="yes"/>
<layer number="205" name="205bmp" color="6" fill="10" visible="yes" active="yes"/>
<layer number="206" name="206bmp" color="7" fill="10" visible="yes" active="yes"/>
<layer number="207" name="207bmp" color="8" fill="10" visible="yes" active="yes"/>
<layer number="208" name="208bmp" color="9" fill="10" visible="yes" active="yes"/>
<layer number="209" name="209bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="210" name="210bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="211" name="211bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="212" name="212bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="213" name="213bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="214" name="214bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="215" name="215bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="216" name="216bmp" color="7" fill="1" visible="yes" active="yes"/>
<layer number="217" name="217bmp" color="18" fill="1" visible="no" active="no"/>
<layer number="218" name="218bmp" color="19" fill="1" visible="no" active="no"/>
<layer number="219" name="219bmp" color="20" fill="1" visible="no" active="no"/>
<layer number="220" name="220bmp" color="21" fill="1" visible="no" active="no"/>
<layer number="221" name="221bmp" color="22" fill="1" visible="no" active="no"/>
<layer number="222" name="222bmp" color="23" fill="1" visible="no" active="no"/>
<layer number="223" name="223bmp" color="24" fill="1" visible="no" active="no"/>
<layer number="224" name="224bmp" color="25" fill="1" visible="no" active="no"/>
<layer number="231" name="Eagle3D_PG1" color="7" fill="1" visible="yes" active="yes"/>
<layer number="232" name="Eagle3D_PG2" color="7" fill="1" visible="yes" active="yes"/>
<layer number="233" name="Eagle3D_PG3" color="7" fill="1" visible="yes" active="yes"/>
<layer number="247" name="wrappinf" color="7" fill="1" visible="yes" active="yes"/>
<layer number="248" name="Housing" color="7" fill="1" visible="yes" active="yes"/>
<layer number="249" name="Edge" color="7" fill="1" visible="yes" active="yes"/>
<layer number="250" name="Descript" color="3" fill="1" visible="no" active="no"/>
<layer number="251" name="SMDround" color="12" fill="11" visible="no" active="no"/>
<layer number="252" name="BR-BS" color="7" fill="1" visible="yes" active="yes"/>
<layer number="253" name="BR-LS" color="7" fill="1" visible="yes" active="yes"/>
<layer number="254" name="cooling" color="7" fill="1" visible="yes" active="yes"/>
<layer number="255" name="ZchnBlatt" color="7" fill="1" visible="yes" active="yes"/>
</layers>
<board>
<plain>
<wire x1="9.398" y1="4.572" x2="6.223" y2="7.747" width="0" layer="20" curve="-90"/>
<wire x1="6.223" y1="7.747" x2="6.223" y2="22.479" width="0" layer="20"/>
<wire x1="6.223" y1="22.479" x2="9.398" y2="25.654" width="0" layer="20" curve="-90"/>
<wire x1="9.398" y1="25.654" x2="56.896" y2="25.654" width="0" layer="20"/>
<wire x1="56.896" y1="25.654" x2="60.071" y2="22.479" width="0" layer="20" curve="-90"/>
<wire x1="60.071" y1="22.479" x2="60.071" y2="7.747" width="0" layer="20"/>
<wire x1="60.071" y1="7.747" x2="56.896" y2="4.572" width="0" layer="20" curve="-90"/>
<wire x1="56.896" y1="4.572" x2="9.398" y2="4.572" width="0" layer="20"/>
<text x="19.304" y="20.828" size="1.016" layer="21">A0</text>
<text x="22.479" y="20.828" size="1.016" layer="21">A1</text>
<text x="25.4" y="20.828" size="1.016" layer="21">A2</text>
<text x="31.496" y="20.828" size="1.016" layer="21">A4</text>
<text x="39.116" y="20.828" size="1.016" layer="21">A5</text>
<text x="57.023" y="20.701" size="1.016" layer="21" rot="R180">GND</text>
<text x="57.023" y="18.161" size="1.016" layer="21" rot="R180">OE</text>
<text x="57.023" y="15.621" size="1.016" layer="21" rot="R180">SCL</text>
<text x="57.023" y="13.081" size="1.016" layer="21" rot="R180">SDA</text>
<text x="57.023" y="10.287" size="1.016" layer="21" rot="R180">VCC</text>
<hole x="7.747" y="22.86" drill="2"/>
<hole x="58.547" y="22.86" drill="2"/>
<hole x="58.547" y="7.366" drill="2"/>
<hole x="7.747" y="7.366" drill="2"/>
<text x="28.448" y="20.828" size="1.016" layer="21">A3</text>
</plain>
<libraries>
<library name="microbuilder">
<packages>
<package name="TSSOP28">
<wire x1="-4.4646" y1="-2.2828" x2="4.4646" y2="-2.2828" width="0.1524" layer="51"/>
<wire x1="4.4646" y1="2.2828" x2="4.4646" y2="-2.2828" width="0.1524" layer="21"/>
<wire x1="4.4646" y1="2.2828" x2="-4.4646" y2="2.2828" width="0.1524" layer="51"/>
<wire x1="-4.4646" y1="-2.2828" x2="-4.4646" y2="2.2828" width="0.1524" layer="21"/>
<circle x="-3.5756" y="-1.2192" radius="0.4572" width="0.1524" layer="21"/>
<smd name="1" x="-4.225" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="2" x="-3.575" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="3" x="-2.925" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="4" x="-2.275" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="5" x="-1.625" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="6" x="-0.975" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="7" x="-0.325" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="8" x="0.325" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="21" x="0.325" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="22" x="-0.325" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="23" x="-0.975" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="24" x="-1.625" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="25" x="-2.275" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="26" x="-2.925" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="27" x="-3.575" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="28" x="-4.225" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="9" x="0.975" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="10" x="1.625" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="20" x="0.975" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="19" x="1.625" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="11" x="2.275" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="12" x="2.925" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="13" x="3.575" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="14" x="4.225" y="-2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="15" x="4.225" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="16" x="3.575" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="17" x="2.925" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<smd name="18" x="2.275" y="2.9178" dx="0.3048" dy="0.9906" layer="1"/>
<text x="-4.8456" y="-2.0828" size="0.4064" layer="25" rot="R90">>NAME</text>
<text x="5.0742" y="-2.0828" size="0.4064" layer="27" rot="R90">>VALUE</text>
<rectangle x1="-4.3266" y1="-3.121" x2="-4.1234" y2="-2.2828" layer="51"/>
<rectangle x1="-3.6766" y1="-3.121" x2="-3.4734" y2="-2.2828" layer="51"/>
<rectangle x1="-3.0266" y1="-3.121" x2="-2.8234" y2="-2.2828" layer="51"/>
<rectangle x1="-2.3766" y1="-3.121" x2="-2.1734" y2="-2.2828" layer="51"/>
<rectangle x1="-1.7266" y1="-3.121" x2="-1.5234" y2="-2.2828" layer="51"/>
<rectangle x1="-1.0766" y1="-3.121" x2="-0.8734" y2="-2.2828" layer="51"/>
<rectangle x1="-0.4266" y1="-3.121" x2="-0.2234" y2="-2.2828" layer="51"/>
<rectangle x1="0.2234" y1="-3.121" x2="0.4266" y2="-2.2828" layer="51"/>
<rectangle x1="0.2234" y1="2.2828" x2="0.4266" y2="3.121" layer="51"/>
<rectangle x1="-0.4266" y1="2.2828" x2="-0.2234" y2="3.121" layer="51"/>
<rectangle x1="-1.0766" y1="2.2828" x2="-0.8734" y2="3.121" layer="51"/>
<rectangle x1="-1.7266" y1="2.2828" x2="-1.5234" y2="3.121" layer="51"/>
<rectangle x1="-2.3766" y1="2.2828" x2="-2.1734" y2="3.121" layer="51"/>
<rectangle x1="-3.0266" y1="2.2828" x2="-2.8234" y2="3.121" layer="51"/>
<rectangle x1="-3.6766" y1="2.2828" x2="-3.4734" y2="3.121" layer="51"/>
<rectangle x1="-4.3266" y1="2.2828" x2="-4.1234" y2="3.121" layer="51"/>
<rectangle x1="0.8734" y1="-3.121" x2="1.0766" y2="-2.2828" layer="51"/>
<rectangle x1="1.5234" y1="-3.121" x2="1.7266" y2="-2.2828" layer="51"/>
<rectangle x1="0.8734" y1="2.2828" x2="1.0766" y2="3.121" layer="51"/>
<rectangle x1="1.5234" y1="2.2828" x2="1.7266" y2="3.121" layer="51"/>
<rectangle x1="2.1734" y1="-3.121" x2="2.3766" y2="-2.2828" layer="51"/>
<rectangle x1="2.8234" y1="-3.121" x2="3.0266" y2="-2.2828" layer="51"/>
<rectangle x1="3.4734" y1="-3.121" x2="3.6766" y2="-2.2828" layer="51"/>
<rectangle x1="4.1234" y1="-3.121" x2="4.3266" y2="-2.2828" layer="51"/>
<rectangle x1="4.1234" y1="2.2828" x2="4.3266" y2="3.121" layer="51"/>
<rectangle x1="3.4734" y1="2.2828" x2="3.6766" y2="3.121" layer="51"/>
<rectangle x1="2.8234" y1="2.2828" x2="3.0266" y2="3.121" layer="51"/>
<rectangle x1="2.1734" y1="2.2828" x2="2.3766" y2="3.121" layer="51"/>
</package>
<package name="CHIPLED_0805">
<description><b>CHIPLED 0805</b></description>
<wire x1="-0.35" y1="0.925" x2="0.35" y2="0.925" width="0.1016" layer="51" curve="162.394521"/>
<wire x1="-0.35" y1="-0.925" x2="0.35" y2="-0.925" width="0.1016" layer="51" curve="-162.394521"/>
<wire x1="0.575" y1="0.525" x2="0.575" y2="-0.525" width="0.1016" layer="51"/>
<wire x1="-0.575" y1="-0.5" x2="-0.575" y2="0.925" width="0.1016" layer="51"/>
<wire x1="-0.4" y1="0.2" x2="0" y2="0.2" width="0.127" layer="21"/>
<wire x1="0" y1="0.2" x2="0.4" y2="0.2" width="0.127" layer="21"/>
<wire x1="0" y1="0.2" x2="-0.4" y2="-0.2" width="0.127" layer="21"/>
<wire x1="-0.4" y1="-0.2" x2="0.4" y2="-0.2" width="0.127" layer="21"/>
<wire x1="0.4" y1="-0.2" x2="0" y2="0.2" width="0.127" layer="21"/>
<wire x1="0.8" y1="-1.7985" x2="-0.8" y2="-1.7985" width="0.127" layer="21"/>
<wire x1="-0.8" y1="-1.7985" x2="-0.8" y2="1.7985" width="0.127" layer="21"/>
<wire x1="-0.8" y1="1.7985" x2="0.697" y2="1.7985" width="0.127" layer="21"/>
<wire x1="0.7" y1="1.7985" x2="0.8" y2="1.7985" width="0.127" layer="21"/>
<wire x1="0.8" y1="1.7985" x2="0.8" y2="-1.7985" width="0.127" layer="21"/>
<circle x="-0.45" y="0.85" radius="0.103" width="0.0762" layer="51"/>
<smd name="C" x="0" y="1.05" dx="1.2" dy="1.2" layer="1"/>
<smd name="A" x="0" y="-1.05" dx="1.2" dy="1.2" layer="1"/>
<text x="-1.016" y="-1.778" size="0.8128" layer="25" rot="R90">>NAME</text>
<text x="1.778" y="-1.778" size="0.8128" layer="27" rot="R90">>VALUE</text>
<text x="-0.1" y="-1.4" size="0.254" layer="51">A</text>
<text x="-0.1" y="1.2" size="0.254" layer="51">C</text>
<rectangle x1="0.3" y1="0.5" x2="0.625" y2="1" layer="51"/>
<rectangle x1="-0.325" y1="0.5" x2="-0.175" y2="0.75" layer="51"/>
<rectangle x1="0.175" y1="0.5" x2="0.325" y2="0.75" layer="51"/>
<rectangle x1="-0.2" y1="0.5" x2="0.2" y2="0.675" layer="51"/>
<rectangle x1="0.3" y1="-1" x2="0.625" y2="-0.5" layer="51"/>
<rectangle x1="-0.625" y1="-1" x2="-0.3" y2="-0.5" layer="51"/>
<rectangle x1="0.175" y1="-0.75" x2="0.325" y2="-0.5" layer="51"/>
<rectangle x1="-0.325" y1="-0.75" x2="-0.175" y2="-0.5" layer="51"/>
<rectangle x1="-0.2" y1="-0.675" x2="0.2" y2="-0.5" layer="51"/>
<rectangle x1="-0.6" y1="0.5" x2="-0.3" y2="0.762" layer="51"/>
<rectangle x1="-0.625" y1="0.925" x2="-0.3" y2="1" layer="51"/>
</package>
</packages>
</library>
<library name="v-reg">
<description><b>Voltage Regulators</b><p>
<author>Created by librarian@cadsoft.de</author></description>
<packages>
<package name="DPACK">
<description><b>DPAK</b><p>
PLASTIC PACKAGE CASE 369C-01<br>
Source: http://www.onsemi.co.jp .. LM317M-D.PDF</description>
<wire x1="3.2766" y1="3.8354" x2="3.277" y2="-2.159" width="0.2032" layer="21"/>
<wire x1="3.277" y1="-2.159" x2="-3.277" y2="-2.159" width="0.2032" layer="21"/>
<wire x1="-3.277" y1="-2.159" x2="-3.2766" y2="3.8354" width="0.2032" layer="21"/>
<wire x1="-3.277" y1="3.835" x2="3.2774" y2="3.8346" width="0.2032" layer="51"/>
<wire x1="-2.5654" y1="3.937" x2="-2.5654" y2="4.6482" width="0.2032" layer="51"/>
<wire x1="-2.5654" y1="4.6482" x2="-2.1082" y2="5.1054" width="0.2032" layer="51"/>
<wire x1="-2.1082" y1="5.1054" x2="2.1082" y2="5.1054" width="0.2032" layer="51"/>
<wire x1="2.1082" y1="5.1054" x2="2.5654" y2="4.6482" width="0.2032" layer="51"/>
<wire x1="2.5654" y1="4.6482" x2="2.5654" y2="3.937" width="0.2032" layer="51"/>
<wire x1="2.5654" y1="3.937" x2="-2.5654" y2="3.937" width="0.2032" layer="51"/>
<smd name="4" x="0" y="2.38" dx="5.8" dy="6.2" layer="1"/>
<smd name="1" x="-2.28" y="-4.8" dx="1.6" dy="3" layer="1"/>
<smd name="3" x="2.28" y="-4.8" dx="1.6" dy="3" layer="1"/>
<text x="-3.81" y="-2.54" size="1.27" layer="25" rot="R90">>NAME</text>
<text x="5.08" y="-2.54" size="1.27" layer="27" rot="R90">>VALUE</text>
<rectangle x1="-2.7178" y1="-5.1562" x2="-1.8542" y2="-2.2606" layer="51"/>
<rectangle x1="1.8542" y1="-5.1562" x2="2.7178" y2="-2.2606" layer="51"/>
<rectangle x1="-0.4318" y1="-3.0226" x2="0.4318" y2="-2.2606" layer="21"/>
<polygon width="0.1998" layer="51">
<vertex x="-2.5654" y="3.937"/>
<vertex x="-2.5654" y="4.6482"/>
<vertex x="-2.1082" y="5.1054"/>
<vertex x="2.1082" y="5.1054"/>
<vertex x="2.5654" y="4.6482"/>
<vertex x="2.5654" y="3.937"/>
</polygon>
</package>
</packages>
</library>
<library name="thar">
<packages>
<package name="603">
<wire x1="-0.432" y1="-0.356" x2="0.432" y2="-0.356" width="0.1524" layer="51"/>
<wire x1="0.432" y1="0.356" x2="-0.432" y2="0.356" width="0.1524" layer="51"/>
<smd name="1" x="-0.8255" y="0" dx="0.889" dy="1.016" layer="1"/>
<smd name="2" x="0.8255" y="0" dx="0.889" dy="1.016" layer="1"/>
<text x="-0.127" y="0.6985" size="0.254" layer="25" align="bottom-right">>NAME</text>
<text x="0.127" y="0.6985" size="0.254" layer="27">>VALUE</text>
<rectangle x1="0.4318" y1="-0.4318" x2="0.8382" y2="0.4318" layer="51"/>
<rectangle x1="-0.8382" y1="-0.4318" x2="-0.4318" y2="0.4318" layer="51"/>
<rectangle x1="-0.1999" y1="-0.4001" x2="0.1999" y2="0.4001" layer="35"/>
</package>
<package name="1206">
<wire x1="0.9525" y1="-0.8128" x2="-0.9652" y2="-0.8128" width="0.1524" layer="51"/>
<wire x1="0.9525" y1="0.8128" x2="-0.9652" y2="0.8128" width="0.1524" layer="51"/>
<smd name="2" x="1.397" y="0" dx="1.524" dy="1.778" layer="1"/>
<smd name="1" x="-1.397" y="0" dx="1.524" dy="1.778" layer="1"/>
<rectangle x1="-1.6891" y1="-0.8763" x2="-0.9525" y2="0.8763" layer="51"/>
<rectangle x1="0.9525" y1="-0.8763" x2="1.6891" y2="0.8763" layer="51"/>
<text x="-0.127" y="1.0795" size="0.254" layer="25" align="bottom-right">>NAME</text>
<text x="0.127" y="1.0795" size="0.254" layer="27">>VALUE</text>
</package>
</packages>
</library>
<library name="pinhead">
<description><b>Pin Header Connectors</b><p>
<author>Created by librarian@cadsoft.de</author></description>
<packages>
<package name="1X05">
<description><b>PIN HEADER</b></description>
<wire x1="1.905" y1="1.27" x2="3.175" y2="1.27" width="0.1524" layer="21"/>
<wire x1="3.175" y1="1.27" x2="3.81" y2="0.635" width="0.1524" layer="21"/>
<wire x1="3.81" y1="0.635" x2="3.81" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="3.81" y1="-0.635" x2="3.175" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="-1.27" y1="0.635" x2="-0.635" y2="1.27" width="0.1524" layer="21"/>
<wire x1="-0.635" y1="1.27" x2="0.635" y2="1.27" width="0.1524" layer="21"/>
<wire x1="0.635" y1="1.27" x2="1.27" y2="0.635" width="0.1524" layer="21"/>
<wire x1="1.27" y1="0.635" x2="1.27" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="1.27" y1="-0.635" x2="0.635" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="0.635" y1="-1.27" x2="-0.635" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="-0.635" y1="-1.27" x2="-1.27" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="1.905" y1="1.27" x2="1.27" y2="0.635" width="0.1524" layer="21"/>
<wire x1="1.27" y1="-0.635" x2="1.905" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="3.175" y1="-1.27" x2="1.905" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="-5.715" y1="1.27" x2="-4.445" y2="1.27" width="0.1524" layer="21"/>
<wire x1="-4.445" y1="1.27" x2="-3.81" y2="0.635" width="0.1524" layer="21"/>
<wire x1="-3.81" y1="0.635" x2="-3.81" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="-3.81" y1="-0.635" x2="-4.445" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="-3.81" y1="0.635" x2="-3.175" y2="1.27" width="0.1524" layer="21"/>
<wire x1="-3.175" y1="1.27" x2="-1.905" y2="1.27" width="0.1524" layer="21"/>
<wire x1="-1.905" y1="1.27" x2="-1.27" y2="0.635" width="0.1524" layer="21"/>
<wire x1="-1.27" y1="0.635" x2="-1.27" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="-1.27" y1="-0.635" x2="-1.905" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="-1.905" y1="-1.27" x2="-3.175" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="-3.175" y1="-1.27" x2="-3.81" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="-6.35" y1="0.635" x2="-6.35" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="-5.715" y1="1.27" x2="-6.35" y2="0.635" width="0.1524" layer="21"/>
<wire x1="-6.35" y1="-0.635" x2="-5.715" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="-4.445" y1="-1.27" x2="-5.715" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="4.445" y1="1.27" x2="5.715" y2="1.27" width="0.1524" layer="21"/>
<wire x1="5.715" y1="1.27" x2="6.35" y2="0.635" width="0.1524" layer="21"/>
<wire x1="6.35" y1="0.635" x2="6.35" y2="-0.635" width="0.1524" layer="21"/>
<wire x1="6.35" y1="-0.635" x2="5.715" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="4.445" y1="1.27" x2="3.81" y2="0.635" width="0.1524" layer="21"/>
<wire x1="3.81" y1="-0.635" x2="4.445" y2="-1.27" width="0.1524" layer="21"/>
<wire x1="5.715" y1="-1.27" x2="4.445" y2="-1.27" width="0.1524" layer="21"/>
<pad name="1" x="-5.08" y="0" drill="1.016" shape="long" rot="R90"/>
<pad name="2" x="-2.54" y="0" drill="1.016" shape="long" rot="R90"/>
<pad name="3" x="0" y="0" drill="1.016" shape="long" rot="R90"/>
<pad name="4" x="2.54" y="0" drill="1.016" shape="long" rot="R90"/>
<pad name="5" x="5.08" y="0" drill="1.016" shape="long" rot="R90"/>
<text x="-6.4262" y="1.8288" size="1.27" layer="25" ratio="10">>NAME</text>
<text x="-6.35" y="-3.175" size="1.27" layer="27">>VALUE</text>
<rectangle x1="2.286" y1="-0.254" x2="2.794" y2="0.254" layer="51"/>
<rectangle x1="-0.254" y1="-0.254" x2="0.254" y2="0.254" layer="51"/>
<rectangle x1="-2.794" y1="-0.254" x2="-2.286" y2="0.254" layer="51"/>
<rectangle x1="-5.334" y1="-0.254" x2="-4.826" y2="0.254" layer="51"/>
<rectangle x1="4.826" y1="-0.254" x2="5.334" y2="0.254" layer="51"/>
</package>
</packages>
</library>
<library name="TI_ULN2803">
<packages>
<package name="SOIC127P1030X265-18N">
<smd name="1" x="-4.6736" y="5.08" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="2" x="-4.6736" y="3.81" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="3" x="-4.6736" y="2.54" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="4" x="-4.6736" y="1.27" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="5" x="-4.6736" y="0" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="6" x="-4.6736" y="-1.27" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="7" x="-4.6736" y="-2.54" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="8" x="-4.6736" y="-3.81" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="9" x="-4.6736" y="-5.08" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="10" x="4.6736" y="-5.08" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="11" x="4.6736" y="-3.81" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="12" x="4.6736" y="-2.54" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="13" x="4.6736" y="-1.27" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="14" x="4.6736" y="0" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="15" x="4.6736" y="1.27" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="16" x="4.6736" y="2.54" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="17" x="4.6736" y="3.81" dx="1.9812" dy="0.5588" layer="1"/>
<smd name="18" x="4.6736" y="5.08" dx="1.9812" dy="0.5588" layer="1"/>
<wire x1="-3.81" y1="4.826" x2="-3.81" y2="5.334" width="0" layer="51"/>
<wire x1="-3.81" y1="5.334" x2="-5.3086" y2="5.334" width="0" layer="51"/>
<wire x1="-5.3086" y1="5.334" x2="-5.3086" y2="4.826" width="0" layer="51"/>
<wire x1="-5.3086" y1="4.826" x2="-3.81" y2="4.826" width="0" layer="51"/>
<wire x1="-3.81" y1="3.556" x2="-3.81" y2="4.064" width="0" layer="51"/>
<wire x1="-3.81" y1="4.064" x2="-5.3086" y2="4.064" width="0" layer="51"/>
<wire x1="-5.3086" y1="4.064" x2="-5.3086" y2="3.556" width="0" layer="51"/>
<wire x1="-5.3086" y1="3.556" x2="-3.81" y2="3.556" width="0" layer="51"/>
<wire x1="-3.81" y1="2.286" x2="-3.81" y2="2.794" width="0" layer="51"/>
<wire x1="-3.81" y1="2.794" x2="-5.3086" y2="2.794" width="0" layer="51"/>
<wire x1="-5.3086" y1="2.794" x2="-5.3086" y2="2.286" width="0" layer="51"/>
<wire x1="-5.3086" y1="2.286" x2="-3.81" y2="2.286" width="0" layer="51"/>
<wire x1="-3.81" y1="1.016" x2="-3.81" y2="1.524" width="0" layer="51"/>
<wire x1="-3.81" y1="1.524" x2="-5.3086" y2="1.524" width="0" layer="51"/>
<wire x1="-5.3086" y1="1.524" x2="-5.3086" y2="1.016" width="0" layer="51"/>
<wire x1="-5.3086" y1="1.016" x2="-3.81" y2="1.016" width="0" layer="51"/>
<wire x1="-3.81" y1="-0.254" x2="-3.81" y2="0.254" width="0" layer="51"/>
<wire x1="-3.81" y1="0.254" x2="-5.3086" y2="0.254" width="0" layer="51"/>
<wire x1="-5.3086" y1="0.254" x2="-5.3086" y2="-0.254" width="0" layer="51"/>
<wire x1="-5.3086" y1="-0.254" x2="-3.81" y2="-0.254" width="0" layer="51"/>
<wire x1="-3.81" y1="-1.524" x2="-3.81" y2="-1.016" width="0" layer="51"/>
<wire x1="-3.81" y1="-1.016" x2="-5.3086" y2="-1.016" width="0" layer="51"/>
<wire x1="-5.3086" y1="-1.016" x2="-5.3086" y2="-1.524" width="0" layer="51"/>
<wire x1="-5.3086" y1="-1.524" x2="-3.81" y2="-1.524" width="0" layer="51"/>
<wire x1="-3.81" y1="-2.794" x2="-3.81" y2="-2.286" width="0" layer="51"/>
<wire x1="-3.81" y1="-2.286" x2="-5.3086" y2="-2.286" width="0" layer="51"/>
<wire x1="-5.3086" y1="-2.286" x2="-5.3086" y2="-2.794" width="0" layer="51"/>
<wire x1="-5.3086" y1="-2.794" x2="-3.81" y2="-2.794" width="0" layer="51"/>
<wire x1="-3.81" y1="-4.064" x2="-3.81" y2="-3.556" width="0" layer="51"/>
<wire x1="-3.81" y1="-3.556" x2="-5.3086" y2="-3.556" width="0" layer="51"/>
<wire x1="-5.3086" y1="-3.556" x2="-5.3086" y2="-4.064" width="0" layer="51"/>
<wire x1="-5.3086" y1="-4.064" x2="-3.81" y2="-4.064" width="0" layer="51"/>
<wire x1="-3.81" y1="-5.334" x2="-3.81" y2="-4.826" width="0" layer="51"/>
<wire x1="-3.81" y1="-4.826" x2="-5.3086" y2="-4.826" width="0" layer="51"/>
<wire x1="-5.3086" y1="-4.826" x2="-5.3086" y2="-5.334" width="0" layer="51"/>
<wire x1="-5.3086" y1="-5.334" x2="-3.81" y2="-5.334" width="0" layer="51"/>
<wire x1="3.81" y1="-4.826" x2="3.81" y2="-5.334" width="0" layer="51"/>
<wire x1="3.81" y1="-5.334" x2="5.3086" y2="-5.334" width="0" layer="51"/>
<wire x1="5.3086" y1="-5.334" x2="5.3086" y2="-4.826" width="0" layer="51"/>
<wire x1="5.3086" y1="-4.826" x2="3.81" y2="-4.826" width="0" layer="51"/>
<wire x1="3.81" y1="-3.556" x2="3.81" y2="-4.064" width="0" layer="51"/>
<wire x1="3.81" y1="-4.064" x2="5.3086" y2="-4.064" width="0" layer="51"/>
<wire x1="5.3086" y1="-4.064" x2="5.3086" y2="-3.556" width="0" layer="51"/>
<wire x1="5.3086" y1="-3.556" x2="3.81" y2="-3.556" width="0" layer="51"/>
<wire x1="3.81" y1="-2.286" x2="3.81" y2="-2.794" width="0" layer="51"/>
<wire x1="3.81" y1="-2.794" x2="5.3086" y2="-2.794" width="0" layer="51"/>
<wire x1="5.3086" y1="-2.794" x2="5.3086" y2="-2.286" width="0" layer="51"/>
<wire x1="5.3086" y1="-2.286" x2="3.81" y2="-2.286" width="0" layer="51"/>
<wire x1="3.81" y1="-1.016" x2="3.81" y2="-1.524" width="0" layer="51"/>
<wire x1="3.81" y1="-1.524" x2="5.3086" y2="-1.524" width="0" layer="51"/>
<wire x1="5.3086" y1="-1.524" x2="5.3086" y2="-1.016" width="0" layer="51"/>
<wire x1="5.3086" y1="-1.016" x2="3.81" y2="-1.016" width="0" layer="51"/>
<wire x1="3.81" y1="0.254" x2="3.81" y2="-0.254" width="0" layer="51"/>
<wire x1="3.81" y1="-0.254" x2="5.3086" y2="-0.254" width="0" layer="51"/>
<wire x1="5.3086" y1="-0.254" x2="5.3086" y2="0.254" width="0" layer="51"/>
<wire x1="5.3086" y1="0.254" x2="3.81" y2="0.254" width="0" layer="51"/>
<wire x1="3.81" y1="1.524" x2="3.81" y2="1.016" width="0" layer="51"/>
<wire x1="3.81" y1="1.016" x2="5.3086" y2="1.016" width="0" layer="51"/>
<wire x1="5.3086" y1="1.016" x2="5.3086" y2="1.524" width="0" layer="51"/>
<wire x1="5.3086" y1="1.524" x2="3.81" y2="1.524" width="0" layer="51"/>
<wire x1="3.81" y1="2.794" x2="3.81" y2="2.286" width="0" layer="51"/>
<wire x1="3.81" y1="2.286" x2="5.3086" y2="2.286" width="0" layer="51"/>
<wire x1="5.3086" y1="2.286" x2="5.3086" y2="2.794" width="0" layer="51"/>
<wire x1="5.3086" y1="2.794" x2="3.81" y2="2.794" width="0" layer="51"/>
<wire x1="3.81" y1="4.064" x2="3.81" y2="3.556" width="0" layer="51"/>
<wire x1="3.81" y1="3.556" x2="5.3086" y2="3.556" width="0" layer="51"/>
<wire x1="5.3086" y1="3.556" x2="5.3086" y2="4.064" width="0" layer="51"/>
<wire x1="5.3086" y1="4.064" x2="3.81" y2="4.064" width="0" layer="51"/>
<wire x1="3.81" y1="5.334" x2="3.81" y2="4.826" width="0" layer="51"/>
<wire x1="3.81" y1="4.826" x2="5.3086" y2="4.826" width="0" layer="51"/>
<wire x1="5.3086" y1="4.826" x2="5.3086" y2="5.334" width="0" layer="51"/>
<wire x1="5.3086" y1="5.334" x2="3.81" y2="5.334" width="0" layer="51"/>
<wire x1="-3.81" y1="-5.7912" x2="3.81" y2="-5.7912" width="0" layer="51"/>
<wire x1="3.81" y1="-5.7912" x2="3.81" y2="5.7912" width="0" layer="51"/>
<wire x1="3.81" y1="5.7912" x2="0.3048" y2="5.7912" width="0" layer="51"/>
<wire x1="0.3048" y1="5.7912" x2="-0.3048" y2="5.7912" width="0" layer="51"/>
<wire x1="-0.3048" y1="5.7912" x2="-3.81" y2="5.7912" width="0" layer="51"/>
<wire x1="-3.81" y1="5.7912" x2="-3.81" y2="-5.7912" width="0" layer="51"/>
<wire x1="0.3048" y1="5.7912" x2="-0.3048" y2="5.7912" width="0" layer="51" curve="-180"/>
<text x="-5.5118" y="5.5118" size="1.27" layer="51" ratio="6" rot="SR0">*</text>
<wire x1="-3.81" y1="-5.7912" x2="3.81" y2="-5.7912" width="0.1524" layer="21"/>
<wire x1="3.81" y1="5.7912" x2="0.3048" y2="5.7912" width="0.1524" layer="21"/>
<wire x1="0.3048" y1="5.7912" x2="-0.3048" y2="5.7912" width="0.1524" layer="21"/>
<wire x1="-0.3048" y1="5.7912" x2="-3.81" y2="5.7912" width="0.1524" layer="21"/>
<wire x1="0.3048" y1="5.7912" x2="-0.3048" y2="5.7912" width="0.1524" layer="21" curve="-180"/>
<text x="-5.5118" y="5.5118" size="1.27" layer="21" ratio="6" rot="SR0">*</text>
<text x="-3.4544" y="7.62" size="2.0828" layer="25" ratio="10" rot="SR0">>NAME</text>
<text x="-3.4544" y="-8.89" size="2.0828" layer="27" ratio="10" rot="SR0">>VALUE</text>
</package>
</packages>
</library>
<library name="testpad">
<description><b>Test Pins/Pads</b><p>
Cream on SMD OFF.<br>
new: Attribute TP_SIGNAL_NAME<br>
<author>Created by librarian@cadsoft.de</author></description>
<packages>
<package name="TP16SQ">
<description><b>TEST PAD</b></description>
<smd name="TP" x="0" y="0" dx="1.5996" dy="1.5996" layer="1" cream="no"/>
<text x="-0.8001" y="0.8499" size="1.27" layer="25">>NAME</text>
<text x="-0.762" y="-0.889" size="0.0254" layer="27">>VALUE</text>
<text x="0" y="-2.54" size="1" layer="37">>TP_SIGNAL_NAME</text>
</package>
</packages>
</library>
<library name="SparkFun-Retired">
<description><h3>SparkFun Electronics' preferred foot prints</h3>
In this library you'll find all manner of retired footprints for resistors, capacitors, board names, ICs, etc., that are no longer used in our catalog.<br><br>
We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com.
<br><br>
<b>Licensing:</b>Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/
<br><br>
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="SJ_3_PASTE2&3">
<wire x1="1.27" y1="-1.016" x2="-1.27" y2="-1.016" width="0.1524" layer="21"/>
<wire x1="1.27" y1="1.016" x2="1.524" y2="0.762" width="0.1524" layer="21" curve="-90"/>
<wire x1="-1.524" y1="0.762" x2="-1.27" y2="1.016" width="0.1524" layer="21" curve="-90"/>
<wire x1="-1.524" y1="-0.762" x2="-1.27" y2="-1.016" width="0.1524" layer="21" curve="90"/>
<wire x1="1.27" y1="-1.016" x2="1.524" y2="-0.762" width="0.1524" layer="21" curve="90"/>
<wire x1="1.524" y1="-0.762" x2="1.524" y2="0.762" width="0.1524" layer="21"/>
<wire x1="-1.524" y1="-0.762" x2="-1.524" y2="0.762" width="0.1524" layer="21"/>
<wire x1="-1.27" y1="1.016" x2="1.27" y2="1.016" width="0.1524" layer="21"/>
<wire x1="1.016" y1="0.508" x2="-0.1905" y2="0.508" width="0.127" layer="51"/>
<wire x1="-0.1905" y1="0.508" x2="-0.1905" y2="-0.508" width="0.127" layer="51"/>
<wire x1="-0.1905" y1="-0.508" x2="1.016" y2="-0.508" width="0.127" layer="51"/>
<wire x1="1.016" y1="-0.508" x2="1.016" y2="0.508" width="0.127" layer="51"/>
<smd name="1" x="-0.8128" y="0" dx="0.635" dy="1.27" layer="1" cream="no"/>
<smd name="2" x="0" y="0" dx="0.635" dy="1.27" layer="1" cream="no"/>
<smd name="3" x="0.8128" y="0" dx="0.635" dy="1.27" layer="1" cream="no"/>
<text x="-1.27" y="1.27" size="0.4064" layer="25">>NAME</text>
<text x="-0.1001" y="0" size="0.02" layer="27">>VALUE</text>
<text x="-1.27" y="-1.905" size="0.4064" layer="27">>VALUE</text>
<text x="0.0635" y="-0.4445" size="0.254" layer="51" rot="R40">PASTE</text>
<rectangle x1="-0.2794" y1="-1.016" x2="1.4224" y2="0.9906" layer="31"/>
</package>
</packages>
</library>
</libraries>
<attributes>
</attributes>
<variantdefs>
</variantdefs>
<classes>
<class number="0" name="default" width="0" drill="0">
</class>
</classes>
<designrules name="PCBCart-Standard">
<description language="fr"><b>EAGLE Design Rules for PCBCart (Standard PCB)</b>
<p><b>Characteristics:</b></p>
<p>
<ul>
<li>Minimum Trace/Spacing: 8mil (0.2mm)</li>
<li>Minimum Annular Ring: 12mil (0.3mm)</li>
<li>Minimum Drill: 0.4mm (16mil)</li>
</ul>
<p><b>Hole Tolerances</b> (for reference only):</p>
<ul>
<li>+/- 0.1mm for PTH holes</li>
<li>+/- 0.075mm for NPTH holes</li>
</ul>
<p><strong>Note: </strong> All vias 20mill/0.5mm and smaller will be tented by default</p>
</p></description>
<param name="layerSetup" value="(1*16)"/>
<param name="mtCopper" value="0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm"/>
<param name="mtIsolate" value="1.5mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm"/>
<param name="mdWireWire" value="8mil"/>
<param name="mdWirePad" value="8mil"/>
<param name="mdWireVia" value="8mil"/>
<param name="mdPadPad" value="8mil"/>
<param name="mdPadVia" value="8mil"/>
<param name="mdViaVia" value="8mil"/>
<param name="mdSmdPad" value="8mil"/>
<param name="mdSmdVia" value="8mil"/>
<param name="mdSmdSmd" value="8mil"/>
<param name="mdViaViaSameLayer" value="8mil"/>
<param name="mnLayersViaInSmd" value="2"/>
<param name="mdCopperDimension" value="20mil"/>
<param name="mdDrill" value="8mil"/>
<param name="mdSmdStop" value="0mil"/>
<param name="msWidth" value="8mil"/>
<param name="msDrill" value="0.4mm"/>
<param name="msMicroVia" value="999mil"/>
<param name="msBlindViaRatio" value="0.5"/>
<param name="rvPadTop" value="0"/>
<param name="rvPadInner" value="0"/>
<param name="rvPadBottom" value="0"/>
<param name="rvViaOuter" value="0"/>
<param name="rvViaInner" value="0"/>
<param name="rvMicroViaOuter" value="0"/>
<param name="rvMicroViaInner" value="0"/>
<param name="rlMinPadTop" value="8mil"/>
<param name="rlMaxPadTop" value="20mil"/>
<param name="rlMinPadInner" value="8mil"/>
<param name="rlMaxPadInner" value="20mil"/>
<param name="rlMinPadBottom" value="8mil"/>
<param name="rlMaxPadBottom" value="20mil"/>
<param name="rlMinViaOuter" value="10mil"/>
<param name="rlMaxViaOuter" value="20mil"/>
<param name="rlMinViaInner" value="10mil"/>
<param name="rlMaxViaInner" value="20mil"/>
<param name="rlMinMicroViaOuter" value="99mil"/>
<param name="rlMaxMicroViaOuter" value="999mil"/>
<param name="rlMinMicroViaInner" value="99mil"/>
<param name="rlMaxMicroViaInner" value="999mil"/>
<param name="psTop" value="-1"/>
<param name="psBottom" value="-1"/>
<param name="psFirst" value="-1"/>
<param name="psElongationLong" value="100"/>
<param name="psElongationOffset" value="100"/>
<param name="mvStopFrame" value="0"/>
<param name="mvCreamFrame" value="0"/>
<param name="mlMinStopFrame" value="3mil"/>
<param name="mlMaxStopFrame" value="8mil"/>
<param name="mlMinCreamFrame" value="0mil"/>
<param name="mlMaxCreamFrame" value="8mil"/>
<param name="mlViaStopLimit" value="20mil"/>
<param name="srRoundness" value="0"/>
<param name="srMinRoundness" value="0mil"/>
<param name="srMaxRoundness" value="0mil"/>
<param name="slThermalIsolate" value="8mil"/>
<param name="slThermalsForVias" value="0"/>
<param name="dpMaxLengthDifference" value="10mm"/>
<param name="dpGapFactor" value="2.5"/>
<param name="checkGrid" value="0"/>
<param name="checkAngle" value="0"/>
<param name="checkFont" value="1"/>
<param name="checkRestrict" value="1"/>
<param name="useDiameter" value="13"/>
<param name="maxErrors" value="50"/>
</designrules>
<autorouter>
<pass name="Default">
<param name="RoutingGrid" value="50mil"/>
<param name="AutoGrid" value="1"/>
<param name="Efforts" value="0"/>
<param name="TopRouterVariant" value="1"/>
<param name="tpViaShape" value="round"/>
<param name="PrefDir.1" value="|"/>
<param name="PrefDir.2" value="0"/>
<param name="PrefDir.3" value="0"/>
<param name="PrefDir.4" value="0"/>
<param name="PrefDir.5" value="0"/>
<param name="PrefDir.6" value="0"/>
<param name="PrefDir.7" value="0"/>
<param name="PrefDir.8" value="0"/>
<param name="PrefDir.9" value="0"/>
<param name="PrefDir.10" value="0"/>
<param name="PrefDir.11" value="0"/>
<param name="PrefDir.12" value="0"/>
<param name="PrefDir.13" value="0"/>
<param name="PrefDir.14" value="0"/>
<param name="PrefDir.15" value="0"/>
<param name="PrefDir.16" value="-"/>
<param name="cfVia" value="8"/>
<param name="cfNonPref" value="5"/>
<param name="cfChangeDir" value="2"/>
<param name="cfOrthStep" value="2"/>
<param name="cfDiagStep" value="3"/>
<param name="cfExtdStep" value="0"/>
<param name="cfBonusStep" value="1"/>
<param name="cfMalusStep" value="1"/>
<param name="cfPadImpact" value="4"/>
<param name="cfSmdImpact" value="4"/>
<param name="cfBusImpact" value="0"/>
<param name="cfHugging" value="3"/>
<param name="cfAvoid" value="4"/>
<param name="cfPolygon" value="10"/>
<param name="cfBase.1" value="0"/>
<param name="cfBase.2" value="1"/>
<param name="cfBase.3" value="1"/>
<param name="cfBase.4" value="1"/>
<param name="cfBase.5" value="1"/>
<param name="cfBase.6" value="1"/>
<param name="cfBase.7" value="1"/>
<param name="cfBase.8" value="1"/>
<param name="cfBase.9" value="1"/>
<param name="cfBase.10" value="1"/>
<param name="cfBase.11" value="1"/>
<param name="cfBase.12" value="1"/>
<param name="cfBase.13" value="1"/>
<param name="cfBase.14" value="1"/>
<param name="cfBase.15" value="1"/>
<param name="cfBase.16" value="0"/>
<param name="mnVias" value="20"/>
<param name="mnSegments" value="9999"/>
<param name="mnExtdSteps" value="9999"/>
<param name="mnRipupLevel" value="10"/>
<param name="mnRipupSteps" value="100"/>
<param name="mnRipupTotal" value="100"/>
</pass>
<pass name="Follow-me" refer="Default" active="yes">
</pass>
<pass name="Busses" refer="Default" active="yes">
<param name="cfNonPref" value="4"/>
<param name="cfBusImpact" value="4"/>
<param name="cfHugging" value="0"/>
<param name="mnVias" value="0"/>
</pass>
<pass name="Route" refer="Default" active="yes">
</pass>
<pass name="Optimize1" refer="Default" active="yes">
<param name="cfVia" value="99"/>
<param name="cfExtdStep" value="10"/>
<param name="cfHugging" value="1"/>
<param name="mnExtdSteps" value="1"/>
<param name="mnRipupLevel" value="0"/>
</pass>
<pass name="Optimize2" refer="Optimize1" active="yes">
<param name="cfNonPref" value="0"/>
<param name="cfChangeDir" value="6"/>
<param name="cfExtdStep" value="0"/>
<param name="cfBonusStep" value="2"/>
<param name="cfMalusStep" value="2"/>
<param name="cfPadImpact" value="2"/>
<param name="cfSmdImpact" value="2"/>
<param name="cfHugging" value="0"/>
</pass>
<pass name="Optimize3" refer="Optimize2" active="yes">
<param name="cfChangeDir" value="8"/>
<param name="cfPadImpact" value="0"/>
<param name="cfSmdImpact" value="0"/>
</pass>
<pass name="Optimize4" refer="Optimize3" active="yes">
<param name="cfChangeDir" value="25"/>
</pass>
</autorouter>
<elements>
<element name="U1" library="microbuilder" package="TSSOP28" value="PCA9685" x="33.147" y="15.621" smashed="yes" rot="R270">
<attribute name="NAME" x="32.8422" y="15.8946" size="0.4064" layer="25"/>
<attribute name="VALUE" x="30.1752" y="9.7848" size="1.016" layer="27" font="vector"/>
</element>
<element name="LED1" library="microbuilder" package="CHIPLED_0805" value="VCC" x="46.228" y="22.225" smashed="yes" rot="R90">
<attribute name="NAME" x="46.99" y="23.622" size="0.4064" layer="25" rot="R180"/>
</element>
<element name="IC1" library="v-reg" package="DPACK" value="LM317MDTRKG" x="13.589" y="13.462" smashed="yes" rot="R180">
<attribute name="NAME" x="9.779" y="6.731" size="1.016" layer="25"/>
<attribute name="VALUE" x="9.271" y="19.685" size="1.016" layer="27" rot="R270"/>
</element>
<element name="R_VU" library="thar" package="603" value="121?" x="17.653" y="23.876" smashed="yes">
<attribute name="NAME" x="18.923" y="24.5745" size="0.254" layer="25" align="bottom-right"/>
<attribute name="VALUE" x="16.51" y="24.5745" size="0.254" layer="27"/>
</element>
<element name="R_VD" library="thar" package="603" value="5k?" x="17.653" y="22.352" smashed="yes" rot="R180">
<attribute name="NAME" x="18.034" y="21.6535" size="0.254" layer="25" rot="R180" align="bottom-right"/>
<attribute name="VALUE" x="17.145" y="21.6535" size="0.254" layer="27" rot="R180"/>
</element>
<element name="C_V1" library="thar" package="1206" value="100µ" x="13.753196875" y="23.1512" smashed="yes" rot="R315">
<attribute name="NAME" x="14.426715625" y="24.004321875" size="0.254" layer="25" rot="R315" align="bottom-right"/>
<attribute name="VALUE" x="14.60631875" y="23.82471875" size="0.254" layer="27" rot="R315"/>
</element>
<element name="C_MC" library="thar" package="603" value="10µ" x="38.227" y="22.86" smashed="yes" rot="R90">
<attribute name="NAME" x="38.0365" y="25.4" size="0.254" layer="25" rot="R90" align="bottom-right"/>
<attribute name="VALUE" x="38.5445" y="24.765" size="0.254" layer="27" rot="R90"/>
</element>
<element name="R_RST" library="thar" package="603" value="10k" x="41.91" y="22.86" smashed="yes" rot="R90">
<attribute name="NAME" x="41.7195" y="25.4" size="0.254" layer="25" rot="R90" align="bottom-right"/>
<attribute name="VALUE" x="42.2275" y="24.765" size="0.254" layer="27" rot="R90"/>
</element>
<element name="R_SDA" library="thar" package="603" value="10k" x="35.179" y="22.86" smashed="yes" rot="R90">
<attribute name="NAME" x="34.9885" y="25.4" size="0.254" layer="25" rot="R90" align="bottom-right"/>
<attribute name="VALUE" x="35.4965" y="24.765" size="0.254" layer="27" rot="R90"/>
</element>
<element name="R_SCL" library="thar" package="603" value="10k" x="36.957" y="22.86" smashed="yes" rot="R90">
<attribute name="NAME" x="36.7665" y="25.4" size="0.254" layer="25" rot="R90" align="bottom-right"/>
<attribute name="VALUE" x="37.2745" y="24.765" size="0.254" layer="27" rot="R90"/>
</element>
<element name="R_LED" library="thar" package="603" value="220" x="43.688" y="22.86" smashed="yes" rot="R90">
<attribute name="NAME" x="43.4975" y="25.4" size="0.254" layer="25" rot="R90" align="bottom-right"/>
<attribute name="VALUE" x="44.0055" y="24.765" size="0.254" layer="27" rot="R90"/>
</element>
<element name="U2" library="TI_ULN2803" package="SOIC127P1030X265-18N" value="ULN2803ADWR" x="22.987" y="14.478" smashed="yes" rot="R270">
<attribute name="PACKAGE" value="SOIC-18" x="22.987" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="OC_NEWARK" value="87H4769" x="22.987" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="MPN" value="ULN2803ADWR" x="22.987" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="SUPPLIER" value="TEXAS INSTRUMENTS" x="22.987" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="OC_FARNELL" value="1652420" x="22.987" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="NAME" x="22.9616" y="14.605" size="1.016" layer="25" ratio="10" rot="SR0"/>
<attribute name="VALUE" x="18.0086" y="11.938" size="1.016" layer="27" ratio="10" rot="SR0"/>
</element>
<element name="U3" library="TI_ULN2803" package="SOIC127P1030X265-18N" value="ULN2803ADWR" x="46.228" y="14.478" smashed="yes" rot="R270">
<attribute name="PACKAGE" value="SOIC-18" x="46.228" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="OC_NEWARK" value="87H4769" x="46.228" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="MPN" value="ULN2803ADWR" x="46.228" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="SUPPLIER" value="TEXAS INSTRUMENTS" x="46.228" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="OC_FARNELL" value="1652420" x="46.228" y="14.478" size="1.778" layer="27" rot="R270" display="off"/>
<attribute name="NAME" x="46.3296" y="14.478" size="1.016" layer="25" ratio="10" rot="SR0"/>
<attribute name="VALUE" x="41.5036" y="11.43" size="1.016" layer="27" ratio="10" rot="SR0"/>
</element>
<element name="JP3" library="pinhead" package="1X05" value="" x="7.747" y="15.113" smashed="yes" rot="R90">
<attribute name="NAME" x="10.1092" y="22.5298" size="1.016" layer="25" ratio="10" rot="R90"/>
<attribute name="VALUE" x="10.922" y="8.763" size="1.27" layer="27" rot="R90"/>
</element>
<element name="JP4" library="pinhead" package="1X05" value="" x="58.547" y="15.113" smashed="yes" rot="R90">
<attribute name="NAME" x="57.0992" y="21.3868" size="1.016" layer="25" ratio="10" rot="R90"/>
<attribute name="VALUE" x="61.722" y="8.763" size="1.27" layer="27" rot="R90"/>
</element>
<element name="C_V3" library="thar" package="1206" value="100µ" x="12.3407875" y="21.717" smashed="yes" rot="R315">
<attribute name="NAME" x="11.36330625" y="20.919121875" size="0.254" layer="25" rot="R315" align="bottom-right"/>
<attribute name="VALUE" x="11.542909375" y="20.73951875" size="0.254" layer="27" rot="R315"/>
</element>
<element name="TP1" library="testpad" package="TP16SQ" value="TPTP16SQ" x="33.147" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="33.147" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP2" library="testpad" package="TP16SQ" value="TPTP16SQ" x="30.607" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="30.607" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP3" library="testpad" package="TP16SQ" value="TPTP16SQ" x="28.067" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="28.067" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP4" library="testpad" package="TP16SQ" value="TPTP16SQ" x="25.527" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="25.527" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP5" library="testpad" package="TP16SQ" value="TPTP16SQ" x="22.987" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="22.987" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP6" library="testpad" package="TP16SQ" value="TPTP16SQ" x="20.447" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="20.447" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP7" library="testpad" package="TP16SQ" value="TPTP16SQ" x="17.907" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="17.907" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP8" library="testpad" package="TP16SQ" value="TPTP16SQ" x="15.367" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="15.367" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP9" library="testpad" package="TP16SQ" value="TPTP16SQ" x="56.388" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="56.388" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP10" library="testpad" package="TP16SQ" value="TPTP16SQ" x="53.848" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="53.848" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP11" library="testpad" package="TP16SQ" value="TPTP16SQ" x="51.308" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="51.308" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP12" library="testpad" package="TP16SQ" value="TPTP16SQ" x="48.768" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="48.768" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP13" library="testpad" package="TP16SQ" value="TPTP16SQ" x="46.228" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="46.228" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP14" library="testpad" package="TP16SQ" value="TPTP16SQ" x="43.688" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="43.688" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP15" library="testpad" package="TP16SQ" value="TPTP16SQ" x="41.148" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="41.148" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP16" library="testpad" package="TP16SQ" value="TPTP16SQ" x="38.608" y="5.588">
<attribute name="TP_SIGNAL_NAME" value="" x="38.608" y="5.588" size="1.778" layer="27" display="off"/>
</element>
<element name="TP17" library="testpad" package="TP16SQ" value="TPTP16SQ" x="15.367" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="15.367" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP18" library="testpad" package="TP16SQ" value="TPTP16SQ" x="17.907" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="17.907" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP19" library="testpad" package="TP16SQ" value="TPTP16SQ" x="20.447" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="20.447" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP20" library="testpad" package="TP16SQ" value="TPTP16SQ" x="22.987" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="22.987" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP21" library="testpad" package="TP16SQ" value="TPTP16SQ" x="25.527" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="25.527" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP22" library="testpad" package="TP16SQ" value="TPTP16SQ" x="28.067" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="28.067" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP23" library="testpad" package="TP16SQ" value="TPTP16SQ" x="30.607" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="30.607" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP24" library="testpad" package="TP16SQ" value="TPTP16SQ" x="33.147" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="33.147" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP25" library="testpad" package="TP16SQ" value="TPTP16SQ" x="38.608" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="38.608" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP26" library="testpad" package="TP16SQ" value="TPTP16SQ" x="41.148" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="41.148" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP27" library="testpad" package="TP16SQ" value="TPTP16SQ" x="43.688" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="43.688" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP28" library="testpad" package="TP16SQ" value="TPTP16SQ" x="46.228" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="46.228" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP29" library="testpad" package="TP16SQ" value="TPTP16SQ" x="48.768" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="48.768" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP30" library="testpad" package="TP16SQ" value="TPTP16SQ" x="51.308" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="51.308" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP31" library="testpad" package="TP16SQ" value="TPTP16SQ" x="53.848" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="53.848" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="TP32" library="testpad" package="TP16SQ" value="TPTP16SQ" x="56.388" y="5.588" rot="MR0">
<attribute name="TP_SIGNAL_NAME" value="" x="56.388" y="5.588" size="1.778" layer="28" rot="MR0" display="off"/>
</element>
<element name="SJ1" library="SparkFun-Retired" package="SJ_3_PASTE2&3" value="" x="32.258" y="23.876" rot="R270"/>
<element name="SJ2" library="SparkFun-Retired" package="SJ_3_PASTE2&3" value="" x="29.21" y="23.876" rot="R270"/>
<element name="SJ3" library="SparkFun-Retired" package="SJ_3_PASTE2&3" value="" x="20.066" y="23.876" rot="R270"/>
<element name="SJ4" library="SparkFun-Retired" package="SJ_3_PASTE2&3" value="" x="23.114" y="23.876" rot="R270"/>
<element name="SJ5" library="SparkFun-Retired" package="SJ_3_PASTE2&3" value="" x="26.162" y="23.876" rot="R270"/>
<element name="SJ6" library="SparkFun-Retired" package="SJ_3_PASTE2&3" value="" x="39.878" y="23.876" rot="R270"/>
</elements>
<signals>
<signal name="PWM0">
<contactref element="U1" pad="6"/>
<contactref element="U2" pad="1"/>
<wire x1="30.2292" y1="16.596" x2="29.759" y2="16.596" width="0.3048" layer="1"/>
<wire x1="29.759" y1="16.596" x2="28.067" y2="18.288" width="0.3048" layer="1"/>
<wire x1="28.067" y1="18.288" x2="28.067" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM1">
<contactref element="U1" pad="7"/>
<contactref element="U2" pad="2"/>
<wire x1="30.2292" y1="15.946" x2="29.139" y2="15.946" width="0.3048" layer="1"/>
<wire x1="29.139" y1="15.946" x2="26.797" y2="18.288" width="0.3048" layer="1"/>
<wire x1="26.797" y1="18.288" x2="26.797" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM2">
<contactref element="U1" pad="8"/>
<contactref element="U2" pad="3"/>
<wire x1="30.2292" y1="15.296" x2="28.519" y2="15.296" width="0.3048" layer="1"/>
<wire x1="28.519" y1="15.296" x2="25.527" y2="18.288" width="0.3048" layer="1"/>
<wire x1="25.527" y1="18.288" x2="25.527" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM3">
<contactref element="U1" pad="9"/>
<contactref element="U2" pad="4"/>
<wire x1="30.2292" y1="14.646" x2="27.899" y2="14.646" width="0.3048" layer="1"/>
<wire x1="27.899" y1="14.646" x2="24.257" y2="18.288" width="0.3048" layer="1"/>
<wire x1="24.257" y1="18.288" x2="24.257" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM4">
<contactref element="U1" pad="10"/>
<contactref element="U2" pad="5"/>
<wire x1="30.2292" y1="13.996" x2="27.279" y2="13.996" width="0.3048" layer="1"/>
<wire x1="27.279" y1="13.996" x2="22.987" y2="18.288" width="0.3048" layer="1"/>
<wire x1="22.987" y1="18.288" x2="22.987" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM5">
<contactref element="U1" pad="11"/>
<contactref element="U2" pad="6"/>
<wire x1="30.2292" y1="13.346" x2="26.659" y2="13.346" width="0.3048" layer="1"/>
<wire x1="26.659" y1="13.346" x2="21.717" y2="18.288" width="0.3048" layer="1"/>
<wire x1="21.717" y1="18.288" x2="21.717" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM7">
<contactref element="U1" pad="13"/>
<contactref element="U2" pad="8"/>
<wire x1="30.2292" y1="12.046" x2="25.419" y2="12.046" width="0.3048" layer="1"/>
<wire x1="25.419" y1="12.046" x2="19.177" y2="18.288" width="0.3048" layer="1"/>
<wire x1="19.177" y1="18.288" x2="19.177" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM8">
<contactref element="U1" pad="15"/>
<contactref element="U3" pad="1"/>
<wire x1="44.543" y1="11.396" x2="51.308" y2="18.161" width="0.3048" layer="1"/>
<wire x1="51.308" y1="18.161" x2="51.308" y2="19.1516" width="0.3048" layer="1"/>
<wire x1="36.0648" y1="11.396" x2="44.543" y2="11.396" width="0.3048" layer="1"/>
</signal>
<signal name="PWM9">
<contactref element="U1" pad="16"/>
<contactref element="U3" pad="2"/>
<wire x1="43.923" y1="12.046" x2="50.038" y2="18.161" width="0.3048" layer="1"/>
<wire x1="50.038" y1="18.161" x2="50.038" y2="19.1516" width="0.3048" layer="1"/>
<wire x1="36.0648" y1="12.046" x2="43.923" y2="12.046" width="0.3048" layer="1"/>
</signal>
<signal name="PWM10">
<contactref element="U1" pad="17"/>
<contactref element="U3" pad="3"/>
<wire x1="43.176" y1="12.696" x2="48.768" y2="18.288" width="0.3048" layer="1"/>
<wire x1="48.768" y1="18.288" x2="48.768" y2="19.1516" width="0.3048" layer="1"/>
<wire x1="36.0648" y1="12.696" x2="43.176" y2="12.696" width="0.3048" layer="1"/>
</signal>
<signal name="PWM11">
<contactref element="U1" pad="18"/>
<contactref element="U3" pad="4"/>
<wire x1="42.556" y1="13.346" x2="47.498" y2="18.288" width="0.3048" layer="1"/>
<wire x1="47.498" y1="18.288" x2="47.498" y2="19.1516" width="0.3048" layer="1"/>
<wire x1="36.0648" y1="13.346" x2="42.556" y2="13.346" width="0.3048" layer="1"/>
</signal>
<signal name="PWM12">
<contactref element="U1" pad="19"/>
<contactref element="U3" pad="5"/>
<wire x1="36.0648" y1="13.996" x2="41.936" y2="13.996" width="0.3048" layer="1"/>
<wire x1="41.936" y1="13.996" x2="46.228" y2="18.288" width="0.3048" layer="1"/>
<wire x1="46.228" y1="18.288" x2="46.228" y2="19.1516" width="0.3048" layer="1"/>
</signal>
<signal name="PWM13">
<contactref element="U1" pad="20"/>
<contactref element="U3" pad="6"/>

license: MIT

repository: JanThar/HapticHardware

repo_name: JanThar/HapticHardware

extension: brd