text:
package main

import (
	"./common"
	"./nat"
	"bufio"
	"crypto/aes"
	"crypto/cipher"
	"crypto/tls"
	"encoding/json"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"math/rand"
	"net"
	"os"
	"os/signal"
	"os/user"
	"path"
	"strconv"
	"strings"
	"syscall"
	"time"
)

var accessKey = flag.String("key", "", "please login into dog-tunnel.tk to get accesskey")
var clientKey = flag.String("clientkey", "", "when other client linkt to the reg client, need clientkey, or empty")

var serverAddr = flag.String("remote", "dog-tunnel.tk:8018", "connect remote server")
var addInitAddr = flag.String("addip", "127.0.0.1", "addip for bust,xx.xx.xx.xx;xx.xx.xx.xx;")
var pipeNum = flag.Int("pipen", 1, "pipe num for transmission")

var serveName = flag.String("reg", "", "reg the name for client link, must assign reg or link")

var linkName = flag.String("link", "", "name for link, must assign reg or link")
var localAddr = flag.String("local", "", "addr for listen or connect(value \"socks5\" means tcp socks5 proxy for reg),depends on link or reg")
var bVerbose = flag.Bool("v", false, "verbose mode")
var delayTime = flag.Int("delay", 2, "if bust fail, try to make some delay seconds")
var clientMode = flag.Int("mode", 0, "connect mode:0 if p2p fail, use c/s mode;1 just p2p mode;2 just c/s mode")
var bUseSSL = flag.Bool("ssl", true, "use ssl")
var bShowVersion = flag.Bool("version", false, "show version")
var bLoadSettingFromFile = flag.Bool("f", false, "load setting from file(~/.dtunnel)")
var bEncrypt = flag.Bool("encrypt", false, "p2p mode encrypt")
var dnsCacheNum = flag.Int("dnscache", 0, "if > 0, dns will cache xx minutes")

var aesKey *cipher.Block

var remoteConn net.Conn
var clientType = -1

type dnsInfo struct {
	Ip                  string
	Status              string
	Queue               []*dnsQueryReq
	overTime, cacheTime int64
}

func (u *dnsInfo) IsAlive() bool {
	return time.Now().Unix() < u.overTime
}

func (u *dnsInfo) GetCacheTime() int64 {
	return u.overTime
}

func (u *dnsInfo) SetCacheTime(t int64) {
	if t >= 0 {
		u.cacheTime = t
	} else {
		t = u.cacheTime
	}
	u.overTime = t + time.Now().Unix()
}
func (u *dnsInfo) DeInit() {}

var g_ClientMap map[string]*Client
var g_ClientMapKey map[string]*cipher.Block
var g_Id2UDPSession map[string]*UDPMakeSession
var markName = ""
var bForceQuit = false

func isCommonSessionId(id string) bool {
	return id == "common"
}

func handleResponse(conn net.Conn, clientId string, action string, content string) {
	//log.Println("got", clientId, action)
	switch action {
	case "aeskey":
		fmt.Println("init aeskey for client", clientId, content)
		block, _ := aes.NewCipher([]byte(content))
		g_ClientMapKey[clientId] = &block
	case "show":
		fmt.Println(time.Now().Format("2006-01-02 15:04:05"), content)
	case "showandretry":
		fmt.Println(time.Now().Format("2006-01-02 15:04:05"), content)
		remoteConn.Close()
	case "showandquit":
		fmt.Println(time.Now().Format("2006-01-02 15:04:05"), content)
		remoteConn.Close()
		bForceQuit = true
	case "clientquit":
		client := g_ClientMap[clientId]
		log.Println("clientquit!!!", clientId, client)
		if client != nil {
			client.Quit()
		}
	case "remove_udpsession":
		log.Println("server force remove udpsession", clientId)
                delete(g_Id2UDPSession, clientId)
	case "query_addrlist_a":
		outip := content
		arr := strings.Split(clientId, "-")
		id := arr[0]
		sessionId := arr[1]
		pipeType := arr[2]
		g_Id2UDPSession[id] = &UDPMakeSession{id: id, sessionId: sessionId, pipeType: pipeType}
		go g_Id2UDPSession[id].reportAddrList(true, outip)
	case "query_addrlist_b":
		arr := strings.Split(clientId, "-")
		id := arr[0]
		sessionId := arr[1]
		pipeType := arr[2]
		g_Id2UDPSession[id] = &UDPMakeSession{id: id, sessionId: sessionId, pipeType: pipeType}
		go g_Id2UDPSession[id].reportAddrList(false, content)
	case "tell_bust_a":
		session, bHave := g_Id2UDPSession[clientId]
		if bHave {
			go session.beginMakeHole(content)
		}
	case "tell_bust_b":
		session, bHave := g_Id2UDPSession[clientId]
		if bHave {
			go session.beginMakeHole("")
		}
	case "csmode_c_tunnel_close":
		log.Println("receive close msg from server")
		arr := strings.Split(clientId, "-")
		clientId = arr[0]
		sessionId := arr[1]
		client, bHave := g_ClientMap[clientId]
		if bHave {
			client.removeSession(sessionId)
		}
	case "csmode_s_tunnel_close":
		arr := strings.Split(clientId, "-")
		clientId = arr[0]
		sessionId := arr[1]
		client, bHave := g_ClientMap[clientId]
		if bHave {
			client.removeSession(sessionId)
		}
	case "csmode_s_tunnel_open":
		oriId := clientId
		arr := strings.Split(oriId, "-")
		clientId = arr[0]
		sessionId := arr[1]
		client, bHave := g_ClientMap[clientId]
		if !bHave {
			client = &Client{id: clientId, pipes: make(map[int]net.Conn), engine: nil, buster: true, sessions: make(map[string]*clientSession), ready: true, bUdp: false}
			client.pipes[0] = remoteConn
			g_ClientMap[clientId] = client
		} else {
			client.pipes[0] = remoteConn
			client.ready = true
			client.bUdp = false
		}
		//log.Println("client init csmode", clientId, sessionId)
		if *localAddr != "socks5" {
			s_conn, err := net.DialTimeout("tcp", *localAddr, 10*time.Second)
			if err != nil {
				log.Println("connect to local server fail:", err.Error())
				msg := "cannot connect to bind addr" + *localAddr
				common.Write(remoteConn, clientId, "tunnel_error", msg)
				//remoteConn.Close()
				return
			} else {
				client.sessions[sessionId] = &clientSession{pipe: remoteConn, localConn: s_conn}
				go handleLocalPortResponse(client, oriId)
			}
		} else {
			client.sessions[sessionId] = &clientSession{pipe: remoteConn, localConn: nil, status: "init", recvMsg: ""}
		}
	case "csmode_c_begin":
		client, bHave := g_ClientMap[clientId]
		if !bHave {
			client = &Client{id: clientId, pipes: make(map[int]net.Conn), engine: nil, buster: false, sessions: make(map[string]*clientSession), ready: true, bUdp: false}
			client.pipes[0] = remoteConn
			g_ClientMap[clientId] = client
		} else {
			client.pipes[0] = remoteConn
			client.ready = true
			client.bUdp = false
		}
		if client.MultiListen() {
			common.Write(remoteConn, clientId, "makeholeok", "csmode")
		}
	case "csmode_msg_c":
		oriId := clientId
		arr := strings.Split(clientId, "-")
		clientId = arr[0]
		sessionId := arr[1]
		client, bHave := g_ClientMap[clientId]
		if bHave {
			session := client.getSession(sessionId)
			if session != nil && session.localConn != nil {
				session.localConn.Write([]byte(content))
			} else if session != nil && *localAddr == "socks5" {
				session.processSockProxy(client, oriId, content, func() {
					if len(session.recvMsg) > 0 && session.localConn != nil {
						session.localConn.Write([]byte(session.recvMsg))
					}
				})
			}
		}
	case "csmode_msg_s":
		arr := strings.Split(clientId, "-")
		clientId = arr[0]
		sessionId := arr[1]
		client, bHave := g_ClientMap[clientId]
		if bHave {
			session := client.getSession(sessionId)
			if session != nil && session.localConn != nil {
				session.localConn.Write([]byte(content))
			} else {
				//log.Println("cs:cannot tunnel msg", sessionId)
			}
		}
	}
}

type UDPMakeSession struct {
	id        string
	sessionId string
	buster    bool
	engine    *nat.AttemptEngine
	delay     int
	pipeType  string
}

func (session *UDPMakeSession) beginMakeHole(content string) {
	engine := session.engine
	if engine == nil {
		return
	}
	addrList := content
	if session.buster {
		engine.SetOtherAddrList(addrList)
	}
	log.Println("begin bust", session.id, session.sessionId, session.buster)
	if clientType == 1 && !session.buster {
		log.Println("retry bust!")
	}
	report := func() {
		if session.buster {
			if session.delay > 0 {
				log.Println("try to delay", session.delay, "seconds")
				time.Sleep(time.Duration(session.delay) * time.Second)
			}
			go common.Write(remoteConn, session.id, "success_bust_a", "")
		}
	}
	oldSession := session
	var aesBlock *cipher.Block
	if clientType == 1 {
		aesBlock = aesKey
	} else {
		aesBlock, _ = g_ClientMapKey[session.sessionId]
	}
	var conn net.Conn
	var err error
	if aesBlock == nil {
		conn, err = engine.GetConn(report, nil, nil)
	} else {
		conn, err = engine.GetConn(report, func(s []byte) []byte {
			if aesBlock == nil {
				return s
			} else {
				padLen := aes.BlockSize - (len(s) % aes.BlockSize)
				for i := 0; i < padLen; i++ {
					s = append(s, byte(padLen))
				}
				srcLen := len(s)
				encryptText := make([]byte, srcLen+aes.BlockSize)
				iv := encryptText[srcLen:]
				for i := 0; i < len(iv); i++ {
					iv[i] = byte(i)
				}
				mode := cipher.NewCBCEncrypter(*aesBlock, iv)
				mode.CryptBlocks(encryptText[:srcLen], s)
				return encryptText
			}
		}, func(s []byte) []byte {
			if aesBlock == nil {
				return s
			} else {
				if len(s) < aes.BlockSize*2 || len(s)%aes.BlockSize != 0 {
					return []byte{}
				}
				srcLen := len(s) - aes.BlockSize
				decryptText := make([]byte, srcLen)
				iv := s[srcLen:]
				mode := cipher.NewCBCDecrypter(*aesBlock, iv)
				mode.CryptBlocks(decryptText, s[:srcLen])
				paddingLen := int(decryptText[srcLen-1])
				if paddingLen > 16 {
					return []byte{}
				}
				return decryptText[:srcLen-paddingLen]
			}
		})
	}
	session, _bHave := g_Id2UDPSession[session.id]
	if session != oldSession {
		return
	}
	if !_bHave {
		return
	}
	delete(g_Id2UDPSession, session.id)
	if err == nil {
		if !session.buster {
			common.Write(remoteConn, session.id, "makeholeok", "")
		}
		client, bHave := g_ClientMap[session.sessionId]
		if !bHave {
			client = &Client{id: session.sessionId, engine: session.engine, buster: session.buster, ready: true, bUdp: true, sessions: make(map[string]*clientSession), specPipes: make(map[string]net.Conn), pipes: make(map[int]net.Conn)}
			g_ClientMap[session.sessionId] = client
		}
		if isCommonSessionId(session.pipeType) {
			size := len(client.pipes)
			client.pipes[size] = conn
			go client.Run(size, "")
			log.Println("add common session", session.buster, session.sessionId, session.id)
			if clientType == 1 {
				if len(client.pipes) == *pipeNum {
					client.MultiListen()
				}
			}
		} else {
			client.specPipes[session.pipeType] = conn
			go client.Run(-1, session.pipeType)
			log.Println("add session for", session.pipeType)
		}
	} else {
		delete(g_ClientMap, session.sessionId)
		delete(g_ClientMapKey, session.sessionId)
		log.Println("cannot connect", err.Error())
		if !session.buster && err.Error() != "quit" {
			common.Write(remoteConn, session.id, "makeholefail", "")
		}
	}
}

func (session *UDPMakeSession) reportAddrList(buster bool, outip string) {
	id := session.id
	var otherAddrList string
	if !buster {
		arr := strings.SplitN(outip, ":", 2)
		outip, otherAddrList = arr[0], arr[1]
	} else {
		arr := strings.SplitN(outip, ":", 2)
		var delayTime string
		outip, delayTime = arr[0], arr[1]
		session.delay, _ = strconv.Atoi(delayTime)
		if session.delay < 0 {
			session.delay = 0
		}
	}
	outip += ";" + *addInitAddr
	_id, _ := strconv.Atoi(id)
	engine, err := nat.Init(outip, buster, _id)
	if err != nil {
		println("init error", err.Error())
		disconnect()
		return
	}
	session.engine = engine
	session.buster = buster
	if !buster {
		engine.SetOtherAddrList(otherAddrList)
	}
	addrList := engine.GetAddrList()
	common.Write(remoteConn, id, "report_addrlist", addrList)
}

type fileSetting struct {
	Key string
}

func saveSettings(info fileSetting) error {
	clientInfoStr, err := json.Marshal(info)
	if err != nil {
		return err
	}
	user, err := user.Current()
	if err != nil {
		return err
	}
	filePath := path.Join(user.HomeDir, ".dtunnel")

	return ioutil.WriteFile(filePath, clientInfoStr, 0700)
}

func loadSettings(info *fileSetting) error {
	user, err := user.Current()
	if err != nil {
		return err
	}
	filePath := path.Join(user.HomeDir, ".dtunnel")
	content, err := ioutil.ReadFile(filePath)
	if err != nil {
		return err
	}
	err = json.Unmarshal([]byte(content), info)
	if err != nil {
		return err
	}
	return nil
}

func main() {
	flag.Parse()
	checkDns = make(chan *dnsQueryReq)
	checkDnsRes = make(chan *dnsQueryBack)
	go dnsLoop()
	if *bShowVersion {
		fmt.Printf("%.2f\n", common.Version)
		return
	}
	if !*bVerbose {
		log.SetOutput(ioutil.Discard)
	}
	if *serveName == "" && *linkName == "" {
		println("you must assign reg or link")
		return
	}
	if *serveName != "" && *linkName != "" {
		println("you must assign reg or link, not both of them")
		return
	}
	if *localAddr == "" {
		println("you must assign the local addr")
		return
	}
	if *serveName != "" {
		clientType = 0
	} else {
		clientType = 1
	}
	if *bEncrypt {
		if clientType != 1 {
			println("only link size need encrypt")
			return
		}
	}
	go func() {
		c := make(chan os.Signal, 1)
		signal.Notify(c, os.Interrupt, syscall.SIGTERM)
		n := 0
		for {
			<-c
			log.Println("received signal,shutdown")
			bForceQuit = true
			if remoteConn != nil {
				remoteConn.Close()
			}
			n++
			if n > 5 {
				log.Println("force shutdown")
				os.Exit(-1)
			}
		}
	}()

	loop := func() bool {
		if bForceQuit {
			return true
		}
		g_ClientMap = make(map[string]*Client)
		g_ClientMapKey = make(map[string]*cipher.Block)
		g_Id2UDPSession = make(map[string]*UDPMakeSession)
		//var err error
		if *bUseSSL {
			_remoteConn, err := tls.Dial("tcp", *serverAddr, &tls.Config{InsecureSkipVerify: true})
			if err != nil {
				println("connect remote err:" + err.Error())
				return false
			}
			remoteConn = net.Conn(_remoteConn)
		} else {
			_remoteConn, err := net.DialTimeout("tcp", *serverAddr, 10*time.Second)
			if err != nil {
				println("connect remote err:" + err.Error())
				return false
			}
			remoteConn = _remoteConn
		}
		println("connect to server succeed")
		go connect()
		q := make(chan bool)
		go func() {
			c := time.NewTicker(time.Second * 10)
		out:
			for {
				select {
				case <-c.C:
					if remoteConn != nil {
						common.Write(remoteConn, "-1", "ping", "")
					}
				case <-q:
					break out
				}
			}
			c.Stop()
		}()

		common.Read(remoteConn, handleResponse)
		q <- true
		for clientId, client := range g_ClientMap {
			log.Println("client shutdown", clientId)
			client.Quit()
		}

                for _, session := range g_Id2UDPSession {
                        if session.engine != nil {
                                session.engine.Fail()
                        }
                }
		if remoteConn != nil {
			remoteConn.Close()
		}
		if bForceQuit {
			return true
		}
		return false
	}
	if clientType == 0 {
		for {
			if loop() {
				break
			}
			time.Sleep(10 * time.Second)
		}
	} else {
		loop()
	}
	log.Println("service shutdown")
}

func connect() {
	if *pipeNum <= 0 {
		*pipeNum = 1
	}
	clientInfo := common.ClientSetting{Version: common.Version, Delay: *delayTime, Mode: *clientMode, PipeNum: *pipeNum, AccessKey: *accessKey, ClientKey: *clientKey, AesKey: ""}
	if *bEncrypt {
		clientInfo.AesKey = string([]byte(fmt.Sprintf("asd4%d%d", int32(time.Now().Unix()), (rand.Intn(100000) + 100)))[:16])
		log.Println("debug aeskey", clientInfo.AesKey)
		key, _ := aes.NewCipher([]byte(clientInfo.AesKey))
		aesKey = &key
	}
	if *bLoadSettingFromFile {
		var setting fileSetting
		err := loadSettings(&setting)
		if err == nil {
			clientInfo.AccessKey = setting.Key
		} else {
			log.Println("load setting fail", err.Error())
		}
	} else {
		if clientInfo.AccessKey != "" {
			var setting = fileSetting{Key: clientInfo.AccessKey}
			err := saveSettings(setting)
			if err != nil {
				log.Println("save setting error", err.Error())
			} else {
				println("save setting ok, nexttime please use -f to replace -key")
			}
		}
	}
	if clientType == 0 {
		markName = *serveName
		clientInfo.ClientType = "reg"
	} else if clientType == 1 {
		markName = *linkName
		clientInfo.ClientType = "link"
	} else {
		println("no clienttype!")
	}
	clientInfo.Name = markName
	clientInfoStr, err := json.Marshal(clientInfo)
	if err != nil {
		println("encode args error")
	}
	log.Println("init client", string(clientInfoStr))
	common.Write(remoteConn, "0", "init", string(clientInfoStr))
}

func disconnect() {
	if remoteConn != nil {
		remoteConn.Close()
		remoteConn = nil
	}
}

type clientSession struct {
	pipe      net.Conn
	localConn net.Conn
	status    string
	recvMsg   string
	extra     uint8
}

func (session *clientSession) processSockProxy(sc *Client, sessionId, content string, callback func()) {
	pipe := session.pipe
	session.recvMsg += content
	bytes := []byte(session.recvMsg)
	size := len(bytes)
	//log.Println("recv msg-====", len(session.recvMsg),  session.recvMsg, session.status, sessionId)
	switch session.status {
	case "init":
		if session.localConn != nil {
			session.localConn.Close()
			session.localConn = nil
		}
		if size < 2 {
			//println("wait init")
			return
		}
		var _, nmethod uint8 = bytes[0], bytes[1]
		//println("version", version, nmethod)
		session.status = "version"
		session.recvMsg = string(bytes[2:])
		session.extra = nmethod
	case "version":
		if uint8(size) < session.extra {
			//println("wait version")
			return
		}
		var send = []uint8{5, 0}
		go common.Write(pipe, sessionId, "tunnel_msg_s", string(send))
		session.status = "hello"
		session.recvMsg = string(bytes[session.extra:])
		session.extra = 0
		//log.Println("now", len(session.recvMsg))
	case "hello":
		var hello reqMsg
		bOk, tail := hello.read(bytes)
		if bOk {
			go func() {
				var ansmsg ansMsg
				url := hello.url
				var s_conn net.Conn
				var err error
				if *dnsCacheNum > 0 && hello.atyp == 3 {
					host := string(hello.dst_addr[1 : 1+hello.dst_addr[0]])
					resChan := make(chan *dnsQueryRes)
					checkDns <- &dnsQueryReq{c: resChan, host: host, port: int(hello.dst_port2), reqtype: hello.reqtype, url: url}
					res := <-resChan
					s_conn = res.conn
					err = res.err
					if res.ip != "" {
						url = res.ip + fmt.Sprintf(":%d", hello.dst_port2)
					}
				}
				if s_conn == nil && err == nil {
					s_conn, err = net.DialTimeout(hello.reqtype, url, 30*time.Second)
				}
				if err != nil {
					log.Println("connect to local server fail:", err.Error())
					ansmsg.gen(&hello, 4)
					go common.Write(pipe, sessionId, "tunnel_msg_s", string(ansmsg.buf[:ansmsg.mlen]))
					return
				} else {
					session.localConn = s_conn
					go handleLocalPortResponse(sc, sessionId)
					ansmsg.gen(&hello, 0)
					go common.Write(pipe, sessionId, "tunnel_msg_s", string(ansmsg.buf[:ansmsg.mlen]))
					session.status = "ok"
					session.recvMsg = string(tail)
					callback()
					return
				}
			}()
		} else {
			//log.Println("wait hello")
		}
		return
	case "ok":
		return
	}
	session.processSockProxy(sc, sessionId, "", callback)
}

var checkDns chan *dnsQueryReq
var checkDnsRes chan *dnsQueryBack

type dnsQueryReq struct {
	c       chan *dnsQueryRes
	host    string
	port    int
	reqtype string
	url     string
}

type dnsQueryBack struct {
	host   string
	status string
	conn   net.Conn
	err    error
}

type dnsQueryRes struct {
	conn net.Conn
	err  error
	ip   string
}

func dnsLoop() {
	for {
		select {
		case info := <-checkDns:
			cache := common.GetCacheContainer("dns")
			cacheInfo := cache.GetCache(info.host)
			if cacheInfo == nil {
				cache.AddCache(info.host, &dnsInfo{Queue: []*dnsQueryReq{info}, Status: "querying"}, int64(*dnsCacheNum*60))
				go func() {
					back := &dnsQueryBack{host: info.host}
					//log.Println("try dial", info.url)
					s_conn, err := net.DialTimeout(info.reqtype, info.url, 30*time.Second)
					//log.Println("try dial", info.url, "ok")
					if err != nil {
						back.status = "queryfail"
						back.err = err
					} else {
						back.status = "queryok"
						back.conn = s_conn
					}
					checkDnsRes <- back
				}()
			} else {
				_cacheInfo := cacheInfo.(*dnsInfo)
				//log.Println("on trigger", info.host, _cacheInfo.GetCacheTime(), len(_cacheInfo.Queue))
				switch _cacheInfo.Status {
				case "querying":
					_cacheInfo.Queue = append(_cacheInfo.Queue, info)
					//cache.UpdateCache(info.host, _cacheInfo)
					cacheInfo.SetCacheTime(-1)
				case "queryok":
					cacheInfo.SetCacheTime(-1)
					go func() {
						info.c <- &dnsQueryRes{ip: _cacheInfo.Ip}
					}()
				}
				//url = cacheInfo.(*dnsInfo).Ip + fmt.Sprintf(":%d", info.port)
			}
		case info := <-checkDnsRes:
			cache := common.GetCacheContainer("dns")
			cacheInfo := cache.GetCache(info.host)
			if cacheInfo != nil {
				_cacheInfo := cacheInfo.(*dnsInfo)
				_cacheInfo.Status = info.status
				switch info.status {
				case "queryfail":
					for _, _info := range _cacheInfo.Queue {
						c := _info.c
						go func() {
							c <- &dnsQueryRes{err: info.err}
						}()
					}
					cache.DelCache(info.host)
				case "queryok":
					log.Println("add host", info.host, "to dns cache")
					_cacheInfo.Ip = strings.Split(info.conn.RemoteAddr().String(), ":")[0]
					_cacheInfo.SetCacheTime(-1)
					//log.Println("process the queue of host", info.host, len(_cacheInfo.Queue))
					conn := info.conn
					for _, _info := range _cacheInfo.Queue {
						c := _info.c
						go func() {
							c <- &dnsQueryRes{ip: _cacheInfo.Ip, conn: conn}
						}()
						conn = nil
					}
					_cacheInfo.Queue = []*dnsQueryReq{}
				}
				//cache.UpdateCache(info.host, _cacheInfo)
			}
		}
	}
}

type ansMsg struct {
	ver  uint8
	rep  uint8
	rsv  uint8
	atyp uint8
	buf  [300]uint8
	mlen uint16
}

func (msg *ansMsg) gen(req *reqMsg, rep uint8) {
	msg.ver = 5
	msg.rep = rep //rfc1928
	msg.rsv = 0
	msg.atyp = 1 //req.atyp

	msg.buf[0], msg.buf[1], msg.buf[2], msg.buf[3] = msg.ver, msg.rep, msg.rsv, msg.atyp
	for i := 5; i < 11; i++ {
		msg.buf[i] = 0
	}
	msg.mlen = 10
}

type reqMsg struct {
	ver       uint8     // socks v5: 0x05
	cmd       uint8     // CONNECT: 0x01, BIND:0x02, UDP ASSOCIATE: 0x03
	rsv       uint8     //RESERVED
	atyp      uint8     //IP V4 addr: 0x01, DOMANNAME: 0x03, IP V6 addr: 0x04
	dst_addr  [255]byte //
	dst_port  [2]uint8  //
	dst_port2 uint16    //

	reqtype string
	url     string
}

func (msg *reqMsg) read(bytes []byte) (bool, []byte) {
	size := len(bytes)
	if size < 4 {
		return false, bytes
	}
	buf := bytes[0:4]

	msg.ver, msg.cmd, msg.rsv, msg.atyp = buf[0], buf[1], buf[2], buf[3]
	//println("test", msg.ver, msg.cmd, msg.rsv, msg.atyp)

	if 5 != msg.ver || 0 != msg.rsv {
		log.Println("Request Message VER or RSV error!")
		return false, bytes[4:]
	}
	buf = bytes[4:]
	size = len(buf)
	switch msg.atyp {
	case 1: //ip v4
		if size < 4 {
			return false, buf
		}
		copy(msg.dst_addr[:4], buf[:4])
		buf = buf[4:]
		size = len(buf)
	case 4:
		if size < 16 {
			return false, buf
		}
		copy(msg.dst_addr[:16], buf[:16])
		buf = buf[16:]
		size = len(buf)
	case 3:
		if size < 1 {
			return false, buf
		}
		copy(msg.dst_addr[:1], buf[:1])
		buf = buf[1:]
		size = len(buf)
		if size < int(msg.dst_addr[0]) {
			return false, buf
		}
		copy(msg.dst_addr[1:], buf[:int(msg.dst_addr[0])])
		buf = buf[int(msg.dst_addr[0]):]
		size = len(buf)
	}
	if size < 2 {
		return false, buf
	}
	copy(msg.dst_port[:], buf[:2])
	msg.dst_port2 = (uint16(msg.dst_port[0]) << 8) + uint16(msg.dst_port[1])

	switch msg.cmd {
	case 1:
		msg.reqtype = "tcp"
	case 2:
		log.Println("BIND")
	case 3:
		msg.reqtype = "udp"
	}
	switch msg.atyp {
	case 1: // ipv4
		msg.url = fmt.Sprintf("%d.%d.%d.%d:%d", msg.dst_addr[0], msg.dst_addr[1], msg.dst_addr[2], msg.dst_addr[3], msg.dst_port2)
	case 3: //DOMANNAME
		msg.url = string(msg.dst_addr[1 : 1+msg.dst_addr[0]])
		msg.url += fmt.Sprintf(":%d", msg.dst_port2)
	case 4: //ipv6
		msg.url = fmt.Sprintf("%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%d", msg.dst_addr[0], msg.dst_addr[1], msg.dst_addr[2], msg.dst_addr[3],
			msg.dst_addr[4], msg.dst_addr[5], msg.dst_addr[6], msg.dst_addr[7],
			msg.dst_addr[8], msg.dst_addr[9], msg.dst_addr[10], msg.dst_addr[11],
			msg.dst_addr[12], msg.dst_addr[13], msg.dst_addr[14], msg.dst_addr[15],
			msg.dst_port2)
	}
	log.Println(msg.reqtype, msg.url, msg.atyp, msg.dst_port2)
	return true, buf[2:]
}

type Client struct {
	id        string
	buster    bool
	engine    *nat.AttemptEngine
	pipes     map[int]net.Conn          // client for pipes
	specPipes map[string]net.Conn       // client for pipes
	sessions  map[string]*clientSession // session to pipeid
	ready     bool
	bUdp      bool
}

// pipe : client to client
// local : client to local apps
func (sc *Client) getSession(sessionId string) *clientSession {
	session, _ := sc.sessions[sessionId]
	return session
}

func (sc *Client) removeSession(sessionId string) bool {
	if clientType == 1 {
		common.RmId("udp", sessionId)
	}
	session, bHave := sc.sessions[sessionId]
	if bHave {
		if session.localConn != nil {
			session.localConn.Close()
		}
		delete(sc.sessions, sessionId)
		//log.Println("client", sc.id, "remove session", sessionId)
		return true
	}
	return false
}

func (sc *Client) OnTunnelRecv(pipe net.Conn, sessionId string, action string, content string) {
	//println("recv p2p tunnel", sessionId, action, content)
	session := sc.getSession(sessionId)
	var conn net.Conn
	if session != nil {
		conn = session.localConn
	}
	switch action {
	case "tunnel_error":
		if conn != nil {
			conn.Write([]byte(content))
			log.Println("tunnel error", content, sessionId)
		}
		sc.removeSession(sessionId)
		//case "serve_begin":
	case "tunnel_msg_s":
		if conn != nil {
			//println("tunnel msg", sessionId, len(content))
			conn.Write([]byte(content))
		} else {
			//log.Println("cannot tunnel msg", sessionId)
		}
	case "tunnel_close_s":
		sc.removeSession(sessionId)
	case "ping", "pingback":
		//log.Println("recv", action)
		if action == "ping" {
			common.Write(pipe, sessionId, "pingback", "")
		}
	case "tunnel_msg_c":
		if conn != nil {
			//log.Println("tunnel", len(content), sessionId)
			conn.Write([]byte(content))
		} else if *localAddr == "socks5" {
			if session == nil {
				return
			}
			session.processSockProxy(sc, sessionId, content, func() {
				sc.OnTunnelRecv(pipe, sessionId, action, session.recvMsg)
			})
		}
	case "tunnel_close":
		sc.removeSession(sessionId)
	case "tunnel_open":
		if clientType == 0 {
			if *localAddr != "socks5" {
				s_conn, err := net.DialTimeout("tcp", *localAddr, 10*time.Second)
				if err != nil {
					log.Println("connect to local server fail:", err.Error())
					msg := "cannot connect to bind addr" + *localAddr
					common.Write(pipe, sessionId, "tunnel_error", msg)
					//remoteConn.Close()
					return
				} else {
					sc.sessions[sessionId] = &clientSession{pipe: pipe, localConn: s_conn}
					go handleLocalPortResponse(sc, sessionId)
				}
			} else {
				sc.sessions[sessionId] = &clientSession{pipe: pipe, localConn: nil, status: "init", recvMsg: ""}
			}
		}
	}
}

func (sc *Client) Quit() {
	log.Println("client quit", sc.id)
	delete(g_ClientMap, sc.id)
	delete(g_ClientMapKey, sc.id)
	for id, _ := range sc.sessions {
		sc.removeSession(id)
	}
	for _, pipe := range sc.pipes {
		if pipe != remoteConn {
			pipe.Close()
		}
	}
	if sc.engine != nil {
		sc.engine.Fail()
	}
}

///////////////////////multi pipe support
var g_LocalConn net.Conn

func (sc *Client) MultiListen() bool {
	if g_LocalConn == nil {
		g_LocalConn, err := net.Listen("tcp", *localAddr)
		if err != nil {
			log.Println("cannot listen addr:" + err.Error())
			if remoteConn != nil {
				remoteConn.Close()
			}
			return false
		}
		go func() {
			quit := false
			ping := time.NewTicker(time.Second * 5)
			go func() {
			out:
				for {
					select {
					case <-ping.C:
						if quit {
							break out
						}
						for _, pipe := range sc.pipes {
							common.Write(pipe, "-1", "ping", "")
						}
					}
				}
			}()
			ping.Stop()
			for {
				conn, err := g_LocalConn.Accept()
				if err != nil {
					continue
				}
				sessionId := common.GetId("udp")
				pipe := sc.getOnePipe()
				if pipe == nil {
					log.Println("cannot get pipe for client")
					if remoteConn != nil {
						remoteConn.Close()
					}
					return
				}
				sc.sessions[sessionId] = &clientSession{pipe: pipe, localConn: conn}
				log.Println("client", sc.id, "create session", sessionId)
				go handleLocalServerResponse(sc, sessionId)
			}
			quit = true
		}()
		mode := "p2p mode"
		if !sc.bUdp {
			mode = "c/s mode"
			delete(g_ClientMapKey, sc.id)
		}
		println("service start success,please connect", *localAddr, mode)
	}
	return true
}

func (sc *Client) getOnePipe() net.Conn {
	tmp := []int{}
	for id, _ := range sc.pipes {
		tmp = append(tmp, id)
	}
	size := len(tmp)
	if size == 0 {
		return nil
	}
	index := rand.Intn(size)
	log.Println("choose pipe for ", sc.id, ",", index, "of", size)
	hitId := tmp[index]
	pipe, _ := sc.pipes[hitId]
	return pipe
}

///////////////////////multi pipe support

func (sc *Client) Run(index int, specPipe string) {
	var pipe net.Conn
	if index >= 0 {
		pipe = sc.pipes[index]
	} else {
		pipe = sc.specPipes[specPipe]
	}
	if pipe == nil {
		return
	}
	go func() {
		callback := func(conn net.Conn, sessionId, action, content string) {
			if sc != nil {
				sc.OnTunnelRecv(conn, sessionId, action, content)
			}
		}
		common.Read(pipe, callback)
		log.Println("client end read", index)
		if index >= 0 {
			delete(sc.pipes, index)
			if clientType == 1 {
				if len(sc.pipes) == 0 {
					if remoteConn != nil {
						remoteConn.Close()
					}
				}
			}
		} else {
			delete(sc.specPipes, specPipe)
		}
	}()
}

func (sc *Client) LocalAddr() net.Addr                { return nil }
func (sc *Client) Close() error                       { return nil }
func (sc *Client) RemoteAddr() net.Addr               { return nil }
func (sc *Client) SetDeadline(t time.Time) error      { return nil }
func (sc *Client) SetReadDeadline(t time.Time) error  { return nil }
func (sc *Client) SetWriteDeadline(t time.Time) error { return nil }

func handleLocalPortResponse(client *Client, id string) {
	sessionId := id
	if !client.bUdp {
		arr := strings.Split(id, "-")
		sessionId = arr[1]
	}
	session := client.getSession(sessionId)
	if session == nil {
		return
	}
	conn := session.localConn
	if conn == nil {
		return
	}
	arr := make([]byte, 1000)
	reader := bufio.NewReader(conn)
	for {
		size, err := reader.Read(arr)
		if err != nil {
			break
		}
		if common.Write(session.pipe, id, "tunnel_msg_s", string(arr[0:size])) != nil {
			break
		}
	}
	// log.Println("handlerlocal down")
	if client.removeSession(sessionId) {
		common.Write(session.pipe, id, "tunnel_close_s", "")
	}
}

func handleLocalServerResponse(client *Client, sessionId string) {
	session := client.getSession(sessionId)
	if session == nil {
		return
	}
	pipe := session.pipe
	if pipe == nil {
		return
	}
	conn := session.localConn
	common.Write(pipe, sessionId, "tunnel_open", "")
	arr := make([]byte, 1000)
	reader := bufio.NewReader(conn)
	for {
		size, err := reader.Read(arr)
		if err != nil {
			break
		}
		if common.Write(pipe, sessionId, "tunnel_msg_c", string(arr[0:size])) != nil {
			break
		}
	}
	common.Write(pipe, sessionId, "tunnel_close", "")
	client.removeSession(sessionId)
}

redpajama_set_name: RedPajamaGithub


Restaurant Brands International Inc (NYSE: QSR) was upgraded by analysts at ValuEngine from a "hold" rating to a "buy" rating.
Restaurant Brands International Inc (NYSE: QSR) had its price target raised by analysts at Wells Fargo & Co from $68.00 to $70.00. They now have a "market perform" rating on the stock.
Restaurant Brands International Inc (NYSE: QSR) was downgraded by analysts at Zacks Investment Research from a "hold" rating to a "sell" rating.
Form 4 Restaurant Brands Intern For: Apr 03 Filed by: Cil Jose E.


they cant be called "clipart"
Also is there a way to allow ony svg's to be uploaded as clipart?
Delete it after a polite notification to that guy.
> bitmaps. What do you all think?
> Also, how to deal with this type of upload?


In 2017 we were granted an ATOL franchise – we call it ABTOT Combined, which enables our members to protect both flight and non-flight turnover simultaneously and reduce their costs and administration.
ABTOT Combined Travel Protection – opening the door to cover for both licensable (flight-inclusive) and non-licensable (non-flight) turnover, ABTOT's total protection reduces duplication and saves you time.
From enquiry to approval, we provide travel protection that's comprehensive, straightforward and cost-effective. Our knowledgeable, helpful staff will assist you, making the process simple and straightforward, with one application, under one association, giving you total protection.
ABTOT Combined members are able to apply for a merchant facility with exclusively low rates for domestic debit and credit cards.


The Clearinghouse does not provide medical advice, treatment recommendations, or referrals to practitioners. A credible site should also be able to provide you with the date the information was published and how it is monitored or edited for its accuracy. All questions are based on the answerer's knowledge and can be put to consideration. Some fields such as the humanities prefer their students use books for sources rather than websites, since books typically contain more detailed information and perhaps more in-depth thinking than websites do. They do not always spend the time, or have the understanding, of how to determine whether the information the find is credible or not. No matter what the decision, every single one of these websites is untrustworthy in one way or another, and much of their information is highly suspect. You can always use our list of credible resources to find the newest information in politics, science, or economics.
This accomplishes the same goal as the other hand-out but it breaks it down in a more manageable task. I then ask for volunteers and we begin create a class definition that I write on the Smartboard. General iSeek An education-focused general search engine with helpful tools to narrow down your search General ipl2 The site contains a search engine and an index of helpful, credible sites arranged by topic. When each group is complete, we create a graph, slide number 5, of all the data we have compiled based on the ranking of each group. Computers enable the efficient processing and storage of information. Sentence: Gossip is a no-credible source of information because sometimes people lie. Some sites are guilty of only a few of the mentioned problems, while others are totally rotten.
Wikipedia can never be considered as a reliable source of information since it can be edited by anyone Therefore it is non-credible website example. Credible websites are the one that are updated regularly and do not have any false information. It is a search tool that finds scholarly articles—academic journals, patents, theses, court proceedings, and more. As students are doing this independent work, there are different ways to scaffold for different learners. Finding Credible Sources Online The dreaded research paper can leave many wondering where to go for information. I have no problem circulating around the classroom to make sure their plans are feasible, realistic, and appropriate.
Novices in grant writing often bombard us with such questions with a desire to learn more about grant writing exercises. If the writer is trying to convince you or put a specific idea into your head—be careful with the information the article offers. This is the true fact. The digital revolution is characterized by a flood of information and misinformation that news consumers can access from anywhere at any time. Academic journals — These journals are a great way to find cutting edge research on your topic.
Look up the publisher's name to learn more about the materials they publish. For websites, use tool to help you through this process. This guide will help you in evaluating whether a source is relevant or not. Firstly, to know what is computer software and wireless Information systems and then secondly to discuss about their affects upon each other. These sources are always properly and accurately referenced. Students have the potential to learn as much from the non-examplesas from the examples. How much do we know about online resources for complementary health approaches? The sponsoring agency of the website will also credible in this case.
Some students use trusted search engines, while others search for certain authors—for example, professors from their university. This is important because you never want to put wrong information into a paper for school! The web-addresses are available on the Smartboard and I linked them on my web-site for easier access. If you do a search for your topic on Wikipedia, you will see at the bottom of the article several sections that you can use to find more sources: the Notes, References, Further Reading, and External Links. What makes credible websites better. Another reason why Wikipedia should not be cited in an academic research paper is that it aims to be like an encyclopedia—a source of reference information, not scholarly research or primary or secondary sources. Spelling mistake: are words spelled wrong in the article? What may non-credible websites have on them??? In order to deem a website credible, we must take into consideration the following points: Is the website consistent? To find out how to evaluate news stories about complementary health, visit our interactive module.
With the Internet being so accessible, it might be tempting to type words into Google and use whatever comes up first. In what fields do they work? Accessed at on November 29, 2016. If Hillbilly Mike got no proper education starts a website about quantum physics. The next step of the lesson has students activating their prior knowledge of what they know of a school society. Yes, its news site is generally both accurate and credible, although there have been occasions when the Times got the story wrong reporters are human; they can make a mistake sometimes. These two are usually credible sources for information though occasionally a university will assign a.
The original Jew is brown in color and black. Look for endings on some sites like. Instead, do as I do — go directly to trustworthy sites. It provides a great deal of relevant information in a very fast manner, but that information is not necessarily credible. Today there is simply too much information online. The site may look real, but is actually an advertisement. When you are explaining a concept, you often use examples to makeyour explanation clearer.
Some Web sites have an editorial board that reviews content. Always be smart about the information you read and refer to. Non credible websites are websites by people who post their opinions or their opinions of a fact, like this website, online. When evaluating online resources, try to uncover the primary aim of the writer. Students have their own technology and we have the iPads that students can use. The internet has enabled students to do way more research than ever in way less time.


The ancient Westphalian concept can often be dumbed down to mean only l'etat has the monopoly on violence ( and you know THAT means lol ). In the new millennium voltiguer, conscript and professional armies, police and militaries are the nation/state's instrument of choice in full filling certain statecraft crafts.
Unexceptional exceptions to sovereignty au courant include unfree and /or unfun nation states that for what ever reasons – cannot seem to impose the nat'l will – Land of the Pure is a good example.
Being all India centric in a 1 dimensional way often means that strategic depth Durand Line functions as an R&R zone for creeps, jerks and killers. Pakistan's inexplicable inability to control their own magical turf magically ensures Great Satan does the gig with hilarious results.
Now that Aegypt's mighty mighty Army has been exposed as a mighty mighty big phat myth ( no spoiler alert here mein schatze – all the cool kids knew it eons ago) – the revolting mommie land of all of Araby may be able to enjoy providing another tragically risible example.
Deploying for V checks to torment girls, sitting on their hands at the shiny shiny M1 panzer factory within blitz range of Khartoum during the Dar Fur horrors, continuing Arab League talent for tolerating inhumanity crises like an inability to sortee a reinforced mechanized brigade right next door to Libya to protect their own near kin with the same dialect, customs, bloodlines, 'ligion and traditions.
Now a maybe reborn Sunnilicious Caliphate cannot impose Writ of State over their very own turf. .
The Sinai is likely to become a "no-man's land" from a security point of view Courtney, where terrorist organizations will be able to maneuver more easily. Maj.-Gen. Kochavi, head of Little Satan's IDF Military Intelligence, recently observed that Egyptian security forces "are losing control over the Sinai region," reflecting the concern of security officials in Israel about the reported sharp increase in terrorist attacks in the Sinai.
Most of these terror attacks are a direct challenge to Egyptian control of the area. For example, in early January, Beduin armed with anti-tank missiles attacked the police station in Sheikh Zawid, near the Gaza border; four days later, the headquarters of Amn a-Dawla (Egyptian state security) in Rafah was attacked and burned down, and in May, it became known that dozens of armed Beduin had taken control of the Nuweiba port and prevented the transit of passengers and goods. There was also a report about the involvement of 400 al-Qaida activists in planning terrorist acts in Egypt and Sinai.
Oh snap – a precursor to Low Intensity Conflict bay bee?
In fact, it is evident that the shaky security situation in the Sinai has already affected Little Satan. A report published by the Shin Bet in May stated that terrorist organizations were exploiting the governmental chaos in the Sinai to smuggle large quantities of weapons into The Strip. IDF intell cats reported that Egypt had recently stopped building the physical barrier to prevent smuggling in the Philadelphi Corridor, in contravention of the agreement it had with Little Satan on this issue.
In addition, it has been reported that in the past six months, Beduin smugglers have exploited the wide-open border in Rafah and the absence of Egyptian security forces in the vast expanses of the Sinai to smuggle rockets to Gaza. This has increased the number of rockets held by terrorist elements from 5,000 at the end of 2010 to some 10,000. In addition, the quantity of standard explosives smuggled into the Gaza Strip over the past half-year is three times the quantity smuggled in all of 2010.
'Til the new regime stabilizes and as long as the Egyptian security apparatus is occupied primarily with the uprising aftermath in the large cities, the border area shared by Egypt, Little Satan and The Strip will likely continue to be a focus for increased terrorist activity against Little Satan.
And failure to maintain Writ of State means a low intensity conflict becomes a high intensity conflict.


Billy Welu. For all the other bowlers, however, their passion for the sport had to be remain hobby.
travelling expenses and contributed to the pot in order to have a chance to win.
professional sport. It was the first opportunity for more than the few to bowl for a living.
professional bowlers – 50 of which were represented the best of the best in the United States at that time.
the bowling exhibitions for their team.
the brief shining moment of the National Bowling League was one of the highlights of their lives.
in scrapbook format within the pages of this book for posterity and for the reading pleasure of the sports nut.
Let the story of the league unfold before your eyes, of the NBL's single season.


Well done to #TeamMountainFuel Alex Pilcher finishing 6th at yesterdays VKM and 8th today at Transvulcania, isla de La Palma 15miles 6869ft ascent.
Day 2 of the #TeamMountainFuel fell running weekender, great video of leg 2 of the Bob Graham Round in the Lake District. Fantastic weekend of mountain running with around 35 miles and 20,000ft of ascent.
Winter trail running and fell run at sunset!


What Did You Do To Your Infiniti QX30 Today?
Did you just receive your brand new 2017+ Infiniti QX30? Make a post here and share the thought on your new ride. Congrats!
A section for 2017+ Infiniti QX30 owners to share what they have done with their QX30.
In the market for a Infiniti QX30? Discuss and share pricing information, order tracking, impressions of Infiniti dealers, incentives and financing information, and any other tips and experiences regarding the purchasing process.
Did you just test drive the new Infiniti QX30? Share your thoughts good or bad. A good place for potential owners to gather feedback.
Ask questions of QX30 forum members about what the Infiniti QX30 is like versus it's competition. A great place for new buyers to find out more about the QX30.
Forum to post and discuss Infiniti QX30 reviews written by both owners and publications.
2 Attachment(s) How to adjust clock?


text:
Home→Wild Cat Species→Serval→Serval Threats and Conservation
← SEBASTIAN'S DIARY (PART 3)
Shadie my RagaMuffin →
Serval Threats and Conservation
Serval in London Zoo - they are common in zoos. In the wild it's different. Photo by Kol Tregaskes (Flickr)
The Serval at the mercy of humans...but well treated here it seems...Columbus Zoo - photo Buckeye Beth (Flickr)
For serval threats and conservation I refer to the IUCN Red List of Threatened Species® (IUCN) and the renown book, Wild Cats of the World (WoW). The former should be current (Aug 2010) while the latter was published in 2002. Things change in regard to the status of wild cats in the wild. The change is invariably worse for the cat.
The IUCN category for the serval (Leptailurus serval) is Least Concern. As can be seen from the range of categories below, this indicates that this cat is the least threatened of species of wild animal other than unclassified species:
The reason is because the serval is abundant and widespread. Set against this is the degradation of wetlands, a habitat for the serval within its range.
The serval range is almost exclusively south of the Sahara. Accordingly this assessment of Least Concern applies to this large sub-Saharan area. North of the Sahara, where the range is almost extinguished, the IUCN classify this cat as Critically Endangered, which is one removed from extinct in the wild (EW) as can be seen from the categories above. The servals there are in isolated sub populations of 50 mature cats and the total is 250 cats. Their range is in Morocco, possibly Algeria and reintroduced into Tunisia. The last reported sighting of servals in countries north of the Sahara was more than 30 years ago (as at 2002 - WoW).
The biggest threat is loss of wetland habitat. Wetlands are core habitats for the serval as it contains higher levels of rodents, the prime serval prey. Other threats are overgrazing and burning of grassland. This cat needs to live in grassland.
Next, is the trade in skins. In Senegal, Benin and Gambia skins are traded in "large quantities" (IUCN). They are exported to N.Africa.
The skins are valued in traditional medicine in Nigeria. The skins are also used for ceremonial purposes.
Next, the serval is killed by farmers in retaliation for preying on poultry. The cats put their long legs through the wire and fish the poultry out. Deterring the serval would be more sensible and kind as servals keep rodent populations down thereby assisting farmers. The serval is also killed through indiscriminate killing of predators by poisoning for example. They are also trapped in traps, which are set for jackal and caracal.
The serval is also hunted for sport in southern Africa.
The serval is declining in population in the west and extreme south of Africa (at 2002). At 2010 it is extinct in the southern tip of the African continent (IUCN).
At 2002 the serval was common in the Okavango Delta in Botswana. In Zimbabwe they are restricted "to areas where there is permanent water." (Wow)
The adaptability of the serval may allow it to survive longer than for other less adaptable species provided it is not persecuted. It can adapt, for instance, to using abandoned cultivated land.
When on one occasion servals were reintroduced into the wild it was a "qualified success" (WoW). This happened in the Rustenberg Nature Reserve.
Servals are common in zoos. They breed "readily" in zoos (WoW).
From Serval Threats and Conservation to Serval
My Servals Behavior!
by: Suzon
I have a female Serval named Circe and she will be 3yrs old in December. She is awesome with me, but hates my husband. She has recently been peeing on our sofa and my husband has had it with her! When ever she see's him she will growl,hiss,and at time strike out at him. I was just wondering if there is anything I can do to correct this behavior? I am at my wits end and need some solution! If anyone has a suggestion please email me at auntweeza@yahoo.com.
Suzon
Sweet Serval
by: Merrily
In Rosamond, California there is a wonderful Wildcat sanctuary.
There are many kinds of wildcat from the tiny Fishing Cat and Sand Cats to the majestic Snow Leopard. In addition to the many cats there are beautiful and friendly peacocks roaming the grounds.
A few years ago an African Serval was added when it's owner moved from Texas where it was legal to keep it as a pet to California where it is not.
This is a beautiful and very inquisitive cat who always entertains the guests.
For any of you who live in Southern California this is a wonderful and inexpensive place to visit.
Serval Threats and Conservation — No Comments

redpajama_set_name: RedPajamaCommonCrawl


text:
Yenakiieve (, Yenákiieve, ; , Yenákiyevo) is a city in the Donetsk Oblast (province) of eastern Ukraine. It is incorporated as a city of oblast significance (a special status within the region equal to that of a raion (district)). The city stands on the Krynka River about  from the oblast's administrative center, Donetsk. Its population is approximately .

Yenakiieve is an important regional centre of coal mining, metallurgy, chemical production and manufacturing. The city's outdated industry has caused accidents like that of a gas explosion which occurred in June 2008 at one of Yenakiieve's coal mines. Yenakiieve was founded in 1898 when numerous workers' settlements around the Peter's Iron and Steel Works were united into a single settlement named after . Its first coal mines dated from 1883. The settlement was incorporated as a city in 1925. By 1958, the city and factories had expanded significantly and overtook the outlying villages of Simyukuo, Yevrah, and Tsiminyenny, all of which were resettled in their entirety when local livestock could not survive the expanding steel mills' runoff and pollution. One of the oldest metallurgical factories of Ukraine—the Yenakiieve Iron and Steel Works—operates in Yenakiieve.

The city is known as the birthplace of the former President of Ukraine, Viktor Yanukovych (in office 2010–2014).

History
Permanent settlements on the territory of present-day Yenakiieve were founded in 1783. In 1858 the Sofiyevsky coal mine opened there. At the same time the Petrovsky cast-iron plant was built, today known as the Yenakiyeve Iron and Steel Works. In 1895 engineers F. Yenakiev and B. Yalovetsky and several Belgian businessmen founded a Russian-Belgian metallurgic company which by 1897 constructed the new Petrovsky cast-iron plant around Fyodorovka. Coal mines were opened around the plant. Settlements were formed near them and in 1898 they were united into one called Enakievsky after the founder of the Russian-Belgian metallurgic society. The writer A. I. Kuprin, who worked at the plant in 1896, described workers' lives in the story "Molokh". Before World War I several plants were built in Yenakiieve: coke chemical, brick, beer brewing and butter making. The Petrovsky plant became one of the largest metallurgic plants (3rd place) in southern Russia. In 1913 it produced 349,200 tons of cast-iron and 316,400 tons of steel. As a result of ruin after World War I and the Civil War of 1919–1921 Petrovsky plant was the only one producing steel. By 1925 the population in Yenakiieve was 34,000, and it was referred to as a town.

In 1928 the town was renamed into Rykovo, after Soviet party- and statesman Alexei Rykov. After Rykov was arrested in 1937 the town was renamed Ordzhonikidze after another Soviet leader, Sergo Ordzhonikidze. The name Yenakiieve was returned to the town in 1943. By 1939 the population of the town was 88,200.

During World War II Yenakiieve was under siege from Italian army auxiliary units that were seconded to the German Army. They were followed by German units. The city was attacked from 31 October 1941 and not freed until 3 September 1943. Street fighting was fierce between the end of November and beginning of December 1941. "Recruitment" of civilians as Ostarbeiter began in December 1941. In 1950 about twelve Italian POWs (prisoners of war) were put on trial, over atrocities in Yenakiieve including the destruction of a hospital. Apparently no convictions were registered, and by 1954 all Italian POWs were returned to Italy.

In the 1950s several plants were put into operation: of ferro-concrete items, of construction material, of house building and automobile-repair. On September 16, 1979, on the territory of Yenakiieve in the mine "Yuny Communar" there was one of the Nuclear Explosions for the National Economy—an object "Klivazh". In 2002 the mine was closed as non-perspective and environmentalists worried about the danger of filling the mine with water. It might cause radioactive pollution of the underground water, so pumps continue to pump water out of the abandoned mine.

During the War in Donbas the city was captured by pro-Russian separatists when on 13 April 2014 pro-Russian activists captured its town hall and declared that the city was part of the separatist Donetsk People's Republic.

Demographics
At the time of the 2001 Ukrainian Census, the population of Yenakiieve was 104,000. Its composition was as follows:

Ethnicity
 Russians: 51.4%
 Ukrainians: 45.3%
 Belarusians: 1.1%
 Armenians: 0.4%

 Language
 Russian: 89.4%
 Ukrainian: 9.8%
 Armenian: 0.2%
 Belarusian: 0.1%

Yenakiieve City Municipality
 Yunokomunarivsk city municipality
 City of Yunokomunarivsk
 Town of Druzhne
 Karlo-Marksove town municipality
 Town of Karlo-Marksove
 Village of Novoselivka
 Settlement of Staropetrivske
 Korsun town municipality
 Town of Korsun
 Village of Verkhnya Krynka
 Village of Petrivske
 Village of Puteprovid
 Village of Shevchenko
 Settlement of Shchebenka
 Village of Avilovka
 Village of Shaposhnykove

References

External links

Cities in Donetsk Oblast
Populated places established in 1898
Cities of regional significance in Ukraine
Populated places established in the Russian Empire
Bakhmutsky Uyezd
Viktor Yanukovych
Horlivka Raion

redpajama_set_name: RedPajamaWikipedia


BSc Computer Science student Lahini spent the third year of her degree with Oracle.
Banhu undertook a placement as a Finance Analyst at GlaxoSmithKline (GSK).
Placement at British Airways as Continuous Improvement Practitioner.
Samad Siddiqui undertook a placement at IBM as an Enterprise Applications Analyst.
BSc Mathematical Science student who undertook a Finance Placement with IBM.
BSc Computer Science Professional Pathway placement student.
Saad is currently undertaking a placement at Great Ormond Street Hospital.


text:
Сергей Александрович Ивлев (род. 14 февраля 1969 года) — советский и российский ватерполист.

Карьера
Выступал за «Динамо — Олимпийский». Серебряный призёр чемпионата СССР (1988, 1989, 1990, 1991, 1992). Обладатель Кубка СССР (1988, 1990, 1991). Чемпион России (1994, 1995, 1996, 1998), серебряный (1997) призёр чемпионата России. Обладатель Кубка России (1994, 1995, 1996, 1997). Финалист Кубка обладателей кубков 1989. Бронзовый призёр Кубка европейских чемпионов 1999 года.

В 1994-98 годах привлекался сборную России.

Участник Олимпийских игр 1996 года.

Бронзовый призёр чемпионата мира 1994 года.

Судья международной категории (2007).

Литература

Ссылки

 Ивлев Сергей

Ватерполисты СССР
Ватерполисты России
Ватерполисты на летних Олимпийских играх 1996 года


The Best Craft Beer Bar in London? – MostlyAboutBeer……..
The Best Craft Beer Bar in London?
Behind the bar, a hand pull without a clip is pumped a few times by the publican. The small measure that sloshes into the glass is raised. The serving area is more brightly lit than on the public side so I can see the light amber hue of the beer. It glows as it's held aloft and turned from side to side. A nose is probed into the glass and then it's knocked back and drained. He pauses and ruminates as if studying an invisible text. The answer's no – a quick shake of the head confirms it. The remainder's poured into a jug and the beer engine continues to be pumped. The ale wasn't quite ready.
What I've just witnessed is a man check the look, aroma and taste of the liquid he's just drawn up from a cask in the cellar below him. Whenever I see the above choreography at a bar, I know I'm in a place that takes its beer seriously and the hundreds of people that patronise this pub daily obviously agree with me. Cask ale stands proudly under the craft umbrella even if it's not seen that way – both by many drinkers of cask ale that don't like the craft soubriquet and by other craft drinkers who regard it as dull. But think about the word craft and what it means in the broadest sense and then consider the care that goes into the brewing, sourcing, storing and dispensing of beer here; synonymity.
To wildly overgeneralise, two divergent experiences have evolved when it comes to cask vs (key)keg. We are talking about malt & hops versus yeast & hops. Cask beer has traditionally been very malty to the extent that even drinkers who cut their teeth on it can now feel put off by the sweet sweaty aroma of some of our older staples. Over the past couple of decades, as a reflection of the American craft beer scene, the hops have come up for equal parity and often dominate. This has produced a shift in cask ale tastes. Simultaneously, craft beer served from (key)keg has been dominated by heavy hop and yeast incursions. I needn't draw attention to the modern hops arms race but with the kegs you also get the Lactobacillus, the Brett, the Saison and Lager yeasts that aren't as well suited to cask condition. Whilst The Harp serves some good examples of keg beer (represented by Kernel and Mondo Brewing on my last visit), its staple is cask – the malt and the hops. I also find that cask beer starts off underwhelming but the attributes grow as the pint is downed. With keg beers, I find the character arrests you at the start but reaps diminishing returns towards the end. But maybe that's me.
Whereas the general evolution of craft beer bars has produced those dominated by kegs with occasional cask, The Harp is simply a pub dominated by exceptionally well kept cask with some additional well-sourced keg. This pub is also a home to good cider and perry and a broad range of bottled beers.
The Harp has the most rapid beer turnover of any pub I know. This process was originally overseen by the landlady Binnie Walsh but has been kept up under Fullers who now own the pub. Over the past decade, I have spent hours watching to see what beer is about to come on – a process that takes a mere ten minutes here. I don't normally subscribe to notions of "cosmic ordering" but I have found myself trying to wish a specific ale to appear. I once desperately wanted to try Greenjack Brewery's Lurcher Stout. After the ten minute hiatus the clip was turned to face the public and there it was!
Einstein calculated in 1951 that time equals money. Around 5pm on a Wednesday I watched as a pint was drawn 8 times per minute – this during a lull time. The Harp gets through around 35 – 40 firkins of the rotating guest beers each week. Into the evening the door creaks open and clonks shut as the babbling noise absorbs more human bodies. From an oblique angle, the hand pulls along the bar bow perpetually like pumpjacks on an oil field. It's mesmerising to watch.
Every so often it rewards its customers with a cask of Fullers Vintage Ale – Fullers own barrel-aged barley wine. It's that good it warrants its own paragraph as anyone lucky enough to have scored some can attest.
The variety of beer on offer at any time on any day is sweeping. There's no point saying cask has a limited range when you're confronted with a kaleidoscope of porters, bitters, pale ales, IPAs, milk stouts, rye beers, milds, black IPAs and barley wines. On a recent visit I had an obsidian black and velvety smooth Weird Beard Black Perle Milk Stout, a crisp, lemony hopped invigorating Dark Star Hop Head, a dark malty caramel Aylesbury Brewhouse Company Ursa Major and a zesty honey-like Vale Brewery Gravitas. Each charged from the life thriving in the hidden firkins.
The pub also retains some clever and popular permanents at either end of the hand pull parade – Hop Head and American Pale Ale (golden, bitter and tropical) by Dark Star, Sussex Best (dark, fruity and malty) by Harvey's. It's also a pub that champions selling beer from local start-up breweries so they can get their foot in the door. It hosts tap take-overs, most recently from Kew and Oakham. Despite all these pros, there are also two gleaming Fosters taps to cater for people with impaired sensory chops.
There is a great crowd diversity. I watch young skinny-Jeaned calves in their twenties pick their way through the fattened herds. I see septuagenarians holding court with a flush of colour to the cheeks and the freedom to laugh aloud. I see the hipsters' concave abdomens balancing out the CAMRA drinkers' convex bellies. There are suited folk who have just finished work, retired couples dressed up for an evening in the West End and even MPs and celebrities. Everybody's back to back loosening up in the communal warmth. The feeling of a shared experience, what the Germans call Gemutlichkeit, is overwhelming in this pub. The atmosphere's never tense like it can be in many busy pubs and it's there seven days a week, not just at the weekend.
The staff. Many of the good people in The Harp have been there years and have developed a near telepathic link with customers getting to the end of their pint. They sense it and instinctively gravitate towards you. There can be three layers of fellow primates between you and the bar but you'll still be served in good time.
Warmth and comfort: this is something it really has over a lot of craft beer bars. The warmth is generated by the rich earthy colours in this pub and unlike many craft beer bars, it isn't afraid of the light. It has a theatrical splendour with ceiling fans and chandeliers. The walls are filled with paintings and mirrors. The portraits aren't of the subverted kind – they're of straight study. You find yourself looking at the subjects' faces trying to assess their thoughts and character. The main draw – a visual banquet – is the canopy of pump clips over the bar. In my ten years of coming to The Harp, I can actually scan the flanks of this collage and pick out memories amongst its cells.
When the sun comes out the gorgeous stained glass windows that look out onto Chandos Place open inwards offering another means of refreshment. Upstairs there is a serene chill-out room like an opera house foyer with comfortable armchairs and soft light. I always see something I'd not noticed before. Last week I finally noticed the little wooden grotesques under the bar with the bag hooks. Wood – especially oak – is a material that acts as a sedative on a crowd.
Value: measures of cask beer cost considerably less than those of (key)keg craft beer. In London the latter's about £6 and sometimes as much as £9. A session strength pint in The Harp is about £4.
When the turnover is quick, when the cellarmanship is tight, when the condition is induced, cask beer is one of the best value and rewarding craft beer experiences there is. It's often more complex than a £20 barrel aged bottle conditioned beer and deeper and more engulfing than punchier primary-coloured equivalents on keg. Once a cask's been tapped, there's a narrow window of time it needs to be consumed in for optimum quality. It's when this care isn't taken or people don't drink it that cask ale gets its poor reputation for being bland and flat – which it can equally be. You won't find that neglect here at The Harp, it's its reason for existing and it's my primary reason for nominating The Harp as London's best craft beer bar.


My Sunday Photo – January 8, 2017.
It's been a chilly start to the year in Norwich but Jack Frost created some pretty photo ops - and I got to play with my new 50mm lens. I already had a 50mm but this one is so quiet and smooth. I actually "oohed" the first time I used it. I'm really surprised by … Continue reading My Sunday Photo – January 8, 2017.


At breakfast my six-year old son mentioned he knew 'the seven habits'. I couldn't believe my ears. Was he talking about the seven habits of highly effective people, by Steven R. Covey?
"What kind of habits have you learned?" I asked.
He put down his cup and said to my amazement and surprise: "Habit one: be proactive." So this is what children learn in school these days!


text:
Family doctors are key to protecting against flu
Gearing up for the new flu season
100 years after 'Spanish Flu': Is the world ready for the next pandemic?
'In the winter of 1918-1919, a flu pandemic affected 500 million people and killed between 40 million and 70 million. '
In the autumn of 1918, a global influenza outbreak began that would claim more lives than World War I (or the Great War). The war itself, which ended in November 1918, had a significant impact on how the virus spread around the world – and even influenced the name Spanish Flu.
Soldiers from Fort Riley, Kansas, ill with Spanish influenza at a hospital ward at Camp Funston (US Army Photographer)
There was nothing particular 'Spanish' about the flu: it didn't begin in Spain and, while the country was badly affected, it wasn't hit any harder than others. (The first wave spread in US military camps in 1917.)
However, Spain remained neutral during the conflict and its papers freely reported the outbreak. Media in France, the United Kingdom, Germany, the United States and elsewhere played down the impact on their own country in a bid to keep up morale. Newspapers were either directly controlled by national governments or keen to self-censor in the interest of patriotism at a time of war. They all happily reported on events in Spain – leading many to incorrectly presume that the Iberian Peninsula was the epicentre.
In summer of 1918, the virus spread among military units who lived in cramped quarters. And, as the war ended, surviving solders returned home – bringing influenza with them.
After four gruelling years of conflict, the immediate post-war period was a time for celebration. Public gatherings present an ideal opportunity for infectious diseases to find new victims. This most likely prolonged the second wave of the outbreak.
A third wave in the early spring of 1919 took war-weary populations by surprise, claiming millions more lives. Just as with seasonal influenza, the worst-hit populations were the very old and the very young. However, in comparison to a typical flu epidemic, there was a major spike in the 25-34 age group. Many soldiers who survived the trenches, did not survive the flu. Some returning soldiers shared the lethal virus with their spouses, also helping to push up the fatality rate in young adults.
There are a number of other reasons why the proportion of deaths among young adults was higher than normal. For one thing, the older population had partial immunity from the 1889-1890 flu pandemic (known as Russian flu).
The virus has also been shown to have triggered what is known as a 'cytokine storm' – an immune response that can be particularly severe in those with stronger immune systems.
The worst-affected group of all were pregnant women. Of the pregnant women who survived, over one quarter is estimated to have lost the child.
(Pregnant women are the #1 priority for flu vaccination, according to the WHO.)
During the 1918-1919 pandemic, researchers tried to develop a vaccine. According to the History of Vaccines project, a number of vaccines were tested against Bacillus influenzae (now known as Haemophilus influenzae) as well as strains of pneumococcus, streptococcus, staphylococcus, and Moraxella catarrhalis bacteria. These bacterial vaccines had no chance of stopping the pandemic which, we now know, was caused by a new strain of the influenza A virus.
In the 100 years since the Spanish flu outbreak, there have been four influenza pandemics: 1957-1958, 1968-1969, 1977-1978, and 2009-2010. None were as lethal as the 1918 outbreak.
However, annual outbreaks of seasonal influenza cause between 290,000 and 650,000 deaths per year globally. The death rates are lower because (a) vaccines are available (b) healthcare and hygiene is vastly superior than conditions a century ago and (c) the viruses that cause seasonal flu are less dangerous – and less likely to be fatal to those infected.
Nonetheless, flu viruses can change from one year to the next. Experts continue to worry that a new flu virus could some day emerge with the potential to cause the kind of destruction seen in 1918.
The WHO is warning that low uptake of seasonal flu vaccines in Europe, is leaving vulnerable people at risk should an outbreak occur. Fewer than one third of older people are vaccinated in half of the 53 countries making up the WHO's European region.
In fact, vaccination rates among high-risk groups have fallen in the years since the 2009-2010 pandemic.
'Vaccination is the most effective measure to prevent severe disease caused by influenza. However, according to our research, influenza vaccination uptake has been steadily declining in a number of countries in the European Region,' says Dr Zsuzsanna Jakab, WHO Regional Director for Europe. 'This is of serious concern now for people at higher risk of severe consequences, especially older people, and in the future potentially for the entire population, as the production of pandemic vaccines is closely linked to seasonal vaccine use.'
In the EU, health ministers have set a target of vaccinating 75% of citizens in high-risk groups. With the exception of the UK and the Netherlands who have met this goal and are consistently above or close to the target, most EU countries are a long way from reaching their goal.
'All European Union Member States have signed up to the goal of reaching 75% uptake among older people and other vulnerable groups; however, these targets are not being reached,' says Dr Andrea Ammon, Director of European Centre for Disease Prevention and Control (ECDC).
As we prepare to mark the centenary of the worst flu pandemic in recorded history, it is time to step up efforts to improve flu vaccine uptake.
Older people at higher risk of death from influenza
The WHO estimates that over 44,000 people die annually of respiratory diseases associated with seasonal influenza in the WHO European Region, out of a total of up to 650,000 global deaths.
According to annual surveys for the ECDC and WHO, although 34,000 (over 75%) of these deaths in Europe are among people aged 65 years or above, vaccine uptake remains low in this group. Half the countries in the WHO European Region are vaccinating fewer than one in three older people.
As for the other at-risk groups:
vaccination was generally recommended for people with chronic illnesses; however, coverage was below 40% in most countries;
almost all countries recommended influenza vaccination for health-care workers, but the majority reported influenza vaccine uptake as being as low as 40%;
in total, 90% of countries had vaccine recommendations for pregnant women in 2014/2015, compared with 40% before the 2009 A(H1N1) pandemic; however, coverage overall was low, with half the countries reporting uptake below 10%;
fewer than half the countries, most of them in eastern Europe, recommended influenza vaccination for young children; vaccination coverage ranged from less than 1% to 80%.
Alex Onduko Orumi
God knows.
It is very crazy how the there is a pandemic every 100 years, Everyone was right about there being a pandemic in 2020 and there was. Please reply for ideas what the next pandemic could be in 2120


text:
The Country Day Fund is the School's most important annual fundraising priority. It provides unrestricted funds that directly support the annual operating budget. The Country Day Fund benefits every student, every year, by bridging the gap between tuition revenue and the actual cost of providing a Country Day education.
If you have questions about the Country Day Fund, please contact our Director of Annual Giving, Caroline Ellinghausen at (504) 849-3112 or caroline_ellinghausen@mpcds.com.
Support the Country Day Fund Today!
List of 9 frequently asked questions.
Q: Where do the Country Day Fund Dollars go?
All contributions to the Country Day Fund go directly into the current school year's budget, so your contribution helps fund everything that happens at Country Day. Contributions to the Country Day Fund support:
Our talented and dedicated faculty
An advanced visual and performing arts program
A full-spectrum athletic program
An enriched student life
An exceptional campus and facilities
A culture rich in tradition
Q: Doesn't tuition cover the cost of these expenses?
The cost of a Country Day education is significant, but tuition alone does not cover the entire cost to educate a Country Day student. Thus, every student actually receives a subsidy made possible through annual giving to the Country Day Fund. Nearly 4% of the 2022-2023 operating budget is funded by the Country Day Fund. For this reason, it is the school's primary annual fundraising priority.
Q: Who gives to the Country Day Fund?
Alumni, parents, trustees, faculty, staff, grandparents, parents of alumni, foundations, corporations and friends contribute to the fund.
Q: How much should I give?
We ask each person to participate at a level appropriate for their circumstances. Gifts at all levels are vital to the success of the Country Day Fund and are appreciated.
Q: I want to participate, but do small gifts really matter?
They really do! In fact, more than a quarter of the gifts made to the Country Day Fund are gifts of $100 or less.
Furthermore, participation in the Country Day Fund indicates overall support of the school, which is extremely important to outside funding sources, such as foundations. For example, when considering whether to award a grant to Country Day, a foundation will ask about participation percentages from alumni, parents, faculty, and trustees. In short, all corporate and foundation giving begins with you.
Q: When should I give?
Now! Although the fiscal year ends on June 30, 2020, an early gift or pledge (even if you don't pay until later) saves the school the cost of additional mailings, helps build momentum and allows our volunteers more time to concentrate on gifts from those less familiar with the importance of the Country Day Fund.
Q: What is Reunion Giving?
We encourage classes to set special Country Day Fund goals in honor of their reunions. The spirit of participation and generosity lends a sense of pride to all who take part. Reunion Giving is a special way for a class as a whole to help preserve the past and invest in the future of Country Day as others have done before.
Q: What is the Associates' Dinner?
Each year, individuals who make gifts at the Associates level or higher ($1,500+) are recognized for their leadership contributions and are invited to a special event in their honor. We hope you will join this leadership group by becoming a Country Day Associate.
Q: What is the Leadership Donor Dinner?
Each year, individuals who make gifts at the 10,000 level and above are invited to a special dinner in the Spring to honor their gift to the Country Day Fund.
COUNTRY DAY FUND GIVING LEVELS
FOUNDER CIRCLE
TRUSTEES CIRCLE
COUNTRY DAY COUNCIL
ASSOCIATES OF EXCELLENCE
RED AND BLUE CLUB
DECADE CLUB
Young alumni who graduated within the last decade (2012-2022) and give $10 for every year since graduation.
Matching Gift and Volunteer Grant information provided by
Lori Gordillo
Caroline Ellinghausen
Director of Annual Giving
Pamela Guter
Jennifer Marsiglia 97
Jennifer Myers 09
Director of Marketing and Public Relations


The Folkmanis Corgi hand puppet was released in August 2016. The puppet does stand up as shown and you can put your hand into the body from underneath to move the mouth. This puppet has black, white, and reddish brown fur.
11 inches tall, 16 inches long, and 6 inches wide (27.9 x 40.6 x 15.2 cm).


Pictured above: Habitat volunteers work to rehab a Durham home into an efficient and attractive duplex for their HIP program.
Durham is booming, and cranes dot our skyline. New restaurants pop up regularly in our vibrant downtown. But with all the positive things going on in Durham, it's sometimes easy to forget that not all of our Durham neighbors are sharing in the good times.
Durham has an affordable housing crisis.
Karen Lado, the City of Durham's affordable housing consultant, estimates 15,000 families in Durham are severely cost burdened, meaning they pay 50 percent - or more - of their income on their housing. Many Habitat homeowner applicants rent leaky, drafty, often moldy substandard housing.
Durham Habitat aspires to eliminate substandard housing in Durham. We envision a Durham where all our neighbors have a safe, warm and affordable place to sleep at night.
Habitat has been building in Durham since 1985, and we've built - and sold - more than 330 homes in partnership with hard-working, low-income neighbors in Durham. We've also repaired more than 250 homes for low-income neighbors, often elderly, who own their homes. And yet, we need to do more.
I've spent most of my career in the entrepreneurial, for-profit world. I love Durham Habitat's entrepreneurial side - the opportunity to help meet our neighbors' needs by innovating and leveraging our strengths: building homes, and community, through strong partnerships.
Innovation starts with listening and understanding needs. My team and I spend a lot of time talking with our neighbors in Northeast Central Durham, and we hear the needs. Durham Habitat is currently piloting two new programs - Homeowner Incubation Program (HIP) and Tiny Homes – that we believe will help serve more families in Durham. And, Habitat is taking action.
The impetus for our HIP initiative is a homeowner applicant named Karen who applied in late 2014. When Karen applied, she and her family of four were paying $1,000 a month for rent - for a motel room! Karen met all criteria for Habitat homeownership except she had an outstanding judgment of a few thousand dollars on her credit. Habitat requires Karen to clear the judgment before she can be approved to buy her home. We invited her to reapply when she cleared her judgment.
The reality is that Karen will not come back to Habitat. She's doing everything she can to make ends meet working long hours to cover her $1,000 monthly rent.
We take Karen's situation personally. I want to offer a better option than "fix your problem and come back later." So, Habitat purchased a dilapidated duplex on North Hyde Park recently and we've renovated it to provide two units for our HIP pilot. We can now provide a short term Habitat rental at a more reasonable rate. We invite HIP partners to use their savings in monthly rent to clear their judgment, as they work on sweat equity and other aspects of preparing for Habitat homeownership. HIP partners will be prepared to buy a Habitat home in about a year.
Next month I'll introduce you to Habitat's first HIP partner and share about another Habitat innovation - Tiny Homes. Until then, I invite you to join our Durham Habitat community – we need your help! Visit Durhamhabitat.org to donate or volunteer. If you'd like a HabiTour, an hourish tour of Habitat's work in North East Central Durham, please contact Roxanne at rhall@addurhamhabitat.org or 919-698-3910.


Be sure to check out our Facebook page and become a fan! We always welcome comments.
The doctors and staff of the Spivey Eye Clinic would like to welcome you to our practice! Our goal is to provide you, your family, and friends with the finest eye care possible using a combination of state-of-the-art equipment and old fashioned caring.
Remember that we have an Medical Credit Care Plan for our patients!!! Ask for information about 0% interest for a year for your exam, copays, deductibles, glasses and contacts!
Our Vision Statement: Quality eyecare by qualified professionals!!
Our Mission Statement: Our goal is to exceed your expectations with quality eyecare from a professional staff--combining old-fashioned caring with the latest technology and eyewear selections!
THE DOCTORS AND STAFF THANK YOU FOR THE PRIVILEGE OF CARING FOR YOU!


text:
Articles tagged labor (4)
Laura Hazard OwenDecember 8, 2022
"Break your Wordle streak": New York Times journalists are on a 24-hour strike
Times journalists join employees at the Pittsburgh Post-Gazette, many of whom have been on strike since October, and at The Fort Worth Star-Telegram, who have been on strike since November 28.
Steven GreenhouseMarch 21, 2019
Why are digital newsrooms unionizing now? "This generation is tired of hearing that this industry requires martyrdom"
"These are professional-class jobs paying working-class wages, and these people have working-class worries about being downsized, laid off, cast aside in a market that is really stripped down."
Nicholas QuahApril 19, 2016
Hot Pod: Is $12-a-day a fair wage for New York's many radio interns?
Plus: USA Today's podcast download numbers, Google Play Music finally buys into podcasts, and whether independent podcasts don't get enough attention.
Mark CoddingtonOctober 12, 2012
This Week in Review: Discerning truth and lies in political coverage, and the value of digital-first news
Plus: The debate about free news and journalism quality, The New York Times' labor conflict, and the rest of the week's media and tech news.
Coddington, Mark. "This Week in Review: Discerning truth and lies in political coverage, and the value of digital-first news." Nieman Journalism Lab. Nieman Foundation for Journalism at Harvard, 12 Oct. 2012. Web. 31 Jan. 2023.
Coddington, M. (2012, Oct. 12). This Week in Review: Discerning truth and lies in political coverage, and the value of digital-first news. Nieman Journalism Lab. Retrieved January 31, 2023, from https://www.niemanlab.org/2012/10/this-week-in-review-discerning-truth-and-lies-in-political-coverage-and-the-value-of-digital-first-news/
Coddington, Mark. "This Week in Review: Discerning truth and lies in political coverage, and the value of digital-first news." Nieman Journalism Lab. Last modified October 12, 2012. Accessed January 31, 2023. https://www.niemanlab.org/2012/10/this-week-in-review-discerning-truth-and-lies-in-political-coverage-and-the-value-of-digital-first-news/.
| url = https://www.niemanlab.org/2012/10/this-week-in-review-discerning-truth-and-lies-in-political-coverage-and-the-value-of-digital-first-news/
| title = This Week in Review: Discerning truth and lies in political coverage, and the value of digital-first news
| last = Coddington
| first = Mark
| date = 12 October 2012
| ref = {{harvid|Coddington|2012}}


text:
La saison 1913-1914 est la troisième saison de l'Association de hockey de la Côte du Pacifique (souvent désignée par le sigle PCHA en référence à son nom anglais : ), ligue de hockey sur glace du Canada. Chacune des trois équipes qui commencent la saison doit jouer seize parties mais finalement, deux équipes ne jouent que quinze rencontres ; à la fin du calendrier, les Aristocrats de Victoria sont la meilleure équipe de la PCHA et remportent le titre de champions de la ligue.

Contexte
Frank Patrick devient le troisième président de la PCHA en remplacement de C.E. Doherty  ; il gardera son poste jusqu'à la fin de la PCHA en 1924. La saison voit également la mise en place de la ligne bleue pour diviser la patinoire en trois parties distinctes d'une vingtaine de mètres environ ; dans la zone neutre, la zone du milieu de la patinoire, les passes en avant sont désormais autorisées. Victoria doit compter jusqu'à fin janvier sans Lester Patrick qui s'est cassé la jambe avant la saison ; à son retour au jeu, Victoria, jusqu'à présent dernier de la ligue, enchaîne six victoires consécutives pour finir à la première place du classement. Il est estimé que les pertes des Royals de New Westminster se situent entre quatre et neuf mille dollars et la direction de la PCHA décide de déménager la franchise aux États-Unis pour la saison suivante et de la renommer Rosebuds de Portland.

Résultats

Résultats des matchs

Classement
Pour les significations des abréviations, voir statistiques du hockey sur glace.

Joueurs

Meilleurs pointeurs

Pour les significations des abréviations, voir statistiques du hockey sur glace.

Gardiens de buts

Équipe d'étoiles
À la fin de la saison, la PCHA désigne les meilleurs joueurs de la saison :

 Hugh Lehman, New Westminster, gardien de but
 Ernest « Moose » Johnson, New Westminster, défenseur
 Frank Patrick, Vancouver, défenseur
 Cyclone Taylor, Vancouver,
 Thomas Dunderdale, Victoria, centre
 Eddie Oatman, New Westminster, ailier droit
 Dubbie Kerr, Victoria, ailier gauche.

Après-saison
Les joueurs de Victoria entreprennent le voyage jusqu'à Toronto pour jouer contre les champions de l'Association nationale de hockey, les Blueshirts de Toronto, mais ayant oublié de faire une demande officielle aux , les joueurs de Victoria ne peuvent pas officiellement prétendre ramener la Coupe Stanley chez eux en cas de victoire. Finalement, les Blueshirts remportent les trois rencontres jouées et l'ANH conserve la Coupe pour encore un an.

Notes et références

Notes

Références

Bibliographie

Saison 1913-1914
Hockey sur glace au Canada
Hockey sur glace en 1913
Hockey sur glace en 1914
1913-1914


text:
The Asia is the continent of the world's largest territory, its total area is nearly 45 million square kilometers. Because of its great extent, the continent has eleven time zones.
The population of Asia is estimated at 4.463 billion people.
Alphabetical list of countries in Asia:
With a total area of 42,550,000 km², the American continent is one of the largest continents in the world.
This continent is subdivided into three: North America, South America and Central America. The total population is estimated at 1.002 billion inhabitants.
Some countries on that continent form the economic bloc called Mercosur – Southern Common Market.
Alphabetical list of countries in North and Central America:
Alphabetical list of countries in South America:
This is the poorest continent in the world. The Africa has the largest number of ethnic Earth. The territorial extension of the African continent is 30.370.000 km² and its population of approximately 1.216 billion inhabitants.
Alphabetical list of countries in Africa:
Antarctica is the fourth largest continent in the world in terms of territory. Its area is 14 million km², divided among several countries in the world, which carry out research and scientific studies.
Europe is one of the largest continents in the world. This continent is of great political importance. Its territory is 10,180,000 km² and the population is approximately 800 million inhabitants.
Alphabetical list of countries in Europe:
The largest country on that continent is Australia, that country occupies almost 90% of Oceania. Its territorial extension is 8,526,000 km.
Alphabetical list of countries in Oceania:
All the continents of the world are bathed by oceans, some are even bathed by three. Here are the oceans that bathe each continent:
Asia- Arctic, Pacific and Indian Glacier
America- Pacific, Arctic and Atlantic Glacier
Africa- Atlantic and Indian
Antarctica- Pacific, Atlantic and Indian
Europe- Atlantic
Oceania- Pacific and Indian
Transcontinentality
There are some countries that are located on two continents in the world. For this reason, they are called "Transcontinental Nations". This peculiarity occurs with Russia (Asia and Europe), Turkey (Asia and Europe) and Egypt (Africa and Asia).
The city of Istanbul, Turkey, is the only city in the world that has territory on two continents in the world – Asia and Europe.
There is no flag that represents the continents of the world. However, there is an emblem that unites them all. The symbol that represents all the continents are the Olympic rings, which symbolize the union in the sport of the African, American, Asian, European and oceanic continents.
View Articles by Continent
Europe's largest economies
Among the countries of Europe defined by Countryaah, there are large economies that influence the whole world, either through foreign trade or with tourism that attracts people from all over the world. According to data from the International Monetary Fund (IMF) of 2017, in the ranking of the fifteen largest economies in the world, at least six are European countries. Meet some of them:
Germany is a European country located in Central-Eastern Europe, covering an area of approximately 357,021 km2 and inhabited by approximately 83 million inhabitants. The country represents the fourth largest economy in the world with a Gross Domestic Product of billions of US $ 3,466.4.
It is the third largest exporter in the world after China and the United States. The economy is based mainly on exports of goods produced in the country. GDP is represented by approximately 70% by the service sector, 29% by industry and 1% by the primary sector.
United Kingdom is a sovereign state located on the northwest coast of Europe and corresponds to a political union between four countries: Scotland, England, Northern Ireland and Wales. The United Kingdom is a developed state and corresponds to the fifth largest economy in the world, according to the IMF, with a GDP of US $ 2,629.19 billion. Approximately 73% of GDP comes from the service sector and tourism is also a major economic driver. The World Tourism Organization has classified the country as the sixth largest tourist destination in the world.
France is the third largest European country in area, located in Western Europe. The country is considered a great power that exerts political, economic and cultural influence worldwide. According to the IMF, it is the sixth largest economy in the world with a GDP of US $ 2,463.22 billion and is therefore a highly developed country with high levels of human development.
According to the World Health Organization, the country was considered the best public health provider in the world. One of the biggest drivers of the country's economy is tourism. France is one of the most visited countries in the world, classified as the best tourist destination among all countries, receiving around 10 million tourists a year.
The 50 countries with the most telephone connections in the world
Rank Country Number of telephone connections
1 China, People's Republic (Asia) 391,000,000
2 United States of America (North America) 196,400,000
3 Japan (Asia) 75,330,000
4 India (Asia) 68,470,000
5 Germany (Europe) 55,230,000
6 Brazil (South America) 39,440,000
7 Russia (Europe) 37,400,000
8 Great Britain (Europe) 35,447,000
9 France (Europe) 35,193,000
10 Italy (Europe) 30,040,000
11 Iran (Asia) 23,622,000
12 Korea, Republic of (Asia) 23,096,000
13 Canada (North America) 20,750,000
14 Mexico (North America) 19,970,000
15 Turkey (Asia) 19,020,000
16 Spain (Europe) 17,790,000
17 Poland (Europe) 15,160,000
18 Taiwan (Asia) 13,962,000
19 Ukraine (Europe) 11,230,000
20 Australia (Australia-Oceania) 11,212,000
21 Indonesia (Asia) 11,090,000
22 Netherlands (Europe) 10,080,000
23 Egypt (Africa) 9,600,000
24 Colombia (South America) 9,083,000
25 Argentina (South America) 8,923,000
26 Thailand (Asia) 7,560,000
27 Sweden (Europe) 6,843,000
28 Switzerland (Europe) 5,710,000
29 Greece (Europe) 5,440,000
30 Belgium (Europe) 5,280,000
31 Vietnam (Asia) 5,060,000
32 South Africa (Africa) 4,926,000
33 Malaysia (Asia) 4,890,000
34 Romania (Europe) 4,650,000
35 Czech Republic (Europe) 4,590,000
36 Pakistan (Asia) 4,582,000
37 Portugal (Europe) 4,450,000
38 Hungary (Europe) 4,060,000
39 Austria (Europe) 4,020,000
40 Philippines (Asia) 3,950,000
41 Hong Kong (Asia) 3,910,000
42 Denmark (Europe) 3,780,000
43 Chile (South America) 3,760,000
44 Saudi Arabia (Asia) 3,752,000
45 Norway (Europe) 3,610,000
46 Belarus (Europe) 3,364,000
47 Bulgaria (Europe) 3,210,000
48 Israel (Asia) 3,210,000
49 Venezuela (South America) 3,172,000
50 Kazakhstan (Asia) 3,051,000
Source: ABBREVIATIONFINDER
Sviyaga, Russia December 30, 2022 - Ski sports complex "Kazan" (popularly "Sviyaga") is located near the Sviyazhsky Reserve at the confluence of three rivers: Sulitsy, Sviyaga and Volga. Today it is one of the largest ski resorts in central Russia. The… Continue Reading
Ras Umm El Sid, Egypt December 23, 2022 - Between the bays of Naama Bay and Sharm El Maya lies the cozy bay of Ras Um El Sid. Above it, above the beginning of the Strait of Tiran (Tiran), a cape rises, crowned with… Continue Reading
Chester Bridge and Chicago Skyway, Illinois December 16, 2022 - Chester Bridge Chester Bridge Spans Mississippi River Lanes 1x2 Total length 861 meter Main overvoltage 204 meter Bridge deck height 32 meter Opening 23-08-1942 Traffic intensity 6,400 mvt/day Location Map According to citypopulationreview.com, the Chester… Continue Reading
Corbus, Tunisia December 9, 2022 - Once the number one resort for Roman legionnaires, Corbus is today the main thermal spa point of the Tunisian coast. Although "civilization" here is represented by one street, two hotels, one spa and one hammam,… Continue Reading
Sacramento, California December 1, 2022 - In sunny California, the focus is often on Los Angeles and San Francisco. A shame, because the capital Sacramento is just as much fun! Ideally located east of San Francisco and on the way to… Continue Reading
Eleuthera, Bahamas November 26, 2022 - When someone informs in the company of his friends or colleagues that he is going to rest in the Bahamas, he cannot avoid envious glances, because everyone dreams of setting foot on the snow-white sands… Continue Reading
Aegean Coast of Turkey November 25, 2022 - The Aegean coast of Turkey differs in many ways from Antalya. The climate here is drier, and the entire resort infrastructure is located more compactly. On the coast of the Aegean Sea, as well as… Continue Reading
Banjul, Gambia November 18, 2022 - Banjul traces its history back to 1816 - it was then that the British colonialists founded a trading post and a center for sending slaves to the continent in the Gambia Delta. Therefore, it is… Continue Reading
Things to do in Lier, Belgium November 11, 2022 - Let's be honest: Lier is not the most obvious city for those looking for a city trip destination in Belgium. Large cities such as Antwerp, Bruges, Brussels and Ghent can count on much more interest… Continue Reading
Sights of Seville, Spain November 4, 2022 - The Spanish city of Seville is a special city in several respects. Not only is it considered by many to be the most beautiful city in Spain, Seville is also one of the hottest cities… Continue Reading


Nouns which suggest that things are finished and uniform are to be avoided as much as possible. These run the risk of getting the stamp "essentialistic", which is one of the Deadly Sins in writing anthropological. For the anthropologist everything is complex and in flux from one state to another. Therefore, if applicable, try to rewrite your nouns into gerunds (usu. words ending on -ing).
See Tweed's Crossing and Dwelling. A Theory of Religions for an excellent argument on the use of gerunds.
Whenever you would use "construct" use "construe" instead. The latter gives the impression whatever process your describing is more soft, complex and flexible than the former conveys. Anthropologists like that.


This week the Legally Blonde UK Tour is back in London at the New Wimbledon Theatre. Starring Lucie Jones as Elle, Rita Simons as Paulette and Bill Ward as Professor Callahan the cast have this show down to a fine art and had the audience singing and cheering along last night.
The energy from the whole cast was there from the very start of the show with firm classic songs including Oh My God You Guys and Bend and Snap Everyone was captured by the colourful sets and energetic dance routines.
I have to give a special nod to 3 characters for this review. Both Lucie and Rita played their roles brilliantly and work great together on stage but a special nod really has to go to Bruiser as well.
If you haven't seen Legally Blonde now is the time to book a ticket and see how Elle follows her heart for love to Harvard Law school and finds herself in a career she never dreamed of and learning a lot about love in the process.


Swiffer® WetJet® gives you a great clean on virtually any floor in up to half the time. With a dual-nozzle sprayer and a strong-grip pole, this all-in-one mopping system breaks up and dissolves tough messes better than a mop and bucket. Plus its cleaning solution is designed to penetrate layers of dirt, absorb dirt and grime into the WetJet pad, and lock it away for good. You can scrub really tough, dried-on spots or messes with a large scrubby strip to get you a clean you can feel.
Very handy to quickly wipe, & gloss up the floors, & leaves a lasting freshness throughout the whole house.
Works great on multisurface floors. Lasts a long time, can swiffer a good amount before it runs out.
Pleasant scent and highly recommended. The product goes a long way!
Mine always lasts for a while, as I use it once every couple of weeks in my small apartment. For larger homes and those that need more frequent mopping, this may not be economical. Pleasant scent!